# HG changeset patch # User lindquist # Date 1200070660 -3600 # Node ID 1700239cab2e8d32e11e8562237a978a176edc40 # Parent 5825d48b27d15f51dbf65bf04fd3792baa1de9b6 [svn r136] MAJOR UNSTABLE UPDATE!!! Initial commit after moving to Tango instead of Phobos. Lots of bugfixes... This build is not suitable for most things. diff -r 5825d48b27d1 -r 1700239cab2e bin/llvmdc.conf --- a/bin/llvmdc.conf Fri Jan 04 01:38:42 2008 +0100 +++ b/bin/llvmdc.conf Fri Jan 11 17:57:40 2008 +0100 @@ -1,4 +1,4 @@ [Environment] -DFLAGS=-I%@P%/../lphobos -E%@P%/../lib -L-L=%@P%/../lib +DFLAGS=-I%@P%/../tango -E%@P%/../lib -L-L=%@P%/../lib diff -r 5825d48b27d1 -r 1700239cab2e bin/llvmdc.phobos --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bin/llvmdc.phobos Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,4 @@ + +[Environment] + +DFLAGS=-I%@P%/../lphobos -E%@P%/../lib -L-L=%@P%/../lib diff -r 5825d48b27d1 -r 1700239cab2e bin/llvmdc.tango --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bin/llvmdc.tango Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,4 @@ + +[Environment] + +DFLAGS=-I%@P%/../tango -E%@P%/../lib -L-L=%@P%/../lib diff -r 5825d48b27d1 -r 1700239cab2e dmd/link.c --- a/dmd/link.c Fri Jan 04 01:38:42 2008 +0100 +++ b/dmd/link.c Fri Jan 11 17:57:40 2008 +0100 @@ -288,7 +288,7 @@ argv.push((void *)"-lm"); std::string corelibpath = global.params.runtimeImppath; - corelibpath.append("/llvmdcore.bc"); + corelibpath.append("/libtango-base-llvmdc.a"); argv.append(global.params.objfiles); argv.push((void *)corelibpath.c_str()); diff -r 5825d48b27d1 -r 1700239cab2e dmd/mars.c --- a/dmd/mars.c Fri Jan 04 01:38:42 2008 +0100 +++ b/dmd/mars.c Fri Jan 11 17:57:40 2008 +0100 @@ -77,7 +77,7 @@ memset(¶ms, 0, sizeof(Param)); } -char *Loc::toChars() +char *Loc::toChars() const { OutBuffer buf; char *p; @@ -300,6 +300,8 @@ // Predefine version identifiers #if IN_LLVM VersionCondition::addPredefinedGlobalIdent("LLVM"); + VersionCondition::addPredefinedGlobalIdent("LLVMDC"); + VersionCondition::addPredefinedGlobalIdent("Posix"); #endif #if _WIN32 VersionCondition::addPredefinedGlobalIdent("Windows"); diff -r 5825d48b27d1 -r 1700239cab2e dmd/mars.h --- a/dmd/mars.h Fri Jan 04 01:38:42 2008 +0100 +++ b/dmd/mars.h Fri Jan 11 17:57:40 2008 +0100 @@ -242,7 +242,7 @@ Loc(Module *mod, unsigned linnum); - char *toChars(); + char *toChars() const; }; #ifndef GCC_SAFE_DMD diff -r 5825d48b27d1 -r 1700239cab2e gen/arrays.cpp --- a/gen/arrays.cpp Fri Jan 04 01:38:42 2008 +0100 +++ b/gen/arrays.cpp Fri Jan 11 17:57:40 2008 +0100 @@ -598,6 +598,34 @@ } ////////////////////////////////////////////////////////////////////////////////////////// +void DtoCatArrayElement(llvm::Value* arr, Expression* exp1, Expression* exp2) +{ + Type* t1 = DtoDType(exp1->type); + Type* t2 = DtoDType(exp2->type); + + assert(t1->ty == Tarray); + assert(t2 == DtoDType(t1->next)); + + DValue* e1 = exp1->toElem(gIR); + DValue* e2 = exp2->toElem(gIR); + + llvm::Value *len1, *src1, *res; + llvm::Value* a = e1->getRVal(); + len1 = gIR->ir->CreateLoad(DtoGEPi(a,0,0,"tmp"),"tmp"); + res = gIR->ir->CreateAdd(len1,DtoConstSize_t(1),"tmp"); + + llvm::Value* mem = DtoNewDynArray(arr, res, DtoDType(t1->next), false); + + src1 = gIR->ir->CreateLoad(DtoGEPi(a,0,1,"tmp"),"tmp"); + + DtoMemCpy(mem,src1,len1); + + mem = gIR->ir->CreateGEP(mem,len1,"tmp"); + DVarValue* memval = new DVarValue(e2->getType(), mem, true); + DtoAssign(memval, e2); +} + +////////////////////////////////////////////////////////////////////////////////////////// // helper for eq and cmp static llvm::Value* DtoArrayEqCmp_impl(const char* func, DValue* l, DValue* r, bool useti) { diff -r 5825d48b27d1 -r 1700239cab2e gen/arrays.h --- a/gen/arrays.h Fri Jan 04 01:38:42 2008 +0100 +++ b/gen/arrays.h Fri Jan 11 17:57:40 2008 +0100 @@ -25,6 +25,7 @@ void DtoCatAssignElement(llvm::Value* arr, Expression* exp); void DtoCatAssignArray(llvm::Value* arr, Expression* exp); void DtoCatArrays(llvm::Value* arr, Expression* e1, Expression* e2); +void DtoCatArrayElement(llvm::Value* arr, Expression* exp1, Expression* exp2); void DtoStaticArrayCopy(llvm::Value* dst, llvm::Value* src); diff -r 5825d48b27d1 -r 1700239cab2e gen/classes.cpp --- a/gen/classes.cpp Fri Jan 04 01:38:42 2008 +0100 +++ b/gen/classes.cpp Fri Jan 11 17:57:40 2008 +0100 @@ -11,6 +11,7 @@ #include "gen/arrays.h" #include "gen/logger.h" #include "gen/classes.h" +#include "gen/structs.h" #include "gen/functions.h" #include "gen/runtime.h" #include "gen/dvalue.h" @@ -32,13 +33,19 @@ Logger::println("Adding base class members of %s", bc->base->toChars()); LOG_SCOPE; - for (int k=0; k < bc->base->members->dim; k++) { + Array* arr = &bc->base->fields; + for (int k=0; k < arr->dim; k++) { + VarDeclaration* v = (VarDeclaration*)(arr->data[k]); + v->toObjFile(); + } + + /*for (int k=0; k < bc->base->members->dim; k++) { Dsymbol* dsym = (Dsymbol*)(bc->base->members->data[k]); if (dsym->isVarDeclaration()) { dsym->toObjFile(); } - } + }*/ } } @@ -65,7 +72,7 @@ } } - Logger::println("DtoResolveClass(%s)", cd->toPrettyChars()); + Logger::println("DtoResolveClass(%s): %s", cd->toPrettyChars(), cd->loc.toChars()); LOG_SCOPE; assert(cd->type->ty == Tclass); @@ -113,10 +120,85 @@ dsym->toObjFile(); } + // resolve class data fields (possibly unions) + Logger::println("doing class fields"); + + if (irstruct->offsets.empty()) + { + Logger::println("has no fields"); + } + else + { + Logger::println("has fields"); + unsigned prevsize = (unsigned)-1; + unsigned lastoffset = (unsigned)-1; + const llvm::Type* fieldtype = NULL; + VarDeclaration* fieldinit = NULL; + size_t fieldpad = 0; + int idx = 0; + for (IRStruct::OffsetMap::iterator i=irstruct->offsets.begin(); i!=irstruct->offsets.end(); ++i) { + // first iteration + if (lastoffset == (unsigned)-1) { + lastoffset = i->first; + fieldtype = i->second.type; + fieldinit = i->second.var; + prevsize = gTargetData->getTypeSize(fieldtype); + i->second.var->llvmFieldIndex = idx; + } + // colliding offset? + else if (lastoffset == i->first) { + size_t s = gTargetData->getTypeSize(i->second.type); + if (s > prevsize) { + fieldpad += s - prevsize; + prevsize = s; + } + cd->llvmHasUnions = true; + i->second.var->llvmFieldIndex = idx; + } + // intersecting offset? + else if (i->first < (lastoffset + prevsize)) { + size_t s = gTargetData->getTypeSize(i->second.type); + assert((i->first + s) <= (lastoffset + prevsize)); // this holds because all types are aligned to their size + cd->llvmHasUnions = true; + i->second.var->llvmFieldIndex = idx; + i->second.var->llvmFieldIndexOffset = (i->first - lastoffset) / s; + } + // fresh offset + else { + // commit the field + fieldtypes.push_back(fieldtype); + irstruct->defaultFields.push_back(fieldinit); + if (fieldpad) { + fieldtypes.push_back(llvm::ArrayType::get(llvm::Type::Int8Ty, fieldpad)); + irstruct->defaultFields.push_back(NULL); + idx++; + } + + idx++; + + // start new + lastoffset = i->first; + fieldtype = i->second.type; + fieldinit = i->second.var; + prevsize = gTargetData->getTypeSize(fieldtype); + i->second.var->llvmFieldIndex = idx; + fieldpad = 0; + } + } + fieldtypes.push_back(fieldtype); + irstruct->defaultFields.push_back(fieldinit); + if (fieldpad) { + fieldtypes.push_back(llvm::ArrayType::get(llvm::Type::Int8Ty, fieldpad)); + irstruct->defaultFields.push_back(NULL); + } + } + + /* // add field types for (IRStruct::OffsetMap::iterator i=irstruct->offsets.begin(); i!=irstruct->offsets.end(); ++i) { fieldtypes.push_back(i->second.type); } + */ const llvm::StructType* structtype = llvm::StructType::get(fieldtypes); // refine abstract types for stuff like: class C {C next;} @@ -214,7 +296,7 @@ if (cd->llvmDeclared) return; cd->llvmDeclared = true; - Logger::println("DtoDeclareClass(%s)", cd->toPrettyChars()); + Logger::println("DtoDeclareClass(%s): %s", cd->toPrettyChars(), cd->loc.toChars()); LOG_SCOPE; assert(cd->type->ty == Tclass); @@ -262,7 +344,7 @@ const llvm::StructType* infoTy = llvm::StructType::get(types); // interface info array - if (needs_definition && cd->vtblInterfaces->dim > 0) { + if (cd->vtblInterfaces->dim > 0) { // symbol name std::string nam = "_D"; nam.append(cd->mangle()); @@ -271,7 +353,7 @@ const llvm::ArrayType* arrTy = llvm::ArrayType::get(infoTy, cd->vtblInterfaces->dim); // declare global irstruct->interfaceInfosTy = arrTy; - irstruct->interfaceInfos = new llvm::GlobalVariable(arrTy, true, llvm::GlobalValue::InternalLinkage, 0, nam, gIR->module); + irstruct->interfaceInfos = new llvm::GlobalVariable(arrTy, true, _linkage, NULL, nam, gIR->module); } // interface vtables @@ -329,7 +411,7 @@ if (cd->isInterfaceDeclaration()) return; // nothing to do - Logger::println("DtoConstInitClass(%s)", cd->toPrettyChars()); + Logger::println("DtoConstInitClass(%s): %s", cd->toPrettyChars(), cd->loc.toChars()); LOG_SCOPE; IRStruct* irstruct = cd->llvmIRStruct; @@ -355,19 +437,24 @@ // then comes monitor fieldinits.push_back(llvm::ConstantPointerNull::get(llvm::PointerType::get(llvm::Type::Int8Ty))); + size_t dataoffset = 2; + // next comes interface vtables for (IRStruct::InterfaceIter i=irstruct->interfaces.begin(); i!=irstruct->interfaces.end(); ++i) { IRInterface* iri = i->second; assert(iri->vtbl); fieldinits.push_back(iri->vtbl); + ++dataoffset; } + /* // rest for (IRStruct::OffsetMap::iterator i=irstruct->offsets.begin(); i!=irstruct->offsets.end(); ++i) { Logger::println("adding fieldinit for: %s", i->second.var->toChars()); fieldinits.push_back(i->second.init); } + */ // get the struct (class) type assert(cd->type->ty == Tclass); @@ -375,6 +462,22 @@ const llvm::StructType* structtype = isaStruct(ts->llvmType->get()); const llvm::StructType* vtbltype = isaStruct(ts->llvmVtblType->get()); + // go through the field inits and build the default initializer + size_t nfi = irstruct->defaultFields.size(); + for (size_t i=0; idefaultFields[i] != NULL) { + c = irstruct->defaultFields[i]->llvmConstInit; + assert(c); + } + else { + const llvm::ArrayType* arrty = isaArray(structtype->getElementType(i+dataoffset)); + std::vector vals(arrty->getNumElements(), llvm::ConstantInt::get(llvm::Type::Int8Ty, 0, false)); + c = llvm::ConstantArray::get(arrty, vals); + } + fieldinits.push_back(c); + } + // generate initializer #if 0 Logger::cout() << cd->toPrettyChars() << " | " << *structtype << '\n'; @@ -509,7 +612,7 @@ if (cd->llvmDefined) return; cd->llvmDefined = true; - Logger::println("DtoDefineClass(%s)", cd->toPrettyChars()); + Logger::println("DtoDefineClass(%s): %s", cd->toPrettyChars(), cd->loc.toChars()); LOG_SCOPE; // get the struct (class) type @@ -702,6 +805,119 @@ ////////////////////////////////////////////////////////////////////////////////////////// +static unsigned LLVM_ClassOffsetToIndex(ClassDeclaration* cd, unsigned os, unsigned& idx) +{ + // start at the bottom of the inheritance chain + if (cd->baseClass != 0) { + unsigned o = LLVM_ClassOffsetToIndex(cd->baseClass, os, idx); + if (o != (unsigned)-1) + return o; + } + + // check this class + unsigned i; + for (i=0; ifields.dim; ++i) { + VarDeclaration* vd = (VarDeclaration*)cd->fields.data[i]; + if (os == vd->offset) + return i+idx; + } + idx += i; + + return (unsigned)-1; +} + +////////////////////////////////////////////////////////////////////////////////////////// + +void ClassDeclaration::offsetToIndex(Type* t, unsigned os, std::vector& result) +{ + unsigned idx = 0; + unsigned r = LLVM_ClassOffsetToIndex(this, os, idx); + assert(r != (unsigned)-1 && "Offset not found in any aggregate field"); + // vtable is 0, monitor is 1 + r += 2; + // interface offset further + r += vtblInterfaces->dim; + // the final index was not pushed + result.push_back(r); +} + +////////////////////////////////////////////////////////////////////////////////////////// + +llvm::Value* DtoIndexClass(llvm::Value* ptr, ClassDeclaration* cd, Type* t, unsigned os, std::vector& idxs) +{ + Logger::println("checking for offset %u type %s:", os, t->toChars()); + LOG_SCOPE; + + if (idxs.empty()) + idxs.push_back(0); + + const llvm::Type* llt = llvm::PointerType::get(DtoType(t)); + const llvm::Type* st = DtoType(cd->type); + if (ptr->getType() != st) { + assert(cd->llvmHasUnions); + ptr = gIR->ir->CreateBitCast(ptr, st, "tmp"); + } + + unsigned dataoffset = 2 + cd->vtblInterfaces->dim; + + IRStruct* irstruct = cd->llvmIRStruct; + for (IRStruct::OffsetMap::iterator i=irstruct->offsets.begin(); i!=irstruct->offsets.end(); ++i) { + //for (unsigned i=0; ifields.dim; ++i) { + //VarDeclaration* vd = (VarDeclaration*)cd->fields.data[i]; + VarDeclaration* vd = i->second.var; + assert(vd); + Type* vdtype = DtoDType(vd->type); + Logger::println("found %u type %s", vd->offset, vdtype->toChars()); + assert(vd->llvmFieldIndex >= 0); + if (os == vd->offset && vdtype == t) { + idxs.push_back(vd->llvmFieldIndex + dataoffset); + Logger::cout() << "indexing: " << *ptr << '\n'; + ptr = DtoGEP(ptr, idxs, "tmp"); + if (ptr->getType() != llt) + ptr = gIR->ir->CreateBitCast(ptr, llt, "tmp"); + Logger::cout() << "indexing: " << *ptr << '\n'; + if (vd->llvmFieldIndexOffset) + ptr = new llvm::GetElementPtrInst(ptr, DtoConstUint(vd->llvmFieldIndexOffset), "tmp", gIR->scopebb()); + Logger::cout() << "indexing: " << *ptr << '\n'; + return ptr; + } + else if (vdtype->ty == Tstruct && (vd->offset + vdtype->size()) > os) { + TypeStruct* ts = (TypeStruct*)vdtype; + StructDeclaration* ssd = ts->sym; + idxs.push_back(vd->llvmFieldIndex + dataoffset); + if (vd->llvmFieldIndexOffset) { + Logger::println("has union field offset"); + ptr = DtoGEP(ptr, idxs, "tmp"); + if (ptr->getType() != llt) + ptr = gIR->ir->CreateBitCast(ptr, llt, "tmp"); + ptr = new llvm::GetElementPtrInst(ptr, DtoConstUint(vd->llvmFieldIndexOffset), "tmp", gIR->scopebb()); + std::vector tmp; + return DtoIndexStruct(ptr, ssd, t, os-vd->offset, tmp); + } + else { + const llvm::Type* sty = llvm::PointerType::get(DtoType(vd->type)); + if (ptr->getType() != sty) { + ptr = gIR->ir->CreateBitCast(ptr, sty, "tmp"); + std::vector tmp; + return DtoIndexStruct(ptr, ssd, t, os-vd->offset, tmp); + } + else { + return DtoIndexStruct(ptr, ssd, t, os-vd->offset, idxs); + } + } + } + } + + assert(0); + + size_t llt_sz = gTargetData->getTypeSize(llt->getContainedType(0)); + assert(os % llt_sz == 0); + ptr = gIR->ir->CreateBitCast(ptr, llt, "tmp"); + return new llvm::GetElementPtrInst(ptr, DtoConstUint(os / llt_sz), "tmp", gIR->scopebb()); +} + +////////////////////////////////////////////////////////////////////////////////////////// + void DtoDeclareClassInfo(ClassDeclaration* cd) { if (cd->llvmClassDeclared) return; diff -r 5825d48b27d1 -r 1700239cab2e gen/classes.h --- a/gen/classes.h Fri Jan 04 01:38:42 2008 +0100 +++ b/gen/classes.h Fri Jan 11 17:57:40 2008 +0100 @@ -31,4 +31,6 @@ DValue* DtoDynamicCastObject(DValue* val, Type* to); DValue* DtoCastInterfaceToObject(DValue* val, Type* to); +llvm::Value* DtoIndexClass(llvm::Value* ptr, ClassDeclaration* cd, Type* t, unsigned os, std::vector& idxs); + #endif diff -r 5825d48b27d1 -r 1700239cab2e gen/functions.cpp --- a/gen/functions.cpp Fri Jan 04 01:38:42 2008 +0100 +++ b/gen/functions.cpp Fri Jan 11 17:57:40 2008 +0100 @@ -189,15 +189,17 @@ const llvm::Type* thisty = NULL; if (fdecl->needThis()) { - if (AggregateDeclaration* ad = fdecl->isMember()) { - Logger::print("isMember = this is: %s\n", ad->type->toChars()); + if (AggregateDeclaration* ad = fdecl->isMember2()) { + Logger::println("isMember = this is: %s", ad->type->toChars()); thisty = DtoType(ad->type); //Logger::cout() << "this llvm type: " << *thisty << '\n'; if (isaStruct(thisty) || (!gIR->structs.empty() && thisty == gIR->topstruct()->recty.get())) thisty = llvm::PointerType::get(thisty); } - else - assert(0); + else { + Logger::println("chars: %s type: %s kind: %s", fdecl->toChars(), fdecl->type->toChars(), fdecl->kind()); + assert(0); + } } else if (fdecl->isNested()) { thisty = llvm::PointerType::get(llvm::Type::Int8Ty); @@ -245,7 +247,7 @@ if (fdecl->llvmResolved) return; fdecl->llvmResolved = true; - Logger::println("DtoResolveFunction(%s)", fdecl->toPrettyChars()); + Logger::println("DtoResolveFunction(%s): %s", fdecl->toPrettyChars(), fdecl->loc.toChars()); LOG_SCOPE; if (fdecl->llvmRunTimeHack) { @@ -289,7 +291,7 @@ if (fdecl->llvmDeclared) return; fdecl->llvmDeclared = true; - Logger::println("DtoDeclareFunction(%s)", fdecl->toPrettyChars()); + Logger::println("DtoDeclareFunction(%s): %s", fdecl->toPrettyChars(), fdecl->loc.toChars()); LOG_SCOPE; assert(!fdecl->isAbstract()); @@ -352,6 +354,17 @@ if (!vafunc && fdecl->llvmInternal != LLVMintrinsic && fdecl->parent && DtoIsTemplateInstance(fdecl->parent)) func->setLinkage(llvm::GlobalValue::WeakLinkage); + // extern(C) functions are always external + if (f->linkage == LINKc) + func->setLinkage(llvm::GlobalValue::ExternalLinkage); + + // intrinsics are always external C + if (fdecl->llvmInternal == LLVMintrinsic) + { + func->setLinkage(llvm::GlobalValue::ExternalLinkage); + func->setCallingConv(llvm::CallingConv::C); + } + fdecl->llvmValue = func; assert(llvm::isa(f->llvmType->get())); @@ -427,7 +440,7 @@ assert(fd->llvmDeclared); - Logger::println("DtoDefineFunc(%s)", fd->toPrettyChars()); + Logger::println("DtoDefineFunc(%s): %s", fd->toPrettyChars(), fd->loc.toChars()); LOG_SCOPE; // debug info @@ -495,7 +508,7 @@ vd->llvmValue = v; } else { - Logger::attention("some unknown argument: %s", arg ? arg->toChars() : 0); + Logger::attention(fd->loc, "some unknown argument: %s", arg ? arg->toChars() : 0); } } diff -r 5825d48b27d1 -r 1700239cab2e gen/logger.cpp --- a/gen/logger.cpp Fri Jan 04 01:38:42 2008 +0100 +++ b/gen/logger.cpp Fri Jan 11 17:57:40 2008 +0100 @@ -6,6 +6,8 @@ #include #include +#include "mars.h" + #include "gen/logger.h" namespace Logger @@ -67,9 +69,9 @@ { return _enabled; } - void attention(const char* fmt,...) + void attention(const Loc& loc, const char* fmt,...) { - printf("***ATTENTION*** "); + printf("***ATTENTION***: %s: ", loc.toChars()); va_list va; va_start(va,fmt); vprintf(fmt,va); diff -r 5825d48b27d1 -r 1700239cab2e gen/logger.h --- a/gen/logger.h Fri Jan 04 01:38:42 2008 +0100 +++ b/gen/logger.h Fri Jan 11 17:57:40 2008 +0100 @@ -3,6 +3,8 @@ #include +struct Loc; + namespace Logger { void indent(); @@ -14,7 +16,7 @@ void disable(); bool enabled(); - void attention(const char* fmt, ...); + void attention(const Loc& loc, const char* fmt, ...); struct LoggerScope { diff -r 5825d48b27d1 -r 1700239cab2e gen/runtime.cpp --- a/gen/runtime.cpp Fri Jan 04 01:38:42 2008 +0100 +++ b/gen/runtime.cpp Fri Jan 11 17:57:40 2008 +0100 @@ -7,20 +7,31 @@ #include "root.h" #include "mars.h" +#include "lexer.h" +#include "dsymbol.h" +#include "mtype.h" +#include "aggregate.h" #include "gen/runtime.h" #include "gen/logger.h" +#include "gen/tollvm.h" static llvm::Module* M = NULL; static bool runtime_failed = false; +static void LLVM_D_BuildRuntimeModule(); + ////////////////////////////////////////////////////////////////////////////////////////////////// bool LLVM_D_InitRuntime() { - Logger::println("*** Loading D runtime ***"); + Logger::println("*** Initializing D runtime declarations ***"); LOG_SCOPE; + LLVM_D_BuildRuntimeModule(); + return true; + + /* if (!global.params.runtimeImppath) { error("You must set the runtime import path with -E"); fatal(); @@ -47,13 +58,15 @@ delete buffer; return retval; + */ } void LLVM_D_FreeRuntime() { if (M) { - Logger::println("*** Freeing D runtime ***"); + Logger::println("*** Freeing D runtime declarations ***"); delete M; + M = NULL; } } @@ -90,9 +103,6 @@ llvm::GlobalVariable* LLVM_D_GetRuntimeGlobal(llvm::Module* target, const char* name) { - // TODO maybe check the target module first, to allow overriding the runtime on a pre module basis? - // could be done and seems like it could be neat too :) - llvm::GlobalVariable* gv = target->getNamedGlobal(name); if (gv) { return gv; @@ -118,3 +128,508 @@ const llvm::PointerType* t = g->getType(); return new llvm::GlobalVariable(t->getElementType(),g->isConstant(),g->getLinkage(),NULL,g->getName(),target); } + +////////////////////////////////////////////////////////////////////////////////////////////////// + +static const llvm::Type* rt_ptr(const llvm::Type* t) +{ + return llvm::PointerType::get(t); +} + +static const llvm::Type* rt_array(const llvm::Type* elemty) +{ + std::vector t; + t.push_back(DtoSize_t()); + t.push_back(rt_ptr(elemty)); + return rt_ptr(llvm::StructType::get(t)); +} + +static const llvm::Type* rt_dg1() +{ + std::vector types; + types.push_back(rt_ptr(llvm::Type::Int8Ty)); + types.push_back(rt_ptr(llvm::Type::Int8Ty)); + const llvm::FunctionType* fty = llvm::FunctionType::get(llvm::Type::Int32Ty, types, false); + + std::vector t; + t.push_back(rt_ptr(llvm::Type::Int8Ty)); + t.push_back(rt_ptr(fty)); + return rt_ptr(llvm::StructType::get(t)); +} + +static const llvm::Type* rt_dg2() +{ + std::vector types; + types.push_back(rt_ptr(llvm::Type::Int8Ty)); + types.push_back(rt_ptr(llvm::Type::Int8Ty)); + types.push_back(rt_ptr(llvm::Type::Int8Ty)); + const llvm::FunctionType* fty = llvm::FunctionType::get(llvm::Type::Int32Ty, types, false); + + std::vector t; + t.push_back(rt_ptr(llvm::Type::Int8Ty)); + t.push_back(rt_ptr(fty)); + return rt_ptr(llvm::StructType::get(t)); +} + +static void LLVM_D_BuildRuntimeModule() +{ + M = new llvm::Module("llvmdc internal runtime"); + + const llvm::Type* voidTy = llvm::Type::VoidTy; + const llvm::Type* boolTy = llvm::Type::Int1Ty; + const llvm::Type* byteTy = llvm::Type::Int8Ty; + const llvm::Type* shortTy = llvm::Type::Int16Ty; + const llvm::Type* intTy = llvm::Type::Int32Ty; + const llvm::Type* longTy = llvm::Type::Int64Ty; + const llvm::Type* floatTy = llvm::Type::FloatTy; + const llvm::Type* doubleTy = llvm::Type::DoubleTy; + const llvm::Type* sizeTy = DtoSize_t(); + const llvm::Type* voidPtrTy = rt_ptr(byteTy); + const llvm::Type* stringTy = rt_array(byteTy); + const llvm::Type* wstringTy = rt_array(shortTy); + const llvm::Type* dstringTy = rt_array(intTy); + const llvm::Type* objectTy = rt_ptr(ClassDeclaration::object->type->llvmType->get()); + const llvm::Type* classInfoTy = rt_ptr(ClassDeclaration::classinfo->type->llvmType->get()); + const llvm::Type* typeInfoTy = rt_ptr(Type::typeinfo->type->llvmType->get()); + const llvm::Type* aaTy = rt_ptr(llvm::OpaqueType::get()); + + ///////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////////// + + // assert + // void _d_assert(bool cond, uint line, char[] msg) + { + std::string fname("_d_assert"); + std::vector types; + types.push_back(boolTy); + types.push_back(intTy); + types.push_back(stringTy); + const llvm::FunctionType* fty = llvm::FunctionType::get(voidTy, types, false); + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); + } + + ///////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////////// + + // realloc + // void* _d_realloc(void* ptr, size_t n) + { + std::string fname("_d_realloc"); + std::vector types; + types.push_back(voidPtrTy); + types.push_back(sizeTy); + const llvm::FunctionType* fty = llvm::FunctionType::get(voidPtrTy, types, false); + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); + } + + // free + // void _d_free(void* ptr) + { + std::string fname("_d_free"); + std::vector types; + types.push_back(voidPtrTy); + const llvm::FunctionType* fty = llvm::FunctionType::get(voidTy, types, false); + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); + } + + ///////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////////// + + #define ARRAY_INIT(TY,suffix) \ + { \ + std::string fname("_d_array_init_"); \ + fname.append(suffix); \ + std::vector types; \ + types.push_back(rt_ptr(TY)); \ + types.push_back(sizeTy); \ + types.push_back(TY); \ + const llvm::FunctionType* fty = llvm::FunctionType::get(voidTy, types, false); \ + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); \ + } + + ARRAY_INIT(boolTy,"i1") + ARRAY_INIT(byteTy,"i8") + ARRAY_INIT(shortTy,"i16") + ARRAY_INIT(intTy,"i32") + ARRAY_INIT(longTy,"i64") + ARRAY_INIT(floatTy,"float") + ARRAY_INIT(doubleTy,"double") + ARRAY_INIT(voidPtrTy,"pointer") + + #undef ARRAY_INIT + + // array init mem + // void _d_array_init_mem(void* a, size_t na, void* v, size_t nv) + { + std::string fname("_d_array_init_mem"); + std::vector types; + types.push_back(voidPtrTy); + types.push_back(sizeTy); + types.push_back(voidPtrTy); + types.push_back(sizeTy); + const llvm::FunctionType* fty = llvm::FunctionType::get(voidTy, types, false); + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); + } + + ///////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////////// + + #define STR_APPLY1(TY,a,b) \ + { \ + std::string fname(a); \ + std::string fname2(b); \ + std::vector types; \ + types.push_back(TY); \ + types.push_back(rt_dg1()); \ + const llvm::FunctionType* fty = llvm::FunctionType::get(intTy, types, false); \ + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); \ + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname2, M); \ + } + STR_APPLY1(stringTy, "_aApplycw1", "_aApplycd1") + STR_APPLY1(wstringTy, "_aApplywc1", "_aApplywd1") + STR_APPLY1(dstringTy, "_aApplydc1", "_aApplydw1") + #undef STR_APPLY + + #define STR_APPLY2(TY,a,b) \ + { \ + std::string fname(a); \ + std::string fname2(b); \ + std::vector types; \ + types.push_back(TY); \ + types.push_back(rt_dg2()); \ + const llvm::FunctionType* fty = llvm::FunctionType::get(intTy, types, false); \ + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); \ + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname2, M); \ + } + STR_APPLY2(stringTy, "_aApplycw2", "_aApplycd2") + STR_APPLY2(wstringTy, "_aApplywc2", "_aApplywd2") + STR_APPLY2(dstringTy, "_aApplydc2", "_aApplydw2") + #undef STR_APPLY2 + + #define STR_APPLY_R1(TY,a,b) \ + { \ + std::string fname(a); \ + std::string fname2(b); \ + std::vector types; \ + types.push_back(TY); \ + types.push_back(rt_dg1()); \ + const llvm::FunctionType* fty = llvm::FunctionType::get(intTy, types, false); \ + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); \ + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname2, M); \ + } + STR_APPLY_R1(stringTy, "_aApplyRcw1", "_aApplyRcd1") + STR_APPLY_R1(wstringTy, "_aApplyRwc1", "_aApplyRwd1") + STR_APPLY_R1(dstringTy, "_aApplyRdc1", "_aApplyRdw1") + #undef STR_APPLY + + #define STR_APPLY_R2(TY,a,b) \ + { \ + std::string fname(a); \ + std::string fname2(b); \ + std::vector types; \ + types.push_back(TY); \ + types.push_back(rt_dg2()); \ + const llvm::FunctionType* fty = llvm::FunctionType::get(intTy, types, false); \ + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); \ + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname2, M); \ + } + STR_APPLY_R2(stringTy, "_aApplyRcw2", "_aApplyRcd2") + STR_APPLY_R2(wstringTy, "_aApplyRwc2", "_aApplyRwd2") + STR_APPLY_R2(dstringTy, "_aApplyRdc2", "_aApplyRdw2") + #undef STR_APPLY2 + + ///////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////////// + + // fixes the length for dynamic array casts + // size_t _d_array_cast_len(size_t len, size_t elemsz, size_t newelemsz) + { + std::string fname("_d_array_cast_len"); + std::vector types; + types.push_back(sizeTy); + types.push_back(sizeTy); + types.push_back(sizeTy); + const llvm::FunctionType* fty = llvm::FunctionType::get(sizeTy, types, false); + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); + } + + ///////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////////// + + // builds the d string[] for the D main args from the C main args + // void _d_main_args(uint n, char** args, ref char[][] res) + { + std::string fname("_d_main_args"); + std::vector types; + types.push_back(intTy); + types.push_back(rt_ptr(rt_ptr(byteTy))); + types.push_back(rt_array(stringTy->getContainedType(0))); + const llvm::FunctionType* fty = llvm::FunctionType::get(voidTy, types, false); + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); + } + + ///////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////////// + + // cast to object + // Object _d_toObject(void* p) + { + std::string fname("_d_toObject"); + std::vector types; + types.push_back(voidPtrTy); + const llvm::FunctionType* fty = llvm::FunctionType::get(objectTy, types, false); + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); + } + + // cast interface + // Object _d_interface_cast(void* p, ClassInfo c) + { + std::string fname("_d_interface_cast"); + std::vector types; + types.push_back(voidPtrTy); + types.push_back(classInfoTy); + const llvm::FunctionType* fty = llvm::FunctionType::get(objectTy, types, false); + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); + } + + // dynamic cast + // Object _d_dynamic_cast(Object o, ClassInfo c) + { + std::string fname("_d_dynamic_cast"); + std::vector types; + types.push_back(objectTy); + types.push_back(classInfoTy); + const llvm::FunctionType* fty = llvm::FunctionType::get(objectTy, types, false); + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); + } + + ///////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////////// + + // char[] _adReverseChar(char[] a) + // char[] _adSortChar(char[] a) + { + std::string fname("_adReverseChar"); + std::string fname2("_adSortChar"); + std::vector types; + types.push_back(stringTy); + types.push_back(stringTy); + const llvm::FunctionType* fty = llvm::FunctionType::get(voidTy, types, false); + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname2, M); + } + + // wchar[] _adReverseWchar(wchar[] a) + // wchar[] _adSortWchar(wchar[] a) + { + std::string fname("_adReverseWchar"); + std::string fname2("_adSortWchar"); + std::vector types; + types.push_back(wstringTy); + types.push_back(wstringTy); + const llvm::FunctionType* fty = llvm::FunctionType::get(voidTy, types, false); + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname2, M); + } + + // Array _adReverse(Array a, size_t szelem) + { + std::string fname("_adReverse"); + std::vector types; + types.push_back(rt_array(byteTy)); + types.push_back(rt_array(byteTy)); + types.push_back(sizeTy); + const llvm::FunctionType* fty = llvm::FunctionType::get(voidTy, types, false); + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); + } + + // Array _adDupT(TypeInfo ti, Array a) + { + std::string fname("_adDupT"); + std::vector types; + types.push_back(rt_array(byteTy)); + types.push_back(typeInfoTy); + types.push_back(rt_array(byteTy)); + const llvm::FunctionType* fty = llvm::FunctionType::get(voidTy, types, false); + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); + } + + // int _adEq(Array a1, Array a2, TypeInfo ti) + // int _adCmp(Array a1, Array a2, TypeInfo ti) + { + std::string fname("_adEq"); + std::string fname2("_adCmp"); + std::vector types; + types.push_back(rt_array(byteTy)); + types.push_back(rt_array(byteTy)); + types.push_back(typeInfoTy); + const llvm::FunctionType* fty = llvm::FunctionType::get(intTy, types, false); + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname2, M); + } + + // int _adCmpChar(Array a1, Array a2) + { + std::string fname("_adCmpChar"); + std::vector types; + types.push_back(rt_array(byteTy)); + types.push_back(rt_array(byteTy)); + const llvm::FunctionType* fty = llvm::FunctionType::get(intTy, types, false); + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); + } + + // Array _adSort(Array a, TypeInfo ti) + { + std::string fname("_adSort"); + std::vector types; + types.push_back(rt_array(byteTy)); + types.push_back(rt_array(byteTy)); + types.push_back(typeInfoTy); + const llvm::FunctionType* fty = llvm::FunctionType::get(voidTy, types, false); + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); + } + + ///////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////////// + + // size_t _aaLen(AA aa) + { + std::string fname("_aaLen"); + std::vector types; + types.push_back(aaTy); + const llvm::FunctionType* fty = llvm::FunctionType::get(sizeTy, types, false); + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); + } + + // void* _aaGet(AA* aa, TypeInfo keyti, void* pkey, size_t valuesize) + { + std::string fname("_aaGet"); + std::vector types; + types.push_back(aaTy); + types.push_back(typeInfoTy); + types.push_back(voidPtrTy); + types.push_back(sizeTy); + const llvm::FunctionType* fty = llvm::FunctionType::get(voidPtrTy, types, false); + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); + } + + // void* _aaGetRvalue(AA aa, TypeInfo keyti, size_t valuesize, void* pkey) + { + std::string fname("_aaGetRvalue"); + std::vector types; + types.push_back(aaTy); + types.push_back(typeInfoTy); + types.push_back(sizeTy); + types.push_back(voidPtrTy); + const llvm::FunctionType* fty = llvm::FunctionType::get(voidPtrTy, types, false); + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); + } + + // void* _aaIn(AA aa, TypeInfo keyti, void* pkey) + { + std::string fname("_aaIn"); + std::vector types; + types.push_back(aaTy); + types.push_back(typeInfoTy); + types.push_back(voidPtrTy); + const llvm::FunctionType* fty = llvm::FunctionType::get(voidPtrTy, types, false); + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); + } + + // void _aaDel(AA aa, TypeInfo keyti, void* pkey) + { + std::string fname("_aaDel"); + std::vector types; + types.push_back(aaTy); + types.push_back(typeInfoTy); + types.push_back(voidPtrTy); + const llvm::FunctionType* fty = llvm::FunctionType::get(voidTy, types, false); + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); + } + + // ArrayRet_t _aaValues(AA aa, size_t keysize, size_t valuesize) + { + std::string fname("_aaValues"); + std::vector types; + types.push_back(rt_array(byteTy)); + types.push_back(aaTy); + types.push_back(sizeTy); + types.push_back(sizeTy); + const llvm::FunctionType* fty = llvm::FunctionType::get(voidTy, types, false); + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); + } + + // void* _aaRehash(AA* paa, TypeInfo keyti) + { + std::string fname("_aaRehash"); + std::vector types; + types.push_back(aaTy); + types.push_back(typeInfoTy); + const llvm::FunctionType* fty = llvm::FunctionType::get(voidPtrTy, types, false); + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); + } + + // ArrayRet_t _aaKeys(AA aa, size_t keysize) + { + std::string fname("_aaKeys"); + std::vector types; + types.push_back(rt_array(byteTy)); + types.push_back(aaTy); + types.push_back(sizeTy); + const llvm::FunctionType* fty = llvm::FunctionType::get(voidTy, types, false); + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); + } + + // int _aaApply(AA aa, size_t keysize, dg_t dg) + { + std::string fname("_aaApply"); + std::vector types; + types.push_back(aaTy); + types.push_back(sizeTy); + types.push_back(rt_dg1()); + const llvm::FunctionType* fty = llvm::FunctionType::get(intTy, types, false); + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); + } + + // int _aaApply2(AA aa, size_t keysize, dg2_t dg) + { + std::string fname("_aaApply2"); + std::vector types; + types.push_back(aaTy); + types.push_back(sizeTy); + types.push_back(rt_dg1()); + const llvm::FunctionType* fty = llvm::FunctionType::get(intTy, types, false); + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); + } + + ///////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////////// + + // void _moduleCtor() + // void _moduleDtor() + { + std::string fname("_moduleCtor"); + std::string fname2("_moduleDtor"); + std::vector types; + const llvm::FunctionType* fty = llvm::FunctionType::get(voidTy, types, false); + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M); + new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname2, M); + } + +} + + + + + + diff -r 5825d48b27d1 -r 1700239cab2e gen/statements.cpp --- a/gen/statements.cpp Fri Jan 04 01:38:42 2008 +0100 +++ b/gen/statements.cpp Fri Jan 11 17:57:40 2008 +0100 @@ -9,6 +9,7 @@ #include "gen/llvm.h" #include "llvm/InlineAsm.h" +#include "mars.h" #include "total.h" #include "init.h" #include "mtype.h" @@ -27,16 +28,14 @@ void CompoundStatement::toIR(IRState* p) { - Logger::println("CompoundStatement::toIR()"); + Logger::println("CompoundStatement::toIR(): %s", loc.toChars()); LOG_SCOPE; for (int i=0; idim; i++) { Statement* s = (Statement*)statements->data[i]; - if (s) + if (s) { s->toIR(p); - else { - Logger::println("??? null statement found in CompoundStatement"); } } } @@ -45,8 +44,7 @@ void ReturnStatement::toIR(IRState* p) { - static int rsi = 0; - Logger::println("ReturnStatement::toIR(%d): %s", rsi++, toChars()); + Logger::println("ReturnStatement::toIR(): %s", loc.toChars()); LOG_SCOPE; if (exp) @@ -126,8 +124,7 @@ void ExpStatement::toIR(IRState* p) { - static int esi = 0; - Logger::println("ExpStatement::toIR(%d): %s", esi++, toChars()); + Logger::println("ExpStatement::toIR(): %s", loc.toChars()); LOG_SCOPE; if (global.params.llvmAnnotate) @@ -150,7 +147,7 @@ void IfStatement::toIR(IRState* p) { - Logger::println("IfStatement::toIR()"); + Logger::println("IfStatement::toIR(): %s", loc.toChars()); LOG_SCOPE; DValue* cond_e = condition->toElem(p); @@ -195,7 +192,7 @@ void ScopeStatement::toIR(IRState* p) { - Logger::println("ScopeStatement::toIR()"); + Logger::println("ScopeStatement::toIR(): %s", loc.toChars()); LOG_SCOPE; llvm::BasicBlock* oldend = p->scopeend(); @@ -226,8 +223,7 @@ void WhileStatement::toIR(IRState* p) { - static int wsi = 0; - Logger::println("WhileStatement::toIR(%d): %s", wsi++, toChars()); + Logger::println("WhileStatement::toIR(): %s", loc.toChars()); LOG_SCOPE; // create while blocks @@ -271,8 +267,7 @@ void DoStatement::toIR(IRState* p) { - static int wsi = 0; - Logger::println("DoStatement::toIR(%d): %s", wsi++, toChars()); + Logger::println("DoStatement::toIR(): %s", loc.toChars()); LOG_SCOPE; // create while blocks @@ -308,8 +303,7 @@ void ForStatement::toIR(IRState* p) { - static int wsi = 0; - Logger::println("ForStatement::toIR(%d): %s", wsi++, toChars()); + Logger::println("ForStatement::toIR(): %s", loc.toChars()); LOG_SCOPE; // create for blocks @@ -370,7 +364,7 @@ void BreakStatement::toIR(IRState* p) { - Logger::println("BreakStatement::toIR(): %s", toChars()); + Logger::println("BreakStatement::toIR(): %s", loc.toChars()); LOG_SCOPE; if (ident != 0) { @@ -386,7 +380,7 @@ void ContinueStatement::toIR(IRState* p) { - Logger::println("ContinueStatement::toIR(): %s", toChars()); + Logger::println("ContinueStatement::toIR(): %s", loc.toChars()); LOG_SCOPE; if (ident != 0) { @@ -402,7 +396,7 @@ void OnScopeStatement::toIR(IRState* p) { - Logger::println("OnScopeStatement::toIR(): %s", toChars()); + Logger::println("OnScopeStatement::toIR(): %s", loc.toChars()); LOG_SCOPE; assert(statement); @@ -413,7 +407,7 @@ void TryFinallyStatement::toIR(IRState* p) { - Logger::println("TryFinallyStatement::toIR(): %s", toChars()); + Logger::println("TryFinallyStatement::toIR(): %s", loc.toChars()); LOG_SCOPE; // create basic blocks @@ -491,11 +485,10 @@ void TryCatchStatement::toIR(IRState* p) { - static int wsi = 0; - Logger::println("TryCatchStatement::toIR(%d): %s", wsi++, toChars()); + Logger::println("TryCatchStatement::toIR(): %s", loc.toChars()); LOG_SCOPE; - Logger::attention("try-catch is not yet fully implemented, only the try block will be emitted."); + Logger::attention(loc, "try-catch is not yet fully implemented, only the try block will be emitted."); assert(body); body->toIR(p); @@ -512,11 +505,10 @@ void ThrowStatement::toIR(IRState* p) { - static int wsi = 0; - Logger::println("ThrowStatement::toIR(%d): %s", wsi++, toChars()); + Logger::println("ThrowStatement::toIR(): %s", loc.toChars()); LOG_SCOPE; - Logger::attention("throw is not yet implemented, replacing expression with assert(0);"); + Logger::attention(loc, "throw is not yet implemented, replacing expression with assert(0);"); DtoAssert(NULL, &loc, NULL); @@ -574,7 +566,7 @@ void SwitchStatement::toIR(IRState* p) { - Logger::println("SwitchStatement::toIR()"); + Logger::println("SwitchStatement::toIR(): %s", loc.toChars()); LOG_SCOPE; llvm::BasicBlock* oldend = gIR->scopeend(); @@ -725,7 +717,7 @@ ////////////////////////////////////////////////////////////////////////////// void CaseStatement::toIR(IRState* p) { - Logger::println("CaseStatement::toIR(): %s", toChars()); + Logger::println("CaseStatement::toIR(): %s", loc.toChars()); LOG_SCOPE; assert(0); @@ -735,7 +727,7 @@ void UnrolledLoopStatement::toIR(IRState* p) { - Logger::println("UnrolledLoopStatement::toIR(): %s", toChars()); + Logger::println("UnrolledLoopStatement::toIR(): %s", loc.toChars()); LOG_SCOPE; llvm::BasicBlock* oldend = gIR->scopeend(); @@ -760,7 +752,7 @@ void ForeachStatement::toIR(IRState* p) { - Logger::println("ForeachStatement::toIR(): %s", toChars()); + Logger::println("ForeachStatement::toIR(): %s", loc.toChars()); LOG_SCOPE; //assert(arguments->dim == 1); @@ -916,7 +908,7 @@ void LabelStatement::toIR(IRState* p) { - Logger::println("LabelStatement::toIR(): %s", toChars()); + Logger::println("LabelStatement::toIR(): %s", loc.toChars()); LOG_SCOPE; assert(tf == NULL); @@ -940,7 +932,7 @@ void GotoStatement::toIR(IRState* p) { - Logger::println("GotoStatement::toIR(): %s", toChars()); + Logger::println("GotoStatement::toIR(): %s", loc.toChars()); LOG_SCOPE; assert(tf == NULL); @@ -959,7 +951,7 @@ void WithStatement::toIR(IRState* p) { - Logger::println("WithStatement::toIR(): %s", toChars()); + Logger::println("WithStatement::toIR(): %s", loc.toChars()); LOG_SCOPE; assert(exp); @@ -976,10 +968,10 @@ void SynchronizedStatement::toIR(IRState* p) { - Logger::println("SynchronizedStatement::toIR(): %s", toChars()); + Logger::println("SynchronizedStatement::toIR(): %s", loc.toChars()); LOG_SCOPE; - Logger::attention("synchronized is currently ignored. only the body will be emitted"); + Logger::attention(loc, "synchronized is currently ignored. only the body will be emitted"); body->toIR(p); } @@ -988,7 +980,7 @@ void AsmStatement::toIR(IRState* p) { - Logger::println("AsmStatement::toIR(): %s", toChars()); + Logger::println("AsmStatement::toIR(): %s", loc.toChars()); LOG_SCOPE; error("%s: inline asm is not yet implemented", loc.toChars()); fatal(); @@ -1020,6 +1012,18 @@ ////////////////////////////////////////////////////////////////////////////// +void VolatileStatement::toIR(IRState* p) +{ + Logger::println("VolatileStatement::toIR(): %s", loc.toChars()); + LOG_SCOPE; + + Logger::attention(loc, "volatile is currently ignored. only the body will be emitted"); + + statement->toIR(p); +} + +////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////// #define STUBST(x) void x::toIR(IRState * p) {error("Statement type "#x" not implemented: %s", toChars());fatal();} @@ -1044,7 +1048,7 @@ //STUBST(AsmStatement); //STUBST(TryCatchStatement); //STUBST(TryFinallyStatement); -STUBST(VolatileStatement); +//STUBST(VolatileStatement); //STUBST(LabelStatement); //STUBST(ThrowStatement); STUBST(GotoCaseStatement); diff -r 5825d48b27d1 -r 1700239cab2e gen/structs.cpp --- a/gen/structs.cpp Fri Jan 04 01:38:42 2008 +0100 +++ b/gen/structs.cpp Fri Jan 11 17:57:40 2008 +0100 @@ -171,7 +171,7 @@ if (sd->llvmResolved) return; sd->llvmResolved = true; - Logger::println("DtoResolveStruct(%s)", sd->toChars()); + Logger::println("DtoResolveStruct(%s): %s", sd->toChars(), sd->loc.toChars()); LOG_SCOPE; TypeStruct* ts = (TypeStruct*)DtoDType(sd->type); @@ -180,10 +180,16 @@ sd->llvmIRStruct = irstruct; gIR->structs.push_back(irstruct); - for (int k=0; k < sd->members->dim; k++) { + Array* arr = &sd->fields; + for (int k=0; k < arr->dim; k++) { + VarDeclaration* v = (VarDeclaration*)(arr->data[k]); + v->toObjFile(); + } + + /*for (int k=0; k < sd->members->dim; k++) { Dsymbol* dsym = (Dsymbol*)(sd->members->data[k]); dsym->toObjFile(); - } + }*/ Logger::println("doing struct fields"); @@ -293,7 +299,7 @@ if (sd->llvmDeclared) return; sd->llvmDeclared = true; - Logger::println("DtoDeclareStruct(%s)", sd->toChars()); + Logger::println("DtoDeclareStruct(%s): %s", sd->toChars(), sd->loc.toChars()); LOG_SCOPE; TypeStruct* ts = (TypeStruct*)DtoDType(sd->type); @@ -318,7 +324,7 @@ if (sd->llvmInitialized) return; sd->llvmInitialized = true; - Logger::println("DtoConstInitStruct(%s)", sd->toChars()); + Logger::println("DtoConstInitStruct(%s): %s", sd->toChars(), sd->loc.toChars()); LOG_SCOPE; IRStruct* irstruct = sd->llvmIRStruct; @@ -390,7 +396,7 @@ if (sd->llvmDefined) return; sd->llvmDefined = true; - Logger::println("DtoDefineStruct(%s)", sd->toChars()); + Logger::println("DtoDefineStruct(%s): %s", sd->toChars(), sd->loc.toChars()); LOG_SCOPE; assert(sd->type->ty == Tstruct); diff -r 5825d48b27d1 -r 1700239cab2e gen/toir.cpp --- a/gen/toir.cpp Fri Jan 04 01:38:42 2008 +0100 +++ b/gen/toir.cpp Fri Jan 11 17:57:40 2008 +0100 @@ -14,6 +14,7 @@ #include "gen/llvm.h" +#include "attrib.h" #include "total.h" #include "init.h" #include "mtype.h" @@ -114,10 +115,19 @@ Logger::println("TypedefDeclaration"); tdef->type->getTypeInfo(NULL); } + // attribute declaration + else if (AttribDeclaration* a = declaration->isAttribDeclaration()) + { + Logger::println("AttribDeclaration"); + for (int i=0; i < a->decl->dim; ++i) + { + DtoForceDeclareDsymbol((Dsymbol*)a->decl->data[i]); + } + } // unsupported declaration else { - error("Unimplemented DeclarationExp type"); + error("Unimplemented DeclarationExp type. kind: %s", declaration->kind()); assert(0); } return 0; @@ -261,7 +271,18 @@ assert(ts->sym->llvmConstInit); return ts->sym->llvmConstInit; } - assert(0 && "Only supported const VarExp is of a SymbolDeclaration"); + else if (TypeInfoDeclaration* ti = var->isTypeInfoDeclaration()) + { + DtoForceDeclareDsymbol(ti); + assert(ti->llvmValue); + const llvm::Type* vartype = DtoType(type); + llvm::Constant* m = isaConstant(ti->llvmValue); + assert(m); + if (ti->llvmValue->getType() != llvm::PointerType::get(vartype)) + m = llvm::ConstantExpr::getBitCast(m, vartype); + return m; + } + assert(0 && "Unsupported const VarExp kind"); return NULL; } @@ -836,7 +857,7 @@ assert(tf); } - // va args + // magic stuff bool va_magic = false; bool va_intrinsic = false; DFuncValue* dfv = fn->isFunc(); @@ -867,6 +888,8 @@ //Argument* fnarg = Argument::getNth(tf->parameters, 0); Expression* exp = (Expression*)arguments->data[0]; DValue* expv = exp->toElem(p); + if (expv->getType()->toBasetype()->ty != Tint32) + expv = DtoCast(expv, Type::tint32); llvm::Value* alloc = new llvm::AllocaInst(llvm::Type::Int8Ty, expv->getRVal(), "alloca", p->scopebb()); return new DImValue(type, alloc); } @@ -1315,18 +1338,33 @@ assert(e1type->next->ty == Tstruct); TypeStruct* ts = (TypeStruct*)e1type->next; Logger::println("Struct member offset:%d", vd->offset); + llvm::Value* src = l->getRVal(); + std::vector vdoffsets; arrptr = DtoIndexStruct(src, ts->sym, vd->type, vd->offset, vdoffsets); } else if (e1type->ty == Tclass) { TypeClass* tc = (TypeClass*)e1type; Logger::println("Class member offset: %d", vd->offset); - std::vector vdoffsets(1,0); - tc->sym->offsetToIndex(vd->type, vd->offset, vdoffsets); + llvm::Value* src = l->getRVal(); - //Logger::cout() << "src: " << *src << '\n'; + + std::vector vdoffsets; + arrptr = DtoIndexClass(src, tc->sym, vd->type, vd->offset, vdoffsets); + + /*std::vector vdoffsets(1,0); + tc->sym->offsetToIndex(vd->type, vd->offset, vdoffsets); + + llvm::Value* src = l->getRVal(); + + Logger::println("indices:"); + for (size_t i=0; iscopebb()); + Logger::cout() << "dst: " << *arrptr << '\n';*/ } else assert(0); @@ -1609,7 +1647,11 @@ } if (!skip) { - eval = new llvm::ICmpInst(cmpop, l->getRVal(), r->getRVal(), "tmp", p->scopebb()); + llvm::Value* a = l->getRVal(); + llvm::Value* b = r->getRVal(); + Logger::cout() << "type 1: " << *a << '\n'; + Logger::cout() << "type 2: " << *b << '\n'; + eval = new llvm::ICmpInst(cmpop, a, b, "tmp", p->scopebb()); } } else if (t->isfloating()) @@ -1810,44 +1852,47 @@ llvm::Value* emem = 0; bool inplace = false; - if (onstack) { - assert(ntype->ty == Tclass); - emem = new llvm::AllocaInst(t->getContainedType(0),"tmp",p->topallocapoint()); - } - else if (ntype->ty == Tclass) { - emem = new llvm::MallocInst(t->getContainedType(0),"tmp",p->scopebb()); - } - else if (ntype->ty == Tarray) { - assert(arguments); - if (arguments->dim == 1) { - DValue* sz = ((Expression*)arguments->data[0])->toElem(p); - llvm::Value* dimval = sz->getRVal(); - Type* nnt = DtoDType(ntype->next); - if (nnt->ty == Tvoid) - nnt = Type::tint8; - if (!p->topexp() || p->topexp()->e2 != this) { - const llvm::Type* restype = DtoType(type); - Logger::cout() << "restype = " << *restype << '\n'; - emem = new llvm::AllocaInst(restype,"newstorage",p->topallocapoint()); - DtoNewDynArray(emem, dimval, nnt); - return new DVarValue(newtype, emem, true); + { + Logger::println("Allocating memory"); + LOG_SCOPE; + if (onstack) { + assert(ntype->ty == Tclass); + emem = new llvm::AllocaInst(t->getContainedType(0),"tmp",p->topallocapoint()); + } + else if (ntype->ty == Tclass) { + emem = new llvm::MallocInst(t->getContainedType(0),"tmp",p->scopebb()); + } + else if (ntype->ty == Tarray) { + assert(arguments); + if (arguments->dim == 1) { + DValue* sz = ((Expression*)arguments->data[0])->toElem(p); + llvm::Value* dimval = sz->getRVal(); + Type* nnt = DtoDType(ntype->next); + if (nnt->ty == Tvoid) + nnt = Type::tint8; + + if (p->topexp() && p->topexp()->e2 == this) { + assert(p->topexp()->v); + emem = p->topexp()->v->getLVal(); + DtoNewDynArray(emem, dimval, nnt); + inplace = true; + } + else { + const llvm::Type* restype = DtoType(type); + Logger::cout() << "restype = " << *restype << '\n'; + emem = new llvm::AllocaInst(restype,"newstorage",p->topallocapoint()); + DtoNewDynArray(emem, dimval, nnt); + return new DVarValue(newtype, emem, true); + } } - else if (p->topexp() && p->topexp()->e2 == this) { - assert(p->topexp()->v); - emem = p->topexp()->v->getLVal(); - DtoNewDynArray(emem, dimval, nnt); - inplace = true; + else { + assert(0 && "num args to 'new' != 1"); } - else - assert(0); } else { - assert(0); + emem = new llvm::MallocInst(t,"tmp",p->scopebb()); } } - else { - emem = new llvm::MallocInst(t,"tmp",p->scopebb()); - } if (ntype->ty == Tclass) { // first apply the static initializer @@ -1856,13 +1901,20 @@ // set the this var for nested classes if (thisexp) { + Logger::println("Resolving 'this' expression"); + LOG_SCOPE; DValue* thisval = thisexp->toElem(p); size_t idx = 2; idx += tc->sym->llvmIRStruct->interfaces.size(); - DtoStore(thisval->getRVal(), DtoGEPi(emem,0,idx,"tmp")); + llvm::Value* dst = thisval->getRVal(); + llvm::Value* src = DtoGEPi(emem,0,idx,"tmp"); + Logger::cout() << "dst: " << *dst << "\nsrc: " << *src << '\n'; + DtoStore(dst, src); } else if (tc->sym->isNested()) { + Logger::println("Resolving nested context"); + LOG_SCOPE; size_t idx = 2; idx += tc->sym->llvmIRStruct->interfaces.size(); llvm::Value* nest = p->func()->decl->llvmNested; @@ -1876,6 +1928,8 @@ // then call constructor if (arguments) { + Logger::println("Calling constructor"); + LOG_SCOPE; assert(member); assert(member->llvmValue); llvm::Function* fn = llvm::cast(member->llvmValue); @@ -2336,17 +2390,25 @@ Type* t = DtoDType(type); + bool arrNarr = DtoDType(e1->type) == DtoDType(e2->type); + IRExp* ex = p->topexp(); if (ex && ex->e2 == this) { assert(ex->v); - DtoCatArrays(ex->v->getLVal(),e1,e2); + if (arrNarr) + DtoCatArrays(ex->v->getLVal(),e1,e2); + else + DtoCatArrayElement(ex->v->getLVal(),e1,e2); return new DImValue(type, ex->v->getLVal(), true); } else { assert(t->ty == Tarray); const llvm::Type* arrty = DtoType(t); llvm::Value* dst = new llvm::AllocaInst(arrty, "tmpmem", p->topallocapoint()); - DtoCatArrays(dst,e1,e2); + if (arrNarr) + DtoCatArrays(dst,e1,e2); + else + DtoCatArrayElement(dst,e1,e2); return new DVarValue(type, dst, true); } } diff -r 5825d48b27d1 -r 1700239cab2e gen/tollvm.cpp --- a/gen/tollvm.cpp Fri Jan 04 01:38:42 2008 +0100 +++ b/gen/tollvm.cpp Fri Jan 11 17:57:40 2008 +0100 @@ -134,6 +134,7 @@ } } } + Logger::println("no type found"); } TypeClass* tc = (TypeClass*)t; @@ -349,7 +350,10 @@ switch(prot) { case PROTprivate: - return llvm::GlobalValue::InternalLinkage; + if (stc & STCextern) + return llvm::GlobalValue::ExternalLinkage; + else + return llvm::GlobalValue::InternalLinkage; case PROTpublic: case PROTpackage: @@ -903,8 +907,12 @@ else if (t->ty == Tdelegate) { if (rhs->isNull()) DtoNullDelegate(lhs->getLVal()); - else if (!rhs->inPlace()) - DtoDelegateCopy(lhs->getLVal(), rhs->getRVal()); + else if (!rhs->inPlace()) { + llvm::Value* l = lhs->getLVal(); + llvm::Value* r = rhs->getRVal(); + Logger::cout() << "assign\nlhs: " << *l << "rhs: " << *r << '\n'; + DtoDelegateCopy(l, r); + } } else if (t->ty == Tclass) { assert(t2->ty == Tclass); diff -r 5825d48b27d1 -r 1700239cab2e gen/toobj.cpp --- a/gen/toobj.cpp Fri Jan 04 01:38:42 2008 +0100 +++ b/gen/toobj.cpp Fri Jan 11 17:57:40 2008 +0100 @@ -351,6 +351,7 @@ for (size_t i = 0; i < aclasses.dim; i++) { ClassDeclaration* cd = (ClassDeclaration*)aclasses.data[i]; + Logger::println("class: %s", cd->toPrettyChars()); assert(cd->llvmClass); classInits.push_back(cd->llvmClass); } @@ -370,9 +371,8 @@ initVec.push_back(c); // flags - if (needmoduleinfo) - c = DtoConstUint(0); // flags (4 means MIstandalone) - else + c = DtoConstUint(0); + if (!needmoduleinfo) c = DtoConstUint(4); // flags (4 means MIstandalone) initVec.push_back(c); @@ -391,6 +391,22 @@ c = unittest ? unittest : moduleinfo->llvmConstInit->getOperand(8); initVec.push_back(c); + // xgetMembers + c = moduleinfo->llvmConstInit->getOperand(9); + initVec.push_back(c); + + // ictor + c = moduleinfo->llvmConstInit->getOperand(10); + initVec.push_back(c); + + /*Logger::println("MODULE INFO INITIALIZERS"); + for (size_t i=0; igetType() != moduleinfoTy->getElementType(i)) + assert(0); + }*/ + // create initializer llvm::Constant* constMI = llvm::ConstantStruct::get(moduleinfoTy, initVec); @@ -442,42 +458,6 @@ /* ================================================================== */ -static unsigned LLVM_ClassOffsetToIndex(ClassDeclaration* cd, unsigned os, unsigned& idx) -{ - // start at the bottom of the inheritance chain - if (cd->baseClass != 0) { - unsigned o = LLVM_ClassOffsetToIndex(cd->baseClass, os, idx); - if (o != (unsigned)-1) - return o; - } - - // check this class - unsigned i; - for (i=0; ifields.dim; ++i) { - VarDeclaration* vd = (VarDeclaration*)cd->fields.data[i]; - if (os == vd->offset) - return i+idx; - } - idx += i; - - return (unsigned)-1; -} - -void ClassDeclaration::offsetToIndex(Type* t, unsigned os, std::vector& result) -{ - unsigned idx = 0; - unsigned r = LLVM_ClassOffsetToIndex(this, os, idx); - assert(r != (unsigned)-1 && "Offset not found in any aggregate field"); - // vtable is 0, monitor is 1 - r += 2; - // interface offset further - r += vtblInterfaces->dim; - // the final index was not pushed - result.push_back(r); -} - -/* ================================================================== */ - void ClassDeclaration::toObjFile() { gIR->resolveList.push_back(this); @@ -510,6 +490,11 @@ // global variable or magic if (isDataseg()) { + // we don't want to touch private static members at all !!! + if ((prot() & PROTprivate) && getModule() != gIR->dmodule) + return; + + // don't duplicate work if (llvmResolved) return; llvmResolved = true; llvmDeclared = true; @@ -548,9 +533,6 @@ DtoConstInitGlobal(this); else gIR->constInitList.push_back(this); - - //if (storage_class & STCprivate) - // gvar->setVisibility(llvm::GlobalValue::ProtectedVisibility); } // inside aggregate declaration. declare a field. diff -r 5825d48b27d1 -r 1700239cab2e gen/typinf.cpp --- a/gen/typinf.cpp Fri Jan 04 01:38:42 2008 +0100 +++ b/gen/typinf.cpp Fri Jan 11 17:57:40 2008 +0100 @@ -251,7 +251,7 @@ if (tid->llvmResolved) return; tid->llvmResolved = true; - Logger::println("* DtoResolveTypeInfo(%s)", tid->toChars()); + Logger::println("DtoResolveTypeInfo(%s)", tid->toChars()); LOG_SCOPE; tid->llvmIRGlobal = new IRGlobal(tid); @@ -264,7 +264,7 @@ if (tid->llvmDeclared) return; tid->llvmDeclared = true; - Logger::println("* DtoDeclareTypeInfo(%s)", tid->toChars()); + Logger::println("DtoDeclareTypeInfo(%s)", tid->toChars()); LOG_SCOPE; std::string mangled(tid->mangle()); @@ -274,13 +274,24 @@ // this is a declaration of a builtin __initZ var if (tid->tinfo->builtinTypeInfo()) { - tid->llvmValue = LLVM_D_GetRuntimeGlobal(gIR->module, mangled.c_str()); - assert(tid->llvmValue); - mangled.append("__TYPE"); - gIR->module->addTypeName(mangled, tid->llvmValue->getType()->getContainedType(0)); - Logger::println("Got typeinfo var: %s", tid->llvmValue->getName().c_str()); - tid->llvmInitialized = true; - tid->llvmDefined = true; + llvm::Value* found = gIR->module->getNamedGlobal(mangled); + if (!found) + { + const llvm::Type* t = llvm::OpaqueType::get(); + llvm::GlobalVariable* g = new llvm::GlobalVariable(t, true, llvm::GlobalValue::ExternalLinkage, NULL, mangled, gIR->module); + assert(g); + tid->llvmValue = g; + mangled.append("__TYPE"); + gIR->module->addTypeName(mangled, tid->llvmValue->getType()->getContainedType(0)); + Logger::println("Got typeinfo var: %s", tid->llvmValue->getName().c_str()); + tid->llvmInitialized = true; + tid->llvmDefined = true; + } + else if (!tid->llvmValue) { + tid->llvmValue = found; + tid->llvmInitialized = true; + tid->llvmDefined = true; + } } // custom typedef else { @@ -294,7 +305,7 @@ if (tid->llvmInitialized) return; tid->llvmInitialized = true; - Logger::println("* DtoConstInitTypeInfo(%s)", tid->toChars()); + Logger::println("DtoConstInitTypeInfo(%s)", tid->toChars()); LOG_SCOPE; gIR->defineList.push_back(tid); @@ -305,7 +316,7 @@ if (tid->llvmDefined) return; tid->llvmDefined = true; - Logger::println("* DtoDefineTypeInfo(%s)", tid->toChars()); + Logger::println("DtoDefineTypeInfo(%s)", tid->toChars()); LOG_SCOPE; tid->llvmDefine(); @@ -912,8 +923,9 @@ { fd = fdx->overloadExactMatch(tftohash); if (fd) { + DtoForceDeclareDsymbol(fd); assert(fd->llvmValue != 0); - llvm::Constant* c = llvm::cast_or_null(fd->llvmValue); + llvm::Constant* c = isaConstant(fd->llvmValue); assert(c); c = llvm::ConstantExpr::getBitCast(c, ptty); sinits.push_back(c); @@ -937,8 +949,9 @@ { fd = fdx->overloadExactMatch(tfeqptr); if (fd) { + DtoForceDeclareDsymbol(fd); assert(fd->llvmValue != 0); - llvm::Constant* c = llvm::cast_or_null(fd->llvmValue); + llvm::Constant* c = isaConstant(fd->llvmValue); assert(c); c = llvm::ConstantExpr::getBitCast(c, ptty); sinits.push_back(c); @@ -964,8 +977,9 @@ { fd = fdx->overloadExactMatch(tftostring); if (fd) { + DtoForceDeclareDsymbol(fd); assert(fd->llvmValue != 0); - llvm::Constant* c = llvm::cast_or_null(fd->llvmValue); + llvm::Constant* c = isaConstant(fd->llvmValue); assert(c); c = llvm::ConstantExpr::getBitCast(c, ptty); sinits.push_back(c); diff -r 5825d48b27d1 -r 1700239cab2e llvmdc.kdevelop --- a/llvmdc.kdevelop Fri Jan 04 01:38:42 2008 +0100 +++ b/llvmdc.kdevelop Fri Jan 11 17:57:40 2008 +0100 @@ -402,6 +402,178 @@ obj/Debug/utf.d obj/Debug/version.d obj + dmd24 + dmd24/access.c + dmd24/aggregate.h + dmd24/array.c + dmd24/arraytypes.h + dmd24/attrib.c + dmd24/attrib.h + dmd24/cast.c + dmd24/class.c + dmd24/complex_t.h + dmd24/cond.c + dmd24/cond.h + dmd24/constfold.c + dmd24/dchar.c + dmd24/dchar.h + dmd24/declaration.c + dmd24/declaration.h + dmd24/delegatize.c + dmd24/doc.c + dmd24/doc.h + dmd24/dsymbol.c + dmd24/dsymbol.h + dmd24/dump.c + dmd24/entity.c + dmd24/enum.c + dmd24/enum.h + dmd24/expression.c + dmd24/expression.h + dmd24/func.c + dmd24/gnuc.c + dmd24/gnuc.h + dmd24/hdrgen.c + dmd24/hdrgen.h + dmd24/html.c + dmd24/html.h + dmd24/identifier.c + dmd24/identifier.h + dmd24/idgen.c + dmd24/impcnvgen.c + dmd24/import.c + dmd24/import.h + dmd24/inifile.c + dmd24/init.c + dmd24/init.h + dmd24/inline.c + dmd24/interpret.c + dmd24/lexer.c + dmd24/lexer.h + dmd24/link.c + dmd24/lstring.c + dmd24/lstring.h + dmd24/macro.c + dmd24/macro.h + dmd24/mangle.c + dmd24/mars.c + dmd24/mars.h + dmd24/mem.c + dmd24/mem.h + dmd24/module.c + dmd24/module.h + dmd24/mtype.c + dmd24/mtype.h + dmd24/opover.c + dmd24/optimize.c + dmd24/parse.c + dmd24/parse.h + dmd24/port.h + dmd24/root.c + dmd24/root.h + dmd24/scope.c + dmd24/scope.h + dmd24/statement.c + dmd24/statement.h + dmd24/staticassert.c + dmd24/staticassert.h + dmd24/stringtable.c + dmd24/stringtable.h + dmd24/struct.c + dmd24/template.c + dmd24/template.h + dmd24/total.h + dmd24/unialpha.c + dmd24/utf.c + dmd24/utf.h + dmd24/version.c + dmd24/version.h + dmd25 + dmd25/access.c + dmd25/aggregate.h + dmd25/array.c + dmd25/arraytypes.h + dmd25/attrib.c + dmd25/attrib.h + dmd25/cast.c + dmd25/class.c + dmd25/complex_t.h + dmd25/cond.c + dmd25/cond.h + dmd25/constfold.c + dmd25/dchar.c + dmd25/dchar.h + dmd25/declaration.c + dmd25/declaration.h + dmd25/delegatize.c + dmd25/doc.c + dmd25/doc.h + dmd25/dsymbol.c + dmd25/dsymbol.h + dmd25/dump.c + dmd25/entity.c + dmd25/enum.c + dmd25/enum.h + dmd25/expression.c + dmd25/expression.h + dmd25/func.c + dmd25/gnuc.c + dmd25/gnuc.h + dmd25/hdrgen.c + dmd25/hdrgen.h + dmd25/html.c + dmd25/html.h + dmd25/identifier.c + dmd25/identifier.h + dmd25/idgen.c + dmd25/impcnvgen.c + dmd25/import.c + dmd25/import.h + dmd25/inifile.c + dmd25/init.c + dmd25/init.h + dmd25/inline.c + dmd25/interpret.c + dmd25/lexer.c + dmd25/lexer.h + dmd25/link.c + dmd25/lstring.c + dmd25/lstring.h + dmd25/macro.c + dmd25/macro.h + dmd25/mangle.c + dmd25/mars.c + dmd25/mars.h + dmd25/mem.c + dmd25/mem.h + dmd25/module.c + dmd25/module.h + dmd25/mtype.c + dmd25/mtype.h + dmd25/opover.c + dmd25/optimize.c + dmd25/parse.c + dmd25/parse.h + dmd25/port.h + dmd25/root.c + dmd25/root.h + dmd25/scope.c + dmd25/scope.h + dmd25/statement.c + dmd25/statement.h + dmd25/staticassert.c + dmd25/staticassert.h + dmd25/stringtable.c + dmd25/stringtable.h + dmd25/struct.c + dmd25/template.c + dmd25/template.h + dmd25/total.h + dmd25/unialpha.c + dmd25/utf.c + dmd25/utf.h + dmd25/version.c + dmd25/version.h make diff -r 5825d48b27d1 -r 1700239cab2e llvmdc.kdevelop.filelist --- a/llvmdc.kdevelop.filelist Fri Jan 04 01:38:42 2008 +0100 +++ b/llvmdc.kdevelop.filelist Fri Jan 11 17:57:40 2008 +0100 @@ -142,9 +142,10 @@ lphobos/build.sh lphobos/crc32.d lphobos/gc +lphobos/gc/gc.d lphobos/gc/gcbits.d lphobos/gc/gclinux.d -lphobos/gc/gcstub.d +lphobos/gc/gcx.d lphobos/gcstats.d lphobos/internal lphobos/internal/aApply.d @@ -239,6 +240,666 @@ lphobos/typeinfos2.d premake.lua runalltests.d +tango +tango/lib +tango/lib/common +tango/lib/common/tango +tango/lib/common/tango/core +tango/lib/common/tango/core/BitManip.d +tango/lib/common/tango/core/Exception.d +tango/lib/common/tango/core/Memory.d +tango/lib/common/tango/core/Runtime.d +tango/lib/common/tango/core/Thread.d +tango/lib/common/tango/stdc +tango/lib/common/tango/stdc/posix +tango/lib/common/tango/stdc/posix/pthread_darwin.d +tango/lib/common/tango/stdc/wrap.c +tango/lib/compiler +tango/lib/compiler/dmd +tango/lib/compiler/dmd/aApply.d +tango/lib/compiler/dmd/aApplyR.d +tango/lib/compiler/dmd/aaA.d +tango/lib/compiler/dmd/adi.d +tango/lib/compiler/dmd/alloca.d +tango/lib/compiler/dmd/arraycast.d +tango/lib/compiler/dmd/arraycat.d +tango/lib/compiler/dmd/cast.d +tango/lib/compiler/dmd/cmath2.d +tango/lib/compiler/dmd/compiler.d +tango/lib/compiler/dmd/complex.c +tango/lib/compiler/dmd/cover.d +tango/lib/compiler/dmd/critical.c +tango/lib/compiler/dmd/deh.c +tango/lib/compiler/dmd/deh2.d +tango/lib/compiler/dmd/dmain2.d +tango/lib/compiler/dmd/genobj.d +tango/lib/compiler/dmd/invariant.d +tango/lib/compiler/dmd/lifetime.d +tango/lib/compiler/dmd/llmath.d +tango/lib/compiler/dmd/mars.h +tango/lib/compiler/dmd/memory.d +tango/lib/compiler/dmd/memset.d +tango/lib/compiler/dmd/monitor.c +tango/lib/compiler/dmd/obj.d +tango/lib/compiler/dmd/qsort.d +tango/lib/compiler/dmd/qsort2.d +tango/lib/compiler/dmd/switch.d +tango/lib/compiler/dmd/trace.d +tango/lib/compiler/dmd/typeinfo +tango/lib/compiler/dmd/typeinfo/ti_AC.d +tango/lib/compiler/dmd/typeinfo/ti_Acdouble.d +tango/lib/compiler/dmd/typeinfo/ti_Acfloat.d +tango/lib/compiler/dmd/typeinfo/ti_Acreal.d +tango/lib/compiler/dmd/typeinfo/ti_Adouble.d +tango/lib/compiler/dmd/typeinfo/ti_Afloat.d +tango/lib/compiler/dmd/typeinfo/ti_Ag.d +tango/lib/compiler/dmd/typeinfo/ti_Aint.d +tango/lib/compiler/dmd/typeinfo/ti_Along.d +tango/lib/compiler/dmd/typeinfo/ti_Areal.d +tango/lib/compiler/dmd/typeinfo/ti_Ashort.d +tango/lib/compiler/dmd/typeinfo/ti_C.d +tango/lib/compiler/dmd/typeinfo/ti_byte.d +tango/lib/compiler/dmd/typeinfo/ti_cdouble.d +tango/lib/compiler/dmd/typeinfo/ti_cfloat.d +tango/lib/compiler/dmd/typeinfo/ti_char.d +tango/lib/compiler/dmd/typeinfo/ti_creal.d +tango/lib/compiler/dmd/typeinfo/ti_dchar.d +tango/lib/compiler/dmd/typeinfo/ti_delegate.d +tango/lib/compiler/dmd/typeinfo/ti_double.d +tango/lib/compiler/dmd/typeinfo/ti_float.d +tango/lib/compiler/dmd/typeinfo/ti_idouble.d +tango/lib/compiler/dmd/typeinfo/ti_ifloat.d +tango/lib/compiler/dmd/typeinfo/ti_int.d +tango/lib/compiler/dmd/typeinfo/ti_ireal.d +tango/lib/compiler/dmd/typeinfo/ti_long.d +tango/lib/compiler/dmd/typeinfo/ti_ptr.d +tango/lib/compiler/dmd/typeinfo/ti_real.d +tango/lib/compiler/dmd/typeinfo/ti_short.d +tango/lib/compiler/dmd/typeinfo/ti_ubyte.d +tango/lib/compiler/dmd/typeinfo/ti_uint.d +tango/lib/compiler/dmd/typeinfo/ti_ulong.d +tango/lib/compiler/dmd/typeinfo/ti_ushort.d +tango/lib/compiler/dmd/typeinfo/ti_void.d +tango/lib/compiler/dmd/typeinfo/ti_wchar.d +tango/lib/compiler/dmd/util +tango/lib/compiler/dmd/util/console.d +tango/lib/compiler/dmd/util/ctype.d +tango/lib/compiler/dmd/util/string.d +tango/lib/compiler/dmd/util/utf.d +tango/lib/compiler/gdc +tango/lib/compiler/gdc/aApply.d +tango/lib/compiler/gdc/aApplyR.d +tango/lib/compiler/gdc/aaA.d +tango/lib/compiler/gdc/actest.d +tango/lib/compiler/gdc/adi.d +tango/lib/compiler/gdc/arraycast.d +tango/lib/compiler/gdc/arraycat.d +tango/lib/compiler/gdc/cast.d +tango/lib/compiler/gdc/cmain.d +tango/lib/compiler/gdc/cmath2.d +tango/lib/compiler/gdc/compiler.d +tango/lib/compiler/gdc/config +tango/lib/compiler/gdc/config.h +tango/lib/compiler/gdc/config/darwin8 +tango/lib/compiler/gdc/config/gen_config1.c +tango/lib/compiler/gdc/config/gen_math.c +tango/lib/compiler/gdc/config/gen_unix.c +tango/lib/compiler/gdc/config/makestruct.h +tango/lib/compiler/gdc/config/mingw +tango/lib/compiler/gdc/config/skyos +tango/lib/compiler/gdc/critical.c +tango/lib/compiler/gdc/deh.c +tango/lib/compiler/gdc/dgccmain2.d +tango/lib/compiler/gdc/fpmath.d +tango/lib/compiler/gdc/gcc +tango/lib/compiler/gdc/gcc/aix_float.h +tango/lib/compiler/gdc/gcc/builtins.d +tango/lib/compiler/gdc/gcc/cbridge_fdset.c +tango/lib/compiler/gdc/gcc/cbridge_math.c +tango/lib/compiler/gdc/gcc/cbridge_stdio.c +tango/lib/compiler/gdc/gcc/cbridge_time.c +tango/lib/compiler/gdc/gcc/configext.d +tango/lib/compiler/gdc/gcc/configunix.d +tango/lib/compiler/gdc/gcc/deh.d +tango/lib/compiler/gdc/gcc/fpmath.d +tango/lib/compiler/gdc/gcc/support.d +tango/lib/compiler/gdc/gcc/threadsem.d +tango/lib/compiler/gdc/gcc/unwind.d +tango/lib/compiler/gdc/genobj.d +tango/lib/compiler/gdc/invariant.d +tango/lib/compiler/gdc/lifetime.d +tango/lib/compiler/gdc/mars.h +tango/lib/compiler/gdc/memory.d +tango/lib/compiler/gdc/memory_dyld.c +tango/lib/compiler/gdc/memory_freebsd.c +tango/lib/compiler/gdc/memset.d +tango/lib/compiler/gdc/minimal.c +tango/lib/compiler/gdc/monitor.c +tango/lib/compiler/gdc/obj.d +tango/lib/compiler/gdc/qsort2.d +tango/lib/compiler/gdc/qsortg.d +tango/lib/compiler/gdc/rundmain.d +tango/lib/compiler/gdc/std +tango/lib/compiler/gdc/std/intrinsic.d +tango/lib/compiler/gdc/switch.d +tango/lib/compiler/gdc/typeinfo +tango/lib/compiler/gdc/typeinfo/ti_AC.d +tango/lib/compiler/gdc/typeinfo/ti_Acdouble.d +tango/lib/compiler/gdc/typeinfo/ti_Acfloat.d +tango/lib/compiler/gdc/typeinfo/ti_Acreal.d +tango/lib/compiler/gdc/typeinfo/ti_Adouble.d +tango/lib/compiler/gdc/typeinfo/ti_Afloat.d +tango/lib/compiler/gdc/typeinfo/ti_Ag.d +tango/lib/compiler/gdc/typeinfo/ti_Aint.d +tango/lib/compiler/gdc/typeinfo/ti_Along.d +tango/lib/compiler/gdc/typeinfo/ti_Areal.d +tango/lib/compiler/gdc/typeinfo/ti_Ashort.d +tango/lib/compiler/gdc/typeinfo/ti_C.d +tango/lib/compiler/gdc/typeinfo/ti_byte.d +tango/lib/compiler/gdc/typeinfo/ti_cdouble.d +tango/lib/compiler/gdc/typeinfo/ti_cfloat.d +tango/lib/compiler/gdc/typeinfo/ti_char.d +tango/lib/compiler/gdc/typeinfo/ti_creal.d +tango/lib/compiler/gdc/typeinfo/ti_dchar.d +tango/lib/compiler/gdc/typeinfo/ti_delegate.d +tango/lib/compiler/gdc/typeinfo/ti_double.d +tango/lib/compiler/gdc/typeinfo/ti_float.d +tango/lib/compiler/gdc/typeinfo/ti_idouble.d +tango/lib/compiler/gdc/typeinfo/ti_ifloat.d +tango/lib/compiler/gdc/typeinfo/ti_int.d +tango/lib/compiler/gdc/typeinfo/ti_ireal.d +tango/lib/compiler/gdc/typeinfo/ti_long.d +tango/lib/compiler/gdc/typeinfo/ti_ptr.d +tango/lib/compiler/gdc/typeinfo/ti_real.d +tango/lib/compiler/gdc/typeinfo/ti_short.d +tango/lib/compiler/gdc/typeinfo/ti_ubyte.d +tango/lib/compiler/gdc/typeinfo/ti_uint.d +tango/lib/compiler/gdc/typeinfo/ti_ulong.d +tango/lib/compiler/gdc/typeinfo/ti_ushort.d +tango/lib/compiler/gdc/typeinfo/ti_void.d +tango/lib/compiler/gdc/typeinfo/ti_wchar.d +tango/lib/compiler/gdc/util +tango/lib/compiler/gdc/util/console.d +tango/lib/compiler/gdc/util/ctype.d +tango/lib/compiler/gdc/util/string.d +tango/lib/compiler/gdc/util/utf.d +tango/lib/compiler/llvmdc +tango/lib/compiler/llvmdc/aApply.d +tango/lib/compiler/llvmdc/aApplyR.d +tango/lib/compiler/llvmdc/aaA.d +tango/lib/compiler/llvmdc/adi.d +tango/lib/compiler/llvmdc/arrays.d +tango/lib/compiler/llvmdc/build.sh +tango/lib/compiler/llvmdc/cast.d +tango/lib/compiler/llvmdc/contract.d +tango/lib/compiler/llvmdc/genobj.d +tango/lib/compiler/llvmdc/llvm +tango/lib/compiler/llvmdc/llvm/intrinsic.di +tango/lib/compiler/llvmdc/obj +tango/lib/compiler/llvmdc/qsort2.d +tango/lib/compiler/llvmdc/std +tango/lib/compiler/llvmdc/std/intrinsic.d +tango/lib/compiler/llvmdc/switch.d +tango/lib/compiler/llvmdc/typeinfo +tango/lib/compiler/llvmdc/typeinfo/ti_AC.d +tango/lib/compiler/llvmdc/typeinfo/ti_Acdouble.d +tango/lib/compiler/llvmdc/typeinfo/ti_Acfloat.d +tango/lib/compiler/llvmdc/typeinfo/ti_Acreal.d +tango/lib/compiler/llvmdc/typeinfo/ti_Adouble.d +tango/lib/compiler/llvmdc/typeinfo/ti_Afloat.d +tango/lib/compiler/llvmdc/typeinfo/ti_Ag.d +tango/lib/compiler/llvmdc/typeinfo/ti_Aint.d +tango/lib/compiler/llvmdc/typeinfo/ti_Along.d +tango/lib/compiler/llvmdc/typeinfo/ti_Areal.d +tango/lib/compiler/llvmdc/typeinfo/ti_Ashort.d +tango/lib/compiler/llvmdc/typeinfo/ti_C.d +tango/lib/compiler/llvmdc/typeinfo/ti_byte.d +tango/lib/compiler/llvmdc/typeinfo/ti_cdouble.d +tango/lib/compiler/llvmdc/typeinfo/ti_cfloat.d +tango/lib/compiler/llvmdc/typeinfo/ti_char.d +tango/lib/compiler/llvmdc/typeinfo/ti_creal.d +tango/lib/compiler/llvmdc/typeinfo/ti_dchar.d +tango/lib/compiler/llvmdc/typeinfo/ti_delegate.d +tango/lib/compiler/llvmdc/typeinfo/ti_double.d +tango/lib/compiler/llvmdc/typeinfo/ti_float.d +tango/lib/compiler/llvmdc/typeinfo/ti_idouble.d +tango/lib/compiler/llvmdc/typeinfo/ti_ifloat.d +tango/lib/compiler/llvmdc/typeinfo/ti_int.d +tango/lib/compiler/llvmdc/typeinfo/ti_ireal.d +tango/lib/compiler/llvmdc/typeinfo/ti_long.d +tango/lib/compiler/llvmdc/typeinfo/ti_ptr.d +tango/lib/compiler/llvmdc/typeinfo/ti_real.d +tango/lib/compiler/llvmdc/typeinfo/ti_short.d +tango/lib/compiler/llvmdc/typeinfo/ti_ubyte.d +tango/lib/compiler/llvmdc/typeinfo/ti_uint.d +tango/lib/compiler/llvmdc/typeinfo/ti_ulong.d +tango/lib/compiler/llvmdc/typeinfo/ti_ushort.d +tango/lib/compiler/llvmdc/typeinfo/ti_void.d +tango/lib/compiler/llvmdc/typeinfo/ti_wchar.d +tango/lib/compiler/llvmdc/util +tango/lib/compiler/llvmdc/util/console.d +tango/lib/compiler/llvmdc/util/ctype.d +tango/lib/compiler/llvmdc/util/string.d +tango/lib/compiler/llvmdc/util/utf.d +tango/lib/gc +tango/lib/gc/basic +tango/lib/gc/basic/gc.d +tango/lib/gc/basic/gcalloc.d +tango/lib/gc/basic/gcbits.d +tango/lib/gc/basic/gcstats.d +tango/lib/gc/basic/gcx.d +tango/lib/gc/stub +tango/lib/gc/stub/gc.d +tango/object.di +tango/std +tango/std/c +tango/std/c/stdarg.di +tango/std/intrinsic.di +tango/std/stdarg.di +tango/tango +tango/tango/core +tango/tango/core/Array.d +tango/tango/core/Atomic.d +tango/tango/core/BitArray.d +tango/tango/core/BitManip.di +tango/tango/core/ByteSwap.d +tango/tango/core/Exception.di +tango/tango/core/Memory.di +tango/tango/core/Runtime.di +tango/tango/core/Signal.d +tango/tango/core/Thread.di +tango/tango/core/Traits.d +tango/tango/core/Tuple.d +tango/tango/core/Vararg.d +tango/tango/core/Variant.d +tango/tango/core/Version.d +tango/tango/core/sync +tango/tango/core/sync/Barrier.d +tango/tango/core/sync/Condition.d +tango/tango/core/sync/Config.d +tango/tango/core/sync/Mutex.d +tango/tango/core/sync/ReadWriteMutex.d +tango/tango/core/sync/Semaphore.d +tango/tango/group +tango/tango/group/collection.d +tango/tango/group/convert.d +tango/tango/group/digest.d +tango/tango/group/file.d +tango/tango/group/http.d +tango/tango/group/log.d +tango/tango/group/math.d +tango/tango/group/net.d +tango/tango/group/stream.d +tango/tango/group/text.d +tango/tango/group/time.d +tango/tango/io +tango/tango/io/Buffer.d +tango/tango/io/Conduit.d +tango/tango/io/Console.d +tango/tango/io/DeviceConduit.d +tango/tango/io/File.d +tango/tango/io/FileConduit.d +tango/tango/io/FileConst.d +tango/tango/io/FilePath.d +tango/tango/io/FileRoots.d +tango/tango/io/FileScan.d +tango/tango/io/FileSystem.d +tango/tango/io/GrowBuffer.d +tango/tango/io/MappedBuffer.d +tango/tango/io/Print.d +tango/tango/io/Stdout.d +tango/tango/io/TempFile.d +tango/tango/io/UnicodeFile.d +tango/tango/io/archive +tango/tango/io/archive/Zip.d +tango/tango/io/compress +tango/tango/io/compress/BzipStream.d +tango/tango/io/compress/ZlibStream.d +tango/tango/io/compress/c +tango/tango/io/compress/c/bzlib.d +tango/tango/io/compress/c/zlib.d +tango/tango/io/digest +tango/tango/io/digest/Crc32.d +tango/tango/io/digest/Digest.d +tango/tango/io/digest/Md2.d +tango/tango/io/digest/Md4.d +tango/tango/io/digest/Md5.d +tango/tango/io/digest/MerkleDamgard.d +tango/tango/io/digest/Sha0.d +tango/tango/io/digest/Sha01.d +tango/tango/io/digest/Sha1.d +tango/tango/io/digest/Sha256.d +tango/tango/io/digest/Sha512.d +tango/tango/io/digest/Tiger.d +tango/tango/io/model +tango/tango/io/model/IBuffer.d +tango/tango/io/model/IConduit.d +tango/tango/io/model/IListener.d +tango/tango/io/protocol +tango/tango/io/protocol/Allocator.d +tango/tango/io/protocol/EndianProtocol.d +tango/tango/io/protocol/NativeProtocol.d +tango/tango/io/protocol/PickleProtocol.d +tango/tango/io/protocol/Reader.d +tango/tango/io/protocol/Writer.d +tango/tango/io/protocol/model +tango/tango/io/protocol/model/IProtocol.d +tango/tango/io/protocol/model/IReader.d +tango/tango/io/protocol/model/IWriter.d +tango/tango/io/selector +tango/tango/io/selector/AbstractSelector.d +tango/tango/io/selector/EpollSelector.d +tango/tango/io/selector/PollSelector.d +tango/tango/io/selector/SelectSelector.d +tango/tango/io/selector/Selector.d +tango/tango/io/selector/SelectorException.d +tango/tango/io/selector/model +tango/tango/io/selector/model/ISelector.d +tango/tango/io/stream +tango/tango/io/stream/BufferStream.d +tango/tango/io/stream/DataFileStream.d +tango/tango/io/stream/DataStream.d +tango/tango/io/stream/DigestStream.d +tango/tango/io/stream/EndianStream.d +tango/tango/io/stream/FileStream.d +tango/tango/io/stream/FormatStream.d +tango/tango/io/stream/GreedyStream.d +tango/tango/io/stream/LineStream.d +tango/tango/io/stream/MapStream.d +tango/tango/io/stream/SnoopStream.d +tango/tango/io/stream/TextFileStream.d +tango/tango/io/stream/TypedStream.d +tango/tango/io/stream/UtfStream.d +tango/tango/io/vfs +tango/tango/io/vfs/FileFolder.d +tango/tango/io/vfs/LinkedFolder.d +tango/tango/io/vfs/VirtualFolder.d +tango/tango/io/vfs/ZipArchive.d +tango/tango/io/vfs/model +tango/tango/io/vfs/model/Vfs.d +tango/tango/math +tango/tango/math/Bessel.d +tango/tango/math/Elliptic.d +tango/tango/math/ErrorFunction.d +tango/tango/math/GammaFunction.d +tango/tango/math/IEEE.d +tango/tango/math/Math.d +tango/tango/math/Probability.d +tango/tango/math/Random.d +tango/tango/net +tango/tango/net/DatagramConduit.d +tango/tango/net/InternetAddress.d +tango/tango/net/MulticastConduit.d +tango/tango/net/ServerSocket.d +tango/tango/net/Socket.d +tango/tango/net/SocketConduit.d +tango/tango/net/SocketListener.d +tango/tango/net/Uri.d +tango/tango/net/cluster +tango/tango/net/cluster/CacheInvalidatee.d +tango/tango/net/cluster/CacheInvalidator.d +tango/tango/net/cluster/NetworkAlert.d +tango/tango/net/cluster/NetworkCache.d +tango/tango/net/cluster/NetworkCall.d +tango/tango/net/cluster/NetworkClient.d +tango/tango/net/cluster/NetworkMessage.d +tango/tango/net/cluster/NetworkQueue.d +tango/tango/net/cluster/NetworkRegistry.d +tango/tango/net/cluster/NetworkTask.d +tango/tango/net/cluster/QueuedCache.d +tango/tango/net/cluster/model +tango/tango/net/cluster/model/ICache.d +tango/tango/net/cluster/model/IChannel.d +tango/tango/net/cluster/model/ICluster.d +tango/tango/net/cluster/model/IConsumer.d +tango/tango/net/cluster/model/IMessage.d +tango/tango/net/cluster/tina +tango/tango/net/cluster/tina/CacheServer.d +tango/tango/net/cluster/tina/CacheThread.d +tango/tango/net/cluster/tina/Cluster.d +tango/tango/net/cluster/tina/ClusterCache.d +tango/tango/net/cluster/tina/ClusterQueue.d +tango/tango/net/cluster/tina/ClusterServer.d +tango/tango/net/cluster/tina/ClusterTask.d +tango/tango/net/cluster/tina/ClusterThread.d +tango/tango/net/cluster/tina/ClusterTypes.d +tango/tango/net/cluster/tina/CmdParser.d +tango/tango/net/cluster/tina/ProtocolReader.d +tango/tango/net/cluster/tina/ProtocolWriter.d +tango/tango/net/cluster/tina/QueueFile.d +tango/tango/net/cluster/tina/QueueServer.d +tango/tango/net/cluster/tina/QueueThread.d +tango/tango/net/cluster/tina/RollCall.d +tango/tango/net/cluster/tina/TaskServer.d +tango/tango/net/cluster/tina/TaskThread.d +tango/tango/net/cluster/tina/util +tango/tango/net/cluster/tina/util/AbstractServer.d +tango/tango/net/cluster/tina/util/ServerThread.d +tango/tango/net/cluster/tina/util/model +tango/tango/net/cluster/tina/util/model/IServer.d +tango/tango/net/ftp +tango/tango/net/ftp/FtpClient.d +tango/tango/net/ftp/Telnet.d +tango/tango/net/http +tango/tango/net/http/ChunkStream.d +tango/tango/net/http/HttpClient.d +tango/tango/net/http/HttpConst.d +tango/tango/net/http/HttpCookies.d +tango/tango/net/http/HttpGet.d +tango/tango/net/http/HttpHeaders.d +tango/tango/net/http/HttpParams.d +tango/tango/net/http/HttpPost.d +tango/tango/net/http/HttpStack.d +tango/tango/net/http/HttpTokens.d +tango/tango/net/http/HttpTriplet.d +tango/tango/net/http/model +tango/tango/net/http/model/HttpParamsView.d +tango/tango/net/model +tango/tango/net/model/UriView.d +tango/tango/stdc +tango/tango/stdc/complex.d +tango/tango/stdc/config.d +tango/tango/stdc/ctype.d +tango/tango/stdc/errno.d +tango/tango/stdc/fenv.d +tango/tango/stdc/inttypes.d +tango/tango/stdc/limits.d +tango/tango/stdc/locale.d +tango/tango/stdc/math.d +tango/tango/stdc/posix +tango/tango/stdc/posix/arpa +tango/tango/stdc/posix/arpa/inet.d +tango/tango/stdc/posix/config.d +tango/tango/stdc/posix/dirent.d +tango/tango/stdc/posix/dlfcn.d +tango/tango/stdc/posix/fcntl.d +tango/tango/stdc/posix/inttypes.d +tango/tango/stdc/posix/net +tango/tango/stdc/posix/net/if_.d +tango/tango/stdc/posix/netinet +tango/tango/stdc/posix/netinet/in_.d +tango/tango/stdc/posix/netinet/tcp.d +tango/tango/stdc/posix/poll.d +tango/tango/stdc/posix/pthread.d +tango/tango/stdc/posix/pwd.d +tango/tango/stdc/posix/sched.d +tango/tango/stdc/posix/semaphore.d +tango/tango/stdc/posix/setjmp.d +tango/tango/stdc/posix/signal.d +tango/tango/stdc/posix/stdio.d +tango/tango/stdc/posix/stdlib.d +tango/tango/stdc/posix/sys +tango/tango/stdc/posix/sys/ipc.d +tango/tango/stdc/posix/sys/mman.d +tango/tango/stdc/posix/sys/select.d +tango/tango/stdc/posix/sys/shm.d +tango/tango/stdc/posix/sys/socket.d +tango/tango/stdc/posix/sys/stat.d +tango/tango/stdc/posix/sys/time.d +tango/tango/stdc/posix/sys/types.d +tango/tango/stdc/posix/sys/uio.d +tango/tango/stdc/posix/sys/wait.d +tango/tango/stdc/posix/time.d +tango/tango/stdc/posix/ucontext.d +tango/tango/stdc/posix/unistd.d +tango/tango/stdc/posix/utime.d +tango/tango/stdc/signal.d +tango/tango/stdc/stdarg.d +tango/tango/stdc/stddef.d +tango/tango/stdc/stdint.d +tango/tango/stdc/stdio.d +tango/tango/stdc/stdlib.d +tango/tango/stdc/string.d +tango/tango/stdc/stringz.d +tango/tango/stdc/tgmath.d +tango/tango/stdc/time.d +tango/tango/stdc/wctype.d +tango/tango/sys +tango/tango/sys/Common.d +tango/tango/sys/Environment.d +tango/tango/sys/Pipe.d +tango/tango/sys/Process.d +tango/tango/sys/SharedLib.d +tango/tango/sys/darwin +tango/tango/sys/darwin/darwin.d +tango/tango/sys/linux +tango/tango/sys/linux/epoll.d +tango/tango/sys/linux/linux.d +tango/tango/sys/linux/socket.d +tango/tango/sys/win32 +tango/tango/sys/win32/CodePage.d +tango/tango/sys/win32/Macros.di +tango/tango/sys/win32/Process.di +tango/tango/sys/win32/Types.di +tango/tango/sys/win32/UserGdi.di +tango/tango/text +tango/tango/text/Ascii.d +tango/tango/text/Properties.d +tango/tango/text/Regex.d +tango/tango/text/Text.d +tango/tango/text/Unicode.d +tango/tango/text/UnicodeData.d +tango/tango/text/Util.d +tango/tango/text/convert +tango/tango/text/convert/Float.d +tango/tango/text/convert/Format.d +tango/tango/text/convert/Integer.d +tango/tango/text/convert/Layout.d +tango/tango/text/convert/Sprint.d +tango/tango/text/convert/TimeStamp.d +tango/tango/text/convert/UnicodeBom.d +tango/tango/text/convert/Utf.d +tango/tango/text/locale +tango/tango/text/locale/Collation.d +tango/tango/text/locale/Convert.d +tango/tango/text/locale/Core.d +tango/tango/text/locale/Data.d +tango/tango/text/locale/Locale.d +tango/tango/text/locale/Parse.d +tango/tango/text/locale/Posix.d +tango/tango/text/locale/Win32.d +tango/tango/text/stream +tango/tango/text/stream/LineIterator.d +tango/tango/text/stream/QuoteIterator.d +tango/tango/text/stream/RegexIterator.d +tango/tango/text/stream/SimpleIterator.d +tango/tango/text/stream/StreamIterator.d +tango/tango/time +tango/tango/time/Clock.d +tango/tango/time/ISO8601.d +tango/tango/time/StopWatch.d +tango/tango/time/Time.d +tango/tango/time/WallClock.d +tango/tango/time/chrono +tango/tango/time/chrono/Calendar.d +tango/tango/time/chrono/Gregorian.d +tango/tango/time/chrono/GregorianBased.d +tango/tango/time/chrono/Hebrew.d +tango/tango/time/chrono/Hijri.d +tango/tango/time/chrono/Japanese.d +tango/tango/time/chrono/Korean.d +tango/tango/time/chrono/Taiwan.d +tango/tango/time/chrono/ThaiBuddhist.d +tango/tango/util +tango/tango/util/ArgParser.d +tango/tango/util/Arguments.d +tango/tango/util/Convert.d +tango/tango/util/PathUtil.d +tango/tango/util/collection +tango/tango/util/collection/ArrayBag.d +tango/tango/util/collection/ArraySeq.d +tango/tango/util/collection/CircularSeq.d +tango/tango/util/collection/HashMap.d +tango/tango/util/collection/HashSet.d +tango/tango/util/collection/LinkMap.d +tango/tango/util/collection/LinkSeq.d +tango/tango/util/collection/TreeBag.d +tango/tango/util/collection/TreeMap.d +tango/tango/util/collection/impl +tango/tango/util/collection/impl/AbstractIterator.d +tango/tango/util/collection/impl/BagCollection.d +tango/tango/util/collection/impl/CLCell.d +tango/tango/util/collection/impl/Cell.d +tango/tango/util/collection/impl/Collection.d +tango/tango/util/collection/impl/DefaultComparator.d +tango/tango/util/collection/impl/LLCell.d +tango/tango/util/collection/impl/LLPair.d +tango/tango/util/collection/impl/MapCollection.d +tango/tango/util/collection/impl/RBCell.d +tango/tango/util/collection/impl/RBPair.d +tango/tango/util/collection/impl/SeqCollection.d +tango/tango/util/collection/impl/SetCollection.d +tango/tango/util/collection/iterator +tango/tango/util/collection/iterator/ArrayIterator.d +tango/tango/util/collection/iterator/FilteringIterator.d +tango/tango/util/collection/iterator/InterleavingIterator.d +tango/tango/util/collection/model +tango/tango/util/collection/model/Bag.d +tango/tango/util/collection/model/BagView.d +tango/tango/util/collection/model/Comparator.d +tango/tango/util/collection/model/Dispenser.d +tango/tango/util/collection/model/GuardIterator.d +tango/tango/util/collection/model/HashParams.d +tango/tango/util/collection/model/Iterator.d +tango/tango/util/collection/model/Map.d +tango/tango/util/collection/model/MapView.d +tango/tango/util/collection/model/Seq.d +tango/tango/util/collection/model/SeqView.d +tango/tango/util/collection/model/Set.d +tango/tango/util/collection/model/SetView.d +tango/tango/util/collection/model/Sortable.d +tango/tango/util/collection/model/SortedKeys.d +tango/tango/util/collection/model/SortedValues.d +tango/tango/util/collection/model/View.d +tango/tango/util/log +tango/tango/util/log/Appender.d +tango/tango/util/log/Configurator.d +tango/tango/util/log/ConsoleAppender.d +tango/tango/util/log/DateLayout.d +tango/tango/util/log/Event.d +tango/tango/util/log/EventLayout.d +tango/tango/util/log/FileAppender.d +tango/tango/util/log/Hierarchy.d +tango/tango/util/log/Log.d +tango/tango/util/log/Log4Layout.d +tango/tango/util/log/Logger.d +tango/tango/util/log/MailAppender.d +tango/tango/util/log/NullAppender.d +tango/tango/util/log/PropertyConfigurator.d +tango/tango/util/log/RollingFileAppender.d +tango/tango/util/log/SocketAppender.d +tango/tango/util/log/Trace.d +tango/tango/util/log/model +tango/tango/util/log/model/IHierarchy.d +tango/tango/util/log/model/ILevel.d +tangotests +tangotests/a.d +tangotests/b.d +tangotests/c.d +tangotests/d.d +tangotests/e.d +tangotests/f.d +tangotests/g.d test test/a.d test/aa1.d @@ -391,6 +1052,7 @@ test/funcs.d test/funcs2.d test/g.d +test/gc1.d test/globals1.d test/globals2.d test/goto1.d diff -r 5825d48b27d1 -r 1700239cab2e tango/LICENSE --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/LICENSE Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,24 @@ +Tango is Open Source software, distributed by a group of developers which has been set up for the purpose of providing a vendor-neutral owner of Tango intellectual property. The goals of all Tango licensing decisions are to: + + * Encourage adoption + * Discourage political contention + * Encourage collaboration and integration with other projects + * Be transparent + +Tango is dual-licensed: + * Academic Free License v2.1 (http://opensource.org/licenses/afl-2.1.php) + * BSD License (http://opensource.org/licenses/bsd-license.php) [1] + +The preferred license is the Academic Free License v2.1. All Tango projects release their code under the terms of this license. Both licenses: + + * Allow commercial use without encumbrance + * Provide broad rights to make new products and derivative works + * Place no requirement on users to contribute back (although we appreciate it if you do) + +Users who wish to include Tango with software licensed under the (L)GPL will want to use Tango under the terms of the BSD License. [1] Tango projects may request a variance from the developers to release their projects under additional licenses in conjunction with the AFL. + +If you have further questions regarding Tango licensing, please do not hesitate to contact us (http://dsource.org/projects/tango/wiki/Contact). + + +[1] The advertising clause has not been a part of the BSD License since July 22, 1999. (ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change) + diff -r 5825d48b27d1 -r 1700239cab2e tango/README.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/README.txt Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,7 @@ +For a guide to install Tango see the online installation reference: + +http://dsource.org/projects/tango/wiki/TopicInstallTango + +The license can be found at + +http://dsource.org/projects/tango/wiki/LibraryLicense diff -r 5825d48b27d1 -r 1700239cab2e tango/README_LLVMDC.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/README_LLVMDC.txt Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,10 @@ +This version of Tango is modified to work with LLVMDC + by Tomas Lindquist Olsen, 2008 + +Much has been removed as this is not intended to work with other compilers. +Hopefully in time, this will go away and the required changes merged into the +mainline Tango repository. + +For more information on LLVMDC, check the site at: + + http://www.dsource.org/projects/llvmdc diff -r 5825d48b27d1 -r 1700239cab2e tango/dsss.conf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/dsss.conf Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,83 @@ +name = tango + +[tango/core] +postinstall=install tango/core/BitManip.di $INCLUDE_PREFIX/tango/core ; \ + install tango/core/Exception.di $INCLUDE_PREFIX/tango/core ; \ + install tango/core/Memory.di $INCLUDE_PREFIX/tango/core ; \ + install tango/core/Runtime.di $INCLUDE_PREFIX/tango/core ; \ + install tango/core/Thread.di $INCLUDE_PREFIX/tango/core +version (GNU) { + prebuild = $DSSS_BUILD -obj -explicit lib/common/tango/core/BitManip.d -fintfc-file=tango/core/BitManip.di ; \ + $DSSS_BUILD -obj -explicit lib/common/tango/core/Exception.d -fintfc-file=tango/core/Exception.di ; \ + $DSSS_BUILD -obj -explicit lib/common/tango/core/Memory.d -fintfc-file=tango/core/Memory.di ; \ + $DSSS_BUILD -obj -explicit lib/common/tango/core/Runtime.d -fintfc-file=tango/core/Runtime.di ; \ + $DSSS_BUILD -obj -explicit lib/common/tango/core/Thread.d -fintfc-file=tango/core/Thread.di ; +} else version (DigitalMars) { + prebuild = $DSSS_BUILD -obj -explicit lib/common/tango/core/BitManip.d -Hftango/core/BitManip.di ; \ + $DSSS_BUILD -obj -explicit lib/common/tango/core/Exception.d -Hftango/core/Exception.di ; \ + $DSSS_BUILD -obj -explicit lib/common/tango/core/Memory.d -Hftango/core/Memory.di ; \ + $DSSS_BUILD -obj -explicit lib/common/tango/core/Runtime.d -Hftango/core/Runtime.di ; \ + $DSSS_BUILD -obj -explicit lib/common/tango/core/Thread.d -Hftango/core/Thread.di ; +} +else version (LLVMDC) { + prebuild = $DSSS_BUILD -obj -explicit lib/common/tango/core/BitManip.d -Hftango/core/BitManip.di ; \ + $DSSS_BUILD -obj -explicit lib/common/tango/core/Exception.d -Hftango/core/Exception.di ; \ + $DSSS_BUILD -obj -explicit lib/common/tango/core/Memory.d -Hftango/core/Memory.di ; \ + $DSSS_BUILD -obj -explicit lib/common/tango/core/Runtime.d -Hftango/core/Runtime.di ; \ + $DSSS_BUILD -obj -explicit lib/common/tango/core/Thread.d -Hftango/core/Thread.di ; +} + +version(LLVMDC) { + [tango/stdc] +} else { + +[tango/io] + +[tango/math] + +[tango/net] + +[tango/stdc] +version (Windows) { + exclude = tango/stdc/posix +} + +[tango/sys] +exclude = tango/sys/linux/* tango/sys/darwin/* tango/sys/win32/* +exclude += tango/sys/TimeConverter.d + +version (linux) { + [tango/sys/linux] +} + +version (darwin) { + [tango/sys/darwin] +} + +version (Windows) { + [+tango/sys/win32] + preinstall = install tango/sys/win32/Macros.di $INCLUDE_PREFIX/tango/sys/win32 ; \ + install tango/sys/win32/Process.di $INCLUDE_PREFIX/tango/sys/win32 ; \ + install tango/sys/win32/Types.di $INCLUDE_PREFIX/tango/sys/win32 ; \ + install tango/sys/win32/UserGdi.di $INCLUDE_PREFIX/tango/sys/win32 +} + +[tango/text] + +[tango/text/locale] +version (!linux) { + exclude += tango/text/locale/Linux.d +} +version (!Windows) { + exclude += tango/text/locale/Win32.d +} + +[tango/util] + +[tango/time] + +[tango/group] + +[+std] +preinstall = installdir std $INCLUDE_PREFIX/std +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/cluster/Add.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/cluster/Add.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,60 @@ +/******************************************************************************* + +*******************************************************************************/ + +public import tango.net.cluster.NetworkCall; + + +/******************************************************************************* + + a Task function + +*******************************************************************************/ + +real add (real x, real y) +{ + return x + y; +} + + +/******************************************************************************* + + a Task function + +*******************************************************************************/ + +int divide (int x, int y) +{ + return x / y; +} + + +/******************************************************************************* + + a verbose Task message + +*******************************************************************************/ + +class Subtract : NetworkCall +{ + double a, + b, + result; + + double opCall (double a, double b, IChannel channel = null) + { + this.a = a; + this.b = b; + send (channel); + return result; + } + + override void execute () + { + result = a - b; + } + + override void read (IReader input) {input (a)(b)(result);} + + override void write (IWriter output) {output (a)(b)(result);} +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/cluster/alert.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/cluster/alert.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,36 @@ +private import tango.core.Thread; + +private import tango.util.log.Configurator; + +private import tango.net.cluster.NetworkAlert; + +private import tango.net.cluster.tina.Cluster; + +/******************************************************************************* + + How to send and recieve Alert messages using tango.net.cluster + +*******************************************************************************/ + +void main() +{ + // hook into the cluster + auto cluster = (new Cluster).join; + + // hook into the Alert layer + auto alert = new NetworkAlert (cluster, "my.kind.of.alert"); + + // listen for the broadcast (on this channel) + alert.createConsumer (delegate void (IEvent event) + {event.log.info ("Recieved alert on channel " ~ event.channel.name);} + ); + + // say what's going on + alert.log.info ("broadcasting alert"); + + // and send everyone an empty alert (on this channel) + alert.broadcast; + + // wait for it to arrive ... + Thread.sleep(1); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/cluster/cclient.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/cluster/cclient.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,48 @@ +/******************************************************************************* + + +*******************************************************************************/ + +import tango.io.Stdout; + +import tango.time.StopWatch; + +import tango.util.log.Configurator; + +import tango.net.cluster.NetworkCache; + +import tango.net.cluster.tina.Cluster; + +/******************************************************************************* + + +*******************************************************************************/ + +void main (char[][] args) +{ + StopWatch w; + + if (args.length > 1) + { + auto cluster = (new Cluster).join (args[1..$]); + auto cache = new NetworkCache (cluster, "my.cache.channel"); + + while (true) + { + w.start; + for (int i=10000; i--;) + cache.put ("key", cache.EmptyMessage); + + Stdout.formatln ("{} put/s", 10000/w.stop); + + w.start; + for (int i=10000; i--;) + cache.get ("key"); + + Stdout.formatln ("{} get/s", 10000/w.stop); + } + } + else + Stdout.formatln ("usage: cache cachehost:port ..."); +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/example/cluster/cserver.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/cluster/cserver.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,30 @@ +/******************************************************************************* + +*******************************************************************************/ + +import tango.io.Console; + +import tango.net.InternetAddress; + +import tango.net.cluster.tina.CmdParser, + tango.net.cluster.tina.CacheServer; + +/******************************************************************************* + +*******************************************************************************/ + +void main (char[][] args) +{ + auto arg = new CmdParser ("cache.server"); + + // default number of cache entries + arg.size = 8192; + + if (args.length > 1) + arg.parse (args[1..$]); + + if (arg.help) + Cout ("usage: cacheserver -port=number -size=cachesize -log[=trace, info, warn, error, fatal, none]").newline; + else + (new CacheServer(new InternetAddress(arg.port), arg.log, arg.size)).start; +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/cluster/invalidate.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/cluster/invalidate.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,38 @@ +private import tango.core.Thread; + +private import tango.util.log.Configurator; + +private import tango.net.cluster.tina.Cluster; + +private import tango.net.cluster.QueuedCache, + tango.net.cluster.CacheInvalidatee, + tango.net.cluster.CacheInvalidator; + +/******************************************************************************* + + Demonstrates how to invalidate cache entries across a cluster + via a channel + +*******************************************************************************/ + +void main() +{ + // access the cluster + auto cluster = (new Cluster).join; + + // wrap a cache instance with a network listener + auto dst = new CacheInvalidatee (cluster, "my.cache.channel", new QueuedCache!(char[], IMessage)(101)); + + // connect an invalidator to that cache channel + auto src = new CacheInvalidator (cluster, "my.cache.channel"); + + // stuff something in the local cache + dst.cache.put ("key", dst.EmptyMessage); + + // get it removed via a network broadcast + src.log.info ("invalidating 'key' across the cluster"); + src.invalidate ("key"); + + // wait for it to arrive ... + Thread.sleep (1); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/cluster/qclient.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/cluster/qclient.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,44 @@ +/******************************************************************************* + + +*******************************************************************************/ + +import tango.io.Stdout; + +import tango.time.StopWatch; + +import tango.util.log.Configurator; + +import tango.net.cluster.NetworkQueue; + +import tango.net.cluster.tina.Cluster; + +/******************************************************************************* + + +*******************************************************************************/ + +void main (char[][] args) +{ + StopWatch w; + + auto cluster = (new Cluster).join; + auto queue = new NetworkQueue (cluster, "my.queue.channel"); + + while (true) + { + w.start; + for (int i=10000; i--;) + queue.put (queue.EmptyMessage); + + Stdout.formatln ("{} put/s", 10000/w.stop); + + uint count; + w.start; + while (queue.get !is null) + ++count; + + Stdout.formatln ("{} get/s", count/w.stop); + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/example/cluster/qlisten.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/cluster/qlisten.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,41 @@ +private import tango.core.Thread; + +private import tango.util.log.Configurator; + +private import tango.net.cluster.NetworkQueue; + +private import tango.net.cluster.tina.Cluster; + +/******************************************************************************* + + Illustrates how to setup and use a Queue in asynchronous mode + +*******************************************************************************/ + +void main () +{ + void listen (IEvent event) + { + while (event.get) + event.log.info ("received asynch msg on channel " ~ event.channel.name); + } + + + // join the cluster + auto cluster = (new Cluster).join; + + // access a queue of the specified name + auto queue = new NetworkQueue (cluster, "my.queue.channel"); + + // listen for messages placed in my queue, via a delegate + queue.createConsumer (&listen); + + // stuff something into the queue + queue.log.info ("sending three messages to the queue"); + queue.put (queue.EmptyMessage); + queue.put (queue.EmptyMessage); + queue.put (queue.EmptyMessage); + + // wait for asynchronous msgs to arrive ... + Thread.sleep (1); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/cluster/qrequest.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/cluster/qrequest.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,30 @@ +private import tango.util.log.Configurator; + +private import tango.net.cluster.NetworkQueue; + +private import tango.net.cluster.tina.Cluster; + +/******************************************************************************* + + Illustrates how to setup and use a Queue in synchronous mode + +*******************************************************************************/ + +void main () +{ + // join the cluster + auto cluster = (new Cluster).join; + + // access a queue of the specified name + auto queue = new NetworkQueue (cluster, "my.queue.channel"); + + // stuff something into the queue + queue.log.info ("sending three messages to the queue"); + queue.put (queue.EmptyMessage); + queue.put (queue.EmptyMessage); + queue.put (queue.EmptyMessage); + + // retreive synchronously + while (queue.get) + queue.log.info ("retrieved msg"); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/cluster/qserver.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/cluster/qserver.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,27 @@ +/******************************************************************************* + +*******************************************************************************/ + +import tango.io.Console; + +import tango.net.InternetAddress; + +import tango.net.cluster.tina.CmdParser, + tango.net.cluster.tina.QueueServer; + +/******************************************************************************* + +*******************************************************************************/ + +void main (char[][] args) +{ + auto arg = new CmdParser ("queue.server"); + + if (args.length > 1) + arg.parse (args[1..$]); + + if (arg.help) + Cout ("usage: queueserver -port=number -log[=trace, info, warn, error, fatal, none]").newline; + else + (new QueueServer(new InternetAddress(arg.port), arg.log)).start; +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/cluster/reply.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/cluster/reply.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,38 @@ +private import tango.core.Thread; + +private import tango.util.log.Configurator; + +private import tango.net.cluster.tina.Cluster; + +private import tango.net.cluster.NetworkQueue; + +/******************************************************************************* + +*******************************************************************************/ + +void main() +{ + // open the cluster and a queue channel. Note that the queue has + // been configured with a reply listener ... + auto cluster = (new Cluster).join; + auto queue = new NetworkQueue (cluster, "message.channel", + (IEvent event){event.log.info ("Received reply");} + ); + + void recipient (IEvent event) + { + auto msg = event.get; + + event.log.info ("Replying to message on channel "~msg.reply); + event.reply (event.replyChannel(msg), queue.EmptyMessage); + } + + // setup a listener to recieve and reply + queue.createConsumer (&recipient); + + // toss a message out to the cluster + queue.put (queue.EmptyMessage); + + // wait for completion ... + Thread.sleep (1); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/cluster/task.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/cluster/task.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,15 @@ +/******************************************************************************* + + Illustrates usage of cluster tasks + +*******************************************************************************/ + +import Add, tango.io.Stdout, tango.net.cluster.tina.ClusterTask; + +void main (char[][] args) +{ + scope add = new NetCall!(add); + + Stdout.formatln ("cluster expression of 3.0 + 4.0 = {}", add(3, 4)); +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/example/cluster/tclient.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/cluster/tclient.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,42 @@ +/******************************************************************************* + + +*******************************************************************************/ + +import Add; + +import tango.io.Stdout; + +import tango.time.StopWatch; + +import tango.util.log.Configurator; + +import tango.net.cluster.tina.ClusterTask; + +/******************************************************************************* + + +*******************************************************************************/ + +void main (char[][] args) +{ + // an implicit task instance + auto add = new NetCall!(add); + + // an explicit task instance + auto sub = new Subtract; + + StopWatch w; + while (true) + { + w.start; + for (int i=10000; i--;) + { + // both task types are used in the same manner + add (1, 2); + sub (3, 4); + } + Stdout.formatln ("{} calls/s", 20000/w.stop); + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/example/cluster/tserver.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/cluster/tserver.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,34 @@ +/******************************************************************************* + +*******************************************************************************/ + +import tango.io.Console; + +import tango.net.InternetAddress; + +import tango.net.cluster.tina.CmdParser, + tango.net.cluster.tina.TaskServer; + +import Add; + +/******************************************************************************* + +*******************************************************************************/ + +void main (char[][] args) +{ + auto arg = new CmdParser ("task.server"); + + if (args.length > 1) + arg.parse (args[1..$]); + + if (arg.help) + Cout ("usage: taskserver -port=number -log[=trace, info, warn, error, fatal, none]").newline; + else + { + auto server = new TaskServer (new InternetAddress(arg.port), arg.log); + server.enroll (new NetCall!(add)); + server.enroll (new Subtract); + server.start; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/concurrency/fiber_test.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/concurrency/fiber_test.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,806 @@ +import tango.core.Thread; + +extern (C) int printf(char * str, ...); + +void main() +{ + printf("Compile with -unittest"); +} + + +unittest +{ + printf("Testing context creation/deletion\n"); + int s0 = 0; + static int s1 = 0; + + Fiber a = new Fiber( + delegate void() + { + s0++; + }); + + static void fb() { s1++; } + + Fiber b = new Fiber(&fb); + + Fiber c = new Fiber( + delegate void() { assert(false); }); + + assert(a); + assert(b); + assert(c); + + assert(s0 == 0); + assert(s1 == 0); + assert(a.state == Fiber.State.HOLD); + assert(b.state == Fiber.State.HOLD); + assert(c.state == Fiber.State.HOLD); + + delete c; + + assert(s0 == 0); + assert(s1 == 0); + assert(a.state == Fiber.State.HOLD); + assert(b.state == Fiber.State.HOLD); + + printf("running a\n"); + a.call(); + printf("done a\n"); + + assert(a); + + assert(s0 == 1); + assert(s1 == 0); + assert(a.state == Fiber.State.TERM); + assert(b.state == Fiber.State.HOLD); + + assert(b.state == Fiber.State.HOLD); + + printf("Running b\n"); + b.call(); + printf("Done b\n"); + + assert(s0 == 1); + assert(s1 == 1); + assert(b.state == Fiber.State.TERM); + + delete a; + delete b; + + printf("Context creation passed\n"); +} + +unittest +{ + printf("Testing context switching\n"); + int s0 = 0; + int s1 = 0; + int s2 = 0; + + Fiber a = new Fiber( + delegate void() + { + while(true) + { + debug printf(" ---A---\n"); + s0++; + Fiber.yield(); + } + }); + + + Fiber b = new Fiber( + delegate void() + { + while(true) + { + debug printf(" ---B---\n"); + s1++; + Fiber.yield(); + } + }); + + + Fiber c = new Fiber( + delegate void() + { + while(true) + { + debug printf(" ---C---\n"); + s2++; + Fiber.yield(); + } + }); + + assert(a); + assert(b); + assert(c); + assert(s0 == 0); + assert(s1 == 0); + assert(s2 == 0); + + a.call(); + b.call(); + + assert(a); + assert(b); + assert(c); + assert(s0 == 1); + assert(s1 == 1); + assert(s2 == 0); + + for(int i=0; i<20; i++) + { + c.call(); + a.call(); + } + + assert(a); + assert(b); + assert(c); + assert(s0 == 21); + assert(s1 == 1); + assert(s2 == 20); + + delete a; + delete b; + delete c; + + printf("Context switching passed\n"); +} + +unittest +{ + printf("Testing nested contexts\n"); + Fiber a, b, c; + + int t0 = 0; + int t1 = 0; + int t2 = 0; + + a = new Fiber( + delegate void() + { + + t0++; + b.call(); + + }); + + b = new Fiber( + delegate void() + { + assert(t0 == 1); + assert(t1 == 0); + assert(t2 == 0); + + t1++; + c.call(); + + }); + + c = new Fiber( + delegate void() + { + assert(t0 == 1); + assert(t1 == 1); + assert(t2 == 0); + + t2++; + }); + + assert(a); + assert(b); + assert(c); + assert(t0 == 0); + assert(t1 == 0); + assert(t2 == 0); + + a.call(); + + assert(t0 == 1); + assert(t1 == 1); + assert(t2 == 1); + + assert(a); + assert(b); + assert(c); + + delete a; + delete b; + delete c; + + printf("Nesting contexts passed\n"); +} + +unittest +{ + printf("Testing basic exceptions\n"); + + + int t0 = 0; + int t1 = 0; + int t2 = 0; + + assert(t0 == 0); + assert(t1 == 0); + assert(t2 == 0); + + try + { + + try + { + throw new Exception("Testing\n"); + t2++; + } + catch(Exception fx) + { + t1++; + throw fx; + } + + t2++; + } + catch(Exception ex) + { + t0++; + printf("%.*s\n", ex.toString); + } + + assert(t0 == 1); + assert(t1 == 1); + assert(t2 == 0); + + printf("Basic exceptions are supported\n"); +} + + +unittest +{ + printf("Testing exceptions\n"); + Fiber a, b, c; + + int t0 = 0; + int t1 = 0; + int t2 = 0; + + printf("t0 = %d\nt1 = %d\nt2 = %d\n", t0, t1, t2); + + a = new Fiber( + delegate void() + { + t0++; + throw new Exception("A exception\n"); + t0++; + }); + + b = new Fiber( + delegate void() + { + t1++; + c.call(); + t1++; + }); + + c = new Fiber( + delegate void() + { + t2++; + throw new Exception("C exception\n"); + t2++; + }); + + assert(a); + assert(b); + assert(c); + assert(t0 == 0); + assert(t1 == 0); + assert(t2 == 0); + + try + { + a.call(); + assert(false); + } + catch(Exception e) + { + printf("%.*s\n", e.toString); + } + + assert(a); + assert(a.state == Fiber.State.TERM); + assert(b); + assert(c); + assert(t0 == 1); + assert(t1 == 0); + assert(t2 == 0); + + try + { + b.call(); + assert(false); + } + catch(Exception e) + { + printf("%.*s\n", e.toString); + } + + printf("blah2\n"); + + assert(a); + assert(b); + assert(b.state == Fiber.State.TERM); + assert(c); + assert(c.state == Fiber.State.TERM); + assert(t0 == 1); + assert(t1 == 1); + assert(t2 == 1); + + delete a; + delete b; + delete c; + + + Fiber t; + int q0 = 0; + int q1 = 0; + + t = new Fiber( + delegate void() + { + try + { + q0++; + throw new Exception("T exception\n"); + q0++; + } + catch(Exception ex) + { + q1++; + printf("!!!!!!!!GOT EXCEPTION!!!!!!!!\n"); + printf("%.*s\n", ex.toString); + } + }); + + + assert(t); + assert(q0 == 0); + assert(q1 == 0); + t.call(); + assert(t); + assert(t.state == Fiber.State.TERM); + assert(q0 == 1); + assert(q1 == 1); + + delete t; + + Fiber d, e; + int s0 = 0; + int s1 = 0; + + d = new Fiber( + delegate void() + { + try + { + s0++; + e.call(); + Fiber.yield(); + s0++; + e.call(); + s0++; + } + catch(Exception ex) + { + printf("%.*s\n", ex.toString); + } + }); + + e = new Fiber( + delegate void() + { + s1++; + Fiber.yield(); + throw new Exception("E exception\n"); + s1++; + }); + + assert(d); + assert(e); + assert(s0 == 0); + assert(s1 == 0); + + d.call(); + + assert(d); + assert(e); + assert(s0 == 1); + assert(s1 == 1); + + d.call(); + + assert(d); + assert(e); + assert(s0 == 2); + assert(s1 == 1); + + assert(d.state == Fiber.State.TERM); + assert(e.state == Fiber.State.TERM); + + delete d; + delete e; + + printf("Exceptions passed\n"); +} + +unittest +{ + printf("Testing standard exceptions\n"); + int t = 0; + + Fiber a = new Fiber( + delegate void() + { + throw new Exception("BLAHAHA"); + }); + + assert(a); + assert(t == 0); + + try + { + a.call(); + assert(false); + } + catch(Exception e) + { + printf("%.*s\n", e.toString); + } + + assert(a); + assert(a.state == Fiber.State.TERM); + assert(t == 0); + + delete a; + + + printf("Standard exceptions passed\n"); +} + +unittest +{ + printf("Memory stress test\n"); + + const uint STRESS_SIZE = 5000; + + Fiber ctx[]; + ctx.length = STRESS_SIZE; + + int cnt0 = 0; + int cnt1 = 0; + + void threadFunc() + { + cnt0++; + Fiber.yield; + cnt1++; + } + + foreach(inout Fiber c; ctx) + { + c = new Fiber(&threadFunc, 1024); + } + + assert(cnt0 == 0); + assert(cnt1 == 0); + + foreach(inout Fiber c; ctx) + { + c.call; + } + + assert(cnt0 == STRESS_SIZE); + assert(cnt1 == 0); + + foreach(inout Fiber c; ctx) + { + c.call; + } + + assert(cnt0 == STRESS_SIZE); + assert(cnt1 == STRESS_SIZE); + + foreach(inout Fiber c; ctx) + { + delete c; + } + + assert(cnt0 == STRESS_SIZE); + assert(cnt1 == STRESS_SIZE); + + printf("Memory stress test passed\n"); +} + +unittest +{ + printf("Testing floating point\n"); + + float f0 = 1.0; + float f1 = 0.0; + + double d0 = 2.0; + double d1 = 0.0; + + real r0 = 3.0; + real r1 = 0.0; + + assert(f0 == 1.0); + assert(f1 == 0.0); + assert(d0 == 2.0); + assert(d1 == 0.0); + assert(r0 == 3.0); + assert(r1 == 0.0); + + Fiber a, b, c; + + a = new Fiber( + delegate void() + { + while(true) + { + f0 ++; + d0 ++; + r0 ++; + + Fiber.yield(); + } + }); + + b = new Fiber( + delegate void() + { + while(true) + { + f1 = d0 + r0; + d1 = f0 + r0; + r1 = f0 + d0; + + Fiber.yield(); + } + }); + + c = new Fiber( + delegate void() + { + while(true) + { + f0 *= d1; + d0 *= r1; + r0 *= f1; + + Fiber.yield(); + } + }); + + a.call(); + assert(f0 == 2.0); + assert(f1 == 0.0); + assert(d0 == 3.0); + assert(d1 == 0.0); + assert(r0 == 4.0); + assert(r1 == 0.0); + + b.call(); + assert(f0 == 2.0); + assert(f1 == 7.0); + assert(d0 == 3.0); + assert(d1 == 6.0); + assert(r0 == 4.0); + assert(r1 == 5.0); + + c.call(); + assert(f0 == 12.0); + assert(f1 == 7.0); + assert(d0 == 15.0); + assert(d1 == 6.0); + assert(r0 == 28.0); + assert(r1 == 5.0); + + a.call(); + assert(f0 == 13.0); + assert(f1 == 7.0); + assert(d0 == 16.0); + assert(d1 == 6.0); + assert(r0 == 29.0); + assert(r1 == 5.0); + + printf("Floating point passed\n"); +} + + +version(x86) unittest +{ + printf("Testing registers\n"); + + struct registers + { + int eax, ebx, ecx, edx; + int esi, edi; + int ebp, esp; + + //TODO: Add fpu stuff + } + + static registers old; + static registers next; + static registers g_old; + static registers g_next; + + //I believe that D calling convention requires that + //EBX, ESI and EDI be saved. In order to validate + //this, we write to those registers and call the + //stack thread. + static StackThread reg_test = new StackThread( + delegate void() + { + asm + { + naked; + + pushad; + + mov EBX, 1; + mov ESI, 2; + mov EDI, 3; + + mov [old.ebx], EBX; + mov [old.esi], ESI; + mov [old.edi], EDI; + mov [old.ebp], EBP; + mov [old.esp], ESP; + + call StackThread.yield; + + mov [next.ebx], EBX; + mov [next.esi], ESI; + mov [next.edi], EDI; + mov [next.ebp], EBP; + mov [next.esp], ESP; + + popad; + } + }); + + //Run the stack context + asm + { + naked; + + pushad; + + mov EBX, 10; + mov ESI, 11; + mov EDI, 12; + + mov [g_old.ebx], EBX; + mov [g_old.esi], ESI; + mov [g_old.edi], EDI; + mov [g_old.ebp], EBP; + mov [g_old.esp], ESP; + + mov EAX, [reg_test]; + call StackThread.call; + + mov [g_next.ebx], EBX; + mov [g_next.esi], ESI; + mov [g_next.edi], EDI; + mov [g_next.ebp], EBP; + mov [g_next.esp], ESP; + + popad; + } + + + //Make sure the registers are byte for byte equal. + assert(old.ebx = 1); + assert(old.esi = 2); + assert(old.edi = 3); + assert(old == next); + + assert(g_old.ebx = 10); + assert(g_old.esi = 11); + assert(g_old.edi = 12); + assert(g_old == g_next); + + printf("Registers passed!\n"); +} + + +unittest +{ + printf("Testing throwYield\n"); + + int q0 = 0; + + Fiber st0 = new Fiber( + delegate void() + { + q0++; + Fiber.yieldAndThrow(new Exception("testing throw yield\n")); + q0++; + }); + + try + { + st0.call(); + assert(false); + } + catch(Exception e) + { + printf("%.*s\n", e.toString); + } + + assert(q0 == 1); + assert(st0.state == Fiber.State.HOLD); + + st0.call(); + assert(q0 == 2); + assert(st0.state == Fiber.State.TERM); + + printf("throwYield passed!\n"); +} + +unittest +{ + printf("Testing thread safety\n"); + + int x = 0, y = 0; + + Fiber sc0 = new Fiber( + { + while(true) + { + x++; + Fiber.yield; + } + }); + + Fiber sc1 = new Fiber( + { + while(true) + { + y++; + Fiber.yield; + } + }); + + Thread t0 = new Thread( + { + for(int i=0; i<10000; i++) + sc0.call(); + }); + + Thread t1 = new Thread( + { + for(int i=0; i<10000; i++) + sc1.call(); + }); + + assert(sc0); + assert(sc1); + assert(t0); + assert(t1); + + t0.start; + t1.start; + t0.join; + t1.join; + + assert(x == 10000); + assert(y == 10000); + + printf("Thread safety passed!\n"); +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/example/conduits/FileBucket.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/conduits/FileBucket.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,319 @@ +module FileBucket; + +private import tango.io.FilePath, + tango.io.FileConduit; + +private import tango.core.Exception; + +/****************************************************************************** + + FileBucket implements a simple mechanism to store and recover a + large quantity of data for the duration of the hosting process. + It is intended to act as a local-cache for a remote data-source, + or as a spillover area for large in-memory cache instances. + + Note that any and all stored data is rendered invalid the moment + a FileBucket object is garbage-collected. + + The implementation follows a fixed-capacity record scheme, where + content can be rewritten in-place until said capacity is reached. + At such time, the altered content is moved to a larger capacity + record at end-of-file, and a hole remains at the prior location. + These holes are not collected, since the lifespan of a FileBucket + is limited to that of the host process. + + All index keys must be unique. Writing to the FileBucket with an + existing key will overwrite any previous content. What follows + is a contrived example: + + --- + char[] text = "this is a test"; + + auto bucket = new FileBucket (new FilePath("bucket.bin"), FileBucket.HalfK); + + // insert some data, and retrieve it again + bucket.put ("a key", text); + char[] b = cast(char[]) bucket.get ("a key"); + + assert (b == text); + bucket.close; + --- + +******************************************************************************/ + +class FileBucket +{ + /********************************************************************** + + Define the capacity (block-size) of each record + + **********************************************************************/ + + struct BlockSize + { + int capacity; + } + + // basic capacity for each record + private FilePath path; + + // basic capacity for each record + private BlockSize block; + + // where content is stored + private FileConduit file; + + // pointers to file records + private Record[char[]] map; + + // current file size + private long fileSize; + + // current file usage + private long waterLine; + + // supported block sizes + public static const BlockSize EighthK = {128-1}, + HalfK = {512-1}, + OneK = {1024*1-1}, + TwoK = {1024*2-1}, + FourK = {1024*4-1}, + EightK = {1024*8-1}, + SixteenK = {1024*16-1}, + ThirtyTwoK = {1024*32-1}, + SixtyFourK = {1024*64-1}; + + + /********************************************************************** + + Construct a FileBucket with the provided path and record- + size. Selecting a record size that roughly matches the + serialized content will limit 'thrashing'. + + **********************************************************************/ + + this (char[] path, BlockSize block) + { + this (new FilePath(path), block); + } + + /********************************************************************** + + Construct a FileBucket with the provided path, record-size, + and inital record count. The latter causes records to be + pre-allocated, saving a certain amount of growth activity. + Selecting a record size that roughly matches the serialized + content will limit 'thrashing'. + + **********************************************************************/ + + this (FilePath path, BlockSize block, uint initialRecords = 100) + { + this.path = path; + this.block = block; + + // open a storage file + file = new FileConduit (path, FileConduit.ReadWriteCreate); + + // set initial file size (can be zero) + fileSize = initialRecords * block.capacity; + file.seek (fileSize); + file.truncate (); + } + + /********************************************************************** + + Return the block-size in use for this FileBucket + + **********************************************************************/ + + int getBufferSize () + { + return block.capacity+1; + } + + /********************************************************************** + + Return where the FileBucket is located + + **********************************************************************/ + + FilePath getFilePath () + { + return path; + } + + /********************************************************************** + + Return the currently populated size of this FileBucket + + **********************************************************************/ + + synchronized long length () + { + return waterLine; + } + + /********************************************************************** + + Return the serialized data for the provided key. Returns + null if the key was not found. + + **********************************************************************/ + + synchronized void[] get (char[] key) + { + Record r = null; + + if (key in map) + { + r = map [key]; + return r.read (this); + } + return null; + } + + /********************************************************************** + + Remove the provided key from this FileBucket. + + **********************************************************************/ + + synchronized void remove (char[] key) + { + map.remove(key); + } + + /********************************************************************** + + Write a serialized block of data, and associate it with + the provided key. All keys must be unique, and it is the + responsibility of the programmer to ensure this. Reusing + an existing key will overwrite previous data. + + Note that data is allowed to grow within the occupied + bucket until it becomes larger than the allocated space. + When this happens, the data is moved to a larger bucket + at the file tail. + + **********************************************************************/ + + synchronized void put (char[] key, void[] data) + { + Record* r = key in map; + + if (r is null) + { + auto rr = new Record; + map [key] = rr; + r = &rr; + } + r.write (this, data, block); + } + + /********************************************************************** + + Close this FileBucket -- all content is lost. + + **********************************************************************/ + + synchronized void close () + { + if (file) + { + file.detach; + file = null; + map = null; + } + } + + /********************************************************************** + + Each Record takes up a number of 'pages' within the file. + The size of these pages is determined by the BlockSize + provided during FileBucket construction. Additional space + at the end of each block is potentially wasted, but enables + content to grow in size without creating a myriad of holes. + + **********************************************************************/ + + private static class Record + { + private long offset; + private int length, + capacity = -1; + + /************************************************************** + + **************************************************************/ + + private static void eof (FileBucket bucket) + { + throw new IOException ("Unexpected EOF in FileBucket '"~bucket.path.toString()~"'"); + } + + /************************************************************** + + This should be protected from thread-contention at + a higher level. + + **************************************************************/ + + void[] read (FileBucket bucket) + { + void[] data = new ubyte [length]; + + bucket.file.seek (offset); + if (bucket.file.read (data) != length) + eof (bucket); + + return data; + } + + /************************************************************** + + This should be protected from thread-contention at + a higher level. + + **************************************************************/ + + void write (FileBucket bucket, void[] data, BlockSize block) + { + length = data.length; + + // create new slot if we exceed capacity + if (length > capacity) + createBucket (bucket, length, block); + + // locate to start of content + bucket.file.seek (offset); + + // write content + if (bucket.file.write (data) != length) + eof (bucket); + } + + /************************************************************** + + **************************************************************/ + + void createBucket (FileBucket bucket, int bytes, BlockSize block) + { + offset = bucket.waterLine; + capacity = (bytes + block.capacity) & ~block.capacity; + + bucket.waterLine += capacity; + if (bucket.waterLine > bucket.fileSize) + { + // grow the filesize + bucket.fileSize = bucket.waterLine * 2; + + // expand the physical file size + bucket.file.seek (bucket.fileSize); + bucket.file.truncate (); + } + } + } +} + + diff -r 5825d48b27d1 -r 1700239cab2e tango/example/conduits/composite.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/conduits/composite.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,85 @@ + +private import tango.io.protocol.Reader, + tango.io.protocol.Writer, + tango.io.FileConduit; + +/******************************************************************************* + + Use cascading reads & writes to handle a composite class. There is + just one primary call for output, and just one for input, but the + classes propogate the request as appropriate. + + Note that the class instances don't know how their content will be + represented; that is dictated by the caller (via the reader/writer + implementation). + + Note also that this only serializes the content. To serialize the + classes too, take a look at the Pickle.d example. + +*******************************************************************************/ + +void main() +{ + // define a serializable class (via interfaces) + class Wumpus : IReadable, IWritable + { + private int a = 11, + b = 112, + c = 1024; + + void read (IReader input) + { + input (a) (b) (c); + } + + void write (IWriter output) + { + output (a) (b) (c); + } + } + + + // define a serializable class (via interfaces) + class Wombat : IReadable, IWritable + { + private Wumpus wumpus; + private char[] x = "xyz"; + private bool y = true; + private float z = 3.14159; + + this (Wumpus wumpus) + { + this.wumpus = wumpus; + } + + void read (IReader input) + { + input (x) (y) (z) (wumpus); + } + + void write (IWriter output) + { + output (x) (y) (z) (wumpus); + } + } + + // construct a Wombat + auto wombat = new Wombat (new Wumpus); + + // open a file for IO + auto file = new FileConduit ("random.bin", FileConduit.ReadWriteCreate); + + // construct reader & writer upon the file, with binary IO + auto output = new Writer (file); + auto input = new Reader (file); + + // write both Wombat & Wumpus (and flush them) + output (wombat) (); + + // rewind to file start + file.seek (0); + + // read both back again + input (wombat); +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/example/conduits/filebubbler.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/conduits/filebubbler.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,30 @@ + +private import tango.io.Console, + tango.io.FileScan, + tango.io.FileConst; + +/******************************************************************************* + + This example sweeps a named sub-directory tree for html files, + and moves them to the current directory. The existing directory + hierarchy is flattened into a naming scheme where a '.' is used + to replace the traditional path-separator + + Used by the Tango project to help manage renderings of the source + code. + +*******************************************************************************/ + +void main(char[][] args) +{ + // sweep all html files in the specified subdir + if (args.length is 2) + foreach (proxy; (new FileScan).sweep(args[1], ".html").files) + { + auto other = new FilePath (proxy.toString); + proxy.rename (other.replace (FileConst.PathSeparatorChar, '.')); + } + else + Cout ("usage is filebubbler subdir").newline; +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/example/conduits/filecat.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/conduits/filecat.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,26 @@ +private import tango.io.Console, + tango.io.FileConduit; + +/******************************************************************************* + + Concatenate a number of files onto a single destination + +*******************************************************************************/ + +void main(char[][] args) +{ + if (args.length > 2) + { + // open the file for writing + auto dst = new FileConduit (args[1], FileConduit.WriteCreate); + + // copy each file onto dst + foreach (char[] arg; args[2..args.length]) + dst.copy (new FileConduit(arg)); + + // flush output and close + dst.close; + } + else + Cout ("usage: filecat target source1 ... sourceN"); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/conduits/filecopy.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/conduits/filecopy.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,23 @@ + +private import tango.io.Console, + tango.io.FileConduit; + +/******************************************************************************* + + open a file, and stream directly to console + +*******************************************************************************/ + +void main (char[][] args) +{ + if (args.length is 2) + { + // open a file for reading + auto fc = new FileConduit (args[1]); + + // stream directly to console + Cout.stream.copy (fc); + } + else + Cout ("usage is: filecopy filename").newline; +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/conduits/fileops.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/conduits/fileops.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,26 @@ +/***************************************************** + + Example that shows some simple file operations + + Put into public domain by Lars Ivar Igesund + +*****************************************************/ + +import tango.io.Stdout; + +import tango.io.FilePath; + +void main (char[][] args) +{ + auto src = args[0] ~ ".d"; + auto dst = new FilePath (args[0] ~ ".d.copy"); + + Stdout.formatln ("copy file {} to {}", src, dst); + dst.copy (src); + assert (dst.exists); + + Stdout.formatln ("removing file {}", dst); + dst.remove; + + assert (dst.exists is false); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/conduits/filepathname.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/conduits/filepathname.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,11 @@ +import tango.io.Console; + +import tango.io.FilePath; + +void main(){ + Cout ((new FilePath(r"d:\path\foo.bat")).name).newline; + Cout ((new FilePath(r"d:\path.two\bar")).name).newline; + Cout ((new FilePath("/home/user.name/bar.")).name).newline; + Cout ((new FilePath(r"d:\path.two\bar")).name).newline; + Cout ((new FilePath("/home/user/.resource")).name).newline; +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/conduits/filescan.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/conduits/filescan.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,32 @@ +private import tango.io.Stdout, + tango.io.FileScan; + +/******************************************************************************* + + List ".d" files and enclosing folders visible via a directory given + as a command-line argument. In this example we're also postponing a + flush on Stdout until output is complete. Stdout is usually flushed + on each invocation of newline or formatln, but here we're using '\n' + to illustrate how to avoid flushing many individual lines + +*******************************************************************************/ + +void main(char[][] args) +{ + char[] root = args.length < 2 ? "." : args[1]; + Stdout.formatln ("Scanning '{}'", root); + + auto scan = (new FileScan)(root, ".d"); + + Stdout.format ("\n{} Folders\n", scan.folders.length); + foreach (folder; scan.folders) + Stdout.format ("{}\n", folder); + + Stdout.format ("\n{0} Files\n", scan.files.length); + foreach (file; scan.files) + Stdout.format ("{}\n", file); + + Stdout.formatln ("\n{} Errors", scan.errors.length); + foreach (error; scan.errors) + Stdout (error).newline; +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/conduits/filescanregex.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/conduits/filescanregex.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,40 @@ +/************************************************************** + + Example that use FileScan and Regex as a filter. + + Put into public domain by Lars Ivar Igesund + +**************************************************************/ + +import tango.io.File, + tango.io.Stdout, + tango.io.FileScan, + tango.text.Regex; + +void main(char[][] args) { + uint total; + + if (args.length < 2) { + Stdout("Please pass a directory to search").newline; + return; + } + + scope scan = new FileScan; + scope regex = Regex(r"\.(d|obj)$"); + + scan(args[1], delegate bool (FilePath fp, bool isDir) { + ++total; + return isDir || regex.test(fp.toString); + }); + + + foreach (file; scan.files) + Stdout(file).newline; + + Stdout.formatln("Found {} matches in {} entries", scan.files.length, total); + + Stdout.formatln ("\n{} Errors", scan.errors.length); + foreach (error; scan.errors) + Stdout (error).newline; +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/example/conduits/lineio.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/conduits/lineio.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,29 @@ + +private import tango.io.Console, + tango.io.FileConduit; + +private import tango.text.stream.LineIterator; + +/******************************************************************************* + + Read a file line-by-line, sending each one to the console. This + illustrates how to bind a conduit to a stream iterator (iterators + also support the binding of a buffer). Note that stream iterators + are templated for char, wchar and dchar types. + +*******************************************************************************/ + +void main (char[][] args) +{ + if (args.length is 2) + { + // open a file for reading + scope file = new FileConduit (args[1]); + + // process file one line at a time + foreach (line; new LineIterator!(char)(file)) + Cout (line).newline; + } + else + Cout ("usage: lineio filename").newline; +} \ No newline at end of file diff -r 5825d48b27d1 -r 1700239cab2e tango/example/conduits/mmap.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/conduits/mmap.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,24 @@ + +private import tango.io.Console, + tango.io.FileConduit, + tango.io.MappedBuffer; + +/******************************************************************************* + + open a file, map it into memory, and copy to console + +*******************************************************************************/ + +void main (char[][] args) +{ + if (args.length is 2) + { + // open a file for reading + auto mmap = new MappedBuffer (new FileConduit (args[1])); + + // copy content to console + Cout (cast(char[]) mmap.slice) (); + } + else + Cout ("usage is: mmap filename").newline; +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/conduits/paths.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/conduits/paths.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,13 @@ +/***************************************************** + + How to create a path with all ancestors + +*****************************************************/ + +import tango.io.FilePath; + +void main (char[][] args) +{ + auto path = new FilePath (r"d/tango/foo/bar/wumpus"); + assert (path.create.exists && path.isFolder); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/conduits/randomio.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/conduits/randomio.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,38 @@ + +private import tango.io.FileConduit; + +private import tango.io.protocol.Reader, + tango.io.protocol.Writer; + +/******************************************************************************* + + Create a file for random access. Write some stuff to it, rewind to + file start and read back. + +*******************************************************************************/ + +void main() +{ + // open a file for reading + auto fc = new FileConduit ("random.bin", FileConduit.ReadWriteCreate); + + // construct (binary) reader & writer upon this conduit + auto read = new Reader (fc); + auto write = new Writer (fc); + + int x=10, y=20; + + // write some data and flush output since IO is buffered + write (x) (y) (); + + // rewind to file start + fc.seek (0); + + // read data back again, but swap destinations + read (y) (x); + + assert (y is 10); + assert (x is 20); + + fc.close(); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/conduits/unifile.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/conduits/unifile.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,25 @@ + +private import tango.io.Console, + tango.io.UnicodeFile; + +/******************************************************************************* + + Open a unicode file of an unknown encoding, and converts to UTF-8 + for console display. UnicodeFile is templated for char/wchar/dchar + target encodings + +*******************************************************************************/ + +void main (char[][] args) +{ + if (args.length is 2) + { + // open a file for reading + auto file = new UnicodeFile!(char) (args[1], Encoding.Unknown); + + // display on console + Cout (file.read).newline; + } + else + Cout ("usage is: unifile filename").newline; +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/console/buffered.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/console/buffered.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,17 @@ +private import tango.stdc.stdio; + +private import tango.io.Console; + +/******************************************************************************* + + Demonstrates buffered output. Console output (and Stdout etc) is + buffered, requiring a flush or newline to render on the console. + +*******************************************************************************/ + +void main (char[][] args) +{ + Cout ("how now "); + printf ("printf\n"); + Cout ("brown cow").newline; +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/console/hello.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/console/hello.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,21 @@ +/******************************************************************************* + + Hello World using tango.io + + This illustrates bare console output, with no fancy formatting. + + Console I/O in Tango is UTF-8 across both linux and Win32. The + conversion between various unicode representations is handled + by higher level constructs, such as Stdout and Stderr + + Note that Cerr is tied to the console error output, and Cin is + tied to the console input. + +*******************************************************************************/ + +import tango.io.Console; + +void main() +{ + Cout ("hello, sweetheart \u263a").newline; +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/console/stdout.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/console/stdout.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,14 @@ +/******************************************************************************* + + Illustrates the basic console formatting. This is different than + the use of tango.io.Console, in that Stdout supports a variety of + printf-style formatting, and has unicode-conversion support + +*******************************************************************************/ + +private import tango.io.Stdout; + +void main() +{ + Stdout ("hello, sweetheart \u263a").newline; +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/dsss.conf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/dsss.conf Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,35 @@ +[concurrency/fiber_test.d] +[conduits/composite.d] +[conduits/filebubbler.d] +[conduits/filecat.d] +[conduits/filecopy.d] +[conduits/fileops.d] +[conduits/filepathname.d] +[conduits/filescan.d] +[conduits/filescanregex.d] +[conduits/lineio.d] +[conduits/mmap.d] +[conduits/paths.d] +[conduits/randomio.d] +[conduits/unifile.d] +[console/hello.d] +[console/stdout.d] +[logging/chainsaw.d] +[logging/logging.d] +[logging/multilog.d] +[manual/chapterStorage.d] +[networking/homepage.d] +[networking/httpget.d] +[networking/selector.d] +[networking/sockethello.d] +[networking/socketserver.d] +[system/arguments.d] +[system/localtime.d] +[system/normpath.d] +[system/process.d] +[text/formatalign.d] +[text/formatindex.d] +[text/formatspec.d] +[text/localetime.d] +[text/properties.d] +[text/token.d] diff -r 5825d48b27d1 -r 1700239cab2e tango/example/external/GlueFlectioned.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/external/GlueFlectioned.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,42 @@ +import tango.core.Exception; +import cn.kuehne.flectioned; + + +TracedExceptionInfo traceHandler( void* ptr = null ) +{ + class FlectionedTrace : + TracedExceptionInfo + { + this( void* ptr = null ) + { + if( ptr ) + m_trace = Trace.getTrace( cast(size_t) ptr ); + else + m_trace = Trace.getTrace(); + } + + int opApply( int delegate( inout char[] ) dg ) + { + int ret = 0; + foreach( t; m_trace ) + { + char[] buf = t.toString; + ret = dg( buf ); + if( ret != 0 ) + break; + } + return ret; + } + + private: + Trace[] m_trace; + } + + return new FlectionedTrace( ptr ); +} + + +static this() +{ + setTraceHandler( &traceHandler ); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/jake-all.bat --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/jake-all.bat Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,76 @@ +@rem ########################################################################### +@rem # CONCURRENCY EXAMPLES +@rem ########################################################################### + +@jake concurrency\fiber_test.d -I.. -op -unittest + +@rem ########################################################################### +@rem # CONDUIT EXAMPLES +@rem ########################################################################### + +@jake conduits\composite.d -I.. -op +@jake conduits\filebubbler.d -I.. -op +@jake -c conduits\filebucket.d -I.. -op +@jake conduits\filecat.d -I.. -op +@jake conduits\filecopy.d -I.. -op +@jake conduits\filepathname.d -I.. -op +@jake conduits\filescan.d -I.. -op +@jake conduits\filescanregex.d -I.. -op +@jake conduits\lineio.d -I.. -op +@jake conduits\mmap.d -I.. -op +@jake conduits\randomio.d -I.. -op +@jake conduits\unifile.d -I.. -op + +@rem ########################################################################### +@rem # CONSOLE EXAMPLES +@rem ########################################################################### + +@jake console\hello.d -I.. -op +@jake console\stdout.d -I.. -op + +@rem ########################################################################### +@rem # LOGGING EXAMPLES +@rem ########################################################################### + +@jake logging\chainsaw.d -I.. -op +@jake logging\logging.d -I.. -op + +@rem ########################################################################### +@rem # REFERENCE MANUAL EXAMPLES +@rem ########################################################################### + +@jake manual\chapterStorage.d -I.. -op + +@rem ########################################################################### +@rem # NETWORKING EXAMPLES +@rem ########################################################################### + +@jake networking\homepage.d -I.. -op +@jake networking\httpget.d -I.. -op +@jake networking\sockethello.d -I.. -op +@jake networking\socketserver.d -I.. -op +@jake networking\selector.d -I.. -op + +@rem ########################################################################### +@rem # SYSTEM EXAMPLES +@rem ########################################################################### + +@jake system\argparser.d -I.. -op +@jake system\localtime.d -I.. -op +@jake system\normpath.d -I.. -op +@jake system\process.d -I.. -op + +@rem ########################################################################### +@rem # TEXT EXAMPLES +@rem ########################################################################### + +@jake text\formatalign.d -I.. -op +@jake text\formatindex.d -I.. -op +@jake text\formatspec.d -I.. -op +@jake text\localetime.d -I.. -op +@jake text\token.d -I.. -op + +@rem FINI + +@del *.map +@dir *.exe \ No newline at end of file diff -r 5825d48b27d1 -r 1700239cab2e tango/example/linux.mak --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/linux.mak Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,89 @@ +# Makefile to build the examples of tango for Linux +# Designed to work with GNU make +# Targets: +# make +# Same as make all +# make all +# Build all examples +# +# make +# Build a specified example +# make clean +# remove all build examples +# +# + +# Relative path to the tango include dir +# This is where the tango tree is located +TANGO_DIR = .. + +# The build tool executable from dsource.org/projects/build +BUILDTOOL = bud +BUILDOPTS = -noautoimport -op -clean -full -g -debug -I$(TANGO_DIR) + +.PHONY: all clean + +# Standard target +all : + +# networking/httpserver \ +# networking/servlets \ +# networking/servletserver\ + +SIMPLE_EXAMPLES =\ + concurrency/fiber_test \ + conduits/FileBucket \ + conduits/composite \ + conduits/filebubbler \ + conduits/filecat \ + conduits/filecopy \ + conduits/fileops \ + conduits/filepathname \ + conduits/filescan \ + conduits/filescanregex \ + conduits/lineio \ + conduits/mmap \ + conduits/randomio \ + conduits/unifile \ + console/hello \ + console/stdout \ + logging/chainsaw \ + logging/logging \ + networking/homepage \ + networking/httpget \ + networking/sockethello \ + networking/socketserver \ + system/argparser \ + system/localtime \ + system/normpath \ + system/process \ + networking/selector \ + text/formatalign \ + text/formatindex \ + text/formatspec \ + text/localetime \ + text/properties \ + text/token + +REFERENCE_EXAMPLES = \ + ./reference/chapter4 \ + ./reference/chapter11 + +$(SIMPLE_EXAMPLES) : % : %.d + @echo "Building : " $@ + $(BUILDTOOL) $< $(BUILDOPTS) -T$@ -unittest + +$(REFERENCE_EXAMPLES) : % : %.d + @echo "Building : " $@ + $(BUILDTOOL) $< $(BUILDOPTS) -T$@ + +all : $(SIMPLE_EXAMPLES) + +clean : + @echo "Removing all examples" + rm -f $(SIMPLE_EXAMPLES) $(REFERENCE_EXAMPLES) + rm -f conduits/random.bin + + + + diff -r 5825d48b27d1 -r 1700239cab2e tango/example/logging/chainsaw.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/logging/chainsaw.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,30 @@ +import tango.core.Thread; + +import tango.util.log.Log, + tango.util.log.Log4Layout, + tango.util.log.SocketAppender; + +import tango.net.InternetAddress; + + +/******************************************************************************* + + Hooks up to Chainsaw for remote log capture. Chainsaw should be + configured to listen with an XMLSocketReciever + +*******************************************************************************/ + +void main() +{ + // get a logger to represent this module + auto logger = Log.getLogger ("example.chainsaw"); + + // hook up an appender for XML output + logger.addAppender (new SocketAppender (new InternetAddress("127.0.0.1", 4448), new Log4Layout)); + + while (true) + { + logger.info ("Hello Chainsaw!"); + Thread.sleep (1.0); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/logging/context.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/logging/context.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,322 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Stonecobra. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: December 2007 + + author: stonecobra + +*******************************************************************************/ + +module context; + +import tango.core.Thread, + tango.util.log.Log, + tango.util.log.Event, + tango.util.log.EventLayout, + tango.util.log.ConsoleAppender; + +import tango.util.log.model.IHierarchy; + +/******************************************************************************* + + Allows the dynamic setting of log levels on a per-thread basis. + Imagine that a user request comes into your production threaded + server. You can't afford to turn logging up to trace for the sake + of debugging this one users problem, but you also can't afford to + find the problem and fix it. So now you just set the override log + level to TRACE for the thread the user is on, and you get full trace + output for only that user. + +*******************************************************************************/ + +class ThreadLocalDiagnosticContext : IHierarchy.Context +{ + private ThreadLocal!(DCData) dcData; + private char[128] tmp; + + /*********************************************************************** + + ***********************************************************************/ + + public this() + { + dcData = new ThreadLocal!(DCData); + } + + /*********************************************************************** + + set the 'diagnostic' Level for logging. This overrides + the Level in the current Logger. The default level starts + at NONE, so as not to modify the behavior of existing clients + of tango.util.log + + ***********************************************************************/ + + void setLevel (ILevel.Level level) + { + auto data = dcData.val; + data.level = level; + dcData.val = data; + } + + /*********************************************************************** + + All log appends will be checked against this to see if a + log level needs to be temporarily adjusted. + + ***********************************************************************/ + + bool isEnabled (ILevel.Level setting, ILevel.Level level = ILevel.Level.Trace) + { + return level >= setting || level >= dcData.val.level; + } + + /*********************************************************************** + + Return the label to use for the current log message. Usually + called by the Layout. This implementation returns "{}". + + ***********************************************************************/ + + char[] label () + { + return dcData.val.getLabel; + } + + /*********************************************************************** + + Push another string into the 'stack'. This strings will be + appened together when getLabel is called. + + ***********************************************************************/ + + void push (char[] label) + { + auto data = dcData.val; + data.push(label); + dcData.val = data; + } + + /*********************************************************************** + + pop the current label off the stack. + + ***********************************************************************/ + + void pop () + { + auto data = dcData.val; + data.pop; + dcData.val = data; + } + + /*********************************************************************** + + Clear the label stack. + + ***********************************************************************/ + + void clear() + { + auto data = dcData.val; + data.clear; + dcData.val = data; + } +} + + +/******************************************************************************* + + The thread locally stored struct to hold the logging level and + the label stack. + +*******************************************************************************/ + +private struct DCData { + + ILevel.Level level = ILevel.Level.None; + char[][8] stack; + bool shouldUpdate = true; + int stackIndex = 0; + uint labelLength; + char[256] labelContent; + + + char[] getLabel() { + if (shouldUpdate) { + labelLength = 0; + append(" {"); + for (int i = 0; i < stackIndex; i++) { + append(stack[i]); + if (i < stackIndex - 1) { + append(" "); + } + } + append("}"); + shouldUpdate = false; + } + return labelContent[0..labelLength]; + } + + void append(char[] x) { + uint addition = x.length; + uint newLength = labelLength + x.length; + + if (newLength < labelContent.length) + { + labelContent [labelLength..newLength] = x[0..addition]; + labelLength = newLength; + } + } + + void push(char[] label) { + shouldUpdate = true; + stack[stackIndex] = label.dup; + stackIndex++; + } + + void pop() { + shouldUpdate = true; + if (stackIndex > 0) { + stack[stackIndex] = null; + stackIndex--; + } + } + + void clear() { + shouldUpdate = true; + for (int i = 0; i < stack.length; i++) { + stack[i] = null; + } + } +} + + +/******************************************************************************* + + Simple console appender that counts the number of log lines it + has written. + +*******************************************************************************/ + +class TestingConsoleAppender : ConsoleAppender { + + int events = 0; + + this (EventLayout layout = null) + { + super(layout); + } + + override void append (Event event) + { + events++; + super.append(event); + } +} + + +/******************************************************************************* + + Testing harness for the DiagnosticContext functionality. + +*******************************************************************************/ + +void main(char[][] args) +{ + //set up our appender that counts the log output. This is the configuration + //equivalent of importing tango.util.log.Configurator. + auto appender = new TestingConsoleAppender(new SimpleTimerLayout); + Log.getRootLogger.addAppender(appender); + + char[128] tmp = 0; + auto log = Log.getLogger("context"); + log.setLevel(log.Level.Info); + + //first test, use all defaults, validating it is working. None of the trace() + //calls should count in the test. + for (int i=0;i < 10; i++) { + log.info(log.format(tmp, "test1 {}", i)); + log.trace(log.format(tmp, "test1 {}", i)); + } + if (appender.events !is 10) { + log.error(log.format(tmp, "events:{}", appender.events)); + throw new Exception("Incorrect Number of events in normal mode"); + } + + appender.events = 0; + + //test the thread local implementation without any threads, as a baseline. + //should be same result as test1 + auto context = new ThreadLocalDiagnosticContext; + Log.getHierarchy.context(context); + for (int i=0;i < 10; i++) { + log.info(log.format(tmp, "test2 {}", i)); + log.trace(log.format(tmp, "test2 {}", i)); + } + if (appender.events !is 10) { + log.error(log.format(tmp, "events:{}", appender.events)); + throw new Exception("Incorrect Number of events in TLS single thread mode"); + } + + appender.events = 0; + + //test the thread local implementation without any threads, as a baseline. + //This should count all logging requests, because the DiagnosticContext has + //'overridden' the logging level on ALL loggers up to TRACE. + context.setLevel(log.Level.Trace); + for (int i=0;i < 10; i++) { + log.info(log.format(tmp, "test3 {}", i)); + log.trace(log.format(tmp, "test3 {}", i)); + } + if (appender.events !is 20) { + log.error(log.format(tmp, "events:{}", appender.events)); + throw new Exception("Incorrect Number of events in TLS single thread mode with level set"); + } + + appender.events = 0; + + //test the thread local implementation without any threads, as a baseline. + context.setLevel(log.Level.None); + for (int i=0;i < 10; i++) { + log.info(log.format(tmp, "test4 {}", i)); + log.trace(log.format(tmp, "test4 {}", i)); + } + if (appender.events !is 10) { + log.error(log.format(tmp, "events:{}", appender.events)); + throw new Exception("Incorrect Number of events in TLS single thread mode after level reset"); + } + + //Now test threading. set up a trace context in one thread, with a label, while + //keeping the second thread at the normal configuration. + appender.events = 0; + ThreadGroup tg = new ThreadGroup(); + tg.create({ + char[128] tmp = 0; + context.setLevel(log.Level.Trace); + context.push("specialthread"); + context.push("2ndlevel"); + for (int i=0;i < 10; i++) { + log.info(log.format(tmp, "test5 {}", i)); + log.trace(log.format(tmp, "test5 {}", i)); + } + }); + tg.create({ + char[128] tmp = 0; + context.setLevel(log.Level.None); + for (int i=0;i < 10; i++) { + log.info(log.format(tmp, "test6 {}", i)); + log.trace(log.format(tmp, "test6 {}", i)); + } + }); + tg.joinAll(); + + if (appender.events !is 30) { + log.error(log.format(tmp, "events:{}", appender.events)); + throw new Exception("Incorrect Number of events in TLS multi thread mode"); + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/example/logging/logging.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/logging/logging.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,102 @@ +/******************************************************************************* + + Shows how the basic functionality of Logger operates. + +*******************************************************************************/ + +private import tango.util.log.Log, + tango.util.log.Configurator; + +/******************************************************************************* + + Search for a set of prime numbers + +*******************************************************************************/ + +void compute (Logger log, uint max) + { + byte* feld; + int teste=1, + mom, + hits=0, + s=0, + e = 1; + int count; + char tmp[128] = void; + + void set (byte* f, uint x) + { + *(f+(x)/16) |= 1 << (((x)%16)/2); + } + + byte test (byte* f, uint x) + { + return cast(byte) (*(f+(x)/16) & (1 << (((x)%16)/2))); + } + + // information level + log.info (log.format (tmp, "Searching prime numbers up to {}", max)); + + feld = (new byte[max / 16 + 1]).ptr; + + // get milliseconds since application began + auto begin = log.runtime; + + while ((teste += 2) < max) + if (! test (feld, teste)) + { + if ((++hits & 0x0f) == 0) + // more information level + log.info (log.format (tmp, "found {}", hits)); + + for (mom=3*teste; mom < max; mom += teste<<1) + set (feld, mom); + } + + // get number of milliseconds we took to compute + auto period = log.runtime - begin; + + if (hits) + // more information + log.info (log.format (tmp, "{} prime numbers found in {} millsecs", hits, period)); + else + // a warning level + log.warn ("no prime numbers found"); + + // check to see if we're enabled for + // tracing before we expend a lot of effort + if (log.isEnabled (log.Level.Trace)) + { + e = max; + count = 0 - 2; + if (s % 2 is 0) + count++; + + while ((count+=2) < e) + // log trace information + if (! test (feld, count)) + log.trace (log.format (tmp, "prime found: {}", count)); + } +} + + +/******************************************************************************* + + Compute a bunch of prime numbers + +*******************************************************************************/ + +void main() +{ + // get a logger to represent this module. We could just as + // easily share a name with some other module(s) + auto log = Log.getLogger ("example.logging"); + try { + compute (log, 1000); + + } catch (Exception x) + { + // log the exception as an error + log.error ("Exception: " ~ x.toString); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/logging/multilog.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/logging/multilog.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,31 @@ +import tango.util.log.Log; +import tango.util.log.Log4Layout; +import tango.util.log.FileAppender; +import tango.util.log.ConsoleAppender; +import tango.util.log.RollingFileAppender; + +/******************************************************************************* + + Shows how to setup multiple appenders on logging tree + +*******************************************************************************/ + +void main () +{ + // set default logging level at the root + auto log = Log.getRootLogger; + log.setLevel (log.Level.Trace); + + // 10 logs, all with 10 mbs each + log.addAppender (new RollingFileAppender("rolling.log", 9, 1024*1024*10)); + + // a single file appender, with an XML layout + log.addAppender (new FileAppender ("single.log", new Log4Layout)); + + // console appender + log.addAppender (new ConsoleAppender); + + // log to all + log.trace ("three-way logging"); +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/example/manual/chapterStorage.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/manual/chapterStorage.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,237 @@ +module example.reference.chapter11; + +import tango.util.collection.HashMap; +import tango.util.collection.ArrayBag; +import tango.util.collection.LinkSeq; +import tango.util.collection.CircularSeq; +import tango.util.collection.ArraySeq; +import tango.util.collection.TreeBag; +import tango.util.collection.iterator.FilteringIterator; +import tango.util.collection.iterator.InterleavingIterator; + +import tango.io.Stdout; +import tango.core.Exception; + +import tango.util.collection.model.Comparator; +import tango.util.collection.impl.BagCollection; +import tango.util.collection.impl.SeqCollection; +import Ascii = tango.text.Ascii; + +void linkedListExample(){ + Stdout.format( "linkedListExample" ).newline; + alias LinkSeq!(char[]) StrList; + StrList lst = new StrList(); + + lst.append( "value1" ); + lst.append( "value2" ); + lst.append( "value3" ); + + auto it = lst.elements(); + // The call to .more gives true, if there are more elements + // and switches the iterator to the next one if available. + while( it.more ){ + char[] item_value = it.get; + Stdout.format( "Value:{0}", item_value ).newline; + } +} + +void hashMapExample(){ + Stdout.format( "hashMapExample" ).newline; + alias HashMap!(char[], char[]) StrStrMap; + StrStrMap map = new StrStrMap(); + map.add( "key1", "value1" ); + char[] key = "key1"; + Stdout.format( "Key: {0}, Value:{1}", key, map.get( key )).newline; + + + auto it = map.keys(); + // The call to .more gives true, if there are more elements + // and switches the iterator to the next one if available. + while( it.more ){ + char[] item_key = void; + char[] item_value = it.get( item_key ); // only for maps, the key is returns via inout + Stdout.format( "Key: {0}, Value:{1}", item_key, item_value ).newline; + } +} + +void testComparator(){ + char[][] result; + + // Create and fill the containers + auto nameSet = new TreeBag!(char[])( null, new class() Comparator!(char[]){ + int compare( char[] first, char[] second ){ + return Ascii.icompare( first, second ); + } + }); + + nameSet.addIf( "Alice" ); + nameSet.addIf( "Bob" ); + nameSet.addIf( "aliCe" ); + + // use foreach to iterate over the container + foreach ( char[] i; nameSet ) + result ~= i; + foreach( char[] i; result ) Stdout.format( "{0} ", i ); + Stdout.newline; + + // test the result + assert( result == [ "Alice", "Bob" ], "testIterator" ); +} + +void testSreener(){ + int[] result; + + // Create and fill the containers + auto ratioSamples = new ArraySeq!(float)( (float v){ + return v >= 0.0f && v < 1.0f; + }); + + ratioSamples.append( 0.0f ); + ratioSamples.append( 0.5f ); + ratioSamples.append( 0.99999f ); + // try to insert a value that is not allowed + try{ + ratioSamples.append( 1.0f ); + // will never get here + assert( false ); + } catch( IllegalElementException e ){ + } +} + + +void testForeach(){ + int[] result; + + // Create and fill the containers + auto l1 = new CircularSeq!(int); + for( int i = 0; i < 6; i+=2 ){ + l1.append( i ); + } + + // use foreach to iterate over the container + foreach ( int i; l1 ) + result ~= i; +// foreach_reverse ( int i; l1 ) +// result ~= i; + + // test the result + assert( result == [ 0, 2, 4 ], "testIterator" ); +} + +void testIterator(){ + int[] result; + + // Create and fill the containers + auto l1 = new LinkSeq!(int); + for( int i = 0; i < 6; i+=2 ){ + l1.append( i ); + } + + // define the Iterator + auto it = l1.elements(); + + // use the Iterator to iterate over the container + while (it.more()) + result ~= it.get(); + + // test the result + assert( result == [ 0, 2, 4 ], "testIterator" ); +} + +void testFilteringIterator(){ + int[] result; + alias ArrayBag!(int) IntBag; + + // Create and fill the container + auto ib = new IntBag; + for( int i = 0; i < 20; i++ ){ + ib.add( i ); + } + + // define the FilteringIterator with a function literal + auto it = new FilteringIterator!(int)( ib.elements(), (int i){ + return i >= 3 && i < 7; + }); + + // use the Iterator with the more()/get() pattern + while (it.more()) + result ~= it.get(); + + // test the result + assert( result == [ 3, 4, 5, 6 ], "testFilteringIterator" ); + +} + +void testFilteringIteratorRemove(){ + int[] result; + + // Create and fill the container + auto container = new LinkSeq!(int); + for( int i = 0; i < 10; i++ ){ + container.append( i ); + } + + // 1. Build a list of elements to delete + auto dellist = new LinkSeq!(int); + foreach( int i; container ){ + if( i < 3 || i >= 7 ){ + // container.remove( i ); /* NOT POSSIBLE */ + dellist.append( i ); + } + } + // 2. Iterate over this deletion list and + // delete the items in the original container. + foreach( int i; dellist ){ + container.remove( i ); + } + + foreach ( int i; container ) + result ~= i; + + // test the result + assert( result == [ 3, 4, 5, 6 ], "testFilteringIterator" ); + +} + +void testInterleavingIterator(){ + int[] result; + + // Create and fill the containers + auto l1 = new LinkSeq!(int); + auto l2 = new ArraySeq!(int); + for( int i = 0; i < 6; i+=2 ){ + l1.append( i ); + l2.append( i+1 ); + } + + // define the InterleavingIterator + auto it = new InterleavingIterator!(int)( l1.elements(), l2.elements() ); + + // use the InterleavingIterator to iterate over the container + while (it.more()) + result ~= it.get(); + + // test the result + assert( result == [ 0, 1, 2, 3, 4, 5 ], "testInterleavingIterator" ); +} + +// foreach( int i; result ) Stdout.format( "{0} ", i ); +// Stdout.newline; + +void main(){ + Stdout.format( "reference - Chapter 11 Example" ).newline; + hashMapExample(); + linkedListExample(); + + testSreener(); + testComparator(); + testForeach(); + testIterator(); + testFilteringIterator(); + testInterleavingIterator(); + testFilteringIteratorRemove(); + + Stdout.format( "=== End ===" ).newline; +} + + diff -r 5825d48b27d1 -r 1700239cab2e tango/example/networking/homepage.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/networking/homepage.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,30 @@ + +private import tango.io.Console; + +private import tango.net.http.HttpClient, + tango.net.http.HttpHeaders; + +/******************************************************************************* + + Shows how to use HttpClient to retrieve content from the D website + +*******************************************************************************/ + +void main() +{ + auto client = new HttpClient (HttpClient.Get, "http://www.digitalmars.com/d/intro.html"); + + // open the client and get the input stream + auto input = client.open; + scope (exit) + client.close; + + // display returned content on console + if (client.isResponseOK) + Cout.stream.copy (input); + else + Cout ("failed to return the D home page"); + + // flush the console + Cout.newline; +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/networking/httpget.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/networking/httpget.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,27 @@ +private import tango.io.Console; + +private import tango.net.http.HttpGet; + +/******************************************************************************* + + Read a page from a website, gathering the entire page before + returning any content. This illustrates a high-level approach + to retrieving web-content, whereas the homepage example shows + a somewhat lower-level approach. + + Note that this expects a fully qualified URL (with scheme), + such as "http://www.digitalmars.com/d/intro.html" + +*******************************************************************************/ + +void main (char[][] args) +{ + char[] url = (args.length is 2) ? args[1] : "http://www.digitalmars.com/d/intro.html"; + + // open a web-page for reading (see HttpPost for writing) + auto page = new HttpGet (url); + + // retrieve and flush display content + Cout (cast(char[]) page.read) (); +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/example/networking/selector.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/networking/selector.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,399 @@ +/******************************************************************************* + copyright: Copyright (c) 2006 Juan Jose Comellas. All rights reserved + license: BSD style: $(LICENSE) + author: Juan Jose Comellas +*******************************************************************************/ + +private +{ + version (Posix) + { + import tango.io.selector.PollSelector; + } + else version (linux) + { + import tango.io.selector.EpollSelector; + import tango.sys.linux.linux; + } + + import tango.io.selector.model.ISelector; + import tango.io.selector.Selector; + import tango.io.selector.SelectSelector; + import tango.io.selector.SelectorException; + import tango.io.Conduit; + import tango.net.Socket; + import tango.net.SocketConduit; + import tango.net.ServerSocket; + import tango.time.Clock; + import tango.util.log.Log; + import tango.util.log.ConsoleAppender; + import tango.util.log.DateLayout; + import tango.text.convert.Sprint; + import tango.core.Exception; + import tango.core.Thread; + import tango.sys.Common; + import tango.stdc.errno; +} + + +const uint HANDLE_COUNT = 4; +const uint EVENT_COUNT = 4; +const uint LOOP_COUNT = 50000; +const char[] SERVER_ADDR = "127.0.0.1"; +const ushort SERVER_PORT = 4000; +const uint MAX_LENGTH = 16; + +int main(char[][] args) +{ + Logger log = Log.getLogger("selector"); + Sprint!(char) sprint = new Sprint!(char)(256); + + log.addAppender(new ConsoleAppender(new DateLayout())); + + ISelector selector; + + for (int i = 0; i < 1; i++) + { + // Testing the SelectSelector + log.info(sprint("Pass {0}: Testing the select-based selector", i + 1)); + selector = new SelectSelector(); + testSelector(selector); + } + + // Testing the PollSelector + version (Posix) + { + for (int i = 0; i < 1; i++) + { + log.info(sprint("Pass {0}: Testing the poll-based selector", i + 1)); + selector = new PollSelector(); + testSelector(selector); + } + } + + // Testing the EpollSelector + version (linux) + { + for (int i = 0; i < 1; i++) + { + log.info(sprint("Pass {0}: Testing the epoll-based selector", i + 1)); + selector = new EpollSelector(); + testSelector(selector); + } + } + + return 0; +} + + +/** + * Create a server socket and run the Selector on it. + */ +void testSelector(ISelector selector) +{ + Logger log = Log.getLogger("selector.server"); + Sprint!(char) sprint = new Sprint!(char)(512); + + uint connectCount = 0; + uint receiveCount = 0; + uint sendCount = 0; + uint failedConnectCount = 0; + uint failedReceiveCount = 0; + uint failedSendCount = 0; + uint closeCount = 0; + uint errorCount = 0; + Time start = Clock.now; + Thread clientThread; + + selector.open(HANDLE_COUNT, EVENT_COUNT); + + clientThread = new Thread(&clientThreadFunc); + clientThread.start(); + + try + { + TimeSpan timeout = TimeSpan.seconds(1); + InternetAddress addr = new InternetAddress(SERVER_ADDR, SERVER_PORT); + ServerSocket serverSocket = new ServerSocket(addr, 5); + SocketConduit clientSocket; + char[MAX_LENGTH] buffer; + int eventCount; + uint count; + int i = 0; + + debug (selector) + log.trace("Registering server socket to Selector"); + + selector.register(serverSocket, Event.Read); + + while (true) + { + debug (selector) + log.trace(sprint("[{0}] Waiting for events from Selector", i)); + + eventCount = selector.select(timeout); + + debug (selector) + log.trace(sprint("[{0}] {1} events received from Selector", i, eventCount)); + + if (eventCount > 0) + { + foreach (SelectionKey selectionKey; selector.selectedSet()) + { + debug (selector) + log.trace(sprint("[{0}] Event mask for socket {1} is 0x{2:x4}", + i, cast(int) selectionKey.conduit.fileHandle(), + cast(uint) selectionKey.events)); + + if (selectionKey.isReadable()) + { + if (selectionKey.conduit is serverSocket) + { + debug (selector) + log.trace(sprint("[{0}] New connection from client", i)); + + clientSocket = serverSocket.accept(); + if (clientSocket !is null) + { + selector.register(clientSocket, Event.Read); + connectCount++; + } + else + { + debug (selector) + log.trace(sprint("[{0}] New connection attempt failed", i)); + failedConnectCount++; + } + } + else + { + // Reading from a client socket + debug (selector) + log.trace(sprint("[{0}] Receiving message from client", i)); + + count = (cast(SocketConduit) selectionKey.conduit).read(buffer); + if (count != IConduit.Eof) + { + debug (selector) + log.trace(sprint("[{0}] Received {1} from client ({2} bytes)", + i, buffer[0..count], count)); + selector.reregister(selectionKey.conduit, Event.Write); + receiveCount++; + } + else + { + debug (selector) + log.trace(sprint("[{0}] Handle {1} was closed; removing it from Selector", + i, cast(int) selectionKey.conduit.fileHandle())); + selector.unregister(selectionKey.conduit); + (cast(SocketConduit) selectionKey.conduit).close(); + failedReceiveCount++; + continue; + } + } + } + + if (selectionKey.isWritable()) + { + debug (selector) + log.trace(sprint("[{0}] Sending PONG to client", i)); + + count = (cast(SocketConduit) selectionKey.conduit).write("PONG"); + if (count != IConduit.Eof) + { + debug (selector) + log.trace(sprint("[{0}] Sent PONG to client ({1} bytes)", i, count)); + + selector.reregister(selectionKey.conduit, Event.Read); + sendCount++; + } + else + { + debug (selector) + log.trace(sprint("[{0}] Handle {1} was closed; removing it from Selector", + i, selectionKey.conduit.fileHandle())); + selector.unregister(selectionKey.conduit); + (cast(SocketConduit) selectionKey.conduit).close(); + failedSendCount++; + continue; + } + } + + if (selectionKey.isError() || selectionKey.isHangup() || selectionKey.isInvalidHandle()) + { + char[] status; + + if (selectionKey.isHangup()) + { + closeCount++; + status = "Hangup"; + } + else + { + errorCount++; + if (selectionKey.isInvalidHandle()) + status = "Invalid request"; + else + status = "Error"; + } + + debug (selector) + { + log.trace(sprint("[{0}] {1} in handle {2} from Selector", + i, status, cast(int) selectionKey.conduit.fileHandle())); + + log.trace(sprint("[{0}] Unregistering handle {1} from Selector", + i, cast(int) selectionKey.conduit.fileHandle())); + } + selector.unregister(selectionKey.conduit); + (cast(Conduit) selectionKey.conduit).close(); + + if (selectionKey.conduit !is serverSocket) + { + continue; + } + else + { + break; + } + } + } + } + else + { + debug (selector) + log.trace(sprint("[{0}] No more pending events in Selector; aborting", i)); + break; + } + i++; + + // Thread.sleep(1.0); + /* + if (i % 100 == 0) + { + fullCollect(); + getStats(gc) + } + */ + } + + serverSocket.socket().detach; + } + catch (SelectorException e) + { + log.error(sprint("Selector exception caught:\n{0}", e.toString())); + } + catch (Exception e) + { + log.error(sprint("Exception caught:\n{0}", e.toString())); + } + + log.info(sprint("Success: connect={0}; recv={1}; send={2}; close={3}", + connectCount, receiveCount, sendCount, closeCount)); + log.info(sprint("Failure: connect={0}, recv={1}; send={2}; error={3}", + failedConnectCount, failedReceiveCount, failedSendCount, errorCount)); + + log.info(sprint("Total time: {0} ms", cast(uint) (Clock.now - start).millis)); + + clientThread.join(); + + selector.close; +} + + +/** + * Thread that creates a client socket and sends messages to the server socket. + */ +void clientThreadFunc() +{ + Logger log = Log.getLogger("selector.client"); + Sprint!(char) sprint = new Sprint!(char)(256); + SocketConduit socket = new SocketConduit(); + + Thread.sleep(0.010); // 10 milliseconds + + try + { + InternetAddress addr = new InternetAddress(SERVER_ADDR, SERVER_PORT); + char[MAX_LENGTH] buffer; + uint count; + int i; + + debug (selector) + log.trace(sprint("[{0}] Connecting to server", i)); + + socket.connect(addr); + + for (i = 1; i <= LOOP_COUNT; i++) + { + debug (selector) + log.trace(sprint("[{0}] Sending PING to server", i)); + + while (true) + { + try + { + count = socket.write("PING"); + break; + } + catch (SocketException e) + { + if (errno != EINTR) + throw e; + } + } + if (count != IConduit.Eof) + { + debug (selector) + { + log.trace(sprint("[{0}] Sent PING to server ({1} bytes)", i, count)); + + log.trace(sprint("[{0}] Receiving message from server", i)); + } + while (true) + { + try + { + count = socket.read(buffer); + break; + } + catch (SocketException e) + { + if (errno != EINTR) + throw e; + } + } + if (count != IConduit.Eof) + { + debug (selector) + log.trace(sprint("[{0}] Received {1} from server ({2} bytes)", + i, buffer[0..count], count)); + } + else + { + debug (selector) + log.trace(sprint("[{0}] Handle was closed; aborting", + i, socket.fileHandle())); + break; + } + } + else + { + debug (selector) + log.trace(sprint("[{0}] Handle {1} was closed; aborting", + i, socket.fileHandle())); + break; + } + } + socket.shutdown(); + socket.close(); + } + catch (Exception e) + { + log.error(sprint("Exception caught:\n{0}", e.toString())); + } + debug (selector) + log.trace("Leaving thread"); + + return 0; +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/networking/sockethello.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/networking/sockethello.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,29 @@ +/******************************************************************************* + + Shows how to create a basic socket client, and how to converse with + a remote server. The server must be running for this to succeed + +*******************************************************************************/ + +private import tango.io.Console; + +private import tango.net.SocketConduit, + tango.net.InternetAddress; + +void main() +{ + // make a connection request to the server + auto request = new SocketConduit; + request.connect (new InternetAddress ("localhost", 8080)); + request.output.write ("hello\n"); + + // wait for response (there is an optional timeout supported) + char[64] response; + auto size = request.input.read (response); + + // close socket + request.close; + + // display server response + Cout (response[0..size]).newline; +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/networking/socketserver.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/networking/socketserver.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,53 @@ +/******************************************************************************* + + Shows how to create a basic socket server, and how to talk to + it from a socket client. Note that both the server and client + are entirely simplistic, and therefore this is for illustration + purposes only. See HttpServer for something more robust. + +*******************************************************************************/ + +private import tango.core.Thread; + +private import tango.io.Console; + +private import tango.net.ServerSocket, + tango.net.SocketConduit; + +/******************************************************************************* + + Create a socket server, and have it respond to a request + +*******************************************************************************/ + +void main() +{ + const int port = 8080; + + // thread body for socket-listener + void run() + { + auto server = new ServerSocket (new InternetAddress(port)); + + // wait for requests + auto request = server.accept; + + // write a response + request.output.write ("server replies 'hello'"); + } + + // start server in a separate thread, and wait for it to start + (new Thread (&run)).start; + Thread.sleep (0.250); + + // make a connection request to the server + auto request = new SocketConduit; + request.connect (new InternetAddress("localhost", port)); + + // wait for and display response (there is an optional timeout) + char[64] response; + auto len = request.input.read (response); + Cout (response[0..len]).newline; + + request.close; +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/synchronization/barrier.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/synchronization/barrier.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,138 @@ +/******************************************************************************* + copyright: Copyright (c) 2006 Juan Jose Comellas. All rights reserved + license: BSD style: $(LICENSE) + author: Juan Jose Comellas + Converted to use core.sync by Sean Kelly +*******************************************************************************/ + +private import tango.core.sync.Barrier; +private import tango.core.sync.Mutex; +private import tango.core.Exception; +private import tango.core.Thread; +private import tango.io.Stdout; +private import tango.text.convert.Integer; +debug (barrier) +{ + private import tango.util.log.Log; + private import tango.util.log.ConsoleAppender; + private import tango.util.log.DateLayout; +} + + +/** + * Example program for the tango.core.sync.Barrier module. + */ +void main(char[][] args) +{ + const uint MaxThreadCount = 100; + const uint LoopsPerThread = 10000; + + debug (barrier) + { + Logger log = Log.getLogger("barrier"); + + log.addAppender(new ConsoleAppender(new DateLayout())); + + log.info("Barrier test"); + } + + Barrier barrier = new Barrier(MaxThreadCount); + Mutex mutex = new Mutex(); + uint count = 0; + uint correctCount = 0; + + void barrierTestThread() + { + debug (barrier) + { + Logger log = Log.getLogger("barrier." ~ Thread.getThis().name()); + + log.trace("Starting thread"); + } + + try + { + for (uint i; i < LoopsPerThread; ++i) + { + // 'count' is a resource shared by multiple threads, so we must + // acquire the mutex before modifying it. + synchronized (mutex) + { + // debug (barrier) + // log.trace("Acquired mutex"); + count++; + // debug (barrier) + // log.trace("Releasing mutex"); + } + } + + // We wait for all the threads to finish counting. + debug (barrier) + log.trace("Waiting on barrier"); + barrier.wait(); + debug (barrier) + log.trace("Barrier was opened"); + + // We make sure that all the threads exited the barrier after + // *all* of them had finished counting. + synchronized (mutex) + { + // debug (barrier) + // log.trace("Acquired mutex"); + if (count == MaxThreadCount * LoopsPerThread) + { + ++correctCount; + } + // debug (barrier) + // log.trace("Releasing mutex"); + } + } + catch (SyncException e) + { + Stderr.formatln("Sync exception caught in Barrier test thread {0}:\n{1}\n", + Thread.getThis().name, e.toString()); + } + catch (Exception e) + { + Stderr.formatln("Unexpected exception caught in Barrier test thread {0}:\n{1}\n", + Thread.getThis().name, e.toString()); + } + } + + ThreadGroup group = new ThreadGroup(); + Thread thread; + char[10] tmp; + + for (uint i = 0; i < MaxThreadCount; ++i) + { + thread = new Thread(&barrierTestThread); + thread.name = "thread-" ~ format(tmp, i); + + group.add(thread); + debug (barrier) + log.trace("Created thread " ~ thread.name); + thread.start(); + } + + debug (barrier) + log.trace("Waiting for threads to finish"); + group.joinAll(); + + if (count == MaxThreadCount * LoopsPerThread) + { + debug (barrier) + log.info("The Barrier test was successful"); + } + else + { + debug (barrier) + { + log.error("The Barrier is not working properly: the counter has an incorrect value"); + assert(false); + } + else + { + assert(false, "The Barrier is not working properly: the counter has an incorrect value"); + } + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/synchronization/condition.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/synchronization/condition.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,307 @@ +/******************************************************************************* + copyright: Copyright (c) 2006 Juan Jose Comellas. All rights reserved + license: BSD style: $(LICENSE) + author: Juan Jose Comellas + Converted to use core.sync by Sean Kelly +*******************************************************************************/ + +private import tango.core.sync.Condition; +private import tango.core.Exception; +private import tango.core.Thread; +private import tango.text.convert.Integer; +private import tango.io.Stdout; +debug (condition) +{ + private import tango.util.log.Log; + private import tango.util.log.ConsoleAppender; + private import tango.util.log.DateLayout; +} + + +void main(char[][] args) +{ + debug (condition) + { + Logger log = Log.getLogger("condition"); + + log.addAppender(new ConsoleAppender(new DateLayout())); + + log.info("Condition test"); + } + + testNotifyOne(); + testNotifyAll(); +} + + +/** + * Test for Condition.notify(). + */ +void testNotifyOne() +{ + debug (condition) + { + Logger log = Log.getLogger("condition.notify-one"); + } + + scope Mutex mutex = new Mutex(); + scope Condition cond = new Condition(mutex); + int waiting = 0; + Thread thread; + + void notifyOneTestThread() + { + debug (condition) + { + Logger log = Log.getLogger("condition.notify-one." ~ Thread.getThis().name()); + + log.trace("Starting thread"); + } + + try + { + synchronized (mutex) + { + debug (condition) + log.trace("Acquired mutex"); + + scope(exit) + { + debug (condition) + log.trace("Releasing mutex"); + } + + waiting++; + + while (waiting != 2) + { + debug (condition) + log.trace("Waiting on condition variable"); + cond.wait(); + } + + debug (condition) + log.trace("Condition variable was signaled"); + } + } + catch (SyncException e) + { + Stderr.formatln("Sync exception caught in Condition test thread {0}:\n{1}", + Thread.getThis().name(), e.toString()); + } + catch (Exception e) + { + Stderr.formatln("Unexpected exception caught in Condition test thread {0}:\n{1}", + Thread.getThis().name(), e.toString()); + } + debug (condition) + log.trace("Exiting thread"); + } + + thread = new Thread(¬ifyOneTestThread); + thread.name = "thread-1"; + + debug (condition) + log.trace("Created thread " ~ thread.name); + thread.start(); + + try + { + // Poor man's barrier: wait until the other thread is waiting. + while (true) + { + synchronized (mutex) + { + if (waiting != 1) + { + Thread.yield(); + } + else + { + break; + } + } + } + + synchronized (mutex) + { + debug (condition) + log.trace("Acquired mutex"); + + waiting++; + + debug (condition) + log.trace("Notifying test thread"); + cond.notify(); + + debug (condition) + log.trace("Releasing mutex"); + } + + thread.join(); + + if (waiting == 2) + { + debug (condition) + log.info("The Condition notification test to one thread was successful"); + } + else + { + debug (condition) + { + log.error("The condition variable notification to one thread is not working"); + assert(false); + } + else + { + assert(false, "The condition variable notification to one thread is not working"); + } + } + } + catch (SyncException e) + { + Stderr.formatln("Sync exception caught in main thread:\n{0}", e.toString()); + } +} + + +/** + * Test for Condition.notifyAll(). + */ +void testNotifyAll() +{ + const uint MaxThreadCount = 10; + + debug (condition) + { + Logger log = Log.getLogger("condition.notify-all"); + } + + scope Mutex mutex = new Mutex(); + scope Condition cond = new Condition(mutex); + int waiting = 0; + + /** + * This thread waits for a notification from the main thread. + */ + void notifyAllTestThread() + { + debug (condition) + { + Logger log = Log.getLogger("condition.notify-all." ~ Thread.getThis().name()); + + log.trace("Starting thread"); + } + + try + { + synchronized (mutex) + { + debug (condition) + log.trace("Acquired mutex"); + + waiting++; + + while (waiting != MaxThreadCount + 1) + { + debug (condition) + log.trace("Waiting on condition variable"); + cond.wait(); + } + + debug (condition) + log.trace("Condition variable was signaled"); + + debug (condition) + log.trace("Releasing mutex"); + } + } + catch (SyncException e) + { + Stderr.formatln("Sync exception caught in Condition test thread {0}:\n{1}", + Thread.getThis().name(), e.toString()); + } + catch (Exception e) + { + Stderr.formatln("Unexpected exception caught in Condition test thread {0}:\n{1}", + Thread.getThis().name(), e.toString()); + } + debug (condition) + log.trace("Exiting thread"); + } + + ThreadGroup group = new ThreadGroup(); + Thread thread; + char[10] tmp; + + for (uint i = 0; i < MaxThreadCount; ++i) + { + thread = new Thread(¬ifyAllTestThread); + thread.name = "thread-" ~ format(tmp, i); + + group.add(thread); + debug (condition) + log.trace("Created thread " ~ thread.name); + thread.start(); + } + + try + { + // Poor man's barrier: wait until all the threads are waiting. + while (true) + { + synchronized (mutex) + { + if (waiting != MaxThreadCount) + { + Thread.yield(); + } + else + { + break; + } + } + } + + synchronized (mutex) + { + debug (condition) + log.trace("Acquired mutex"); + + waiting++; + + debug (condition) + log.trace("Notifying all threads"); + cond.notifyAll(); + + debug (condition) + log.trace("Releasing mutex"); + } + + debug (condition) + log.trace("Waiting for threads to finish"); + group.joinAll(); + + if (waiting == MaxThreadCount + 1) + { + debug (condition) + log.info("The Condition notification test to many threads was successful"); + } + else + { + debug (condition) + { + log.error("The condition variable notification to many threads is not working"); + assert(false); + } + else + { + assert(false, "The condition variable notification to many threads is not working"); + } + } + } + catch (SyncException e) + { + Stderr.formatln("Sync exception caught in main thread:\n{0}", e.toString()); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/synchronization/mutex.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/synchronization/mutex.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,248 @@ +/******************************************************************************* + copyright: Copyright (c) 2006 Juan Jose Comellas. All rights reserved + license: BSD style: $(LICENSE) + author: Juan Jose Comellas + Converted to use core.sync by Sean Kelly +*******************************************************************************/ + +private import tango.core.sync.Mutex; +private import tango.core.Exception; +private import tango.core.Thread; +private import tango.io.Stdout; +private import tango.text.convert.Integer; +debug (mutex) +{ + private import tango.util.log.Log; + private import tango.util.log.ConsoleAppender; + private import tango.util.log.DateLayout; +} + + +/** + * Example program for the tango.core.sync.Mutex module. + */ +void main(char[][] args) +{ + debug (mutex) + { + Logger log = Log.getLogger("mutex"); + + log.addAppender(new ConsoleAppender(new DateLayout())); + + log.info("Mutex test"); + } + + testNonRecursive(); + testLocking(); + testRecursive(); +} + +/** + * Test that non-recursive mutexes actually do what they're supposed to do. + * + * Remarks: + * Windows only supports recursive mutexes. + */ +void testNonRecursive() +{ + version (Posix) + { + debug (mutex) + { + Logger log = Log.getLogger("mutex.non-recursive"); + } + + Mutex mutex = new Mutex(Mutex.Type.NonRecursive); + bool couldLock; + + try + { + mutex.lock(); + debug (mutex) + log.trace("Acquired mutex"); + couldLock = mutex.tryLock(); + if (couldLock) + { + debug (mutex) + { + log.trace("Re-acquired mutex"); + log.trace("Releasing mutex"); + } + mutex.unlock(); + } + else + { + debug (mutex) + log.trace("Re-acquiring the mutex failed"); + } + debug (mutex) + log.trace("Releasing mutex"); + mutex.unlock(); + } + catch (SyncException e) + { + Stderr.formatln("Sync exception caught when testing non-recursive mutexes:\n{0}\n", e.toString()); + } + catch (Exception e) + { + Stderr.formatln("Unexpected exception caught when testing non-recursive mutexes:\n{0}\n", e.toString()); + } + + if (!couldLock) + { + debug (mutex) + log.info("The non-recursive Mutex test was successful"); + } + else + { + debug (mutex) + { + log.error("Non-recursive mutexes are not working: " + "Mutex.tryAcquire() did not fail on an already acquired mutex"); + assert(false); + } + else + { + assert(false, "Non-recursive mutexes are not working: " + "Mutex.tryAcquire() did not fail on an already acquired mutex"); + } + } + } +} + +/** + * Create several threads that acquire and release a mutex several times. + */ +void testLocking() +{ + const uint MaxThreadCount = 10; + const uint LoopsPerThread = 1000; + + debug (mutex) + { + Logger log = Log.getLogger("mutex.locking"); + } + + Mutex mutex = new Mutex(); + uint lockCount = 0; + + void mutexLockingThread() + { + try + { + for (uint i; i < LoopsPerThread; i++) + { + synchronized (mutex) + { + lockCount++; + } + } + } + catch (SyncException e) + { + Stderr.formatln("Sync exception caught inside mutex testing thread:\n{0}\n", e.toString()); + } + catch (Exception e) + { + Stderr.formatln("Unexpected exception caught inside mutex testing thread:\n{0}\n", e.toString()); + } + } + + ThreadGroup group = new ThreadGroup(); + Thread thread; + char[10] tmp; + + for (uint i = 0; i < MaxThreadCount; i++) + { + thread = new Thread(&mutexLockingThread); + thread.name = "thread-" ~ format(tmp, i); + + debug (mutex) + log.trace("Created thread " ~ thread.name); + thread.start(); + + group.add(thread); + } + + debug (mutex) + log.trace("Waiting for threads to finish"); + group.joinAll(); + + if (lockCount == MaxThreadCount * LoopsPerThread) + { + debug (mutex) + log.info("The Mutex locking test was successful"); + } + else + { + debug (mutex) + { + log.error("Mutex locking is not working properly: " + "the number of times the mutex was acquired is incorrect"); + assert(false); + } + else + { + assert(false,"Mutex locking is not working properly: " + "the number of times the mutex was acquired is incorrect"); + } + } +} + +/** + * Test that recursive mutexes actually do what they're supposed to do. + */ +void testRecursive() +{ + const uint LoopsPerThread = 1000; + + debug (mutex) + { + Logger log = Log.getLogger("mutex.recursive"); + } + + Mutex mutex = new Mutex; + uint lockCount = 0; + + try + { + for (uint i = 0; i < LoopsPerThread; i++) + { + mutex.lock(); + lockCount++; + } + } + catch (SyncException e) + { + Stderr.formatln("Sync exception caught in recursive mutex test:\n{0}\n", e.toString()); + } + catch (Exception e) + { + Stderr.formatln("Unexpected exception caught in recursive mutex test:\n{0}\n", e.toString()); + } + + for (uint i = 0; i < lockCount; i++) + { + mutex.unlock(); + } + + if (lockCount == LoopsPerThread) + { + debug (mutex) + log.info("The recursive Mutex test was successful"); + } + else + { + debug (mutex) + { + log.error("Recursive mutexes are not working: " + "the number of times the mutex was acquired is incorrect"); + assert(false); + } + else + { + assert(false, "Recursive mutexes are not working: " + "the number of times the mutex was acquired is incorrect"); + } + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/synchronization/readwritemutex.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/synchronization/readwritemutex.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,145 @@ +/******************************************************************************* + copyright: Copyright (c) 2006 Juan Jose Comellas. All rights reserved + license: BSD style: $(LICENSE) + author: Juan Jose Comellas + Converted to use core.sync by Sean Kelly +*******************************************************************************/ + +private import tango.core.sync.ReadWriteMutex; +private import tango.core.sync.Mutex; +private import tango.core.Thread; +private import tango.text.convert.Integer; +debug (readwritemutex) +{ + private import tango.util.log.Log; + private import tango.util.log.ConsoleAppender; + private import tango.util.log.DateLayout; +} + + +/** + * Example program for the tango.core.sync.ReadWriteMutex module. + */ +void main(char[][] args) +{ + const uint ReaderThreads = 100; + const uint WriterThreads = 20; + const uint LoopsPerReader = 10000; + const uint LoopsPerWriter = 1000; + const uint CounterIncrement = 3; + + debug (readwritemutex) + { + Logger log = Log.getLogger("readwritemutex"); + + log.addAppender(new ConsoleAppender(new DateLayout())); + + log.info("ReadWriteMutex test"); + } + + ReadWriteMutex rwlock = new ReadWriteMutex(); + Mutex mutex = new Mutex(); + uint readCount = 0; + uint passed = 0; + uint failed = 0; + + void mutexReaderThread() + { + debug (readwritemutex) + { + Logger log = Log.getLogger("readwritemutex." ~ Thread.getThis().name()); + + log.trace("Starting reader thread"); + } + + for (uint i = 0; i < LoopsPerReader; ++i) + { + // All the reader threads acquire the mutex for reading and when they are + // all done + synchronized (rwlock.reader) + { + for (uint j = 0; j < CounterIncrement; ++j) + { + synchronized (mutex) + { + ++readCount; + } + } + } + } + } + + void mutexWriterThread() + { + debug (readwritemutex) + { + Logger log = Log.getLogger("readwritemutex." ~ Thread.getThis().name()); + + log.trace("Starting writer thread"); + } + + for (uint i = 0; i < LoopsPerWriter; ++i) + { + synchronized (rwlock.writer) + { + synchronized (mutex) + { + if (readCount % 3 == 0) + { + ++passed; + } + } + } + } + } + + ThreadGroup group = new ThreadGroup(); + Thread thread; + char[10] tmp; + + for (uint i = 0; i < ReaderThreads; ++i) + { + thread = new Thread(&mutexReaderThread); + thread.name = "reader-" ~ format(tmp, i); + + debug (readwritemutex) + log.trace("Created reader thread " ~ thread.name); + thread.start(); + + group.add(thread); + } + + for (uint i = 0; i < WriterThreads; ++i) + { + thread = new Thread(&mutexWriterThread); + thread.name = "writer-" ~ format(tmp, i); + + debug (readwritemutex) + log.trace("Created writer thread " ~ thread.name); + thread.start(); + + group.add(thread); + } + + debug (readwritemutex) + log.trace("Waiting for threads to finish"); + group.joinAll(); + + if (passed == WriterThreads * LoopsPerWriter) + { + debug (readwritemutex) + log.info("The ReadWriteMutex test was successful"); + } + else + { + debug (readwritemutex) + { + log.error("The ReadWriteMutex is not working properly: the counter has an incorrect value"); + assert(false); + } + else + { + assert(false, "The ReadWriteMutex is not working properly: the counter has an incorrect value"); + } + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/synchronization/semaphore.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/synchronization/semaphore.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,340 @@ +/******************************************************************************* + copyright: Copyright (c) 2007 Juan Jose Comellas. All rights reserved + license: BSD style: $(LICENSE) + author: Juan Jose Comellas + Converted to use core.sync by Sean Kelly +*******************************************************************************/ + +module semaphore; + +private import tango.core.sync.Semaphore; +private import tango.core.sync.Mutex; +private import tango.core.Exception; +private import tango.core.Exception; +private import tango.core.Thread; +private import tango.io.Console; +private import tango.text.stream.LineIterator; +private import tango.text.convert.Integer; +private import tango.sys.Process; + +debug (semaphore) +{ + private import tango.util.log.Log; + private import tango.util.log.ConsoleAppender; + private import tango.util.log.DateLayout; +} + +const char[] SemaphoreName = "TestProcessSemaphore"; + + +/** + * Example program for the tango.core.sync.Barrier module. + */ +int main(char[][] args) +{ + if (args.length == 1) + { + debug (semaphore) + { + Logger log = Log.getLogger("semaphore"); + + log.addAppender(new ConsoleAppender(new DateLayout())); + + log.info("Semaphore test"); + } + + testSemaphore(); + testProcessSemaphore(args[0]); + + return 0; + } + else + { + return testSecondProcessSemaphore(); + } +} + +/** + * Test for single-process (multi-threaded) semaphores. + */ +void testSemaphore() +{ + const uint MaxThreadCount = 10; + + // Semaphore used in the tests. Start it "locked" (i.e., its initial + // count is 0). + Semaphore sem = new Semaphore(MaxThreadCount - 1); + Mutex mutex = new Mutex(); + uint count = 0; + bool passed = false; + + void semaphoreTestThread() + { + debug (semaphore) + { + Logger log = Log.getLogger("semaphore.single." ~ Thread.getThis().name()); + + log.trace("Starting thread"); + } + + try + { + uint threadNumber; + + // 'count' is a resource shared by multiple threads, so we must + // acquire the mutex before modifying it. + synchronized (mutex) + { + // debug (semaphore) + // log.trace("Acquired mutex"); + threadNumber = ++count; + // debug (semaphore) + // log.trace("Releasing mutex"); + } + + // We wait for all the threads to finish counting. + if (threadNumber < MaxThreadCount) + { + sem.wait(); + debug (semaphore) + log.trace("Acquired semaphore"); + + while (true) + { + synchronized (mutex) + { + if (count >= MaxThreadCount + 1) + break; + } + Thread.yield(); + } + + debug (semaphore) + log.trace("Releasing semaphore"); + sem.notify(); + } + else + { + passed = !sem.tryWait(); + if (passed) + { + debug (semaphore) + log.trace("Tried to acquire the semaphore too many times and failed: OK"); + } + else + { + debug (semaphore) + log.error("Tried to acquire the semaphore too may times and succeeded: FAILED"); + + debug (semaphore) + log.trace("Releasing semaphore"); + sem.notify(); + } + synchronized (mutex) + { + count++; + } + } + } + catch (SyncException e) + { + Cerr("Sync exception caught in Semaphore test thread " ~ Thread.getThis().name ~ + ":\n" ~ e.toString()).newline; + } + catch (Exception e) + { + Cerr("Unexpected exception caught in Semaphore test thread " ~ Thread.getThis().name ~ + ":\n" ~ e.toString()).newline; + } + } + + debug (semaphore) + { + Logger log = Log.getLogger("semaphore.single"); + } + + ThreadGroup group = new ThreadGroup(); + Thread thread; + char[10] tmp; + + for (uint i = 0; i < MaxThreadCount; ++i) + { + thread = new Thread(&semaphoreTestThread); + thread.name = "thread-" ~ tango.text.convert.Integer.format(tmp, i); + + group.add(thread); + debug (semaphore) + log.trace("Created thread " ~ thread.name); + thread.start(); + } + + debug (semaphore) + log.trace("Waiting for threads to finish"); + group.joinAll(); + + if (passed) + { + debug (semaphore) + log.info("The Semaphore test was successful"); + } + else + { + debug (semaphore) + { + log.error("The Semaphore is not working properly: it allowed " + "to be acquired more than it should have done"); + assert(false); + } + else + { + assert(false, "The Semaphore is not working properly: it allowed " + "to be acquired more than it should have done"); + } + } +} + +/** + * Test for multi-process semaphores: this test works by creating a copy of + * this process that tries to acquire the ProcessSemaphore that was created + * in this function. If everything works as expected, the attempt should fail, + * as the count of the semaphore is set to 1. + */ +void testProcessSemaphore(char[] programName) +{ + /+ + bool success = false; + + debug (semaphore) + { + Logger log = Log.getLogger("semaphore.multi"); + Logger childLog = Log.getLogger("semaphore.multi.child"); + + log.info("ProcessSemaphore test"); + } + + try + { + scope ProcessSemaphore sem = new ProcessSemaphore(SemaphoreName, 1); + Process proc = new Process(programName, "2"); + + debug (semaphore) + log.trace("Created ProcessSemaphore('" ~ SemaphoreName ~ "')'"); + + sem.wait(); + debug (semaphore) + log.trace("Acquired semaphore in main process"); + + debug (semaphore) + log.trace("Executing child test process: " ~ proc.toString()); + proc.execute(); + + debug (semaphore) + { + foreach (line; new LineIterator!(char)(proc.stdout)) + { + childLog.trace(line); + } + } + foreach (line; new LineIterator!(char)(proc.stderr)) + { + Cerr(line).newline; + } + + debug (semaphore) + log.trace("Waiting for child process to finish"); + auto result = proc.wait(); + + success = (result.reason == Process.Result.Exit && result.status == 2); + + debug (semaphore) + log.trace("Releasing semaphore in main process"); + sem.notify(); + } + catch (SyncException e) + { + Cerr("Sync exception caught in ProcessSemaphore main test process:\n" ~ e.toString()).newline; + } + catch (ProcessException e) + { + Cerr("Process exception caught in ProcessSemaphore main test process:\n" ~ e.toString()).newline; + } + catch (Exception e) + { + Cerr("Unexpected exception caught in ProcessSemaphore main test process:\n" ~ e.toString()).newline; + } + + if (success) + { + debug (semaphore) + log.info("The ProcessSemaphore test was successful"); + } + else + { + debug (semaphore) + { + log.error("The multi-process semaphore is not working"); + assert(false); + } + else + { + assert(false, "The multi-process semaphore is not working"); + } + } + +/ +} + +/** + * Test for multi-process semaphores (second process). + */ +int testSecondProcessSemaphore() +{ + int rc = 0; + + /+ + debug (semaphore) + { + Cout("Starting child process\n"); + } + + try + { + scope ProcessSemaphore sem = new ProcessSemaphore(SemaphoreName); + bool success; + + success = !sem.tryAcquire(); + if (success) + { + debug (semaphore) + Cout("Tried to acquire semaphore in child process and failed: OK\n"); + rc = 2; + } + else + { + debug (semaphore) + { + Cout("Acquired semaphore in child process: this should not have happened\n"); + Cout("Releasing semaphore in child process\n"); + } + sem.notify(); + rc = 1; + } + } + catch (SyncException e) + { + Cerr("Sync exception caught in ProcessSemaphore child test process:\n" ~ e.toString()).newline; + } + catch (ProcessException e) + { + Cerr("Process exception caught in ProcessSemaphore child test process:\n" ~ e.toString()).newline; + } + catch (Exception e) + { + Cerr("Unexpected exception caught in ProcessSemaphore child test process:\n" ~ e.toString()).newline; + } + + debug (semaphore) + Cout("Leaving child process\n"); + + +/ + return rc; +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/system/arguments.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/system/arguments.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,97 @@ +/******************************************************************************* + Illustrates use of the Arguments class. +*******************************************************************************/ + +import tango.util.Arguments; +import tango.io.Stdout; +import tango.io.FileConduit; +import tango.text.stream.LineIterator; + +void usage() +{ + Stdout("Usage: [OPTIONS]... FILES...").newline; + Stdout("This is a program that does something.").newline; + Stdout.newline; + Stdout("OPTIONS: ").newline; + Stdout("Output this help message: -?, --help").newline; + Stdout("Do cool things to your files: -c, -C, --cool").newline; + Stdout("Use filename as response file: -r, -R, --response").newline; +} + +void main(char[][] cmdlArgs) +{ + char[][] implicitArguments = ["files"]; + + char[][][] argumentAliases; + argumentAliases ~= ["help", "?"]; + argumentAliases ~= ["cool", "C", "c"]; + argumentAliases ~= ["response", "R", "r"]; + + auto args = new Arguments(cmdlArgs, implicitArguments, argumentAliases); + + bool fileExistsValidation(char[] arg) + { + bool rtn; + FilePath argFile = new FilePath(arg); + rtn = argFile.exists; + if (!rtn) + Stdout.format("Specified path does not exist: {}", arg).newline; + return rtn; + } + + bool singleFileValidation(char[][] args, inout char[] invalidArg) + { + if (args.length > 1) + { + Stdout("Cannot specify multiple paths for argument.").newline; + invalidArg = args[1]; + } + else + return true; + return false; + } + + args.addValidation("response", &fileExistsValidation); + args.addValidation("response", &singleFileValidation); + args.addValidation("files", true, true); + + bool argsValidated = true; + try + args.validate; + catch (ArgumentException ex) + { + if (ex.reason == ArgumentException.ExceptionReason.MISSING_ARGUMENT) + Stdout.format("Missing Argument: {} ({})", ex.name, ex.msg).newline; + else if (ex.reason == ArgumentException.ExceptionReason.MISSING_PARAMETER) + Stdout.format("Missing Parameter to Argument: {} ({})", ex.name, ex.msg).newline; + else if (ex.reason == ArgumentException.ExceptionReason.INVALID_PARAMETER) + Stdout.format("Invalid Parameter: {} ({})", ex.name, ex.msg).newline; + Stdout.newline; + argsValidated = false; + } + + if ((!argsValidated) || ("help" in args)) + usage(); + else + {// ready to run + if ("response" in args) + { + Stdout(args["response"][0]).newline; + auto file = new FileConduit(args["response"][0]); + auto lines = new LineIterator!(char)(file); + char[][] arguments; + foreach (line; lines) + arguments ~= line.dup; + args.parse(arguments, implicitArguments, argumentAliases); + } + if ("cool" in args) + { + Stdout ("Listing the files to be actioned in a cool way.").newline; + foreach (char[] file; args["files"]) + Stdout.format("{}", file).newline; + Stdout ("Cool and secret action performed.").newline; + } + if ("x" in args) + Stdout.format("User set the X factor to '{}'", args["x"]).newline; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/system/localtime.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/system/localtime.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,54 @@ +/******************************************************************************* + + localtime.d + +*******************************************************************************/ + +private import tango.io.Stdout; + +private import tango.time.WallClock; + +/****************************************************************************** + + Example code to format a local time in the following format: + "Wed Dec 31 16:00:00 GMT-0800 1969". The day and month names + would typically be extracted from a locale instance, but we + convert them locally here for the sake of simplicity + +******************************************************************************/ + +void main () +{ + /// list of day names + static char[][] days = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; + + /// list of month names + static char[][] months = + [ + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", + ]; + + // retreive local time + auto dt = WallClock.toDate; + + // get GMT difference in minutes + auto tz = cast(int) WallClock.zone.minutes; + char sign = '+'; + if (tz < 0) + tz = -tz, sign = '-'; + + // format date + Stdout.formatln ("{}, {} {:d2} {:d2}:{:d2}:{:d2} GMT{}{:d2}:{:d2} {}", + days[dt.date.dow], + months[dt.date.month-1], + dt.date.day, + dt.time.hours, + dt.time.minutes, + dt.time.seconds, + sign, + tz / 60, + tz % 60, + dt.date.year + ); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/system/normpath.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/system/normpath.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,51 @@ +/***************************************************************** + + Simple example that shows possible inputs to normalize and the + corresponding outputs. + + Put into public domain by Lars Ivar Igesund. + +*****************************************************************/ + +import tango.io.Stdout; + +import tango.util.PathUtil; + +int main() +{ +version (Posix) { + Stdout(normalize ( "/foo/../john")).newline; + Stdout(normalize ( "foo/../john")).newline; + Stdout(normalize ( "foo/bar/..")).newline; + Stdout(normalize ( "foo/bar/../john")).newline; + Stdout(normalize ( "foo/bar/doe/../../john")).newline; + Stdout(normalize ( "foo/bar/doe/../../john/../bar")).newline; + Stdout(normalize ( "./foo/bar/doe")).newline; + Stdout(normalize ( "./foo/bar/doe/../../john/../bar")).newline; + Stdout(normalize ( "./foo/bar/../../john/../bar")).newline; + Stdout(normalize ( "foo/bar/./doe/../../john")).newline; + Stdout(normalize ( "../../foo/bar/./doe/../../john")).newline; + Stdout(normalize ( "../../../foo/bar")).newline; + Stdout("** Should now throw exception as the following path is invalid for normalization.").newline; + Stdout(normalize ( "/../../../foo/bar")).newline; +} +version (Windows) { + Stdout(normalize ( "C:\\foo\\..\\john")).newline; + Stdout(normalize ( "foo\\..\\john")).newline; + Stdout(normalize ( "foo\\bar\\..")).newline; + Stdout(normalize ( "foo\\bar\\..\\john")).newline; + Stdout(normalize ( "foo\\bar\\doe\\..\\..\\john")).newline; + Stdout(normalize ( "foo\\bar\\doe\\..\\..\\john\\..\\bar")).newline; + Stdout(normalize ( ".\\foo\\bar\\doe")).newline; + Stdout(normalize ( ".\\foo\\bar\\doe\\..\\..\\john\\..\\bar")).newline; + Stdout(normalize ( ".\\foo\\bar\\..\\..\\john\\..\\bar")).newline; + Stdout(normalize ( "foo\\bar\\.\\doe\\..\\..\\john")).newline; + Stdout(normalize ( "..\\..\\foo\\bar\\.\\doe\\..\\..\\john")).newline; + Stdout(normalize ( "..\\..\\..\\foo\\bar")).newline; + Stdout("** Should now throw exception as the following path is invalid for normalization.").newline; + Stdout(normalize ( "C:\\..\\..\\..\\foo\\bar")).newline; +} + + + return 0; +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/system/process.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/system/process.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,60 @@ +/******************************************************************************* + copyright: Copyright (c) 2006 Juan Jose Comellas. All rights reserved + license: BSD style: $(LICENSE) + author: Juan Jose Comellas +*******************************************************************************/ + +private import tango.io.Stdout; +private import tango.sys.Process; +private import tango.core.Exception; + +private import tango.text.stream.LineIterator; + + +/** + * Example program for the tango.sys.Process class. + */ +void main() +{ + version (Windows) + char[] command = "ping -n 4 localhost"; + else version (Posix) + char[] command = "ping -c 4 localhost"; + else + assert(false, "Unsupported platform"); + + try + { + auto p = new Process(command, null); + + Stdout.formatln("Executing {0}", p.toString()); + p.execute(); + + Stdout.formatln("Output from process: {0} (pid {1})\n---", + p.programName, p.pid); + + foreach (line; new LineIterator!(char)(p.stdout)) + { + Stdout.formatln("{0}", line); + } + + Stdout.print("---\n"); + + auto result = p.wait(); + + Stdout.formatln("Process '{0}' ({1}) finished: {2}", + p.programName, p.pid, result.toString()); + } + catch (ProcessException e) + { + Stdout.formatln("Process execution failed: {0}", e.toString()); + } + catch (IOException e) + { + Stdout.formatln("Input/output exception caught: {0}", e.toString()); + } + catch (Exception e) + { + Stdout.formatln("Unexpected exception caught: {0}", e.toString()); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/text/formatalign.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/text/formatalign.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,20 @@ +/** + + Example showing how the alignment component in a format string argument works. + + Put into public domain by Lars Ivar Igesund + +*/ + +import tango.io.Stdout; + +void main(){ + char[] myFName = "Johnny"; + Stdout.formatln("First Name = |{0,15}|", myFName); + Stdout.formatln("Last Name = |{0,15}|", "Foo de Bar"); + + Stdout.formatln("First Name = |{0,-15}|", myFName); + Stdout.formatln("Last Name = |{0,-15}|", "Foo de Bar"); + + Stdout.formatln("First name = |{0,5}|", myFName); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/text/formatindex.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/text/formatindex.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,15 @@ +/** + + Example that shows how the format specifiers can be used to index into + the argument list. + + Put into public domain by Lars Ivar Igesund. + +*/ + +import tango.io.Stdout; + +void main(){ + Stdout.formatln("Many {1} can now be {0} around to make {2} easier,\n and {1} can also be repeated.", + "switched", "arguments", "localization"); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/text/formatspec.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/text/formatspec.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,17 @@ +/** + + Example showing how to use format specifier components in a format string's + argument. + + Put into public domain by Lars Ivar Igesund + +*/ + +import tango.io.Stdout; + +void main(){ + double avogadros = 6.0221415e23; + Stdout.formatln("I have {0:C} in cash.", 100); + Stdout.formatln("Avogadro's number is {0:E}.", avogadros); + Stdout.formatln("Avogadro's number (with alignment) is {0,4:E}.", avogadros); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/text/localetime.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/text/localetime.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,21 @@ +/****************************************************************************** + + Example to format a locale-based time. For a default locale of + en-gb, this examples formats in the following manner: + + "Thu, 27 April 2006 18:20:47 +1" + +******************************************************************************/ + +private import tango.io.Console; + +private import tango.time.Clock; + +private import tango.text.locale.Locale; + +void main () +{ + auto layout = new Locale; + + Cout (layout ("{:ddd, dd MMMM yyyy HH:mm:ss z}", Clock.now)).newline; +} diff -r 5825d48b27d1 -r 1700239cab2e tango/example/text/properties.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/text/properties.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,32 @@ +private import tango.io.Buffer, + tango.io.Console; + +private import tango.text.Properties; + +/******************************************************************************* + + Illustrates simple usage of tango.text.Properties + +*******************************************************************************/ + +void main() +{ + char[][char[]] aa; + aa ["foo"] = "something"; + aa ["bar"] = "something else"; + aa ["wumpus"] = ""; + + // write associative-array to a buffer; could use a file + auto props = new Properties!(char); + auto buffer = new Buffer (256); + props.save (buffer, aa); + + // reset and repopulate AA from the buffer + aa = null; + props.load (buffer, (char[] name, char[] value){aa[name] = value;}); + + // display result + foreach (name, value; aa) + Cout (name) (" = ") (value).newline; +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/example/text/token.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/example/text/token.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,25 @@ +/******************************************************************************* + + Tokenize input from the console. There are a variety of handy + tokenizers in the tango.text package ~ this illustrates usage + of an iterator that recognizes quoted-strings within an input + array, and splits elements on a provided set of delimiters + +*******************************************************************************/ + +import tango.io.Console; + +import Text = tango.text.Util; + +void main() +{ + // flush the console output, since we have no newline present + Cout ("Please enter some space-separated tokens: ") (); + + // create quote-aware iterator for handling space-delimited + // tokens from the console input + foreach (element; Text.quotes (Text.trim(Cin.get), " \t")) + Cout ("<") (element) ("> "); + + Cout.newline; +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/common/tango/core/BitManip.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/common/tango/core/BitManip.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,286 @@ +/** + * This module contains a collection of bit-level operations. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + */ +module tango.core.BitManip; + + +version( DDoc ) +{ + /** + * Scans the bits in v starting with bit 0, looking + * for the first set bit. + * Returns: + * The bit number of the first bit set. + * The return value is undefined if v is zero. + */ + int bsf( uint v ); + + + /** + * Scans the bits in v from the most significant bit + * to the least significant bit, looking + * for the first set bit. + * Returns: + * The bit number of the first bit set. + * The return value is undefined if v is zero. + * Example: + * --- + * import std.intrinsic; + * + * int main() + * { + * uint v; + * int x; + * + * v = 0x21; + * x = bsf(v); + * printf("bsf(x%x) = %d\n", v, x); + * x = bsr(v); + * printf("bsr(x%x) = %d\n", v, x); + * return 0; + * } + * --- + * Output: + * bsf(x21) = 0
+ * bsr(x21) = 5 + */ + int bsr( uint v ); + + + /** + * Tests the bit. + */ + int bt( uint* p, uint bitnum ); + + + /** + * Tests and complements the bit. + */ + int btc( uint* p, uint bitnum ); + + + /** + * Tests and resets (sets to 0) the bit. + */ + int btr( uint* p, uint bitnum ); + + + /** + * Tests and sets the bit. + * Params: + * p = a non-NULL pointer to an array of uints. + * index = a bit number, starting with bit 0 of p[0], + * and progressing. It addresses bits like the expression: + --- + p[index / (uint.sizeof*8)] & (1 << (index & ((uint.sizeof*8) - 1))) + --- + * Returns: + * A non-zero value if the bit was set, and a zero + * if it was clear. + * + * Example: + * --- + import std.intrinsic; + + int main() + { + uint array[2]; + + array[0] = 2; + array[1] = 0x100; + + printf("btc(array, 35) = %d\n", btc(array, 35)); + printf("array = [0]:x%x, [1]:x%x\n", array[0], array[1]); + + printf("btc(array, 35) = %d\n", btc(array, 35)); + printf("array = [0]:x%x, [1]:x%x\n", array[0], array[1]); + + printf("bts(array, 35) = %d\n", bts(array, 35)); + printf("array = [0]:x%x, [1]:x%x\n", array[0], array[1]); + + printf("btr(array, 35) = %d\n", btr(array, 35)); + printf("array = [0]:x%x, [1]:x%x\n", array[0], array[1]); + + printf("bt(array, 1) = %d\n", bt(array, 1)); + printf("array = [0]:x%x, [1]:x%x\n", array[0], array[1]); + + return 0; + } + * --- + * Output: +
+    btc(array, 35) = 0
+    array = [0]:x2, [1]:x108
+    btc(array, 35) = -1
+    array = [0]:x2, [1]:x100
+    bts(array, 35) = 0
+    array = [0]:x2, [1]:x108
+    btr(array, 35) = -1
+    array = [0]:x2, [1]:x100
+    bt(array, 1) = -1
+    array = [0]:x2, [1]:x100
+    
+ */ + int bts( uint* p, uint bitnum ); + + + /** + * Swaps bytes in a 4 byte uint end-to-end, i.e. byte 0 becomes + * byte 3, byte 1 becomes byte 2, byte 2 becomes byte 1, byte 3 + * becomes byte 0. + */ + uint bswap( uint v ); + + + /** + * Reads I/O port at port_address. + */ + ubyte inp( uint port_address ); + + + /** + * ditto + */ + ushort inpw( uint port_address ); + + + /** + * ditto + */ + uint inpl( uint port_address ); + + + /** + * Writes and returns value to I/O port at port_address. + */ + ubyte outp( uint port_address, ubyte value ); + + + /** + * ditto + */ + ushort outpw( uint port_address, ushort value ); + + + /** + * ditto + */ + uint outpl( uint port_address, uint value ); +} +else +{ + public import std.intrinsic; +} + + +/** + * Calculates the number of set bits in a 32-bit integer. + */ +int popcnt( uint x ) +{ + // Avoid branches, and the potential for cache misses which + // could be incurred with a table lookup. + + // We need to mask alternate bits to prevent the + // sum from overflowing. + // add neighbouring bits. Each bit is 0 or 1. + x = x - ((x>>1) & 0x5555_5555); + // now each two bits of x is a number 00,01 or 10. + // now add neighbouring pairs + x = ((x&0xCCCC_CCCC)>>2) + (x&0x3333_3333); + // now each nibble holds 0000-0100. Adding them won't + // overflow any more, so we don't need to mask any more + + // Now add the nibbles, then the bytes, then the words + // We still need to mask to prevent double-counting. + // Note that if we used a rotate instead of a shift, we + // wouldn't need the masks, and could just divide the sum + // by 8 to account for the double-counting. + // On some CPUs, it may be faster to perform a multiply. + + x += (x>>4); + x &= 0x0F0F_0F0F; + x += (x>>8); + x &= 0x00FF_00FF; + x += (x>>16); + x &= 0xFFFF; + return x; +} + + +debug( UnitTest ) +{ + unittest + { + assert( popcnt( 0 ) == 0 ); + assert( popcnt( 7 ) == 3 ); + assert( popcnt( 0xAA )== 4 ); + assert( popcnt( 0x8421_1248 ) == 8 ); + assert( popcnt( 0xFFFF_FFFF ) == 32 ); + assert( popcnt( 0xCCCC_CCCC ) == 16 ); + assert( popcnt( 0x7777_7777 ) == 24 ); + } +} + + +/** + * Reverses the order of bits in a 32-bit integer. + */ +uint bitswap( uint x ) +{ + + version( D_InlineAsm_X86 ) + { + asm + { + // Author: Tiago Gasiba. + mov EDX, EAX; + shr EAX, 1; + and EDX, 0x5555_5555; + and EAX, 0x5555_5555; + shl EDX, 1; + or EAX, EDX; + mov EDX, EAX; + shr EAX, 2; + and EDX, 0x3333_3333; + and EAX, 0x3333_3333; + shl EDX, 2; + or EAX, EDX; + mov EDX, EAX; + shr EAX, 4; + and EDX, 0x0f0f_0f0f; + and EAX, 0x0f0f_0f0f; + shl EDX, 4; + or EAX, EDX; + bswap EAX; + } + } + else + { + // swap odd and even bits + x = ((x >> 1) & 0x5555_5555) | ((x & 0x5555_5555) << 1); + // swap consecutive pairs + x = ((x >> 2) & 0x3333_3333) | ((x & 0x3333_3333) << 2); + // swap nibbles + x = ((x >> 4) & 0x0F0F_0F0F) | ((x & 0x0F0F_0F0F) << 4); + // swap bytes + x = ((x >> 8) & 0x00FF_00FF) | ((x & 0x00FF_00FF) << 8); + // swap 2-byte long pairs + x = ( x >> 16 ) | ( x << 16); + return x; + + } +} + + +debug( UnitTest ) +{ + unittest + { + assert( bitswap( 0x8000_0100 ) == 0x0080_0001 ); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/common/tango/core/Exception.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/common/tango/core/Exception.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,622 @@ +/** + * The exception module defines all system-level exceptions and provides a + * mechanism to alter system-level error handling. + * + * Copyright: Copyright (C) 2005-2006 Sean Kelly, Kris Bell. All rights reserved. + * License: BSD style: $(LICENSE) + * Authors: Sean Kelly, Kris Bell + */ +module tango.core.Exception; + + +private +{ + alias void function( char[] file, size_t line, char[] msg = null ) assertHandlerType; + alias TracedExceptionInfo function( void* ptr = null ) traceHandlerType; + + assertHandlerType assertHandler = null; + traceHandlerType traceHandler = null; +} + + +interface TracedExceptionInfo +{ + int opApply( int delegate( inout char[] ) ); +} + + +//////////////////////////////////////////////////////////////////////////////// +/* +- Exception + - OutOfMemoryException + + - TracedException + - SwitchException + - AssertException + - ArrayBoundsException + - FinalizeException + + - PlatformException + - ProcessException + - ThreadException + - FiberException + - SyncException + - IOException + - SocketException + - SocketAcceptException + - AddressException + - HostException + - VfsException + - ClusterException + + - NoSuchElementException + - CorruptedIteratorException + + - IllegalArgumentException + - IllegalElementException + + - TextException + - RegexException + - LocaleException + - UnicodeException + + - PayloadException +*/ +//////////////////////////////////////////////////////////////////////////////// + + +/** + * Thrown on an out of memory error. + */ +class OutOfMemoryException : Exception +{ + this( char[] file, size_t line ) + { + super( "Memory allocation failed", file, line ); + } + + char[] toString() + { + return msg ? super.toString() : "Memory allocation failed"; + } +} + + +/** + * Stores a stack trace when thrown. + */ +class TracedException : Exception +{ + this( char[] msg ) + { + super( msg ); + m_info = traceContext(); + } + + this( char[] msg, Exception e ) + { + super( msg, e ); + m_info = traceContext(); + } + + this( char[] msg, char[] file, size_t line ) + { + super( msg, file, line ); + m_info = traceContext(); + } + + char[] toString() + { + if( m_info is null ) + return super.toString(); + char[] buf = super.toString(); + buf ~= "\n----------------"; + foreach( line; m_info ) + buf ~= "\n" ~ line; + return buf; + } + + int opApply( int delegate( inout char[] buf ) dg ) + { + if( m_info is null ) + return 0; + return m_info.opApply( dg ); + } + +private: + TracedExceptionInfo m_info; +} + + +/** + * Base class for operating system or library exceptions. + */ +class PlatformException : TracedException +{ + this( char[] msg ) + { + super( msg ); + } +} + +/** + * Thrown on an assert error. + */ +class AssertException : TracedException +{ + this( char[] file, size_t line ) + { + super( "Assertion failure", file, line ); + } + + this( char[] msg, char[] file, size_t line ) + { + super( msg, file, line ); + } +} + + +/** + * Thrown on an array bounds error. + */ +class ArrayBoundsException : TracedException +{ + this( char[] file, size_t line ) + { + super( "Array index out of bounds", file, line ); + } +} + + +/** + * Thrown on finalize error. + */ +class FinalizeException : TracedException +{ + ClassInfo info; + + this( ClassInfo c, Exception e = null ) + { + super( "Finalization error", e ); + info = c; + } + + char[] toString() + { + //return "An exception was thrown while finalizing an instance of class " ~ info.name; + assert(0); + } +} + + +/** + * Thrown on a switch error. + */ +class SwitchException : TracedException +{ + this( char[] file, size_t line ) + { + super( "No appropriate switch clause found", file, line ); + } +} + + +/** + * Represents a text processing error. + */ +class TextException : TracedException +{ + this( char[] msg ) + { + super( msg ); + } +} + +/** + * Thrown on a unicode conversion error. + */ +class UnicodeException : TextException +{ + size_t idx; + + this( char[] msg, size_t idx ) + { + super( msg ); + this.idx = idx; + } +} + + +/** + * Base class for thread exceptions. + */ +class ThreadException : PlatformException +{ + this( char[] msg ) + { + super( msg ); + } +} + + +/** + * Base class for fiber exceptions. + */ +class FiberException : ThreadException +{ + this( char[] msg ) + { + super( msg ); + } +} + + +/** + * Base class for synchronization exceptions. + */ +class SyncException : PlatformException +{ + this( char[] msg ) + { + super( msg ); + } +} + + + +/** + * The basic exception thrown by the tango.io package. One should try to ensure + * that all Tango exceptions related to IO are derived from this one. + */ +class IOException : PlatformException +{ + this( char[] msg ) + { + super( msg ); + } +} + +/** + * The basic exception thrown by the tango.io.vfs package. + */ +private class VfsException : IOException +{ + this( char[] msg ) + { + super( msg ); + } +} + +/** + * The basic exception thrown by the tango.io.cluster package. + */ +private class ClusterException : IOException +{ + this( char[] msg ) + { + super( msg ); + } +} + +/** + * Base class for socket exceptions. + */ +class SocketException : IOException +{ + this( char[] msg ) + { + super( msg ); + } +} + + +/** + * Base class for exception thrown by an InternetHost. + */ +class HostException : IOException +{ + this( char[] msg ) + { + super( msg ); + } +} + + +/** + * Base class for exceptiond thrown by an Address. + */ +class AddressException : IOException +{ + this( char[] msg ) + { + super( msg ); + } +} + + +/** + * Thrown when a socket failed to accept an incoming connection. + */ +class SocketAcceptException : SocketException +{ + this( char[] msg ) + { + super( msg ); + } +} + + +/** + * Thrown on a process error. + */ +class ProcessException : PlatformException +{ + this( char[] msg ) + { + super( msg ); + } +} + + +/** + * Base class for regluar expression exceptions. + */ +class RegexException : TextException +{ + this( char[] msg ) + { + super( msg ); + } +} + + +/** + * Base class for locale exceptions. + */ +class LocaleException : TextException +{ + this( char[] msg ) + { + super( msg ); + } +} + + +/** + * RegistryException is thrown when the NetworkRegistry encounters a + * problem during proxy registration, or when it sees an unregistered + * guid. + */ +class RegistryException : TracedException +{ + this( char[] msg ) + { + super( msg ); + } +} + + +/** + * Thrown when an illegal argument is encountered. + */ +class IllegalArgumentException : TracedException +{ + this( char[] msg ) + { + super( msg ); + } +} + + +/** + * + * IllegalElementException is thrown by Collection methods + * that add (or replace) elements (and/or keys) when their + * arguments are null or do not pass screeners. + * + */ +class IllegalElementException : IllegalArgumentException +{ + this( char[] msg ) + { + super( msg ); + } +} + + +/** + * Thrown on past-the-end errors by iterators and containers. + */ +class NoSuchElementException : TracedException +{ + this( char[] msg ) + { + super( msg ); + } +} + + +/** + * Thrown when a corrupt iterator is detected. + */ +class CorruptedIteratorException : NoSuchElementException +{ + this( char[] msg ) + { + super( msg ); + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Overrides +//////////////////////////////////////////////////////////////////////////////// + + +/** + * Overrides the default assert hander with a user-supplied version. + * + * Params: + * h = The new assert handler. Set to null to use the default handler. + */ +void setAssertHandler( assertHandlerType h ) +{ + assertHandler = h; +} + + +/** + * Overrides the default trace hander with a user-supplied version. + * + * Params: + * h = The new trace handler. Set to null to use the default handler. + */ +void setTraceHandler( traceHandlerType h ) +{ + traceHandler = h; +} + + +//////////////////////////////////////////////////////////////////////////////// +// Overridable Callbacks +//////////////////////////////////////////////////////////////////////////////// + + +/** + * A callback for assert errors in D. The user-supplied assert handler will + * be called if one has been supplied, otherwise an AssertException will be + * thrown. + * + * Params: + * file = The name of the file that signaled this error. + * line = The line number on which this error occurred. + */ +extern (C) void onAssertError( char[] file, size_t line ) +{ + if( assertHandler is null ) + throw new AssertException( file, line ); + assertHandler( file, line ); +} + + +/** + * A callback for assert errors in D. The user-supplied assert handler will + * be called if one has been supplied, otherwise an AssertException will be + * thrown. + * + * Params: + * file = The name of the file that signaled this error. + * line = The line number on which this error occurred. + * msg = An error message supplied by the user. + */ +extern (C) void onAssertErrorMsg( char[] file, size_t line, char[] msg ) +{ + if( assertHandler is null ) + throw new AssertException( msg, file, line ); + assertHandler( file, line, msg ); +} + + +/** + * This function will be called when a TracedException is constructed. The + * user-supplied trace handler will be called if one has been supplied, + * otherwise no trace will be generated. + * + * Params: + * ptr = A pointer to the location from which to generate the trace, or null + * if the trace should be generated from within the trace handler + * itself. + * + * Returns: + * An object describing the current calling context or null if no handler is + * supplied. + */ +TracedExceptionInfo traceContext( void* ptr = null ) +{ + if( traceHandler is null ) + return null; + return traceHandler( ptr ); +} + +//////////////////////////////////////////////////////////////////////////////// +// Internal Error Callbacks +//////////////////////////////////////////////////////////////////////////////// + + +/** + * A callback for array bounds errors in D. An ArrayBoundsException will be + * thrown. + * + * Params: + * file = The name of the file that signaled this error. + * line = The line number on which this error occurred. + * + * Throws: + * ArrayBoundsException. + */ +extern (C) void onArrayBoundsError( char[] file, size_t line ) +{ + throw new ArrayBoundsException( file, line ); +} + + +/** + * A callback for finalize errors in D. A FinalizeException will be thrown. + * + * Params: + * e = The exception thrown during finalization. + * + * Throws: + * FinalizeException. + */ +extern (C) void onFinalizeError( ClassInfo info, Exception ex ) +{ + throw new FinalizeException( info, ex ); +} + + +/** + * A callback for out of memory errors in D. An OutOfMemoryException will be + * thrown. + * + * Throws: + * OutOfMemoryException. + */ +extern (C) void onOutOfMemoryError() +{ + // NOTE: Since an out of memory condition exists, no allocation must occur + // while generating this object. + throw cast(OutOfMemoryException) cast(void*) OutOfMemoryException.classinfo.init; +} + + +/** + * A callback for switch errors in D. A SwitchException will be thrown. + * + * Params: + * file = The name of the file that signaled this error. + * line = The line number on which this error occurred. + * + * Throws: + * SwitchException. + */ +extern (C) void onSwitchError( char[] file, size_t line ) +{ + throw new SwitchException( file, line ); +} + + +/** + * A callback for unicode errors in D. A UnicodeException will be thrown. + * + * Params: + * msg = Information about the error. + * idx = String index where this error was detected. + * + * Throws: + * UnicodeException. + */ +extern (C) void onUnicodeError( char[] msg, size_t idx ) +{ + throw new UnicodeException( msg, idx ); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/common/tango/core/Memory.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/common/tango/core/Memory.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,458 @@ +/** + * The memory module provides an interface to the garbage collector and to + * any other OS or API-level memory management facilities. + * + * Copyright: Copyright (C) 2005-2006 Sean Kelly. All rights reserved. + * License: BSD style: $(LICENSE) + * Authors: Sean Kelly + */ +module tango.core.Memory; + + +private +{ + extern (C) void gc_init(); + extern (C) void gc_term(); + + extern (C) void gc_enable(); + extern (C) void gc_disable(); + extern (C) void gc_collect(); + + extern (C) uint gc_getAttr( void* p ); + extern (C) uint gc_setAttr( void* p, uint a ); + extern (C) uint gc_clrAttr( void* p, uint a ); + + extern (C) void* gc_malloc( size_t sz, uint ba = 0 ); + extern (C) void* gc_calloc( size_t sz, uint ba = 0 ); + extern (C) void* gc_realloc( void* p, size_t sz, uint ba = 0 ); + extern (C) size_t gc_extend( void* p, size_t mx, size_t sz ); + extern (C) void gc_free( void* p ); + + extern (C) void* gc_addrOf( void* p ); + extern (C) size_t gc_sizeOf( void* p ); + + struct BlkInfo_ + { + void* base; + size_t size; + uint attr; + } + + extern (C) BlkInfo_ gc_query( void* p ); + + extern (C) void gc_addRoot( void* p ); + extern (C) void gc_addRange( void* p, size_t sz ); + + extern (C) void gc_removeRoot( void* p ); + extern (C) void gc_removeRange( void* p ); + + alias bool function( Object obj ) collectHandlerType; +} + + +/** + * This struct encapsulates all garbage collection functionality for the D + * programming language. + */ +struct GC +{ + /** + * Enables the garbage collector if collections have previously been + * suspended by a call to disable. This function is reentrant, and + * must be called once for every call to disable before the garbage + * collector is enabled. + */ + static void enable() + { + gc_enable(); + } + + + /** + * Disables the garbage collector. This function is reentrant, but + * enable must be called once for each call to disable. + */ + static void disable() + { + gc_disable(); + } + + + /** + * Begins a full collection. While the meaning of this may change based + * on the garbage collector implementation, typical behavior is to scan + * all stack segments for roots, mark accessible memory blocks as alive, + * and then to reclaim free space. This action may need to suspend all + * running threads for at least part of the collection process. + */ + static void collect() + { + gc_collect(); + } + + + /** + * Elements for a bit field representing memory block attributes. These + * are manipulated via the getAttr, setAttr, clrAttr functions. + */ + enum BlkAttr : uint + { + FINALIZE = 0b0000_0001, /// Finalize the data in this block on collect. + NO_SCAN = 0b0000_0010, /// Do not scan through this block on collect. + NO_MOVE = 0b0000_0100 /// Do not move this memory block on collect. + } + + + /** + * Contains aggregate information about a block of managed memory. The + * purpose of this struct is to support a more efficient query style in + * instances where detailed information is needed. + * + * base = A pointer to the base of the block in question. + * size = The size of the block, calculated from base. + * attr = Attribute bits set on the memory block. + */ + alias BlkInfo_ BlkInfo; + + + /** + * Returns a bit field representing all block attributes set for the memory + * referenced by p. If p references memory not originally allocated by this + * garbage collector, points to the interior of a memory block, or if p is + * null, zero will be returned. + * + * Params: + * p = A pointer to the root of a valid memory block or to null. + * + * Returns: + * A bit field containing any bits set for the memory block referenced by + * p or zero on error. + */ + static uint getAttr( void* p ) + { + return gc_getAttr( p ); + } + + + /** + * Sets the specified bits for the memory references by p. If p references + * memory not originally allocated by this garbage collector, points to the + * interior of a memory block, or if p is null, no action will be performed. + * + * Params: + * p = A pointer to the root of a valid memory block or to null. + * a = A bit field containing any bits to set for this memory block. + * + * The result of a call to getAttr after the specified bits have been + * set. + */ + static uint setAttr( void* p, uint a ) + { + return gc_setAttr( p, a ); + } + + + /** + * Clears the specified bits for the memory references by p. If p + * references memory not originally allocated by this garbage collector, + * points to the interior of a memory block, or if p is null, no action + * will be performed. + * + * Params: + * p = A pointer to the root of a valid memory block or to null. + * a = A bit field containing any bits to clear for this memory block. + * + * Returns: + * The result of a call to getAttr after the specified bits have been + * cleared. + */ + static uint clrAttr( void* p, uint a ) + { + return gc_clrAttr( p, a ); + } + + + /** + * Requests an aligned block of managed memory from the garbage collector. + * This memory may be deleted at will with a call to free, or it may be + * discarded and cleaned up automatically during a collection run. If + * allocation fails, this function will call onOutOfMemory which is + * expected to throw an OutOfMemoryException. + * + * Params: + * sz = The desired allocation size in bytes. + * ba = A bitmask of the attributes to set on this block. + * + * Returns: + * A reference to the allocated memory or null if insufficient memory + * is available. + * + * Throws: + * OutOfMemoryException on allocation failure. + */ + static void* malloc( size_t sz, uint ba = 0 ) + { + return gc_malloc( sz, ba ); + } + + + /** + * Requests an aligned block of managed memory from the garbage collector, + * which is initialized with all bits set to zero. This memory may be + * deleted at will with a call to free, or it may be discarded and cleaned + * up automatically during a collection run. If allocation fails, this + * function will call onOutOfMemory which is expected to throw an + * OutOfMemoryException. + * + * Params: + * sz = The desired allocation size in bytes. + * ba = A bitmask of the attributes to set on this block. + * + * Returns: + * A reference to the allocated memory or null if insufficient memory + * is available. + * + * Throws: + * OutOfMemoryException on allocation failure. + */ + static void* calloc( size_t sz, uint ba = 0 ) + { + return gc_calloc( sz, ba ); + } + + + /** + * If sz is zero, the memory referenced by p will be deallocated as if + * by a call to free. A new memory block of size sz will then be + * allocated as if by a call to malloc, or the implementation may instead + * resize the memory block in place. The contents of the new memory block + * will be the same as the contents of the old memory block, up to the + * lesser of the new and old sizes. Note that existing memory will only + * be freed by realloc if sz is equal to zero. The garbage collector is + * otherwise expected to later reclaim the memory block if it is unused. + * If allocation fails, this function will call onOutOfMemory which is + * expected to throw an OutOfMemoryException. If p references memory not + * originally allocated by this garbage collector, or if it points to the + * interior of a memory block, no action will be taken. If ba is zero + * (the default) and p references the head of a valid, known memory block + * then any bits set on the current block will be set on the new block if a + * reallocation is required. If ba is not zero and p references the head + * of a valid, known memory block then the bits in ba will replace those on + * the current memory block and will also be set on the new block if a + * reallocation is required. + * + * Params: + * p = A pointer to the root of a valid memory block or to null. + * sz = The desired allocation size in bytes. + * ba = A bitmask of the attributes to set on this block. + * + * Returns: + * A reference to the allocated memory on success or null if sz is + * zero. On failure, the original value of p is returned. + * + * Throws: + * OutOfMemoryException on allocation failure. + */ + static void* realloc( void* p, size_t sz, uint ba = 0 ) + { + return gc_realloc( p, sz, ba ); + } + + + /** + * Requests that the managed memory block referenced by p be extended in + * place by at least mx bytes, with a desired extension of sz bytes. If an + * extension of the required size is not possible, if p references memory + * not originally allocated by this garbage collector, or if p points to + * the interior of a memory block, no action will be taken. + * + * Params: + * mx = The minimum extension size in bytes. + * sz = The desired extension size in bytes. + * + * Returns: + * The size in bytes of the extended memory block referenced by p or zero + * if no extension occurred. + */ + static size_t extend( void* p, size_t mx, size_t sz ) + { + return gc_extend( p, mx, sz ); + } + + + /** + * Deallocates the memory referenced by p. If p is null, no action + * occurs. If p references memory not originally allocated by this + * garbage collector, or if it points to the interior of a memory block, + * no action will be taken. The block will not be finalized regardless + * of whether the FINALIZE attribute is set. If finalization is desired, + * use delete instead. + * + * Params: + * p = A pointer to the root of a valid memory block or to null. + */ + static void free( void* p ) + { + gc_free( p ); + } + + + /** + * Returns the base address of the memory block containing p. This value + * is useful to determine whether p is an interior pointer, and the result + * may be passed to routines such as sizeOf which may otherwise fail. If p + * references memory not originally allocated by this garbage collector, if + * p is null, or if the garbage collector does not support this operation, + * null will be returned. + * + * Params: + * p = A pointer to the root or the interior of a valid memory block or to + * null. + * + * Returns: + * The base address of the memory block referenced by p or null on error. + */ + static void* addrOf( void* p ) + { + return gc_addrOf( p ); + } + + + /** + * Returns the true size of the memory block referenced by p. This value + * represents the maximum number of bytes for which a call to realloc may + * resize the existing block in place. If p references memory not + * originally allocated by this garbage collector, points to the interior + * of a memory block, or if p is null, zero will be returned. + * + * Params: + * p = A pointer to the root of a valid memory block or to null. + * + * Returns: + * The size in bytes of the memory block referenced by p or zero on error. + */ + static size_t sizeOf( void* p ) + { + return gc_sizeOf( p ); + } + + + /** + * Returns aggregate information about the memory block containing p. If p + * references memory not originally allocated by this garbage collector, if + * p is null, or if the garbage collector does not support this operation, + * BlkInfo.init will be returned. Typically, support for this operation + * is dependent on support for addrOf. + * + * Params: + * p = A pointer to the root or the interior of a valid memory block or to + * null. + * + * Returns: + * Information regarding the memory block referenced by p or BlkInfo.init + * on error. + */ + static BlkInfo query( void* p ) + { + return gc_query( p ); + } + + + /** + * Adds the memory address referenced by p to an internal list of roots to + * be scanned during a collection. If p is null, no operation is + * performed. + * + * Params: + * p = A pointer to a valid memory address or to null. + */ + static void addRoot( void* p ) + { + gc_addRoot( p ); + } + + + /** + * Adds the memory block referenced by p and of size sz to an internal list + * of ranges to be scanned during a collection. If p is null, no operation + * is performed. + * + * Params: + * p = A pointer to a valid memory address or to null. + * sz = The size in bytes of the block to add. If sz is zero then the + * no operation will occur. If p is null then sz must be zero. + */ + static void addRange( void* p, size_t sz ) + { + gc_addRange( p, sz ); + } + + + /** + * Removes the memory block referenced by p from an internal list of roots + * to be scanned during a collection. If p is null or does not represent + * a value previously passed to add(void*) then no operation is performed. + * + * p = A pointer to a valid memory address or to null. + */ + static void removeRoot( void* p ) + { + gc_removeRoot( p ); + } + + + /** + * Removes the memory block referenced by p from an internal list of ranges + * to be scanned during a collection. If p is null or does not represent + * a value previously passed to add(void*, size_t) then no operation is + * performed. + * + * Params: + * p = A pointer to a valid memory address or to null. + */ + static void removeRange( void* p ) + { + gc_removeRange( p ); + } + + + /** + * Overrides the default collect hander with a user-supplied version. + * + * Params: + * h = The new collect handler. Set to null to use the default handler. + */ + static void collectHandler( collectHandlerType h ) + { + sm_collectHandler = h; + } + + +private: + static collectHandlerType sm_collectHandler = null; +} + + +//////////////////////////////////////////////////////////////////////////////// +// Overridable Callbacks +//////////////////////////////////////////////////////////////////////////////// + + +/** + * This function will be called when resource objects (ie. objects with a dtor) + * are finalized by the garbage collector. The user-supplied collect handler + * will be called if one has been supplied, otherwise no action will be taken. + * + * Params: + * obj = The object being collected. + * + * Returns: + * true if the runtime should call this object's dtor and false if not. + * Default behavior is to return true. + */ +extern (C) bool onCollectResource( Object obj ) +{ + if( GC.sm_collectHandler is null ) + return true; + return GC.sm_collectHandler( obj ); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/common/tango/core/Runtime.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/common/tango/core/Runtime.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,87 @@ +/** + * The runtime module exposes information specific to the D runtime code. + * + * Copyright: Copyright (C) 2005-2006 Sean Kelly. All rights reserved. + * License: BSD style: $(LICENSE) + * Authors: Sean Kelly + */ +module tango.core.Runtime; + + +private +{ + extern (C) bool rt_isHalting(); + + alias bool function() moduleUnitTesterType; +} + + +//////////////////////////////////////////////////////////////////////////////// +// Runtime +//////////////////////////////////////////////////////////////////////////////// + + +/** + * This struct encapsulates all functionality related to the underlying runtime + * module for the calling context. + */ +struct Runtime +{ + /** + * Returns true if the runtime is halting. Under normal circumstances, + * this will be set between the time that normal application code has + * exited and before module dtors are called. + * + * Returns: + * true if the runtime is halting. + */ + static bool isHalting() + { + return rt_isHalting(); + } + + + /** + * Overrides the default module unit tester with a user-supplied version. + * + * Params: + * h = The new unit tester. Set to null to use the default unit tester. + */ + static void moduleUnitTester( moduleUnitTesterType h ) + { + sm_moduleUnitTester = h; + } + + +private: + static moduleUnitTesterType sm_moduleUnitTester = null; +} + + +//////////////////////////////////////////////////////////////////////////////// +// Overridable Callbacks +//////////////////////////////////////////////////////////////////////////////// + + +/** + * This routine is called by the runtime to run module unit tests on startup. + * The user-supplied unit tester will be called if one has been supplied, + * otherwise all unit tests will be run in sequence. + * + * Returns: + * true if execution should continue after testing is complete and false if + * not. Default behavior is to return true. + */ +extern (C) bool runModuleUnitTests() +{ + if( Runtime.sm_moduleUnitTester is null ) + { + foreach( m; ModuleInfo ) + { + if( m.unitTest ) + m.unitTest(); + } + return true; + } + return Runtime.sm_moduleUnitTester(); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/common/tango/core/Thread.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/common/tango/core/Thread.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,3256 @@ +/** + * The thread module provides support for thread creation and management. + * + * Copyright: Copyright (C) 2005-2006 Sean Kelly. All rights reserved. + * License: BSD style: $(LICENSE) + * Authors: Sean Kelly + */ +module tango.core.Thread; + + +// this should be true for most architectures +version = StackGrowsDown; + + +public +{ +// import tango.core.TimeSpan; +} +private +{ + import tango.core.Exception; + + + // + // exposed by compiler runtime + // + extern (C) void* rt_stackBottom(); + extern (C) void* rt_stackTop(); + + + void* getStackBottom() + { + return rt_stackBottom(); + } + + + void* getStackTop() + { + version( D_InlineAsm_X86 ) + { + asm + { + naked; + mov EAX, ESP; + ret; + } + } + else + { + return rt_stackTop(); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Thread Entry Point and Signal Handlers +//////////////////////////////////////////////////////////////////////////////// + + +version( Win32 ) +{ + private + { + import tango.stdc.stdint : uintptr_t; // for _beginthreadex decl below + import tango.sys.win32.UserGdi; + + const DWORD TLS_OUT_OF_INDEXES = 0xFFFFFFFF; + + // + // avoid multiple imports via tango.sys.windows.process + // + extern (Windows) alias uint function(void*) btex_fptr; + extern (C) uintptr_t _beginthreadex(void*, uint, btex_fptr, void*, uint, uint*); + + + // + // entry point for Windows threads + // + extern (Windows) uint thread_entryPoint( void* arg ) + { + Thread obj = cast(Thread) arg; + assert( obj ); + scope( exit ) Thread.remove( obj ); + + assert( obj.m_curr is &obj.m_main ); + obj.m_main.bstack = getStackBottom(); + obj.m_main.tstack = obj.m_main.bstack; + Thread.add( &obj.m_main ); + Thread.setThis( obj ); + + // NOTE: No GC allocations may occur until the stack pointers have + // been set and Thread.getThis returns a valid reference to + // this thread object (this latter condition is not strictly + // necessary on Win32 but it should be followed for the sake + // of consistency). + + // TODO: Consider putting an auto exception object here (using + // alloca) forOutOfMemoryError plus something to track + // whether an exception is in-flight? + + try + { + obj.run(); + } + catch( Object o ) + { + obj.m_unhandled = o; + } + return 0; + } + + + // + // copy of the same-named function in phobos.std.thread--it uses the + // Windows naming convention to be consistent with GetCurrentThreadId + // + HANDLE GetCurrentThreadHandle() + { + const uint DUPLICATE_SAME_ACCESS = 0x00000002; + + HANDLE curr = GetCurrentThread(), + proc = GetCurrentProcess(), + hndl; + + DuplicateHandle( proc, curr, proc, &hndl, 0, TRUE, DUPLICATE_SAME_ACCESS ); + return hndl; + } + } +} +else version( Posix ) +{ + private + { + import tango.stdc.posix.semaphore; + import tango.stdc.posix.pthread; + import tango.stdc.posix.signal; + import tango.stdc.posix.time; + import tango.stdc.errno; + + extern (C) int getErrno(); + + version( GNU ) + { + import gcc.builtins; + } + + + // + // entry point for POSIX threads + // + extern (C) void* thread_entryPoint( void* arg ) + { + Thread obj = cast(Thread) arg; + assert( obj ); + scope( exit ) + { + // NOTE: isRunning should be set to false after the thread is + // removed or a double-removal could occur between this + // function and thread_suspendAll. + Thread.remove( obj ); + obj.m_isRunning = false; + } + + static extern (C) void thread_cleanupHandler( void* arg ) + { + Thread obj = cast(Thread) arg; + assert( obj ); + + // NOTE: If the thread terminated abnormally, just set it as + // not running and let thread_suspendAll remove it from + // the thread list. This is safer and is consistent + // with the Windows thread code. + obj.m_isRunning = false; + } + + // NOTE: Using void to skip the initialization here relies on + // knowledge of how pthread_cleanup is implemented. It may + // not be appropriate for all platforms. However, it does + // avoid the need to link the pthread module. If any + // implementation actually requires default initialization + // then pthread_cleanup should be restructured to maintain + // the current lack of a link dependency. + pthread_cleanup cleanup = void; + cleanup.push( &thread_cleanupHandler, cast(void*) obj ); + + // NOTE: For some reason this does not always work for threads. + //obj.m_main.bstack = getStackBottom(); + version( D_InlineAsm_X86 ) + { + static void* getBasePtr() + { + asm + { + naked; + mov EAX, EBP; + ret; + } + } + + obj.m_main.bstack = getBasePtr(); + } + else version( StackGrowsDown ) + obj.m_main.bstack = &obj + 1; + else + obj.m_main.bstack = &obj; + obj.m_main.tstack = obj.m_main.bstack; + assert( obj.m_curr == &obj.m_main ); + Thread.add( &obj.m_main ); + Thread.setThis( obj ); + + // NOTE: No GC allocations may occur until the stack pointers have + // been set and Thread.getThis returns a valid reference to + // this thread object (this latter condition is not strictly + // necessary on Win32 but it should be followed for the sake + // of consistency). + + // TODO: Consider putting an auto exception object here (using + // alloca) forOutOfMemoryError plus something to track + // whether an exception is in-flight? + + try + { + obj.run(); + } + catch( Object o ) + { + obj.m_unhandled = o; + } + return null; + } + + + // + // used to track the number of suspended threads + // + sem_t suspendCount; + + + extern (C) void thread_suspendHandler( int sig ) + in + { + assert( sig == SIGUSR1 ); + } + body + { + version( D_InlineAsm_X86 ) + { + asm + { + pushad; + } + } + else version( GNU ) + { + __builtin_unwind_init(); + } + else version( LLVMDC ) + { + // TODO below as well + } + else + { + static assert( false, "Architecture not supported." ); + } + + // NOTE: Since registers are being pushed and popped from the stack, + // any other stack data used by this function should be gone + // before the stack cleanup code is called below. + { + Thread obj = Thread.getThis(); + + // NOTE: The thread reference returned by getThis is set within + // the thread startup code, so it is possible that this + // handler may be called before the reference is set. In + // this case it is safe to simply suspend and not worry + // about the stack pointers as the thread will not have + // any references to GC-managed data. + if( obj && !obj.m_lock ) + { + obj.m_curr.tstack = getStackTop(); + } + + sigset_t sigres = void; + int status; + + status = sigfillset( &sigres ); + assert( status == 0 ); + + status = sigdelset( &sigres, SIGUSR2 ); + assert( status == 0 ); + + status = sem_post( &suspendCount ); + assert( status == 0 ); + + sigsuspend( &sigres ); + + if( obj && !obj.m_lock ) + { + obj.m_curr.tstack = obj.m_curr.bstack; + } + } + + version( D_InlineAsm_X86 ) + { + asm + { + popad; + } + } + else version( GNU ) + { + // registers will be popped automatically + } + else version( LLVMDC ) + { + // TODO + } + else + { + static assert( false, "Architecture not supported." ); + } + } + + + extern (C) void thread_resumeHandler( int sig ) + in + { + assert( sig == SIGUSR2 ); + } + body + { + + } + } +} +else +{ + // NOTE: This is the only place threading versions are checked. If a new + // version is added, the module code will need to be searched for + // places where version-specific code may be required. This can be + // easily accomlished by searching for 'Windows' or 'Posix'. + static assert( false, "Unknown threading implementation." ); +} + + +//////////////////////////////////////////////////////////////////////////////// +// Thread +//////////////////////////////////////////////////////////////////////////////// + + +/** + * This class encapsulates all threading functionality for the D + * programming language. As thread manipulation is a required facility + * for garbage collection, all user threads should derive from this + * class, and instances of this class should never be explicitly deleted. + * A new thread may be created using either derivation or composition, as + * in the following example. + * + * Example: + * ----------------------------------------------------------------------------- + * + * class DerivedThread : Thread + * { + * this() + * { + * super( &run ); + * } + * + * private : + * void run() + * { + * printf( "Derived thread running.\n" ); + * } + * } + * + * void threadFunc() + * { + * printf( "Composed thread running.\n" ); + * } + * + * // create instances of each type + * Thread derived = new DerivedThread(); + * Thread composed = new Thread( &threadFunc ); + * + * // start both threads + * derived.start(); + * composed.start(); + * + * ----------------------------------------------------------------------------- + */ +class Thread +{ + //////////////////////////////////////////////////////////////////////////// + // Initialization + //////////////////////////////////////////////////////////////////////////// + + + /** + * Initializes a thread object which is associated with a static + * D function. + * + * Params: + * fn = The thread function. + * sz = The stack size for this thread. + * + * In: + * fn must not be null. + */ + this( void function() fn, size_t sz = 0 ) + in + { + assert( fn ); + } + body + { + m_fn = fn; + m_sz = sz; + m_call = Call.FN; + m_curr = &m_main; + } + + + /** + * Initializes a thread object which is associated with a dynamic + * D function. + * + * Params: + * dg = The thread function. + * sz = The stack size for this thread. + * + * In: + * dg must not be null. + */ + this( void delegate() dg, size_t sz = 0 ) + in + { + assert( dg ); + } + body + { + m_dg = dg; + m_sz = sz; + m_call = Call.DG; + m_curr = &m_main; + } + + + /** + * Cleans up any remaining resources used by this object. + */ + ~this() + { + if( m_addr == m_addr.init ) + { + return; + } + + version( Win32 ) + { + m_addr = m_addr.init; + CloseHandle( m_hndl ); + m_hndl = m_hndl.init; + } + else version( Posix ) + { + pthread_detach( m_addr ); + m_addr = m_addr.init; + } + } + + + //////////////////////////////////////////////////////////////////////////// + // General Actions + //////////////////////////////////////////////////////////////////////////// + + + /** + * Starts the thread and invokes the function or delegate passed upon + * construction. + * + * In: + * This routine may only be called once per thread instance. + * + * Throws: + * ThreadException if the thread fails to start. + */ + final void start() + in + { + assert( !next && !prev ); + } + body + { + version( Win32 ) {} else + version( Posix ) + { + pthread_attr_t attr; + + if( pthread_attr_init( &attr ) ) + throw new ThreadException( "Error initializing thread attributes" ); + if( m_sz && pthread_attr_setstacksize( &attr, m_sz ) ) + throw new ThreadException( "Error initializing thread stack size" ); + } + + // NOTE: This operation needs to be synchronized to avoid a race + // condition with the GC. Without this lock, the thread + // could start and allocate memory before being added to + // the global thread list, preventing it from being scanned + // and causing memory to be collected that is still in use. + synchronized( slock ) + { + version( Win32 ) + { + m_hndl = cast(HANDLE) _beginthreadex( null, m_sz, &thread_entryPoint, cast(void*) this, 0, &m_addr ); + if( cast(size_t) m_hndl == 0 ) + throw new ThreadException( "Error creating thread" ); + } + else version( Posix ) + { + m_isRunning = true; + scope( failure ) m_isRunning = false; + + if( pthread_create( &m_addr, &attr, &thread_entryPoint, cast(void*) this ) != 0 ) + throw new ThreadException( "Error creating thread" ); + } + multiThreadedFlag = true; + add( this ); + } + } + + + /** + * Waits for this thread to complete. If the thread terminated as the + * result of an unhandled exception, this exception will be rethrown. + * + * Params: + * rethrow = Rethrow any unhandled exception which may have caused this + * thread to terminate. + * + * Throws: + * ThreadException if the operation fails. + * Any exception not handled by the joined thread. + */ + final void join( bool rethrow = true ) + { + version( Win32 ) + { + if( WaitForSingleObject( m_hndl, INFINITE ) != WAIT_OBJECT_0 ) + throw new ThreadException( "Unable to join thread" ); + // NOTE: m_addr must be cleared before m_hndl is closed to avoid + // a race condition with isRunning. The operation is labeled + // volatile to prevent compiler reordering. + volatile m_addr = m_addr.init; + CloseHandle( m_hndl ); + m_hndl = m_hndl.init; + } + else version( Posix ) + { + if( pthread_join( m_addr, null ) != 0 ) + throw new ThreadException( "Unable to join thread" ); + // NOTE: pthread_join acts as a substitute for pthread_detach, + // which is normally called by the dtor. Setting m_addr + // to zero ensures that pthread_detach will not be called + // on object destruction. + volatile m_addr = m_addr.init; + } + if( rethrow && m_unhandled ) + { + throw m_unhandled; + } + } + + + //////////////////////////////////////////////////////////////////////////// + // General Properties + //////////////////////////////////////////////////////////////////////////// + + + /** + * Gets the user-readable label for this thread. + * + * Returns: + * The name of this thread. + */ + final char[] name() + { + synchronized( this ) + { + return m_name; + } + } + + + /** + * Sets the user-readable label for this thread. + * + * Params: + * val = The new name of this thread. + */ + final void name( char[] val ) + { + synchronized( this ) + { + m_name = val.dup; + } + } + + + /** + * Gets the daemon status for this thread. + * + * Returns: + * true if this is a daemon thread. + */ + final bool isDaemon() + { + synchronized( this ) + { + return m_isDaemon; + } + } + + + /** + * Sets the daemon status for this thread. + * + * Params: + * val = The new daemon status for this thread. + */ + final void isDaemon( bool val ) + { + synchronized( this ) + { + m_isDaemon = val; + } + } + + + /** + * Tests whether this thread is running. + * + * Returns: + * true if the thread is running, false if not. + */ + final bool isRunning() + { + if( m_addr == m_addr.init ) + { + return false; + } + + version( Win32 ) + { + uint ecode = 0; + GetExitCodeThread( m_hndl, &ecode ); + return ecode == STILL_ACTIVE; + } + else version( Posix ) + { + // NOTE: It should be safe to access this value without + // memory barriers because word-tearing and such + // really isn't an issue for boolean values. + return m_isRunning; + } + } + + + //////////////////////////////////////////////////////////////////////////// + // Thread Priority Actions + //////////////////////////////////////////////////////////////////////////// + + + /** + * The minimum scheduling priority that may be set for a thread. On + * systems where multiple scheduling policies are defined, this value + * represents the minimum valid priority for the scheduling policy of + * the process. + */ + static const int PRIORITY_MIN; + + + /** + * The maximum scheduling priority that may be set for a thread. On + * systems where multiple scheduling policies are defined, this value + * represents the minimum valid priority for the scheduling policy of + * the process. + */ + static const int PRIORITY_MAX; + + + /** + * Gets the scheduling priority for the associated thread. + * + * Returns: + * The scheduling priority of this thread. + */ + final int priority() + { + version( Win32 ) + { + return GetThreadPriority( m_hndl ); + } + else version( Posix ) + { + int policy; + sched_param param; + + if( pthread_getschedparam( m_addr, &policy, ¶m ) ) + throw new ThreadException( "Unable to get thread priority" ); + return param.sched_priority; + } + } + + + /** + * Sets the scheduling priority for the associated thread. + * + * Params: + * val = The new scheduling priority of this thread. + */ + final void priority( int val ) + { + version( Win32 ) + { + if( !SetThreadPriority( m_hndl, val ) ) + throw new ThreadException( "Unable to set thread priority" ); + } + else version( Posix ) + { + // NOTE: pthread_setschedprio is not implemented on linux, so use + // the more complicated get/set sequence below. + //if( pthread_setschedprio( m_addr, val ) ) + // throw new ThreadException( "Unable to set thread priority" ); + + int policy; + sched_param param; + + if( pthread_getschedparam( m_addr, &policy, ¶m ) ) + throw new ThreadException( "Unable to set thread priority" ); + param.sched_priority = val; + if( pthread_setschedparam( m_addr, policy, ¶m ) ) + throw new ThreadException( "Unable to set thread priority" ); + } + } + + + //////////////////////////////////////////////////////////////////////////// + // Actions on Calling Thread + //////////////////////////////////////////////////////////////////////////// + + + /** + * Suspends the calling thread for at least the supplied time, up to a + * maximum of (uint.max - 1) milliseconds. + * + * Params: + * period = The minimum duration the calling thread should be suspended, + * in seconds. Sub-second durations are specified as fractional + * values. + * + * In: + * period must be less than (uint.max - 1) milliseconds. + * + * Example: + * ------------------------------------------------------------------------- + * + * Thread.sleep( 0.05 ); // sleep for 50 milliseconds + * Thread.sleep( 5 ); // sleep for 5 seconds + * + * ------------------------------------------------------------------------- + */ + static void sleep( double period ) + in + { + // NOTE: The fractional value added to period is to correct fp error. + assert( period * 1000 + 0.1 < uint.max - 1 ); + } + body + { + version( Win32 ) + { + Sleep( cast(uint)( period * 1000 + 0.1 ) ); + } + else version( Posix ) + { + timespec tin = void; + timespec tout = void; + + period += 0.000_000_000_1; + + if( tin.tv_sec.max < period ) + { + tin.tv_sec = tin.tv_sec.max; + tin.tv_nsec = 0; + } + else + { + tin.tv_sec = cast(typeof(tin.tv_sec)) period; + tin.tv_nsec = cast(typeof(tin.tv_nsec)) ((period % 1.0) * 1_000_000_000); + } + + while( true ) + { + if( !nanosleep( &tin, &tout ) ) + return; + if( getErrno() != EINTR ) + throw new ThreadException( "Unable to sleep for specified duration" ); + tin = tout; + } + } + } + + + /+ + /** + * Suspends the calling thread for at least the supplied time, up to a + * maximum of (uint.max - 1) milliseconds. + * + * Params: + * period = The minimum duration the calling thread should be suspended. + * + * In: + * period must be less than (uint.max - 1) milliseconds. + * + * Example: + * ------------------------------------------------------------------------- + * + * Thread.sleep( TimeSpan.milliseconds( 50 ) ); // sleep for 50 milliseconds + * Thread.sleep( TimeSpan.seconds( 5 ) ); // sleep for 5 seconds + * + * ------------------------------------------------------------------------- + */ + static void sleep( TimeSpan period ) + in + { + assert( period.milliseconds < uint.max - 1 ); + } + body + { + version( Win32 ) + { + Sleep( cast(uint)( period.milliseconds ) ); + } + else version( Posix ) + { + timespec tin = void; + timespec tout = void; + + if( tin.tv_sec.max < period.seconds ) + { + tin.tv_sec = tin.tv_sec.max; + tin.tv_nsec = 0; + } + else + { + tin.tv_sec = cast(typeof(tin.tv_sec)) period.seconds; + tin.tv_nsec = cast(typeof(tin.tv_nsec)) period.nanoseconds % 1_000_000_000; + } + + while( true ) + { + if( !nanosleep( &tin, &tout ) ) + return; + if( getErrno() != EINTR ) + throw new ThreadException( "Unable to sleep for specified duration" ); + tin = tout; + } + } + } + + + /** + * Suspends the calling thread for at least the supplied time, up to a + * maximum of (uint.max - 1) milliseconds. + * + * Params: + * period = The minimum duration the calling thread should be suspended, + * in seconds. Sub-second durations are specified as fractional + * values. Please note that because period is a floating-point + * number, some accuracy may be lost for certain intervals. For + * this reason, the TimeSpan overload is preferred in instances + * where an exact interval is required. + * + * In: + * period must be less than (uint.max - 1) milliseconds. + * + * Example: + * ------------------------------------------------------------------------- + * + * Thread.sleep( 0.05 ); // sleep for 50 milliseconds + * Thread.sleep( 5 ); // sleep for 5 seconds + * + * ------------------------------------------------------------------------- + */ + static void sleep( double period ) + { + sleep( TimeSpan.interval( period ) ); + } + +/ + + + /** + * Forces a context switch to occur away from the calling thread. + */ + static void yield() + { + version( Win32 ) + { + // NOTE: Sleep(1) is necessary because Sleep(0) does not give + // lower priority threads any timeslice, so looping on + // Sleep(0) could be resource-intensive in some cases. + Sleep( 1 ); + } + else version( Posix ) + { + sched_yield(); + } + } + + + //////////////////////////////////////////////////////////////////////////// + // Thread Accessors + //////////////////////////////////////////////////////////////////////////// + + + /** + * Provides a reference to the calling thread. + * + * Returns: + * The thread object representing the calling thread. The result of + * deleting this object is undefined. + */ + static Thread getThis() + { + // NOTE: This function may not be called until thread_init has + // completed. See thread_suspendAll for more information + // on why this might occur. + version( Win32 ) + { + return cast(Thread) TlsGetValue( sm_this ); + } + else version( Posix ) + { + return cast(Thread) pthread_getspecific( sm_this ); + } + } + + + /** + * Provides a list of all threads currently being tracked by the system. + * + * Returns: + * An array containing references to all threads currently being + * tracked by the system. The result of deleting any contained + * objects is undefined. + */ + static Thread[] getAll() + { + synchronized( slock ) + { + size_t pos = 0; + Thread[] buf = new Thread[sm_tlen]; + + foreach( Thread t; Thread ) + { + buf[pos++] = t; + } + return buf; + } + } + + + /** + * Operates on all threads currently being tracked by the system. The + * result of deleting any Thread object is undefined. + * + * Params: + * + * dg = The supplied code as a delegate. + * + * Returns: + * Zero if all elemented are visited, nonzero if not. + */ + static int opApply( int delegate( inout Thread ) dg ) + { + synchronized( slock ) + { + int ret = 0; + + for( Thread t = sm_tbeg; t; t = t.next ) + { + ret = dg( t ); + if( ret ) + break; + } + return ret; + } + } + + + //////////////////////////////////////////////////////////////////////////// + // Local Storage Actions + //////////////////////////////////////////////////////////////////////////// + + + /** + * Indicates the number of local storage pointers available at program + * startup. It is recommended that this number be at least 64. + */ + static const uint LOCAL_MAX = 64; + + + /** + * Reserves a local storage pointer for use and initializes this + * location to null for all running threads. + * + * Returns: + * A key representing the array offset of this memory location. + */ + static uint createLocal() + { + synchronized( slock ) + { + foreach( uint key, inout bool set; sm_local ) + { + if( !set ) + { + //foreach( Thread t; sm_tbeg ) Bug in GDC 0.24 SVN (r139) + for( Thread t = sm_tbeg; t; t = t.next ) + { + t.m_local[key] = null; + } + set = true; + return key; + } + } + throw new ThreadException( "No more local storage slots available" ); + } + } + + + /** + * Marks the supplied key as available and sets the associated location + * to null for all running threads. It is assumed that any key passed + * to this function is valid. The result of calling this function for + * a key which is still in use is undefined. + * + * Params: + * key = The key to delete. + */ + static void deleteLocal( uint key ) + { + synchronized( slock ) + { + sm_local[key] = false; + // foreach( Thread t; sm_tbeg ) Bug in GDC 0.24 SVN (r139) + for( Thread t = sm_tbeg; t; t = t.next ) + { + t.m_local[key] = null; + } + } + } + + + /** + * Gets the data associated with the supplied key value. It is assumed + * that any key passed to this function is valid. + * + * Params: + * key = The location which holds the desired data. + * + * Returns: + * The data associated with the supplied key. + */ + static void* getLocal( uint key ) + { + return getThis().m_local[key]; + } + + + /** + * Stores the supplied value in the specified location. It is assumed + * that any key passed to this function is valid. + * + * Params: + * key = The location to store the supplied data. + * val = The data to store. + * + * Returns: + * A copy of the data which has just been stored. + */ + static void* setLocal( uint key, void* val ) + { + return getThis().m_local[key] = val; + } + + + //////////////////////////////////////////////////////////////////////////// + // Static Initalizer + //////////////////////////////////////////////////////////////////////////// + + + /** + * This initializer is used to set thread constants. All functional + * initialization occurs within thread_init(). + */ + static this() + { + version( Win32 ) + { + PRIORITY_MIN = -15; + PRIORITY_MAX = 15; + } + else version( Posix ) + { + int policy; + sched_param param; + pthread_t self = pthread_self(); + + int status = pthread_getschedparam( self, &policy, ¶m ); + assert( status == 0 ); + + PRIORITY_MIN = sched_get_priority_min( policy ); + assert( PRIORITY_MIN != -1 ); + + PRIORITY_MAX = sched_get_priority_max( policy ); + assert( PRIORITY_MAX != -1 ); + } + } + + +private: + // + // Initializes a thread object which has no associated executable function. + // This is used for the main thread initialized in thread_init(). + // + this() + { + m_call = Call.NO; + m_curr = &m_main; + } + + + // + // Thread entry point. Invokes the function or delegate passed on + // construction (if any). + // + final void run() + { + switch( m_call ) + { + case Call.FN: + m_fn(); + break; + case Call.DG: + m_dg(); + break; + default: + break; + } + } + + +private: + // + // The type of routine passed on thread construction. + // + enum Call + { + NO, + FN, + DG + } + + + // + // Standard types + // + version( Win32 ) + { + alias uint TLSKey; + alias uint ThreadAddr; + } + else version( Posix ) + { + alias pthread_key_t TLSKey; + alias pthread_t ThreadAddr; + } + + + // + // Local storage + // + static bool[LOCAL_MAX] sm_local; + static TLSKey sm_this; + + void*[LOCAL_MAX] m_local; + + + // + // Standard thread data + // + version( Win32 ) + { + HANDLE m_hndl; + } + ThreadAddr m_addr; + Call m_call; + char[] m_name; + union + { + void function() m_fn; + void delegate() m_dg; + } + size_t m_sz; + version( Posix ) + { + bool m_isRunning; + } + bool m_isDaemon; + Object m_unhandled; + + +private: + //////////////////////////////////////////////////////////////////////////// + // Storage of Active Thread + //////////////////////////////////////////////////////////////////////////// + + + // + // Sets a thread-local reference to the current thread object. + // + static void setThis( Thread t ) + { + version( Win32 ) + { + TlsSetValue( sm_this, cast(void*) t ); + } + else version( Posix ) + { + pthread_setspecific( sm_this, cast(void*) t ); + } + } + + +private: + //////////////////////////////////////////////////////////////////////////// + // Thread Context and GC Scanning Support + //////////////////////////////////////////////////////////////////////////// + + + final void pushContext( Context* c ) + in + { + assert( !c.within ); + } + body + { + c.within = m_curr; + m_curr = c; + } + + + final void popContext() + in + { + assert( m_curr && m_curr.within ); + } + body + { + Context* c = m_curr; + m_curr = c.within; + c.within = null; + } + + + final Context* topContext() + in + { + assert( m_curr ); + } + body + { + return m_curr; + } + + + static struct Context + { + void* bstack, + tstack; + Context* within; + Context* next, + prev; + } + + + Context m_main; + Context* m_curr; + bool m_lock; + + version( Win32 ) + { + uint[8] m_reg; // edi,esi,ebp,esp,ebx,edx,ecx,eax + } + + +private: + //////////////////////////////////////////////////////////////////////////// + // GC Scanning Support + //////////////////////////////////////////////////////////////////////////// + + + // NOTE: The GC scanning process works like so: + // + // 1. Suspend all threads. + // 2. Scan the stacks of all suspended threads for roots. + // 3. Resume all threads. + // + // Step 1 and 3 require a list of all threads in the system, while + // step 2 requires a list of all thread stacks (each represented by + // a Context struct). Traditionally, there was one stack per thread + // and the Context structs were not necessary. However, Fibers have + // changed things so that each thread has its own 'main' stack plus + // an arbitrary number of nested stacks (normally referenced via + // m_curr). Also, there may be 'free-floating' stacks in the system, + // which are Fibers that are not currently executing on any specific + // thread but are still being processed and still contain valid + // roots. + // + // To support all of this, the Context struct has been created to + // represent a stack range, and a global list of Context structs has + // been added to enable scanning of these stack ranges. The lifetime + // (and presence in the Context list) of a thread's 'main' stack will + // be equivalent to the thread's lifetime. So the Ccontext will be + // added to the list on thread entry, and removed from the list on + // thread exit (which is essentially the same as the presence of a + // Thread object in its own global list). The lifetime of a Fiber's + // context, however, will be tied to the lifetime of the Fiber object + // itself, and Fibers are expected to add/remove their Context struct + // on construction/deletion. + + + // + // All use of the global lists should synchronize on this lock. + // + static Object slock() + { + return Thread.classinfo; + } + + + static Context* sm_cbeg; + static size_t sm_clen; + + static Thread sm_tbeg; + static size_t sm_tlen; + + // + // Used for ordering threads in the global thread list. + // + Thread prev; + Thread next; + + + //////////////////////////////////////////////////////////////////////////// + // Global Context List Operations + //////////////////////////////////////////////////////////////////////////// + + + // + // Add a context to the global context list. + // + static void add( Context* c ) + in + { + assert( c ); + assert( !c.next && !c.prev ); + } + body + { + synchronized( slock ) + { + if( sm_cbeg ) + { + c.next = sm_cbeg; + sm_cbeg.prev = c; + } + sm_cbeg = c; + ++sm_clen; + } + } + + + // + // Remove a context from the global context list. + // + static void remove( Context* c ) + in + { + assert( c ); + assert( c.next || c.prev ); + } + body + { + synchronized( slock ) + { + if( c.prev ) + c.prev.next = c.next; + if( c.next ) + c.next.prev = c.prev; + if( sm_cbeg == c ) + sm_cbeg = c.next; + --sm_clen; + } + // NOTE: Don't null out c.next or c.prev because opApply currently + // follows c.next after removing a node. This could be easily + // addressed by simply returning the next node from this function, + // however, a context should never be re-added to the list anyway + // and having next and prev be non-null is a good way to + // ensure that. + } + + + //////////////////////////////////////////////////////////////////////////// + // Global Thread List Operations + //////////////////////////////////////////////////////////////////////////// + + + // + // Add a thread to the global thread list. + // + static void add( Thread t ) + in + { + assert( t ); + assert( !t.next && !t.prev ); + assert( t.isRunning ); + } + body + { + synchronized( slock ) + { + if( sm_tbeg ) + { + t.next = sm_tbeg; + sm_tbeg.prev = t; + } + sm_tbeg = t; + ++sm_tlen; + } + } + + + // + // Remove a thread from the global thread list. + // + static void remove( Thread t ) + in + { + assert( t ); + assert( t.next || t.prev ); + version( Win32 ) + { + // NOTE: This doesn't work for Posix as m_isRunning must be set to + // false after the thread is removed during normal execution. + assert( !t.isRunning ); + } + } + body + { + synchronized( slock ) + { + // NOTE: When a thread is removed from the global thread list its + // main context is invalid and should be removed as well. + // It is possible that t.m_curr could reference more + // than just the main context if the thread exited abnormally + // (if it was terminated), but we must assume that the user + // retains a reference to them and that they may be re-used + // elsewhere. Therefore, it is the responsibility of any + // object that creates contexts to clean them up properly + // when it is done with them. + remove( &t.m_main ); + + if( t.prev ) + t.prev.next = t.next; + if( t.next ) + t.next.prev = t.prev; + if( sm_tbeg == t ) + sm_tbeg = t.next; + --sm_tlen; + } + // NOTE: Don't null out t.next or t.prev because opApply currently + // follows t.next after removing a node. This could be easily + // addressed by simply returning the next node from this function, + // however, a thread should never be re-added to the list anyway + // and having next and prev be non-null is a good way to + // ensure that. + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// GC Support Routines +//////////////////////////////////////////////////////////////////////////////// + + +/** + * Initializes the thread module. This function must be called by the + * garbage collector on startup and before any other thread routines + * are called. + */ +extern (C) void thread_init() +{ + // NOTE: If thread_init itself performs any allocations then the thread + // routines reserved for garbage collector use may be called while + // thread_init is being processed. However, since no memory should + // exist to be scanned at this point, it is sufficient for these + // functions to detect the condition and return immediately. + + version( Win32 ) + { + Thread.sm_this = TlsAlloc(); + assert( Thread.sm_this != TLS_OUT_OF_INDEXES ); + } + else version( Posix ) + { + int status; + sigaction_t sigusr1 = void; + sigaction_t sigusr2 = void; + + // This is a quick way to zero-initialize the structs without using + // memset or creating a link dependency on their static initializer. + (cast(byte*) &sigusr1)[0 .. sigaction_t.sizeof] = 0; + (cast(byte*) &sigusr2)[0 .. sigaction_t.sizeof] = 0; + + // NOTE: SA_RESTART indicates that system calls should restart if they + // are interrupted by a signal, but this is not available on all + // Posix systems, even those that support multithreading. + static if( is( typeof( SA_RESTART ) ) ) + sigusr1.sa_flags = SA_RESTART; + else + sigusr1.sa_flags = 0; + sigusr1.sa_handler = &thread_suspendHandler; + // NOTE: We want to ignore all signals while in this handler, so fill + // sa_mask to indicate this. + status = sigfillset( &sigusr1.sa_mask ); + assert( status == 0 ); + + // NOTE: Since SIGUSR2 should only be issued for threads within the + // suspend handler, we don't want this signal to trigger a + // restart. + sigusr2.sa_flags = 0; + sigusr2.sa_handler = &thread_resumeHandler; + // NOTE: We want to ignore all signals while in this handler, so fill + // sa_mask to indicate this. + status = sigfillset( &sigusr2.sa_mask ); + assert( status == 0 ); + + status = sigaction( SIGUSR1, &sigusr1, null ); + assert( status == 0 ); + + status = sigaction( SIGUSR2, &sigusr2, null ); + assert( status == 0 ); + + status = sem_init( &suspendCount, 0, 0 ); + assert( status == 0 ); + + status = pthread_key_create( &Thread.sm_this, null ); + assert( status == 0 ); + } + + thread_attachThis(); +} + + +/** + * Registers the calling thread for use with Tango. If this routine is called + * for a thread which is already registered, the result is undefined. + */ +extern (C) void thread_attachThis() +{ + version( Win32 ) + { + Thread thisThread = new Thread(); + Thread.Context* thisContext = &thisThread.m_main; + assert( thisContext == thisThread.m_curr ); + + thisThread.m_addr = GetCurrentThreadId(); + thisThread.m_hndl = GetCurrentThreadHandle(); + thisContext.bstack = getStackBottom(); + thisContext.tstack = thisContext.bstack; + + thisThread.m_isDaemon = true; + + Thread.setThis( thisThread ); + } + else version( Posix ) + { + Thread thisThread = new Thread(); + Thread.Context* thisContext = thisThread.m_curr; + assert( thisContext == &thisThread.m_main ); + + thisThread.m_addr = pthread_self(); + thisContext.bstack = getStackBottom(); + thisContext.tstack = thisContext.bstack; + + thisThread.m_isRunning = true; + thisThread.m_isDaemon = true; + + Thread.setThis( thisThread ); + } + + Thread.add( thisThread ); + Thread.add( thisContext ); +} + + +/** + * Deregisters the calling thread from use with Tango. If this routine is + * called for a thread which is already registered, the result is undefined. + */ +extern (C) void thread_detachThis() +{ + Thread.remove( Thread.getThis() ); +} + + +/** + * Joins all non-daemon threads that are currently running. This is done by + * performing successive scans through the thread list until a scan consists + * of only daemon threads. + */ +extern (C) void thread_joinAll() +{ + + while( true ) + { + Thread nonDaemon = null; + + foreach( t; Thread ) + { + if( !t.isDaemon ) + { + nonDaemon = t; + break; + } + } + if( nonDaemon is null ) + return; + nonDaemon.join(); + } +} + + +/** + * Performs intermediate shutdown of the thread module. + */ +static ~this() +{ + // NOTE: The functionality related to garbage collection must be minimally + // operable after this dtor completes. Therefore, only minimal + // cleanup may occur. + + for( Thread t = Thread.sm_tbeg; t; t = t.next ) + { + if( !t.isRunning ) + Thread.remove( t ); + } +} + + +// Used for needLock below +private bool multiThreadedFlag = false; + + +/** + * This function is used to determine whether the the process is + * multi-threaded. Optimizations may only be performed on this + * value if the programmer can guarantee that no path from the + * enclosed code will start a thread. + * + * Returns: + * True if Thread.start() has been called in this process. + */ +extern (C) bool thread_needLock() +{ + return multiThreadedFlag; +} + + +// Used for suspendAll/resumeAll below +private uint suspendDepth = 0; + + +/** + * Suspend all threads but the calling thread for "stop the world" garbage + * collection runs. This function may be called multiple times, and must + * be followed by a matching number of calls to thread_resumeAll before + * processing is resumed. + * + * Throws: + * ThreadException if the suspend operation fails for a running thread. + */ +extern (C) void thread_suspendAll() +{ + /** + * Suspend the specified thread and load stack and register information for + * use by thread_scanAll. If the supplied thread is the calling thread, + * stack and register information will be loaded but the thread will not + * be suspended. If the suspend operation fails and the thread is not + * running then it will be removed from the global thread list, otherwise + * an exception will be thrown. + * + * Params: + * t = The thread to suspend. + * + * Throws: + * ThreadException if the suspend operation fails for a running thread. + */ + void suspend( Thread t ) + { + version( Win32 ) + { + if( t.m_addr != GetCurrentThreadId() && SuspendThread( t.m_hndl ) == 0xFFFFFFFF ) + { + if( !t.isRunning ) + { + Thread.remove( t ); + return; + } + throw new ThreadException( "Unable to suspend thread" ); + } + + CONTEXT context = void; + context.ContextFlags = CONTEXT_INTEGER | CONTEXT_CONTROL; + + if( !GetThreadContext( t.m_hndl, &context ) ) + throw new ThreadException( "Unable to load thread context" ); + if( !t.m_lock ) + t.m_curr.tstack = cast(void*) context.Esp; + // edi,esi,ebp,esp,ebx,edx,ecx,eax + t.m_reg[0] = context.Edi; + t.m_reg[1] = context.Esi; + t.m_reg[2] = context.Ebp; + t.m_reg[3] = context.Esp; + t.m_reg[4] = context.Ebx; + t.m_reg[5] = context.Edx; + t.m_reg[6] = context.Ecx; + t.m_reg[7] = context.Eax; + } + else version( Posix ) + { + if( t.m_addr != pthread_self() ) + { + if( pthread_kill( t.m_addr, SIGUSR1 ) != 0 ) + { + if( !t.isRunning ) + { + Thread.remove( t ); + return; + } + throw new ThreadException( "Unable to suspend thread" ); + } + // NOTE: It's really not ideal to wait for each thread to signal + // individually -- rather, it would be better to suspend + // them all and wait once at the end. However, semaphores + // don't really work this way, and the obvious alternative + // (looping on an atomic suspend count) requires either + // the atomic module (which only works on x86) or other + // specialized functionality. It would also be possible + // to simply loop on sem_wait at the end, but I'm not + // convinced that this would be much faster than the + // current approach. + sem_wait( &suspendCount ); + } + else if( !t.m_lock ) + { + t.m_curr.tstack = getStackTop(); + } + } + } + + + // NOTE: We've got an odd chicken & egg problem here, because while the GC + // is required to call thread_init before calling any other thread + // routines, thread_init may allocate memory which could in turn + // trigger a collection. Thus, thread_suspendAll, thread_scanAll, + // and thread_resumeAll must be callable before thread_init completes, + // with the assumption that no other GC memory has yet been allocated + // by the system, and thus there is no risk of losing data if the + // global thread list is empty. The check of Thread.sm_tbeg + // below is done to ensure thread_init has completed, and therefore + // that calling Thread.getThis will not result in an error. For the + // short time when Thread.sm_tbeg is null, there is no reason + // not to simply call the multithreaded code below, with the + // expectation that the foreach loop will never be entered. + if( !multiThreadedFlag && Thread.sm_tbeg ) + { + if( ++suspendDepth == 1 ) + suspend( Thread.getThis() ); + return; + } + synchronized( Thread.slock ) + { + if( ++suspendDepth > 1 ) + return; + + // NOTE: I'd really prefer not to check isRunning within this loop but + // not doing so could be problematic if threads are termianted + // abnormally and a new thread is created with the same thread + // address before the next GC run. This situation might cause + // the same thread to be suspended twice, which would likely + // cause the second suspend to fail, the garbage collection to + // abort, and Bad Things to occur. + for( Thread t = Thread.sm_tbeg; t; t = t.next ) + { + if( t.isRunning ) + suspend( t ); + else + Thread.remove( t ); + } + + version( Posix ) + { + // wait on semaphore -- see note in suspend for + // why this is currently not implemented + } + } +} + + +/** + * Resume all threads but the calling thread for "stop the world" garbage + * collection runs. This function must be called once for each preceding + * call to thread_suspendAll before the threads are actually resumed. + * + * In: + * This routine must be preceded by a call to thread_suspendAll. + * + * Throws: + * ThreadException if the resume operation fails for a running thread. + */ +extern (C) void thread_resumeAll() +in +{ + assert( suspendDepth > 0 ); +} +body +{ + /** + * Resume the specified thread and unload stack and register information. + * If the supplied thread is the calling thread, stack and register + * information will be unloaded but the thread will not be resumed. If + * the resume operation fails and the thread is not running then it will + * be removed from the global thread list, otherwise an exception will be + * thrown. + * + * Params: + * t = The thread to resume. + * + * Throws: + * ThreadException if the resume fails for a running thread. + */ + void resume( Thread t ) + { + version( Win32 ) + { + if( t.m_addr != GetCurrentThreadId() && ResumeThread( t.m_hndl ) == 0xFFFFFFFF ) + { + if( !t.isRunning ) + { + Thread.remove( t ); + return; + } + throw new ThreadException( "Unable to resume thread" ); + } + + if( !t.m_lock ) + t.m_curr.tstack = t.m_curr.bstack; + t.m_reg[0 .. $] = 0; + } + else version( Posix ) + { + if( t.m_addr != pthread_self() ) + { + if( pthread_kill( t.m_addr, SIGUSR2 ) != 0 ) + { + if( !t.isRunning ) + { + Thread.remove( t ); + return; + } + throw new ThreadException( "Unable to resume thread" ); + } + } + else if( !t.m_lock ) + { + t.m_curr.tstack = t.m_curr.bstack; + } + } + } + + + // NOTE: See thread_suspendAll for the logic behind this. + if( !multiThreadedFlag && Thread.sm_tbeg ) + { + if( --suspendDepth == 0 ) + resume( Thread.getThis() ); + return; + } + synchronized( Thread.slock ) + { + if( --suspendDepth > 0 ) + return; + + for( Thread t = Thread.sm_tbeg; t; t = t.next ) + { + resume( t ); + } + } +} + + +private alias void delegate( void*, void* ) scanAllThreadsFn; + + +/** + * The main entry point for garbage collection. The supplied delegate + * will be passed ranges representing both stack and register values. + * + * Params: + * scan = The scanner function. It should scan from p1 through p2 - 1. + * curStackTop = An optional pointer to the top of the calling thread's stack. + * + * In: + * This routine must be preceded by a call to thread_suspendAll. + */ +extern (C) void thread_scanAll( scanAllThreadsFn scan, void* curStackTop = null ) +in +{ + assert( suspendDepth > 0 ); +} +body +{ + Thread thisThread = null; + void* oldStackTop = null; + + if( curStackTop && Thread.sm_tbeg ) + { + thisThread = Thread.getThis(); + if( !thisThread.m_lock ) + { + oldStackTop = thisThread.m_curr.tstack; + thisThread.m_curr.tstack = curStackTop; + } + } + + scope( exit ) + { + if( curStackTop && Thread.sm_tbeg ) + { + if( !thisThread.m_lock ) + { + thisThread.m_curr.tstack = oldStackTop; + } + } + } + + // NOTE: Synchronizing on Thread.slock is not needed because this + // function may only be called after all other threads have + // been suspended from within the same lock. + for( Thread.Context* c = Thread.sm_cbeg; c; c = c.next ) + { + version( StackGrowsDown ) + { + // NOTE: We can't index past the bottom of the stack + // so don't do the "+1" for StackGrowsDown. + if( c.tstack && c.tstack < c.bstack ) + scan( c.tstack, c.bstack ); + } + else + { + if( c.bstack && c.bstack < c.tstack ) + scan( c.bstack, c.tstack + 1 ); + } + } + version( Win32 ) + { + for( Thread t = Thread.sm_tbeg; t; t = t.next ) + { + scan( &t.m_reg[0], &t.m_reg[0] + t.m_reg.length ); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Thread Local +//////////////////////////////////////////////////////////////////////////////// + + +/** + * This class encapsulates the operations required to initialize, access, and + * destroy thread local data. + */ +class ThreadLocal( T ) +{ + //////////////////////////////////////////////////////////////////////////// + // Initialization + //////////////////////////////////////////////////////////////////////////// + + + /** + * Initializes thread local storage for the indicated value which will be + * initialized to def for all threads. + * + * Params: + * def = The default value to return if no value has been explicitly set. + */ + this( T def = T.init ) + { + m_def = def; + m_key = Thread.createLocal(); + } + + + ~this() + { + Thread.deleteLocal( m_key ); + } + + + //////////////////////////////////////////////////////////////////////////// + // Accessors + //////////////////////////////////////////////////////////////////////////// + + + /** + * Gets the value last set by the calling thread, or def if no such value + * has been set. + * + * Returns: + * The stored value or def if no value is stored. + */ + T val() + { + Wrap* wrap = cast(Wrap*) Thread.getLocal( m_key ); + + return wrap ? wrap.val : m_def; + } + + + /** + * Copies newval to a location specific to the calling thread, and returns + * newval. + * + * Params: + * newval = The value to set. + * + * Returns: + * The value passed to this function. + */ + T val( T newval ) + { + Wrap* wrap = cast(Wrap*) Thread.getLocal( m_key ); + + if( wrap is null ) + { + wrap = new Wrap; + Thread.setLocal( m_key, wrap ); + } + wrap.val = newval; + return newval; + } + + +private: + // + // A wrapper for the stored data. This is needed for determining whether + // set has ever been called for this thread (and therefore whether the + // default value should be returned) and also to flatten the differences + // between data that is smaller and larger than (void*).sizeof. The + // obvious tradeoff here is an extra per-thread allocation for each + // ThreadLocal value as compared to calling the Thread routines directly. + // + struct Wrap + { + T val; + } + + + T m_def; + uint m_key; +} + + +//////////////////////////////////////////////////////////////////////////////// +// Thread Group +//////////////////////////////////////////////////////////////////////////////// + + +/** + * This class is intended to simplify certain common programming techniques. + */ +class ThreadGroup +{ + /** + * Creates and starts a new Thread object that executes fn and adds it to + * the list of tracked threads. + * + * Params: + * fn = The thread function. + * + * Returns: + * A reference to the newly created thread. + */ + final Thread create( void function() fn ) + { + Thread t = new Thread( fn ); + + t.start(); + synchronized + { + m_all[t] = t; + } + return t; + } + + + /** + * Creates and starts a new Thread object that executes dg and adds it to + * the list of tracked threads. + * + * Params: + * dg = The thread function. + * + * Returns: + * A reference to the newly created thread. + */ + final Thread create( void delegate() dg ) + { + Thread t = new Thread( dg ); + + t.start(); + synchronized + { + m_all[t] = t; + } + return t; + } + + + /** + * Add t to the list of tracked threads if it is not already being tracked. + * + * Params: + * t = The thread to add. + * + * In: + * t must not be null. + */ + final void add( Thread t ) + in + { + assert( t ); + } + body + { + synchronized + { + m_all[t] = t; + } + } + + + /** + * Removes t from the list of tracked threads. No operation will be + * performed if t is not currently being tracked by this object. + * + * Params: + * t = The thread to remove. + * + * In: + * t must not be null. + */ + final void remove( Thread t ) + in + { + assert( t ); + } + body + { + synchronized + { + m_all.remove( t ); + } + } + + + /** + * Operates on all threads currently tracked by this object. + */ + final int opApply( int delegate( inout Thread ) dg ) + { + synchronized + { + int ret = 0; + + // NOTE: This loop relies on the knowledge that m_all uses the + // Thread object for both the key and the mapped value. + foreach( Thread t; m_all.keys ) + { + ret = dg( t ); + if( ret ) + break; + } + return ret; + } + } + + + /** + * Iteratively joins all tracked threads. This function will block add, + * remove, and opApply until it completes. + * + * Params: + * rethrow = Rethrow any unhandled exception which may have caused the + * current thread to terminate. + * + * Throws: + * Any exception not handled by the joined threads. + */ + final void joinAll( bool rethrow = true ) + { + synchronized + { + // NOTE: This loop relies on the knowledge that m_all uses the + // Thread object for both the key and the mapped value. + foreach( Thread t; m_all.keys ) + { + t.join( rethrow ); + } + } + } + + +private: + Thread[Thread] m_all; +} + + +//////////////////////////////////////////////////////////////////////////////// +// Fiber Platform Detection and Memory Allocation +//////////////////////////////////////////////////////////////////////////////// + + +private +{ + version( D_InlineAsm_X86 ) + { + version( X86_64 ) + { + + } + else + { + version( Win32 ) + version = AsmX86_Win32; + else version( Posix ) + version = AsmX86_Posix; + } + } + else version( PPC ) + { + version( Posix ) + version = AsmPPC_Posix; + } + + + version( Posix ) + { + import tango.stdc.posix.unistd; // for sysconf + import tango.stdc.posix.sys.mman; // for mmap + import tango.stdc.posix.stdlib; // for malloc, valloc, free + + version( AsmX86_Win32 ) {} else + version( AsmX86_Posix ) {} else + version( AsmPPC_Posix ) {} else + { + // NOTE: The ucontext implementation requires architecture specific + // data definitions to operate so testing for it must be done + // by checking for the existence of ucontext_t rather than by + // a version identifier. Please note that this is considered + // an obsolescent feature according to the POSIX spec, so a + // custom solution is still preferred. + import tango.stdc.posix.ucontext; + } + } + + const size_t PAGESIZE; +} + + +static this() +{ + static if( is( typeof( GetSystemInfo ) ) ) + { + SYSTEM_INFO info; + GetSystemInfo( &info ); + + PAGESIZE = info.dwPageSize; + assert( PAGESIZE < int.max ); + } + else static if( is( typeof( sysconf ) ) && + is( typeof( _SC_PAGESIZE ) ) ) + { + PAGESIZE = cast(typeof(PAGESIZE))sysconf( _SC_PAGESIZE ); + assert( PAGESIZE < int.max ); + } + else + { + version( PPC ) + PAGESIZE = 8192; + else + PAGESIZE = 4096; + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Fiber Entry Point and Context Switch +//////////////////////////////////////////////////////////////////////////////// + + +private +{ + extern (C) void fiber_entryPoint() + { + Fiber obj = Fiber.getThis(); + assert( obj ); + + assert( Thread.getThis().m_curr is obj.m_ctxt ); + volatile Thread.getThis().m_lock = false; + obj.m_ctxt.tstack = obj.m_ctxt.bstack; + obj.m_state = Fiber.State.EXEC; + + try + { + obj.run(); + } + catch( Object o ) + { + obj.m_unhandled = o; + } + + static if( is( typeof( ucontext_t ) ) ) + obj.m_ucur = &obj.m_utxt; + + obj.m_state = Fiber.State.TERM; + obj.switchOut(); + } + + + // NOTE: If AsmPPC_Posix is defined then the context switch routine will + // be defined externally until GDC supports inline PPC ASM. + version( AsmPPC_Posix ) + extern (C) void fiber_switchContext( void** oldp, void* newp ); + else + extern (C) void fiber_switchContext( void** oldp, void* newp ) + { + // NOTE: The data pushed and popped in this routine must match the + // default stack created by Fiber.initStack or the initial + // switch into a new context will fail. + + version( AsmX86_Win32 ) + { + asm + { + naked; + + // save current stack state + push EBP; + mov EBP, ESP; + push EAX; + push dword ptr FS:[0]; + push dword ptr FS:[4]; + push dword ptr FS:[8]; + push EBX; + push ESI; + push EDI; + + // store oldp again with more accurate address + mov EAX, dword ptr 8[EBP]; + mov [EAX], ESP; + // load newp to begin context switch + mov ESP, dword ptr 12[EBP]; + + // load saved state from new stack + pop EDI; + pop ESI; + pop EBX; + pop dword ptr FS:[8]; + pop dword ptr FS:[4]; + pop dword ptr FS:[0]; + pop EAX; + pop EBP; + + // 'return' to complete switch + ret; + } + } + else version( AsmX86_Posix ) + { + asm + { + naked; + + // save current stack state + push EBP; + mov EBP, ESP; + push EAX; + push EBX; + push ESI; + push EDI; + + // store oldp again with more accurate address + mov EAX, dword ptr 8[EBP]; + mov [EAX], ESP; + // load newp to begin context switch + mov ESP, dword ptr 12[EBP]; + + // load saved state from new stack + pop EDI; + pop ESI; + pop EBX; + pop EAX; + pop EBP; + + // 'return' to complete switch + ret; + } + } + else static if( is( typeof( ucontext_t ) ) ) + { + Fiber cfib = Fiber.getThis(); + void* ucur = cfib.m_ucur; + + *oldp = &ucur; + swapcontext( **(cast(ucontext_t***) oldp), + *(cast(ucontext_t**) newp) ); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Fiber +//////////////////////////////////////////////////////////////////////////////// + + +/** + * This class provides a cooperative concurrency mechanism integrated with the + * threading and garbage collection functionality. Calling a fiber may be + * considered a blocking operation that returns when the fiber yields (via + * Fiber.yield()). Execution occurs within the context of the calling thread + * so synchronization is not necessary to guarantee memory visibility so long + * as the same thread calls the fiber each time. Please note that there is no + * requirement that a fiber be bound to one specific thread. Rather, fibers + * may be freely passed between threads so long as they are not currently + * executing. Like threads, a new fiber thread may be created using either + * derivation or composition, as in the following example. + * + * Example: + * ---------------------------------------------------------------------- + * + * class DerivedFiber : Fiber + * { + * this() + * { + * super( &run ); + * } + * + * private : + * void run() + * { + * printf( "Derived fiber running.\n" ); + * } + * } + * + * void fiberFunc() + * { + * printf( "Composed fiber running.\n" ); + * Fiber.yield(); + * printf( "Composed fiber running.\n" ); + * } + * + * // create instances of each type + * Fiber derived = new DerivedFiber(); + * Fiber composed = new Fiber( &fiberFunc ); + * + * // call both fibers once + * derived.call(); + * composed.call(); + * printf( "Execution returned to calling context.\n" ); + * composed.call(); + * + * // since each fiber has run to completion, each should have state TERM + * assert( derived.state == Fiber.State.TERM ); + * assert( composed.state == Fiber.State.TERM ); + * + * ---------------------------------------------------------------------- + * + * Authors: Based on a design by Mikola Lysenko. + */ +class Fiber +{ + //////////////////////////////////////////////////////////////////////////// + // Initialization + //////////////////////////////////////////////////////////////////////////// + + + /** + * Initializes a fiber object which is associated with a static + * D function. + * + * Params: + * fn = The thread function. + * sz = The stack size for this fiber. + * + * In: + * fn must not be null. + */ + this( void function() fn, size_t sz = PAGESIZE ) + in + { + assert( fn ); + } + body + { + m_fn = fn; + m_call = Call.FN; + m_state = State.HOLD; + allocStack( sz ); + initStack(); + } + + + /** + * Initializes a fiber object which is associated with a dynamic + * D function. + * + * Params: + * dg = The thread function. + * sz = The stack size for this fiber. + * + * In: + * dg must not be null. + */ + this( void delegate() dg, size_t sz = PAGESIZE ) + in + { + assert( dg ); + } + body + { + m_dg = dg; + m_call = Call.DG; + m_state = State.HOLD; + allocStack( sz ); + initStack(); + } + + + /** + * Cleans up any remaining resources used by this object. + */ + ~this() + { + // NOTE: A live reference to this object will exist on its associated + // stack from the first time its call() method has been called + // until its execution completes with State.TERM. Thus, the only + // times this dtor should be called are either if the fiber has + // terminated (and therefore has no active stack) or if the user + // explicitly deletes this object. The latter case is an error + // but is not easily tested for, since State.HOLD may imply that + // the fiber was just created but has never been run. There is + // not a compelling case to create a State.INIT just to offer a + // means of ensuring the user isn't violating this object's + // contract, so for now this requirement will be enforced by + // documentation only. + freeStack(); + } + + + //////////////////////////////////////////////////////////////////////////// + // General Actions + //////////////////////////////////////////////////////////////////////////// + + + /** + * Transfers execution to this fiber object. The calling context will be + * suspended until the fiber calls Fiber.yield() or until it terminates + * via an unhandled exception. + * + * Params: + * rethrow = Rethrow any unhandled exception which may have caused this + * fiber to terminate. + * + * In: + * This fiber must be in state HOLD. + * + * Throws: + * Any exception not handled by the joined thread. + */ + final void call( bool rethrow = true ) + in + { + assert( m_state == State.HOLD ); + } + body + { + Fiber cur = getThis(); + + static if( is( typeof( ucontext_t ) ) ) + m_ucur = cur ? &cur.m_utxt : &Fiber.sm_utxt; + + setThis( this ); + this.switchIn(); + setThis( cur ); + + static if( is( typeof( ucontext_t ) ) ) + m_ucur = null; + + // NOTE: If the fiber has terminated then the stack pointers must be + // reset. This ensures that the stack for this fiber is not + // scanned if the fiber has terminated. This is necessary to + // prevent any references lingering on the stack from delaying + // the collection of otherwise dead objects. The most notable + // being the current object, which is referenced at the top of + // fiber_entryPoint. + if( m_state == State.TERM ) + { + m_ctxt.tstack = m_ctxt.bstack; + } + if( m_unhandled ) + { + Object obj = m_unhandled; + m_unhandled = null; + if( rethrow ) + { + throw obj; + } + } + } + + + /** + * Resets this fiber so that it may be re-used. This routine may only be + * called for fibers that have terminated, as doing otherwise could result + * in scope-dependent functionality that is not executed. Stack-based + * classes, for example, may not be cleaned up properly if a fiber is reset + * before it has terminated. + * + * In: + * This fiber must be in state TERM. + */ + final void reset() + in + { + assert( m_state == State.TERM ); + assert( m_ctxt.tstack == m_ctxt.bstack ); + } + body + { + m_state = State.HOLD; + initStack(); + m_unhandled = null; + } + + + //////////////////////////////////////////////////////////////////////////// + // General Properties + //////////////////////////////////////////////////////////////////////////// + + + /** + * A fiber may occupy one of three states: HOLD, EXEC, and TERM. The HOLD + * state applies to any fiber that is suspended and ready to be called. + * The EXEC state will be set for any fiber that is currently executing. + * And the TERM state is set when a fiber terminates. Once a fiber + * terminates, it must be reset before it may be called again. + */ + enum State + { + HOLD, /// + EXEC, /// + TERM /// + } + + + /** + * Gets the current state of this fiber. + * + * Returns: + * The state of this fiber as an enumerated value. + */ + final State state() + { + return m_state; + } + + + //////////////////////////////////////////////////////////////////////////// + // Actions on Calling Fiber + //////////////////////////////////////////////////////////////////////////// + + + /** + * Forces a context switch to occur away from the calling fiber. + */ + static void yield() + { + Fiber cur = getThis(); + assert( cur, "Fiber.yield() called with no active fiber" ); + assert( cur.m_state == State.EXEC ); + + static if( is( typeof( ucontext_t ) ) ) + cur.m_ucur = &cur.m_utxt; + + cur.m_state = State.HOLD; + cur.switchOut(); + cur.m_state = State.EXEC; + } + + + /** + * Forces a context switch to occur away from the calling fiber and then + * throws obj in the calling fiber. + * + * Params: + * obj = The object to throw. + * + * In: + * obj must not be null. + */ + static void yieldAndThrow( Object obj ) + in + { + assert( obj ); + } + body + { + Fiber cur = getThis(); + assert( cur, "Fiber.yield() called with no active fiber" ); + assert( cur.m_state == State.EXEC ); + + static if( is( typeof( ucontext_t ) ) ) + cur.m_ucur = &cur.m_utxt; + + cur.m_unhandled = obj; + cur.m_state = State.HOLD; + cur.switchOut(); + cur.m_state = State.EXEC; + } + + + //////////////////////////////////////////////////////////////////////////// + // Fiber Accessors + //////////////////////////////////////////////////////////////////////////// + + + /** + * Provides a reference to the calling fiber or null if no fiber is + * currently active. + * + * Returns: + * The fiber object representing the calling fiber or null if no fiber + * is currently active. The result of deleting this object is undefined. + */ + static Fiber getThis() + { + version( Win32 ) + { + return cast(Fiber) TlsGetValue( sm_this ); + } + else version( Posix ) + { + return cast(Fiber) pthread_getspecific( sm_this ); + } + } + + + //////////////////////////////////////////////////////////////////////////// + // Static Initialization + //////////////////////////////////////////////////////////////////////////// + + + static this() + { + version( Win32 ) + { + sm_this = TlsAlloc(); + assert( sm_this != TLS_OUT_OF_INDEXES ); + } + else version( Posix ) + { + int status; + + status = pthread_key_create( &sm_this, null ); + assert( status == 0 ); + + static if( is( typeof( ucontext_t ) ) ) + { + status = getcontext( &sm_utxt ); + assert( status == 0 ); + } + } + } + + +private: + // + // Initializes a fiber object which has no associated executable function. + // + this() + { + m_call = Call.NO; + } + + + // + // Fiber entry point. Invokes the function or delegate passed on + // construction (if any). + // + final void run() + { + switch( m_call ) + { + case Call.FN: + m_fn(); + break; + case Call.DG: + m_dg(); + break; + default: + break; + } + } + + +private: + // + // The type of routine passed on fiber construction. + // + enum Call + { + NO, + FN, + DG + } + + + // + // Standard fiber data + // + Call m_call; + union + { + void function() m_fn; + void delegate() m_dg; + } + bool m_isRunning; + Object m_unhandled; + State m_state; + + +private: + //////////////////////////////////////////////////////////////////////////// + // Stack Management + //////////////////////////////////////////////////////////////////////////// + + + // + // Allocate a new stack for this fiber. + // + final void allocStack( size_t sz ) + in + { + assert( !m_pmem && !m_ctxt ); + } + body + { + // adjust alloc size to a multiple of PAGESIZE + sz += PAGESIZE - 1; + sz -= sz % PAGESIZE; + + // NOTE: This instance of Thread.Context is dynamic so Fiber objects + // can be collected by the GC so long as no user level references + // to the object exist. If m_ctxt were not dynamic then its + // presence in the global context list would be enough to keep + // this object alive indefinitely. An alternative to allocating + // room for this struct explicitly would be to mash it into the + // base of the stack being allocated below. However, doing so + // requires too much special logic to be worthwhile. + m_ctxt = new Thread.Context; + + static if( is( typeof( VirtualAlloc ) ) ) + { + // reserve memory for stack + m_pmem = VirtualAlloc( null, + sz + PAGESIZE, + MEM_RESERVE, + PAGE_NOACCESS ); + if( !m_pmem ) + { + throw new FiberException( "Unable to reserve memory for stack" ); + } + + version( StackGrowsDown ) + { + void* stack = m_pmem + PAGESIZE; + void* guard = m_pmem; + void* pbase = stack + sz; + } + else + { + void* stack = m_pmem; + void* guard = m_pmem + sz; + void* pbase = stack; + } + + // allocate reserved stack segment + stack = VirtualAlloc( stack, + sz, + MEM_COMMIT, + PAGE_READWRITE ); + if( !stack ) + { + throw new FiberException( "Unable to allocate memory for stack" ); + } + + // allocate reserved guard page + guard = VirtualAlloc( guard, + PAGESIZE, + MEM_COMMIT, + PAGE_READWRITE | PAGE_GUARD ); + if( !guard ) + { + throw new FiberException( "Unable to create guard page for stack" ); + } + + m_ctxt.bstack = pbase; + m_ctxt.tstack = pbase; + m_size = sz; + } + else + { static if( is( typeof( mmap ) ) ) + { + m_pmem = mmap( null, + sz, + PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANON, + -1, + 0 ); + if( m_pmem == MAP_FAILED ) + m_pmem = null; + } + else static if( is( typeof( valloc ) ) ) + { + m_pmem = valloc( sz ); + } + else static if( is( typeof( malloc ) ) ) + { + m_pmem = malloc( sz ); + } + else + { + m_pmem = null; + } + + if( !m_pmem ) + { + throw new FiberException( "Unable to allocate memory for stack" ); + } + + version( StackGrowsDown ) + { + m_ctxt.bstack = m_pmem + sz; + m_ctxt.tstack = m_pmem + sz; + } + else + { + m_ctxt.bstack = m_pmem; + m_ctxt.tstack = m_pmem; + } + m_size = sz; + } + + Thread.add( m_ctxt ); + } + + + // + // Free this fiber's stack. + // + final void freeStack() + in + { + assert( m_pmem && m_ctxt ); + } + body + { + // NOTE: Since this routine is only ever expected to be called from + // the dtor, pointers to freed data are not set to null. + + // NOTE: m_ctxt is guaranteed to be alive because it is held in the + // global context list. + Thread.remove( m_ctxt ); + + static if( is( typeof( VirtualAlloc ) ) ) + { + VirtualFree( m_pmem, 0, MEM_RELEASE ); + } + else static if( is( typeof( mmap ) ) ) + { + munmap( m_pmem, m_size ); + } + else static if( is( typeof( valloc ) ) ) + { + free( m_pmem ); + } + else static if( is( typeof( malloc ) ) ) + { + free( m_pmem ); + } + delete m_ctxt; + } + + + // + // Initialize the allocated stack. + // + final void initStack() + in + { + assert( m_ctxt.tstack && m_ctxt.tstack == m_ctxt.bstack ); + assert( cast(size_t) m_ctxt.bstack % (void*).sizeof == 0 ); + } + body + { + void* pstack = m_ctxt.tstack; + scope( exit ) m_ctxt.tstack = pstack; + + void push( size_t val ) + { + version( StackGrowsDown ) + { + pstack -= size_t.sizeof; + *(cast(size_t*) pstack) = val; + } + else + { + pstack += size_t.sizeof; + *(cast(size_t*) pstack) = val; + } + } + + // NOTE: On OS X the stack must be 16-byte aligned according to the + // IA-32 call spec. + version( darwin ) + { + pstack = cast(void*)(cast(uint)(pstack) - (cast(uint)(pstack) & 0x0F)); + } + + version( AsmX86_Win32 ) + { + push( cast(size_t) &fiber_entryPoint ); // EIP + push( 0xFFFFFFFF ); // EBP + push( 0x00000000 ); // EAX + push( 0xFFFFFFFF ); // FS:[0] + // BUG: Are the frame pointers the same for both versions? + version( StackGrowsDown ) + { + push( cast(size_t) m_ctxt.bstack ); // FS:[4] + push( cast(size_t) m_ctxt.bstack + m_size ); // FS:[8] + } + else + { + push( cast(size_t) m_ctxt.bstack ); // FS:[4] + push( cast(size_t) m_ctxt.bstack + m_size ); // FS:[8] + } + push( 0x00000000 ); // EBX + push( 0x00000000 ); // ESI + push( 0x00000000 ); // EDI + } + else version( AsmX86_Posix ) + { + push( cast(size_t) &fiber_entryPoint ); // EIP + push( 0x00000000 ); // EBP + push( 0x00000000 ); // EAX + push( 0x00000000 ); // EBX + push( 0x00000000 ); // ESI + push( 0x00000000 ); // EDI + } + else version( AsmPPC_Posix ) + { + version( StackGrowsDown ) + { + pstack -= int.sizeof * 5; + } + else + { + pstack += int.sizeof * 5; + } + + push( cast(size_t) &fiber_entryPoint ); // link register + push( 0x00000000 ); // control register + push( 0x00000000 ); // old stack pointer + + // GPR values + version( StackGrowsDown ) + { + pstack -= int.sizeof * 20; + } + else + { + pstack += int.sizeof * 20; + } + + assert( cast(uint) pstack & 0x0f == 0 ); + } + else static if( is( typeof( ucontext_t ) ) ) + { + getcontext( &m_utxt ); + m_utxt.uc_stack.ss_sp = m_ctxt.bstack; + m_utxt.uc_stack.ss_size = m_size; + makecontext( &m_utxt, &fiber_entryPoint, 0 ); + // NOTE: If ucontext is being used then the top of the stack will + // be a pointer to the ucontext_t struct for that fiber. + push( cast(size_t) &m_utxt ); + } + } + + + Thread.Context* m_ctxt; + size_t m_size; + void* m_pmem; + + static if( is( typeof( ucontext_t ) ) ) + { + // NOTE: The static ucontext instance is used to represent the context + // of the main application thread. + static ucontext_t sm_utxt = void; + ucontext_t m_utxt = void; + ucontext_t* m_ucur = null; + } + + +private: + //////////////////////////////////////////////////////////////////////////// + // Storage of Active Fiber + //////////////////////////////////////////////////////////////////////////// + + + // + // Sets a thread-local reference to the current fiber object. + // + static void setThis( Fiber f ) + { + version( Win32 ) + { + TlsSetValue( sm_this, cast(void*) f ); + } + else version( Posix ) + { + pthread_setspecific( sm_this, cast(void*) f ); + } + } + + + static Thread.TLSKey sm_this; + + +private: + //////////////////////////////////////////////////////////////////////////// + // Context Switching + //////////////////////////////////////////////////////////////////////////// + + + // + // Switches into the stack held by this fiber. + // + final void switchIn() + { + Thread tobj = Thread.getThis(); + void** oldp = &tobj.m_curr.tstack; + void* newp = m_ctxt.tstack; + + // NOTE: The order of operations here is very important. The current + // stack top must be stored before m_lock is set, and pushContext + // must not be called until after m_lock is set. This process + // is intended to prevent a race condition with the suspend + // mechanism used for garbage collection. If it is not followed, + // a badly timed collection could cause the GC to scan from the + // bottom of one stack to the top of another, or to miss scanning + // a stack that still contains valid data. The old stack pointer + // oldp will be set again before the context switch to guarantee + // that it points to exactly the correct stack location so the + // successive pop operations will succeed. + *oldp = getStackTop(); + volatile tobj.m_lock = true; + tobj.pushContext( m_ctxt ); + + fiber_switchContext( oldp, newp ); + + // NOTE: As above, these operations must be performed in a strict order + // to prevent Bad Things from happening. + tobj.popContext(); + volatile tobj.m_lock = false; + tobj.m_curr.tstack = tobj.m_curr.bstack; + } + + + // + // Switches out of the current stack and into the enclosing stack. + // + final void switchOut() + { + Thread tobj = Thread.getThis(); + void** oldp = &m_ctxt.tstack; + void* newp = tobj.m_curr.within.tstack; + + // NOTE: The order of operations here is very important. The current + // stack top must be stored before m_lock is set, and pushContext + // must not be called until after m_lock is set. This process + // is intended to prevent a race condition with the suspend + // mechanism used for garbage collection. If it is not followed, + // a badly timed collection could cause the GC to scan from the + // bottom of one stack to the top of another, or to miss scanning + // a stack that still contains valid data. The old stack pointer + // oldp will be set again before the context switch to guarantee + // that it points to exactly the correct stack location so the + // successive pop operations will succeed. + *oldp = getStackTop(); + volatile tobj.m_lock = true; + + fiber_switchContext( oldp, newp ); + + // NOTE: As above, these operations must be performed in a strict order + // to prevent Bad Things from happening. + volatile tobj.m_lock = false; + tobj.m_curr.tstack = tobj.m_curr.bstack; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/common/tango/core/ThreadASM.S --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/common/tango/core/ThreadASM.S Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,136 @@ +/** + * Tango Fiber switching assembler code. + * + * Author: Mikola Lysenko + */ + +/************************************************************************************ + * POWER PC ASM BITS + ************************************************************************************/ +#if defined( __ppc__ ) || defined( __PPC__ ) || defined( __powerpc__ ) + + +/** + * Performs a context switch. + * + * r3 - old context pointer + * r4 - new context pointer + * + */ +.text +.align 2 +.globl _fiber_switchContext +_fiber_switchContext: + + /* Save linkage area */ + mflr r0 + mfcr r5 + stw r0, 8(r1) + stw r5, 4(r1) + + /* Save GPRs */ + stw r11, (-1 * 4)(r1) + stw r13, (-2 * 4)(r1) + stw r14, (-3 * 4)(r1) + stw r15, (-4 * 4)(r1) + stw r16, (-5 * 4)(r1) + stw r17, (-6 * 4)(r1) + stw r18, (-7 * 4)(r1) + stw r19, (-8 * 4)(r1) + stw r20, (-9 * 4)(r1) + stw r21, (-10 * 4)(r1) + stw r22, (-11 * 4)(r1) + stw r23, (-12 * 4)(r1) + stw r24, (-13 * 4)(r1) + stw r25, (-14 * 4)(r1) + stw r26, (-15 * 4)(r1) + stw r27, (-16 * 4)(r1) + stw r28, (-17 * 4)(r1) + stw r29, (-18 * 4)(r1) + stw r30, (-19 * 4)(r1) + stwu r31, (-20 * 4)(r1) + + /* We update the stack pointer here, since we do not want the GC to + scan the floating point registers. */ + + /* Save FPRs */ + stfd f14, (-1 * 8)(r1) + stfd f15, (-2 * 8)(r1) + stfd f16, (-3 * 8)(r1) + stfd f17, (-4 * 8)(r1) + stfd f18, (-5 * 8)(r1) + stfd f19, (-6 * 8)(r1) + stfd f20, (-7 * 8)(r1) + stfd f21, (-8 * 8)(r1) + stfd f22, (-9 * 8)(r1) + stfd f23, (-10 * 8)(r1) + stfd f24, (-11 * 8)(r1) + stfd f25, (-12 * 8)(r1) + stfd f26, (-13 * 8)(r1) + stfd f27, (-14 * 8)(r1) + stfd f28, (-15 * 8)(r1) + stfd f29, (-16 * 8)(r1) + stfd f30, (-17 * 8)(r1) + stfd f31, (-18 * 8)(r1) + + /* Update the old stack pointer */ + stw r1, 0(r3) + + /* Set new stack pointer */ + addi r1, r4, 20 * 4 + + /* Restore linkage area */ + lwz r0, 8(r1) + lwz r5, 4(r1) + + /* Restore GPRs */ + lwz r11, (-1 * 4)(r1) + lwz r13, (-2 * 4)(r1) + lwz r14, (-3 * 4)(r1) + lwz r15, (-4 * 4)(r1) + lwz r16, (-5 * 4)(r1) + lwz r17, (-6 * 4)(r1) + lwz r18, (-7 * 4)(r1) + lwz r19, (-8 * 4)(r1) + lwz r20, (-9 * 4)(r1) + lwz r21, (-10 * 4)(r1) + lwz r22, (-11 * 4)(r1) + lwz r23, (-12 * 4)(r1) + lwz r24, (-13 * 4)(r1) + lwz r25, (-14 * 4)(r1) + lwz r26, (-15 * 4)(r1) + lwz r27, (-16 * 4)(r1) + lwz r28, (-17 * 4)(r1) + lwz r29, (-18 * 4)(r1) + lwz r30, (-19 * 4)(r1) + lwz r31, (-20 * 4)(r1) + + + /* Restore FPRs */ + lfd f14, (-1 * 8)(r4) + lfd f15, (-2 * 8)(r4) + lfd f16, (-3 * 8)(r4) + lfd f17, (-4 * 8)(r4) + lfd f18, (-5 * 8)(r4) + lfd f19, (-6 * 8)(r4) + lfd f20, (-7 * 8)(r4) + lfd f21, (-8 * 8)(r4) + lfd f22, (-9 * 8)(r4) + lfd f23, (-10 * 8)(r4) + lfd f24, (-11 * 8)(r4) + lfd f25, (-12 * 8)(r4) + lfd f26, (-13 * 8)(r4) + lfd f27, (-14 * 8)(r4) + lfd f28, (-15 * 8)(r4) + lfd f29, (-16 * 8)(r4) + lfd f30, (-17 * 8)(r4) + lfd f31, (-18 * 8)(r4) + + /* Set condition and link register */ + mtcr r5 + mtlr r0 + + /* Return and switch context */ + blr + +#endif diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/common/tango/llvmdc.mak --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/common/tango/llvmdc.mak Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,139 @@ +# Makefile to build the common D runtime library for LLVM +# Designed to work with GNU make +# Targets: +# make +# Same as make all +# make lib +# Build the common library +# make doc +# Generate documentation +# make clean +# Delete unneeded files created by build process + +LIB_TARGET=libtango-cc-tango.a +LIB_MASK=libtango-cc-tango*.a + +CP=cp -f +RM=rm -f +MD=mkdir -p + +ADD_CFLAGS= +ADD_DFLAGS= + +CFLAGS=-O $(ADD_CFLAGS) +#CFLAGS=-g $(ADD_CFLAGS) + +DFLAGS=-release -O -inline -w -nofloat $(ADD_DFLAGS) +#DFLAGS=-g -w -nofloat $(ADD_DFLAGS) + +TFLAGS=-O -inline -w -nofloat $(ADD_DFLAGS) +#TFLAGS=-g -w -nofloat $(ADD_DFLAGS) + +DOCFLAGS=-version=DDoc + +CC=gcc +LC=llvm-ar rsv +DC=llvmdc +LLC=llvm-as + +INC_DEST=../../../tango +LIB_DEST=.. +DOC_DEST=../../../doc/tango + +.SUFFIXES: .s .S .c .cpp .d .ll .html .o .bc + +.s.o: + $(CC) -c $(CFLAGS) $< -o$@ + +.S.o: + $(CC) -c $(CFLAGS) $< -o$@ + +.c.o: + $(CC) -c $(CFLAGS) $< -o$@ + +.cpp.o: + g++ -c $(CFLAGS) $< -o$@ + +.d.bc: + $(DC) -c $(DFLAGS) -Hf$*.di $< -of$@ +# $(DC) -c $(DFLAGS) $< -of$@ + +.ll.bc: + $(LLC) -f -o=$@ $< + +.d.html: + $(DC) -c -o- $(DOCFLAGS) -Df$*.html $< +# $(DC) -c -o- $(DOCFLAGS) -Df$*.html tango.ddoc $< + +targets : lib doc +all : lib doc +tango : lib +lib : tango.lib +doc : tango.doc + +###################################################### + +OBJ_CORE= \ + core/BitManip.bc \ + core/Exception.bc \ + core/Memory.bc \ + core/Runtime.bc \ + core/Thread.bc +# core/ThreadASM.o + +OBJ_STDC= \ + stdc/wrap.bc + +OBJ_STDC_POSIX= \ + stdc/posix/pthread_darwin.o + +ALL_OBJS= \ + $(OBJ_CORE) \ + $(OBJ_STDC) +# $(OBJ_STDC_POSIX) + +###################################################### + +DOC_CORE= \ + core/BitManip.html \ + core/Exception.html \ + core/Memory.html \ + core/Runtime.html \ + core/Thread.html + + +ALL_DOCS= + +###################################################### + +tango.lib : $(LIB_TARGET) + +$(LIB_TARGET) : $(ALL_OBJS) + $(RM) $@ + $(LC) $@ $(ALL_OBJS) + +tango.doc : $(ALL_DOCS) + echo Documentation generated. + +###################################################### + +### stdc/posix + +#stdc/posix/pthread_darwin.o : stdc/posix/pthread_darwin.d +# $(DC) -c $(DFLAGS) stdc/posix/pthread_darwin.d -of$@ + +###################################################### + +clean : + find . -name "*.di" | xargs $(RM) + $(RM) $(ALL_OBJS) + $(RM) $(ALL_DOCS) + find . -name "$(LIB_MASK)" | xargs $(RM) + +install : + $(MD) $(INC_DEST) + find . -name "*.di" -exec cp -f {} $(INC_DEST)/{} \; + $(MD) $(DOC_DEST) + find . -name "*.html" -exec cp -f {} $(DOC_DEST)/{} \; + $(MD) $(LIB_DEST) + find . -name "$(LIB_MASK)" -exec cp -f {} $(LIB_DEST)/{} \; diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/common/tango/posix.mak --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/common/tango/posix.mak Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,135 @@ +# Makefile to build the common D runtime library for Linux +# Designed to work with GNU make +# Targets: +# make +# Same as make all +# make lib +# Build the common library +# make doc +# Generate documentation +# make clean +# Delete unneeded files created by build process + +LIB_TARGET=libtango-cc-tango.a +LIB_MASK=libtango-cc-tango*.a + +CP=cp -f +RM=rm -f +MD=mkdir -p + +ADD_CFLAGS= +ADD_DFLAGS= + +CFLAGS=-O -m32 $(ADD_CFLAGS) +#CFLAGS=-g -m32 $(ADD_CFLAGS) + +DFLAGS=-release -O -inline -w -nofloat -version=Posix $(ADD_DFLAGS) +#DFLAGS=-g -w -nofloat -version=Posix $(ADD_DFLAGS) + +TFLAGS=-O -inline -w -nofloat -version=Posix $(ADD_DFLAGS) +#TFLAGS=-g -w -nofloat -version=Posix $(ADD_DFLAGS) + +DOCFLAGS=-version=DDoc -version=Posix + +CC=gcc +LC=$(AR) -qsv +DC=dmd + +INC_DEST=../../../tango +LIB_DEST=.. +DOC_DEST=../../../doc/tango + +.SUFFIXES: .s .S .c .cpp .d .html .o + +.s.o: + $(CC) -c $(CFLAGS) $< -o$@ + +.S.o: + $(CC) -c $(CFLAGS) $< -o$@ + +.c.o: + $(CC) -c $(CFLAGS) $< -o$@ + +.cpp.o: + g++ -c $(CFLAGS) $< -o$@ + +.d.o: + $(DC) -c $(DFLAGS) -Hf$*.di $< -of$@ +# $(DC) -c $(DFLAGS) $< -of$@ + +.d.html: + $(DC) -c -o- $(DOCFLAGS) -Df$*.html $< +# $(DC) -c -o- $(DOCFLAGS) -Df$*.html tango.ddoc $< + +targets : lib doc +all : lib doc +tango : lib +lib : tango.lib +doc : tango.doc + +###################################################### + +OBJ_CORE= \ + core/BitManip.o \ + core/Exception.o \ + core/Memory.o \ + core/Runtime.o \ + core/Thread.o \ + core/ThreadASM.o + +OBJ_STDC= \ + stdc/wrap.o + +OBJ_STDC_POSIX= \ + stdc/posix/pthread_darwin.o + +ALL_OBJS= \ + $(OBJ_CORE) \ + $(OBJ_STDC) \ + $(OBJ_STDC_POSIX) + +###################################################### + +DOC_CORE= \ + core/BitManip.html \ + core/Exception.html \ + core/Memory.html \ + core/Runtime.html \ + core/Thread.html + + +ALL_DOCS= + +###################################################### + +tango.lib : $(LIB_TARGET) + +$(LIB_TARGET) : $(ALL_OBJS) + $(RM) $@ + $(LC) $@ $(ALL_OBJS) + +tango.doc : $(ALL_DOCS) + echo Documentation generated. + +###################################################### + +### stdc/posix + +stdc/posix/pthread_darwin.o : stdc/posix/pthread_darwin.d + $(DC) -c $(DFLAGS) stdc/posix/pthread_darwin.d -of$@ + +###################################################### + +clean : + find . -name "*.di" | xargs $(RM) + $(RM) $(ALL_OBJS) + $(RM) $(ALL_DOCS) + find . -name "$(LIB_MASK)" | xargs $(RM) + +install : + $(MD) $(INC_DEST) + find . -name "*.di" -exec cp -f {} $(INC_DEST)/{} \; + $(MD) $(DOC_DEST) + find . -name "*.html" -exec cp -f {} $(DOC_DEST)/{} \; + $(MD) $(LIB_DEST) + find . -name "$(LIB_MASK)" -exec cp -f {} $(LIB_DEST)/{} \; diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/common/tango/stdc/posix/pthread_darwin.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/common/tango/stdc/posix/pthread_darwin.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,334 @@ +/** + * D header file for POSIX. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition + */ +module tango.stdc.posix.pthread; + +public import tango.stdc.posix.sys.types; +public import tango.stdc.posix.sched; +public import tango.stdc.posix.time; +private import tango.stdc.stdlib; + +extern (C): + +// +// Required +// + +version( darwin ) +{ + int pthread_cond_broadcast(pthread_cond_t*); + int pthread_cond_destroy(pthread_cond_t*); + int pthread_cond_init(pthread_cond_t*, pthread_condattr_t*); + //int pthread_cond_signal(pthread_cond_t*); + //int pthread_cond_timedwait(pthread_cond_t*, pthread_mutex_t*, timespec*); + int pthread_cond_wait(pthread_cond_t*, pthread_mutex_t*); + + int pthread_mutex_destroy(pthread_mutex_t*); + int pthread_mutex_init(pthread_mutex_t*, pthread_mutexattr_t*); + int pthread_mutex_lock(pthread_mutex_t*); + int pthread_mutex_trylock(pthread_mutex_t*); + int pthread_mutex_unlock(pthread_mutex_t*); + + //int pthread_rwlock_destroy(pthread_rwlock_t*); + //int pthread_rwlock_init(pthread_rwlock_t*, pthread_rwlockattr_t*); + //int pthread_rwlock_rdlock(pthread_rwlock_t*); + int pthread_rwlock_tryrdlock(pthread_rwlock_t*); + int pthread_rwlock_trywrlock(pthread_rwlock_t*); + //int pthread_rwlock_unlock(pthread_rwlock_t*); + //int pthread_rwlock_wrlock(pthread_rwlock_t*); +} + +// +// Barrier (BAR) +// +/* +PTHREAD_BARRIER_SERIAL_THREAD + +int pthread_barrier_destroy(pthread_barrier_t*); +int pthread_barrier_init(pthread_barrier_t*, pthread_barrierattr_t*, uint); +int pthread_barrier_wait(pthread_barrier_t*); +int pthread_barrierattr_destroy(pthread_barrierattr_t*); +int pthread_barrierattr_getpshared(pthread_barrierattr_t*, int*); (BAR|TSH) +int pthread_barrierattr_init(pthread_barrierattr_t*); +int pthread_barrierattr_setpshared(pthread_barrierattr_t*, int); (BAR|TSH) +*/ + +version( darwin ) +{ + const PTHREAD_BARRIER_SERIAL_THREAD = -1; + + // defined in tango.stdc.posix.pthread and redefined here + enum + { + PTHREAD_PROCESS_PRIVATE, + PTHREAD_PROCESS_SHARED + } + + int pthread_barrier_destroy( pthread_barrier_t* barrier ) + { + if( barrier is null ) + return EINVAL; + if( barrier.b_waiters > 0 ) + return EBUSY; + int mret = pthread_mutex_destroy( &barrier.b_lock ); + int cret = pthread_cond_destroy( &barrier.b_cond ); + free( barrier ); + return mret ? mret : cret; + } + + int pthread_barrier_init( pthread_barrier_t* barrier, + pthread_barrierattr_t* attr, + uint count ) + { + if( barrier is null || count <= 0 ) + return EINVAL; + + pthread_barrier_t* newbarrier = cast(pthread_barrier_t*) + malloc( pthread_barrier_t.sizeof ); + if( newbarrier is null ) + return ENOMEM; + + int ret; + if( ( ret = pthread_mutex_init( &newbarrier.b_lock, null ) ) != 0 ) + { + free( newbarrier ); + return ret; + } + if( ( ret = pthread_cond_init( &newbarrier.b_cond, null ) ) != 0 ) + { + pthread_mutex_destroy( &newbarrier.b_lock ); + free( newbarrier ); + return ret; + } + newbarrier.b_waiters = 0; + newbarrier.b_count = count; + newbarrier.b_generation = 0; + *barrier = *newbarrier; + + return 0; + } + + int pthread_barrier_wait( pthread_barrier_t* barrier ) + { + if( barrier is null ) + return EINVAL; + + int ret; + if( ( ret = pthread_mutex_lock( &barrier.b_lock ) ) != 0 ) + return ret; + + if( ++barrier.b_waiters == barrier.b_count ) + { + // current thread is lastest thread + barrier.b_generation++; + barrier.b_waiters = 0; + if( ( ret = pthread_cond_broadcast( &barrier.b_cond ) ) == 0 ) + ret = PTHREAD_BARRIER_SERIAL_THREAD; + } + else + { + int gen = barrier.b_generation; + do + { + ret = pthread_cond_wait( &barrier.b_cond, &barrier.b_lock ); + // test generation to avoid bogus wakeup + } while( ret == 0 && gen == barrier.b_generation ); + } + pthread_mutex_unlock( &barrier.b_lock ); + return ret; + } + + int pthread_barrierattr_destroy( pthread_barrierattr_t* attr ) + { + if( attr is null ) + return EINVAL; + free( attr ); + return 0; + } + + int pthread_barrierattr_getpshared( pthread_barrierattr_t* attr, int* pshared ) + { + if( attr is null ) + return EINVAL; + *pshared = attr.pshared; + return 0; + } + + int pthread_barrierattr_init( pthread_barrierattr_t* attr ) + { + if( attr is null ) + return EINVAL; + if( ( attr = cast(pthread_barrierattr_t*) + malloc( pthread_barrierattr_t.sizeof ) ) is null ) + return ENOMEM; + attr.pshared = PTHREAD_PROCESS_PRIVATE; + return 0; + } + + int pthread_barrierattr_setpshared( pthread_barrierattr_t* attr, int pshared ) + { + if( attr is null ) + return EINVAL; + // only PTHREAD_PROCESS_PRIVATE is supported + if( pshared != PTHREAD_PROCESS_PRIVATE ) + return EINVAL; + attr.pshared = pshared; + return 0; + } +} + +// +// Timeouts (TMO) +// +/* +int pthread_mutex_timedlock(pthread_mutex_t*, timespec*); +int pthread_rwlock_timedrdlock(pthread_rwlock_t*, timespec*); +int pthread_rwlock_timedwrlock(pthread_rwlock_t*, timespec*); +*/ + +version( darwin ) +{ + private + { + import tango.stdc.errno; + import tango.stdc.posix.unistd; + import tango.stdc.posix.sys.time; + + extern (D) + { + void timerclear( timeval* tvp ) + { + tvp.tv_sec = tvp.tv_usec = 0; + } + + bool timerisset( timeval* tvp ) + { + return tvp.tv_sec || tvp.tv_usec; + } + + bool timer_cmp_leq( timeval* tvp, timeval* uvp ) + { + return tvp.tv_sec == uvp.tv_sec ? + tvp.tv_usec <= uvp.tv_usec : + tvp.tv_sec <= uvp.tv_sec; + } + + void timeradd( timeval* tvp, timeval* uvp, timeval* vvp ) + { + vvp.tv_sec = tvp.tv_sec + uvp.tv_sec; + vvp.tv_usec = tvp.tv_usec + uvp.tv_usec; + if( vvp.tv_usec >= 1000000 ) + { + vvp.tv_sec++; + vvp.tv_usec -= 1000000; + } + } + + void timersub( timeval* tvp, timeval* uvp, timeval* vvp ) + { + vvp.tv_sec = tvp.tv_sec - uvp.tv_sec; + vvp.tv_usec = tvp.tv_usec - uvp.tv_usec; + if( vvp.tv_usec < 0 ) + { + vvp.tv_sec--; + vvp.tv_usec += 1000000; + } + } + + void TIMEVAL_TO_TIMESPEC( timeval* tv, timespec* ts ) + { + ts.tv_sec = tv.tv_sec; + ts.tv_nsec = tv.tv_usec * 1000; + } + + void TIMESPEC_TO_TIMEVAL( timeval* tv, timespec* ts ) + { + tv.tv_sec = ts.tv_sec; + tv.tv_usec = ts.tv_nsec / 1000; + } + } + } + + int pthread_mutex_timedlock( pthread_mutex_t* m, timespec* t ) + { + timeval currtime; + timeval maxwait; + TIMESPEC_TO_TIMEVAL( &maxwait, t ); + timeval waittime; + waittime.tv_usec = 100; + + while( timer_cmp_leq( &currtime, &maxwait ) ) + { + int ret = pthread_mutex_trylock( m ); + switch( ret ) + { + case 0: // locked successfully + return ret; + case EBUSY: // waiting + timeradd( &currtime, &waittime, &currtime ); + break; + default: + return ret; + } + usleep( waittime.tv_usec ); + } + return ETIMEDOUT; + } + + int pthread_rwlock_timedrdlock( pthread_rwlock_t *rwlock, timespec* t ) + { + timeval currtime; + timeval maxwait; + TIMESPEC_TO_TIMEVAL( &maxwait, t ); + timeval waittime; + waittime.tv_usec = 100; + + while( timer_cmp_leq( &currtime, &maxwait ) ) + { + int ret = pthread_rwlock_tryrdlock( rwlock ); + switch( ret ) + { + case 0: // locked successfully + return ret; + case EBUSY: // waiting + timeradd( &currtime, &waittime, &currtime ); + break; + default: + return ret; + } + usleep( waittime.tv_usec ); + } + return ETIMEDOUT; + } + + int pthread_rwlock_timedwrlock( pthread_rwlock_t* l, timespec* t ) + { + timeval currtime; + timeval maxwait; + TIMESPEC_TO_TIMEVAL( &maxwait, t ); + timeval waittime; + waittime.tv_usec = 100; + + while( timer_cmp_leq( &currtime, &maxwait ) ) + { + int ret = pthread_rwlock_trywrlock( l ); + switch( ret ) + { + case 0: // locked successfully + return ret; + case EBUSY: // waiting + timeradd( &currtime, &waittime, &currtime ); + break; + default: + return ret; + } + usleep( waittime.tv_usec ); + } + return ETIMEDOUT; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/common/tango/stdc/wrap.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/common/tango/stdc/wrap.c Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,14 @@ +#include + + +int getErrno() +{ + return errno; +} + + +int setErrno( int val ) +{ + errno = val; + return val; +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/common/tango/stdc/wrap.ll --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/common/tango/stdc/wrap.ll Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,14 @@ +; ModuleID = 'wrap.bc' +@errno = external global i32 ; [#uses=2] + +define i32 @getErrno() { +entry: + %tmp = load i32* @errno ; [#uses=1] + ret i32 %tmp +} + +define i32 @setErrno(i32 %val) { +entry: + store i32 %val, i32* @errno + ret i32 %val +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/common/tango/win32.mak --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/common/tango/win32.mak Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,126 @@ +# Makefile to build the common D runtime library for Win32 +# Designed to work with DigitalMars make +# Targets: +# make +# Same as make all +# make lib +# Build the common library +# make doc +# Generate documentation +# make clean +# Delete unneeded files created by build process + +LIB_TARGET=tango-cc-tango.lib +LIB_MASK=tango-cc-tango*.lib + +CP=xcopy /y +RM=del /f +MD=mkdir + +ADD_CFLAGS= +ADD_DFLAGS= + +CFLAGS=-mn -6 -r $(ADD_CFLAGS) +#CFLAGS=-g -mn -6 -r $(ADD_CFLAGS) + +DFLAGS=-release -O -inline -w -nofloat $(ADD_DFLAGS) +#DFLAGS=-g -w -nofloat $(ADD_DFLAGS) + +TFLAGS=-O -inline -w -nofloat $(ADD_DFLAGS) +#TFLAGS=-g -w -nofloat $(ADD_DFLAGS) + +DOCFLAGS=-version=DDoc + +CC=dmc +LC=lib +DC=dmd + +INC_DEST=..\..\..\tango +LIB_DEST=.. +DOC_DEST=..\..\..\doc\tango + +.DEFAULT: .asm .c .cpp .d .html .obj + +.asm.obj: + $(CC) -c $< + +.c.obj: + $(CC) -c $(CFLAGS) $< -o$@ + +.cpp.obj: + $(CC) -c $(CFLAGS) $< -o$@ + +.d.obj: + $(DC) -c $(DFLAGS) -Hf$*.di $< -of$@ +# $(DC) -c $(DFLAGS) $< -of$@ + +.d.html: + $(DC) -c -o- $(DOCFLAGS) -Df$*.html $< +# $(DC) -c -o- $(DOCFLAGS) -Df$*.html tango.ddoc $< + +targets : lib doc +all : lib doc +tango : lib +lib : tango.lib +doc : tango.doc + +###################################################### + +OBJ_CORE= \ + core\BitManip.obj \ + core\Exception.obj \ + core\Memory.obj \ + core\Runtime.obj \ + core\Thread.obj + +OBJ_STDC= \ + stdc\wrap.obj + +ALL_OBJS= \ + $(OBJ_CORE) \ + $(OBJ_STDC) + +###################################################### + +DOC_CORE= \ + core\BitManip.html \ + core\Exception.html \ + core\Memory.html \ + core\Runtime.html \ + core\Thread.html + +ALL_DOCS= + +###################################################### + +tango.lib : $(LIB_TARGET) + +$(LIB_TARGET) : $(ALL_OBJS) + $(RM) $@ + $(LC) -c -n $@ $(ALL_OBJS) + +tango.doc : $(ALL_DOCS) + @echo Documentation generated. + +###################################################### + +### config + +# config.obj : config.d +# $(DC) -c $(DFLAGS) config.d -of$@ + +###################################################### + +clean : + $(RM) /s .\*.di + $(RM) $(ALL_OBJS) + $(RM) $(ALL_DOCS) + $(RM) $(LIB_MASK) + +install : + $(MD) $(INC_DEST) + $(CP) /s *.di $(INC_DEST)\. + $(MD) $(DOC_DEST) + $(CP) /s *.html $(DOC_DEST)\. + $(MD) $(LIB_DEST) + $(CP) $(LIB_MASK) $(LIB_DEST)\. diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/aApply.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/aApply.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,406 @@ +/** + * Part of the D programming language runtime library. + */ + +/* + * Copyright (C) 2004-2006 by Digital Mars, www.digitalmars.com + * Written by Walter Bright + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, in both source and binary form, subject to the following + * restrictions: + * + * o The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * o Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * o This notice may not be removed or altered from any source + * distribution. + */ + +/* + * Modified by Sean Kelly for use with Tango. + */ + +/* This code handles decoding UTF strings for foreach loops. + * There are 6 combinations of conversions between char, wchar, + * and dchar, and 2 of each of those. + */ + +private import util.utf; + +/********************************************** + */ + +// dg is D, but _aApplycd() is C +extern (D) typedef int delegate(void *) dg_t; + +extern (C) int _aApplycd1(char[] aa, dg_t dg) +{ int result; + size_t i; + size_t len = aa.length; + + debug(apply) printf("_aApplycd1(), len = %d\n", len); + for (i = 0; i < len; ) + { dchar d; + + d = aa[i]; + if (d & 0x80) + d = decode(aa, i); + else + i++; + result = dg(cast(void *)&d); + if (result) + break; + } + return result; +} + +extern (C) int _aApplywd1(wchar[] aa, dg_t dg) +{ int result; + size_t i; + size_t len = aa.length; + + debug(apply) printf("_aApplywd1(), len = %d\n", len); + for (i = 0; i < len; ) + { dchar d; + + d = aa[i]; + if (d & ~0x7F) + d = decode(aa, i); + else + i++; + result = dg(cast(void *)&d); + if (result) + break; + } + return result; +} + +extern (C) int _aApplycw1(char[] aa, dg_t dg) +{ int result; + size_t i; + size_t len = aa.length; + + debug(apply) printf("_aApplycw1(), len = %d\n", len); + for (i = 0; i < len; ) + { dchar d; + wchar w; + + w = aa[i]; + if (w & 0x80) + { d = decode(aa, i); + if (d <= 0xFFFF) + w = cast(wchar) d; + else + { + w = cast(wchar)((((d - 0x10000) >> 10) & 0x3FF) + 0xD800); + result = dg(cast(void *)&w); + if (result) + break; + w = cast(wchar)(((d - 0x10000) & 0x3FF) + 0xDC00); + } + } + else + i++; + result = dg(cast(void *)&w); + if (result) + break; + } + return result; +} + +extern (C) int _aApplywc1(wchar[] aa, dg_t dg) +{ int result; + size_t i; + size_t len = aa.length; + + debug(apply) printf("_aApplywc1(), len = %d\n", len); + for (i = 0; i < len; ) + { dchar d; + wchar w; + char c; + + w = aa[i]; + if (w & ~0x7F) + { + char[4] buf; + + d = decode(aa, i); + auto b = toUTF8(buf, d); + foreach (char c2; b) + { + result = dg(cast(void *)&c2); + if (result) + return result; + } + continue; + } + else + { c = cast(char)w; + i++; + } + result = dg(cast(void *)&c); + if (result) + break; + } + return result; +} + +extern (C) int _aApplydc1(dchar[] aa, dg_t dg) +{ int result; + + debug(apply) printf("_aApplydc1(), len = %d\n", aa.length); + foreach (dchar d; aa) + { + char c; + + if (d & ~0x7F) + { + char[4] buf; + + auto b = toUTF8(buf, d); + foreach (char c2; b) + { + result = dg(cast(void *)&c2); + if (result) + return result; + } + continue; + } + else + { + c = cast(char)d; + } + result = dg(cast(void *)&c); + if (result) + break; + } + return result; +} + +extern (C) int _aApplydw1(dchar[] aa, dg_t dg) +{ int result; + + debug(apply) printf("_aApplydw1(), len = %d\n", aa.length); + foreach (dchar d; aa) + { + wchar w; + + if (d <= 0xFFFF) + w = cast(wchar) d; + else + { + w = cast(wchar)((((d - 0x10000) >> 10) & 0x3FF) + 0xD800); + result = dg(cast(void *)&w); + if (result) + break; + w = cast(wchar)(((d - 0x10000) & 0x3FF) + 0xDC00); + } + result = dg(cast(void *)&w); + if (result) + break; + } + return result; +} + + +/****************************************************************************/ + +// dg is D, but _aApplycd2() is C +extern (D) typedef int delegate(void *, void *) dg2_t; + +extern (C) int _aApplycd2(char[] aa, dg2_t dg) +{ int result; + size_t i; + size_t n; + size_t len = aa.length; + + debug(apply) printf("_aApplycd2(), len = %d\n", len); + for (i = 0; i < len; i += n) + { dchar d; + + d = aa[i]; + if (d & 0x80) + { + n = i; + d = decode(aa, n); + n -= i; + } + else + n = 1; + result = dg(&i, cast(void *)&d); + if (result) + break; + } + return result; +} + +extern (C) int _aApplywd2(wchar[] aa, dg2_t dg) +{ int result; + size_t i; + size_t n; + size_t len = aa.length; + + debug(apply) printf("_aApplywd2(), len = %d\n", len); + for (i = 0; i < len; i += n) + { dchar d; + + d = aa[i]; + if (d & ~0x7F) + { + n = i; + d = decode(aa, n); + n -= i; + } + else + n = 1; + result = dg(&i, cast(void *)&d); + if (result) + break; + } + return result; +} + +extern (C) int _aApplycw2(char[] aa, dg2_t dg) +{ int result; + size_t i; + size_t n; + size_t len = aa.length; + + debug(apply) printf("_aApplycw2(), len = %d\n", len); + for (i = 0; i < len; i += n) + { dchar d; + wchar w; + + w = aa[i]; + if (w & 0x80) + { n = i; + d = decode(aa, n); + n -= i; + if (d <= 0xFFFF) + w = cast(wchar) d; + else + { + w = cast(wchar) ((((d - 0x10000) >> 10) & 0x3FF) + 0xD800); + result = dg(&i, cast(void *)&w); + if (result) + break; + w = cast(wchar) (((d - 0x10000) & 0x3FF) + 0xDC00); + } + } + else + n = 1; + result = dg(&i, cast(void *)&w); + if (result) + break; + } + return result; +} + +extern (C) int _aApplywc2(wchar[] aa, dg2_t dg) +{ int result; + size_t i; + size_t n; + size_t len = aa.length; + + debug(apply) printf("_aApplywc2(), len = %d\n", len); + for (i = 0; i < len; i += n) + { dchar d; + wchar w; + char c; + + w = aa[i]; + if (w & ~0x7F) + { + char[4] buf; + + n = i; + d = decode(aa, n); + n -= i; + auto b = toUTF8(buf, d); + foreach (char c2; b) + { + result = dg(&i, cast(void *)&c2); + if (result) + return result; + } + continue; + } + else + { c = cast(char)w; + n = 1; + } + result = dg(&i, cast(void *)&c); + if (result) + break; + } + return result; +} + +extern (C) int _aApplydc2(dchar[] aa, dg2_t dg) +{ int result; + size_t i; + size_t len = aa.length; + + debug(apply) printf("_aApplydc2(), len = %d\n", len); + for (i = 0; i < len; i++) + { dchar d; + char c; + + d = aa[i]; + if (d & ~0x7F) + { + char[4] buf; + + auto b = toUTF8(buf, d); + foreach (char c2; b) + { + result = dg(&i, cast(void *)&c2); + if (result) + return result; + } + continue; + } + else + { c = cast(char)d; + } + result = dg(&i, cast(void *)&c); + if (result) + break; + } + return result; +} + +extern (C) int _aApplydw2(dchar[] aa, dg2_t dg) +{ int result; + + debug(apply) printf("_aApplydw2(), len = %d\n", aa.length); + foreach (size_t i, dchar d; aa) + { + wchar w; + auto j = i; + + if (d <= 0xFFFF) + w = cast(wchar) d; + else + { + w = cast(wchar) ((((d - 0x10000) >> 10) & 0x3FF) + 0xD800); + result = dg(&j, cast(void *)&w); + if (result) + break; + w = cast(wchar) (((d - 0x10000) & 0x3FF) + 0xDC00); + } + result = dg(&j, cast(void *)&w); + if (result) + break; + } + return result; +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/aApplyR.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/aApplyR.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,975 @@ + +/** + * Part of the D programming language runtime library. + */ + +/* + * Copyright (C) 2004-2006 by Digital Mars, www.digitalmars.com + * Written by Walter Bright + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, in both source and binary form, subject to the following + * restrictions: + * + * o The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * o Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * o This notice may not be removed or altered from any source + * distribution. + */ + +/* + * Modified by Sean Kelly for use with Tango. + */ + +/* This code handles decoding UTF strings for foreach_reverse loops. + * There are 6 combinations of conversions between char, wchar, + * and dchar, and 2 of each of those. + */ + +private import util.utf; + +/**********************************************/ +/* 1 argument versions */ + +// dg is D, but _aApplyRcd() is C +extern (D) typedef int delegate(void *) dg_t; + +extern (C) int _aApplyRcd1(in char[] aa, dg_t dg) +{ int result; + + debug(apply) printf("_aApplyRcd1(), len = %d\n", aa.length); + for (size_t i = aa.length; i != 0; ) + { dchar d; + + i--; + d = aa[i]; + if (d & 0x80) + { char c = cast(char)d; + uint j; + uint m = 0x3F; + d = 0; + while ((c & 0xC0) != 0xC0) + { if (i == 0) + onUnicodeError("Invalid UTF-8 sequence", 0); + i--; + d |= (c & 0x3F) << j; + j += 6; + m >>= 1; + c = aa[i]; + } + d |= (c & m) << j; + } + result = dg(cast(void *)&d); + if (result) + break; + } + return result; +} + +unittest +{ + debug(apply) printf("_aApplyRcd1.unittest\n"); + + auto s = "hello"c; + int i; + + foreach_reverse(dchar d; s) + { + switch (i) + { + case 0: assert(d == 'o'); break; + case 1: assert(d == 'l'); break; + case 2: assert(d == 'l'); break; + case 3: assert(d == 'e'); break; + case 4: assert(d == 'h'); break; + default: assert(0); + } + i++; + } + assert(i == 5); + + s = "a\u1234\U00100456b"; + i = 0; + foreach_reverse(dchar d; s) + { + //printf("i = %d, d = %x\n", i, d); + switch (i) + { + case 0: assert(d == 'b'); break; + case 1: assert(d == '\U00100456'); break; + case 2: assert(d == '\u1234'); break; + case 3: assert(d == 'a'); break; + default: assert(0); + } + i++; + } + assert(i == 4); +} + +/*****************************/ + +extern (C) int _aApplyRwd1(in wchar[] aa, dg_t dg) +{ int result; + + debug(apply) printf("_aApplyRwd1(), len = %d\n", aa.length); + for (size_t i = aa.length; i != 0; ) + { dchar d; + + i--; + d = aa[i]; + if (d >= 0xDC00 && d <= 0xDFFF) + { if (i == 0) + onUnicodeError("Invalid UTF-16 sequence", 0); + i--; + d = ((aa[i] - 0xD7C0) << 10) + (d - 0xDC00); + } + result = dg(cast(void *)&d); + if (result) + break; + } + return result; +} + +unittest +{ + debug(apply) printf("_aApplyRwd1.unittest\n"); + + auto s = "hello"w; + int i; + + foreach_reverse(dchar d; s) + { + switch (i) + { + case 0: assert(d == 'o'); break; + case 1: assert(d == 'l'); break; + case 2: assert(d == 'l'); break; + case 3: assert(d == 'e'); break; + case 4: assert(d == 'h'); break; + default: assert(0); + } + i++; + } + assert(i == 5); + + s = "a\u1234\U00100456b"; + i = 0; + foreach_reverse(dchar d; s) + { + //printf("i = %d, d = %x\n", i, d); + switch (i) + { + case 0: assert(d == 'b'); break; + case 1: assert(d == '\U00100456'); break; + case 2: assert(d == '\u1234'); break; + case 3: assert(d == 'a'); break; + default: assert(0); + } + i++; + } + assert(i == 4); +} + +/*****************************/ + +extern (C) int _aApplyRcw1(in char[] aa, dg_t dg) +{ int result; + + debug(apply) printf("_aApplyRcw1(), len = %d\n", aa.length); + for (size_t i = aa.length; i != 0; ) + { dchar d; + wchar w; + + i--; + w = aa[i]; + if (w & 0x80) + { char c = cast(char)w; + uint j; + uint m = 0x3F; + d = 0; + while ((c & 0xC0) != 0xC0) + { if (i == 0) + onUnicodeError("Invalid UTF-8 sequence", 0); + i--; + d |= (c & 0x3F) << j; + j += 6; + m >>= 1; + c = aa[i]; + } + d |= (c & m) << j; + + if (d <= 0xFFFF) + w = cast(wchar) d; + else + { + w = cast(wchar) ((((d - 0x10000) >> 10) & 0x3FF) + 0xD800); + result = dg(cast(void *)&w); + if (result) + break; + w = cast(wchar) (((d - 0x10000) & 0x3FF) + 0xDC00); + } + } + result = dg(cast(void *)&w); + if (result) + break; + } + return result; +} + +unittest +{ + debug(apply) printf("_aApplyRcw1.unittest\n"); + + auto s = "hello"c; + int i; + + foreach_reverse(wchar d; s) + { + switch (i) + { + case 0: assert(d == 'o'); break; + case 1: assert(d == 'l'); break; + case 2: assert(d == 'l'); break; + case 3: assert(d == 'e'); break; + case 4: assert(d == 'h'); break; + default: assert(0); + } + i++; + } + assert(i == 5); + + s = "a\u1234\U00100456b"; + i = 0; + foreach_reverse(wchar d; s) + { + //printf("i = %d, d = %x\n", i, d); + switch (i) + { + case 0: assert(d == 'b'); break; + case 1: assert(d == 0xDBC1); break; + case 2: assert(d == 0xDC56); break; + case 3: assert(d == 0x1234); break; + case 4: assert(d == 'a'); break; + default: assert(0); + } + i++; + } + assert(i == 5); +} + +/*****************************/ + +extern (C) int _aApplyRwc1(in wchar[] aa, dg_t dg) +{ int result; + + debug(apply) printf("_aApplyRwc1(), len = %d\n", aa.length); + for (size_t i = aa.length; i != 0; ) + { dchar d; + char c; + + i--; + d = aa[i]; + if (d >= 0xDC00 && d <= 0xDFFF) + { if (i == 0) + onUnicodeError("Invalid UTF-16 sequence", 0); + i--; + d = ((aa[i] - 0xD7C0) << 10) + (d - 0xDC00); + } + + if (d & ~0x7F) + { + char[4] buf; + + auto b = toUTF8(buf, d); + foreach (char c2; b) + { + result = dg(cast(void *)&c2); + if (result) + return result; + } + continue; + } + c = cast(char)d; + result = dg(cast(void *)&c); + if (result) + break; + } + return result; +} + +unittest +{ + debug(apply) printf("_aApplyRwc1.unittest\n"); + + auto s = "hello"w; + int i; + + foreach_reverse(char d; s) + { + switch (i) + { + case 0: assert(d == 'o'); break; + case 1: assert(d == 'l'); break; + case 2: assert(d == 'l'); break; + case 3: assert(d == 'e'); break; + case 4: assert(d == 'h'); break; + default: assert(0); + } + i++; + } + assert(i == 5); + + s = "a\u1234\U00100456b"; + i = 0; + foreach_reverse(char d; s) + { + //printf("i = %d, d = %x\n", i, d); + switch (i) + { + case 0: assert(d == 'b'); break; + case 1: assert(d == 0xF4); break; + case 2: assert(d == 0x80); break; + case 3: assert(d == 0x91); break; + case 4: assert(d == 0x96); break; + case 5: assert(d == 0xE1); break; + case 6: assert(d == 0x88); break; + case 7: assert(d == 0xB4); break; + case 8: assert(d == 'a'); break; + default: assert(0); + } + i++; + } + assert(i == 9); +} + +/*****************************/ + +extern (C) int _aApplyRdc1(in dchar[] aa, dg_t dg) +{ int result; + + debug(apply) printf("_aApplyRdc1(), len = %d\n", aa.length); + for (size_t i = aa.length; i != 0;) + { dchar d = aa[--i]; + char c; + + if (d & ~0x7F) + { + char[4] buf; + + auto b = toUTF8(buf, d); + foreach (char c2; b) + { + result = dg(cast(void *)&c2); + if (result) + return result; + } + continue; + } + else + { + c = cast(char)d; + } + result = dg(cast(void *)&c); + if (result) + break; + } + return result; +} + +unittest +{ + debug(apply) printf("_aApplyRdc1.unittest\n"); + + auto s = "hello"d; + int i; + + foreach_reverse(char d; s) + { + switch (i) + { + case 0: assert(d == 'o'); break; + case 1: assert(d == 'l'); break; + case 2: assert(d == 'l'); break; + case 3: assert(d == 'e'); break; + case 4: assert(d == 'h'); break; + default: assert(0); + } + i++; + } + assert(i == 5); + + s = "a\u1234\U00100456b"; + i = 0; + foreach_reverse(char d; s) + { + //printf("i = %d, d = %x\n", i, d); + switch (i) + { + case 0: assert(d == 'b'); break; + case 1: assert(d == 0xF4); break; + case 2: assert(d == 0x80); break; + case 3: assert(d == 0x91); break; + case 4: assert(d == 0x96); break; + case 5: assert(d == 0xE1); break; + case 6: assert(d == 0x88); break; + case 7: assert(d == 0xB4); break; + case 8: assert(d == 'a'); break; + default: assert(0); + } + i++; + } + assert(i == 9); +} + +/*****************************/ + +extern (C) int _aApplyRdw1(in dchar[] aa, dg_t dg) +{ int result; + + debug(apply) printf("_aApplyRdw1(), len = %d\n", aa.length); + for (size_t i = aa.length; i != 0; ) + { dchar d = aa[--i]; + wchar w; + + if (d <= 0xFFFF) + w = cast(wchar) d; + else + { + w = cast(wchar) ((((d - 0x10000) >> 10) & 0x3FF) + 0xD800); + result = dg(cast(void *)&w); + if (result) + break; + w = cast(wchar) (((d - 0x10000) & 0x3FF) + 0xDC00); + } + result = dg(cast(void *)&w); + if (result) + break; + } + return result; +} + +unittest +{ + debug(apply) printf("_aApplyRdw1.unittest\n"); + + auto s = "hello"d; + int i; + + foreach_reverse(wchar d; s) + { + switch (i) + { + case 0: assert(d == 'o'); break; + case 1: assert(d == 'l'); break; + case 2: assert(d == 'l'); break; + case 3: assert(d == 'e'); break; + case 4: assert(d == 'h'); break; + default: assert(0); + } + i++; + } + assert(i == 5); + + s = "a\u1234\U00100456b"; + i = 0; + foreach_reverse(wchar d; s) + { + //printf("i = %d, d = %x\n", i, d); + switch (i) + { + case 0: assert(d == 'b'); break; + case 1: assert(d == 0xDBC1); break; + case 2: assert(d == 0xDC56); break; + case 3: assert(d == 0x1234); break; + case 4: assert(d == 'a'); break; + default: assert(0); + } + i++; + } + assert(i == 5); +} + + +/****************************************************************************/ +/* 2 argument versions */ + +// dg is D, but _aApplyRcd2() is C +extern (D) typedef int delegate(void *, void *) dg2_t; + +extern (C) int _aApplyRcd2(in char[] aa, dg2_t dg) +{ int result; + size_t i; + size_t len = aa.length; + + debug(apply) printf("_aApplyRcd2(), len = %d\n", len); + for (i = len; i != 0; ) + { dchar d; + + i--; + d = aa[i]; + if (d & 0x80) + { char c = cast(char)d; + uint j; + uint m = 0x3F; + d = 0; + while ((c & 0xC0) != 0xC0) + { if (i == 0) + onUnicodeError("Invalid UTF-8 sequence", 0); + i--; + d |= (c & 0x3F) << j; + j += 6; + m >>= 1; + c = aa[i]; + } + d |= (c & m) << j; + } + result = dg(&i, cast(void *)&d); + if (result) + break; + } + return result; +} + +unittest +{ + debug(apply) printf("_aApplyRcd2.unittest\n"); + + auto s = "hello"c; + int i; + + foreach_reverse(k, dchar d; s) + { + assert(k == 4 - i); + switch (i) + { + case 0: assert(d == 'o'); break; + case 1: assert(d == 'l'); break; + case 2: assert(d == 'l'); break; + case 3: assert(d == 'e'); break; + case 4: assert(d == 'h'); break; + default: assert(0); + } + i++; + } + assert(i == 5); + + s = "a\u1234\U00100456b"; + i = 0; + foreach_reverse(k, dchar d; s) + { + //printf("i = %d, k = %d, d = %x\n", i, k, d); + switch (i) + { + case 0: assert(d == 'b'); assert(k == 8); break; + case 1: assert(d == '\U00100456'); assert(k == 4); break; + case 2: assert(d == '\u1234'); assert(k == 1); break; + case 3: assert(d == 'a'); assert(k == 0); break; + default: assert(0); + } + i++; + } + assert(i == 4); +} + +/*****************************/ + +extern (C) int _aApplyRwd2(in wchar[] aa, dg2_t dg) +{ int result; + + debug(apply) printf("_aApplyRwd2(), len = %d\n", aa.length); + for (size_t i = aa.length; i != 0; ) + { dchar d; + + i--; + d = aa[i]; + if (d >= 0xDC00 && d <= 0xDFFF) + { if (i == 0) + onUnicodeError("Invalid UTF-16 sequence", 0); + i--; + d = ((aa[i] - 0xD7C0) << 10) + (d - 0xDC00); + } + result = dg(&i, cast(void *)&d); + if (result) + break; + } + return result; +} + +unittest +{ + debug(apply) printf("_aApplyRwd2.unittest\n"); + + auto s = "hello"w; + int i; + + foreach_reverse(k, dchar d; s) + { + //printf("i = %d, k = %d, d = %x\n", i, k, d); + assert(k == 4 - i); + switch (i) + { + case 0: assert(d == 'o'); break; + case 1: assert(d == 'l'); break; + case 2: assert(d == 'l'); break; + case 3: assert(d == 'e'); break; + case 4: assert(d == 'h'); break; + default: assert(0); + } + i++; + } + assert(i == 5); + + s = "a\u1234\U00100456b"; + i = 0; + foreach_reverse(k, dchar d; s) + { + //printf("i = %d, k = %d, d = %x\n", i, k, d); + switch (i) + { + case 0: assert(k == 4); assert(d == 'b'); break; + case 1: assert(k == 2); assert(d == '\U00100456'); break; + case 2: assert(k == 1); assert(d == '\u1234'); break; + case 3: assert(k == 0); assert(d == 'a'); break; + default: assert(0); + } + i++; + } + assert(i == 4); +} + +/*****************************/ + +extern (C) int _aApplyRcw2(in char[] aa, dg2_t dg) +{ int result; + + debug(apply) printf("_aApplyRcw2(), len = %d\n", aa.length); + for (size_t i = aa.length; i != 0; ) + { dchar d; + wchar w; + + i--; + w = aa[i]; + if (w & 0x80) + { char c = cast(char)w; + uint j; + uint m = 0x3F; + d = 0; + while ((c & 0xC0) != 0xC0) + { if (i == 0) + onUnicodeError("Invalid UTF-8 sequence", 0); + i--; + d |= (c & 0x3F) << j; + j += 6; + m >>= 1; + c = aa[i]; + } + d |= (c & m) << j; + + if (d <= 0xFFFF) + w = cast(wchar) d; + else + { + w = cast(wchar) ((((d - 0x10000) >> 10) & 0x3FF) + 0xD800); + result = dg(&i, cast(void *)&w); + if (result) + break; + w = cast(wchar) (((d - 0x10000) & 0x3FF) + 0xDC00); + } + } + result = dg(&i, cast(void *)&w); + if (result) + break; + } + return result; +} + +unittest +{ + debug(apply) printf("_aApplyRcw2.unittest\n"); + + auto s = "hello"c; + int i; + + foreach_reverse(k, wchar d; s) + { + //printf("i = %d, k = %d, d = %x\n", i, k, d); + assert(k == 4 - i); + switch (i) + { + case 0: assert(d == 'o'); break; + case 1: assert(d == 'l'); break; + case 2: assert(d == 'l'); break; + case 3: assert(d == 'e'); break; + case 4: assert(d == 'h'); break; + default: assert(0); + } + i++; + } + assert(i == 5); + + s = "a\u1234\U00100456b"; + i = 0; + foreach_reverse(k, wchar d; s) + { + //printf("i = %d, k = %d, d = %x\n", i, k, d); + switch (i) + { + case 0: assert(k == 8); assert(d == 'b'); break; + case 1: assert(k == 4); assert(d == 0xDBC1); break; + case 2: assert(k == 4); assert(d == 0xDC56); break; + case 3: assert(k == 1); assert(d == 0x1234); break; + case 4: assert(k == 0); assert(d == 'a'); break; + default: assert(0); + } + i++; + } + assert(i == 5); +} + +/*****************************/ + +extern (C) int _aApplyRwc2(in wchar[] aa, dg2_t dg) +{ int result; + + debug(apply) printf("_aApplyRwc2(), len = %d\n", aa.length); + for (size_t i = aa.length; i != 0; ) + { dchar d; + char c; + + i--; + d = aa[i]; + if (d >= 0xDC00 && d <= 0xDFFF) + { if (i == 0) + onUnicodeError("Invalid UTF-16 sequence", 0); + i--; + d = ((aa[i] - 0xD7C0) << 10) + (d - 0xDC00); + } + + if (d & ~0x7F) + { + char[4] buf; + + auto b = toUTF8(buf, d); + foreach (char c2; b) + { + result = dg(&i, cast(void *)&c2); + if (result) + return result; + } + continue; + } + c = cast(char)d; + result = dg(&i, cast(void *)&c); + if (result) + break; + } + return result; +} + +unittest +{ + debug(apply) printf("_aApplyRwc2.unittest\n"); + + auto s = "hello"w; + int i; + + foreach_reverse(k, char d; s) + { + //printf("i = %d, k = %d, d = %x\n", i, k, d); + assert(k == 4 - i); + switch (i) + { + case 0: assert(d == 'o'); break; + case 1: assert(d == 'l'); break; + case 2: assert(d == 'l'); break; + case 3: assert(d == 'e'); break; + case 4: assert(d == 'h'); break; + default: assert(0); + } + i++; + } + assert(i == 5); + + s = "a\u1234\U00100456b"; + i = 0; + foreach_reverse(k, char d; s) + { + //printf("i = %d, k = %d, d = %x\n", i, k, d); + switch (i) + { + case 0: assert(k == 4); assert(d == 'b'); break; + case 1: assert(k == 2); assert(d == 0xF4); break; + case 2: assert(k == 2); assert(d == 0x80); break; + case 3: assert(k == 2); assert(d == 0x91); break; + case 4: assert(k == 2); assert(d == 0x96); break; + case 5: assert(k == 1); assert(d == 0xE1); break; + case 6: assert(k == 1); assert(d == 0x88); break; + case 7: assert(k == 1); assert(d == 0xB4); break; + case 8: assert(k == 0); assert(d == 'a'); break; + default: assert(0); + } + i++; + } + assert(i == 9); +} + +/*****************************/ + +extern (C) int _aApplyRdc2(in dchar[] aa, dg2_t dg) +{ int result; + + debug(apply) printf("_aApplyRdc2(), len = %d\n", aa.length); + for (size_t i = aa.length; i != 0; ) + { dchar d = aa[--i]; + char c; + + if (d & ~0x7F) + { + char[4] buf; + + auto b = toUTF8(buf, d); + foreach (char c2; b) + { + result = dg(&i, cast(void *)&c2); + if (result) + return result; + } + continue; + } + else + { c = cast(char)d; + } + result = dg(&i, cast(void *)&c); + if (result) + break; + } + return result; +} + +unittest +{ + debug(apply) printf("_aApplyRdc2.unittest\n"); + + auto s = "hello"d; + int i; + + foreach_reverse(k, char d; s) + { + //printf("i = %d, k = %d, d = %x\n", i, k, d); + assert(k == 4 - i); + switch (i) + { + case 0: assert(d == 'o'); break; + case 1: assert(d == 'l'); break; + case 2: assert(d == 'l'); break; + case 3: assert(d == 'e'); break; + case 4: assert(d == 'h'); break; + default: assert(0); + } + i++; + } + assert(i == 5); + + s = "a\u1234\U00100456b"; + i = 0; + foreach_reverse(k, char d; s) + { + //printf("i = %d, k = %d, d = %x\n", i, k, d); + switch (i) + { + case 0: assert(k == 3); assert(d == 'b'); break; + case 1: assert(k == 2); assert(d == 0xF4); break; + case 2: assert(k == 2); assert(d == 0x80); break; + case 3: assert(k == 2); assert(d == 0x91); break; + case 4: assert(k == 2); assert(d == 0x96); break; + case 5: assert(k == 1); assert(d == 0xE1); break; + case 6: assert(k == 1); assert(d == 0x88); break; + case 7: assert(k == 1); assert(d == 0xB4); break; + case 8: assert(k == 0); assert(d == 'a'); break; + default: assert(0); + } + i++; + } + assert(i == 9); +} + +/*****************************/ + +extern (C) int _aApplyRdw2(in dchar[] aa, dg2_t dg) +{ int result; + + debug(apply) printf("_aApplyRdw2(), len = %d\n", aa.length); + for (size_t i = aa.length; i != 0; ) + { dchar d = aa[--i]; + wchar w; + + if (d <= 0xFFFF) + w = cast(wchar) d; + else + { + w = cast(wchar) ((((d - 0x10000) >> 10) & 0x3FF) + 0xD800); + result = dg(&i, cast(void *)&w); + if (result) + break; + w = cast(wchar) (((d - 0x10000) & 0x3FF) + 0xDC00); + } + result = dg(&i, cast(void *)&w); + if (result) + break; + } + return result; +} + +unittest +{ + debug(apply) printf("_aApplyRdw2.unittest\n"); + + auto s = "hello"d; + int i; + + foreach_reverse(k, wchar d; s) + { + //printf("i = %d, k = %d, d = %x\n", i, k, d); + assert(k == 4 - i); + switch (i) + { + case 0: assert(d == 'o'); break; + case 1: assert(d == 'l'); break; + case 2: assert(d == 'l'); break; + case 3: assert(d == 'e'); break; + case 4: assert(d == 'h'); break; + default: assert(0); + } + i++; + } + assert(i == 5); + + s = "a\u1234\U00100456b"; + i = 0; + foreach_reverse(k, wchar d; s) + { + //printf("i = %d, k = %d, d = %x\n", i, k, d); + switch (i) + { + case 0: assert(k == 3); assert(d == 'b'); break; + case 1: assert(k == 2); assert(d == 0xDBC1); break; + case 2: assert(k == 2); assert(d == 0xDC56); break; + case 3: assert(k == 1); assert(d == 0x1234); break; + case 4: assert(k == 0); assert(d == 'a'); break; + default: assert(0); + } + i++; + } + assert(i == 5); +} + + diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/aaA.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/aaA.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,843 @@ +//_ aaA.d + +/** + * Part of the D programming language runtime library. + * Implementation of associative arrays. + */ + +/* + * Copyright (C) 2000-2007 by Digital Mars, www.digitalmars.com + * Written by Walter Bright + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * o The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * o Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * o This notice may not be removed or altered from any source + * distribution. + */ + +/* + * Modified by Sean Kelly for use with Tango. + */ + +private +{ + import tango.stdc.stdarg; + import tango.stdc.string; + + enum BlkAttr : uint + { + FINALIZE = 0b0000_0001, + NO_SCAN = 0b0000_0010, + NO_MOVE = 0b0000_0100, + ALL_BITS = 0b1111_1111 + } + + extern (C) void* gc_malloc( size_t sz, uint ba = 0 ); + extern (C) void* gc_calloc( size_t sz, uint ba = 0 ); + extern (C) void gc_free( void* p ); +} + +// Auto-rehash and pre-allocate - Dave Fladebo + +static size_t[] prime_list = [ + 97UL, 389UL, + 1543UL, 6151UL, + 24593UL, 98317UL, + 393241UL, 1572869UL, + 6291469UL, 25165843UL, + 100663319UL, 402653189UL, + 1610612741UL, 4294967291UL +]; + +/* This is the type of the return value for dynamic arrays. + * It should be a type that is returned in registers. + * Although DMD will return types of Array in registers, + * gcc will not, so we instead use a 'long'. + */ +alias long ArrayRet_t; + +struct Array +{ + size_t length; + void* ptr; +} + +struct aaA +{ + aaA *left; + aaA *right; + hash_t hash; + /* key */ + /* value */ +} + +struct BB +{ + aaA*[] b; + size_t nodes; // total number of aaA nodes +} + +/* This is the type actually seen by the programmer, although + * it is completely opaque. + */ + +struct AA +{ + BB* a; +} + +/********************************** + * Align to next pointer boundary, so that + * GC won't be faced with misaligned pointers + * in value. + */ + +size_t aligntsize(size_t tsize) +{ + // Is pointer alignment on the x64 4 bytes or 8? + return (tsize + size_t.sizeof - 1) & ~(size_t.sizeof - 1); +} + +extern (C): + +/************************************************* + * Invariant for aa. + */ + +/+ +void _aaInvAh(aaA*[] aa) +{ + for (size_t i = 0; i < aa.length; i++) + { + if (aa[i]) + _aaInvAh_x(aa[i]); + } +} + +private int _aaCmpAh_x(aaA *e1, aaA *e2) +{ int c; + + c = e1.hash - e2.hash; + if (c == 0) + { + c = e1.key.length - e2.key.length; + if (c == 0) + c = memcmp((char *)e1.key, (char *)e2.key, e1.key.length); + } + return c; +} + +private void _aaInvAh_x(aaA *e) +{ + hash_t key_hash; + aaA *e1; + aaA *e2; + + key_hash = getHash(e.key); + assert(key_hash == e.hash); + + while (1) + { int c; + + e1 = e.left; + if (e1) + { + _aaInvAh_x(e1); // ordinary recursion + do + { + c = _aaCmpAh_x(e1, e); + assert(c < 0); + e1 = e1.right; + } while (e1 != null); + } + + e2 = e.right; + if (e2) + { + do + { + c = _aaCmpAh_x(e, e2); + assert(c < 0); + e2 = e2.left; + } while (e2 != null); + e = e.right; // tail recursion + } + else + break; + } +} ++/ + +/**************************************************** + * Determine number of entries in associative array. + */ + +size_t _aaLen(AA aa) +in +{ + //printf("_aaLen()+\n"); + //_aaInv(aa); +} +out (result) +{ + size_t len = 0; + + void _aaLen_x(aaA* ex) + { + auto e = ex; + len++; + + while (1) + { + if (e.right) + _aaLen_x(e.right); + e = e.left; + if (!e) + break; + len++; + } + } + + if (aa.a) + { + foreach (e; aa.a.b) + { + if (e) + _aaLen_x(e); + } + } + assert(len == result); + + //printf("_aaLen()-\n"); +} +body +{ + return aa.a ? aa.a.nodes : 0; +} + + +/************************************************* + * Get pointer to value in associative array indexed by key. + * Add entry for key if it is not already there. + */ + +void* _aaGet(AA* aa, TypeInfo keyti, size_t valuesize, ...) +in +{ + assert(aa); +} +out (result) +{ + assert(result); + assert(aa.a); + assert(aa.a.b.length); + //assert(_aaInAh(*aa.a, key)); +} +body +{ + auto pkey = cast(void *)(&valuesize + 1); + size_t i; + aaA *e; + auto keysize = aligntsize(keyti.tsize()); + + if (!aa.a) + aa.a = new BB(); + + if (!aa.a.b.length) + { + alias aaA *pa; + auto len = prime_list[0]; + + aa.a.b = new pa[len]; + } + + auto key_hash = keyti.getHash(pkey); + //printf("hash = %d\n", key_hash); + i = key_hash % aa.a.b.length; + auto pe = &aa.a.b[i]; + while ((e = *pe) !is null) + { + if (key_hash == e.hash) + { + auto c = keyti.compare(pkey, e + 1); + if (c == 0) + goto Lret; + pe = (c < 0) ? &e.left : &e.right; + } + else + pe = (key_hash < e.hash) ? &e.left : &e.right; + } + + // Not found, create new elem + //printf("create new one\n"); + size_t size = aaA.sizeof + keysize + valuesize; + uint bits = keysize < (void*).sizeof && + keysize > (void).sizeof && + valuesize < (void*).sizeof && + valuesize > (void).sizeof ? BlkAttr.NO_SCAN : 0; + e = cast(aaA *) gc_calloc(size, bits); + memcpy(e + 1, pkey, keysize); + e.hash = key_hash; + *pe = e; + + auto nodes = ++aa.a.nodes; + //printf("length = %d, nodes = %d\n", (*aa.a).length, nodes); + if (nodes > aa.a.b.length * 4) + { + _aaRehash(aa,keyti); + } + +Lret: + return cast(void *)(e + 1) + keysize; +} + + +/************************************************* + * Get pointer to value in associative array indexed by key. + * Returns null if it is not already there. + */ + +void* _aaGetRvalue(AA aa, TypeInfo keyti, size_t valuesize, ...) +{ + //printf("_aaGetRvalue(valuesize = %u)\n", valuesize); + if (!aa.a) + return null; + + auto pkey = cast(void *)(&valuesize + 1); + auto keysize = aligntsize(keyti.tsize()); + auto len = aa.a.b.length; + + if (len) + { + auto key_hash = keyti.getHash(pkey); + //printf("hash = %d\n", key_hash); + size_t i = key_hash % len; + auto e = aa.a.b[i]; + while (e !is null) + { + if (key_hash == e.hash) + { + auto c = keyti.compare(pkey, e + 1); + if (c == 0) + return cast(void *)(e + 1) + keysize; + e = (c < 0) ? e.left : e.right; + } + else + e = (key_hash < e.hash) ? e.left : e.right; + } + } + return null; // not found, caller will throw exception +} + + +/************************************************* + * Determine if key is in aa. + * Returns: + * null not in aa + * !=null in aa, return pointer to value + */ + +void* _aaIn(AA aa, TypeInfo keyti, ...) +in +{ +} +out (result) +{ + //assert(result == 0 || result == 1); +} +body +{ + if (aa.a) + { + auto pkey = cast(void *)(&keyti + 1); + + //printf("_aaIn(), .length = %d, .ptr = %x\n", aa.a.length, cast(uint)aa.a.ptr); + auto len = aa.a.b.length; + + if (len) + { + auto key_hash = keyti.getHash(pkey); + //printf("hash = %d\n", key_hash); + size_t i = key_hash % len; + auto e = aa.a.b[i]; + while (e !is null) + { + if (key_hash == e.hash) + { + auto c = keyti.compare(pkey, e + 1); + if (c == 0) + return cast(void *)(e + 1) + aligntsize(keyti.tsize()); + e = (c < 0) ? e.left : e.right; + } + else + e = (key_hash < e.hash) ? e.left : e.right; + } + } + } + + // Not found + return null; +} + +/************************************************* + * Delete key entry in aa[]. + * If key is not in aa[], do nothing. + */ + +void _aaDel(AA aa, TypeInfo keyti, ...) +{ + auto pkey = cast(void *)(&keyti + 1); + aaA *e; + + if (aa.a && aa.a.b.length) + { + auto key_hash = keyti.getHash(pkey); + //printf("hash = %d\n", key_hash); + size_t i = key_hash % aa.a.b.length; + auto pe = &aa.a.b[i]; + while ((e = *pe) !is null) // null means not found + { + if (key_hash == e.hash) + { + auto c = keyti.compare(pkey, e + 1); + if (c == 0) + { + if (!e.left && !e.right) + { + *pe = null; + } + else if (e.left && !e.right) + { + *pe = e.left; + e.left = null; + } + else if (!e.left && e.right) + { + *pe = e.right; + e.right = null; + } + else + { + *pe = e.left; + e.left = null; + do + pe = &(*pe).right; + while (*pe); + *pe = e.right; + e.right = null; + } + + aa.a.nodes--; + + // Should notify GC that e can be free'd now + break; + } + pe = (c < 0) ? &e.left : &e.right; + } + else + pe = (key_hash < e.hash) ? &e.left : &e.right; + } + } +} + + +/******************************************** + * Produce array of values from aa. + */ + +ArrayRet_t _aaValues(AA aa, size_t keysize, size_t valuesize) +in +{ + assert(keysize == aligntsize(keysize)); +} +body +{ + size_t resi; + Array a; + + void _aaValues_x(aaA* e) + { + do + { + memcpy(a.ptr + resi * valuesize, + cast(byte*)e + aaA.sizeof + keysize, + valuesize); + resi++; + if (e.left) + { if (!e.right) + { e = e.left; + continue; + } + _aaValues_x(e.left); + } + e = e.right; + } while (e !is null); + } + + if (aa.a) + { + a.length = _aaLen(aa); + a.ptr = cast(byte*) gc_malloc(a.length * valuesize, + valuesize < (void*).sizeof && + valuesize > (void).sizeof ? BlkAttr.NO_SCAN : 0); + resi = 0; + foreach (e; aa.a.b) + { + if (e) + _aaValues_x(e); + } + assert(resi == a.length); + } + return *cast(ArrayRet_t*)(&a); +} + + +/******************************************** + * Rehash an array. + */ + +void* _aaRehash(AA* paa, TypeInfo keyti) +in +{ + //_aaInvAh(paa); +} +out (result) +{ + //_aaInvAh(result); +} +body +{ + BB newb; + + void _aaRehash_x(aaA* olde) + { + while (1) + { + auto left = olde.left; + auto right = olde.right; + olde.left = null; + olde.right = null; + + aaA *e; + + //printf("rehash %p\n", olde); + auto key_hash = olde.hash; + size_t i = key_hash % newb.b.length; + auto pe = &newb.b[i]; + while ((e = *pe) !is null) + { + //printf("\te = %p, e.left = %p, e.right = %p\n", e, e.left, e.right); + assert(e.left != e); + assert(e.right != e); + if (key_hash == e.hash) + { + auto c = keyti.compare(olde + 1, e + 1); + assert(c != 0); + pe = (c < 0) ? &e.left : &e.right; + } + else + pe = (key_hash < e.hash) ? &e.left : &e.right; + } + *pe = olde; + + if (right) + { + if (!left) + { olde = right; + continue; + } + _aaRehash_x(right); + } + if (!left) + break; + olde = left; + } + } + + //printf("Rehash\n"); + if (paa.a) + { + auto aa = paa.a; + auto len = _aaLen(*paa); + if (len) + { size_t i; + + for (i = 0; i < prime_list.length - 1; i++) + { + if (len <= prime_list[i]) + break; + } + len = prime_list[i]; + newb.b = new aaA*[len]; + + foreach (e; aa.b) + { + if (e) + _aaRehash_x(e); + } + + newb.nodes = aa.nodes; + } + + *paa.a = newb; + } + return (*paa).a; +} + + +/******************************************** + * Produce array of N byte keys from aa. + */ + +ArrayRet_t _aaKeys(AA aa, size_t keysize) +{ + byte[] res; + size_t resi; + + void _aaKeys_x(aaA* e) + { + do + { + memcpy(&res[resi * keysize], cast(byte*)(e + 1), keysize); + resi++; + if (e.left) + { if (!e.right) + { e = e.left; + continue; + } + _aaKeys_x(e.left); + } + e = e.right; + } while (e !is null); + } + + auto len = _aaLen(aa); + if (!len) + return 0; + res = (cast(byte*) gc_malloc(len * keysize, + keysize < (void*).sizeof && + keysize > (void).sizeof ? BlkAttr.NO_SCAN : 0))[0 .. len * keysize]; + resi = 0; + foreach (e; aa.a.b) + { + if (e) + _aaKeys_x(e); + } + assert(resi == len); + + Array a; + a.length = len; + a.ptr = res.ptr; + return *cast(ArrayRet_t*)(&a); +} + + +/********************************************** + * 'apply' for associative arrays - to support foreach + */ + +// dg is D, but _aaApply() is C +extern (D) typedef int delegate(void *) dg_t; + +int _aaApply(AA aa, size_t keysize, dg_t dg) +in +{ + assert(aligntsize(keysize) == keysize); +} +body +{ int result; + + //printf("_aaApply(aa = x%llx, keysize = %d, dg = x%llx)\n", aa.a, keysize, dg); + + int treewalker(aaA* e) + { int result; + + do + { + //printf("treewalker(e = %p, dg = x%llx)\n", e, dg); + result = dg(cast(void *)(e + 1) + keysize); + if (result) + break; + if (e.right) + { if (!e.left) + { + e = e.right; + continue; + } + result = treewalker(e.right); + if (result) + break; + } + e = e.left; + } while (e); + + return result; + } + + if (aa.a) + { + foreach (e; aa.a.b) + { + if (e) + { + result = treewalker(e); + if (result) + break; + } + } + } + return result; +} + +// dg is D, but _aaApply2() is C +extern (D) typedef int delegate(void *, void *) dg2_t; + +int _aaApply2(AA aa, size_t keysize, dg2_t dg) +in +{ + assert(aligntsize(keysize) == keysize); +} +body +{ int result; + + //printf("_aaApply(aa = x%llx, keysize = %d, dg = x%llx)\n", aa.a, keysize, dg); + + int treewalker(aaA* e) + { int result; + + do + { + //printf("treewalker(e = %p, dg = x%llx)\n", e, dg); + result = dg(cast(void *)(e + 1), cast(void *)(e + 1) + keysize); + if (result) + break; + if (e.right) + { if (!e.left) + { + e = e.right; + continue; + } + result = treewalker(e.right); + if (result) + break; + } + e = e.left; + } while (e); + + return result; + } + + if (aa.a) + { + foreach (e; aa.a.b) + { + if (e) + { + result = treewalker(e); + if (result) + break; + } + } + } + return result; +} + + +/*********************************** + * Construct an associative array of type ti from + * length pairs of key/value pairs. + */ + +/+ + +extern (C) +BB* _d_assocarrayliteralT(TypeInfo_AssociativeArray ti, size_t length, ...) +{ + auto valuesize = ti.next.tsize(); // value size + auto keyti = ti.key; + auto keysize = keyti.tsize(); // key size + BB* result; + + //printf("_d_assocarrayliteralT(keysize = %d, valuesize = %d, length = %d)\n", keysize, valuesize, length); + //printf("tivalue = %.*s\n", ti.next.classinfo.name); + if (length == 0 || valuesize == 0 || keysize == 0) + { + ; + } + else + { + va_list q; + va_start!(size_t)(q, length); + + result = new BB(); + size_t i; + + for (i = 0; i < prime_list.length - 1; i++) + { + if (length <= prime_list[i]) + break; + } + auto len = prime_list[i]; + result.b = new aaA*[len]; + + size_t keystacksize = (keysize + int.sizeof - 1) & ~(int.sizeof - 1); + size_t valuestacksize = (valuesize + int.sizeof - 1) & ~(int.sizeof - 1); + + size_t keytsize = aligntsize(keysize); + + for (size_t j = 0; j < length; j++) + { void* pkey = q; + q += keystacksize; + void* pvalue = q; + q += valuestacksize; + aaA* e; + + auto key_hash = keyti.getHash(pkey); + //printf("hash = %d\n", key_hash); + i = key_hash % len; + auto pe = &result.b[i]; + while (1) + { + e = *pe; + if (!e) + { + // Not found, create new elem + //printf("create new one\n"); + e = cast(aaA *) cast(void*) new void[aaA.sizeof + keytsize + valuesize]; + memcpy(e + 1, pkey, keysize); + e.hash = key_hash; + *pe = e; + result.nodes++; + break; + } + if (key_hash == e.hash) + { + auto c = keyti.compare(pkey, e + 1); + if (c == 0) + break; + pe = (c < 0) ? &e.left : &e.right; + } + else + pe = (key_hash < e.hash) ? &e.left : &e.right; + } + memcpy(cast(void *)(e + 1) + keytsize, pvalue, valuesize); + } + + va_end(q); + } + return result; +} + ++/ diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/adi.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/adi.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,614 @@ +//_ adi.d + +/** + * Part of the D programming language runtime library. + * Dynamic array property support routines + */ + +/* + * Copyright (C) 2000-2006 by Digital Mars, www.digitalmars.com + * Written by Walter Bright + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, in both source and binary form, subject to the following + * restrictions: + * + * o The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * o Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * o This notice may not be removed or altered from any source + * distribution. + */ + +/* + * Modified by Sean Kelly for use with Tango. + */ + + +//debug=adi; // uncomment to turn on debugging printf's + +private +{ + import tango.stdc.string; + import tango.stdc.stdlib; + import util.utf; + + enum BlkAttr : uint + { + FINALIZE = 0b0000_0001, + NO_SCAN = 0b0000_0010, + NO_MOVE = 0b0000_0100, + ALL_BITS = 0b1111_1111 + } + + extern (C) void* gc_malloc( size_t sz, uint ba = 0 ); + extern (C) void* gc_calloc( size_t sz, uint ba = 0 ); + extern (C) void gc_free( void* p ); +} + + +struct Array +{ + size_t length; + void* ptr; +} + +/********************************************** + * Reverse array of chars. + * Handled separately because embedded multibyte encodings should not be + * reversed. + */ + +extern (C) long _adReverseChar(char[] a) +{ + if (a.length > 1) + { + char[6] tmp; + char[6] tmplo; + char* lo = a.ptr; + char* hi = &a[length - 1]; + + while (lo < hi) + { auto clo = *lo; + auto chi = *hi; + + debug(adi) printf("lo = %d, hi = %d\n", lo, hi); + if (clo <= 0x7F && chi <= 0x7F) + { + debug(adi) printf("\tascii\n"); + *lo = chi; + *hi = clo; + lo++; + hi--; + continue; + } + + uint stridelo = UTF8stride[clo]; + + uint stridehi = 1; + while ((chi & 0xC0) == 0x80) + { + chi = *--hi; + stridehi++; + assert(hi >= lo); + } + if (lo == hi) + break; + + debug(adi) printf("\tstridelo = %d, stridehi = %d\n", stridelo, stridehi); + if (stridelo == stridehi) + { + + memcpy(tmp.ptr, lo, stridelo); + memcpy(lo, hi, stridelo); + memcpy(hi, tmp.ptr, stridelo); + lo += stridelo; + hi--; + continue; + } + + /* Shift the whole array. This is woefully inefficient + */ + memcpy(tmp.ptr, hi, stridehi); + memcpy(tmplo.ptr, lo, stridelo); + memmove(lo + stridehi, lo + stridelo , cast(size_t)(hi - lo) - stridelo); + memcpy(lo, tmp.ptr, stridehi); + memcpy(hi + stridehi - stridelo, tmplo.ptr, stridelo); + + lo += stridehi; + hi = hi - 1 + (stridehi - stridelo); + } + } + return *cast(long*)(&a); +} + +unittest +{ + auto a = "abcd"c; + + auto r = a.dup.reverse; + //writefln(r); + assert(r == "dcba"); + + a = "a\u1235\u1234c"; + //writefln(a); + r = a.dup.reverse; + //writefln(r); + assert(r == "c\u1234\u1235a"); + + a = "ab\u1234c"; + //writefln(a); + r = a.dup.reverse; + //writefln(r); + assert(r == "c\u1234ba"); + + a = "\u3026\u2021\u3061\n"; + r = a.dup.reverse; + assert(r == "\n\u3061\u2021\u3026"); +} + + +/********************************************** + * Reverse array of wchars. + * Handled separately because embedded multiword encodings should not be + * reversed. + */ + +extern (C) long _adReverseWchar(wchar[] a) +{ + if (a.length > 1) + { + wchar[2] tmp; + wchar* lo = a.ptr; + wchar* hi = &a[length - 1]; + + while (lo < hi) + { auto clo = *lo; + auto chi = *hi; + + if ((clo < 0xD800 || clo > 0xDFFF) && + (chi < 0xD800 || chi > 0xDFFF)) + { + *lo = chi; + *hi = clo; + lo++; + hi--; + continue; + } + + int stridelo = 1 + (clo >= 0xD800 && clo <= 0xDBFF); + + int stridehi = 1; + if (chi >= 0xDC00 && chi <= 0xDFFF) + { + chi = *--hi; + stridehi++; + assert(hi >= lo); + } + if (lo == hi) + break; + + if (stridelo == stridehi) + { int stmp; + + assert(stridelo == 2); + assert(stmp.sizeof == 2 * (*lo).sizeof); + stmp = *cast(int*)lo; + *cast(int*)lo = *cast(int*)hi; + *cast(int*)hi = stmp; + lo += stridelo; + hi--; + continue; + } + + /* Shift the whole array. This is woefully inefficient + */ + memcpy(tmp.ptr, hi, stridehi * wchar.sizeof); + memcpy(hi + stridehi - stridelo, lo, stridelo * wchar.sizeof); + memmove(lo + stridehi, lo + stridelo , (hi - (lo + stridelo)) * wchar.sizeof); + memcpy(lo, tmp.ptr, stridehi * wchar.sizeof); + + lo += stridehi; + hi = hi - 1 + (stridehi - stridelo); + } + } + return *cast(long*)(&a); +} + +unittest +{ + wstring a = "abcd"; + wstring r; + + r = a.dup.reverse; + assert(r == "dcba"); + + a = "a\U00012356\U00012346c"; + r = a.dup.reverse; + assert(r == "c\U00012346\U00012356a"); + + a = "ab\U00012345c"; + r = a.dup.reverse; + assert(r == "c\U00012345ba"); +} + + +/********************************************** + * Support for array.reverse property. + */ + +extern (C) long _adReverse(Array a, size_t szelem) + out (result) + { + assert(result is *cast(long*)(&a)); + } + body + { + if (a.length >= 2) + { + byte* tmp; + byte[16] buffer; + + void* lo = a.ptr; + void* hi = a.ptr + (a.length - 1) * szelem; + + tmp = buffer.ptr; + if (szelem > 16) + { + //version (Win32) + tmp = cast(byte*) alloca(szelem); + //else + //tmp = gc_malloc(szelem); + } + + for (; lo < hi; lo += szelem, hi -= szelem) + { + memcpy(tmp, lo, szelem); + memcpy(lo, hi, szelem); + memcpy(hi, tmp, szelem); + } + + version (Win32) + { + } + else + { + //if (szelem > 16) + // BUG: bad code is generate for delete pointer, tries + // to call delclass. + //gc_free(tmp); + } + } + return *cast(long*)(&a); + } + +unittest +{ + debug(adi) printf("array.reverse.unittest\n"); + + int[] a = new int[5]; + int[] b; + size_t i; + + for (i = 0; i < 5; i++) + a[i] = i; + b = a.reverse; + assert(b is a); + for (i = 0; i < 5; i++) + assert(a[i] == 4 - i); + + struct X20 + { // More than 16 bytes in size + int a; + int b, c, d, e; + } + + X20[] c = new X20[5]; + X20[] d; + + for (i = 0; i < 5; i++) + { c[i].a = i; + c[i].e = 10; + } + d = c.reverse; + assert(d is c); + for (i = 0; i < 5; i++) + { + assert(c[i].a == 4 - i); + assert(c[i].e == 10); + } +} + +/********************************************** + * Sort array of chars. + */ + +extern (C) long _adSortChar(char[] a) +{ + if (a.length > 1) + { + dchar[] da = toUTF32(a); + da.sort; + size_t i = 0; + foreach (dchar d; da) + { char[4] buf; + auto t = toUTF8(buf, d); + a[i .. i + t.length] = t[]; + i += t.length; + } + delete da; + } + return *cast(long*)(&a); +} + +/********************************************** + * Sort array of wchars. + */ + +extern (C) long _adSortWchar(wchar[] a) +{ + if (a.length > 1) + { + dchar[] da = toUTF32(a); + da.sort; + size_t i = 0; + foreach (dchar d; da) + { wchar[2] buf; + auto t = toUTF16(buf, d); + a[i .. i + t.length] = t[]; + i += t.length; + } + delete da; + } + return *cast(long*)(&a); +} + +/*************************************** + * Support for array equality test. + */ + +extern (C) int _adEq(Array a1, Array a2, TypeInfo ti) +{ + debug(adi) printf("_adEq(a1.length = %d, a2.length = %d)\n", a1.length, a2.length); + if (a1.length != a2.length) + return 0; // not equal + auto sz = ti.tsize(); + auto p1 = a1.ptr; + auto p2 = a2.ptr; + +/+ + for (int i = 0; i < a1.length; i++) + { + printf("%4x %4x\n", (cast(short*)p1)[i], (cast(short*)p2)[i]); + } ++/ + + if (sz == 1) + // We should really have a ti.isPOD() check for this + return (memcmp(p1, p2, a1.length) == 0); + + for (size_t i = 0; i < a1.length; i++) + { + if (!ti.equals(p1 + i * sz, p2 + i * sz)) + return 0; // not equal + } + return 1; // equal +} + +unittest +{ + debug(adi) printf("array.Eq unittest\n"); + + auto a = "hello"c; + + assert(a != "hel"); + assert(a != "helloo"); + assert(a != "betty"); + assert(a == "hello"); + assert(a != "hxxxx"); +} + +/*************************************** + * Support for array compare test. + */ + +extern (C) int _adCmp(Array a1, Array a2, TypeInfo ti) +{ + debug(adi) printf("adCmp()\n"); + auto len = a1.length; + if (a2.length < len) + len = a2.length; + auto sz = ti.tsize(); + void *p1 = a1.ptr; + void *p2 = a2.ptr; + + if (sz == 1) + { // We should really have a ti.isPOD() check for this + auto c = memcmp(p1, p2, len); + if (c) + return c; + } + else + { + for (size_t i = 0; i < len; i++) + { + auto c = ti.compare(p1 + i * sz, p2 + i * sz); + if (c) + return c; + } + } + if (a1.length == a2.length) + return 0; + return (a1.length > a2.length) ? 1 : -1; +} + +unittest +{ + debug(adi) printf("array.Cmp unittest\n"); + + auto a = "hello"c; + + assert(a > "hel"); + assert(a >= "hel"); + assert(a < "helloo"); + assert(a <= "helloo"); + assert(a > "betty"); + assert(a >= "betty"); + assert(a == "hello"); + assert(a <= "hello"); + assert(a >= "hello"); +} + +/*************************************** + * Support for array compare test. + */ + +extern (C) int _adCmpChar(Array a1, Array a2) +{ + version (X86) + { + asm + { naked ; + + push EDI ; + push ESI ; + + mov ESI,a1+4[4+ESP] ; + mov EDI,a2+4[4+ESP] ; + + mov ECX,a1[4+ESP] ; + mov EDX,a2[4+ESP] ; + + cmp ECX,EDX ; + jb GotLength ; + + mov ECX,EDX ; + +GotLength: + cmp ECX,4 ; + jb DoBytes ; + + // Do alignment if neither is dword aligned + test ESI,3 ; + jz Aligned ; + + test EDI,3 ; + jz Aligned ; +DoAlign: + mov AL,[ESI] ; //align ESI to dword bounds + mov DL,[EDI] ; + + cmp AL,DL ; + jnz Unequal ; + + inc ESI ; + inc EDI ; + + test ESI,3 ; + + lea ECX,[ECX-1] ; + jnz DoAlign ; +Aligned: + mov EAX,ECX ; + + // do multiple of 4 bytes at a time + + shr ECX,2 ; + jz TryOdd ; + + repe ; + cmpsd ; + + jnz UnequalQuad ; + +TryOdd: + mov ECX,EAX ; +DoBytes: + // if still equal and not end of string, do up to 3 bytes slightly + // slower. + + and ECX,3 ; + jz Equal ; + + repe ; + cmpsb ; + + jnz Unequal ; +Equal: + mov EAX,a1[4+ESP] ; + mov EDX,a2[4+ESP] ; + + sub EAX,EDX ; + pop ESI ; + + pop EDI ; + ret ; + +UnequalQuad: + mov EDX,[EDI-4] ; + mov EAX,[ESI-4] ; + + cmp AL,DL ; + jnz Unequal ; + + cmp AH,DH ; + jnz Unequal ; + + shr EAX,16 ; + + shr EDX,16 ; + + cmp AL,DL ; + jnz Unequal ; + + cmp AH,DH ; +Unequal: + sbb EAX,EAX ; + pop ESI ; + + or EAX,1 ; + pop EDI ; + + ret ; + } + } + else + { + int len; + int c; + + debug(adi) printf("adCmpChar()\n"); + len = cast(int)a1.length; + if (a2.length < len) + len = cast(int)a2.length; + c = memcmp(cast(char *)a1.ptr, cast(char *)a2.ptr, len); + if (!c) + c = cast(int)a1.length - cast(int)a2.length; + return c; + } +} + +unittest +{ + debug(adi) printf("array.CmpChar unittest\n"); + + auto a = "hello"c; + + assert(a > "hel"); + assert(a >= "hel"); + assert(a < "helloo"); + assert(a <= "helloo"); + assert(a > "betty"); + assert(a >= "betty"); + assert(a == "hello"); + assert(a <= "hello"); + assert(a >= "hello"); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/arrays.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/arrays.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,109 @@ +private import llvm.intrinsic; + +extern(C): + +int memcmp(void*,void*,size_t); +size_t strlen(char*); + +version(LLVM64) +alias llvm_memcpy_i64 llvm_memcpy; +else +alias llvm_memcpy_i32 llvm_memcpy; + +// per-element array init routines + +void _d_array_init_i1(bool* a, size_t n, bool v) +{ + auto p = a; + auto end = a+n; + while (p !is end) + *p++ = v; +} + +void _d_array_init_i8(ubyte* a, size_t n, ubyte v) +{ + auto p = a; + auto end = a+n; + while (p !is end) + *p++ = v; +} + +void _d_array_init_i16(ushort* a, size_t n, ushort v) +{ + auto p = a; + auto end = a+n; + while (p !is end) + *p++ = v; +} + +void _d_array_init_i32(uint* a, size_t n, uint v) +{ + auto p = a; + auto end = a+n; + while (p !is end) + *p++ = v; +} + +void _d_array_init_i64(ulong* a, size_t n, ulong v) +{ + auto p = a; + auto end = a+n; + while (p !is end) + *p++ = v; +} + +void _d_array_init_float(float* a, size_t n, float v) +{ + auto p = a; + auto end = a+n; + while (p !is end) + *p++ = v; +} + +void _d_array_init_double(double* a, size_t n, double v) +{ + auto p = a; + auto end = a+n; + while (p !is end) + *p++ = v; +} + +void _d_array_init_pointer(void** a, size_t n, void* v) +{ + auto p = a; + auto end = a+n; + while (p !is end) + *p++ = v; +} + +void _d_array_init_mem(void* a, size_t na, void* v, size_t nv) +{ + auto p = a; + auto end = a + na*nv; + while (p !is end) { + llvm_memcpy(p,v,nv,0); + p += nv; + } +} + +// for array cast +size_t _d_array_cast_len(size_t len, size_t elemsz, size_t newelemsz) +{ + if (newelemsz == 1) { + return len*elemsz; + } + else if (len % newelemsz) { + throw new Exception("Bad array cast"); + } + return (len*elemsz)/newelemsz; +} + +// creating args for main +void _d_main_args(uint n, char** args, ref char[][] res) +{ + assert(res.length == n); + foreach(i,v; args[0..n]) + { + res[i] = v[0 .. strlen(v)]; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/cast.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/cast.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,182 @@ +/* + * Copyright (C) 2004-2006 by Digital Mars, www.digitalmars.com + * Written by Walter Bright + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, in both source and binary form, subject to the following + * restrictions: + * + * o The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * o Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * o This notice may not be removed or altered from any source + * distribution. + */ + +/* + * Modified by Sean Kelly for use with Tango. + */ + +extern (C): + +/****************************************** + * Given a pointer: + * If it is an Object, return that Object. + * If it is an interface, return the Object implementing the interface. + * If it is null, return null. + * Else, undefined crash + */ + +Object _d_toObject(void* p) +{ Object o; + + if (p) + { + o = cast(Object)p; + ClassInfo oc = o.classinfo; + Interface *pi = **cast(Interface ***)p; + + /* Interface.offset lines up with ClassInfo.name.ptr, + * so we rely on pointers never being less than 64K, + * and Objects never being greater. + */ + if (pi.offset < 0x10000) + { + //printf("\tpi.offset = %d\n", pi.offset); + o = cast(Object)(p - pi.offset); + } + } + return o; +} + + +/************************************* + * Attempts to cast Object o to class c. + * Returns o if successful, null if not. + */ + +Object _d_interface_cast(void* p, ClassInfo c) +{ Object o; + + //printf("_d_interface_cast(p = %p, c = '%.*s')\n", p, c.name); + if (p) + { + Interface *pi = **cast(Interface ***)p; + + //printf("\tpi.offset = %d\n", pi.offset); + o = cast(Object)(p - pi.offset); + return _d_dynamic_cast(o, c); + } + return o; +} + +Object _d_dynamic_cast(Object o, ClassInfo c) +{ ClassInfo oc; + size_t offset = 0; + + //printf("_d_dynamic_cast(o = %p, c = '%.*s')\n", o, c.name); + + if (o) + { + oc = o.classinfo; + if (_d_isbaseof2(oc, c, offset)) + { + //printf("\toffset = %d\n", offset); + o = cast(Object)(cast(void*)o + offset); + } + else + o = null; + } + //printf("\tresult = %p\n", o); + return o; +} + +int _d_isbaseof2(ClassInfo oc, ClassInfo c, inout size_t offset) +{ int i; + + if (oc is c) + return 1; + do + { + if (oc.base is c) + return 1; + for (i = 0; i < oc.interfaces.length; i++) + { + ClassInfo ic; + + ic = oc.interfaces[i].classinfo; + if (ic is c) + { offset = cast(size_t)oc.interfaces[i].offset; + return 1; + } + } + for (i = 0; i < oc.interfaces.length; i++) + { + ClassInfo ic; + + ic = oc.interfaces[i].classinfo; + if (_d_isbaseof2(ic, c, offset)) + { offset = cast(size_t)oc.interfaces[i].offset; + return 1; + } + } + oc = oc.base; + } while (oc); + return 0; +} + +int _d_isbaseof(ClassInfo oc, ClassInfo c) +{ int i; + + if (oc is c) + return 1; + do + { + if (oc.base is c) + return 1; + for (i = 0; i < oc.interfaces.length; i++) + { + ClassInfo ic; + + ic = oc.interfaces[i].classinfo; + if (ic is c || _d_isbaseof(ic, c)) + return 1; + } + oc = oc.base; + } while (oc); + return 0; +} + +/********************************* + * Find the vtbl[] associated with Interface ic. + */ + +void *_d_interface_vtbl(ClassInfo ic, Object o) +{ int i; + ClassInfo oc; + + //printf("__d_interface_vtbl(o = %p, ic = %p)\n", o, ic); + + assert(o); + + oc = o.classinfo; + for (i = 0; i < oc.interfaces.length; i++) + { + ClassInfo oic; + + oic = oc.interfaces[i].classinfo; + if (oic is ic) + { + return cast(void *)oc.interfaces[i].vtbl; + } + } + assert(0); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/contract.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/contract.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,12 @@ +extern(C): + +void exit(int); +int printf(char*,...); + +void _d_assert(bool cond, uint line, char[] msg) +{ + if (!cond) { + printf("Aborted(%u): %.*s\n", line, msg.length, msg.ptr); + exit(1); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/genobj.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/genobj.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,1175 @@ +/** + * Part of the D programming language runtime library. + * Forms the symbols available to all D programs. Includes + * Object, which is the root of the class object hierarchy. + * + * This module is implicitly imported. + * Macros: + * WIKI = Object + */ + +/* + * Copyright (C) 2004-2007 by Digital Mars, www.digitalmars.com + * Written by Walter Bright + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, in both source and binary form, subject to the following + * restrictions: + * + * o The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * o Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * o This notice may not be removed or altered from any source + * distribution. + */ + +/* + * Modified by Sean Kelly for use with Tango. + */ + +module object; + +private +{ + import tango.stdc.string; // : memcmp, memcpy; + import tango.stdc.stdlib; // : calloc, realloc, free; + import util.string; + debug(PRINTF) import tango.stdc.stdio; // : printf; + + extern (C) void onOutOfMemoryError(); + extern (C) Object _d_newclass(ClassInfo ci); +} + +// NOTE: For some reason, this declaration method doesn't work +// in this particular file (and this file only). It must +// be a DMD thing. +//alias typeof(int.sizeof) size_t; +//alias typeof(cast(void*)0 - cast(void*)0) ptrdiff_t; + +version( X86_64 ) +{ + alias ulong size_t; + alias long ptrdiff_t; +} +else +{ + alias uint size_t; + alias int ptrdiff_t; +} + +alias size_t hash_t; + +/** + * All D class objects inherit from Object. + */ +class Object +{ + /** + * Convert Object to a human readable string. + */ + char[] toString() + { + return this.classinfo.name; + } + + /** + * Compute hash function for Object. + */ + hash_t toHash() + { + // BUG: this prevents a compacting GC from working, needs to be fixed + return cast(hash_t)cast(void*)this; + } + + /** + * Compare with another Object obj. + * Returns: + * $(TABLE + * $(TR $(TD this < obj) $(TD < 0)) + * $(TR $(TD this == obj) $(TD 0)) + * $(TR $(TD this > obj) $(TD > 0)) + * ) + */ + int opCmp(Object o) + { + // BUG: this prevents a compacting GC from working, needs to be fixed + //return cast(int)cast(void*)this - cast(int)cast(void*)o; + + //throw new Exception("need opCmp for class " ~ this.classinfo.name); + return this !is o; + } + + /** + * Returns !=0 if this object does have the same contents as obj. + */ + int opEquals(Object o) + { + return cast(int)(this is o); + } + + interface Monitor + { + void lock(); + void unlock(); + } +} + +/** + * Information about an interface. + * A pointer to this appears as the first entry in the interface's vtbl[]. + */ +struct Interface +{ + ClassInfo classinfo; /// .classinfo for this interface (not for containing class) + void*[] vtbl; + ptrdiff_t offset; /// offset to Interface 'this' from Object 'this' +} + +/** + * Runtime type information about a class. Can be retrieved for any class type + * or instance by using the .classinfo property. + * A pointer to this appears as the first entry in the class's vtbl[]. + */ +class ClassInfo : Object +{ + byte[] init; /** class static initializer + * (init.length gives size in bytes of class) + */ + char[] name; /// class name + void*[] vtbl; /// virtual function pointer table + Interface[] interfaces; /// interfaces this class implements + ClassInfo base; /// base class + void* destructor; + void function(Object) classInvariant; + uint flags; + // 1: // IUnknown + // 2: // has no possible pointers into GC memory + // 4: // has offTi[] member + // 8: // has constructors + void* deallocator; + OffsetTypeInfo[] offTi; + void function(Object) defaultConstructor; // default Constructor + + /** + * Search all modules for ClassInfo corresponding to classname. + * Returns: null if not found + */ + static ClassInfo find(char[] classname) + { + foreach (m; ModuleInfo) + { + //writefln("module %s, %d", m.name, m.localClasses.length); + foreach (c; m.localClasses) + { + //writefln("\tclass %s", c.name); + if (c.name == classname) + return c; + } + } + return null; + } + + /** + * Create instance of Object represented by 'this'. + */ + Object create() + { + if (flags & 8 && !defaultConstructor) + return null; + Object o = _d_newclass(this); + if (flags & 8 && defaultConstructor) + { + defaultConstructor(o); + } + return o; + } +} + +/** + * Array of pairs giving the offset and type information for each + * member in an aggregate. + */ +struct OffsetTypeInfo +{ + size_t offset; /// Offset of member from start of object + TypeInfo ti; /// TypeInfo for this member +} + +/** + * Runtime type information about a type. + * Can be retrieved for any type using a + * TypeidExpression. + */ +class TypeInfo +{ + hash_t toHash() + { hash_t hash; + + foreach (char c; this.toString()) + hash = hash * 9 + c; + return hash; + } + + int opCmp(Object o) + { + if (this is o) + return 0; + TypeInfo ti = cast(TypeInfo)o; + if (ti is null) + return 1; + return stringCompare(this.toString(), ti.toString()); + } + + int opEquals(Object o) + { + /* TypeInfo instances are singletons, but duplicates can exist + * across DLL's. Therefore, comparing for a name match is + * sufficient. + */ + if (this is o) + return 1; + TypeInfo ti = cast(TypeInfo)o; + return cast(int)(ti && this.toString() == ti.toString()); + } + + /// Returns a hash of the instance of a type. + hash_t getHash(void *p) { return cast(hash_t)p; } + + /// Compares two instances for equality. + int equals(void *p1, void *p2) { return cast(int)(p1 == p2); } + + /// Compares two instances for <, ==, or >. + int compare(void *p1, void *p2) { return 0; } + + /// Returns size of the type. + size_t tsize() { return 0; } + + /// Swaps two instances of the type. + void swap(void *p1, void *p2) + { + size_t n = tsize(); + for (size_t i = 0; i < n; i++) + { byte t; + + t = (cast(byte *)p1)[i]; + (cast(byte *)p1)[i] = (cast(byte *)p2)[i]; + (cast(byte *)p2)[i] = t; + } + } + + /// Get TypeInfo for 'next' type, as defined by what kind of type this is, + /// null if none. + TypeInfo next() { return null; } + + /// Return default initializer, null if default initialize to 0 + void[] init() { return null; } + + /// Get flags for type: 1 means GC should scan for pointers + uint flags() { return 0; } + + /// Get type information on the contents of the type; null if not available + OffsetTypeInfo[] offTi() { return null; } +} + +class TypeInfo_Typedef : TypeInfo +{ + char[] toString() { return name; } + + int opEquals(Object o) + { TypeInfo_Typedef c; + + return cast(int) + (this is o || + ((c = cast(TypeInfo_Typedef)o) !is null && + this.name == c.name && + this.base == c.base)); + } + + hash_t getHash(void *p) { return base.getHash(p); } + int equals(void *p1, void *p2) { return base.equals(p1, p2); } + int compare(void *p1, void *p2) { return base.compare(p1, p2); } + size_t tsize() { return base.tsize(); } + void swap(void *p1, void *p2) { return base.swap(p1, p2); } + + TypeInfo next() { return base.next(); } + uint flags() { return base.flags(); } + void[] init() { return m_init.length ? m_init : base.init(); } + + TypeInfo base; + char[] name; + void[] m_init; +} + +class TypeInfo_Enum : TypeInfo_Typedef +{ +} + +class TypeInfo_Pointer : TypeInfo +{ + char[] toString() { return m_next.toString() ~ "*"; } + + int opEquals(Object o) + { TypeInfo_Pointer c; + + return this is o || + ((c = cast(TypeInfo_Pointer)o) !is null && + this.m_next == c.m_next); + } + + hash_t getHash(void *p) + { + return cast(hash_t)*cast(void**)p; + } + + int equals(void *p1, void *p2) + { + return cast(int)(*cast(void* *)p1 == *cast(void* *)p2); + } + + int compare(void *p1, void *p2) + { + if (*cast(void* *)p1 < *cast(void* *)p2) + return -1; + else if (*cast(void* *)p1 > *cast(void* *)p2) + return 1; + else + return 0; + } + + size_t tsize() + { + return (void*).sizeof; + } + + void swap(void *p1, void *p2) + { void* tmp; + tmp = *cast(void**)p1; + *cast(void**)p1 = *cast(void**)p2; + *cast(void**)p2 = tmp; + } + + TypeInfo next() { return m_next; } + uint flags() { return 1; } + + TypeInfo m_next; +} + +class TypeInfo_Array : TypeInfo +{ + char[] toString() { return value.toString() ~ "[]"; } + + int opEquals(Object o) + { TypeInfo_Array c; + + return cast(int) + (this is o || + ((c = cast(TypeInfo_Array)o) !is null && + this.value == c.value)); + } + + hash_t getHash(void *p) + { size_t sz = value.tsize(); + hash_t hash = 0; + void[] a = *cast(void[]*)p; + for (size_t i = 0; i < a.length; i++) + hash += value.getHash(a.ptr + i * sz); + return hash; + } + + int equals(void *p1, void *p2) + { + void[] a1 = *cast(void[]*)p1; + void[] a2 = *cast(void[]*)p2; + if (a1.length != a2.length) + return 0; + size_t sz = value.tsize(); + for (size_t i = 0; i < a1.length; i++) + { + if (!value.equals(a1.ptr + i * sz, a2.ptr + i * sz)) + return 0; + } + return 1; + } + + int compare(void *p1, void *p2) + { + void[] a1 = *cast(void[]*)p1; + void[] a2 = *cast(void[]*)p2; + size_t sz = value.tsize(); + size_t len = a1.length; + + if (a2.length < len) + len = a2.length; + for (size_t u = 0; u < len; u++) + { + int result = value.compare(a1.ptr + u * sz, a2.ptr + u * sz); + if (result) + return result; + } + return cast(int)a1.length - cast(int)a2.length; + } + + size_t tsize() + { + return (void[]).sizeof; + } + + void swap(void *p1, void *p2) + { void[] tmp; + tmp = *cast(void[]*)p1; + *cast(void[]*)p1 = *cast(void[]*)p2; + *cast(void[]*)p2 = tmp; + } + + TypeInfo value; + + TypeInfo next() + { + return value; +} + + uint flags() { return 1; } +} + +class TypeInfo_StaticArray : TypeInfo +{ + char[] toString() + { + char [10] tmp = void; + return value.toString() ~ "[" ~ intToUtf8(tmp, len) ~ "]"; + } + + int opEquals(Object o) + { TypeInfo_StaticArray c; + + return cast(int) + (this is o || + ((c = cast(TypeInfo_StaticArray)o) !is null && + this.len == c.len && + this.value == c.value)); + } + + hash_t getHash(void *p) + { size_t sz = value.tsize(); + hash_t hash = 0; + for (size_t i = 0; i < len; i++) + hash += value.getHash(p + i * sz); + return hash; + } + + int equals(void *p1, void *p2) + { + size_t sz = value.tsize(); + + for (size_t u = 0; u < len; u++) + { + if (!value.equals(p1 + u * sz, p2 + u * sz)) + return 0; + } + return 1; + } + + int compare(void *p1, void *p2) + { + size_t sz = value.tsize(); + + for (size_t u = 0; u < len; u++) + { + int result = value.compare(p1 + u * sz, p2 + u * sz); + if (result) + return result; + } + return 0; + } + + size_t tsize() + { + return len * value.tsize(); + } + + void swap(void *p1, void *p2) + { void* tmp; + size_t sz = value.tsize(); + ubyte[16] buffer; + void* pbuffer; + + if (sz < buffer.sizeof) + tmp = buffer.ptr; + else + tmp = pbuffer = (new void[sz]).ptr; + + for (size_t u = 0; u < len; u += sz) + { size_t o = u * sz; + memcpy(tmp, p1 + o, sz); + memcpy(p1 + o, p2 + o, sz); + memcpy(p2 + o, tmp, sz); + } + if (pbuffer) + delete pbuffer; + } + + void[] init() { return value.init(); } + TypeInfo next() { return value; } + uint flags() { return value.flags(); } + + TypeInfo value; + size_t len; +} + +class TypeInfo_AssociativeArray : TypeInfo +{ + char[] toString() + { + return next.toString() ~ "[" ~ key.toString() ~ "]"; + } + + int opEquals(Object o) + { TypeInfo_AssociativeArray c; + + return this is o || + ((c = cast(TypeInfo_AssociativeArray)o) !is null && + this.key == c.key && + this.value == c.value); + } + + // BUG: need to add the rest of the functions + + size_t tsize() + { + return (char[int]).sizeof; + } + + TypeInfo next() { return value; } + uint flags() { return 1; } + + TypeInfo value; + TypeInfo key; +} + +class TypeInfo_Function : TypeInfo +{ + char[] toString() + { + return next.toString() ~ "()"; + } + + int opEquals(Object o) + { TypeInfo_Function c; + + return this is o || + ((c = cast(TypeInfo_Function)o) !is null && + this.next == c.next); + } + + // BUG: need to add the rest of the functions + + size_t tsize() + { + return 0; // no size for functions + } + + TypeInfo next; +} + +class TypeInfo_Delegate : TypeInfo +{ + char[] toString() + { + return next.toString() ~ " delegate()"; + } + + int opEquals(Object o) + { TypeInfo_Delegate c; + + return this is o || + ((c = cast(TypeInfo_Delegate)o) !is null && + this.next == c.next); + } + + // BUG: need to add the rest of the functions + + size_t tsize() + { alias int delegate() dg; + return dg.sizeof; + } + + uint flags() { return 1; } + + TypeInfo next; +} + +class TypeInfo_Class : TypeInfo +{ + char[] toString() { return info.name; } + + int opEquals(Object o) + { TypeInfo_Class c; + + return this is o || + ((c = cast(TypeInfo_Class)o) !is null && + this.info.name == c.classinfo.name); + } + + hash_t getHash(void *p) + { + Object o = *cast(Object*)p; + assert(o); + return o.toHash(); + } + + int equals(void *p1, void *p2) + { + Object o1 = *cast(Object*)p1; + Object o2 = *cast(Object*)p2; + + return (o1 is o2) || (o1 && o1.opEquals(o2)); + } + + int compare(void *p1, void *p2) + { + Object o1 = *cast(Object*)p1; + Object o2 = *cast(Object*)p2; + int c = 0; + + // Regard null references as always being "less than" + if (o1 !is o2) + { + if (o1) + { if (!o2) + c = 1; + else + c = o1.opCmp(o2); + } + else + c = -1; + } + return c; + } + + size_t tsize() + { + return Object.sizeof; + } + + uint flags() { return 1; } + + OffsetTypeInfo[] offTi() + { + return (info.flags & 4) ? info.offTi : null; + } + + ClassInfo info; +} + +class TypeInfo_Interface : TypeInfo +{ + char[] toString() { return info.name; } + + int opEquals(Object o) + { TypeInfo_Interface c; + + return this is o || + ((c = cast(TypeInfo_Interface)o) !is null && + this.info.name == c.classinfo.name); + } + + hash_t getHash(void *p) + { + Interface* pi = **cast(Interface ***)*cast(void**)p; + Object o = cast(Object)(*cast(void**)p - pi.offset); + assert(o); + return o.toHash(); + } + + int equals(void *p1, void *p2) + { + Interface* pi = **cast(Interface ***)*cast(void**)p1; + Object o1 = cast(Object)(*cast(void**)p1 - pi.offset); + pi = **cast(Interface ***)*cast(void**)p2; + Object o2 = cast(Object)(*cast(void**)p2 - pi.offset); + + return o1 == o2 || (o1 && o1.opCmp(o2) == 0); + } + + int compare(void *p1, void *p2) + { + Interface* pi = **cast(Interface ***)*cast(void**)p1; + Object o1 = cast(Object)(*cast(void**)p1 - pi.offset); + pi = **cast(Interface ***)*cast(void**)p2; + Object o2 = cast(Object)(*cast(void**)p2 - pi.offset); + int c = 0; + + // Regard null references as always being "less than" + if (o1 != o2) + { + if (o1) + { if (!o2) + c = 1; + else + c = o1.opCmp(o2); + } + else + c = -1; + } + return c; + } + + size_t tsize() + { + return Object.sizeof; + } + + uint flags() { return 1; } + + ClassInfo info; +} + +class TypeInfo_Struct : TypeInfo +{ + char[] toString() { return name; } + + int opEquals(Object o) + { TypeInfo_Struct s; + + return this is o || + ((s = cast(TypeInfo_Struct)o) !is null && + this.name == s.name && + this.init.length == s.init.length); + } + + hash_t getHash(void *p) + { hash_t h; + + assert(p); + if (xtoHash) + { debug(PRINTF) printf("getHash() using xtoHash\n"); + h = (*xtoHash)(p); + } + else + { + debug(PRINTF) printf("getHash() using default hash\n"); + // A sorry hash algorithm. + // Should use the one for strings. + // BUG: relies on the GC not moving objects + for (size_t i = 0; i < init.length; i++) + { h = h * 9 + *cast(ubyte*)p; + p++; + } + } + return h; + } + + int equals(void *p2, void *p1) + { int c; + + if (p1 == p2) + c = 1; + else if (!p1 || !p2) + c = 0; + else if (xopEquals) + c = (*xopEquals)(p1, p2); + else + // BUG: relies on the GC not moving objects + c = (memcmp(p1, p2, init.length) == 0); + return c; + } + + int compare(void *p2, void *p1) + { + int c = 0; + + // Regard null references as always being "less than" + if (p1 != p2) + { + if (p1) + { if (!p2) + c = 1; + else if (xopCmp) + c = (*xopCmp)(p1, p2); + else + // BUG: relies on the GC not moving objects + c = memcmp(p1, p2, init.length); + } + else + c = -1; + } + return c; + } + + size_t tsize() + { + return init.length; + } + + void[] init() { return m_init; } + + uint flags() { return m_flags; } + + char[] name; + void[] m_init; // initializer; init.ptr == null if 0 initialize + + hash_t function(void*) xtoHash; + int function(void*,void*) xopEquals; + int function(void*,void*) xopCmp; + char[] function(void*) xtoString; + + uint m_flags; +} + +class TypeInfo_Tuple : TypeInfo +{ + TypeInfo[] elements; + + char[] toString() + { + char[] s; + s = "("; + foreach (i, element; elements) + { + if (i) + s ~= ','; + s ~= element.toString(); + } + s ~= ")"; + return s; + } + + int opEquals(Object o) + { + if (this is o) + return 1; + + auto t = cast(TypeInfo_Tuple)o; + if (t && elements.length == t.elements.length) + { + for (size_t i = 0; i < elements.length; i++) + { + if (elements[i] != t.elements[i]) + return 0; + } + return 1; + } + return 0; + } + + hash_t getHash(void *p) + { + assert(0); + } + + int equals(void *p1, void *p2) + { + assert(0); + } + + int compare(void *p1, void *p2) + { + assert(0); + } + + size_t tsize() + { + assert(0); + } + + void swap(void *p1, void *p2) + { + assert(0); + } +} + +class Exception : Object +{ + char[] msg; + char[] file; + size_t line; + Exception next; + + this(char[] msg, Exception next = null) + { + this.msg = msg; + this.next = next; + } + + this(char[] msg, char[] file, size_t line, Exception next = null) + { + this(msg, next); + this.file = file; + this.line = line; + } + + char[] toString() + { + return msg; + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// ModuleInfo +//////////////////////////////////////////////////////////////////////////////// + + +enum +{ + MIctorstart = 1, // we've started constructing it + MIctordone = 2, // finished construction + MIstandalone = 4, // module ctor does not depend on other module + // ctors being done first + MIhasictor = 8, // has ictor member +} + + +class ModuleInfo +{ + char[] name; + ModuleInfo[] importedModules; + ClassInfo[] localClasses; + uint flags; + + void function() ctor; // module static constructor (order dependent) + void function() dtor; // module static destructor + void function() unitTest; // module unit tests + + void* xgetMembers; // module getMembers() function + + void function() ictor; // module static constructor (order independent) + + static int opApply( int delegate( inout ModuleInfo ) dg ) + { + int ret = 0; + + foreach( m; _moduleinfo_array ) + { + ret = dg( m ); + if( ret ) + break; + } + return ret; + } +} + + +// Win32: this gets initialized by minit.asm +// linux: this gets initialized in _moduleCtor() +extern (C) ModuleInfo[] _moduleinfo_array; + + +version (linux) +{ + // This linked list is created by a compiler generated function inserted + // into the .ctor list by the compiler. + struct ModuleReference + { + ModuleReference* next; + ModuleInfo mod; + } + + extern (C) ModuleReference* _Dmodule_ref; // start of linked list +} + +ModuleInfo[] _moduleinfo_dtors; +uint _moduleinfo_dtors_i; + +// Register termination function pointers +extern (C) int _fatexit(void *); + +/** + * Initialize the modules. + */ + +extern (C) void _moduleCtor() +{ + debug(PRINTF) printf("_moduleCtor()\n"); + version (linux) + { + int len = 0; + ModuleReference *mr; + + for (mr = _Dmodule_ref; mr; mr = mr.next) + len++; + _moduleinfo_array = new ModuleInfo[len]; + len = 0; + for (mr = _Dmodule_ref; mr; mr = mr.next) + { _moduleinfo_array[len] = mr.mod; + len++; + } + } + + version (Win32) + { + // Ensure module destructors also get called on program termination + //_fatexit(&_STD_moduleDtor); + } + + _moduleinfo_dtors = new ModuleInfo[_moduleinfo_array.length]; + debug(PRINTF) printf("_moduleinfo_dtors = x%x\n", cast(void *)_moduleinfo_dtors); + _moduleIndependentCtors(); + _moduleCtor2(_moduleinfo_array, 0); +} + +extern (C) void _moduleIndependentCtors() +{ + debug(PRINTF) printf("_moduleIndependentCtors()\n"); + foreach (m; _moduleinfo_array) + { + if (m && m.flags & MIhasictor && m.ictor) + { + (*m.ictor)(); + } + } +} + +void _moduleCtor2(ModuleInfo[] mi, int skip) +{ + debug(PRINTF) printf("_moduleCtor2(): %d modules\n", mi.length); + for (uint i = 0; i < mi.length; i++) + { + ModuleInfo m = mi[i]; + + debug(PRINTF) printf("\tmodule[%d] = '%p'\n", i, m); + if (!m) + continue; + debug(PRINTF) printf("\tmodule[%d] = '%.*s'\n", i, m.name); + if (m.flags & MIctordone) + continue; + debug(PRINTF) printf("\tmodule[%d] = '%.*s', m = x%x\n", i, m.name, m); + + if (m.ctor || m.dtor) + { + if (m.flags & MIctorstart) + { if (skip || m.flags & MIstandalone) + continue; + throw new Exception( "Cyclic dependency in module " ~ m.name ); + } + + m.flags |= MIctorstart; + _moduleCtor2(m.importedModules, 0); + if (m.ctor) + (*m.ctor)(); + m.flags &= ~MIctorstart; + m.flags |= MIctordone; + + // Now that construction is done, register the destructor + //printf("\tadding module dtor x%x\n", m); + assert(_moduleinfo_dtors_i < _moduleinfo_dtors.length); + _moduleinfo_dtors[_moduleinfo_dtors_i++] = m; + } + else + { + m.flags |= MIctordone; + _moduleCtor2(m.importedModules, 1); + } + } +} + +/** + * Destruct the modules. + */ + +// Starting the name with "_STD" means under linux a pointer to the +// function gets put in the .dtors segment. + +extern (C) void _moduleDtor() +{ + debug(PRINTF) printf("_moduleDtor(): %d modules\n", _moduleinfo_dtors_i); + + for (uint i = _moduleinfo_dtors_i; i-- != 0;) + { + ModuleInfo m = _moduleinfo_dtors[i]; + + debug(PRINTF) printf("\tmodule[%d] = '%.*s', x%x\n", i, m.name, m); + if (m.dtor) + { + (*m.dtor)(); + } + } + debug(PRINTF) printf("_moduleDtor() done\n"); +} + +//////////////////////////////////////////////////////////////////////////////// +// Monitor +//////////////////////////////////////////////////////////////////////////////// + +alias Object.Monitor IMonitor; + +struct Monitor +{ + IMonitor impl; + /* stuff */ +} + +Monitor* getMonitor(Object h) +{ + return cast(Monitor*) (cast(void**) h)[1]; +} + +void setMonitor(Object h, Monitor* m) +{ + (cast(void**) h)[1] = m; +} + +extern (C) void _d_monitor_create(Object); +extern (C) void _d_monitor_destroy(Object); +extern (C) void _d_monitor_lock(Object); +extern (C) int _d_monitor_unlock(Object); + +extern (C) void _d_monitordelete(Object h, bool det) +{ + Monitor* m = getMonitor(h); + + if (m !is null) + { + IMonitor i = m.impl; + if (i is null) + { + _d_monitor_destroy(h); + setMonitor(h, null); + return; + } + if (det && (cast(void*) i) !is (cast(void*) h)) + delete i; + setMonitor(h, null); + } +} + +extern (C) void _d_monitorenter(Object h) +{ + Monitor* m = getMonitor(h); + + if (m is null) + { + _d_monitor_create(h); + m = getMonitor(h); + } + + IMonitor i = m.impl; + + if (i is null) + { + _d_monitor_lock(h); + return; + } + i.lock(); +} + +extern (C) void _d_monitorexit(Object h) +{ + Monitor* m = getMonitor(h); + IMonitor i = m.impl; + + if (i is null) + { + _d_monitor_unlock(h); + return; + } + i.unlock(); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/lifetime.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/lifetime.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,1033 @@ +/** + * This module contains all functions related to an object's lifetime: + * allocation, resizing, deallocation, and finalization. + * + * Copyright: Copyright (C) 2004-2007 Digital Mars, www.digitalmars.com. + * All rights reserved. + * License: + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, in both source and binary form, subject to the following + * restrictions: + * + * o The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * o Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * o This notice may not be removed or altered from any source + * distribution. + * Authors: Walter Bright, Sean Kelly, Tomas Lindquist Olsen + */ +module lifetime; + + +private +{ + import tango.stdc.stdlib; + import tango.stdc.string; + import tango.stdc.stdarg; + debug(PRINTF) import tango.stdc.stdio; +} + + +private +{ + enum BlkAttr : uint + { + FINALIZE = 0b0000_0001, + NO_SCAN = 0b0000_0010, + NO_MOVE = 0b0000_0100, + ALL_BITS = 0b1111_1111 + } + + struct BlkInfo + { + void* base; + size_t size; + uint attr; + } + + extern (C) uint gc_getAttr( void* p ); + extern (C) uint gc_setAttr( void* p, uint a ); + extern (C) uint gc_clrAttr( void* p, uint a ); + + extern (C) void* gc_malloc( size_t sz, uint ba = 0 ); + extern (C) void* gc_calloc( size_t sz, uint ba = 0 ); + extern (C) size_t gc_extend( void* p, size_t mx, size_t sz ); + extern (C) void gc_free( void* p ); + + extern (C) void* gc_addrOf( void* p ); + extern (C) size_t gc_sizeOf( void* p ); + extern (C) BlkInfo gc_query( void* p ); + + extern (C) bool onCollectResource( Object o ); + extern (C) void onFinalizeError( ClassInfo c, Exception e ); + extern (C) void onOutOfMemoryError(); + + extern (C) void _d_monitordelete(Object h, bool det = true); + + enum + { + PAGESIZE = 4096 + } +} + + +/** + * + */ +extern (C) Object _d_newclass(ClassInfo ci) +{ + void* p; + + debug(PRINTF) printf("_d_newclass(ci = %p, %s)\n", ci, cast(char *)ci.name); + if (ci.flags & 1) // if COM object + { /* COM objects are not garbage collected, they are reference counted + * using AddRef() and Release(). They get free'd by C's free() + * function called by Release() when Release()'s reference count goes + * to zero. + */ + p = tango.stdc.stdlib.malloc(ci.init.length); + if (!p) + onOutOfMemoryError(); + } + else + { + p = gc_malloc(ci.init.length, + BlkAttr.FINALIZE | (ci.flags & 2 ? BlkAttr.NO_SCAN : 0)); + debug(PRINTF) printf(" p = %p\n", p); + } + + debug(PRINTF) + { + printf("p = %p\n", p); + printf("ci = %p, ci.init = %p, len = %d\n", ci, ci.init, ci.init.length); + printf("vptr = %p\n", *cast(void**) ci.init); + printf("vtbl[0] = %p\n", (*cast(void***) ci.init)[0]); + printf("vtbl[1] = %p\n", (*cast(void***) ci.init)[1]); + printf("init[0] = %x\n", (cast(uint*) ci.init)[0]); + printf("init[1] = %x\n", (cast(uint*) ci.init)[1]); + printf("init[2] = %x\n", (cast(uint*) ci.init)[2]); + printf("init[3] = %x\n", (cast(uint*) ci.init)[3]); + printf("init[4] = %x\n", (cast(uint*) ci.init)[4]); + } + + // initialize it + (cast(byte*) p)[0 .. ci.init.length] = ci.init[]; + + debug(PRINTF) printf("initialization done\n"); + return cast(Object) p; +} + +/+ + +/** + * + */ +extern (C) void _d_delinterface(void** p) +{ + if (*p) + { + Interface* pi = **cast(Interface ***)*p; + Object o = cast(Object)(*p - pi.offset); + + _d_delclass(&o); + *p = null; + } +} + ++/ + +// used for deletion +private extern (D) alias void function(Object) fp_t; + +/+ + + +/** + * + */ +extern (C) void _d_delclass(Object* p) +{ + if (*p) + { + debug(PRINTF) printf("_d_delclass(%p)\n", *p); + + ClassInfo **pc = cast(ClassInfo **)*p; + if (*pc) + { + ClassInfo c = **pc; + + rt_finalize(cast(void*) *p); + + if (c.deallocator) + { + fp_t fp = cast(fp_t)c.deallocator; + (*fp)(*p); // call deallocator + *p = null; + return; + } + } + else + { + rt_finalize(cast(void*) *p); + } + gc_free(cast(void*) *p); + *p = null; + } +} + + +/** + * + */ +struct Array +{ + size_t length; + byte* data; +} + + +/** + * Allocate a new array of length elements. + * ti is the type of the resulting array, or pointer to element. + * (For when the array is initialized to 0) + */ +extern (C) Array _d_newarrayT(TypeInfo ti, size_t length) +{ + void* p; + Array result; + auto size = ti.next.tsize(); // array element size + + debug(PRINTF) printf("_d_newarrayT(length = x%x, size = %d)\n", length, size); + if (length == 0 || size == 0) + return Array(); + + version (D_InlineAsm_X86) + { + asm + { + mov EAX,size ; + mul EAX,length ; + mov size,EAX ; + jc Loverflow ; + } + } + else + size *= length; + p = gc_malloc(size + 1, !(ti.next.flags() & 1) ? BlkAttr.NO_SCAN : 0); + debug(PRINTF) printf(" p = %p\n", p); + memset(p, 0, size); + return Array(length, p); + +Loverflow: + onOutOfMemoryError(); +} + +/** + * For when the array has a non-zero initializer. + */ +extern (C) Array _d_newarrayiT(TypeInfo ti, size_t length) +{ + Array result; + auto size = ti.next.tsize(); // array element size + + debug(PRINTF) printf("_d_newarrayiT(length = %d, size = %d)\n", length, size); + + if (length == 0 || size == 0) + result = Array(); + else + { + auto initializer = ti.next.init(); + auto isize = initializer.length; + auto q = initializer.ptr; + version (D_InlineAsm_X86) + { + asm + { + mov EAX,size ; + mul EAX,length ; + mov size,EAX ; + jc Loverflow ; + } + } + else + size *= length; + auto p = gc_malloc(size + 1, !(ti.next.flags() & 1) ? BlkAttr.NO_SCAN : 0); + debug(PRINTF) printf(" p = %p\n", p); + if (isize == 1) + memset(p, *cast(ubyte*)q, size); + else if (isize == int.sizeof) + { + int init = *cast(int*)q; + size /= int.sizeof; + for (size_t u = 0; u < size; u++) + { + (cast(int*)p)[u] = init; + } + } + else + { + for (size_t u = 0; u < size; u += isize) + { + memcpy(p + u, q, isize); + } + } + va_end(q); + result = Array(length, p); + } + return result; + +Loverflow: + onOutOfMemoryError(); +} + +/** + * + */ +extern (C) Array _d_newarraymT(TypeInfo ti, int ndims, ...) +{ + Array result; + + debug(PRINTF) printf("_d_newarraymT(ndims = %d)\n", ndims); + if (ndims == 0) + result = Array(); + else + { va_list q; + va_start!(int)(q, ndims); + + void[] foo(TypeInfo ti, size_t* pdim, int ndims) + { + size_t dim = *pdim; + void[] p; + + debug(PRINTF) printf("foo(ti = %p, ti.next = %p, dim = %d, ndims = %d\n", ti, ti.next, dim, ndims); + if (ndims == 1) + { + return _d_newarrayT(ti, dim); + } + else + { + p = gc_malloc(dim * (void[]).sizeof + 1)[0 .. dim]; + for (int i = 0; i < dim; i++) + { + (cast(void[]*)p.ptr)[i] = foo(ti.next, pdim + 1, ndims - 1); + } + } + return p; + } + + size_t* pdim = cast(size_t *)q; + void[] arr = foo(ti, pdim, ndims); + result = Arra + debug(PRINTF) printf("result = %llx\n", result); + + version (none) + { + for (int i = 0; i < ndims; i++) + { + printf("index %d: %d\n", i, va_arg!(int)(q)); + } + } + va_end(q); + } + return result; +} + + +/** + * + */ +extern (C) Array _d_newarraymiT(TypeInfo ti, int ndims, ...) +{ + Array result; + + debug(PRINTF) printf("_d_newarraymiT(ndims = %d)\n", ndims); + if (ndims == 0) + result = 0; + else + { + va_list q; + va_start!(int)(q, ndims); + + void[] foo(TypeInfo ti, size_t* pdim, int ndims) + { + size_t dim = *pdim; + void[] p; + + if (ndims == 1) + { + auto r = _d_newarrayiT(ti, dim); + p = *cast(void[]*)(&r); + } + else + { + p = gc_malloc(dim * (void[]).sizeof + 1)[0 .. dim]; + for (int i = 0; i < dim; i++) + { + (cast(void[]*)p.ptr)[i] = foo(ti.next, pdim + 1, ndims - 1); + } + } + return p; + } + + size_t* pdim = cast(size_t *)q; + result = cast(ulong)foo(ti, pdim, ndims); + debug(PRINTF) printf("result = %llx\n", result); + + version (none) + { + for (int i = 0; i < ndims; i++) + { + printf("index %d: %d\n", i, va_arg!(int)(q)); + printf("init = %d\n", va_arg!(int)(q)); + } + } + va_end(q); + } + return result; +} + ++/ + +/** + * + */ +void* _d_allocmemory(size_t nbytes) +{ + return gc_malloc(nbytes); +} + +/+ + +/** + * + */ +extern (C) void _d_delarray(Array *p) +{ + if (p) + { + assert(!p.length || p.data); + + if (p.data) + gc_free(p.data); + p.data = null; + p.length = 0; + } +} + ++/ + +/** + * + */ +extern (C) void _d_delmemory(void* *p) +{ + if (*p) + { + gc_free(*p); + *p = null; + } +} + + +/** + * + */ +extern (C) void _d_callfinalizer(void* p) +{ + rt_finalize( p ); +} + + +/** + * + */ +extern (C) void rt_finalize(void* p, bool det = true) +{ + debug(PRINTF) printf("rt_finalize(p = %p)\n", p); + + if (p) // not necessary if called from gc + { + ClassInfo** pc = cast(ClassInfo**)p; + + if (*pc) + { + ClassInfo c = **pc; + + try + { + if (det || onCollectResource(cast(Object)p)) + { + do + { + if (c.destructor) + { + fp_t fp = cast(fp_t)c.destructor; + (*fp)(cast(Object)p); // call destructor + } + c = c.base; + } while (c); + } + if ((cast(void**)p)[1]) // if monitor is not null + _d_monitordelete(cast(Object)p, det); + } + catch (Exception e) + { + onFinalizeError(**pc, e); + } + finally + { + *pc = null; // zero vptr + } + } + } +} + +/+ + +/** + * Resize dynamic arrays with 0 initializers. + */ +extern (C) byte[] _d_arraysetlengthT(TypeInfo ti, size_t newlength, Array *p) +in +{ + assert(ti); + assert(!p.length || p.data); +} +body +{ + byte* newdata; + size_t sizeelem = ti.next.tsize(); + + debug(PRINTF) + { + printf("_d_arraysetlengthT(p = %p, sizeelem = %d, newlength = %d)\n", p, sizeelem, newlength); + if (p) + printf("\tp.data = %p, p.length = %d\n", p.data, p.length); + } + + if (newlength) + { + version (D_InlineAsm_X86) + { + size_t newsize = void; + + asm + { + mov EAX, newlength; + mul EAX, sizeelem; + mov newsize, EAX; + jc Loverflow; + } + } + else + { + size_t newsize = sizeelem * newlength; + + if (newsize / newlength != sizeelem) + goto Loverflow; + } + + debug(PRINTF) printf("newsize = %x, newlength = %x\n", newsize, newlength); + + if (p.data) + { + newdata = p.data; + if (newlength > p.length) + { + size_t size = p.length * sizeelem; + auto info = gc_query(p.data); + + if (info.size <= newsize || info.base != p.data) + { + if (info.size >= PAGESIZE && info.base == p.data) + { // Try to extend in-place + auto u = gc_extend(p.data, (newsize + 1) - info.size, (newsize + 1) - info.size); + if (u) + { + goto L1; + } + } + newdata = cast(byte *)gc_malloc(newsize + 1, info.attr); + newdata[0 .. size] = p.data[0 .. size]; + } + L1: + newdata[size .. newsize] = 0; + } + } + else + { + newdata = cast(byte *)gc_calloc(newsize + 1, !(ti.next.flags() & 1) ? BlkAttr.NO_SCAN : 0); + } + } + else + { + newdata = p.data; + } + + p.data = newdata; + p.length = newlength; + return newdata[0 .. newlength]; + +Loverflow: + onOutOfMemoryError(); +} + + +/** + * Resize arrays for non-zero initializers. + * p pointer to array lvalue to be updated + * newlength new .length property of array + * sizeelem size of each element of array + * initsize size of initializer + * ... initializer + */ +extern (C) byte[] _d_arraysetlengthiT(TypeInfo ti, size_t newlength, Array *p) +in +{ + assert(!p.length || p.data); +} +body +{ + byte* newdata; + size_t sizeelem = ti.next.tsize(); + void[] initializer = ti.next.init(); + size_t initsize = initializer.length; + + assert(sizeelem); + assert(initsize); + assert(initsize <= sizeelem); + assert((sizeelem / initsize) * initsize == sizeelem); + + debug(PRINTF) + { + printf("_d_arraysetlengthiT(p = %p, sizeelem = %d, newlength = %d, initsize = %d)\n", p, sizeelem, newlength, initsize); + if (p) + printf("\tp.data = %p, p.length = %d\n", p.data, p.length); + } + + if (newlength) + { + version (D_InlineAsm_X86) + { + size_t newsize = void; + + asm + { + mov EAX,newlength ; + mul EAX,sizeelem ; + mov newsize,EAX ; + jc Loverflow ; + } + } + else + { + size_t newsize = sizeelem * newlength; + + if (newsize / newlength != sizeelem) + goto Loverflow; + } + debug(PRINTF) printf("newsize = %x, newlength = %x\n", newsize, newlength); + + size_t size = p.length * sizeelem; + + if (p.data) + { + newdata = p.data; + if (newlength > p.length) + { + auto info = gc_query(p.data); + + if (info.size <= newsize || info.base != p.data) + { + if (info.size >= PAGESIZE && info.base == p.data) + { // Try to extend in-place + auto u = gc_extend(p.data, (newsize + 1) - info.size, (newsize + 1) - info.size); + if (u) + { + goto L1; + } + } + newdata = cast(byte *)gc_malloc(newsize + 1, info.attr); + newdata[0 .. size] = p.data[0 .. size]; + L1: ; + } + } + } + else + { + newdata = cast(byte *)gc_malloc(newsize + 1, !(ti.next.flags() & 1) ? BlkAttr.NO_SCAN : 0); + } + + auto q = initializer.ptr; // pointer to initializer + + if (newsize > size) + { + if (initsize == 1) + { + debug(PRINTF) printf("newdata = %p, size = %d, newsize = %d, *q = %d\n", newdata, size, newsize, *cast(byte*)q); + newdata[size .. newsize] = *(cast(byte*)q); + } + else + { + for (size_t u = size; u < newsize; u += initsize) + { + memcpy(newdata + u, q, initsize); + } + } + } + } + else + { + newdata = p.data; + } + + p.data = newdata; + p.length = newlength; + return newdata[0 .. newlength]; + +Loverflow: + onOutOfMemoryError(); +} + + +/** + * Append y[] to array x[]. + * size is size of each array element. + */ +extern (C) long _d_arrayappendT(TypeInfo ti, Array *px, byte[] y) +{ + auto sizeelem = ti.next.tsize(); // array element size + auto info = gc_query(px.data); + auto length = px.length; + auto newlength = length + y.length; + auto newsize = newlength * sizeelem; + + if (info.size < newsize || info.base != px.data) + { byte* newdata; + + if (info.size >= PAGESIZE && info.base == px.data) + { // Try to extend in-place + auto u = gc_extend(px.data, (newsize + 1) - info.size, (newsize + 1) - info.size); + if (u) + { + goto L1; + } + } + newdata = cast(byte *)gc_malloc(newCapacity(newlength, sizeelem) + 1, info.attr); + memcpy(newdata, px.data, length * sizeelem); + px.data = newdata; + } + L1: + px.length = newlength; + memcpy(px.data + length * sizeelem, y.ptr, y.length * sizeelem); + return *cast(long*)px; +} + + +/** + * + */ +size_t newCapacity(size_t newlength, size_t size) +{ + version(none) + { + size_t newcap = newlength * size; + } + else + { + /* + * Better version by Dave Fladebo: + * This uses an inverse logorithmic algorithm to pre-allocate a bit more + * space for larger arrays. + * - Arrays smaller than PAGESIZE bytes are left as-is, so for the most + * common cases, memory allocation is 1 to 1. The small overhead added + * doesn't affect small array perf. (it's virtually the same as + * current). + * - Larger arrays have some space pre-allocated. + * - As the arrays grow, the relative pre-allocated space shrinks. + * - The logorithmic algorithm allocates relatively more space for + * mid-size arrays, making it very fast for medium arrays (for + * mid-to-large arrays, this turns out to be quite a bit faster than the + * equivalent realloc() code in C, on Linux at least. Small arrays are + * just as fast as GCC). + * - Perhaps most importantly, overall memory usage and stress on the GC + * is decreased significantly for demanding environments. + */ + size_t newcap = newlength * size; + size_t newext = 0; + + if (newcap > PAGESIZE) + { + //double mult2 = 1.0 + (size / log10(pow(newcap * 2.0,2.0))); + + // redo above line using only integer math + + static int log2plus1(size_t c) + { int i; + + if (c == 0) + i = -1; + else + for (i = 1; c >>= 1; i++) + { + } + return i; + } + + /* The following setting for mult sets how much bigger + * the new size will be over what is actually needed. + * 100 means the same size, more means proportionally more. + * More means faster but more memory consumption. + */ + //long mult = 100 + (1000L * size) / (6 * log2plus1(newcap)); + long mult = 100 + (1000L * size) / log2plus1(newcap); + + // testing shows 1.02 for large arrays is about the point of diminishing return + if (mult < 102) + mult = 102; + newext = cast(size_t)((newcap * mult) / 100); + newext -= newext % size; + debug(PRINTF) printf("mult: %2.2f, alloc: %2.2f\n",mult/100.0,newext / cast(double)size); + } + newcap = newext > newcap ? newext : newcap; + debug(PRINTF) printf("newcap = %d, newlength = %d, size = %d\n", newcap, newlength, size); + } + return newcap; +} + + +/** + * + */ +extern (C) byte[] _d_arrayappendcT(TypeInfo ti, inout byte[] x, ...) +{ + auto sizeelem = ti.next.tsize(); // array element size + auto info = gc_query(x.ptr); + auto length = x.length; + auto newlength = length + 1; + auto newsize = newlength * sizeelem; + + assert(info.size == 0 || length * sizeelem <= info.size); + + debug(PRINTF) printf("_d_arrayappendcT(sizeelem = %d, ptr = %p, length = %d, cap = %d)\n", sizeelem, x.ptr, x.length, info.size); + + if (info.size <= newsize || info.base != x.ptr) + { byte* newdata; + + if (info.size >= PAGESIZE && info.base == x.ptr) + { // Try to extend in-place + auto u = gc_extend(x.ptr, (newsize + 1) - info.size, (newsize + 1) - info.size); + if (u) + { + goto L1; + } + } + debug(PRINTF) printf("_d_arrayappendcT(length = %d, newlength = %d, cap = %d)\n", length, newlength, info.size); + auto newcap = newCapacity(newlength, sizeelem); + assert(newcap >= newlength * sizeelem); + newdata = cast(byte *)gc_malloc(newcap + 1, info.attr); + memcpy(newdata, x.ptr, length * sizeelem); + (cast(void**)(&x))[1] = newdata; + } + L1: + byte *argp = cast(byte *)(&ti + 2); + + *cast(size_t *)&x = newlength; + x.ptr[length * sizeelem .. newsize] = argp[0 .. sizeelem]; + assert((cast(size_t)x.ptr & 15) == 0); + assert(gc_sizeOf(x.ptr) > x.length * sizeelem); + return x; +} + + +/** + * + */ +extern (C) byte[] _d_arraycatT(TypeInfo ti, byte[] x, byte[] y) +out (result) +{ + auto sizeelem = ti.next.tsize(); // array element size + debug(PRINTF) printf("_d_arraycatT(%d,%p ~ %d,%p sizeelem = %d => %d,%p)\n", x.length, x.ptr, y.length, y.ptr, sizeelem, result.length, result.ptr); + assert(result.length == x.length + y.length); + for (size_t i = 0; i < x.length * sizeelem; i++) + assert((cast(byte*)result)[i] == (cast(byte*)x)[i]); + for (size_t i = 0; i < y.length * sizeelem; i++) + assert((cast(byte*)result)[x.length * sizeelem + i] == (cast(byte*)y)[i]); + + size_t cap = gc_sizeOf(result.ptr); + assert(!cap || cap > result.length * sizeelem); +} +body +{ + version (none) + { + /* Cannot use this optimization because: + * char[] a, b; + * char c = 'a'; + * b = a ~ c; + * c = 'b'; + * will change the contents of b. + */ + if (!y.length) + return x; + if (!x.length) + return y; + } + + debug(PRINTF) printf("_d_arraycatT(%d,%p ~ %d,%p)\n", x.length, x.ptr, y.length, y.ptr); + auto sizeelem = ti.next.tsize(); // array element size + debug(PRINTF) printf("_d_arraycatT(%d,%p ~ %d,%p sizeelem = %d)\n", x.length, x.ptr, y.length, y.ptr, sizeelem); + size_t xlen = x.length * sizeelem; + size_t ylen = y.length * sizeelem; + size_t len = xlen + ylen; + + if (!len) + return null; + + byte* p = cast(byte*)gc_malloc(len + 1, !(ti.next.flags() & 1) ? BlkAttr.NO_SCAN : 0); + memcpy(p, x.ptr, xlen); + memcpy(p + xlen, y.ptr, ylen); + p[len] = 0; + return p[0 .. x.length + y.length]; +} + + +/** + * + */ +extern (C) byte[] _d_arraycatnT(TypeInfo ti, uint n, ...) +{ void* a; + size_t length; + byte[]* p; + uint i; + byte[] b; + auto size = ti.next.tsize(); // array element size + + p = cast(byte[]*)(&n + 1); + + for (i = 0; i < n; i++) + { + b = *p++; + length += b.length; + } + if (!length) + return null; + + a = gc_malloc(length * size, !(ti.next.flags() & 1) ? BlkAttr.NO_SCAN : 0); + p = cast(byte[]*)(&n + 1); + + uint j = 0; + for (i = 0; i < n; i++) + { + b = *p++; + if (b.length) + { + memcpy(a + j, b.ptr, b.length * size); + j += b.length * size; + } + } + + byte[] result; + *cast(int *)&result = length; // jam length + (cast(void **)&result)[1] = a; // jam ptr + return result; +} + + +/** + * + */ +extern (C) void* _d_arrayliteralT(TypeInfo ti, size_t length, ...) +{ + auto sizeelem = ti.next.tsize(); // array element size + void* result; + + debug(PRINTF) printf("_d_arrayliteralT(sizeelem = %d, length = %d)\n", sizeelem, length); + if (length == 0 || sizeelem == 0) + result = null; + else + { + result = gc_malloc(length * sizeelem, !(ti.next.flags() & 1) ? BlkAttr.NO_SCAN : 0); + + va_list q; + va_start!(size_t)(q, length); + + size_t stacksize = (sizeelem + int.sizeof - 1) & ~(int.sizeof - 1); + + if (stacksize == sizeelem) + { + memcpy(result, q, length * sizeelem); + } + else + { + for (size_t i = 0; i < length; i++) + { + memcpy(result + i * sizeelem, q, sizeelem); + q += stacksize; + } + } + + va_end(q); + } + return result; +} + ++/ + + +/** + * Support for array.dup property. + */ +struct Array2 +{ + size_t length; + void* ptr; +} + + +/** + * + */ +extern (C) Array2 _adDupT(TypeInfo ti, Array2 a) +out (result) +{ + auto sizeelem = ti.next.tsize(); // array element size + assert(memcmp(result.ptr, a.ptr, a.length * sizeelem) == 0); +} +body +{ + Array2 r; + + if (a.length) + { + auto sizeelem = ti.next.tsize(); // array element size + auto size = a.length * sizeelem; + r.ptr = gc_malloc(size, !(ti.next.flags() & 1) ? BlkAttr.NO_SCAN : 0); + r.length = a.length; + memcpy(r.ptr, a.ptr, size); + } + return r; +} + + +unittest +{ + int[] a; + int[] b; + int i; + + a = new int[3]; + a[0] = 1; a[1] = 2; a[2] = 3; + b = a.dup; + assert(b.length == 3); + for (i = 0; i < 3; i++) + assert(b[i] == i + 1); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/llvm/intrinsic.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/llvm/intrinsic.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,138 @@ +// code generator intrinsics +/* +pragma(LLVM_internal, "intrinsic", "llvm.returnaddress") + void* llvm_returnaddress(uint level); +*/ +pragma(LLVM_internal, "intrinsic", "llvm.frameaddress") + void* llvm_frameaddress(uint level); +/* +pragma(LLVM_internal, "intrinsic", "llvm.stacksave") + void* llvm_stacksave(); + +pragma(LLVM_internal, "intrinsic", "llvm.stackrestore") + void llvm_stackrestore(void* ptr); + +pragma(LLVM_internal, "intrinsic", "llvm.pcmarker") + void llvm_pcmarker(uint id); + +pragma(LLVM_internal, "intrinsic", "llvm.prefetch") + void llvm_prefetch(void* ptr, uint rw, uint locality); +*/ + +pragma(LLVM_internal, "intrinsic", "llvm.readcyclecounter") + ulong readcyclecounter(); + +// standard C intrinsics +pragma(LLVM_internal, "intrinsic", "llvm.memcpy.i32") + void llvm_memcpy_i32(void* dst, void* src, uint len, uint alignment); + +pragma(LLVM_internal, "intrinsic", "llvm.memcpy.i64") + void llvm_memcpy_i64(void* dst, void* src, ulong len, uint alignment); + +pragma(LLVM_internal, "intrinsic", "llvm.memmove.i32") + void llvm_memmove_i32(void* dst, void* src, uint len, uint alignment); + +pragma(LLVM_internal, "intrinsic", "llvm.memmove.i64") + void llvm_memmove_i64(void* dst, void* src, ulong len, int alignment); + +pragma(LLVM_internal, "intrinsic", "llvm.memset.i32") + void llvm_memset_i32(void* dst, ubyte val, uint len, uint alignment); + +pragma(LLVM_internal, "intrinsic", "llvm.memset.i64") + void llvm_memset_i64(void* dst, ubyte val, ulong len, uint alignment); + +pragma(LLVM_internal, "intrinsic", "llvm.sqrt.f32") + float llvm_sqrt(float val); + +pragma(LLVM_internal, "intrinsic", "llvm.sqrt.f64") +{ + double llvm_sqrt(double val); + real llvm_sqrt(real val); +} + +pragma(LLVM_internal, "intrinsic", "llvm.powi.f32") + float llvm_powi(float val, int power); + +pragma(LLVM_internal, "intrinsic", "llvm.powi.f64") +{ + double llvm_powi(double val, int power); + real llvm_powi(real val, int power); +} + +// bit manipulation intrinsics +pragma(LLVM_internal, "intrinsic", "llvm.bswap.i16.i16") + ushort llvm_bswap(ushort val); + +pragma(LLVM_internal, "intrinsic", "llvm.bswap.i32.i32") + uint llvm_bswap(uint val); + +pragma(LLVM_internal, "intrinsic", "llvm.bswap.i64.i64") + ulong llvm_bswap(ulong val); + +/* +pragma(LLVM_internal, "intrinsic", "llvm.ctpop.i8") + uint llvm_ctpop_i8(ubyte src); + +pragma(LLVM_internal, "intrinsic", "llvm.ctpop.i16") + uint llvm_ctpop_i16(ushort src); + +pragma(LLVM_internal, "intrinsic", "llvm.ctpop.i32") + uint llvm_ctpop_i32(uint src); + +pragma(LLVM_internal, "intrinsic", "llvm.ctpop.i64") + uint llvm_ctpop_i64(ulong src); + +pragma(LLVM_internal, "intrinsic", "llvm.ctlz.i8") + uint llvm_ctlz_i8(ubyte src); + +pragma(LLVM_internal, "intrinsic", "llvm.ctlz.i16") + uint llvm_ctlz_i16(ushort src); + +pragma(LLVM_internal, "intrinsic", "llvm.ctlz.i32") + uint llvm_ctlz_i32(uint src); + +pragma(LLVM_internal, "intrinsic", "llvm.ctlz.i64") + uint llvm_ctlz_i64(ulong src); + +pragma(LLVM_internal, "intrinsic", "llvm.cttz.i8") + uint llvm_cttz_i8(ubyte src); + +pragma(LLVM_internal, "intrinsic", "llvm.cttz.i16") + uint llvm_cttz_i16(ushort src); + +pragma(LLVM_internal, "intrinsic", "llvm.cttz.i32") + uint llvm_cttz_i32(uint src); + +pragma(LLVM_internal, "intrinsic", "llvm.cttz.i64") + uint llvm_cttz_i64(ulong src); +*/ + +// atomic operations and synchronization intrinsics +// TODO +/* + +//declare i8 @llvm.atomic.lcs.i8.i8p.i8.i8( i8* , i8 , i8 ) +pragma(LLVM_internal, "intrinsic", "llvm.atomic.lcs.i8.i8p.i8.i8") + ubyte llvm_atomic_lcs_i8(void* ptr, ubyte cmp, ubyte val); + +declare i16 @llvm.atomic.lcs.i16.i16p.i16.i16( i16* , i16 , i16 ) +declare i32 @llvm.atomic.lcs.i32.i32p.i32.i32( i32* , i32 , i32 ) +declare i64 @llvm.atomic.lcs.i64.i64p.i64.i64( i64* , i64 , i64 ) + +declare i8 @llvm.atomic.ls.i8.i8p.i8( i8* , i8 ) +declare i16 @llvm.atomic.ls.i16.i16p.i16( i16* , i16 ) +declare i32 @llvm.atomic.ls.i32.i32p.i32( i32* , i32 ) +declare i64 @llvm.atomic.ls.i64.i64p.i64( i64* , i64 ) + +declare i8 @llvm.atomic.las.i8.i8p.i8( i8* , i8 ) +declare i16 @llvm.atomic.las.i16.i16p.i16( i16* , i16 ) +declare i32 @llvm.atomic.las.i32.i32p.i32( i32* , i32 ) +declare i64 @llvm.atomic.las.i64.i64p.i64( i64* , i64 ) + +declare i8 @llvm.atomic.lss.i8.i8.i8( i8* , i8 ) +declare i16 @llvm.atomic.lss.i16.i16.i16( i16* , i16 ) +declare i32 @llvm.atomic.lss.i32.i32.i32( i32* , i32 ) +declare i64 @llvm.atomic.lss.i64.i64.i64( i64* , i64 ) + +declare void @llvm.memory.barrier( i1 , i1 , i1 , i1 ) +*/ diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/llvmdc.mak --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/llvmdc.mak Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,163 @@ +# Makefile to build the LLVMDC compiler runtime D library for Linux +# Designed to work with GNU make +# Targets: +# make +# Same as make all +# make lib +# Build the compiler runtime library +# make doc +# Generate documentation +# make clean +# Delete unneeded files created by build process + +LIB_TARGET=libtango-rt-llvmdc.a +LIB_MASK=libtango-rt-llvmdc*.a + +CP=cp -f +RM=rm -f +MD=mkdir -p + +CFLAGS=-O3 $(ADD_CFLAGS) +#CFLAGS=-g $(ADD_CFLAGS) + +DFLAGS=-release -O3 -inline -w $(ADD_DFLAGS) +#DFLAGS=-g -w $(ADD_DFLAGS) + +TFLAGS=-O3 -inline -w $(ADD_DFLAGS) +#TFLAGS=-g -w $(ADD_DFLAGS) + +DOCFLAGS=-version=DDoc + +CC=gcc +LC=llvm-ar rsv +DC=llvmdc +LLC=llvm-as + +LIB_DEST=.. + +.SUFFIXES: .s .S .c .cpp .d .ll .html .o .bc + +.s.o: + $(CC) -c $(CFLAGS) $< -o$@ + +.S.o: + $(CC) -c $(CFLAGS) $< -o$@ + +.c.o: + $(CC) -c $(CFLAGS) $< -o$@ + +.cpp.o: + g++ -c $(CFLAGS) $< -o$@ + +.d.bc: + $(DC) -c $(DFLAGS) $< -of$@ + +.ll.bc: + $(LLC) -f -o=$@ $< + +.d.html: + $(DC) -c -o- $(DOCFLAGS) -Df$*.html llvmdc.ddoc $< + +targets : lib doc +all : lib doc +lib : llvmdc.lib +doc : llvmdc.doc + +###################################################### + +OBJ_BASE= \ + aaA.bc \ + aApply.bc \ + aApplyR.bc \ + adi.bc \ + arrays.bc \ + cast.bc \ + contract.bc \ + genobj.bc \ + lifetime.bc \ + mem.bc \ + memory.bc \ + qsort2.bc \ + switch.bc \ + +# NOTE: trace.obj and cover.obj are not necessary for a successful build +# as both are used for debugging features (profiling and coverage) +# NOTE: a pre-compiled minit.obj has been provided in dmd for Win32 and +# minit.asm is not used by dmd for linux +# NOTE: deh.o is only needed for Win32, linux uses deh2.o + +OBJ_UTIL= \ + util/console.bc \ + util/ctype.bc \ + util/string.bc \ + util/utf.bc + +OBJ_TI= \ + typeinfo/ti_AC.bc \ + typeinfo/ti_Acdouble.bc \ + typeinfo/ti_Acfloat.bc \ + typeinfo/ti_Acreal.bc \ + typeinfo/ti_Adouble.bc \ + typeinfo/ti_Afloat.bc \ + typeinfo/ti_Ag.bc \ + typeinfo/ti_Aint.bc \ + typeinfo/ti_Along.bc \ + typeinfo/ti_Areal.bc \ + typeinfo/ti_Ashort.bc \ + typeinfo/ti_byte.bc \ + typeinfo/ti_C.bc \ + typeinfo/ti_cdouble.bc \ + typeinfo/ti_cfloat.bc \ + typeinfo/ti_char.bc \ + typeinfo/ti_creal.bc \ + typeinfo/ti_dchar.bc \ + typeinfo/ti_delegate.bc \ + typeinfo/ti_double.bc \ + typeinfo/ti_float.bc \ + typeinfo/ti_idouble.bc \ + typeinfo/ti_ifloat.bc \ + typeinfo/ti_int.bc \ + typeinfo/ti_ireal.bc \ + typeinfo/ti_long.bc \ + typeinfo/ti_ptr.bc \ + typeinfo/ti_real.bc \ + typeinfo/ti_short.bc \ + typeinfo/ti_ubyte.bc \ + typeinfo/ti_uint.bc \ + typeinfo/ti_ulong.bc \ + typeinfo/ti_ushort.bc \ + typeinfo/ti_void.bc \ + typeinfo/ti_wchar.bc + +ALL_OBJS= \ + $(OBJ_BASE) \ + $(OBJ_UTIL) \ + $(OBJ_TI) \ + moduleinfo.bc + +###################################################### + +ALL_DOCS= + +###################################################### + +llvmdc.lib : $(LIB_TARGET) + +$(LIB_TARGET) : $(ALL_OBJS) + $(RM) $@ + $(LC) $@ $(ALL_OBJS) + +llvmdc.doc : $(ALL_DOCS) + echo No documentation available. + +###################################################### + +clean : + find . -name "*.di" | xargs $(RM) + $(RM) $(ALL_OBJS) + $(RM) $(ALL_DOCS) + $(RM) $(LIB_MASK) + +install : + $(MD) $(LIB_DEST) + $(CP) $(LIB_MASK) $(LIB_DEST)/. diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/mem.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/mem.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,14 @@ +extern(C): + +void* realloc(void*,size_t); +void free(void*); + +void* _d_realloc(void* ptr, size_t n) +{ + return realloc(ptr, n); +} + +void _d_free(void* ptr) +{ + free(ptr); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/memory.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/memory.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,170 @@ +/** + * This module exposes functionality for inspecting and manipulating memory. + * + * Copyright: Copyright (C) 2005-2006 Digital Mars, www.digitalmars.com. + * All rights reserved. + * License: + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, in both source and binary form, subject to the following + * restrictions: + * + * o The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * o Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * o This notice may not be removed or altered from any source + * distribution. + * Authors: Walter Bright, Sean Kelly + */ +module memory; + + +private +{ + version( linux ) + { + //version = SimpleLibcStackEnd; + + version( SimpleLibcStackEnd ) + { + extern (C) extern void* __libc_stack_end; + } + else + { + import tango.stdc.posix.dlfcn; + } + } + version(LLVMDC) + { + pragma(LLVM_internal, "intrinsic", "llvm.frameaddress") + { + void* llvm_frameaddress(uint level=0); + } + } +} + + +/** + * + */ +extern (C) void* rt_stackBottom() +{ + version( Win32 ) + { + asm + { + naked; + mov EAX,FS:4; + ret; + } + } + else version( linux ) + { + version( SimpleLibcStackEnd ) + { + return __libc_stack_end; + } + else + { + // See discussion: http://autopackage.org/forums/viewtopic.php?t=22 + static void** libc_stack_end; + + if( libc_stack_end == libc_stack_end.init ) + { + void* handle = dlopen( null, RTLD_NOW ); + libc_stack_end = cast(void**) dlsym( handle, "__libc_stack_end" ); + dlclose( handle ); + } + return *libc_stack_end; + } + } + else + { + static assert( false, "Operating system not supported." ); + } +} + + +/** + * + */ +extern (C) void* rt_stackTop() +{ + version( D_InlineAsm_X86 ) + { + asm + { + naked; + mov EAX, ESP; + ret; + } + } + else version(LLVMDC) + { + return llvm_frameaddress(); + } + else + { + static assert( false, "Architecture not supported." ); + } +} + + +private +{ + version( Win32 ) + { + extern (C) + { + extern int _xi_a; // &_xi_a just happens to be start of data segment + extern int _edata; // &_edata is start of BSS segment + extern int _end; // &_end is past end of BSS + } + } + else version( linux ) + { + extern (C) + { + extern int _data; + extern int __data_start; + extern int _end; + extern int _data_start__; + extern int _data_end__; + extern int _bss_start__; + extern int _bss_end__; + extern int __fini_array_end; + } + + alias __data_start Data_Start; + alias _end Data_End; + } + + alias void delegate( void*, void* ) scanFn; +} + + +/** + * + */ +extern (C) void rt_scanStaticData( scanFn scan ) +{ + version( Win32 ) + { + scan( &_xi_a, &_end ); + } + else version( linux ) + { + scan( &__data_start, &_end ); + } + else + { + static assert( false, "Operating system not supported." ); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/moduleinfo.ll --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/moduleinfo.ll Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,9 @@ +; ModuleID = 'internal.moduleinit_backend' + +@_d_moduleinfo_array = appending constant [1 x i8*] [ i8* null ] + +define i8** @_d_get_moduleinfo_array() { +entry: + %tmp = getelementptr [1 x i8*]* @_d_moduleinfo_array, i32 0, i32 0 + ret i8** %tmp +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/qsort2.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/qsort2.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,70 @@ + +/* + * Placed into Public Domain + * written by Walter Bright + * www.digitalmars.com + * + * This is a public domain version of qsort.d. + * All it does is call C's qsort(), but runs a little slower since + * it needs to synchronize a global variable. + */ + +/* + * Modified by Sean Kelly for use with Tango. + */ + +//debug=qsort; + +private import tango.stdc.stdlib; + +struct Array +{ + size_t length; + void* ptr; +} + +private TypeInfo tiglobal; + +extern (C) int cmp(void* p1, void* p2) +{ + return tiglobal.compare(p1, p2); +} + +extern (C) long _adSort(Array a, TypeInfo ti) +{ + synchronized + { + tiglobal = ti; + tango.stdc.stdlib.qsort(a.ptr, a.length, cast(size_t)ti.tsize(), &cmp); + } + return *cast(long*)(&a); +} + + + +unittest +{ + debug(qsort) printf("array.sort.unittest()\n"); + + int a[] = new int[10]; + + a[0] = 23; + a[1] = 1; + a[2] = 64; + a[3] = 5; + a[4] = 6; + a[5] = 5; + a[6] = 17; + a[7] = 3; + a[8] = 0; + a[9] = -1; + + a.sort; + + for (int i = 0; i < a.length - 1; i++) + { + //printf("i = %d", i); + //printf(" %d %d\n", a[i], a[i + 1]); + assert(a[i] <= a[i + 1]); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/std/intrinsic.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/std/intrinsic.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,265 @@ + + +// written by Walter Bright +// www.digitalmars.com +// Placed into the public domain + +/* NOTE: This file has been patched from the original DMD distribution to + work with the GDC compiler. + NOTE: This file has been patched from the original GDC distribution to + work with the LLVMDC compiler. + + Modified by David Friedman, May 2006 + Modified by Tomas Lindquist Olsen, August 2007 +*/ + +/** These functions are built-in intrinsics to the compiler. + * + Intrinsic functions are functions built in to the compiler, + usually to take advantage of specific CPU features that + are inefficient to handle via external functions. + The compiler's optimizer and code generator are fully + integrated in with intrinsic functions, bringing to bear + their full power on them. + This can result in some surprising speedups. + * Macros: + * WIKI=Phobos/StdIntrinsic + */ + +module std.intrinsic; + +/** + * Scans the bits in v starting with bit 0, looking + * for the first set bit. + * Returns: + * The bit number of the first bit set. + * The return value is undefined if v is zero. + */ +version (LLVMDC) + int bsf(uint v) + { + uint m = 1; + uint i; + for (i = 0; i < 32; i++,m<<=1) { + if (v&m) + return i; + } + return i; // supposed to be undefined + } +else + int bsf(uint v); + +/** + * Scans the bits in v from the most significant bit + * to the least significant bit, looking + * for the first set bit. + * Returns: + * The bit number of the first bit set. + * The return value is undefined if v is zero. + * Example: + * --- + * import std.intrinsic; + * + * int main() + * { + * uint v; + * int x; + * + * v = 0x21; + * x = bsf(v); + * printf("bsf(x%x) = %d\n", v, x); + * x = bsr(v); + * printf("bsr(x%x) = %d\n", v, x); + * return 0; + * } + * --- + * Output: + * bsf(x21) = 0
+ * bsr(x21) = 5 + */ +version (LLVMDC) +int bsr(uint v) +{ + uint m = 0x80000000; + uint i; + for (i = 32; i ; i--,m>>>=1) { + if (v&m) + return i-1; + } + return i; // supposed to be undefined +} +else + int bsr(uint v); + +/** + * Tests the bit. + */ +version (LLVMDC) +int bt(uint *p, uint bitnum) +{ + return (p[bitnum / (uint.sizeof*8)] & (1<<(bitnum & ((uint.sizeof*8)-1)))) ? -1 : 0 ; +} +else + int bt(uint *p, uint bitnum); + +/** + * Tests and complements the bit. + */ +version (LLVMDC) +int btc(uint *p, uint bitnum) +{ + uint * q = p + (bitnum / (uint.sizeof*8)); + uint mask = 1 << (bitnum & ((uint.sizeof*8) - 1)); + int result = *q & mask; + *q ^= mask; + return result ? -1 : 0; +} +else +int btc(uint *p, uint bitnum); + +/** + * Tests and resets (sets to 0) the bit. + */ +version (LLVMDC) +int btr(uint *p, uint bitnum) +{ + uint * q = p + (bitnum / (uint.sizeof*8)); + uint mask = 1 << (bitnum & ((uint.sizeof*8) - 1)); + int result = *q & mask; + *q &= ~mask; + return result ? -1 : 0; +} +else + int btr(uint *p, uint bitnum); + +/** + * Tests and sets the bit. + * Params: + * p = a non-NULL pointer to an array of uints. + * index = a bit number, starting with bit 0 of p[0], + * and progressing. It addresses bits like the expression: +--- +p[index / (uint.sizeof*8)] & (1 << (index & ((uint.sizeof*8) - 1))) +--- + * Returns: + * A non-zero value if the bit was set, and a zero + * if it was clear. + * + * Example: + * --- +import std.intrinsic; + +int main() +{ + uint array[2]; + + array[0] = 2; + array[1] = 0x100; + + printf("btc(array, 35) = %d\n", btc(array, 35)); + printf("array = [0]:x%x, [1]:x%x\n", array[0], array[1]); + + printf("btc(array, 35) = %d\n", btc(array, 35)); + printf("array = [0]:x%x, [1]:x%x\n", array[0], array[1]); + + printf("bts(array, 35) = %d\n", bts(array, 35)); + printf("array = [0]:x%x, [1]:x%x\n", array[0], array[1]); + + printf("btr(array, 35) = %d\n", btr(array, 35)); + printf("array = [0]:x%x, [1]:x%x\n", array[0], array[1]); + + printf("bt(array, 1) = %d\n", bt(array, 1)); + printf("array = [0]:x%x, [1]:x%x\n", array[0], array[1]); + + return 0; +} + * --- + * Output: +
+btc(array, 35) = 0
+array = [0]:x2, [1]:x108
+btc(array, 35) = -1
+array = [0]:x2, [1]:x100
+bts(array, 35) = 0
+array = [0]:x2, [1]:x108
+btr(array, 35) = -1
+array = [0]:x2, [1]:x100
+bt(array, 1) = -1
+array = [0]:x2, [1]:x100
+
+ */ +version (LLVMDC) +int bts(uint *p, uint bitnum) +{ + uint * q = p + (bitnum / (uint.sizeof*8)); + uint mask = 1 << (bitnum & ((uint.sizeof*8) - 1)); + int result = *q & mask; + *q |= mask; + return result ? -1 : 0; +} +else + int bts(uint *p, uint bitnum); + + +/** + * Swaps bytes in a 4 byte uint end-to-end, i.e. byte 0 becomes + byte 3, byte 1 becomes byte 2, byte 2 becomes byte 1, byte 3 + becomes byte 0. + */ +version (LLVMDC) +pragma(LLVM_internal, "intrinsic", "llvm.bswap.i32") + uint bswap(uint val); +else + uint bswap(uint v); + + +/** + * Reads I/O port at port_address. + */ +version (LLVMDC) + ubyte inp(uint p) { return 0; } +else + ubyte inp(uint port_address); + +/** + * ditto + */ +version (LLVMDC) + ushort inpw(uint p) { return 0; } +else + ushort inpw(uint port_address); + +/** + * ditto + */ +version (LLVMDC) + uint inpl(uint p) { return 0; } +else + uint inpl(uint port_address); + + +/** + * Writes and returns value to I/O port at port_address. + */ +version (LLVM) + ubyte outp(uint p, ubyte v) { return v; } +else + ubyte outp(uint port_address, ubyte value); + +/** + * ditto + */ +version (LLVM) + ushort outpw(uint p, ushort v) { return v; } +else + ushort outpw(uint port_address, ushort value); + +/** + * ditto + */ +version (LLVM) + uint outpl(uint p, uint v) { return v; } +else + uint outpl(uint port_address, uint value); + + diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/switch.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/switch.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,424 @@ +/* + * Copyright (C) 2004-2007 by Digital Mars, www.digitalmars.com + * Written by Walter Bright + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, in both source and binary form, subject to the following + * restrictions: + * + * o The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * o Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * o This notice may not be removed or altered from any source + * distribution. + */ + +/* + * Modified by Sean Kelly for use with Tango. + */ + +private import tango.stdc.string; + +/****************************************************** + * Support for switch statements switching on strings. + * Input: + * table[] sorted array of strings generated by compiler + * ca string to look up in table + * Output: + * result index of match in table[] + * -1 if not in table + */ + +extern (C): + +int _d_switch_string(char[][] table, char[] ca) +in +{ + //printf("in _d_switch_string()\n"); + assert(table.length >= 0); + assert(ca.length >= 0); + + // Make sure table[] is sorted correctly + int j; + + for (j = 1; j < table.length; j++) + { + size_t len1 = table[j - 1].length; + size_t len2 = table[j].length; + + assert(len1 <= len2); + if (len1 == len2) + { + int ci; + + ci = memcmp(table[j - 1].ptr, table[j].ptr, len1); + assert(ci < 0); // ci==0 means a duplicate + } + } +} +out (result) +{ + int i; + int cj; + + //printf("out _d_switch_string()\n"); + if (result == -1) + { + // Not found + for (i = 0; i < table.length; i++) + { + if (table[i].length == ca.length) + { cj = memcmp(table[i].ptr, ca.ptr, ca.length); + assert(cj != 0); + } + } + } + else + { + assert(0 <= result && result < table.length); + for (i = 0; 1; i++) + { + assert(i < table.length); + if (table[i].length == ca.length) + { + cj = memcmp(table[i].ptr, ca.ptr, ca.length); + if (cj == 0) + { + assert(i == result); + break; + } + } + } + } +} +body +{ + //printf("body _d_switch_string(%.*s)\n", ca); + size_t low; + size_t high; + size_t mid; + size_t c; + char[] pca; + + low = 0; + high = table.length; + + version (none) + { + // Print table + printf("ca[] = '%s'\n", cast(char *)ca); + for (mid = 0; mid < high; mid++) + { + pca = table[mid]; + printf("table[%d] = %d, '%.*s'\n", mid, pca.length, pca); + } + } + if (high && + ca.length >= table[0].length && + ca.length <= table[high - 1].length) + { + // Looking for 0 length string, which would only be at the beginning + if (ca.length == 0) + return 0; + + char c1 = ca[0]; + + // Do binary search + while (low < high) + { + mid = (low + high) >> 1; + pca = table[mid]; + c = ca.length - pca.length; + if (c == 0) + { + c = cast(ubyte)c1 - cast(ubyte)pca[0]; + if (c == 0) + { + c = memcmp(ca.ptr, pca.ptr, ca.length); + if (c == 0) + { //printf("found %d\n", mid); + return cast(int)mid; + } + } + } + if (c < 0) + { + high = mid; + } + else + { + low = mid + 1; + } + } + } + + //printf("not found\n"); + return -1; // not found +} + +unittest +{ + switch (cast(char []) "c") + { + case "coo": + default: + break; + } +} + +/********************************** + * Same thing, but for wide chars. + */ + +int _d_switch_ustring(wchar[][] table, wchar[] ca) +in +{ + //printf("in _d_switch_ustring()\n"); + assert(table.length >= 0); + assert(ca.length >= 0); + + // Make sure table[] is sorted correctly + int j; + + for (j = 1; j < table.length; j++) + { + size_t len1 = table[j - 1].length; + size_t len2 = table[j].length; + + assert(len1 <= len2); + if (len1 == len2) + { + int c; + + c = memcmp(table[j - 1].ptr, table[j].ptr, len1 * wchar.sizeof); + assert(c < 0); // c==0 means a duplicate + } + } +} +out (result) +{ + int i; + int c; + + //printf("out _d_switch_string()\n"); + if (result == -1) + { + // Not found + for (i = 0; i < table.length; i++) + { + if (table[i].length == ca.length) + { c = memcmp(table[i].ptr, ca.ptr, ca.length * wchar.sizeof); + assert(c != 0); + } + } + } + else + { + assert(0 <= result && result < table.length); + for (i = 0; 1; i++) + { + assert(i < table.length); + if (table[i].length == ca.length) + { + c = memcmp(table[i].ptr, ca.ptr, ca.length * wchar.sizeof); + if (c == 0) + { + assert(i == result); + break; + } + } + } + } +} +body +{ + //printf("body _d_switch_ustring()\n"); + size_t low; + size_t high; + size_t mid; + size_t c; + wchar[] pca; + + low = 0; + high = table.length; + +/* + // Print table + wprintf("ca[] = '%.*s'\n", ca); + for (mid = 0; mid < high; mid++) + { + pca = table[mid]; + wprintf("table[%d] = %d, '%.*s'\n", mid, pca.length, pca); + } +*/ + + // Do binary search + while (low < high) + { + mid = (low + high) >> 1; + pca = table[mid]; + c = ca.length - pca.length; + if (c == 0) + { + c = memcmp(ca.ptr, pca.ptr, ca.length * wchar.sizeof); + if (c == 0) + { //printf("found %d\n", mid); + return cast(int)mid; + } + } + if (c < 0) + { + high = mid; + } + else + { + low = mid + 1; + } + } + //printf("not found\n"); + return -1; // not found +} + + +unittest +{ + switch (cast(wchar []) "c") + { + case "coo": + default: + break; + } +} + + +/********************************** + * Same thing, but for wide chars. + */ + +int _d_switch_dstring(dchar[][] table, dchar[] ca) +in +{ + //printf("in _d_switch_dstring()\n"); + assert(table.length >= 0); + assert(ca.length >= 0); + + // Make sure table[] is sorted correctly + int j; + + for (j = 1; j < table.length; j++) + { + size_t len1 = table[j - 1].length; + size_t len2 = table[j].length; + + assert(len1 <= len2); + if (len1 == len2) + { + int c; + + c = memcmp(table[j - 1].ptr, table[j].ptr, len1 * dchar.sizeof); + assert(c < 0); // c==0 means a duplicate + } + } +} +out (result) +{ + int i; + int c; + + //printf("out _d_switch_string()\n"); + if (result == -1) + { + // Not found + for (i = 0; i < table.length; i++) + { + if (table[i].length == ca.length) + { c = memcmp(table[i].ptr, ca.ptr, ca.length * dchar.sizeof); + assert(c != 0); + } + } + } + else + { + assert(0 <= result && result < table.length); + for (i = 0; 1; i++) + { + assert(i < table.length); + if (table[i].length == ca.length) + { + c = memcmp(table[i].ptr, ca.ptr, ca.length * dchar.sizeof); + if (c == 0) + { + assert(i == result); + break; + } + } + } + } +} +body +{ + //printf("body _d_switch_ustring()\n"); + size_t low; + size_t high; + size_t mid; + size_t c; + dchar[] pca; + + low = 0; + high = table.length; + +/* + // Print table + wprintf("ca[] = '%.*s'\n", ca); + for (mid = 0; mid < high; mid++) + { + pca = table[mid]; + wprintf("table[%d] = %d, '%.*s'\n", mid, pca.length, pca); + } +*/ + + // Do binary search + while (low < high) + { + mid = (low + high) >> 1; + pca = table[mid]; + c = ca.length - pca.length; + if (c == 0) + { + c = memcmp(ca.ptr, pca.ptr, ca.length * dchar.sizeof); + if (c == 0) + { //printf("found %d\n", mid); + return cast(int)mid; + } + } + if (c < 0) + { + high = mid; + } + else + { + low = mid + 1; + } + } + //printf("not found\n"); + return -1; // not found +} + + +unittest +{ + switch (cast(dchar []) "c") + { + case "coo": + default: + break; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_AC.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_AC.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,95 @@ +module typeinfo.ti_AC; + +// Object[] + +class TypeInfo_AC : TypeInfo +{ + hash_t getHash(void *p) + { Object[] s = *cast(Object[]*)p; + hash_t hash = 0; + + foreach (Object o; s) + { + if (o) + hash += o.toHash(); + } + return hash; + } + + int equals(void *p1, void *p2) + { + Object[] s1 = *cast(Object[]*)p1; + Object[] s2 = *cast(Object[]*)p2; + + if (s1.length == s2.length) + { + for (size_t u = 0; u < s1.length; u++) + { Object o1 = s1[u]; + Object o2 = s2[u]; + + // Do not pass null's to Object.opEquals() + if (o1 is o2 || + (!(o1 is null) && !(o2 is null) && o1.opEquals(o2))) + continue; + return 0; + } + return 1; + } + return 0; + } + + int compare(void *p1, void *p2) + { + Object[] s1 = *cast(Object[]*)p1; + Object[] s2 = *cast(Object[]*)p2; + ptrdiff_t c; + + c = cast(ptrdiff_t)s1.length - cast(ptrdiff_t)s2.length; + if (c == 0) + { + for (size_t u = 0; u < s1.length; u++) + { Object o1 = s1[u]; + Object o2 = s2[u]; + + if (o1 is o2) + continue; + + // Regard null references as always being "less than" + if (o1) + { + if (!o2) + { c = 1; + break; + } + c = o1.opCmp(o2); + if (c) + break; + } + else + { c = -1; + break; + } + } + } + if (c < 0) + c = -1; + else + c = 1; + return cast(int)c; + } + + size_t tsize() + { + return (Object[]).sizeof; + } + + uint flags() + { + return 1; + } + + TypeInfo next() + { + return typeid(Object); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_Acdouble.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_Acdouble.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2004-2005 by Digital Mars, www.digitalmars.com + * Written by Walter Bright + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, in both source and binary form, subject to the following + * restrictions: + * + * o The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * o Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * o This notice may not be removed or altered from any source + * distribution. + */ + +module typeinfo.ti_Acdouble; + +private import typeinfo.ti_cdouble; + +// cdouble[] + +class TypeInfo_Ar : TypeInfo +{ + char[] toString() { return "cdouble[]"; } + + hash_t getHash(void *p) + { cdouble[] s = *cast(cdouble[]*)p; + size_t len = s.length; + cdouble *str = s.ptr; + hash_t hash = 0; + + while (len) + { + hash *= 9; + hash += (cast(uint *)str)[0]; + hash += (cast(uint *)str)[1]; + hash += (cast(uint *)str)[2]; + hash += (cast(uint *)str)[3]; + str++; + len--; + } + + return hash; + } + + int equals(void *p1, void *p2) + { + cdouble[] s1 = *cast(cdouble[]*)p1; + cdouble[] s2 = *cast(cdouble[]*)p2; + size_t len = s1.length; + + if (len != s2.length) + return 0; + for (size_t u = 0; u < len; u++) + { + int c = TypeInfo_r._equals(s1[u], s2[u]); + if (c == 0) + return 0; + } + return 1; + } + + int compare(void *p1, void *p2) + { + cdouble[] s1 = *cast(cdouble[]*)p1; + cdouble[] s2 = *cast(cdouble[]*)p2; + size_t len = s1.length; + + if (s2.length < len) + len = s2.length; + for (size_t u = 0; u < len; u++) + { + int c = TypeInfo_r._compare(s1[u], s2[u]); + if (c) + return c; + } + if (s1.length < s2.length) + return -1; + else if (s1.length > s2.length) + return 1; + return 0; + } + + size_t tsize() + { + return (cdouble[]).sizeof; + } + + uint flags() + { + return 1; + } + + TypeInfo next() + { + return typeid(cdouble); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_Acfloat.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_Acfloat.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2004-2005 by Digital Mars, www.digitalmars.com + * Written by Walter Bright + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, in both source and binary form, subject to the following + * restrictions: + * + * o The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * o Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * o This notice may not be removed or altered from any source + * distribution. + */ + +module typeinfo.ti_Acfloat; + +private import typeinfo.ti_cfloat; + +// cfloat[] + +class TypeInfo_Aq : TypeInfo +{ + char[] toString() { return "cfloat[]"; } + + hash_t getHash(void *p) + { cfloat[] s = *cast(cfloat[]*)p; + size_t len = s.length; + cfloat *str = s.ptr; + hash_t hash = 0; + + while (len) + { + hash *= 9; + hash += (cast(uint *)str)[0]; + hash += (cast(uint *)str)[1]; + str++; + len--; + } + + return hash; + } + + int equals(void *p1, void *p2) + { + cfloat[] s1 = *cast(cfloat[]*)p1; + cfloat[] s2 = *cast(cfloat[]*)p2; + size_t len = s1.length; + + if (len != s2.length) + return 0; + for (size_t u = 0; u < len; u++) + { + int c = TypeInfo_q._equals(s1[u], s2[u]); + if (c == 0) + return 0; + } + return 1; + } + + int compare(void *p1, void *p2) + { + cfloat[] s1 = *cast(cfloat[]*)p1; + cfloat[] s2 = *cast(cfloat[]*)p2; + size_t len = s1.length; + + if (s2.length < len) + len = s2.length; + for (size_t u = 0; u < len; u++) + { + int c = TypeInfo_q._compare(s1[u], s2[u]); + if (c) + return c; + } + if (s1.length < s2.length) + return -1; + else if (s1.length > s2.length) + return 1; + return 0; + } + + size_t tsize() + { + return (cfloat[]).sizeof; + } + + uint flags() + { + return 1; + } + + TypeInfo next() + { + return typeid(cfloat); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_Acreal.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_Acreal.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2004-2005 by Digital Mars, www.digitalmars.com + * Written by Walter Bright + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, in both source and binary form, subject to the following + * restrictions: + * + * o The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * o Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * o This notice may not be removed or altered from any source + * distribution. + */ + +module typeinfo.ti_Acreal; + +private import typeinfo.ti_creal; + +// creal[] + +class TypeInfo_Ac : TypeInfo +{ + char[] toString() { return "creal[]"; } + + hash_t getHash(void *p) + { creal[] s = *cast(creal[]*)p; + size_t len = s.length; + creal *str = s.ptr; + hash_t hash = 0; + + while (len) + { + hash *= 9; + hash += (cast(uint *)str)[0]; + hash += (cast(uint *)str)[1]; + hash += (cast(uint *)str)[2]; + hash += (cast(uint *)str)[3]; + hash += (cast(uint *)str)[4]; + str++; + len--; + } + + return hash; + } + + int equals(void *p1, void *p2) + { + creal[] s1 = *cast(creal[]*)p1; + creal[] s2 = *cast(creal[]*)p2; + size_t len = s1.length; + + if (len != s2.length) + return 0; + for (size_t u = 0; u < len; u++) + { + int c = TypeInfo_c._equals(s1[u], s2[u]); + if (c == 0) + return 0; + } + return 1; + } + + int compare(void *p1, void *p2) + { + creal[] s1 = *cast(creal[]*)p1; + creal[] s2 = *cast(creal[]*)p2; + size_t len = s1.length; + + if (s2.length < len) + len = s2.length; + for (size_t u = 0; u < len; u++) + { + int c = TypeInfo_c._compare(s1[u], s2[u]); + if (c) + return c; + } + if (s1.length < s2.length) + return -1; + else if (s1.length > s2.length) + return 1; + return 0; + } + + size_t tsize() + { + return (creal[]).sizeof; + } + + uint flags() + { + return 1; + } + + TypeInfo next() + { + return typeid(creal); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_Adouble.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_Adouble.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,116 @@ +/* + * Copyright (C) 2004-2005 by Digital Mars, www.digitalmars.com + * Written by Walter Bright + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, in both source and binary form, subject to the following + * restrictions: + * + * o The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * o Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * o This notice may not be removed or altered from any source + * distribution. + */ + +module typeinfo.ti_Adouble; + +private import typeinfo.ti_double; + +// double[] + +class TypeInfo_Ad : TypeInfo +{ + char[] toString() { return "double[]"; } + + hash_t getHash(void *p) + { double[] s = *cast(double[]*)p; + size_t len = s.length; + auto str = s.ptr; + hash_t hash = 0; + + while (len) + { + hash *= 9; + hash += (cast(uint *)str)[0]; + hash += (cast(uint *)str)[1]; + str++; + len--; + } + + return hash; + } + + int equals(void *p1, void *p2) + { + double[] s1 = *cast(double[]*)p1; + double[] s2 = *cast(double[]*)p2; + size_t len = s1.length; + + if (len != s2.length) + return 0; + for (size_t u = 0; u < len; u++) + { + int c = TypeInfo_d._equals(s1[u], s2[u]); + if (c == 0) + return 0; + } + return 1; + } + + int compare(void *p1, void *p2) + { + double[] s1 = *cast(double[]*)p1; + double[] s2 = *cast(double[]*)p2; + size_t len = s1.length; + + if (s2.length < len) + len = s2.length; + for (size_t u = 0; u < len; u++) + { + int c = TypeInfo_d._compare(s1[u], s2[u]); + if (c) + return c; + } + if (s1.length < s2.length) + return -1; + else if (s1.length > s2.length) + return 1; + return 0; + } + + size_t tsize() + { + return (double[]).sizeof; + } + + uint flags() + { + return 1; + } + + TypeInfo next() + { + return typeid(double); + } +} + +// idouble[] + +class TypeInfo_Ap : TypeInfo_Ad +{ + char[] toString() { return "idouble[]"; } + + TypeInfo next() + { + return typeid(idouble); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_Afloat.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_Afloat.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2004-2005 by Digital Mars, www.digitalmars.com + * Written by Walter Bright + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, in both source and binary form, subject to the following + * restrictions: + * + * o The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * o Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * o This notice may not be removed or altered from any source + * distribution. + */ + +module typeinfo.ti_Afloat; + +private import typeinfo.ti_float; + +// float[] + +class TypeInfo_Af : TypeInfo +{ + char[] toString() { return "float[]"; } + + hash_t getHash(void *p) + { float[] s = *cast(float[]*)p; + size_t len = s.length; + auto str = s.ptr; + hash_t hash = 0; + + while (len) + { + hash *= 9; + hash += *cast(uint *)str; + str++; + len--; + } + + return hash; + } + + int equals(void *p1, void *p2) + { + float[] s1 = *cast(float[]*)p1; + float[] s2 = *cast(float[]*)p2; + size_t len = s1.length; + + if (len != s2.length) + return 0; + for (size_t u = 0; u < len; u++) + { + int c = TypeInfo_f._equals(s1[u], s2[u]); + if (c == 0) + return 0; + } + return 1; + } + + int compare(void *p1, void *p2) + { + float[] s1 = *cast(float[]*)p1; + float[] s2 = *cast(float[]*)p2; + size_t len = s1.length; + + if (s2.length < len) + len = s2.length; + for (size_t u = 0; u < len; u++) + { + int c = TypeInfo_f._compare(s1[u], s2[u]); + if (c) + return c; + } + if (s1.length < s2.length) + return -1; + else if (s1.length > s2.length) + return 1; + return 0; + } + + size_t tsize() + { + return (float[]).sizeof; + } + + uint flags() + { + return 1; + } + + TypeInfo next() + { + return typeid(float); + } +} + +// ifloat[] + +class TypeInfo_Ao : TypeInfo_Af +{ + char[] toString() { return "ifloat[]"; } + + TypeInfo next() + { + return typeid(ifloat); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_Ag.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_Ag.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,206 @@ + +module typeinfo.ti_Ag; + +private import tango.stdc.string; +private import util.string; + +// byte[] + +class TypeInfo_Ag : TypeInfo +{ + char[] toString() { return "byte[]"; } + + hash_t getHash(void *p) + { byte[] s = *cast(byte[]*)p; + size_t len = s.length; + byte *str = s.ptr; + hash_t hash = 0; + + while (1) + { + switch (len) + { + case 0: + return hash; + + case 1: + hash *= 9; + hash += *cast(ubyte *)str; + return hash; + + case 2: + hash *= 9; + hash += *cast(ushort *)str; + return hash; + + case 3: + hash *= 9; + hash += (*cast(ushort *)str << 8) + + (cast(ubyte *)str)[2]; + return hash; + + default: + hash *= 9; + hash += *cast(uint *)str; + str += 4; + len -= 4; + break; + } + } + + return hash; + } + + int equals(void *p1, void *p2) + { + byte[] s1 = *cast(byte[]*)p1; + byte[] s2 = *cast(byte[]*)p2; + + return s1.length == s2.length && + memcmp(cast(byte *)s1, cast(byte *)s2, s1.length) == 0; + } + + int compare(void *p1, void *p2) + { + byte[] s1 = *cast(byte[]*)p1; + byte[] s2 = *cast(byte[]*)p2; + size_t len = s1.length; + + if (s2.length < len) + len = s2.length; + for (size_t u = 0; u < len; u++) + { + int result = s1[u] - s2[u]; + if (result) + return result; + } + if (s1.length < s2.length) + return -1; + else if (s1.length > s2.length) + return 1; + return 0; + } + + size_t tsize() + { + return (byte[]).sizeof; + } + + uint flags() + { + return 1; + } + + TypeInfo next() + { + return typeid(byte); + } +} + + +// ubyte[] + +class TypeInfo_Ah : TypeInfo_Ag +{ + char[] toString() { return "ubyte[]"; } + + int compare(void *p1, void *p2) + { + char[] s1 = *cast(char[]*)p1; + char[] s2 = *cast(char[]*)p2; + + return stringCompare(s1, s2); + } + + TypeInfo next() + { + return typeid(ubyte); + } +} + +// void[] + +class TypeInfo_Av : TypeInfo_Ah +{ + char[] toString() { return "void[]"; } + + TypeInfo next() + { + return typeid(void); + } +} + +// bool[] + +class TypeInfo_Ab : TypeInfo_Ah +{ + char[] toString() { return "bool[]"; } + + TypeInfo next() + { + return typeid(bool); + } +} + +// char[] + +class TypeInfo_Aa : TypeInfo_Ag +{ + char[] toString() { return "char[]"; } + + hash_t getHash(void *p) + { char[] s = *cast(char[]*)p; + hash_t hash = 0; + +version (all) +{ + foreach (char c; s) + hash = hash * 11 + c; +} +else +{ + size_t len = s.length; + char *str = s; + + while (1) + { + switch (len) + { + case 0: + return hash; + + case 1: + hash *= 9; + hash += *cast(ubyte *)str; + return hash; + + case 2: + hash *= 9; + hash += *cast(ushort *)str; + return hash; + + case 3: + hash *= 9; + hash += (*cast(ushort *)str << 8) + + (cast(ubyte *)str)[2]; + return hash; + + default: + hash *= 9; + hash += *cast(uint *)str; + str += 4; + len -= 4; + break; + } + } +} + return hash; + } + + TypeInfo next() + { + return typeid(char); + } +} + + diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_Aint.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_Aint.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,119 @@ + +module typeinfo.ti_Aint; + +private import tango.stdc.string; + +// int[] + +class TypeInfo_Ai : TypeInfo +{ + char[] toString() { return "int[]"; } + + hash_t getHash(void *p) + { int[] s = *cast(int[]*)p; + auto len = s.length; + auto str = s.ptr; + hash_t hash = 0; + + while (len) + { + hash *= 9; + hash += *cast(uint *)str; + str++; + len--; + } + + return hash; + } + + int equals(void *p1, void *p2) + { + int[] s1 = *cast(int[]*)p1; + int[] s2 = *cast(int[]*)p2; + + return s1.length == s2.length && + memcmp(cast(void *)s1, cast(void *)s2, s1.length * int.sizeof) == 0; + } + + int compare(void *p1, void *p2) + { + int[] s1 = *cast(int[]*)p1; + int[] s2 = *cast(int[]*)p2; + size_t len = s1.length; + + if (s2.length < len) + len = s2.length; + for (size_t u = 0; u < len; u++) + { + int result = s1[u] - s2[u]; + if (result) + return result; + } + if (s1.length < s2.length) + return -1; + else if (s1.length > s2.length) + return 1; + return 0; + } + + size_t tsize() + { + return (int[]).sizeof; + } + + uint flags() + { + return 1; + } + + TypeInfo next() + { + return typeid(int); + } +} + +// uint[] + +class TypeInfo_Ak : TypeInfo_Ai +{ + char[] toString() { return "uint[]"; } + + int compare(void *p1, void *p2) + { + uint[] s1 = *cast(uint[]*)p1; + uint[] s2 = *cast(uint[]*)p2; + size_t len = s1.length; + + if (s2.length < len) + len = s2.length; + for (size_t u = 0; u < len; u++) + { + int result = s1[u] - s2[u]; + if (result) + return result; + } + if (s1.length < s2.length) + return -1; + else if (s1.length > s2.length) + return 1; + return 0; + } + + TypeInfo next() + { + return typeid(uint); + } +} + +// dchar[] + +class TypeInfo_Aw : TypeInfo_Ak +{ + char[] toString() { return "dchar[]"; } + + TypeInfo next() + { + return typeid(dchar); + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_Along.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_Along.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,109 @@ + +module typeinfo.ti_Along; + +private import tango.stdc.string; + +// long[] + +class TypeInfo_Al : TypeInfo +{ + char[] toString() { return "long[]"; } + + hash_t getHash(void *p) + { long[] s = *cast(long[]*)p; + size_t len = s.length; + auto str = s.ptr; + hash_t hash = 0; + + while (len) + { + hash *= 9; + hash += *cast(uint *)str + *(cast(uint *)str + 1); + str++; + len--; + } + + return hash; + } + + int equals(void *p1, void *p2) + { + long[] s1 = *cast(long[]*)p1; + long[] s2 = *cast(long[]*)p2; + + return s1.length == s2.length && + memcmp(cast(void *)s1, cast(void *)s2, s1.length * long.sizeof) == 0; + } + + int compare(void *p1, void *p2) + { + long[] s1 = *cast(long[]*)p1; + long[] s2 = *cast(long[]*)p2; + size_t len = s1.length; + + if (s2.length < len) + len = s2.length; + for (size_t u = 0; u < len; u++) + { + if (s1[u] < s2[u]) + return -1; + else if (s1[u] > s2[u]) + return 1; + } + if (s1.length < s2.length) + return -1; + else if (s1.length > s2.length) + return 1; + return 0; + } + + size_t tsize() + { + return (long[]).sizeof; + } + + uint flags() + { + return 1; + } + + TypeInfo next() + { + return typeid(long); + } +} + + +// ulong[] + +class TypeInfo_Am : TypeInfo_Al +{ + char[] toString() { return "ulong[]"; } + + int compare(void *p1, void *p2) + { + ulong[] s1 = *cast(ulong[]*)p1; + ulong[] s2 = *cast(ulong[]*)p2; + size_t len = s1.length; + + if (s2.length < len) + len = s2.length; + for (size_t u = 0; u < len; u++) + { + if (s1[u] < s2[u]) + return -1; + else if (s1[u] > s2[u]) + return 1; + } + if (s1.length < s2.length) + return -1; + else if (s1.length > s2.length) + return 1; + return 0; + } + + TypeInfo next() + { + return typeid(ulong); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_Areal.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_Areal.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2004-2006 by Digital Mars, www.digitalmars.com + * Written by Walter Bright + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, in both source and binary form, subject to the following + * restrictions: + * + * o The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * o Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * o This notice may not be removed or altered from any source + * distribution. + */ + +module typeinfo.ti_Areal; + +private import typeinfo.ti_real; + +// real[] + +class TypeInfo_Ae : TypeInfo +{ + char[] toString() { return "real[]"; } + + hash_t getHash(void *p) + { real[] s = *cast(real[]*)p; + size_t len = s.length; + auto str = s.ptr; + hash_t hash = 0; + + while (len) + { + hash *= 9; + hash += (cast(uint *)str)[0]; + hash += (cast(uint *)str)[1]; + hash += (cast(ushort *)str)[4]; + str++; + len--; + } + + return hash; + } + + int equals(void *p1, void *p2) + { + real[] s1 = *cast(real[]*)p1; + real[] s2 = *cast(real[]*)p2; + size_t len = s1.length; + + if (len != s2.length) + return 0; + for (size_t u = 0; u < len; u++) + { + int c = TypeInfo_e._equals(s1[u], s2[u]); + if (c == 0) + return 0; + } + return 1; + } + + int compare(void *p1, void *p2) + { + real[] s1 = *cast(real[]*)p1; + real[] s2 = *cast(real[]*)p2; + size_t len = s1.length; + + if (s2.length < len) + len = s2.length; + for (size_t u = 0; u < len; u++) + { + int c = TypeInfo_e._compare(s1[u], s2[u]); + if (c) + return c; + } + if (s1.length < s2.length) + return -1; + else if (s1.length > s2.length) + return 1; + return 0; + } + + size_t tsize() + { + return (real[]).sizeof; + } + + uint flags() + { + return 1; + } + + TypeInfo next() + { + return typeid(real); + } +} + +// ireal[] + +class TypeInfo_Aj : TypeInfo_Ae +{ + char[] toString() { return "ireal[]"; } + + TypeInfo next() + { + return typeid(ireal); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_Ashort.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_Ashort.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,132 @@ + +module typeinfo.ti_Ashort; + +private import tango.stdc.string; + +// short[] + +class TypeInfo_As : TypeInfo +{ + char[] toString() { return "short[]"; } + + hash_t getHash(void *p) + { short[] s = *cast(short[]*)p; + size_t len = s.length; + short *str = s.ptr; + hash_t hash = 0; + + while (1) + { + switch (len) + { + case 0: + return hash; + + case 1: + hash *= 9; + hash += *cast(ushort *)str; + return hash; + + default: + hash *= 9; + hash += *cast(uint *)str; + str += 2; + len -= 2; + break; + } + } + + return hash; + } + + int equals(void *p1, void *p2) + { + short[] s1 = *cast(short[]*)p1; + short[] s2 = *cast(short[]*)p2; + + return s1.length == s2.length && + memcmp(cast(void *)s1, cast(void *)s2, s1.length * short.sizeof) == 0; + } + + int compare(void *p1, void *p2) + { + short[] s1 = *cast(short[]*)p1; + short[] s2 = *cast(short[]*)p2; + size_t len = s1.length; + + if (s2.length < len) + len = s2.length; + for (size_t u = 0; u < len; u++) + { + int result = s1[u] - s2[u]; + if (result) + return result; + } + if (s1.length < s2.length) + return -1; + else if (s1.length > s2.length) + return 1; + return 0; + } + + size_t tsize() + { + return (short[]).sizeof; + } + + uint flags() + { + return 1; + } + + TypeInfo next() + { + return typeid(short); + } +} + + +// ushort[] + +class TypeInfo_At : TypeInfo_As +{ + char[] toString() { return "ushort[]"; } + + int compare(void *p1, void *p2) + { + ushort[] s1 = *cast(ushort[]*)p1; + ushort[] s2 = *cast(ushort[]*)p2; + size_t len = s1.length; + + if (s2.length < len) + len = s2.length; + for (size_t u = 0; u < len; u++) + { + int result = s1[u] - s2[u]; + if (result) + return result; + } + if (s1.length < s2.length) + return -1; + else if (s1.length > s2.length) + return 1; + return 0; + } + + TypeInfo next() + { + return typeid(ushort); + } +} + +// wchar[] + +class TypeInfo_Au : TypeInfo_At +{ + char[] toString() { return "wchar[]"; } + + TypeInfo next() + { + return typeid(wchar); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_C.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_C.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2004-2005 by Digital Mars, www.digitalmars.com + * Written by Walter Bright + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, in both source and binary form, subject to the following + * restrictions: + * + * o The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * o Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * o This notice may not be removed or altered from any source + * distribution. + */ + +module typeinfo.ti_C; + +// Object + +class TypeInfo_C : TypeInfo +{ + hash_t getHash(void *p) + { + Object o = *cast(Object*)p; + assert(o); + return o.toHash(); + } + + int equals(void *p1, void *p2) + { + Object o1 = *cast(Object*)p1; + Object o2 = *cast(Object*)p2; + + return o1 == o2; + } + + int compare(void *p1, void *p2) + { + Object o1 = *cast(Object*)p1; + Object o2 = *cast(Object*)p2; + int c = 0; + + // Regard null references as always being "less than" + if (!(o1 is o2)) + { + if (o1) + { if (!o2) + c = 1; + else + c = o1.opCmp(o2); + } + else + c = -1; + } + return c; + } + + size_t tsize() + { + return Object.sizeof; + } + + uint flags() + { + return 1; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_byte.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_byte.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,39 @@ + +// byte + +module typeinfo.ti_byte; + +class TypeInfo_g : TypeInfo +{ + char[] toString() { return "byte"; } + + hash_t getHash(void *p) + { + return *cast(byte *)p; + } + + int equals(void *p1, void *p2) + { + return *cast(byte *)p1 == *cast(byte *)p2; + } + + int compare(void *p1, void *p2) + { + return *cast(byte *)p1 - *cast(byte *)p2; + } + + size_t tsize() + { + return byte.sizeof; + } + + void swap(void *p1, void *p2) + { + byte t; + + t = *cast(byte *)p1; + *cast(byte *)p1 = *cast(byte *)p2; + *cast(byte *)p2 = t; + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_cdouble.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_cdouble.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,66 @@ + +// cdouble + +module typeinfo.ti_cdouble; + +class TypeInfo_r : TypeInfo +{ + char[] toString() { return "cdouble"; } + + hash_t getHash(void *p) + { + return (cast(uint *)p)[0] + (cast(uint *)p)[1] + + (cast(uint *)p)[2] + (cast(uint *)p)[3]; + } + + static int _equals(cdouble f1, cdouble f2) + { + return f1 == f2; + } + + static int _compare(cdouble f1, cdouble f2) + { int result; + + if (f1.re < f2.re) + result = -1; + else if (f1.re > f2.re) + result = 1; + else if (f1.im < f2.im) + result = -1; + else if (f1.im > f2.im) + result = 1; + else + result = 0; + return result; + } + + int equals(void *p1, void *p2) + { + return _equals(*cast(cdouble *)p1, *cast(cdouble *)p2); + } + + int compare(void *p1, void *p2) + { + return _compare(*cast(cdouble *)p1, *cast(cdouble *)p2); + } + + size_t tsize() + { + return cdouble.sizeof; + } + + void swap(void *p1, void *p2) + { + cdouble t; + + t = *cast(cdouble *)p1; + *cast(cdouble *)p1 = *cast(cdouble *)p2; + *cast(cdouble *)p2 = t; + } + + void[] init() + { static cdouble r; + + return (cast(cdouble *)&r)[0 .. 1]; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_cfloat.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_cfloat.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,65 @@ + +// cfloat + +module typeinfo.ti_cfloat; + +class TypeInfo_q : TypeInfo +{ + char[] toString() { return "cfloat"; } + + hash_t getHash(void *p) + { + return (cast(uint *)p)[0] + (cast(uint *)p)[1]; + } + + static int _equals(cfloat f1, cfloat f2) + { + return f1 == f2; + } + + static int _compare(cfloat f1, cfloat f2) + { int result; + + if (f1.re < f2.re) + result = -1; + else if (f1.re > f2.re) + result = 1; + else if (f1.im < f2.im) + result = -1; + else if (f1.im > f2.im) + result = 1; + else + result = 0; + return result; + } + + int equals(void *p1, void *p2) + { + return _equals(*cast(cfloat *)p1, *cast(cfloat *)p2); + } + + int compare(void *p1, void *p2) + { + return _compare(*cast(cfloat *)p1, *cast(cfloat *)p2); + } + + size_t tsize() + { + return cfloat.sizeof; + } + + void swap(void *p1, void *p2) + { + cfloat t; + + t = *cast(cfloat *)p1; + *cast(cfloat *)p1 = *cast(cfloat *)p2; + *cast(cfloat *)p2 = t; + } + + void[] init() + { static cfloat r; + + return (cast(cfloat *)&r)[0 .. 1]; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_char.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_char.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,42 @@ + +module typeinfo.ti_char; + +class TypeInfo_a : TypeInfo +{ + char[] toString() { return "char"; } + + hash_t getHash(void *p) + { + return *cast(char *)p; + } + + int equals(void *p1, void *p2) + { + return *cast(char *)p1 == *cast(char *)p2; + } + + int compare(void *p1, void *p2) + { + return *cast(char *)p1 - *cast(char *)p2; + } + + size_t tsize() + { + return char.sizeof; + } + + void swap(void *p1, void *p2) + { + char t; + + t = *cast(char *)p1; + *cast(char *)p1 = *cast(char *)p2; + *cast(char *)p2 = t; + } + + void[] init() + { static char c; + + return (cast(char *)&c)[0 .. 1]; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_creal.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_creal.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,67 @@ + +// creal + +module typeinfo.ti_creal; + +class TypeInfo_c : TypeInfo +{ + char[] toString() { return "creal"; } + + hash_t getHash(void *p) + { + return (cast(uint *)p)[0] + (cast(uint *)p)[1] + + (cast(uint *)p)[2] + (cast(uint *)p)[3] + + (cast(uint *)p)[4]; + } + + static int _equals(creal f1, creal f2) + { + return f1 == f2; + } + + static int _compare(creal f1, creal f2) + { int result; + + if (f1.re < f2.re) + result = -1; + else if (f1.re > f2.re) + result = 1; + else if (f1.im < f2.im) + result = -1; + else if (f1.im > f2.im) + result = 1; + else + result = 0; + return result; + } + + int equals(void *p1, void *p2) + { + return _equals(*cast(creal *)p1, *cast(creal *)p2); + } + + int compare(void *p1, void *p2) + { + return _compare(*cast(creal *)p1, *cast(creal *)p2); + } + + size_t tsize() + { + return creal.sizeof; + } + + void swap(void *p1, void *p2) + { + creal t; + + t = *cast(creal *)p1; + *cast(creal *)p1 = *cast(creal *)p2; + *cast(creal *)p2 = t; + } + + void[] init() + { static creal r; + + return (cast(creal *)&r)[0 .. 1]; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_dchar.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_dchar.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,44 @@ + +// dchar + +module typeinfo.ti_dchar; + +class TypeInfo_w : TypeInfo +{ + char[] toString() { return "dchar"; } + + hash_t getHash(void *p) + { + return *cast(dchar *)p; + } + + int equals(void *p1, void *p2) + { + return *cast(dchar *)p1 == *cast(dchar *)p2; + } + + int compare(void *p1, void *p2) + { + return *cast(dchar *)p1 - *cast(dchar *)p2; + } + + size_t tsize() + { + return dchar.sizeof; + } + + void swap(void *p1, void *p2) + { + dchar t; + + t = *cast(dchar *)p1; + *cast(dchar *)p1 = *cast(dchar *)p2; + *cast(dchar *)p2 = t; + } + + void[] init() + { static dchar c; + + return (cast(dchar *)&c)[0 .. 1]; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_delegate.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_delegate.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,39 @@ + +// delegate + +module typeinfo.ti_delegate; + +alias void delegate(int) dg; + +class TypeInfo_D : TypeInfo +{ + hash_t getHash(void *p) + { long l = *cast(long *)p; + + return cast(uint)(l + (l >> 32)); + } + + int equals(void *p1, void *p2) + { + return *cast(dg *)p1 == *cast(dg *)p2; + } + + size_t tsize() + { + return dg.sizeof; + } + + void swap(void *p1, void *p2) + { + dg t; + + t = *cast(dg *)p1; + *cast(dg *)p1 = *cast(dg *)p2; + *cast(dg *)p2 = t; + } + + uint flags() + { + return 1; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_double.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_double.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,65 @@ + +// double + +module typeinfo.ti_double; + +class TypeInfo_d : TypeInfo +{ + char[] toString() { return "double"; } + + hash_t getHash(void *p) + { + return (cast(uint *)p)[0] + (cast(uint *)p)[1]; + } + + static int _equals(double f1, double f2) + { + return f1 == f2 || + (f1 !<>= f1 && f2 !<>= f2); + } + + static int _compare(double d1, double d2) + { + if (d1 !<>= d2) // if either are NaN + { + if (d1 !<>= d1) + { if (d2 !<>= d2) + return 0; + return -1; + } + return 1; + } + return (d1 == d2) ? 0 : ((d1 < d2) ? -1 : 1); + } + + int equals(void *p1, void *p2) + { + return _equals(*cast(double *)p1, *cast(double *)p2); + } + + int compare(void *p1, void *p2) + { + return _compare(*cast(double *)p1, *cast(double *)p2); + } + + size_t tsize() + { + return double.sizeof; + } + + void swap(void *p1, void *p2) + { + double t; + + t = *cast(double *)p1; + *cast(double *)p1 = *cast(double *)p2; + *cast(double *)p2 = t; + } + + void[] init() + { static double r; + + return (cast(double *)&r)[0 .. 1]; + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_float.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_float.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,64 @@ + +// float + +module typeinfo.ti_float; + +class TypeInfo_f : TypeInfo +{ + char[] toString() { return "float"; } + + hash_t getHash(void *p) + { + return *cast(uint *)p; + } + + static int _equals(float f1, float f2) + { + return f1 == f2 || + (f1 !<>= f1 && f2 !<>= f2); + } + + static int _compare(float d1, float d2) + { + if (d1 !<>= d2) // if either are NaN + { + if (d1 !<>= d1) + { if (d2 !<>= d2) + return 0; + return -1; + } + return 1; + } + return (d1 == d2) ? 0 : ((d1 < d2) ? -1 : 1); + } + + int equals(void *p1, void *p2) + { + return _equals(*cast(float *)p1, *cast(float *)p2); + } + + int compare(void *p1, void *p2) + { + return _compare(*cast(float *)p1, *cast(float *)p2); + } + + size_t tsize() + { + return float.sizeof; + } + + void swap(void *p1, void *p2) + { + float t; + + t = *cast(float *)p1; + *cast(float *)p1 = *cast(float *)p2; + *cast(float *)p2 = t; + } + + void[] init() + { static float r; + + return (cast(float *)&r)[0 .. 1]; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_idouble.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_idouble.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,12 @@ + +// idouble + +module typeinfo.ti_idouble; + +private import typeinfo.ti_double; + +class TypeInfo_p : TypeInfo_d +{ + char[] toString() { return "idouble"; } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_ifloat.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_ifloat.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,12 @@ + +// ifloat + +module typeinfo.ti_ifloat; + +private import typeinfo.ti_float; + +class TypeInfo_o : TypeInfo_f +{ + char[] toString() { return "ifloat"; } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_int.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_int.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,43 @@ + +// int + +module typeinfo.ti_int; + +class TypeInfo_i : TypeInfo +{ + char[] toString() { return "int"; } + + hash_t getHash(void *p) + { + return *cast(uint *)p; + } + + int equals(void *p1, void *p2) + { + return *cast(uint *)p1 == *cast(uint *)p2; + } + + int compare(void *p1, void *p2) + { + if (*cast(int*) p1 < *cast(int*) p2) + return -1; + else if (*cast(int*) p1 > *cast(int*) p2) + return 1; + return 0; + } + + size_t tsize() + { + return int.sizeof; + } + + void swap(void *p1, void *p2) + { + int t; + + t = *cast(int *)p1; + *cast(int *)p1 = *cast(int *)p2; + *cast(int *)p2 = t; + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_ireal.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_ireal.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,12 @@ + +// ireal + +module typeinfo.ti_ireal; + +private import typeinfo.ti_real; + +class TypeInfo_j : TypeInfo_e +{ + char[] toString() { return "ireal"; } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_long.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_long.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,43 @@ + +// long + +module typeinfo.ti_long; + +class TypeInfo_l : TypeInfo +{ + char[] toString() { return "long"; } + + hash_t getHash(void *p) + { + return *cast(uint *)p + (cast(uint *)p)[1]; + } + + int equals(void *p1, void *p2) + { + return *cast(long *)p1 == *cast(long *)p2; + } + + int compare(void *p1, void *p2) + { + if (*cast(long *)p1 < *cast(long *)p2) + return -1; + else if (*cast(long *)p1 > *cast(long *)p2) + return 1; + return 0; + } + + size_t tsize() + { + return long.sizeof; + } + + void swap(void *p1, void *p2) + { + long t; + + t = *cast(long *)p1; + *cast(long *)p1 = *cast(long *)p2; + *cast(long *)p2 = t; + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_ptr.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_ptr.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,46 @@ + +// pointer + +module typeinfo.ti_ptr; + +class TypeInfo_P : TypeInfo +{ + hash_t getHash(void *p) + { + return cast(uint)*cast(void* *)p; + } + + int equals(void *p1, void *p2) + { + return *cast(void* *)p1 == *cast(void* *)p2; + } + + int compare(void *p1, void *p2) + { + auto c = *cast(void* *)p1 - *cast(void* *)p2; + if (c < 0) + return -1; + else if (c > 0) + return 1; + return 0; + } + + size_t tsize() + { + return (void*).sizeof; + } + + void swap(void *p1, void *p2) + { + void* t; + + t = *cast(void* *)p1; + *cast(void* *)p1 = *cast(void* *)p2; + *cast(void* *)p2 = t; + } + + uint flags() + { + return 1; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_real.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_real.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,64 @@ + +// real + +module typeinfo.ti_real; + +class TypeInfo_e : TypeInfo +{ + char[] toString() { return "real"; } + + hash_t getHash(void *p) + { + return (cast(uint *)p)[0] + (cast(uint *)p)[1] + (cast(ushort *)p)[4]; + } + + static int _equals(real f1, real f2) + { + return f1 == f2 || + (f1 !<>= f1 && f2 !<>= f2); + } + + static int _compare(real d1, real d2) + { + if (d1 !<>= d2) // if either are NaN + { + if (d1 !<>= d1) + { if (d2 !<>= d2) + return 0; + return -1; + } + return 1; + } + return (d1 == d2) ? 0 : ((d1 < d2) ? -1 : 1); + } + + int equals(void *p1, void *p2) + { + return _equals(*cast(real *)p1, *cast(real *)p2); + } + + int compare(void *p1, void *p2) + { + return _compare(*cast(real *)p1, *cast(real *)p2); + } + + size_t tsize() + { + return real.sizeof; + } + + void swap(void *p1, void *p2) + { + real t; + + t = *cast(real *)p1; + *cast(real *)p1 = *cast(real *)p2; + *cast(real *)p2 = t; + } + + void[] init() + { static real r; + + return (cast(real *)&r)[0 .. 1]; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_short.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_short.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,39 @@ + +// short + +module typeinfo.ti_short; + +class TypeInfo_s : TypeInfo +{ + char[] toString() { return "short"; } + + hash_t getHash(void *p) + { + return *cast(short *)p; + } + + int equals(void *p1, void *p2) + { + return *cast(short *)p1 == *cast(short *)p2; + } + + int compare(void *p1, void *p2) + { + return *cast(short *)p1 - *cast(short *)p2; + } + + size_t tsize() + { + return short.sizeof; + } + + void swap(void *p1, void *p2) + { + short t; + + t = *cast(short *)p1; + *cast(short *)p1 = *cast(short *)p2; + *cast(short *)p2 = t; + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_ubyte.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_ubyte.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,43 @@ + +// ubyte + +module typeinfo.ti_ubyte; + +class TypeInfo_h : TypeInfo +{ + char[] toString() { return "ubyte"; } + + hash_t getHash(void *p) + { + return *cast(ubyte *)p; + } + + int equals(void *p1, void *p2) + { + return *cast(ubyte *)p1 == *cast(ubyte *)p2; + } + + int compare(void *p1, void *p2) + { + return *cast(ubyte *)p1 - *cast(ubyte *)p2; + } + + size_t tsize() + { + return ubyte.sizeof; + } + + void swap(void *p1, void *p2) + { + ubyte t; + + t = *cast(ubyte *)p1; + *cast(ubyte *)p1 = *cast(ubyte *)p2; + *cast(ubyte *)p2 = t; + } +} + +class TypeInfo_b : TypeInfo_h +{ + char[] toString() { return "bool"; } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_uint.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_uint.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,43 @@ + +// uint + +module typeinfo.ti_uint; + +class TypeInfo_k : TypeInfo +{ + char[] toString() { return "uint"; } + + hash_t getHash(void *p) + { + return *cast(uint *)p; + } + + int equals(void *p1, void *p2) + { + return *cast(uint *)p1 == *cast(uint *)p2; + } + + int compare(void *p1, void *p2) + { + if (*cast(uint*) p1 < *cast(uint*) p2) + return -1; + else if (*cast(uint*) p1 > *cast(uint*) p2) + return 1; + return 0; + } + + size_t tsize() + { + return uint.sizeof; + } + + void swap(void *p1, void *p2) + { + int t; + + t = *cast(uint *)p1; + *cast(uint *)p1 = *cast(uint *)p2; + *cast(uint *)p2 = t; + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_ulong.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_ulong.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,43 @@ + +// ulong + +module typeinfo.ti_ulong; + +class TypeInfo_m : TypeInfo +{ + char[] toString() { return "ulong"; } + + hash_t getHash(void *p) + { + return *cast(uint *)p + (cast(uint *)p)[1]; + } + + int equals(void *p1, void *p2) + { + return *cast(ulong *)p1 == *cast(ulong *)p2; + } + + int compare(void *p1, void *p2) + { + if (*cast(ulong *)p1 < *cast(ulong *)p2) + return -1; + else if (*cast(ulong *)p1 > *cast(ulong *)p2) + return 1; + return 0; + } + + size_t tsize() + { + return ulong.sizeof; + } + + void swap(void *p1, void *p2) + { + ulong t; + + t = *cast(ulong *)p1; + *cast(ulong *)p1 = *cast(ulong *)p2; + *cast(ulong *)p2 = t; + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_ushort.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_ushort.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,39 @@ + +// ushort + +module typeinfo.ti_ushort; + +class TypeInfo_t : TypeInfo +{ + char[] toString() { return "ushort"; } + + hash_t getHash(void *p) + { + return *cast(ushort *)p; + } + + int equals(void *p1, void *p2) + { + return *cast(ushort *)p1 == *cast(ushort *)p2; + } + + int compare(void *p1, void *p2) + { + return *cast(ushort *)p1 - *cast(ushort *)p2; + } + + size_t tsize() + { + return ushort.sizeof; + } + + void swap(void *p1, void *p2) + { + ushort t; + + t = *cast(ushort *)p1; + *cast(ushort *)p1 = *cast(ushort *)p2; + *cast(ushort *)p2 = t; + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_void.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_void.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,43 @@ + +// void + +module typeinfo.ti_void; + +class TypeInfo_v : TypeInfo +{ + char[] toString() { return "void"; } + + hash_t getHash(void *p) + { + assert(0); + } + + int equals(void *p1, void *p2) + { + return *cast(byte *)p1 == *cast(byte *)p2; + } + + int compare(void *p1, void *p2) + { + return *cast(byte *)p1 - *cast(byte *)p2; + } + + size_t tsize() + { + return void.sizeof; + } + + void swap(void *p1, void *p2) + { + byte t; + + t = *cast(byte *)p1; + *cast(byte *)p1 = *cast(byte *)p2; + *cast(byte *)p2 = t; + } + + uint flags() + { + return 1; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/typeinfo/ti_wchar.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/typeinfo/ti_wchar.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,43 @@ + +module typeinfo.ti_wchar; + + +class TypeInfo_u : TypeInfo +{ + char[] toString() { return "wchar"; } + + hash_t getHash(void *p) + { + return *cast(wchar *)p; + } + + int equals(void *p1, void *p2) + { + return *cast(wchar *)p1 == *cast(wchar *)p2; + } + + int compare(void *p1, void *p2) + { + return *cast(wchar *)p1 - *cast(wchar *)p2; + } + + size_t tsize() + { + return wchar.sizeof; + } + + void swap(void *p1, void *p2) + { + wchar t; + + t = *cast(wchar *)p1; + *cast(wchar *)p1 = *cast(wchar *)p2; + *cast(wchar *)p2 = t; + } + + void[] init() + { static wchar c; + + return (cast(wchar *)&c)[0 .. 1]; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/util/console.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/util/console.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,86 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Tango group. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: July 2006 + + + Various low-level console oriented utilities + +*******************************************************************************/ + +module util.console; + +private import util.string; + +version (Win32) + { + private extern (Windows) int GetStdHandle (int); + private extern (Windows) int WriteFile (int, char*, int, int*, void*); + } + +else + +version (Posix) + { + private extern (C) ptrdiff_t write (int, void*, size_t); + } + +/+ +// emit a char[] to the console. Note that Win32 does not handle utf8, but +// then neither does fprintf (stderr). This will handle redirection though. +// May need to remedy the utf8 issue +int console (char[] s) +{ + version (Win32) + { + int count; + if (WriteFile (GetStdHandle(0xfffffff5), s.ptr, s.length, &count, null)) + return count; + return -1; + } + else + version (Posix) + { + return write (2, s.ptr, s.length); + } +} + +// emit an integer to the console +int console (uint i) +{ + char[10] tmp = void; + + return console (intToUtf8 (tmp, i)); +} ++/ + +struct Console +{ + Console opCall (char[] s) + { + version (Win32) + { + int count; + WriteFile (GetStdHandle(0xfffffff5), s.ptr, s.length, &count, null); + } + else + version (Posix) + { + write (2, s.ptr, s.length); + } + return *this; + } + + // emit an integer to the console + Console opCall (uint i) + { + char[10] tmp = void; + + return console (intToUtf8 (tmp, i)); + } +} + +Console console; diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/util/ctype.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/util/ctype.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,106 @@ + +/* + * Copyright (C) 2004-2005 by Digital Mars, www.digitalmars.com + * Written by Walter Bright + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, in both source and binary form, subject to the following + * restrictions: + * + * o The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * o Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * o This notice may not be removed or altered from any source + * distribution. + */ + +// Simple ASCII char classification functions + +module util.ctype; + +int isalnum(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_ALP|_DIG) : 0; } +int isalpha(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_ALP) : 0; } +int iscntrl(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_CTL) : 0; } +int isdigit(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_DIG) : 0; } +int islower(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_LC) : 0; } +int ispunct(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_PNC) : 0; } +int isspace(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_SPC) : 0; } +int isupper(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_UC) : 0; } +int isxdigit(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_HEX) : 0; } +int isgraph(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_ALP|_DIG|_PNC) : 0; } +int isprint(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_ALP|_DIG|_PNC|_BLK) : 0; } +int isascii(dchar c) { return c <= 0x7F; } + +dchar tolower(dchar c) + out (result) + { + assert(!isupper(result)); + } + body + { + return isupper(c) ? c + (cast(dchar)'a' - 'A') : c; + } + +dchar toupper(dchar c) + out (result) + { + assert(!islower(result)); + } + body + { + return islower(c) ? c - (cast(dchar)'a' - 'A') : c; + } + +private: + +enum +{ + _SPC = 8, + _CTL = 0x20, + _BLK = 0x40, + _HEX = 0x80, + _UC = 1, + _LC = 2, + _PNC = 0x10, + _DIG = 4, + _ALP = _UC|_LC, +} + +ubyte _ctype[128] = +[ + _CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL, + _CTL,_CTL|_SPC,_CTL|_SPC,_CTL|_SPC,_CTL|_SPC,_CTL|_SPC,_CTL,_CTL, + _CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL, + _CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL, + _SPC|_BLK,_PNC,_PNC,_PNC,_PNC,_PNC,_PNC,_PNC, + _PNC,_PNC,_PNC,_PNC,_PNC,_PNC,_PNC,_PNC, + _DIG|_HEX,_DIG|_HEX,_DIG|_HEX,_DIG|_HEX,_DIG|_HEX, + _DIG|_HEX,_DIG|_HEX,_DIG|_HEX,_DIG|_HEX,_DIG|_HEX, + _PNC,_PNC,_PNC,_PNC,_PNC,_PNC, + _PNC,_UC|_HEX,_UC|_HEX,_UC|_HEX,_UC|_HEX,_UC|_HEX,_UC|_HEX,_UC, + _UC,_UC,_UC,_UC,_UC,_UC,_UC,_UC, + _UC,_UC,_UC,_UC,_UC,_UC,_UC,_UC, + _UC,_UC,_UC,_PNC,_PNC,_PNC,_PNC,_PNC, + _PNC,_LC|_HEX,_LC|_HEX,_LC|_HEX,_LC|_HEX,_LC|_HEX,_LC|_HEX,_LC, + _LC,_LC,_LC,_LC,_LC,_LC,_LC,_LC, + _LC,_LC,_LC,_LC,_LC,_LC,_LC,_LC, + _LC,_LC,_LC,_PNC,_PNC,_PNC,_PNC,_CTL +]; + + +unittest +{ + assert(isspace(' ')); + assert(!isspace('z')); + assert(toupper('a') == 'A'); + assert(tolower('Q') == 'q'); + assert(!isxdigit('G')); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/util/string.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/util/string.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,50 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Tango group. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: July 2006 + + + Various char[] utilities + +*******************************************************************************/ + +module util.string; + +private import tango.stdc.string; + +// convert uint to char[], within the given buffer +// Returns a valid slice of the populated buffer +char[] intToUtf8 (char[] tmp, size_t val) +in { + assert (tmp.length > 20, "atoi buffer should be 20 or more chars wide"); + } +body +{ + char* p = tmp.ptr + tmp.length; + + do { + *--p = (val % 10) + '0'; + } while (val /= 10); + + return tmp [cast(size_t)(p - tmp.ptr) .. $]; +} + + +// function to compare two strings +int stringCompare (char[] s1, char[] s2) +{ + auto len = s1.length; + + if (s2.length < len) + len = s2.length; + + int result = memcmp(s1.ptr, s2.ptr, len); + + if (result == 0) + result = cast(int)s1.length - cast(int)s2.length; + + return result; +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/compiler/llvmdc/util/utf.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/compiler/llvmdc/util/utf.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,851 @@ +// utf.d + +/* + * Copyright (C) 2003-2004 by Digital Mars, www.digitalmars.com + * Written by Walter Bright + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * o The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * o Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * o This notice may not be removed or altered from any source + * distribution. + */ + +// Description of UTF-8 at: +// http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 +// http://anubis.dkuug.dk/JTC1/SC2/WG2/docs/n1335 + + +module util.utf; + + +extern (C) void onUnicodeError( char[] msg, size_t idx ); + + +bool isValidDchar(dchar c) +{ + /* Note: FFFE and FFFF are specifically permitted by the + * Unicode standard for application internal use, but are not + * allowed for interchange. + * (thanks to Arcane Jill) + */ + + return c < 0xD800 || + (c > 0xDFFF && c <= 0x10FFFF /*&& c != 0xFFFE && c != 0xFFFF*/); +} + +unittest +{ + debug(utf) printf("utf.isValidDchar.unittest\n"); + assert(isValidDchar(cast(dchar)'a') == true); + assert(isValidDchar(cast(dchar)0x1FFFFF) == false); +} + + +/* This array gives the length of a UTF-8 sequence indexed by the value + * of the leading byte. An FF represents an illegal starting value of + * a UTF-8 sequence. + * FF is used instead of 0 to avoid having loops hang. + */ + +ubyte[256] UTF8stride = +[ + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 4,4,4,4,4,4,4,4,5,5,5,5,6,6,0xFF,0xFF, +]; + +uint stride(char[] s, size_t i) +{ + return UTF8stride[s[i]]; +} + +uint stride(wchar[] s, size_t i) +{ uint u = s[i]; + return 1 + (u >= 0xD800 && u <= 0xDBFF); +} + +uint stride(dchar[] s, size_t i) +{ + return 1; +} + +/******************************************* + * Given an index into an array of char's, + * and assuming that index is at the start of a UTF character, + * determine the number of UCS characters up to that index. + */ + +size_t toUCSindex(char[] s, size_t i) +{ + size_t n; + size_t j; + size_t stride; + + for (j = 0; j < i; j += stride) + { + stride = UTF8stride[s[j]]; + if (stride == 0xFF) + goto Lerr; + n++; + } + if (j > i) + { + Lerr: + onUnicodeError("invalid UTF-8 sequence", j); + } + return n; +} + +size_t toUCSindex(wchar[] s, size_t i) +{ + size_t n; + size_t j; + + for (j = 0; j < i; ) + { uint u = s[j]; + + j += 1 + (u >= 0xD800 && u <= 0xDBFF); + n++; + } + if (j > i) + { + Lerr: + onUnicodeError("invalid UTF-16 sequence", j); + } + return n; +} + +size_t toUCSindex(dchar[] s, size_t i) +{ + return i; +} + +/****************************************** + * Given a UCS index into an array of characters, return the UTF index. + */ + +size_t toUTFindex(char[] s, size_t n) +{ + size_t i; + + while (n--) + { + uint j = UTF8stride[s[i]]; + if (j == 0xFF) + onUnicodeError("invalid UTF-8 sequence", i); + i += j; + } + return i; +} + +size_t toUTFindex(wchar[] s, size_t n) +{ + size_t i; + + while (n--) + { wchar u = s[i]; + + i += 1 + (u >= 0xD800 && u <= 0xDBFF); + } + return i; +} + +size_t toUTFindex(dchar[] s, size_t n) +{ + return n; +} + +/* =================== Decode ======================= */ + +dchar decode(char[] s, inout size_t idx) + in + { + assert(idx >= 0 && idx < s.length); + } + out (result) + { + assert(isValidDchar(result)); + } + body + { + size_t len = s.length; + dchar V; + size_t i = idx; + char u = s[i]; + + if (u & 0x80) + { uint n; + char u2; + + /* The following encodings are valid, except for the 5 and 6 byte + * combinations: + * 0xxxxxxx + * 110xxxxx 10xxxxxx + * 1110xxxx 10xxxxxx 10xxxxxx + * 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + * 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx + * 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx + */ + for (n = 1; ; n++) + { + if (n > 4) + goto Lerr; // only do the first 4 of 6 encodings + if (((u << n) & 0x80) == 0) + { + if (n == 1) + goto Lerr; + break; + } + } + + // Pick off (7 - n) significant bits of B from first byte of octet + V = cast(dchar)(u & ((1 << (7 - n)) - 1)); + + if (i + (n - 1) >= len) + goto Lerr; // off end of string + + /* The following combinations are overlong, and illegal: + * 1100000x (10xxxxxx) + * 11100000 100xxxxx (10xxxxxx) + * 11110000 1000xxxx (10xxxxxx 10xxxxxx) + * 11111000 10000xxx (10xxxxxx 10xxxxxx 10xxxxxx) + * 11111100 100000xx (10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx) + */ + u2 = s[i + 1]; + if ((u & 0xFE) == 0xC0 || + (u == 0xE0 && (u2 & 0xE0) == 0x80) || + (u == 0xF0 && (u2 & 0xF0) == 0x80) || + (u == 0xF8 && (u2 & 0xF8) == 0x80) || + (u == 0xFC && (u2 & 0xFC) == 0x80)) + goto Lerr; // overlong combination + + for (uint j = 1; j != n; j++) + { + u = s[i + j]; + if ((u & 0xC0) != 0x80) + goto Lerr; // trailing bytes are 10xxxxxx + V = (V << 6) | (u & 0x3F); + } + if (!isValidDchar(V)) + goto Lerr; + i += n; + } + else + { + V = cast(dchar) u; + i++; + } + + idx = i; + return V; + + Lerr: + onUnicodeError("invalid UTF-8 sequence", i); + return V; // dummy return + } + +unittest +{ size_t i; + dchar c; + + debug(utf) printf("utf.decode.unittest\n"); + + static char[] s1 = "abcd"; + i = 0; + c = decode(s1, i); + assert(c == cast(dchar)'a'); + assert(i == 1); + c = decode(s1, i); + assert(c == cast(dchar)'b'); + assert(i == 2); + + static char[] s2 = "\xC2\xA9"; + i = 0; + c = decode(s2, i); + assert(c == cast(dchar)'\u00A9'); + assert(i == 2); + + static char[] s3 = "\xE2\x89\xA0"; + i = 0; + c = decode(s3, i); + assert(c == cast(dchar)'\u2260'); + assert(i == 3); + + static char[][] s4 = + [ "\xE2\x89", // too short + "\xC0\x8A", + "\xE0\x80\x8A", + "\xF0\x80\x80\x8A", + "\xF8\x80\x80\x80\x8A", + "\xFC\x80\x80\x80\x80\x8A", + ]; + + for (int j = 0; j < s4.length; j++) + { + try + { + i = 0; + c = decode(s4[j], i); + assert(0); + } + catch (Object o) + { + i = 23; + } + assert(i == 23); + } +} + +/********************************************************/ + +dchar decode(wchar[] s, inout size_t idx) + in + { + assert(idx >= 0 && idx < s.length); + } + out (result) + { + assert(isValidDchar(result)); + } + body + { + char[] msg; + dchar V; + size_t i = idx; + uint u = s[i]; + + if (u & ~0x7F) + { if (u >= 0xD800 && u <= 0xDBFF) + { uint u2; + + if (i + 1 == s.length) + { msg = "surrogate UTF-16 high value past end of string"; + goto Lerr; + } + u2 = s[i + 1]; + if (u2 < 0xDC00 || u2 > 0xDFFF) + { msg = "surrogate UTF-16 low value out of range"; + goto Lerr; + } + u = ((u - 0xD7C0) << 10) + (u2 - 0xDC00); + i += 2; + } + else if (u >= 0xDC00 && u <= 0xDFFF) + { msg = "unpaired surrogate UTF-16 value"; + goto Lerr; + } + else if (u == 0xFFFE || u == 0xFFFF) + { msg = "illegal UTF-16 value"; + goto Lerr; + } + else + i++; + } + else + { + i++; + } + + idx = i; + return cast(dchar)u; + + Lerr: + onUnicodeError(msg, i); + return cast(dchar)u; // dummy return + } + +/********************************************************/ + +dchar decode(dchar[] s, inout size_t idx) + in + { + assert(idx >= 0 && idx < s.length); + } + body + { + size_t i = idx; + dchar c = s[i]; + + if (!isValidDchar(c)) + goto Lerr; + idx = i + 1; + return c; + + Lerr: + onUnicodeError("invalid UTF-32 value", i); + return c; // dummy return + } + + +/* =================== Encode ======================= */ + +void encode(inout char[] s, dchar c) + in + { + assert(isValidDchar(c)); + } + body + { + char[] r = s; + + if (c <= 0x7F) + { + r ~= cast(char) c; + } + else + { + char[4] buf; + uint L; + + if (c <= 0x7FF) + { + buf[0] = cast(char)(0xC0 | (c >> 6)); + buf[1] = cast(char)(0x80 | (c & 0x3F)); + L = 2; + } + else if (c <= 0xFFFF) + { + buf[0] = cast(char)(0xE0 | (c >> 12)); + buf[1] = cast(char)(0x80 | ((c >> 6) & 0x3F)); + buf[2] = cast(char)(0x80 | (c & 0x3F)); + L = 3; + } + else if (c <= 0x10FFFF) + { + buf[0] = cast(char)(0xF0 | (c >> 18)); + buf[1] = cast(char)(0x80 | ((c >> 12) & 0x3F)); + buf[2] = cast(char)(0x80 | ((c >> 6) & 0x3F)); + buf[3] = cast(char)(0x80 | (c & 0x3F)); + L = 4; + } + else + { + assert(0); + } + r ~= buf[0 .. L]; + } + s = r; + } + +unittest +{ + debug(utf) printf("utf.encode.unittest\n"); + + char[] s = "abcd"; + encode(s, cast(dchar)'a'); + assert(s.length == 5); + assert(s == "abcda"); + + encode(s, cast(dchar)'\u00A9'); + assert(s.length == 7); + assert(s == "abcda\xC2\xA9"); + //assert(s == "abcda\u00A9"); // BUG: fix compiler + + encode(s, cast(dchar)'\u2260'); + assert(s.length == 10); + assert(s == "abcda\xC2\xA9\xE2\x89\xA0"); +} + +/********************************************************/ + +void encode(inout wchar[] s, dchar c) + in + { + assert(isValidDchar(c)); + } + body + { + wchar[] r = s; + + if (c <= 0xFFFF) + { + r ~= cast(wchar) c; + } + else + { + wchar[2] buf; + + buf[0] = cast(wchar) ((((c - 0x10000) >> 10) & 0x3FF) + 0xD800); + buf[1] = cast(wchar) (((c - 0x10000) & 0x3FF) + 0xDC00); + r ~= buf; + } + s = r; + } + +void encode(inout dchar[] s, dchar c) + in + { + assert(isValidDchar(c)); + } + body + { + s ~= c; + } + +/* =================== Validation ======================= */ + +void validate(char[] s) +{ + size_t len = s.length; + size_t i; + + for (i = 0; i < len; ) + { + decode(s, i); + } +} + +void validate(wchar[] s) +{ + size_t len = s.length; + size_t i; + + for (i = 0; i < len; ) + { + decode(s, i); + } +} + +void validate(dchar[] s) +{ + size_t len = s.length; + size_t i; + + for (i = 0; i < len; ) + { + decode(s, i); + } +} + +/* =================== Conversion to UTF8 ======================= */ + +char[] toUTF8(char[4] buf, dchar c) + in + { + assert(isValidDchar(c)); + } + body + { + if (c <= 0x7F) + { + buf[0] = cast(char) c; + return buf[0 .. 1]; + } + else if (c <= 0x7FF) + { + buf[0] = cast(char)(0xC0 | (c >> 6)); + buf[1] = cast(char)(0x80 | (c & 0x3F)); + return buf[0 .. 2]; + } + else if (c <= 0xFFFF) + { + buf[0] = cast(char)(0xE0 | (c >> 12)); + buf[1] = cast(char)(0x80 | ((c >> 6) & 0x3F)); + buf[2] = cast(char)(0x80 | (c & 0x3F)); + return buf[0 .. 3]; + } + else if (c <= 0x10FFFF) + { + buf[0] = cast(char)(0xF0 | (c >> 18)); + buf[1] = cast(char)(0x80 | ((c >> 12) & 0x3F)); + buf[2] = cast(char)(0x80 | ((c >> 6) & 0x3F)); + buf[3] = cast(char)(0x80 | (c & 0x3F)); + return buf[0 .. 4]; + } + assert(0); + } + +char[] toUTF8(char[] s) + in + { + validate(s); + } + body + { + return s; + } + +char[] toUTF8(wchar[] s) +{ + char[] r; + size_t i; + size_t slen = s.length; + + r.length = slen; + + for (i = 0; i < slen; i++) + { wchar c = s[i]; + + if (c <= 0x7F) + r[i] = cast(char)c; // fast path for ascii + else + { + r.length = i; + foreach (dchar c; s[i .. slen]) + { + encode(r, c); + } + break; + } + } + return r; +} + +char[] toUTF8(dchar[] s) +{ + char[] r; + size_t i; + size_t slen = s.length; + + r.length = slen; + + for (i = 0; i < slen; i++) + { dchar c = s[i]; + + if (c <= 0x7F) + r[i] = cast(char)c; // fast path for ascii + else + { + r.length = i; + foreach (dchar d; s[i .. slen]) + { + encode(r, d); + } + break; + } + } + return r; +} + +/* =================== Conversion to UTF16 ======================= */ + +wchar[] toUTF16(wchar[2] buf, dchar c) + in + { + assert(isValidDchar(c)); + } + body + { + if (c <= 0xFFFF) + { + buf[0] = cast(wchar) c; + return buf[0 .. 1]; + } + else + { + buf[0] = cast(wchar) ((((c - 0x10000) >> 10) & 0x3FF) + 0xD800); + buf[1] = cast(wchar) (((c - 0x10000) & 0x3FF) + 0xDC00); + return buf[0 .. 2]; + } + } + +wchar[] toUTF16(char[] s) +{ + wchar[] r; + size_t slen = s.length; + + r.length = slen; + r.length = 0; + for (size_t i = 0; i < slen; ) + { + dchar c = s[i]; + if (c <= 0x7F) + { + i++; + r ~= cast(wchar)c; + } + else + { + c = decode(s, i); + encode(r, c); + } + } + return r; +} + +wchar* toUTF16z(char[] s) +{ + wchar[] r; + size_t slen = s.length; + + r.length = slen + 1; + r.length = 0; + for (size_t i = 0; i < slen; ) + { + dchar c = s[i]; + if (c <= 0x7F) + { + i++; + r ~= cast(wchar)c; + } + else + { + c = decode(s, i); + encode(r, c); + } + } + r ~= "\000"; + return r.ptr; +} + +wchar[] toUTF16(wchar[] s) + in + { + validate(s); + } + body + { + return s; + } + +wchar[] toUTF16(dchar[] s) +{ + wchar[] r; + size_t slen = s.length; + + r.length = slen; + r.length = 0; + for (size_t i = 0; i < slen; i++) + { + encode(r, s[i]); + } + return r; +} + +/* =================== Conversion to UTF32 ======================= */ + +dchar[] toUTF32(char[] s) +{ + dchar[] r; + size_t slen = s.length; + size_t j = 0; + + r.length = slen; // r[] will never be longer than s[] + for (size_t i = 0; i < slen; ) + { + dchar c = s[i]; + if (c >= 0x80) + c = decode(s, i); + else + i++; // c is ascii, no need for decode + r[j++] = c; + } + return r[0 .. j]; +} + +dchar[] toUTF32(wchar[] s) +{ + dchar[] r; + size_t slen = s.length; + size_t j = 0; + + r.length = slen; // r[] will never be longer than s[] + for (size_t i = 0; i < slen; ) + { + dchar c = s[i]; + if (c >= 0x80) + c = decode(s, i); + else + i++; // c is ascii, no need for decode + r[j++] = c; + } + return r[0 .. j]; +} + +dchar[] toUTF32(dchar[] s) + in + { + validate(s); + } + body + { + return s; + } + +/* ================================ tests ================================== */ + +unittest +{ + debug(utf) printf("utf.toUTF.unittest\n"); + + char[] c; + wchar[] w; + dchar[] d; + + c = "hello"; + w = toUTF16(c); + assert(w == "hello"); + d = toUTF32(c); + assert(d == "hello"); + + c = toUTF8(w); + assert(c == "hello"); + d = toUTF32(w); + assert(d == "hello"); + + c = toUTF8(d); + assert(c == "hello"); + w = toUTF16(d); + assert(w == "hello"); + + + c = "hel\u1234o"; + w = toUTF16(c); + assert(w == "hel\u1234o"); + d = toUTF32(c); + assert(d == "hel\u1234o"); + + c = toUTF8(w); + assert(c == "hel\u1234o"); + d = toUTF32(w); + assert(d == "hel\u1234o"); + + c = toUTF8(d); + assert(c == "hel\u1234o"); + w = toUTF16(d); + assert(w == "hel\u1234o"); + + + c = "he\U0010AAAAllo"; + w = toUTF16(c); + //foreach (wchar c; w) printf("c = x%x\n", c); + //foreach (wchar c; cast(wchar[])"he\U0010AAAAllo") printf("c = x%x\n", c); + assert(w == "he\U0010AAAAllo"); + d = toUTF32(c); + assert(d == "he\U0010AAAAllo"); + + c = toUTF8(w); + assert(c == "he\U0010AAAAllo"); + d = toUTF32(w); + assert(d == "he\U0010AAAAllo"); + + c = toUTF8(d); + assert(c == "he\U0010AAAAllo"); + w = toUTF16(d); + assert(w == "he\U0010AAAAllo"); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/gc/basic/gc.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/gc/basic/gc.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,165 @@ +/** + * This module contains the garbage collector front-end. + * + * Copyright: Copyright (C) 2005-2006 Digital Mars, www.digitalmars.com. + * All rights reserved. + * License: + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, in both source and binary form, subject to the following + * restrictions: + * + * o The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * o Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * o This notice may not be removed or altered from any source + * distribution. + * Authors: Walter Bright, Sean Kelly + */ + +private import gcx; +private import tango.stdc.stdlib; + +version=GCCLASS; + +version (GCCLASS) + alias GC gc_t; +else + alias GC* gc_t; + +gc_t _gc; + +extern (C) void thread_init(); + +extern (C) void gc_init() +{ + version (GCCLASS) + { void* p; + ClassInfo ci = GC.classinfo; + + p = tango.stdc.stdlib.malloc(ci.init.length); + (cast(byte*)p)[0 .. ci.init.length] = ci.init[]; + _gc = cast(GC)p; + } + else + { + _gc = cast(GC*) tango.stdc.stdlib.calloc(1, GC.sizeof); + } + _gc.initialize(); + // NOTE: The GC must initialize the thread library + // before its first collection. + thread_init(); +} + +extern (C) void gc_term() +{ + // NOTE: There may be daemons threads still running when this routine is + // called. If so, cleaning memory out from under then is a good + // way to make them crash horribly. This probably doesn't matter + // much since the app is supposed to be shutting down anyway, but + // I'm disabling cleanup for now until I can think about it some + // more. + // + // NOTE: Due to popular demand, this has been re-enabled. It still has + // the problems mentioned above though, so I guess we'll see. + _gc.fullCollectNoStack(); // not really a 'collect all' -- still scans + // static data area, roots, and ranges. + _gc.Dtor(); +} + +extern (C) void gc_enable() +{ + _gc.enable(); +} + +extern (C) void gc_disable() +{ + _gc.disable(); +} + +extern (C) void gc_collect() +{ + _gc.fullCollect(); +} + +extern (C) uint gc_getAttr( void* p ) +{ + return _gc.getAttr( p ); +} + +extern (C) uint gc_setAttr( void* p, uint a ) +{ + return _gc.setAttr( p, a ); +} + +extern (C) uint gc_clrAttr( void* p, uint a ) +{ + return _gc.clrAttr( p, a ); +} + +extern (C) void* gc_malloc( size_t sz, uint ba = 0 ) +{ + return _gc.malloc( sz, ba ); +} + +extern (C) void* gc_calloc( size_t sz, uint ba = 0 ) +{ + return _gc.calloc( sz, ba ); +} + +extern (C) void* gc_realloc( void* p, size_t sz, uint ba = 0 ) +{ + return _gc.realloc( p, sz, ba ); +} + +extern (C) size_t gc_extend( void* p, size_t mx, size_t sz ) +{ + return _gc.extend( p, mx, sz ); +} + +extern (C) void gc_free( void* p ) +{ + _gc.free( p ); +} + +extern (C) void* gc_addrOf( void* p ) +{ + return _gc.addrOf( p ); +} + +extern (C) size_t gc_sizeOf( void* p ) +{ + return _gc.sizeOf( p ); +} + +extern (C) BlkInfo gc_query( void* p ) +{ + return _gc.query( p ); +} + +extern (C) void gc_addRoot( void* p ) +{ + _gc.addRoot( p ); +} + +extern (C) void gc_addRange( void* p, size_t sz ) +{ + _gc.addRange( p, sz ); +} + +extern (C) void gc_removeRoot( void *p ) +{ + _gc.removeRoot( p ); +} + +extern (C) void gc_removeRange( void *p ) +{ + _gc.removeRange( p ); +} \ No newline at end of file diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/gc/basic/gcalloc.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/gc/basic/gcalloc.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,213 @@ +/** + * This module contains allocation functions for the garbage collector. + * + * Copyright: Copyright (C) 2005-2006 Digital Mars, www.digitalmars.com. + * All rights reserved. + * License: + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, in both source and binary form, subject to the following + * restrictions: + * + * o The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * o Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * o This notice may not be removed or altered from any source + * distribution. + * Authors: Walter Bright, David Friedman, Sean Kelly + */ + + +version (Win32) +{ + private import tango.sys.win32.UserGdi; + + alias int pthread_t; + + pthread_t pthread_self() + { + return cast(pthread_t) GetCurrentThreadId(); + } + + //version = GC_Use_Alloc_Win32; +} +else version (Posix) +{ + private import tango.stdc.posix.sys.mman; + private import tango.stdc.stdlib; + + //version = GC_Use_Alloc_MMap; +} +else +{ + private import tango.stdc.stdlib; + + //version = GC_Use_Alloc_Malloc; +} + +/+ +static if(is(typeof(VirtualAlloc))) + version = GC_Use_Alloc_Win32; +else static if (is(typeof(mmap))) + version = GC_Use_Alloc_MMap; +else static if (is(typeof(valloc))) + version = GC_Use_Alloc_Valloc; +else static if (is(typeof(malloc))) + version = GC_Use_Alloc_Malloc; +else static assert(false, "No supported allocation methods available."); ++/ + +static if (is(typeof(VirtualAlloc))) // version (GC_Use_Alloc_Win32) +{ + /** + * Map memory. + */ + void *os_mem_map(size_t nbytes) + { + return VirtualAlloc(null, nbytes, MEM_RESERVE, PAGE_READWRITE); + } + + + /** + * Commit memory. + * Returns: + * 0 success + * !=0 failure + */ + int os_mem_commit(void *base, size_t offset, size_t nbytes) + { void *p; + + p = VirtualAlloc(base + offset, nbytes, MEM_COMMIT, PAGE_READWRITE); + return cast(int)(p == null); + } + + + /** + * Decommit memory. + * Returns: + * 0 success + * !=0 failure + */ + int os_mem_decommit(void *base, size_t offset, size_t nbytes) + { + return cast(int)(VirtualFree(base + offset, nbytes, MEM_DECOMMIT) == 0); + } + + + /** + * Unmap memory allocated with os_mem_map(). + * Memory must have already been decommitted. + * Returns: + * 0 success + * !=0 failure + */ + int os_mem_unmap(void *base, size_t nbytes) + { + return cast(int)(VirtualFree(base, 0, MEM_RELEASE) == 0); + } +} +else static if (is(typeof(mmap))) // else version (GC_Use_Alloc_MMap) +{ + void *os_mem_map(size_t nbytes) + { void *p; + + p = mmap(null, nbytes, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); + return (p == MAP_FAILED) ? null : p; + } + + + int os_mem_commit(void *base, size_t offset, size_t nbytes) + { + return 0; + } + + + int os_mem_decommit(void *base, size_t offset, size_t nbytes) + { + return 0; + } + + + int os_mem_unmap(void *base, size_t nbytes) + { + return munmap(base, nbytes); + } +} +else static if (is(typeof(valloc))) // else version (GC_Use_Alloc_Valloc) +{ + void *os_mem_map(size_t nbytes) + { + return valloc(nbytes); + } + + + int os_mem_commit(void *base, size_t offset, size_t nbytes) + { + return 0; + } + + + int os_mem_decommit(void *base, size_t offset, size_t nbytes) + { + return 0; + } + + + int os_mem_unmap(void *base, size_t nbytes) + { + free(base); + return 0; + } +} +else static if (is(typeof(malloc))) // else version (GC_Use_Alloc_Malloc) +{ + // NOTE: This assumes malloc granularity is at least (void*).sizeof. If + // (req_size + PAGESIZE) is allocated, and the pointer is rounded up + // to PAGESIZE alignment, there will be space for a void* at the end + // after PAGESIZE bytes used by the GC. + + + private import gcx; // for PAGESIZE + + + const size_t PAGE_MASK = PAGESIZE - 1; + + + void *os_mem_map(size_t nbytes) + { byte *p, q; + p = cast(byte *) malloc(nbytes + PAGESIZE); + q = p + ((PAGESIZE - ((cast(size_t) p & PAGE_MASK))) & PAGE_MASK); + * cast(void**)(q + nbytes) = p; + return q; + } + + + int os_mem_commit(void *base, size_t offset, size_t nbytes) + { + return 0; + } + + + int os_mem_decommit(void *base, size_t offset, size_t nbytes) + { + return 0; + } + + + int os_mem_unmap(void *base, size_t nbytes) + { + free( *cast(void**)( cast(byte*) base + nbytes ) ); + return 0; + } +} +else +{ + static assert(false, "No supported allocation methods available."); +} \ No newline at end of file diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/gc/basic/gcbits.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/gc/basic/gcbits.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,202 @@ +/** + * This module contains a specialized bitset implementation. + * + * Copyright: Copyright (C) 2005-2006 Digital Mars, www.digitalmars.com. + * All rights reserved. + * License: + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, in both source and binary form, subject to the following + * restrictions: + * + * o The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * o Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * o This notice may not be removed or altered from any source + * distribution. + * Authors: Walter Bright, David Friedman, Sean Kelly + */ + + +private import tango.core.BitManip; +private import tango.stdc.string; +private import tango.stdc.stdlib; +private extern (C) void onOutOfMemoryError(); + + +version (DigitalMars) +{ + version = bitops; +} +else version (GNU) +{ + // use the unoptimized version +} +else version (D_InlineAsm_X86) +{ + version = Asm86; +} + +struct GCBits +{ + const int BITS_PER_WORD = 32; + const int BITS_SHIFT = 5; + const int BITS_MASK = 31; + + uint *data = null; + uint nwords = 0; // allocated words in data[] excluding sentinals + uint nbits = 0; // number of bits in data[] excluding sentinals + + void Dtor() + { + if (data) + { + free(data); + data = null; + } + } + + invariant + { + if (data) + { + assert(nwords * data[0].sizeof * 8 >= nbits); + } + } + + void alloc(uint nbits) + { + this.nbits = nbits; + nwords = (nbits + (BITS_PER_WORD - 1)) >> BITS_SHIFT; + data = cast(uint *)calloc(nwords + 2, uint.sizeof); + if (!data) + onOutOfMemoryError(); + } + + uint test(uint i) + in + { + assert(i < nbits); + } + body + { + //return (cast(bit *)(data + 1))[i]; + return data[1 + (i >> BITS_SHIFT)] & (1 << (i & BITS_MASK)); + } + + void set(uint i) + in + { + assert(i < nbits); + } + body + { + //(cast(bit *)(data + 1))[i] = 1; + data[1 + (i >> BITS_SHIFT)] |= (1 << (i & BITS_MASK)); + } + + void clear(uint i) + in + { + assert(i < nbits); + } + body + { + //(cast(bit *)(data + 1))[i] = 0; + data[1 + (i >> BITS_SHIFT)] &= ~(1 << (i & BITS_MASK)); + } + + uint testClear(uint i) + { + version (bitops) + { + return std.intrinsic.btr(data + 1, i); + } + else version (Asm86) + { + asm + { + naked ; + mov EAX,data[EAX] ; + mov ECX,i-4[ESP] ; + btr 4[EAX],ECX ; + sbb EAX,EAX ; + ret 4 ; + } + } + else + { uint result; + + //result = (cast(bit *)(data + 1))[i]; + //(cast(bit *)(data + 1))[i] = 0; + + uint *p = &data[1 + (i >> BITS_SHIFT)]; + uint mask = (1 << (i & BITS_MASK)); + result = *p & mask; + *p &= ~mask; + return result; + } + } + + void zero() + { + memset(data + 1, 0, nwords * uint.sizeof); + } + + void copy(GCBits *f) + in + { + assert(nwords == f.nwords); + } + body + { + memcpy(data + 1, f.data + 1, nwords * uint.sizeof); + } + + uint *base() + in + { + assert(data); + } + body + { + return data + 1; + } +} + +unittest +{ + GCBits b; + + b.alloc(786); + assert(b.test(123) == 0); + assert(b.testClear(123) == 0); + b.set(123); + assert(b.test(123) != 0); + assert(b.testClear(123) != 0); + assert(b.test(123) == 0); + + b.set(785); + b.set(0); + assert(b.test(785) != 0); + assert(b.test(0) != 0); + b.zero(); + assert(b.test(785) == 0); + assert(b.test(0) == 0); + + GCBits b2; + b2.alloc(786); + b2.set(38); + b.copy(&b2); + assert(b.test(38) != 0); + b2.Dtor(); + + b.Dtor(); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/gc/basic/gcstats.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/gc/basic/gcstats.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,38 @@ +/** + * This module contains garbage collector statistics functionality. + * + * Copyright: Copyright (C) 2005-2006 Digital Mars, www.digitalmars.com. + * All rights reserved. + * License: + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, in both source and binary form, subject to the following + * restrictions: + * + * o The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * o Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * o This notice may not be removed or altered from any source + * distribution. + * Authors: Walter Bright, Sean Kelly + */ + + +/** + * + */ +struct GCStats +{ + size_t poolsize; // total size of pool + size_t usedsize; // bytes allocated + size_t freeblocks; // number of blocks marked FREE + size_t freelistsize; // total of memory on free lists + size_t pageblocks; // number of blocks marked PAGE +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/gc/basic/gcx.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/gc/basic/gcx.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,2866 @@ +/** + * This module contains the garbage collector implementation. + * + * Copyright: Copyright (C) 2001-2007 Digital Mars, www.digitalmars.com. + * All rights reserved. + * License: + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, in both source and binary form, subject to the following + * restrictions: + * + * o The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * o Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * o This notice may not be removed or altered from any source + * distribution. + * Authors: Walter Bright, David Friedman, Sean Kelly + */ + +// D Programming Language Garbage Collector implementation + +/************** Debugging ***************************/ + +//debug = PRINTF; // turn on printf's +//debug = COLLECT_PRINTF; // turn on printf's +//debug = THREADINVARIANT; // check thread integrity +//debug = LOGGING; // log allocations / frees +//debug = MEMSTOMP; // stomp on memory +//debug = SENTINEL; // add underrun/overrrun protection +//debug = PTRCHECK; // more pointer checking +//debug = PTRCHECK2; // thorough but slow pointer checking + +/*************** Configuration *********************/ + +version = STACKGROWSDOWN; // growing the stack means subtracting from the stack pointer + // (use for Intel X86 CPUs) + // else growing the stack means adding to the stack pointer +version = MULTI_THREADED; // produce multithreaded version + +/***************************************************/ + +private import gcbits; +private import gcstats; +private import gcalloc; + +private import cstdlib = tango.stdc.stdlib : calloc, free, malloc, realloc; +private import cstring = tango.stdc.string : memcpy, memmove, memset; + +debug private import tango.stdc.stdio; + +version (GNU) +{ + // BUG: The following import will likely not work, since the gcc + // subdirectory is elsewhere. Instead, perhaps the functions + // could be declared directly or some other resolution could + // be found. + private import gcc.builtins; // for __builtin_unwind_init +} + + +private +{ + enum BlkAttr : uint + { + FINALIZE = 0b0000_0001, + NO_SCAN = 0b0000_0010, + NO_MOVE = 0b0000_0100, + ALL_BITS = 0b1111_1111 + } + + struct BlkInfo + { + void* base; + size_t size; + uint attr; + } + + extern (C) void* rt_stackBottom(); + extern (C) void* rt_stackTop(); + + extern (C) void rt_finalize( void* p, bool det = true ); + + alias void delegate( void*, void* ) scanFn; + + extern (C) void rt_scanStaticData( scanFn scan ); + + version (MULTI_THREADED) + { + extern (C) bool thread_needLock(); + extern (C) void thread_suspendAll(); + extern (C) void thread_resumeAll(); + + extern (C) void thread_scanAll( scanFn fn, void* curStackTop = null ); + } + + extern (C) void onOutOfMemoryError(); +} + + +alias GC gc_t; + + +/* ======================= Leak Detector =========================== */ + + +debug (LOGGING) +{ + struct Log + { + void* p; + size_t size; + uint line; + char* file; + void* parent; + + void print() + { + printf(" p = %x, size = %d, parent = %x ", p, size, parent); + if (file) + { + printf("%s(%u)", file, line); + } + printf("\n"); + } + } + + + struct LogArray + { + size_t dim; + size_t allocdim; + Log *data; + + void Dtor() + { + if (data) + cstdlib.free(data); + data = null; + } + + void reserve(size_t nentries) + { + assert(dim <= allocdim); + if (allocdim - dim < nentries) + { + allocdim = (dim + nentries) * 2; + assert(dim + nentries <= allocdim); + if (!data) + { + data = cast(Log *)cstdlib.malloc(allocdim * Log.sizeof); + if (!data && allocdim) + onOutOfMemoryError(); + } + else + { Log *newdata; + + newdata = cast(Log *)cstdlib.malloc(allocdim * Log.sizeof); + if (!newdata && allocdim) + onOutOfMemoryError(); + cstring.memcpy(newdata, data, dim * Log.sizeof); + cstdlib.free(data); + data = newdata; + } + } + } + + + void push(Log log) + { + reserve(1); + data[dim++] = log; + } + + void remove(size_t i) + { + cstring.memmove(data + i, data + i + 1, (dim - i) * Log.sizeof); + dim--; + } + + + size_t find(void *p) + { + for (size_t i = 0; i < dim; i++) + { + if (data[i].p == p) + return i; + } + return ~0u; // not found + } + + + void copy(LogArray *from) + { + reserve(from.dim - dim); + assert(from.dim <= allocdim); + cstring.memcpy(data, from.data, from.dim * Log.sizeof); + dim = from.dim; + } + } +} + + +/* ============================ GC =============================== */ + + +class GCLock { } // just a dummy so we can get a global lock + + +const uint GCVERSION = 1; // increment every time we change interface + // to GC. + +class GC +{ + // For passing to debug code + static size_t line; + static char* file; + + uint gcversion = GCVERSION; + + Gcx *gcx; // implementation + static ClassInfo gcLock; // global lock + + + void initialize() + { + gcLock = GCLock.classinfo; + gcx = cast(Gcx *)cstdlib.calloc(1, Gcx.sizeof); + if (!gcx) + onOutOfMemoryError(); + gcx.initialize(); + setStackBottom(rt_stackBottom()); + } + + + void Dtor() + { + version (linux) + { + //debug(PRINTF) printf("Thread %x ", pthread_self()); + //debug(PRINTF) printf("GC.Dtor()\n"); + } + + if (gcx) + { + gcx.Dtor(); + cstdlib.free(gcx); + gcx = null; + } + } + + + invariant + { + if (gcx) + { + gcx.thread_Invariant(); + } + } + + + /** + * + */ + void enable() + { + if (!thread_needLock()) + { + assert(gcx.disabled > 0); + gcx.disabled--; + } + else synchronized (gcLock) + { + assert(gcx.disabled > 0); + gcx.disabled--; + } + } + + + /** + * + */ + void disable() + { + if (!thread_needLock()) + { + gcx.disabled++; + } + else synchronized (gcLock) + { + gcx.disabled++; + } + } + + + /** + * + */ + uint getAttr(void* p) + { + if (!p) + { + return 0; + } + + uint go() + { + Pool* pool = gcx.findPool(p); + uint oldb = 0; + + if (pool) + { + uint biti = (p - pool.baseAddr) / 16; + + oldb = gcx.getBits(pool, biti); + } + return oldb; + } + + if (!thread_needLock()) + { + return go(); + } + else synchronized (gcLock) + { + return go(); + } + } + + + /** + * + */ + uint setAttr(void* p, uint mask) + { + if (!p) + { + return 0; + } + + uint go() + { + Pool* pool = gcx.findPool(p); + uint oldb = 0; + + if (pool) + { + uint biti = (p - pool.baseAddr) / 16; + + oldb = gcx.getBits(pool, biti); + gcx.setBits(pool, biti, mask); + } + return oldb; + } + + if (!thread_needLock()) + { + return go(); + } + else synchronized (gcLock) + { + return go(); + } + } + + + /** + * + */ + uint clrAttr(void* p, uint mask) + { + if (!p) + { + return 0; + } + + uint go() + { + Pool* pool = gcx.findPool(p); + uint oldb = 0; + + if (pool) + { + uint biti = (p - pool.baseAddr) / 16; + + oldb = gcx.getBits(pool, biti); + gcx.clrBits(pool, biti, mask); + } + return oldb; + } + + if (!thread_needLock()) + { + return go(); + } + else synchronized (gcLock) + { + return go(); + } + } + + + /** + * + */ + void *malloc(size_t size, uint bits = 0) + { + if (!size) + { + return null; + } + + if (!thread_needLock()) + { + return mallocNoSync(size, bits); + } + else synchronized (gcLock) + { + return mallocNoSync(size, bits); + } + } + + + // + // + // + private void *mallocNoSync(size_t size, uint bits = 0) + { + assert(size != 0); + + void *p = null; + Bins bin; + + //debug(PRINTF) printf("GC::malloc(size = %d, gcx = %p)\n", size, gcx); + assert(gcx); + //debug(PRINTF) printf("gcx.self = %x, pthread_self() = %x\n", gcx.self, pthread_self()); + + size += SENTINEL_EXTRA; + + // Compute size bin + // Cache previous binsize lookup - Dave Fladebo. + static size_t lastsize = -1; + static Bins lastbin; + if (size == lastsize) + bin = lastbin; + else + { + bin = gcx.findBin(size); + lastsize = size; + lastbin = bin; + } + + if (bin < B_PAGE) + { + p = gcx.bucket[bin]; + if (p == null) + { + if (!gcx.allocPage(bin) && !gcx.disabled) // try to find a new page + { + if (!thread_needLock()) + { + /* Then we haven't locked it yet. Be sure + * and lock for a collection, since a finalizer + * may start a new thread. + */ + synchronized (gcLock) + { + gcx.fullcollectshell(); + } + } + else if (!gcx.fullcollectshell()) // collect to find a new page + { + //gcx.newPool(1); + } + } + if (!gcx.bucket[bin] && !gcx.allocPage(bin)) + { int result; + + gcx.newPool(1); // allocate new pool to find a new page + result = gcx.allocPage(bin); + if (!result) + onOutOfMemoryError(); + } + p = gcx.bucket[bin]; + } + + // Return next item from free list + gcx.bucket[bin] = (cast(List *)p).next; + if( !(bits & BlkAttr.NO_SCAN) ) + cstring.memset(p + size, 0, binsize[bin] - size); + //debug(PRINTF) printf("\tmalloc => %x\n", p); + debug (MEMSTOMP) cstring.memset(p, 0xF0, size); + } + else + { + p = gcx.bigAlloc(size); + if (!p) + onOutOfMemoryError(); + } + size -= SENTINEL_EXTRA; + p = sentinel_add(p); + sentinel_init(p, size); + gcx.log_malloc(p, size); + + if (bits) + { + Pool *pool = gcx.findPool(p); + assert(pool); + + gcx.setBits(pool, (p - pool.baseAddr) / 16, bits); + } + return p; + } + + + /** + * + */ + void *calloc(size_t size, uint bits = 0) + { + if (!size) + { + return null; + } + + if (!thread_needLock()) + { + return callocNoSync(size, bits); + } + else synchronized (gcLock) + { + return callocNoSync(size, bits); + } + } + + + // + // + // + private void *callocNoSync(size_t size, uint bits = 0) + { + assert(size != 0); + + //debug(PRINTF) printf("calloc: %x len %d\n", p, len); + void *p = mallocNoSync(size, bits); + cstring.memset(p, 0, size); + return p; + } + + + /** + * + */ + void *realloc(void *p, size_t size, uint bits = 0) + { + if (!thread_needLock()) + { + return reallocNoSync(p, size, bits); + } + else synchronized (gcLock) + { + return reallocNoSync(p, size, bits); + } + } + + + // + // + // + private void *reallocNoSync(void *p, size_t size, uint bits = 0) + { + if (!size) + { if (p) + { freeNoSync(p); + p = null; + } + } + else if (!p) + { + p = mallocNoSync(size, bits); + } + else + { void *p2; + size_t psize; + + //debug(PRINTF) printf("GC::realloc(p = %x, size = %u)\n", p, size); + version (SENTINEL) + { + sentinel_Invariant(p); + psize = *sentinel_size(p); + if (psize != size) + { + if (psize) + { + Pool *pool = gcx.findPool(p); + + if (pool) + { + uint biti = cast(uint)(p - pool.baseAddr) / 16; + + if (bits) + { + gcx.clrBits(pool, biti, BlkAttr.ALL_BITS); + gcx.setBits(pool, biti, bits); + } + else + { + bits = gcx.getBits(pool, biti); + } + } + } + p2 = mallocNoSync(size, bits); + if (psize < size) + size = psize; + //debug(PRINTF) printf("\tcopying %d bytes\n",size); + cstring.memcpy(p2, p, size); + p = p2; + } + } + else + { + psize = gcx.findSize(p); // find allocated size + if (psize >= PAGESIZE && size >= PAGESIZE) + { + auto psz = psize / PAGESIZE; + auto newsz = (size + PAGESIZE - 1) / PAGESIZE; + if (newsz == psz) + return p; + + auto pool = gcx.findPool(p); + auto pagenum = (p - pool.baseAddr) / PAGESIZE; + + if (newsz < psz) + { // Shrink in place + synchronized (gcLock) + { + debug (MEMSTOMP) cstring.memset(p + size, 0xF2, psize - size); + pool.freePages(pagenum + newsz, psz - newsz); + } + return p; + } + else if (pagenum + newsz <= pool.npages) + { + // Attempt to expand in place + synchronized (gcLock) + { + for (size_t i = pagenum + psz; 1;) + { + if (i == pagenum + newsz) + { + debug (MEMSTOMP) cstring.memset(p + psize, 0xF0, size - psize); + cstring.memset(&pool.pagetable[pagenum + psz], B_PAGEPLUS, newsz - psz); + return p; + } + if (i == pool.ncommitted) + { + auto u = pool.extendPages(pagenum + newsz - pool.ncommitted); + if (u == ~0u) + break; + i = pagenum + newsz; + continue; + } + if (pool.pagetable[i] != B_FREE) + break; + i++; + } + } + } + } + if (psize < size || // if new size is bigger + psize > size * 2) // or less than half + { + if (psize) + { + Pool *pool = gcx.findPool(p); + + if (pool) + { + uint biti = cast(uint)(p - pool.baseAddr) / 16; + + if (bits) + { + gcx.clrBits(pool, biti, BlkAttr.ALL_BITS); + gcx.setBits(pool, biti, bits); + } + else + { + bits = gcx.getBits(pool, biti); + } + } + } + p2 = mallocNoSync(size, bits); + if (psize < size) + size = psize; + //debug(PRINTF) printf("\tcopying %d bytes\n",size); + cstring.memcpy(p2, p, size); + p = p2; + } + } + } + return p; + } + + + /** + * Attempt to in-place enlarge the memory block pointed to by p by at least + * minbytes beyond its current capacity, up to a maximum of maxsize. This + * does not attempt to move the memory block (like realloc() does). + * + * Returns: + * 0 if could not extend p, + * total size of entire memory block if successful. + */ + size_t extend(void* p, size_t minsize, size_t maxsize) + { + if (!thread_needLock()) + { + return extendNoSync(p, minsize, maxsize); + } + else synchronized (gcLock) + { + return extendNoSync(p, minsize, maxsize); + } + } + + + // + // + // + private size_t extendNoSync(void* p, size_t minsize, size_t maxsize) + in + { + assert( minsize <= maxsize ); + } + body + { + //debug(PRINTF) printf("GC::extend(p = %x, minsize = %u, maxsize = %u)\n", p, minsize, maxsize); + version (SENTINEL) + { + return 0; + } + auto psize = gcx.findSize(p); // find allocated size + if (psize < PAGESIZE) + return 0; // cannot extend buckets + + auto psz = psize / PAGESIZE; + auto minsz = (minsize + PAGESIZE - 1) / PAGESIZE; + auto maxsz = (maxsize + PAGESIZE - 1) / PAGESIZE; + + auto pool = gcx.findPool(p); + auto pagenum = (p - pool.baseAddr) / PAGESIZE; + + size_t sz; + for (sz = 0; sz < maxsz; sz++) + { + auto i = pagenum + psz + sz; + if (i == pool.ncommitted) + break; + if (pool.pagetable[i] != B_FREE) + { if (sz < minsz) + return 0; + break; + } + } + if (sz >= minsz) + { + } + else if (pagenum + psz + sz == pool.ncommitted) + { + auto u = pool.extendPages(minsz - sz); + if (u == ~0u) + return 0; + sz = minsz; + } + else + return 0; + debug (MEMSTOMP) cstring.memset(p + psize, 0xF0, (psz + sz) * PAGESIZE - psize); + cstring.memset(pool.pagetable + pagenum + psz, B_PAGEPLUS, sz); + gcx.p_cache = null; + gcx.size_cache = 0; + return (psz + sz) * PAGESIZE; + } + + + /** + * + */ + void free(void *p) + { + if (!p) + { + return; + } + + if (!thread_needLock()) + { + return freeNoSync(p); + } + else synchronized (gcLock) + { + return freeNoSync(p); + } + } + + + // + // + // + private void freeNoSync(void *p) + { + assert (p); + + Pool *pool; + uint pagenum; + Bins bin; + uint biti; + + // Find which page it is in + pool = gcx.findPool(p); + if (!pool) // if not one of ours + return; // ignore + sentinel_Invariant(p); + p = sentinel_sub(p); + pagenum = (p - pool.baseAddr) / PAGESIZE; + biti = cast(uint)(p - pool.baseAddr) / 16; + gcx.clrBits(pool, biti, BlkAttr.ALL_BITS); + + bin = cast(Bins)pool.pagetable[pagenum]; + if (bin == B_PAGE) // if large alloc + { int npages; + uint n; + + // Free pages + npages = 1; + n = pagenum; + while (++n < pool.ncommitted && pool.pagetable[n] == B_PAGEPLUS) + npages++; + debug (MEMSTOMP) cstring.memset(p, 0xF2, npages * PAGESIZE); + pool.freePages(pagenum, npages); + } + else + { // Add to free list + List *list = cast(List *)p; + + debug (MEMSTOMP) cstring.memset(p, 0xF2, binsize[bin]); + + list.next = gcx.bucket[bin]; + gcx.bucket[bin] = list; + } + gcx.log_free(sentinel_add(p)); + } + + + /** + * Determine the base address of the block containing p. If p is not a gc + * allocated pointer, return null. + */ + void* addrOf(void *p) + { + if (!p) + { + return null; + } + + if (!thread_needLock()) + { + return addrOfNoSync(p); + } + else synchronized (gcLock) + { + return addrOfNoSync(p); + } + } + + + // + // + // + void* addrOfNoSync(void *p) + { + if (!p) + { + return null; + } + + return gcx.findBase(p); + } + + + /** + * Determine the allocated size of pointer p. If p is an interior pointer + * or not a gc allocated pointer, return 0. + */ + size_t sizeOf(void *p) + { + if (!p) + { + return 0; + } + + if (!thread_needLock()) + { + return sizeOfNoSync(p); + } + else synchronized (gcLock) + { + return sizeOfNoSync(p); + } + } + + + // + // + // + private size_t sizeOfNoSync(void *p) + { + assert (p); + + version (SENTINEL) + { + p = sentinel_sub(p); + size_t size = gcx.findSize(p); + + // Check for interior pointer + // This depends on: + // 1) size is a power of 2 for less than PAGESIZE values + // 2) base of memory pool is aligned on PAGESIZE boundary + if (cast(size_t)p & (size - 1) & (PAGESIZE - 1)) + size = 0; + return size ? size - SENTINAL_EXTRA : 0; + } + else + { + if (p == gcx.p_cache) + return gcx.size_cache; + + size_t size = gcx.findSize(p); + + // Check for interior pointer + // This depends on: + // 1) size is a power of 2 for less than PAGESIZE values + // 2) base of memory pool is aligned on PAGESIZE boundary + if (cast(size_t)p & (size - 1) & (PAGESIZE - 1)) + size = 0; + else + { + gcx.p_cache = p; + gcx.size_cache = size; + } + + return size; + } + } + + + /** + * Determine the base address of the block containing p. If p is not a gc + * allocated pointer, return null. + */ + BlkInfo query(void *p) + { + if (!p) + { + BlkInfo i; + return i; + } + + if (!thread_needLock()) + { + return queryNoSync(p); + } + else synchronized (gcLock) + { + return queryNoSync(p); + } + } + + + // + // + // + BlkInfo queryNoSync(void *p) + { + assert(p); + + return gcx.getInfo(p); + } + + + /** + * Verify that pointer p: + * 1) belongs to this memory pool + * 2) points to the start of an allocated piece of memory + * 3) is not on a free list + */ + void check(void *p) + { + if (!p) + { + return; + } + + if (!thread_needLock()) + { + checkNoSync(p); + } + else synchronized (gcLock) + { + checkNoSync(p); + } + } + + + // + // + // + private void checkNoSync(void *p) + { + assert(p); + + sentinel_Invariant(p); + debug (PTRCHECK) + { + Pool* pool; + uint pagenum; + Bins bin; + size_t size; + + p = sentinel_sub(p); + pool = gcx.findPool(p); + assert(pool); + pagenum = (p - pool.baseAddr) / PAGESIZE; + bin = cast(Bins)pool.pagetable[pagenum]; + assert(bin <= B_PAGE); + size = binsize[bin]; + assert((cast(size_t)p & (size - 1)) == 0); + + debug (PTRCHECK2) + { + if (bin < B_PAGE) + { + // Check that p is not on a free list + List *list; + + for (list = gcx.bucket[bin]; list; list = list.next) + { + assert(cast(void *)list != p); + } + } + } + } + } + + + // + // + // + private void setStackBottom(void *p) + { + version (STACKGROWSDOWN) + { + //p = (void *)((uint *)p + 4); + if (p > gcx.stackBottom) + { + //debug(PRINTF) printf("setStackBottom(%x)\n", p); + gcx.stackBottom = p; + } + } + else + { + //p = (void *)((uint *)p - 4); + if (p < gcx.stackBottom) + { + //debug(PRINTF) printf("setStackBottom(%x)\n", p); + gcx.stackBottom = cast(char *)p; + } + } + } + + + /** + * add p to list of roots + */ + void addRoot(void *p) + { + if (!p) + { + return; + } + + if (!thread_needLock()) + { + gcx.addRoot(p); + } + else synchronized (gcLock) + { + gcx.addRoot(p); + } + } + + + /** + * remove p from list of roots + */ + void removeRoot(void *p) + { + if (!p) + { + return; + } + + if (!thread_needLock()) + { + gcx.removeRoot(p); + } + else synchronized (gcLock) + { + gcx.removeRoot(p); + } + } + + + /** + * add range to scan for roots + */ + void addRange(void *p, size_t sz) + { + if (!p || !sz) + { + return; + } + + //debug(PRINTF) printf("+GC.addRange(pbot = x%x, ptop = x%x)\n", pbot, ptop); + if (!thread_needLock()) + { + gcx.addRange(p, p + sz); + } + else synchronized (gcLock) + { + gcx.addRange(p, p + sz); + } + //debug(PRINTF) printf("-GC.addRange()\n"); + } + + + /** + * remove range + */ + void removeRange(void *p) + { + if (!p) + { + return; + } + + if (!thread_needLock()) + { + gcx.removeRange(p); + } + else synchronized (gcLock) + { + gcx.removeRange(p); + } + } + + + /** + * do full garbage collection + */ + void fullCollect() + { + debug(PRINTF) printf("GC.fullCollect()\n"); + + if (!thread_needLock()) + { + gcx.fullcollectshell(); + } + else synchronized (gcLock) + { + gcx.fullcollectshell(); + } + + version (none) + { + GCStats stats; + + getStats(stats); + debug(PRINTF) printf("poolsize = %x, usedsize = %x, freelistsize = %x\n", + stats.poolsize, stats.usedsize, stats.freelistsize); + } + + gcx.log_collect(); + } + + + /** + * do full garbage collection ignoring roots + */ + void fullCollectNoStack() + { + if (!thread_needLock()) + { + gcx.noStack++; + gcx.fullcollectshell(); + gcx.noStack--; + } + else synchronized (gcLock) + { + gcx.noStack++; + gcx.fullcollectshell(); + gcx.noStack--; + } + } + + + /** + * Retrieve statistics about garbage collection. + * Useful for debugging and tuning. + */ + void getStats(out GCStats stats) + { + if (!thread_needLock()) + { + getStatsNoSync(stats); + } + else synchronized (gcLock) + { + getStatsNoSync(stats); + } + } + + + // + // + // + private void getStatsNoSync(out GCStats stats) + { + size_t psize = 0; + size_t usize = 0; + size_t flsize = 0; + + size_t n; + size_t bsize = 0; + + //debug(PRINTF) printf("getStats()\n"); + cstring.memset(&stats, 0, GCStats.sizeof); + + for (n = 0; n < gcx.npools; n++) + { Pool *pool = gcx.pooltable[n]; + + psize += pool.ncommitted * PAGESIZE; + for (uint j = 0; j < pool.ncommitted; j++) + { + Bins bin = cast(Bins)pool.pagetable[j]; + if (bin == B_FREE) + stats.freeblocks++; + else if (bin == B_PAGE) + stats.pageblocks++; + else if (bin < B_PAGE) + bsize += PAGESIZE; + } + } + + for (n = 0; n < B_PAGE; n++) + { + //debug(PRINTF) printf("bin %d\n", n); + for (List *list = gcx.bucket[n]; list; list = list.next) + { + //debug(PRINTF) printf("\tlist %x\n", list); + flsize += binsize[n]; + } + } + + usize = bsize - flsize; + + stats.poolsize = psize; + stats.usedsize = bsize - flsize; + stats.freelistsize = flsize; + } +} + + +/* ============================ Gcx =============================== */ + +enum +{ PAGESIZE = 4096, + COMMITSIZE = (4096*16), + POOLSIZE = (4096*256), +} + + +enum +{ + B_16, + B_32, + B_64, + B_128, + B_256, + B_512, + B_1024, + B_2048, + B_PAGE, // start of large alloc + B_PAGEPLUS, // continuation of large alloc + B_FREE, // free page + B_UNCOMMITTED, // memory not committed for this page + B_MAX +} + + +alias ubyte Bins; + + +struct List +{ + List *next; +} + + +struct Range +{ + void *pbot; + void *ptop; +} + + +const uint binsize[B_MAX] = [ 16,32,64,128,256,512,1024,2048,4096 ]; +const uint notbinsize[B_MAX] = [ ~(16u-1),~(32u-1),~(64u-1),~(128u-1),~(256u-1), + ~(512u-1),~(1024u-1),~(2048u-1),~(4096u-1) ]; + +/* ============================ Gcx =============================== */ + + +struct Gcx +{ + debug (THREADINVARIANT) + { + pthread_t self; + void thread_Invariant() + { + if (self != pthread_self()) + printf("thread_Invariant(): gcx = %x, self = %x, pthread_self() = %x\n", this, self, pthread_self()); + assert(self == pthread_self()); + } + } + else + { + void thread_Invariant() { } + } + + void *p_cache; + size_t size_cache; + + size_t nroots; + size_t rootdim; + void **roots; + + size_t nranges; + size_t rangedim; + Range *ranges; + + uint noStack; // !=0 means don't scan stack + uint log; // turn on logging + uint anychanges; + void *stackBottom; + uint inited; + int disabled; // turn off collections if >0 + + byte *minAddr; // min(baseAddr) + byte *maxAddr; // max(topAddr) + + uint npools; + Pool **pooltable; + + List *bucket[B_MAX]; // free list for each size + + + void initialize() + { int dummy; + + (cast(byte *)this)[0 .. Gcx.sizeof] = 0; + stackBottom = cast(char *)&dummy; + log_init(); + debug (THREADINVARIANT) + self = pthread_self(); + //printf("gcx = %p, self = %x\n", this, self); + inited = 1; + } + + + void Dtor() + { + inited = 0; + + for (uint i = 0; i < npools; i++) + { Pool *pool = pooltable[i]; + + pool.Dtor(); + cstdlib.free(pool); + } + if (pooltable) + cstdlib.free(pooltable); + + if (roots) + cstdlib.free(roots); + + if (ranges) + cstdlib.free(ranges); + } + + + void Invariant() { } + + + invariant + { + if (inited) + { + //printf("Gcx.invariant(): this = %p\n", this); + uint i; + + // Assure we're called on the right thread + debug (THREADINVARIANT) assert(self == pthread_self()); + + for (i = 0; i < npools; i++) + { Pool *pool = pooltable[i]; + + pool.Invariant(); + if (i == 0) + { + assert(minAddr == pool.baseAddr); + } + if (i + 1 < npools) + { + assert(pool.opCmp(pooltable[i + 1]) < 0); + } + else if (i + 1 == npools) + { + assert(maxAddr == pool.topAddr); + } + } + + if (roots) + { + assert(rootdim != 0); + assert(nroots <= rootdim); + } + + if (ranges) + { + assert(rangedim != 0); + assert(nranges <= rangedim); + + for (i = 0; i < nranges; i++) + { + assert(ranges[i].pbot); + assert(ranges[i].ptop); + assert(ranges[i].pbot <= ranges[i].ptop); + } + } + + for (i = 0; i < B_PAGE; i++) + { + for (List *list = bucket[i]; list; list = list.next) + { + } + } + } + } + + + /** + * + */ + void addRoot(void *p) + { + if (nroots == rootdim) + { + size_t newdim = rootdim * 2 + 16; + void** newroots; + + newroots = cast(void **)cstdlib.malloc(newdim * newroots[0].sizeof); + if (!newroots) + onOutOfMemoryError(); + if (roots) + { cstring.memcpy(newroots, roots, nroots * newroots[0].sizeof); + cstdlib.free(roots); + } + roots = newroots; + rootdim = newdim; + } + roots[nroots] = p; + nroots++; + } + + + /** + * + */ + void removeRoot(void *p) + { + for (size_t i = nroots; i--;) + { + if (roots[i] == p) + { + nroots--; + cstring.memmove(roots + i, roots + i + 1, (nroots - i) * roots[0].sizeof); + return; + } + } + assert(0); + } + + + /** + * + */ + void addRange(void *pbot, void *ptop) + { + debug(PRINTF) printf("Thread %x ", pthread_self()); + debug(PRINTF) printf("%x.Gcx::addRange(%x, %x), nranges = %d\n", this, pbot, ptop, nranges); + if (nranges == rangedim) + { + size_t newdim = rangedim * 2 + 16; + Range *newranges; + + newranges = cast(Range *)cstdlib.malloc(newdim * newranges[0].sizeof); + if (!newranges) + onOutOfMemoryError(); + if (ranges) + { cstring.memcpy(newranges, ranges, nranges * newranges[0].sizeof); + cstdlib.free(ranges); + } + ranges = newranges; + rangedim = newdim; + } + ranges[nranges].pbot = pbot; + ranges[nranges].ptop = ptop; + nranges++; + } + + + /** + * + */ + void removeRange(void *pbot) + { + debug(PRINTF) printf("Thread %x ", pthread_self()); + debug(PRINTF) printf("%x.Gcx.removeRange(%x), nranges = %d\n", this, pbot, nranges); + for (size_t i = nranges; i--;) + { + if (ranges[i].pbot == pbot) + { + nranges--; + cstring.memmove(ranges + i, ranges + i + 1, (nranges - i) * ranges[0].sizeof); + return; + } + } + debug(PRINTF) printf("Wrong thread\n"); + + // This is a fatal error, but ignore it. + // The problem is that we can get a Close() call on a thread + // other than the one the range was allocated on. + //assert(zero); + } + + + /** + * Find Pool that pointer is in. + * Return null if not in a Pool. + * Assume pooltable[] is sorted. + */ + Pool *findPool(void *p) + { + if (p >= minAddr && p < maxAddr) + { + if (npools == 1) + { + return pooltable[0]; + } + + for (uint i = 0; i < npools; i++) + { Pool *pool; + + pool = pooltable[i]; + if (p < pool.topAddr) + { if (pool.baseAddr <= p) + return pool; + break; + } + } + } + return null; + } + + + /** + * Find base address of block containing pointer p. + * Returns null if not a gc'd pointer + */ + void* findBase(void *p) + { + Pool *pool; + + pool = findPool(p); + if (pool) + { + size_t offset = cast(size_t)(p - pool.baseAddr); + uint pn = offset / PAGESIZE; + Bins bin = cast(Bins)pool.pagetable[pn]; + + // Adjust bit to be at start of allocated memory block + if (bin <= B_PAGE) + { + return pool.baseAddr + (offset & notbinsize[bin]); + } + else if (bin == B_PAGEPLUS) + { + do + { --pn, offset -= PAGESIZE; + } while (cast(Bins)pool.pagetable[pn] == B_PAGEPLUS); + + return pool.baseAddr + (offset & (offset.max ^ (PAGESIZE-1))); + } + else + { + // we are in a B_FREE or B_UNCOMMITTED page + return null; + } + } + return null; + } + + + /** + * Find size of pointer p. + * Returns 0 if not a gc'd pointer + */ + size_t findSize(void *p) + { + Pool *pool; + size_t size = 0; + + pool = findPool(p); + if (pool) + { + uint pagenum; + Bins bin; + + pagenum = (cast(uint)(p - pool.baseAddr)) / PAGESIZE; + bin = cast(Bins)pool.pagetable[pagenum]; + size = binsize[bin]; + if (bin == B_PAGE) + { uint npages = pool.ncommitted; + ubyte* pt; + uint i; + + pt = &pool.pagetable[0]; + for (i = pagenum + 1; i < npages; i++) + { + if (pt[i] != B_PAGEPLUS) + break; + } + size = (i - pagenum) * PAGESIZE; + } + } + return size; + } + + + /** + * + */ + BlkInfo getInfo(void* p) + { + Pool *pool; + BlkInfo info; + + pool = findPool(p); + if (pool) + { + size_t offset = cast(size_t)(p - pool.baseAddr); + uint pn = offset / PAGESIZE; + Bins bin = cast(Bins)pool.pagetable[pn]; + + //////////////////////////////////////////////////////////////////// + // findAddr + //////////////////////////////////////////////////////////////////// + + if (bin <= B_PAGE) + { + info.base = pool.baseAddr + (offset & notbinsize[bin]); + } + else if (bin == B_PAGEPLUS) + { + do + { --pn, offset -= PAGESIZE; + } while (cast(Bins)pool.pagetable[pn] == B_PAGEPLUS); + + info.base = pool.baseAddr + (offset & (offset.max ^ (PAGESIZE-1))); + + // fix bin for use by size calc below + bin = cast(Bins)pool.pagetable[pn]; + } + + //////////////////////////////////////////////////////////////////// + // findSize + //////////////////////////////////////////////////////////////////// + + info.size = binsize[bin]; + if (bin == B_PAGE) + { uint npages = pool.ncommitted; + ubyte* pt; + uint i; + + pt = &pool.pagetable[0]; + for (i = pn + 1; i < npages; i++) + { + if (pt[i] != B_PAGEPLUS) + break; + } + info.size = (i - pn) * PAGESIZE; + } + + //////////////////////////////////////////////////////////////////// + // getBits + //////////////////////////////////////////////////////////////////// + + info.attr = getBits(pool, offset / 16); + } + return info; + } + + + /** + * Compute bin for size. + */ + static Bins findBin(size_t size) + { Bins bin; + + if (size <= 256) + { + if (size <= 64) + { + if (size <= 16) + bin = B_16; + else if (size <= 32) + bin = B_32; + else + bin = B_64; + } + else + { + if (size <= 128) + bin = B_128; + else + bin = B_256; + } + } + else + { + if (size <= 1024) + { + if (size <= 512) + bin = B_512; + else + bin = B_1024; + } + else + { + if (size <= 2048) + bin = B_2048; + else + bin = B_PAGE; + } + } + return bin; + } + + + /** + * Allocate a chunk of memory that is larger than a page. + * Return null if out of memory. + */ + void *bigAlloc(size_t size) + { + Pool *pool; + uint npages; + uint n; + uint pn; + uint freedpages; + void *p; + int state; + + npages = (size + PAGESIZE - 1) / PAGESIZE; + + for (state = 0; ; ) + { + // This code could use some refinement when repeatedly + // allocating very large arrays. + + for (n = 0; n < npools; n++) + { + pool = pooltable[n]; + pn = pool.allocPages(npages); + if (pn != ~0u) + goto L1; + } + + // Failed + switch (state) + { + case 0: + if (disabled) + { state = 1; + continue; + } + // Try collecting + freedpages = fullcollectshell(); + if (freedpages >= npools * ((POOLSIZE / PAGESIZE) / 4)) + { state = 1; + continue; + } + // Allocate new pool + pool = newPool(npages); + if (!pool) + { state = 2; + continue; + } + pn = pool.allocPages(npages); + assert(pn != ~0u); + goto L1; + case 1: + // Allocate new pool + pool = newPool(npages); + if (!pool) + goto Lnomemory; + pn = pool.allocPages(npages); + assert(pn != ~0u); + goto L1; + case 2: + goto Lnomemory; + default: + assert(false); + } + } + + L1: + pool.pagetable[pn] = B_PAGE; + if (npages > 1) + cstring.memset(&pool.pagetable[pn + 1], B_PAGEPLUS, npages - 1); + p = pool.baseAddr + pn * PAGESIZE; + cstring.memset(cast(char *)p + size, 0, npages * PAGESIZE - size); + debug (MEMSTOMP) cstring.memset(p, 0xF1, size); + //debug(PRINTF) printf("\tp = %x\n", p); + return p; + + Lnomemory: + return null; // let mallocNoSync handle the error + } + + + /** + * Allocate a new pool with at least npages in it. + * Sort it into pooltable[]. + * Return null if failed. + */ + Pool *newPool(uint npages) + { + Pool *pool; + Pool **newpooltable; + uint newnpools; + uint i; + + //debug(PRINTF) printf("************Gcx::newPool(npages = %d)****************\n", npages); + + // Round up to COMMITSIZE pages + npages = (npages + (COMMITSIZE/PAGESIZE) - 1) & ~(COMMITSIZE/PAGESIZE - 1); + + // Minimum of POOLSIZE + if (npages < POOLSIZE/PAGESIZE) + npages = POOLSIZE/PAGESIZE; + else if (npages > POOLSIZE/PAGESIZE) + { // Give us 150% of requested size, so there's room to extend + auto n = npages + (npages >> 1); + if (n < size_t.max/PAGESIZE) + npages = n; + } + + // Allocate successively larger pools up to 8 megs + if (npools) + { uint n; + + n = npools; + if (n > 8) + n = 8; // cap pool size at 8 megs + n *= (POOLSIZE / PAGESIZE); + if (npages < n) + npages = n; + } + + pool = cast(Pool *)cstdlib.calloc(1, Pool.sizeof); + if (pool) + { + pool.initialize(npages); + if (!pool.baseAddr) + goto Lerr; + + newnpools = npools + 1; + newpooltable = cast(Pool **)cstdlib.realloc(pooltable, newnpools * (Pool *).sizeof); + if (!newpooltable) + goto Lerr; + + // Sort pool into newpooltable[] + for (i = 0; i < npools; i++) + { + if (pool.opCmp(newpooltable[i]) < 0) + break; + } + cstring.memmove(newpooltable + i + 1, newpooltable + i, (npools - i) * (Pool *).sizeof); + newpooltable[i] = pool; + + pooltable = newpooltable; + npools = newnpools; + + minAddr = pooltable[0].baseAddr; + maxAddr = pooltable[npools - 1].topAddr; + } + return pool; + + Lerr: + pool.Dtor(); + cstdlib.free(pool); + return null; + } + + + /** + * Allocate a page of bin's. + * Returns: + * 0 failed + */ + int allocPage(Bins bin) + { + Pool *pool; + uint n; + uint pn; + byte *p; + byte *ptop; + + //debug(PRINTF) printf("Gcx::allocPage(bin = %d)\n", bin); + for (n = 0; n < npools; n++) + { + pool = pooltable[n]; + pn = pool.allocPages(1); + if (pn != ~0u) + goto L1; + } + return 0; // failed + + L1: + pool.pagetable[pn] = cast(ubyte)bin; + + // Convert page to free list + size_t size = binsize[bin]; + List **b = &bucket[bin]; + + p = pool.baseAddr + pn * PAGESIZE; + ptop = p + PAGESIZE; + for (; p < ptop; p += size) + { + (cast(List *)p).next = *b; + *b = cast(List *)p; + } + return 1; + } + + + /** + * Search a range of memory values and mark any pointers into the GC pool. + */ + void mark(void *pbot, void *ptop) + { + void **p1 = cast(void **)pbot; + void **p2 = cast(void **)ptop; + uint changes = 0; + + //printf("marking range: %p -> %p\n", pbot, ptop); + for (; p1 < p2; p1++) + { + Pool *pool; + byte *p = cast(byte *)(*p1); + + //if (log) debug(PRINTF) printf("\tmark %x\n", p); + if (p >= minAddr) + { + pool = findPool(p); + if (pool) + { + size_t offset = cast(size_t)(p - pool.baseAddr); + uint biti; + uint pn = offset / PAGESIZE; + Bins bin = cast(Bins)pool.pagetable[pn]; + + //debug(PRINTF) printf("\t\tfound pool %x, base=%x, pn = %d, bin = %d, biti = x%x\n", pool, pool.baseAddr, pn, bin, biti); + + // Adjust bit to be at start of allocated memory block + if (bin <= B_PAGE) + { + biti = (offset & notbinsize[bin]) >> 4; + //debug(PRINTF) printf("\t\tbiti = x%x\n", biti); + } + else if (bin == B_PAGEPLUS) + { + do + { --pn; + } while (cast(Bins)pool.pagetable[pn] == B_PAGEPLUS); + biti = pn * (PAGESIZE / 16); + } + else + { + // Don't mark bits in B_FREE or B_UNCOMMITTED pages + continue; + } + + //debug(PRINTF) printf("\t\tmark(x%x) = %d\n", biti, pool.mark.test(biti)); + if (!pool.mark.test(biti)) + { + //if (log) debug(PRINTF) printf("\t\tmarking %x\n", p); + pool.mark.set(biti); + if (!pool.noscan.test(biti)) + { + pool.scan.set(biti); + changes = 1; + } + log_parent(sentinel_add(pool.baseAddr + biti * 16), sentinel_add(pbot)); + } + } + } + } + anychanges |= changes; + } + + + /** + * Return number of full pages free'd. + */ + size_t fullcollectshell() + { + // The purpose of the 'shell' is to ensure all the registers + // get put on the stack so they'll be scanned + void *sp; + size_t result; + version (GNU) + { + __builtin_unwind_init(); + sp = & sp; + } + else + { + asm + { + pushad ; + mov sp[EBP],ESP ; + } + } + result = fullcollect(sp); + version (GNU) + { + // nothing to do + } + else + { + asm + { + popad ; + } + } + return result; + } + + + /** + * + */ + size_t fullcollect(void *stackTop) + { + uint n; + Pool *pool; + + debug(COLLECT_PRINTF) printf("Gcx.fullcollect()\n"); + + thread_suspendAll(); + + p_cache = null; + size_cache = 0; + + anychanges = 0; + for (n = 0; n < npools; n++) + { + pool = pooltable[n]; + pool.mark.zero(); + pool.scan.zero(); + pool.freebits.zero(); + } + + // Mark each free entry, so it doesn't get scanned + for (n = 0; n < B_PAGE; n++) + { + for (List *list = bucket[n]; list; list = list.next) + { + pool = findPool(list); + assert(pool); + pool.freebits.set(cast(uint)(cast(byte *)list - pool.baseAddr) / 16); + } + } + + for (n = 0; n < npools; n++) + { + pool = pooltable[n]; + pool.mark.copy(&pool.freebits); + } + + rt_scanStaticData( &mark ); + + version (MULTI_THREADED) + { + if (!noStack) + { + // Scan stacks and registers for each paused thread + thread_scanAll( &mark, stackTop ); + } + } + else + { + if (!noStack) + { + // Scan stack for main thread + debug(PRINTF) printf(" scan stack bot = %x, top = %x\n", stackTop, stackBottom); + version (STACKGROWSDOWN) + mark(stackTop, stackBottom); + else + mark(stackBottom, stackTop); + } + } + + // Scan roots[] + debug(COLLECT_PRINTF) printf("scan roots[]\n"); + mark(roots, roots + nroots); + + // Scan ranges[] + debug(COLLECT_PRINTF) printf("scan ranges[]\n"); + //log++; + for (n = 0; n < nranges; n++) + { + debug(COLLECT_PRINTF) printf("\t%x .. %x\n", ranges[n].pbot, ranges[n].ptop); + mark(ranges[n].pbot, ranges[n].ptop); + } + //log--; + + debug(COLLECT_PRINTF) printf("\tscan heap\n"); + while (anychanges) + { + anychanges = 0; + for (n = 0; n < npools; n++) + { + uint *bbase; + uint *b; + uint *btop; + + pool = pooltable[n]; + + bbase = pool.scan.base(); + btop = bbase + pool.scan.nwords; + for (b = bbase; b < btop;) + { Bins bin; + uint pn; + uint u; + uint bitm; + byte *o; + + bitm = *b; + if (!bitm) + { b++; + continue; + } + *b = 0; + + o = pool.baseAddr + (b - bbase) * 32 * 16; + if (!(bitm & 0xFFFF)) + { + bitm >>= 16; + o += 16 * 16; + } + for (; bitm; o += 16, bitm >>= 1) + { + if (!(bitm & 1)) + continue; + + pn = (o - pool.baseAddr) / PAGESIZE; + bin = cast(Bins)pool.pagetable[pn]; + if (bin < B_PAGE) + { + mark(o, o + binsize[bin]); + } + else if (bin == B_PAGE || bin == B_PAGEPLUS) + { + if (bin == B_PAGEPLUS) + { + while (pool.pagetable[pn - 1] != B_PAGE) + pn--; + } + u = 1; + while (pn + u < pool.ncommitted && pool.pagetable[pn + u] == B_PAGEPLUS) + u++; + mark(o, o + u * PAGESIZE); + } + } + } + } + } + + thread_resumeAll(); + + // Free up everything not marked + debug(COLLECT_PRINTF) printf("\tfree'ing\n"); + size_t freedpages = 0; + size_t freed = 0; + for (n = 0; n < npools; n++) + { uint pn; + uint ncommitted; + uint *bbase; + + pool = pooltable[n]; + bbase = pool.mark.base(); + ncommitted = pool.ncommitted; + for (pn = 0; pn < ncommitted; pn++, bbase += PAGESIZE / (32 * 16)) + { + Bins bin = cast(Bins)pool.pagetable[pn]; + + if (bin < B_PAGE) + { byte *p; + byte *ptop; + uint biti; + uint bitstride; + uint size = binsize[bin]; + + p = pool.baseAddr + pn * PAGESIZE; + ptop = p + PAGESIZE; + biti = pn * (PAGESIZE/16); + bitstride = size / 16; + + version(none) // BUG: doesn't work because freebits() must also be cleared + { + // If free'd entire page + if (bbase[0] == 0 && bbase[1] == 0 && bbase[2] == 0 && bbase[3] == 0 && + bbase[4] == 0 && bbase[5] == 0 && bbase[6] == 0 && bbase[7] == 0) + { + for (; p < ptop; p += size, biti += bitstride) + { + if (pool.finals.nbits && pool.finals.testClear(biti)) + rt_finalize(cast(List *)sentinel_add(p), false/*noStack > 0*/); + gcx.clrBits(pool, biti, BlkAttr.ALL_BITS); + + List *list = cast(List *)p; + //debug(PRINTF) printf("\tcollecting %x\n", list); + log_free(sentinel_add(list)); + + debug (MEMSTOMP) cstring.memset(p, 0xF3, size); + } + pool.pagetable[pn] = B_FREE; + freed += PAGESIZE; + //debug(PRINTF) printf("freeing entire page %d\n", pn); + continue; + } + } + for (; p < ptop; p += size, biti += bitstride) + { + if (!pool.mark.test(biti)) + { + sentinel_Invariant(sentinel_add(p)); + + pool.freebits.set(biti); + if (pool.finals.nbits && pool.finals.testClear(biti)) + rt_finalize(cast(List *)sentinel_add(p), false/*noStack > 0*/); + clrBits(pool, biti, BlkAttr.ALL_BITS); + + List *list = cast(List *)p; + debug(PRINTF) printf("\tcollecting %x\n", list); + log_free(sentinel_add(list)); + + debug (MEMSTOMP) cstring.memset(p, 0xF3, size); + + freed += size; + } + } + } + else if (bin == B_PAGE) + { uint biti = pn * (PAGESIZE / 16); + + if (!pool.mark.test(biti)) + { byte *p = pool.baseAddr + pn * PAGESIZE; + + sentinel_Invariant(sentinel_add(p)); + if (pool.finals.nbits && pool.finals.testClear(biti)) + rt_finalize(sentinel_add(p), false/*noStack > 0*/); + clrBits(pool, biti, BlkAttr.ALL_BITS); + + debug(COLLECT_PRINTF) printf("\tcollecting big %x\n", p); + log_free(sentinel_add(p)); + pool.pagetable[pn] = B_FREE; + freedpages++; + debug (MEMSTOMP) cstring.memset(p, 0xF3, PAGESIZE); + while (pn + 1 < ncommitted && pool.pagetable[pn + 1] == B_PAGEPLUS) + { + pn++; + pool.pagetable[pn] = B_FREE; + freedpages++; + + debug (MEMSTOMP) + { p += PAGESIZE; + cstring.memset(p, 0xF3, PAGESIZE); + } + } + } + } + } + } + + // Zero buckets + bucket[] = null; + + // Free complete pages, rebuild free list + debug(COLLECT_PRINTF) printf("\tfree complete pages\n"); + size_t recoveredpages = 0; + for (n = 0; n < npools; n++) + { uint pn; + uint ncommitted; + + pool = pooltable[n]; + ncommitted = pool.ncommitted; + for (pn = 0; pn < ncommitted; pn++) + { + Bins bin = cast(Bins)pool.pagetable[pn]; + uint biti; + uint u; + + if (bin < B_PAGE) + { + uint size = binsize[bin]; + uint bitstride = size / 16; + uint bitbase = pn * (PAGESIZE / 16); + uint bittop = bitbase + (PAGESIZE / 16); + byte *p; + + biti = bitbase; + for (biti = bitbase; biti < bittop; biti += bitstride) + { if (!pool.freebits.test(biti)) + goto Lnotfree; + } + pool.pagetable[pn] = B_FREE; + recoveredpages++; + continue; + + Lnotfree: + p = pool.baseAddr + pn * PAGESIZE; + for (u = 0; u < PAGESIZE; u += size) + { biti = bitbase + u / 16; + if (pool.freebits.test(biti)) + { List *list; + + list = cast(List *)(p + u); + if (list.next != bucket[bin]) // avoid unnecessary writes + list.next = bucket[bin]; + bucket[bin] = list; + } + } + } + } + } + + debug(COLLECT_PRINTF) printf("recovered pages = %d\n", recoveredpages); + debug(COLLECT_PRINTF) printf("\tfree'd %u bytes, %u pages from %u pools\n", freed, freedpages, npools); + + return freedpages + recoveredpages; + } + + + /** + * + */ + uint getBits(Pool* pool, uint biti) + in + { + assert( pool ); + } + body + { + uint bits; + + if (pool.finals.nbits && + pool.finals.test(biti)) + bits |= BlkAttr.FINALIZE; + if (pool.noscan.test(biti)) + bits |= BlkAttr.NO_SCAN; +// if (pool.nomove.nbits && +// pool.nomove.test(biti)) +// bits |= BlkAttr.NO_MOVE; + return bits; + } + + + /** + * + */ + void setBits(Pool* pool, uint biti, uint mask) + in + { + assert( pool ); + } + body + { + if (mask & BlkAttr.FINALIZE) + { + if (!pool.finals.nbits) + pool.finals.alloc(pool.mark.nbits); + pool.finals.set(biti); + } + if (mask & BlkAttr.NO_SCAN) + { + pool.noscan.set(biti); + } +// if (mask & BlkAttr.NO_MOVE) +// { +// if (!pool.nomove.nbits) +// pool.nomove.alloc(pool.mark.nbits); +// pool.nomove.set(biti); +// } + } + + + /** + * + */ + void clrBits(Pool* pool, uint biti, uint mask) + in + { + assert( pool ); + } + body + { + if (mask & BlkAttr.FINALIZE && pool.finals.nbits) + pool.finals.clear(biti); + if (mask & BlkAttr.NO_SCAN) + pool.noscan.clear(biti); +// if (mask & BlkAttr.NO_MOVE && pool.nomove.nbits) +// pool.nomove.clear(biti); + } + + + /***** Leak Detector ******/ + + + debug (LOGGING) + { + LogArray current; + LogArray prev; + + + void log_init() + { + //debug(PRINTF) printf("+log_init()\n"); + current.reserve(1000); + prev.reserve(1000); + //debug(PRINTF) printf("-log_init()\n"); + } + + + void log_malloc(void *p, size_t size) + { + //debug(PRINTF) printf("+log_malloc(p = %x, size = %d)\n", p, size); + Log log; + + log.p = p; + log.size = size; + log.line = GC.line; + log.file = GC.file; + log.parent = null; + + GC.line = 0; + GC.file = null; + + current.push(log); + //debug(PRINTF) printf("-log_malloc()\n"); + } + + + void log_free(void *p) + { + //debug(PRINTF) printf("+log_free(%x)\n", p); + size_t i; + + i = current.find(p); + if (i == ~0u) + { + debug(PRINTF) printf("free'ing unallocated memory %x\n", p); + } + else + current.remove(i); + //debug(PRINTF) printf("-log_free()\n"); + } + + + void log_collect() + { + //debug(PRINTF) printf("+log_collect()\n"); + // Print everything in current that is not in prev + + debug(PRINTF) printf("New pointers this cycle: --------------------------------\n"); + size_t used = 0; + for (size_t i = 0; i < current.dim; i++) + { + size_t j; + + j = prev.find(current.data[i].p); + if (j == ~0u) + current.data[i].print(); + else + used++; + } + + debug(PRINTF) printf("All roots this cycle: --------------------------------\n"); + for (size_t i = 0; i < current.dim; i++) + { + void *p; + size_t j; + + p = current.data[i].p; + if (!findPool(current.data[i].parent)) + { + j = prev.find(current.data[i].p); + if (j == ~0u) + debug(PRINTF) printf("N"); + else + debug(PRINTF) printf(" ");; + current.data[i].print(); + } + } + + debug(PRINTF) printf("Used = %d-------------------------------------------------\n", used); + prev.copy(¤t); + + debug(PRINTF) printf("-log_collect()\n"); + } + + + void log_parent(void *p, void *parent) + { + //debug(PRINTF) printf("+log_parent()\n"); + size_t i; + + i = current.find(p); + if (i == ~0u) + { + debug(PRINTF) printf("parent'ing unallocated memory %x, parent = %x\n", p, parent); + Pool *pool; + pool = findPool(p); + assert(pool); + size_t offset = cast(size_t)(p - pool.baseAddr); + uint biti; + uint pn = offset / PAGESIZE; + Bins bin = cast(Bins)pool.pagetable[pn]; + biti = (offset & notbinsize[bin]); + debug(PRINTF) printf("\tbin = %d, offset = x%x, biti = x%x\n", bin, offset, biti); + } + else + { + current.data[i].parent = parent; + } + //debug(PRINTF) printf("-log_parent()\n"); + } + + } + else + { + void log_init() { } + void log_malloc(void *p, size_t size) { } + void log_free(void *p) { } + void log_collect() { } + void log_parent(void *p, void *parent) { } + } +} + + +/* ============================ Pool =============================== */ + + +struct Pool +{ + byte* baseAddr; + byte* topAddr; + GCBits mark; // entries already scanned, or should not be scanned + GCBits scan; // entries that need to be scanned + GCBits freebits; // entries that are on the free list + GCBits finals; // entries that need finalizer run on them + GCBits noscan; // entries that should not be scanned + + uint npages; + uint ncommitted; // ncommitted <= npages + ubyte* pagetable; + + + void initialize(uint npages) + { + size_t poolsize; + + //debug(PRINTF) printf("Pool::Pool(%u)\n", npages); + poolsize = npages * PAGESIZE; + assert(poolsize >= POOLSIZE); + baseAddr = cast(byte *)os_mem_map(poolsize); + + // Some of the code depends on page alignment of memory pools + assert((cast(uint)baseAddr & (PAGESIZE - 1)) == 0); + + if (!baseAddr) + { + //debug(PRINTF) printf("GC fail: poolsize = x%x, errno = %d\n", poolsize, errno); + //debug(PRINTF) printf("message = '%s'\n", sys_errlist[errno]); + + npages = 0; + poolsize = 0; + } + //assert(baseAddr); + topAddr = baseAddr + poolsize; + + mark.alloc(poolsize / 16); + scan.alloc(poolsize / 16); + freebits.alloc(poolsize / 16); + noscan.alloc(poolsize / 16); + + pagetable = cast(ubyte*)cstdlib.malloc(npages); + if (!pagetable) + onOutOfMemoryError(); + cstring.memset(pagetable, B_UNCOMMITTED, npages); + + this.npages = npages; + ncommitted = 0; + } + + + void Dtor() + { + if (baseAddr) + { + int result; + + if (ncommitted) + { + result = os_mem_decommit(baseAddr, 0, ncommitted * PAGESIZE); + assert(result == 0); + ncommitted = 0; + } + + if (npages) + { + result = os_mem_unmap(baseAddr, npages * PAGESIZE); + assert(result == 0); + npages = 0; + } + + baseAddr = null; + topAddr = null; + } + if (pagetable) + cstdlib.free(pagetable); + + mark.Dtor(); + scan.Dtor(); + freebits.Dtor(); + finals.Dtor(); + noscan.Dtor(); + } + + + void Invariant() { } + + + invariant + { + //mark.Invariant(); + //scan.Invariant(); + //freebits.Invariant(); + //finals.Invariant(); + //noscan.Invariant(); + + if (baseAddr) + { + //if (baseAddr + npages * PAGESIZE != topAddr) + //printf("baseAddr = %p, npages = %d, topAddr = %p\n", baseAddr, npages, topAddr); + assert(baseAddr + npages * PAGESIZE == topAddr); + assert(ncommitted <= npages); + } + + for (uint i = 0; i < npages; i++) + { Bins bin = cast(Bins)pagetable[i]; + + assert(bin < B_MAX); + } + } + + + /** + * Allocate n pages from Pool. + * Returns ~0u on failure. + */ + uint allocPages(uint n) + { + uint i; + uint n2; + + //debug(PRINTF) printf("Pool::allocPages(n = %d)\n", n); + n2 = n; + for (i = 0; i < ncommitted; i++) + { + if (pagetable[i] == B_FREE) + { + if (--n2 == 0) + { //debug(PRINTF) printf("\texisting pn = %d\n", i - n + 1); + return i - n + 1; + } + } + else + n2 = n; + } + return extendPages(n); + } + + /** + * Extend Pool by n pages. + * Returns ~0u on failure. + */ + uint extendPages(uint n) + { + //debug(PRINTF) printf("Pool::extendPages(n = %d)\n", n); + if (ncommitted + n <= npages) + { + uint tocommit; + + tocommit = (n + (COMMITSIZE/PAGESIZE) - 1) & ~(COMMITSIZE/PAGESIZE - 1); + if (ncommitted + tocommit > npages) + tocommit = npages - ncommitted; + //debug(PRINTF) printf("\tlooking to commit %d more pages\n", tocommit); + //fflush(stdout); + if (os_mem_commit(baseAddr, ncommitted * PAGESIZE, tocommit * PAGESIZE) == 0) + { + cstring.memset(pagetable + ncommitted, B_FREE, tocommit); + auto i = ncommitted; + ncommitted += tocommit; + + while (i && pagetable[i - 1] == B_FREE) + i--; + + return i; + } + //debug(PRINTF) printf("\tfailed to commit %d pages\n", tocommit); + } + + return ~0u; + } + + + /** + * Free npages pages starting with pagenum. + */ + void freePages(uint pagenum, uint npages) + { + cstring.memset(&pagetable[pagenum], B_FREE, npages); + } + + + /** + * Used for sorting pooltable[] + */ + int opCmp(Pool *p2) + { + if (baseAddr < p2.baseAddr) + return -1; + else + return cast(int)(baseAddr > p2.baseAddr); + } +} + + +/* ============================ SENTINEL =============================== */ + + +version (SENTINEL) +{ + const size_t SENTINEL_PRE = cast(size_t) 0xF4F4F4F4F4F4F4F4UL; // 32 or 64 bits + const ubyte SENTINEL_POST = 0xF5; // 8 bits + const uint SENTINEL_EXTRA = 2 * size_t.sizeof + 1; + + + size_t* sentinel_size(void *p) { return &(cast(size_t *)p)[-2]; } + size_t* sentinel_pre(void *p) { return &(cast(size_t *)p)[-1]; } + ubyte* sentinel_post(void *p) { return &(cast(ubyte *)p)[sentinel_size(p)]; } + + + void sentinel_init(void *p, size_t size) + { + *sentinel_size(p) = size; + *sentinel_pre(p) = SENTINEL_PRE; + *sentinel_post(p) = SENTINEL_POST; + } + + + void sentinel_Invariant(void *p) + { + assert(*sentinel_pre(p) == SENTINEL_PRE); + assert(*sentinel_post(p) == SENTINEL_POST); + } + + + void *sentinel_add(void *p) + { + return p + 2 * size_t.sizeof; + } + + + void *sentinel_sub(void *p) + { + return p - 2 * size_t.sizeof; + } +} +else +{ + const uint SENTINEL_EXTRA = 0; + + + void sentinel_init(void *p, size_t size) + { + } + + + void sentinel_Invariant(void *p) + { + } + + + void *sentinel_add(void *p) + { + return p; + } + + + void *sentinel_sub(void *p) + { + return p; + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/gc/basic/posix.mak --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/gc/basic/posix.mak Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,100 @@ +# Makefile to build the garbage collector D library for Posix +# Designed to work with GNU make +# Targets: +# make +# Same as make all +# make lib +# Build the garbage collector library +# make doc +# Generate documentation +# make clean +# Delete unneeded files created by build process + +LIB_TARGET=libtango-gc-basic.a +LIB_MASK=libtango-gc-basic*.a + +CP=cp -f +RM=rm -f +MD=mkdir -p + +ADD_CFLAGS= +ADD_DFLAGS= + +CFLAGS=-O -m32 $(ADD_CFLAGS) +#CFLAGS=-g -m32 $(ADD_CFLAGS) + +DFLAGS=-release -O -inline -w -nofloat -version=Posix $(ADD_DFLAGS) +#DFLAGS=-g -w -nofloat -version=Posix $(ADD_DFLAGS) + +TFLAGS=-O -inline -w -nofloat -version=Posix $(ADD_DFLAGS) +#TFLAGS=-g -w -nofloat -version=Posix $(ADD_DFLAGS) + +DOCFLAGS=-version=DDoc -version=Posix + +CC=gcc +LC=$(AR) -qsv +DC=dmd + +LIB_DEST=.. + +.SUFFIXES: .s .S .c .cpp .d .html .o + +.s.o: + $(CC) -c $(CFLAGS) $< -o$@ + +.S.o: + $(CC) -c $(CFLAGS) $< -o$@ + +.c.o: + $(CC) -c $(CFLAGS) $< -o$@ + +.cpp.o: + g++ -c $(CFLAGS) $< -o$@ + +.d.o: + $(DC) -c $(DFLAGS) $< -of$@ + +.d.html: + $(DC) -c -o- $(DOCFLAGS) -Df$*.html $< +# $(DC) -c -o- $(DOCFLAGS) -Df$*.html dmd.ddoc $< + +targets : lib doc +all : lib doc +lib : basic.lib +doc : basic.doc + +###################################################### + +ALL_OBJS= \ + gc.o \ + gcalloc.o \ + gcbits.o \ + gcstats.o \ + gcx.o + +###################################################### + +ALL_DOCS= + +###################################################### + +basic.lib : $(LIB_TARGET) + +$(LIB_TARGET) : $(ALL_OBJS) + $(RM) $@ + $(LC) $@ $(ALL_OBJS) + +basic.doc : $(ALL_DOCS) + echo No documentation available. + +###################################################### + +clean : + find . -name "*.di" | xargs $(RM) + $(RM) $(ALL_OBJS) + $(RM) $(ALL_DOCS) + $(RM) $(LIB_MASK) + +install : + $(MD) $(LIB_DEST) + $(CP) $(LIB_MASK) $(LIB_DEST)/. diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/gc/basic/win32.mak --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/gc/basic/win32.mak Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,97 @@ +# Makefile to build the garbage collector D library for Win32 +# Designed to work with DigitalMars make +# Targets: +# make +# Same as make all +# make lib +# Build the garbage collector library +# make doc +# Generate documentation +# make clean +# Delete unneeded files created by build process + +LIB_TARGET=tango-gc-basic.lib +LIB_MASK=tango-gc-basic*.lib + +CP=xcopy /y +RM=del /f +MD=mkdir + +ADD_CFLAGS= +ADD_DFLAGS= + +CFLAGS=-mn -6 -r $(ADD_CFLAGS) +#CFLAGS=-g -mn -6 -r $(ADD_CFLAGS) + +DFLAGS=-release -O -inline -w -nofloat $(ADD_DFLAGS) +#DFLAGS=-g -w -nofloat $(ADD_DFLAGS) + +TFLAGS=-O -inline -w -nofloat $(ADD_DFLAGS) +#TFLAGS=-g -w -nofloat $(ADD_DFLAGS) + +DOCFLAGS=-version=DDoc + +CC=dmc +LC=lib +DC=dmd + +LIB_DEST=.. + +.DEFAULT: .asm .c .cpp .d .html .obj + +.asm.obj: + $(CC) -c $< + +.c.obj: + $(CC) -c $(CFLAGS) $< -o$@ + +.cpp.obj: + $(CC) -c $(CFLAGS) $< -o$@ + +.d.obj: + $(DC) -c $(DFLAGS) $< -of$@ + +.d.html: + $(DC) -c -o- $(DOCFLAGS) -Df$*.html $< +# $(DC) -c -o- $(DOCFLAGS) -Df$*.html dmd.ddoc $< + +targets : lib doc +all : lib doc +lib : basic.lib +doc : basic.doc + +###################################################### + +ALL_OBJS= \ + gc.obj \ + gcalloc.obj \ + gcbits.obj \ + gcstats.obj \ + gcx.obj + +###################################################### + +ALL_DOCS= + +###################################################### + +basic.lib : $(LIB_TARGET) + +$(LIB_TARGET) : $(ALL_OBJS) + $(RM) $@ + $(LC) -c -n $@ $(ALL_OBJS) + +basic.doc : $(ALL_DOCS) + @echo No documentation available. + +###################################################### + +clean : + $(RM) /s *.di + $(RM) $(ALL_OBJS) + $(RM) $(ALL_DOCS) + $(RM) $(LIB_MASK) + +install : + $(MD) $(LIB_DEST) + $(CP) $(LIB_MASK) $(LIB_DEST)\. diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/gc/stub/gc.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/gc/stub/gc.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,155 @@ +/** + * This module contains a minimal garbage collector implementation according to + * Tango requirements. This library is mostly intended to serve as an example, + * but it is usable in applications which do not rely on a garbage collector + * to clean up memory (ie. when dynamic array resizing is not used, and all + * memory allocated with 'new' is freed deterministically with 'delete'). + * + * Please note that block attribute data must be tracked, or at a minimum, the + * FINALIZE bit must be tracked for any allocated memory block because calling + * rt_finalize on a non-object block can result in an access violation. In the + * allocator below, this tracking is done via a leading uint bitmask. A real + * allocator may do better to store this data separately, similar to the basic + * GC normally used by Tango. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + */ + +private import tango.stdc.stdlib; + +private +{ + enum BlkAttr : uint + { + FINALIZE = 0b0000_0001, + NO_SCAN = 0b0000_0010, + NO_MOVE = 0b0000_0100, + ALL_BITS = 0b1111_1111 + } + + struct BlkInfo + { + void* base; + size_t size; + uint attr; + } + + extern (C) void thread_init(); + extern (C) void onOutOfMemoryError(); +} + +extern (C) void gc_init() +{ + // NOTE: The GC must initialize the thread library before its first + // collection, and always before returning from gc_init(). + thread_init(); +} + +extern (C) void gc_term() +{ + +} + +extern (C) void gc_enable() +{ + +} + +extern (C) void gc_disable() +{ + +} + +extern (C) void gc_collect() +{ + +} + +extern (C) uint gc_getAttr( void* p ) +{ + return 0; +} + +extern (C) uint gc_setAttr( void* p, uint a ) +{ + return 0; +} + +extern (C) uint gc_clrAttr( void* p, uint a ) +{ + return 0; +} + +extern (C) void* gc_malloc( size_t sz, uint ba = 0 ) +{ + void* p = malloc( sz ); + + if( sz && p is null ) + onOutOfMemoryError(); + return p; +} + +extern (C) void* gc_calloc( size_t sz, uint ba = 0 ) +{ + void* p = calloc( 1, sz ); + + if( sz && p is null ) + onOutOfMemoryError(); + return p; +} + +extern (C) void* gc_realloc( void* p, size_t sz, uint ba = 0 ) +{ + p = realloc( p, sz ); + + if( sz && p is null ) + onOutOfMemoryError(); + return p; +} + +extern (C) size_t gc_extend( void* p, size_t mx, size_t sz ) +{ + return 0; +} + +extern (C) void gc_free( void* p ) +{ + free( p ); +} + +extern (C) void* gc_addrOf( void* p ) +{ + return null; +} + +extern (C) size_t gc_sizeOf( void* p ) +{ + return 0; +} + +extern (C) BlkInfo gc_query( void* p ) +{ + return BlkInfo.init; +} + +extern (C) void gc_addRoot( void* p ) +{ + +} + +extern (C) void gc_addRange( void* p, size_t sz ) +{ + +} + +extern (C) void gc_removeRoot( void *p ) +{ + +} + +extern (C) void gc_removeRange( void *p ) +{ + +} diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/gc/stub/llvmdc.mak --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/gc/stub/llvmdc.mak Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,98 @@ +# Makefile to build the garbage collector D library for Posix +# Designed to work with GNU make +# Targets: +# make +# Same as make all +# make lib +# Build the garbage collector library +# make doc +# Generate documentation +# make clean +# Delete unneeded files created by build process + +LIB_TARGET=libtango-gc-stub.a +LIB_MASK=libtango-gc-stub*.a + +CP=cp -f +RM=rm -f +MD=mkdir -p + +ADD_CFLAGS= +ADD_DFLAGS= + +CFLAGS=-O $(ADD_CFLAGS) +#CFLAGS=-g $(ADD_CFLAGS) + +### warnings disabled because gcx has issues ### + +DFLAGS=-release -O -inline $(ADD_DFLAGS) +#DFLAGS=-g $(ADD_DFLAGS) + +TFLAGS=-O -inline $(ADD_DFLAGS) +#TFLAGS=-g $(ADD_DFLAGS) + +DOCFLAGS=-version=DDoc + +CC=gcc +LC=llvm-ar rsv +DC=llvmdc + +LIB_DEST=.. + +.SUFFIXES: .s .S .c .cpp .d .html .o .bc + +.s.o: + $(CC) -c $(CFLAGS) $< -o$@ + +.S.o: + $(CC) -c $(CFLAGS) $< -o$@ + +.c.o: + $(CC) -c $(CFLAGS) $< -o$@ + +.cpp.o: + g++ -c $(CFLAGS) $< -o$@ + +.d.bc: + $(DC) -c $(DFLAGS) $< -of$@ + +.d.html: + $(DC) -c -o- $(DOCFLAGS) -Df$*.html $< +# $(DC) -c -o- $(DOCFLAGS) -Df$*.html dmd.ddoc $< + +targets : lib doc +all : lib doc +lib : stub.lib +doc : stub.doc + +###################################################### + +ALL_OBJS= \ + gc.bc + +###################################################### + +ALL_DOCS= + +###################################################### + +stub.lib : $(LIB_TARGET) + +$(LIB_TARGET) : $(ALL_OBJS) + $(RM) $@ + $(LC) $@ $(ALL_OBJS) + +stub.doc : $(ALL_DOCS) + echo No documentation available. + +###################################################### + +clean : + find . -name "*.di" | xargs $(RM) + $(RM) $(ALL_OBJS) + $(RM) $(ALL_DOCS) + $(RM) $(LIB_MASK) + +install : + $(MD) $(LIB_DEST) + $(CP) $(LIB_MASK) $(LIB_DEST)/. diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/gc/stub/posix.mak --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/gc/stub/posix.mak Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,98 @@ +# Makefile to build the garbage collector D library for Posix +# Designed to work with GNU make +# Targets: +# make +# Same as make all +# make lib +# Build the garbage collector library +# make doc +# Generate documentation +# make clean +# Delete unneeded files created by build process + +LIB_TARGET=libtango-gc-stub.a +LIB_MASK=libtango-gc-stub*.a + +CP=cp -f +RM=rm -f +MD=mkdir -p + +ADD_CFLAGS= +ADD_DFLAGS= + +CFLAGS=-O -m32 $(ADD_CFLAGS) +#CFLAGS=-g -m32 $(ADD_CFLAGS) + +### warnings disabled because gcx has issues ### + +DFLAGS=-release -O -inline -version=Posix $(ADD_DFLAGS) +#DFLAGS=-g -version=Posix $(ADD_DFLAGS) + +TFLAGS=-O -inline -version=Posix $(ADD_DFLAGS) +#TFLAGS=-g -version=Posix $(ADD_DFLAGS) + +DOCFLAGS=-version=DDoc -version=Posix + +CC=gcc +LC=$(AR) -qsv +DC=dmd + +LIB_DEST=.. + +.SUFFIXES: .s .S .c .cpp .d .html .o + +.s.o: + $(CC) -c $(CFLAGS) $< -o$@ + +.S.o: + $(CC) -c $(CFLAGS) $< -o$@ + +.c.o: + $(CC) -c $(CFLAGS) $< -o$@ + +.cpp.o: + g++ -c $(CFLAGS) $< -o$@ + +.d.o: + $(DC) -c $(DFLAGS) $< -of$@ + +.d.html: + $(DC) -c -o- $(DOCFLAGS) -Df$*.html $< +# $(DC) -c -o- $(DOCFLAGS) -Df$*.html dmd.ddoc $< + +targets : lib doc +all : lib doc +lib : stub.lib +doc : stub.doc + +###################################################### + +ALL_OBJS= \ + gc.o + +###################################################### + +ALL_DOCS= + +###################################################### + +stub.lib : $(LIB_TARGET) + +$(LIB_TARGET) : $(ALL_OBJS) + $(RM) $@ + $(LC) $@ $(ALL_OBJS) + +stub.doc : $(ALL_DOCS) + echo No documentation available. + +###################################################### + +clean : + find . -name "*.di" | xargs $(RM) + $(RM) $(ALL_OBJS) + $(RM) $(ALL_DOCS) + $(RM) $(LIB_MASK) + +install : + $(MD) $(LIB_DEST) + $(CP) $(LIB_MASK) $(LIB_DEST)/. diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/gc/stub/win32.mak --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/gc/stub/win32.mak Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,95 @@ +# Makefile to build the garbage collector D library for Win32 +# Designed to work with DigitalMars make +# Targets: +# make +# Same as make all +# make lib +# Build the garbage collector library +# make doc +# Generate documentation +# make clean +# Delete unneeded files created by build process + +LIB_TARGET=tango-gc-stub.lib +LIB_MASK=tango-gc-stub*.lib + +CP=xcopy /y +RM=del /f +MD=mkdir + +ADD_CFLAGS= +ADD_DFLAGS= + +CFLAGS=-mn -6 -r $(ADD_CFLAGS) +#CFLAGS=-g -mn -6 -r $(ADD_CFLAGS) + +### warnings disabled because gcx has issues ### + +DFLAGS=-release -O -inline $(ADD_DFLAGS) +#DFLAGS=-g -release $(ADD_DFLAGS) + +TFLAGS=-O -inline $(ADD_DFLAGS) +#TFLAGS=-g $(ADD_DFLAGS) + +DOCFLAGS=-version=DDoc + +CC=dmc +LC=lib +DC=dmd + +LIB_DEST=.. + +.DEFAULT: .asm .c .cpp .d .html .obj + +.asm.obj: + $(CC) -c $< + +.c.obj: + $(CC) -c $(CFLAGS) $< -o$@ + +.cpp.obj: + $(CC) -c $(CFLAGS) $< -o$@ + +.d.obj: + $(DC) -c $(DFLAGS) $< -of$@ + +.d.html: + $(DC) -c -o- $(DOCFLAGS) -Df$*.html $< +# $(DC) -c -o- $(DOCFLAGS) -Df$*.html dmd.ddoc $< + +targets : lib doc +all : lib doc +lib : stub.lib +doc : stub.doc + +###################################################### + +ALL_OBJS= \ + gc.obj + +###################################################### + +ALL_DOCS= + +###################################################### + +stub.lib : $(LIB_TARGET) + +$(LIB_TARGET) : $(ALL_OBJS) + $(RM) $@ + $(LC) -c -n $@ $(ALL_OBJS) + +stub.doc : $(ALL_DOCS) + @echo No documentation available. + +###################################################### + +clean : + $(RM) /s *.di + $(RM) $(ALL_OBJS) + $(RM) $(ALL_DOCS) + $(RM) $(LIB_MASK) + +install : + $(MD) $(LIB_DEST) + $(CP) $(LIB_MASK) $(LIB_DEST)\. diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/llvmdc-posix.mak --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/llvmdc-posix.mak Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,73 @@ +# Makefile to build the composite D runtime library for Linux +# Designed to work with GNU make +# Targets: +# make +# Same as make all +# make lib +# Build the runtime library +# make doc +# Generate documentation +# make clean +# Delete unneeded files created by build process + +LIB_TARGET=libtango-base-llvmdc.a +LIB_MASK=libtango-base-llvmdc*.a + +DIR_CC=./common/tango +DIR_RT=./compiler/llvmdc +DIR_GC=./gc/stub + +CP=cp -f +RM=rm -f +MD=mkdir -p + +CC=gcc +LC=llvm-ar rsv +DC=llvmdc + +ADD_CFLAGS= +ADD_DFLAGS= + +targets : lib doc +all : lib doc + +###################################################### + +ALL_OBJS= + +###################################################### + +ALL_DOCS= + +###################################################### + +lib : $(ALL_OBJS) + make -C $(DIR_CC) -fllvmdc.mak lib DC=$(DC) ADD_DFLAGS="$(ADD_DFLAGS)" ADD_CFLAGS="$(ADD_CFLAGS)" + make -C $(DIR_RT) -fllvmdc.mak lib + make -C $(DIR_GC) -fllvmdc.mak lib DC=$(DC) ADD_DFLAGS="$(ADD_DFLAGS)" ADD_CFLAGS="$(ADD_CFLAGS)" + find . -name $(LIB_MASK) | xargs $(RM) + $(LC) $(LIB_TARGET) `find $(DIR_CC) -name "*.bc" | xargs echo` + $(LC) $(LIB_TARGET) `find $(DIR_RT) -name "*.bc" | xargs echo` + $(LC) $(LIB_TARGET) `find $(DIR_GC) -name "*.bc" | xargs echo` + +doc : $(ALL_DOCS) + make -C $(DIR_CC) -fllvmdc.mak doc + make -C $(DIR_RT) -fllvmdc.mak doc + make -C $(DIR_GC) -fllvmdc.mak doc + +###################################################### + +clean : + find . -name "*.di" | xargs $(RM) + $(RM) $(ALL_OBJS) + $(RM) $(ALL_DOCS) + make -C $(DIR_CC) -fllvmdc.mak clean + make -C $(DIR_RT) -fllvmdc.mak clean + make -C $(DIR_GC) -fllvmdc.mak clean + $(RM) $(LIB_MASK) + +install : + make -C $(DIR_CC) -fllvmdc.mak install + make -C $(DIR_RT) -fllvmdc.mak install + make -C $(DIR_GC) -fllvmdc.mak install +# $(CP) $(LIB_MASK) $(LIB_DEST)/. diff -r 5825d48b27d1 -r 1700239cab2e tango/lib/llvmdc.conf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/lib/llvmdc.conf Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,4 @@ + +[Environment] + +DFLAGS=-I%@P%/../tango -E%@P%/../lib -L-L=%@P%/../lib diff -r 5825d48b27d1 -r 1700239cab2e tango/object.di --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/object.di Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,169 @@ +module object; + +alias typeof(int.sizeof) size_t; +alias typeof(cast(void*)0 - cast(void*)0) ptrdiff_t; + +alias size_t hash_t; + +class Object +{ + char[] toString(); + hash_t toHash(); + int opCmp(Object o); + int opEquals(Object o); + + interface Monitor + { + void lock(); + void unlock(); + } +} + +struct Interface +{ + ClassInfo classinfo; + void*[] vtbl; + ptrdiff_t offset; // offset to Interface 'this' from Object 'this' +} + +class ClassInfo : Object +{ + byte[] init; // class static initializer + char[] name; // class name + void*[] vtbl; // virtual function pointer table + Interface[] interfaces; + ClassInfo base; + void* destructor; + void(*classInvariant)(Object); + uint flags; + // 1: // IUnknown + // 2: // has no possible pointers into GC memory + // 4: // has offTi[] member + // 8: // has constructors + void* deallocator; + OffsetTypeInfo[] offTi; + void* defaultConstructor; + + static ClassInfo find(char[] classname); + Object create(); +} + +struct OffsetTypeInfo +{ + size_t offset; + TypeInfo ti; +} + +class TypeInfo +{ + hash_t getHash(void *p); + int equals(void *p1, void *p2); + int compare(void *p1, void *p2); + size_t tsize(); + void swap(void *p1, void *p2); + TypeInfo next(); + void[] init(); + uint flags(); + // 1: // has possible pointers into GC memory + OffsetTypeInfo[] offTi(); +} + +class TypeInfo_Typedef : TypeInfo +{ + TypeInfo base; + char[] name; + void[] m_init; +} + +class TypeInfo_Enum : TypeInfo_Typedef +{ +} + +class TypeInfo_Pointer : TypeInfo +{ + TypeInfo m_next; +} + +class TypeInfo_Array : TypeInfo +{ + TypeInfo value; +} + +class TypeInfo_StaticArray : TypeInfo +{ + TypeInfo value; + size_t len; +} + +class TypeInfo_AssociativeArray : TypeInfo +{ + TypeInfo value; + TypeInfo key; +} + +class TypeInfo_Function : TypeInfo +{ + TypeInfo next; +} + +class TypeInfo_Delegate : TypeInfo +{ + TypeInfo next; +} + +class TypeInfo_Class : TypeInfo +{ + ClassInfo info; +} + +class TypeInfo_Interface : TypeInfo +{ + ClassInfo info; +} + +class TypeInfo_Struct : TypeInfo +{ + char[] name; + void[] m_init; + + uint function(void*) xtoHash; + int function(void*,void*) xopEquals; + int function(void*,void*) xopCmp; + char[] function(void*) xtoString; + + uint m_flags; +} + +class TypeInfo_Tuple : TypeInfo +{ + TypeInfo[] elements; +} + +class ModuleInfo +{ + char[] name; + ModuleInfo[] importedModules; + ClassInfo[] localClasses; + uint flags; + + void function() ctor; + void function() dtor; + void function() unitTest; + + void* xgetMembers; + void function() ictor; + + static int opApply( int delegate( inout ModuleInfo ) ); +} + +class Exception : Object +{ + char[] msg; + char[] file; + size_t line; + Exception next; + + this(char[] msg, Exception next = null); + this(char[] msg, char[] file, size_t line, Exception next = null); + char[] toString(); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/std/c/stdarg.di --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/std/c/stdarg.di Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,32 @@ +/** + * These functions are built-in intrinsics to the compiler. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: David Friedman + */ +module std.c.stdarg; + +version( GNU ) +{ + private import gcc.builtins; + alias __builtin_va_list va_list; + alias __builtin_va_end va_end; + alias __builtin_va_copy va_copy; +} + +template va_start(T) +{ + void va_start( out va_list ap, inout T parmn ) + { + + } +} + +template va_arg(T) +{ + T va_arg( inout va_list ap ) + { + return T.init; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/std/intrinsic.di --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/std/intrinsic.di Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,176 @@ +/** + * These functions are built-in intrinsics to the compiler. + * + * Intrinsic functions are functions built in to the compiler, usually to take + * advantage of specific CPU features that are inefficient to handle via + * external functions. The compiler's optimizer and code generator are fully + * integrated in with intrinsic functions, bringing to bear their full power on + * them. This can result in some surprising speedups. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Walter Bright + */ +module std.intrinsic; + + +/** + * Scans the bits in v starting with bit 0, looking + * for the first set bit. + * Returns: + * The bit number of the first bit set. + * The return value is undefined if v is zero. + */ +int bsf( uint v ); + + +/** + * Scans the bits in v from the most significant bit + * to the least significant bit, looking + * for the first set bit. + * Returns: + * The bit number of the first bit set. + * The return value is undefined if v is zero. + * Example: + * --- + * import std.intrinsic; + * + * int main() + * { + * uint v; + * int x; + * + * v = 0x21; + * x = bsf(v); + * printf("bsf(x%x) = %d\n", v, x); + * x = bsr(v); + * printf("bsr(x%x) = %d\n", v, x); + * return 0; + * } + * --- + * Output: + * bsf(x21) = 0
+ * bsr(x21) = 5 + */ +int bsr( uint v ); + + +/** + * Tests the bit. + */ +int bt( uint* p, uint bitnum ); + + +/** + * Tests and complements the bit. + */ +int btc( uint* p, uint bitnum ); + + +/** + * Tests and resets (sets to 0) the bit. + */ +int btr( uint* p, uint bitnum ); + + +/** + * Tests and sets the bit. + * Params: + * p = a non-NULL pointer to an array of uints. + * index = a bit number, starting with bit 0 of p[0], + * and progressing. It addresses bits like the expression: +--- +p[index / (uint.sizeof*8)] & (1 << (index & ((uint.sizeof*8) - 1))) +--- + * Returns: + * A non-zero value if the bit was set, and a zero + * if it was clear. + * + * Example: + * --- +import std.intrinsic; + +int main() +{ + uint array[2]; + + array[0] = 2; + array[1] = 0x100; + + printf("btc(array, 35) = %d\n", btc(array, 35)); + printf("array = [0]:x%x, [1]:x%x\n", array[0], array[1]); + + printf("btc(array, 35) = %d\n", btc(array, 35)); + printf("array = [0]:x%x, [1]:x%x\n", array[0], array[1]); + + printf("bts(array, 35) = %d\n", bts(array, 35)); + printf("array = [0]:x%x, [1]:x%x\n", array[0], array[1]); + + printf("btr(array, 35) = %d\n", btr(array, 35)); + printf("array = [0]:x%x, [1]:x%x\n", array[0], array[1]); + + printf("bt(array, 1) = %d\n", bt(array, 1)); + printf("array = [0]:x%x, [1]:x%x\n", array[0], array[1]); + + return 0; +} + * --- + * Output: +
+btc(array, 35) = 0
+array = [0]:x2, [1]:x108
+btc(array, 35) = -1
+array = [0]:x2, [1]:x100
+bts(array, 35) = 0
+array = [0]:x2, [1]:x108
+btr(array, 35) = -1
+array = [0]:x2, [1]:x100
+bt(array, 1) = -1
+array = [0]:x2, [1]:x100
+
+ */ +int bts( uint* p, uint bitnum ); + + +/** + * Swaps bytes in a 4 byte uint end-to-end, i.e. byte 0 becomes + * byte 3, byte 1 becomes byte 2, byte 2 becomes byte 1, byte 3 + * becomes byte 0. + */ +uint bswap( uint v ); + + +/** + * Reads I/O port at port_address. + */ +ubyte inp( uint port_address ); + + +/** + * ditto + */ +ushort inpw( uint port_address ); + + +/** + * ditto + */ +uint inpl( uint port_address ); + + +/** + * Writes and returns value to I/O port at port_address. + */ +ubyte outp( uint port_address, ubyte value ); + + +/** + * ditto + */ +ushort outpw( uint port_address, ushort value ); + + +/** + * ditto + */ +uint outpl( uint port_address, uint value ); \ No newline at end of file diff -r 5825d48b27d1 -r 1700239cab2e tango/std/stdarg.di --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/std/stdarg.di Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,32 @@ +/** + * These functions are built-in intrinsics to the compiler. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: David Friedman + */ +module std.stdarg; + +version( GNU ) +{ + private import gcc.builtins; + alias __builtin_va_list va_list; + alias __builtin_va_end va_end; + alias __builtin_va_copy va_copy; +} + +template va_start(T) +{ + void va_start( out va_list ap, inout T parmn ) + { + + } +} + +template va_arg(T) +{ + T va_arg( inout va_list ap ) + { + return T.init; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/core/Array.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/core/Array.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,3285 @@ +/** + * The array module provides array manipulation routines in a manner that + * balances performance and flexibility. Operations are provided for sorting, + * and for processing both sorted and unsorted arrays. + * + * Copyright: Copyright (C) 2005-2006 Sean Kelly. All rights reserved. + * License: BSD style: $(LICENSE) + * Authors: Sean Kelly + */ +module tango.core.Array; + + +private import tango.core.Traits; +private import tango.stdc.stdlib : alloca; + + +version( DDoc ) +{ + typedef int Num; + typedef int Elem; + + typedef bool function( Elem ) Pred1E; + typedef bool function( Elem, Elem ) Pred2E; +} + + +private +{ + struct IsEqual( T ) + { + static bool opCall( T p1, T p2 ) + { + // TODO: Fix this if/when opEquals is changed to return a bool. + static if( is( T == class ) || is( T == struct ) ) + return (p1 == p2) != 0; + else + return p1 == p2; + } + } + + + struct IsLess( T ) + { + static bool opCall( T p1, T p2 ) + { + return p1 < p2; + } + } + + + template ElemTypeOf( T ) + { + alias typeof(T[0]) ElemTypeOf; + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Find +//////////////////////////////////////////////////////////////////////////////// + + +version( DDoc ) +{ + /** + * Performs a linear scan of buf from $(LB)0 .. buf.length$(RP), returning + * the index of the first element matching pat, or buf.length if no match + * was found. Comparisons will be performed using the supplied predicate + * or '==' if none is supplied. + * + * Params: + * buf = The array to search. + * pat = The pattern to search for. + * pred = The evaluation predicate, which should return true if e1 is + * equal to e2 and false if not. This predicate may be any + * callable type. + * + * Returns: + * The index of the first match or buf.length if no match was found. + */ + size_t find( Elem[] buf, Elem pat, Pred2E pred = Pred2E.init ); + + + /** + * Performs a linear scan of buf from $(LB)0 .. buf.length$(RP), returning + * the index of the first element matching pat, or buf.length if no match + * was found. Comparisons will be performed using the supplied predicate + * or '==' if none is supplied. + * + * Params: + * buf = The array to search. + * pat = The pattern to search for. + * pred = The evaluation predicate, which should return true if e1 is + * equal to e2 and false if not. This predicate may be any + * callable type. + * + * Returns: + * The index of the first match or buf.length if no match was found. + */ + size_t find( Elem[] buf, Elem[] pat, Pred2E pred = Pred2E.init ); + +} +else +{ + template find_( Elem, Pred = IsEqual!(Elem) ) + { + static assert( isCallableType!(Pred) ); + + + size_t fn( Elem[] buf, Elem pat, Pred pred = Pred.init ) + { + foreach( size_t pos, Elem cur; buf ) + { + if( pred( cur, pat ) ) + return pos; + } + return buf.length; + } + + + size_t fn( Elem[] buf, Elem[] pat, Pred pred = Pred.init ) + { + if( buf.length == 0 || + pat.length == 0 || + buf.length < pat.length ) + { + return buf.length; + } + + size_t end = buf.length - pat.length + 1; + + for( size_t pos = 0; pos < end; ++pos ) + { + if( pred( buf[pos], pat[0] ) ) + { + size_t mat = 0; + + do + { + if( ++mat >= pat.length ) + return pos - pat.length + 1; + if( ++pos >= buf.length ) + return buf.length; + } while( pred( buf[pos], pat[mat] ) ); + pos -= mat; + } + } + return buf.length; + } + } + + + template find( Buf, Pat ) + { + size_t find( Buf buf, Pat pat ) + { + return find_!(ElemTypeOf!(Buf)).fn( buf, pat ); + } + } + + + template find( Buf, Pat, Pred ) + { + size_t find( Buf buf, Pat pat, Pred pred ) + { + return find_!(ElemTypeOf!(Buf), Pred).fn( buf, pat, pred ); + } + } + + + debug( UnitTest ) + { + unittest + { + // find element + assert( find( "", 'a' ) == 0 ); + assert( find( "abc", 'a' ) == 0 ); + assert( find( "abc", 'b' ) == 1 ); + assert( find( "abc", 'c' ) == 2 ); + assert( find( "abc", 'd' ) == 3 ); + + // null parameters + assert( find( "", "" ) == 0 ); + assert( find( "a", "" ) == 1 ); + assert( find( "", "a" ) == 0 ); + + // exact match + assert( find( "abc", "abc" ) == 0 ); + + // simple substring match + assert( find( "abc", "a" ) == 0 ); + assert( find( "abca", "a" ) == 0 ); + assert( find( "abc", "b" ) == 1 ); + assert( find( "abc", "c" ) == 2 ); + assert( find( "abc", "d" ) == 3 ); + + // multi-char substring match + assert( find( "abc", "ab" ) == 0 ); + assert( find( "abcab", "ab" ) == 0 ); + assert( find( "abc", "bc" ) == 1 ); + assert( find( "abc", "ac" ) == 3 ); + assert( find( "abrabracadabra", "abracadabra" ) == 3 ); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Reverse Find +//////////////////////////////////////////////////////////////////////////////// + + +version( DDoc ) +{ + /** + * Performs a linear scan of buf from $(LP)buf.length .. 0$(RB), returning + * the index of the first element matching pat, or buf.length if no match + * was found. Comparisons will be performed using the supplied predicate + * or '==' if none is supplied. + * + * Params: + * buf = The array to search. + * pat = The pattern to search for. + * pred = The evaluation predicate, which should return true if e1 is + * equal to e2 and false if not. This predicate may be any + * callable type. + * + * Returns: + * The index of the first match or buf.length if no match was found. + */ + size_t rfind( Elem[] buf, Elem pat, Pred2E pred = Pred2E.init ); + + + /** + * Performs a linear scan of buf from $(LP)buf.length .. 0$(RB), returning + * the index of the first element matching pat, or buf.length if no match + * was found. Comparisons will be performed using the supplied predicate + * or '==' if none is supplied. + * + * Params: + * buf = The array to search. + * pat = The pattern to search for. + * pred = The evaluation predicate, which should return true if e1 is + * equal to e2 and false if not. This predicate may be any + * callable type. + * + * Returns: + * The index of the first match or buf.length if no match was found. + */ + size_t rfind( Elem[] buf, Elem[] pat, Pred2E pred = Pred2E.init ); +} +else +{ + template rfind_( Elem, Pred = IsEqual!(Elem) ) + { + static assert( isCallableType!(Pred) ); + + + size_t fn( Elem[] buf, Elem pat, Pred pred = Pred.init ) + { + if( buf.length == 0 ) + return buf.length; + + size_t pos = buf.length; + + do + { + if( pred( buf[--pos], pat ) ) + return pos; + } while( pos > 0 ); + return buf.length; + } + + + size_t fn( Elem[] buf, Elem[] pat, Pred pred = Pred.init ) + { + if( buf.length == 0 || + pat.length == 0 || + buf.length < pat.length ) + { + return buf.length; + } + + size_t pos = buf.length - pat.length + 1; + + do + { + if( pred( buf[--pos], pat[0] ) ) + { + size_t mat = 0; + + do + { + if( ++mat >= pat.length ) + return pos - pat.length + 1; + if( ++pos >= buf.length ) + return buf.length; + } while( pred( buf[pos], pat[mat] ) ); + pos -= mat; + } + } while( pos > 0 ); + return buf.length; + } + } + + + template rfind( Buf, Pat ) + { + size_t rfind( Buf buf, Pat pat ) + { + return rfind_!(ElemTypeOf!(Buf)).fn( buf, pat ); + } + } + + + template rfind( Buf, Pat, Pred ) + { + size_t rfind( Buf buf, Pat pat, Pred pred ) + { + return rfind_!(ElemTypeOf!(Buf), Pred).fn( buf, pat, pred ); + } + } + + + debug( UnitTest ) + { + unittest + { + // rfind element + assert( rfind( "", 'a' ) == 0 ); + assert( rfind( "abc", 'a' ) == 0 ); + assert( rfind( "abc", 'b' ) == 1 ); + assert( rfind( "abc", 'c' ) == 2 ); + assert( rfind( "abc", 'd' ) == 3 ); + + // null parameters + assert( rfind( "", "" ) == 0 ); + assert( rfind( "a", "" ) == 1 ); + assert( rfind( "", "a" ) == 0 ); + + // exact match + assert( rfind( "abc", "abc" ) == 0 ); + + // simple substring match + assert( rfind( "abc", "a" ) == 0 ); + assert( rfind( "abca", "a" ) == 3 ); + assert( rfind( "abc", "b" ) == 1 ); + assert( rfind( "abc", "c" ) == 2 ); + assert( rfind( "abc", "d" ) == 3 ); + + // multi-char substring match + assert( rfind( "abc", "ab" ) == 0 ); + assert( rfind( "abcab", "ab" ) == 3 ); + assert( rfind( "abc", "bc" ) == 1 ); + assert( rfind( "abc", "ac" ) == 3 ); + assert( rfind( "abracadabrabra", "abracadabra" ) == 0 ); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// KMP Find +//////////////////////////////////////////////////////////////////////////////// + + +version( DDoc ) +{ + /** + * Performs a linear scan of buf from $(LB)0 .. buf.length$(RP), returning + * the index of the first element matching pat, or buf.length if no match + * was found. Comparisons will be performed using the supplied predicate + * or '==' if none is supplied. + * + * This function uses the KMP algorithm and offers O(M+N) performance but + * must allocate a temporary buffer of size pat.sizeof to do so. If it is + * available on the target system, alloca will be used for the allocation, + * otherwise a standard dynamic memory allocation will occur. + * + * Params: + * buf = The array to search. + * pat = The pattern to search for. + * pred = The evaluation predicate, which should return true if e1 is + * equal to e2 and false if not. This predicate may be any + * callable type. + * + * Returns: + * The index of the first match or buf.length if no match was found. + */ + size_t kfind( Elem[] buf, Elem pat, Pred2E pred = Pred2E.init ); + + + /** + * Performs a linear scan of buf from $(LB)0 .. buf.length$(RP), returning + * the index of the first element matching pat, or buf.length if no match + * was found. Comparisons will be performed using the supplied predicate + * or '==' if none is supplied. + * + * This function uses the KMP algorithm and offers O(M+N) performance but + * must allocate a temporary buffer of size pat.sizeof to do so. If it is + * available on the target system, alloca will be used for the allocation, + * otherwise a standard dynamic memory allocation will occur. + * + * Params: + * buf = The array to search. + * pat = The pattern to search for. + * pred = The evaluation predicate, which should return true if e1 is + * equal to e2 and false if not. This predicate may be any + * callable type. + * + * Returns: + * The index of the first match or buf.length if no match was found. + */ + size_t kfind( Elem[] buf, Elem[] pat, Pred2E pred = Pred2E.init ); +} +else +{ + template kfind_( Elem, Pred = IsEqual!(Elem) ) + { + static assert( isCallableType!(Pred) ); + + + size_t fn( Elem[] buf, Elem pat, Pred pred = Pred.init ) + { + foreach( size_t pos, Elem cur; buf ) + { + if( pred( cur, pat ) ) + return pos; + } + return buf.length; + } + + + size_t fn( Elem[] buf, Elem[] pat, Pred pred = Pred.init ) + { + if( buf.length == 0 || + pat.length == 0 || + buf.length < pat.length ) + { + return buf.length; + } + + static if( is( alloca ) ) + { + size_t[] func = (cast(size_t*) alloca( (pat.length + 1) * size_t.sizeof ))[0 .. pat.length + 1]; + } + else + { + size_t[] func = new size_t[pat.length + 1]; + scope( exit ) delete func; // force cleanup + } + + func[0] = 0; + + // + // building prefix-function + // + for( size_t m = 0, i = 1 ; i < pat.length ; ++i ) + { + while( ( m > 0 ) && !pred( pat[m], pat[i] ) ) + m = func[m - 1]; + if( pred( pat[m], pat[i] ) ) + ++m; + func[i] = m; + } + + // + // searching + // + for( size_t m = 0, i = 0; i < buf.length; ++i ) + { + while( ( m > 0 ) && !pred( pat[m], buf[i] ) ) + m = func[m - 1]; + if( pred( pat[m], buf[i] ) ) + { + ++m; + if( m == pat.length ) + { + return i - pat.length + 1; + } + } + } + + return buf.length; + } + } + + + template kfind( Buf, Pat ) + { + size_t kfind( Buf buf, Pat pat ) + { + return kfind_!(ElemTypeOf!(Buf)).fn( buf, pat ); + } + } + + + template kfind( Buf, Pat, Pred ) + { + size_t kfind( Buf buf, Pat pat, Pred pred ) + { + return kfind_!(ElemTypeOf!(Buf), Pred).fn( buf, pat, pred ); + } + } + + + debug( UnitTest ) + { + unittest + { + // find element + assert( kfind( "", 'a' ) == 0 ); + assert( kfind( "abc", 'a' ) == 0 ); + assert( kfind( "abc", 'b' ) == 1 ); + assert( kfind( "abc", 'c' ) == 2 ); + assert( kfind( "abc", 'd' ) == 3 ); + + // null parameters + assert( kfind( "", "" ) == 0 ); + assert( kfind( "a", "" ) == 1 ); + assert( kfind( "", "a" ) == 0 ); + + // exact match + assert( kfind( "abc", "abc" ) == 0 ); + + // simple substring match + assert( kfind( "abc", "a" ) == 0 ); + assert( kfind( "abca", "a" ) == 0 ); + assert( kfind( "abc", "b" ) == 1 ); + assert( kfind( "abc", "c" ) == 2 ); + assert( kfind( "abc", "d" ) == 3 ); + + // multi-char substring match + assert( kfind( "abc", "ab" ) == 0 ); + assert( kfind( "abcab", "ab" ) == 0 ); + assert( kfind( "abc", "bc" ) == 1 ); + assert( kfind( "abc", "ac" ) == 3 ); + assert( kfind( "abrabracadabra", "abracadabra" ) == 3 ); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// KMP Reverse Find +//////////////////////////////////////////////////////////////////////////////// + + +version( DDoc ) +{ + /** + * Performs a linear scan of buf from $(LP)buf.length .. 0$(RB), returning + * the index of the first element matching pat, or buf.length if no match + * was found. Comparisons will be performed using the supplied predicate + * or '==' if none is supplied. + * + * This function uses the KMP algorithm and offers O(M+N) performance but + * must allocate a temporary buffer of size pat.sizeof to do so. If it is + * available on the target system, alloca will be used for the allocation, + * otherwise a standard dynamic memory allocation will occur. + * + * Params: + * buf = The array to search. + * pat = The pattern to search for. + * pred = The evaluation predicate, which should return true if e1 is + * equal to e2 and false if not. This predicate may be any + * callable type. + * + * Returns: + * The index of the first match or buf.length if no match was found. + */ + size_t krfind( Elem[] buf, Elem pat, Pred2E pred = Pred2E.init ); + + + /** + * Performs a linear scan of buf from $(LP)buf.length .. 0$(RB), returning + * the index of the first element matching pat, or buf.length if no match + * was found. Comparisons will be performed using the supplied predicate + * or '==' if none is supplied. + * + * This function uses the KMP algorithm and offers O(M+N) performance but + * must allocate a temporary buffer of size pat.sizeof to do so. If it is + * available on the target system, alloca will be used for the allocation, + * otherwise a standard dynamic memory allocation will occur. + * + * Params: + * buf = The array to search. + * pat = The pattern to search for. + * pred = The evaluation predicate, which should return true if e1 is + * equal to e2 and false if not. This predicate may be any + * callable type. + * + * Returns: + * The index of the first match or buf.length if no match was found. + */ + size_t krfind( Elem[] buf, Elem[] pat, Pred2E pred = Pred2E.init ); +} +else +{ + template krfind_( Elem, Pred = IsEqual!(Elem) ) + { + static assert( isCallableType!(Pred) ); + + + size_t fn( Elem[] buf, Elem pat, Pred pred = Pred.init ) + { + if( buf.length == 0 ) + return buf.length; + + size_t pos = buf.length; + + do + { + if( pred( buf[--pos], pat ) ) + return pos; + } while( pos > 0 ); + return buf.length; + } + + + size_t fn( Elem[] buf, Elem[] pat, Pred pred = Pred.init ) + { + if( buf.length == 0 || + pat.length == 0 || + buf.length < pat.length ) + { + return buf.length; + } + + static if( is( alloca ) ) + { + size_t[] func = (cast(size_t*) alloca( (pat.length + 1) * size_t.sizeof ))[0 .. pat.length + 1]; + } + else + { + size_t[] func = new size_t[pat.length + 1]; + scope( exit ) delete func; // force cleanup + } + + func[$ - 1] = 0; + + // + // building prefix-function + // + for( size_t m = 0, i = pat.length - 1; i > 0; --i ) + { + while( ( m > 0 ) && !pred( pat[length - m - 1], pat[i - 1] ) ) + m = func[length - m]; + if( pred( pat[length - m - 1], pat[i - 1] ) ) + ++m; + func[i - 1] = m; + } + + // + // searching + // + size_t m = 0; + size_t i = buf.length; + do + { + --i; + while( ( m > 0 ) && !pred( pat[length - m - 1], buf[i] ) ) + m = func[length - m - 1]; + if( pred( pat[length - m - 1], buf[i] ) ) + { + ++m; + if ( m == pat.length ) + { + return i; + } + } + } while( i > 0 ); + + return buf.length; + } + } + + + template krfind( Buf, Pat ) + { + size_t krfind( Buf buf, Pat pat ) + { + return krfind_!(ElemTypeOf!(Buf)).fn( buf, pat ); + } + } + + + template krfind( Buf, Pat, Pred ) + { + size_t krfind( Buf buf, Pat pat, Pred pred ) + { + return krfind_!(ElemTypeOf!(Buf), Pred).fn( buf, pat, pred ); + } + } + + + debug( UnitTest ) + { + unittest + { + // rfind element + assert( krfind( "", 'a' ) == 0 ); + assert( krfind( "abc", 'a' ) == 0 ); + assert( krfind( "abc", 'b' ) == 1 ); + assert( krfind( "abc", 'c' ) == 2 ); + assert( krfind( "abc", 'd' ) == 3 ); + + // null parameters + assert( krfind( "", "" ) == 0 ); + assert( krfind( "a", "" ) == 1 ); + assert( krfind( "", "a" ) == 0 ); + + // exact match + assert( krfind( "abc", "abc" ) == 0 ); + + // simple substring match + assert( krfind( "abc", "a" ) == 0 ); + assert( krfind( "abca", "a" ) == 3 ); + assert( krfind( "abc", "b" ) == 1 ); + assert( krfind( "abc", "c" ) == 2 ); + assert( krfind( "abc", "d" ) == 3 ); + + // multi-char substring match + assert( krfind( "abc", "ab" ) == 0 ); + assert( krfind( "abcab", "ab" ) == 3 ); + assert( krfind( "abc", "bc" ) == 1 ); + assert( krfind( "abc", "ac" ) == 3 ); + assert( krfind( "abracadabrabra", "abracadabra" ) == 0 ); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Find-If +//////////////////////////////////////////////////////////////////////////////// + + +version( DDoc ) +{ + /** + * Performs a linear scan of buf from $(LB)0 .. buf.length$(RP), returning + * the index of the first element where pred returns true. + * + * Params: + * buf = The array to search. + * pred = The evaluation predicate, which should return true if the + * element is a valid match and false if not. This predicate + * may be any callable type. + * + * Returns: + * The index of the first match or buf.length if no match was found. + */ + size_t findIf( Elem[] buf, Pred1E pred ); +} +else +{ + template findIf_( Elem, Pred ) + { + static assert( isCallableType!(Pred) ); + + + size_t fn( Elem[] buf, Pred pred ) + { + foreach( size_t pos, Elem cur; buf ) + { + if( pred( cur ) ) + return pos; + } + return buf.length; + } + } + + + template findIf( Buf, Pred ) + { + size_t findIf( Buf buf, Pred pred ) + { + return findIf_!(ElemTypeOf!(Buf), Pred).fn( buf, pred ); + } + } + + + debug( UnitTest ) + { + unittest + { + assert( findIf( "bcecg", ( char c ) { return c == 'a'; } ) == 5 ); + assert( findIf( "bcecg", ( char c ) { return c == 'b'; } ) == 0 ); + assert( findIf( "bcecg", ( char c ) { return c == 'c'; } ) == 1 ); + assert( findIf( "bcecg", ( char c ) { return c == 'd'; } ) == 5 ); + assert( findIf( "bcecg", ( char c ) { return c == 'g'; } ) == 4 ); + assert( findIf( "bcecg", ( char c ) { return c == 'h'; } ) == 5 ); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Reverse Find-If +//////////////////////////////////////////////////////////////////////////////// + + +version( DDoc ) +{ + /** + * Performs a linear scan of buf from $(LP)buf.length .. 0$(RB), returning + * the index of the first element where pred returns true. + * + * Params: + * buf = The array to search. + * pred = The evaluation predicate, which should return true if the + * element is a valid match and false if not. This predicate + * may be any callable type. + * + * Returns: + * The index of the first match or buf.length if no match was found. + */ + size_t rfindIf( Elem[] buf, Pred1E pred ); +} +else +{ + template rfindIf_( Elem, Pred ) + { + static assert( isCallableType!(Pred) ); + + + size_t fn( Elem[] buf, Pred pred ) + { + if( buf.length == 0 ) + return buf.length; + + size_t pos = buf.length; + + do + { + if( pred( buf[--pos] ) ) + return pos; + } while( pos > 0 ); + return buf.length; + } + } + + + template rfindIf( Buf, Pred ) + { + size_t rfindIf( Buf buf, Pred pred ) + { + return rfindIf_!(ElemTypeOf!(Buf), Pred).fn( buf, pred ); + } + } + + + debug( UnitTest ) + { + unittest + { + assert( rfindIf( "bcecg", ( char c ) { return c == 'a'; } ) == 5 ); + assert( rfindIf( "bcecg", ( char c ) { return c == 'b'; } ) == 0 ); + assert( rfindIf( "bcecg", ( char c ) { return c == 'c'; } ) == 3 ); + assert( rfindIf( "bcecg", ( char c ) { return c == 'd'; } ) == 5 ); + assert( rfindIf( "bcecg", ( char c ) { return c == 'g'; } ) == 4 ); + assert( rfindIf( "bcecg", ( char c ) { return c == 'h'; } ) == 5 ); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Find Adjacent +//////////////////////////////////////////////////////////////////////////////// + + +version( DDoc ) +{ + /** + * Performs a linear scan of buf from $(LB)0 .. buf.length$(RP), returning + * the index of the first element that compares equal to the next element + * in the sequence. Comparisons will be performed using the supplied + * predicate or '==' if none is supplied. + * + * Params: + * buf = The array to scan. + * pred = The evaluation predicate, which should return true if e1 is + * equal to e2 and false if not. This predicate may be any + * callable type. + * + * Returns: + * The index of the first match or buf.length if no match was found. + */ + size_t findAdj( Elem[] buf, Elem pat, Pred2E pred = Pred2E.init ); + +} +else +{ + template findAdj_( Elem, Pred = IsEqual!(Elem) ) + { + static assert( isCallableType!(Pred) ); + + + size_t fn( Elem[] buf, Pred pred = Pred.init ) + { + if( buf.length < 2 ) + return buf.length; + + Elem sav = buf[0]; + + foreach( size_t pos, Elem cur; buf[1 .. $] ) + { + if( pred( cur, sav ) ) + return pos; + sav = cur; + } + return buf.length; + } + } + + + template findAdj( Buf ) + { + size_t findAdj( Buf buf ) + { + return findAdj_!(ElemTypeOf!(Buf)).fn( buf ); + } + } + + + template findAdj( Buf, Pred ) + { + size_t findAdj( Buf buf, Pred pred ) + { + return findAdj_!(ElemTypeOf!(Buf), Pred).fn( buf, pred ); + } + } + + + debug( UnitTest ) + { + unittest + { + assert( findAdj( "aabcdef" ) == 0 ); + assert( findAdj( "abcddef" ) == 3 ); + assert( findAdj( "abcdeff" ) == 5 ); + assert( findAdj( "abcdefg" ) == 7 ); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Contains +//////////////////////////////////////////////////////////////////////////////// + + +version( DDoc ) +{ + /** + * Performs a linear scan of buf from $(LB)0 .. buf.length$(RP), returning + * true if an element matching pat is found. Comparisons will be performed + * using the supplied predicate or '<' if none is supplied. + * + * Params: + * buf = The array to search. + * pat = The pattern to search for. + * pred = The evaluation predicate, which should return true if e1 is + * equal to e2 and false if not. This predicate may be any + * callable type. + * + * Returns: + * True if an element equivalent to pat is found, false if not. + */ + size_t contains( Elem[] buf, Elem pat, Pred2E pred = Pred2E.init ); + + + /** + * Performs a linear scan of buf from $(LB)0 .. buf.length$(RP), returning + * true if a sequence matching pat is found. Comparisons will be performed + * using the supplied predicate or '<' if none is supplied. + * + * Params: + * buf = The array to search. + * pat = The pattern to search for. + * pred = The evaluation predicate, which should return true if e1 is + * equal to e2 and false if not. This predicate may be any + * callable type. + * + * Returns: + * True if an element equivalent to pat is found, false if not. + */ + size_t contains( Elem[] buf, Elem[] pat, Pred2E pred = Pred2E.init ); +} +else +{ + template contains( Buf, Pat ) + { + size_t contains( Buf buf, Pat pat ) + { + return find( buf, pat ) != buf.length; + } + } + + + template contains( Buf, Pat, Pred ) + { + size_t contains( Buf buf, Pat pat, Pred pred ) + { + return find( buf, pat, pred ) != buf.length; + } + } + + + debug( UnitTest ) + { + unittest + { + // find element + assert( !contains( "", 'a' ) ); + assert( contains( "abc", 'a' ) ); + assert( contains( "abc", 'b' ) ); + assert( contains( "abc", 'c' ) ); + assert( !contains( "abc", 'd' ) ); + + // null parameters + assert( !contains( "", "" ) ); + assert( !contains( "a", "" ) ); + assert( !contains( "", "a" ) ); + + // exact match + assert( contains( "abc", "abc" ) ); + + // simple substring match + assert( contains( "abc", "a" ) ); + assert( contains( "abca", "a" ) ); + assert( contains( "abc", "b" ) ); + assert( contains( "abc", "c" ) ); + assert( !contains( "abc", "d" ) ); + + // multi-char substring match + assert( contains( "abc", "ab" ) ); + assert( contains( "abcab", "ab" ) ); + assert( contains( "abc", "bc" ) ); + assert( !contains( "abc", "ac" ) ); + assert( contains( "abrabracadabra", "abracadabra" ) ); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Mismatch +//////////////////////////////////////////////////////////////////////////////// + + +version( DDoc ) +{ + /** + * Performs a parallel linear scan of bufA and bufB from $(LB)0 .. N$(RP) + * where N = min$(LP)bufA.length, bufB.length$(RP), returning the index of + * the first element in bufA which does not match the corresponding element + * in bufB or N if no mismatch occurs. Comparisons will be performed using + * the supplied predicate or '==' if none is supplied. + * + * Params: + * bufA = The array to evaluate. + * bufB = The array to match against. + * pred = The evaluation predicate, which should return true if e1 is + * equal to e2 and false if not. This predicate may be any + * callable type. + * + * Returns: + * The index of the first mismatch or N if the first N elements of bufA + * and bufB match, where N = min$(LP)bufA.length, bufB.length$(RP). + */ + size_t mismatch( Elem[] bufA, Elem[] bufB, Pred2E pred = Pred2E.init ); + +} +else +{ + template mismatch_( Elem, Pred = IsEqual!(Elem) ) + { + static assert( isCallableType!(Pred) ); + + + size_t fn( Elem[] bufA, Elem[] bufB, Pred pred = Pred.init ) + { + size_t posA = 0, + posB = 0; + + while( posA < bufA.length && posB < bufB.length ) + { + if( !pred( bufB[posB], bufA[posA] ) ) + break; + ++posA, ++posB; + } + return posA; + } + } + + + template mismatch( BufA, BufB ) + { + size_t mismatch( BufA bufA, BufB bufB ) + { + return mismatch_!(ElemTypeOf!(BufA)).fn( bufA, bufB ); + } + } + + + template mismatch( BufA, BufB, Pred ) + { + size_t mismatch( BufA bufA, BufB bufB, Pred pred ) + { + return mismatch_!(ElemTypeOf!(BufA), Pred).fn( bufA, bufB, pred ); + } + } + + debug( UnitTest ) + { + unittest + { + assert( mismatch( "a", "abcdefg" ) == 1 ); + assert( mismatch( "abcdefg", "a" ) == 1 ); + + assert( mismatch( "x", "abcdefg" ) == 0 ); + assert( mismatch( "abcdefg", "x" ) == 0 ); + + assert( mismatch( "xbcdefg", "abcdefg" ) == 0 ); + assert( mismatch( "abcdefg", "xbcdefg" ) == 0 ); + + assert( mismatch( "abcxefg", "abcdefg" ) == 3 ); + assert( mismatch( "abcdefg", "abcxefg" ) == 3 ); + + assert( mismatch( "abcdefx", "abcdefg" ) == 6 ); + assert( mismatch( "abcdefg", "abcdefx" ) == 6 ); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Count +//////////////////////////////////////////////////////////////////////////////// + + +version( DDoc ) +{ + /** + * Performs a linear scan of buf from $(LB)0 .. buf.length$(RP), returning + * a count of the number of elements matching pat. Comparisons will be + * performed using the supplied predicate or '==' if none is supplied. + * + * Params: + * buf = The array to scan. + * pat = The pattern to match. + * pred = The evaluation predicate, which should return true if e1 is + * equal to e2 and false if not. This predicate may be any + * callable type. + * + * Returns: + * The number of elements matching pat. + */ + size_t count( Elem[] buf, Elem pat, Pred2E pred = Pred2E.init ); + +} +else +{ + template count_( Elem, Pred = IsEqual!(Elem) ) + { + static assert( isCallableType!(Pred) ); + + + size_t fn( Elem[] buf, Elem pat, Pred pred = Pred.init ) + { + size_t cnt = 0; + + foreach( size_t pos, Elem cur; buf ) + { + if( pred( cur, pat ) ) + ++cnt; + } + return cnt; + } + } + + + template count( Buf, Pat ) + { + size_t count( Buf buf, Pat pat ) + { + return count_!(ElemTypeOf!(Buf)).fn( buf, pat ); + } + } + + + template count( Buf, Pat, Pred ) + { + size_t count( Buf buf, Pat pat, Pred pred ) + { + return count_!(ElemTypeOf!(Buf), Pred).fn( buf, pat, pred ); + } + } + + + debug( UnitTest ) + { + unittest + { + assert( count( "gbbbi", 'a' ) == 0 ); + assert( count( "gbbbi", 'g' ) == 1 ); + assert( count( "gbbbi", 'b' ) == 3 ); + assert( count( "gbbbi", 'i' ) == 1 ); + assert( count( "gbbbi", 'd' ) == 0 ); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Count-If +//////////////////////////////////////////////////////////////////////////////// + + +version( DDoc ) +{ + /** + * Performs a linear scan of buf from $(LB)0 .. buf.length$(RP), returning + * a count of the number of elements where pred returns true. + * + * Params: + * buf = The array to scan. + * pred = The evaluation predicate, which should return true if the + * element is a valid match and false if not. This predicate + * may be any callable type. + * + * Returns: + * The number of elements where pred returns true. + */ + size_t countIf( Elem[] buf, Pred1E pred = Pred1E.init ); + +} +else +{ + template countIf_( Elem, Pred ) + { + static assert( isCallableType!(Pred) ); + + + size_t fn( Elem[] buf, Pred pred ) + { + size_t cnt = 0; + + foreach( size_t pos, Elem cur; buf ) + { + if( pred( cur ) ) + ++cnt; + } + return cnt; + } + } + + + template countIf( Buf, Pred ) + { + size_t countIf( Buf buf, Pred pred ) + { + return countIf_!(ElemTypeOf!(Buf), Pred).fn( buf, pred ); + } + } + + + debug( UnitTest ) + { + unittest + { + assert( countIf( "gbbbi", ( char c ) { return c == 'a'; } ) == 0 ); + assert( countIf( "gbbbi", ( char c ) { return c == 'g'; } ) == 1 ); + assert( countIf( "gbbbi", ( char c ) { return c == 'b'; } ) == 3 ); + assert( countIf( "gbbbi", ( char c ) { return c == 'i'; } ) == 1 ); + assert( countIf( "gbbbi", ( char c ) { return c == 'd'; } ) == 0 ); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Replace +//////////////////////////////////////////////////////////////////////////////// + + +version( DDoc ) +{ + /** + * Performs a linear scan of buf from $(LB)0 .. buf.length$(RP), replacing + * occurrences of pat with val. Comparisons will be performed using the + * supplied predicate or '==' if none is supplied. + * + * Params: + * buf = The array to scan. + * pat = The pattern to match. + * val = The value to substitute. + * pred = The evaluation predicate, which should return true if e1 is + * equal to e2 and false if not. This predicate may be any + * callable type. + * + * Returns: + * The number of elements replaced. + */ + size_t replace( Elem[] buf, Elem pat, Elem val, Pred2E pred = Pred2E.init ); + +} +else +{ + template replace_( Elem, Pred = IsEqual!(Elem) ) + { + static assert( isCallableType!(Pred) ); + + + size_t fn( Elem[] buf, Elem pat, Elem val, Pred pred = Pred.init ) + { + size_t cnt = 0; + + foreach( size_t pos, inout Elem cur; buf ) + { + if( pred( cur, pat ) ) + { + cur = val; + ++cnt; + } + } + return cnt; + } + } + + + template replace( Buf, Elem ) + { + size_t replace( Buf buf, Elem pat, Elem val ) + { + return replace_!(ElemTypeOf!(Buf)).fn( buf, pat, val ); + } + } + + + template replace( Buf, Elem, Pred ) + { + size_t replace( Buf buf, Elem pat, Elem val, Pred pred ) + { + return replace_!(ElemTypeOf!(Buf), Pred).fn( buf, pat, val, pred ); + } + } + + + debug( UnitTest ) + { + unittest + { + assert( replace( "gbbbi".dup, 'a', 'b' ) == 0 ); + assert( replace( "gbbbi".dup, 'g', 'h' ) == 1 ); + assert( replace( "gbbbi".dup, 'b', 'c' ) == 3 ); + assert( replace( "gbbbi".dup, 'i', 'j' ) == 1 ); + assert( replace( "gbbbi".dup, 'd', 'e' ) == 0 ); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Replace-If +//////////////////////////////////////////////////////////////////////////////// + + +version( DDoc ) +{ + /** + * Performs a linear scan of buf from $(LB)0 .. buf.length$(RP), replacing + * elements where pred returns true with val. + * + * Params: + * buf = The array to scan. + * val = The value to substitute. + * pred = The evaluation predicate, which should return true if the + * element is a valid match and false if not. This predicate + * may be any callable type. + * + * Returns: + * The number of elements replaced. + */ + size_t replaceIf( Elem[] buf, Elem val, Pred2E pred = Pred2E.init ); + +} +else +{ + template replaceIf_( Elem, Pred ) + { + static assert( isCallableType!(Pred) ); + + + size_t fn( Elem[] buf, Elem val, Pred pred ) + { + size_t cnt = 0; + + foreach( size_t pos, inout Elem cur; buf ) + { + if( pred( cur ) ) + { + cur = val; + ++cnt; + } + } + return cnt; + } + } + + + template replaceIf( Buf, Elem, Pred ) + { + size_t replaceIf( Buf buf, Elem val, Pred pred ) + { + return replaceIf_!(ElemTypeOf!(Buf), Pred).fn( buf, val, pred ); + } + } + + + debug( UnitTest ) + { + unittest + { + assert( replaceIf( "gbbbi".dup, 'b', ( char c ) { return c == 'a'; } ) == 0 ); + assert( replaceIf( "gbbbi".dup, 'h', ( char c ) { return c == 'g'; } ) == 1 ); + assert( replaceIf( "gbbbi".dup, 'c', ( char c ) { return c == 'b'; } ) == 3 ); + assert( replaceIf( "gbbbi".dup, 'j', ( char c ) { return c == 'i'; } ) == 1 ); + assert( replaceIf( "gbbbi".dup, 'e', ( char c ) { return c == 'd'; } ) == 0 ); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Remove +//////////////////////////////////////////////////////////////////////////////// + + +version( DDoc ) +{ + /** + * Performs a linear scan of buf from $(LB)0 .. buf.length$(RP), moving all + * elements matching pat to the end of the sequence. The relative order of + * elements not matching pat will be preserved. Comparisons will be + * performed using the supplied predicate or '==' if none is supplied. + * + * Params: + * buf = The array to scan. This parameter is not marked 'inout' + * to allow temporary slices to be modified. As buf is not resized + * in any way, omitting the 'inout' qualifier has no effect on the + * result of this operation, even though it may be viewed as a + * side-effect. + * pat = The pattern to match against. + * pred = The evaluation predicate, which should return true if e1 is + * equal to e2 and false if not. This predicate may be any + * callable type. + * + * Returns: + * The number of elements that do not match pat. + */ + size_t remove( Elem[] buf, Elem pat, Pred2E pred = Pred2E.init ); +} +else +{ + template remove_( Elem, Pred = IsEqual!(Elem) ) + { + static assert( isCallableType!(Pred) ); + + + size_t fn( Elem[] buf, Elem pat, Pred pred = Pred.init ) + { + // NOTE: Indexes are passed instead of references because DMD does + // not inline the reference-based version. + void exch( size_t p1, size_t p2 ) + { + Elem t = buf[p1]; + buf[p1] = buf[p2]; + buf[p2] = t; + } + + size_t cnt = 0; + + for( size_t pos = 0, len = buf.length; pos < len; ++pos ) + { + if( pred( buf[pos], pat ) ) + ++cnt; + else + exch( pos, pos - cnt ); + } + return buf.length - cnt; + } + } + + + template remove( Buf, Pat ) + { + size_t remove( Buf buf, Pat pat ) + { + return remove_!(ElemTypeOf!(Buf)).fn( buf, pat ); + } + } + + + template remove( Buf, Pat, Pred ) + { + size_t remove( Buf buf, Pat pat, Pred pred ) + { + return remove_!(ElemTypeOf!(Buf), Pred).fn( buf, pat, pred ); + } + } + + + debug( UnitTest ) + { + unittest + { + void test( char[] buf, char pat, size_t num ) + { + assert( remove( buf, pat ) == num ); + foreach( pos, cur; buf ) + { + assert( pos < num ? cur != pat : cur == pat ); + } + } + + test( "abcdefghij".dup, 'x', 10 ); + test( "xabcdefghi".dup, 'x', 9 ); + test( "abcdefghix".dup, 'x', 9 ); + test( "abxxcdefgh".dup, 'x', 8 ); + test( "xaxbcdxxex".dup, 'x', 5 ); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Remove-If +//////////////////////////////////////////////////////////////////////////////// + + +version( DDoc ) +{ + /** + * Performs a linear scan of buf from $(LB)0 .. buf.length$(RP), moving all + * elements that satisfy pred to the end of the sequence. The relative + * order of elements that do not satisfy pred will be preserved. + * + * Params: + * buf = The array to scan. This parameter is not marked 'inout' + * to allow temporary slices to be modified. As buf is not resized + * in any way, omitting the 'inout' qualifier has no effect on the + * result of this operation, even though it may be viewed as a + * side-effect. + * pred = The evaluation predicate, which should return true if the + * element satisfies the condition and false if not. This + * predicate may be any callable type. + * + * Returns: + * The number of elements that do not satisfy pred. + */ + size_t removeIf( Elem[] buf, Pred1E pred ); +} +else +{ + template removeIf_( Elem, Pred ) + { + static assert( isCallableType!(Pred) ); + + + size_t fn( Elem[] buf, Pred pred ) + { + // NOTE: Indexes are passed instead of references because DMD does + // not inline the reference-based version. + void exch( size_t p1, size_t p2 ) + { + Elem t = buf[p1]; + buf[p1] = buf[p2]; + buf[p2] = t; + } + + size_t cnt = 0; + + for( size_t pos = 0, len = buf.length; pos < len; ++pos ) + { + if( pred( buf[pos] ) ) + ++cnt; + else + exch( pos, pos - cnt ); + } + return buf.length - cnt; + } + } + + + template removeIf( Buf, Pred ) + { + size_t removeIf( Buf buf, Pred pred ) + { + return removeIf_!(ElemTypeOf!(Buf), Pred).fn( buf, pred ); + } + } + + + debug( UnitTest ) + { + unittest + { + void test( char[] buf, bool delegate( char ) dg, size_t num ) + { + assert( removeIf( buf, dg ) == num ); + foreach( pos, cur; buf ) + { + assert( pos < num ? !dg( cur ) : dg( cur ) ); + } + } + + test( "abcdefghij".dup, ( char c ) { return c == 'x'; }, 10 ); + test( "xabcdefghi".dup, ( char c ) { return c == 'x'; }, 9 ); + test( "abcdefghix".dup, ( char c ) { return c == 'x'; }, 9 ); + test( "abxxcdefgh".dup, ( char c ) { return c == 'x'; }, 8 ); + test( "xaxbcdxxex".dup, ( char c ) { return c == 'x'; }, 5 ); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Unique +//////////////////////////////////////////////////////////////////////////////// + + +version( DDoc ) +{ + /** + * Performs a linear scan of buf from $(LB)0 .. buf.length$(RP), moving all + * but the first element of each consecutive group of duplicate elements to + * the end of the sequence. The relative order of all remaining elements + * will be preserved. Comparisons will be performed using the supplied + * predicate or '==' if none is supplied. + * + * Params: + * buf = The array to scan. This parameter is not marked 'inout' + * to allow temporary slices to be modified. As buf is not resized + * in any way, omitting the 'inout' qualifier has no effect on the + * result of this operation, even though it may be viewed as a + * side-effect. + * pred = The evaluation predicate, which should return true if e1 is + * equal to e2 and false if not. This predicate may be any + * callable type. + * + * Returns: + * The number of unique elements in buf. + */ + size_t unique( Elem[] buf, Pred2E pred = Pred2E.init ); +} +else +{ + template unique_( Elem, Pred = IsEqual!(Elem) ) + { + static assert( isCallableType!(Pred) ); + + + size_t fn( Elem[] buf, Pred pred = Pred.init ) + { + // NOTE: Indexes are passed instead of references because DMD does + // not inline the reference-based version. + void exch( size_t p1, size_t p2 ) + { + Elem t = buf[p1]; + buf[p1] = buf[p2]; + buf[p2] = t; + } + + if( buf.length < 2 ) + return buf.length; + + size_t cnt = 0; + Elem pat = buf[0]; + + for( size_t pos = 1, len = buf.length; pos < len; ++pos ) + { + if( pred( buf[pos], pat ) ) + ++cnt; + else + { + pat = buf[pos]; + exch( pos, pos - cnt ); + } + } + return buf.length - cnt; + } + } + + + template unique( Buf ) + { + size_t unique( Buf buf ) + { + return unique_!(ElemTypeOf!(Buf)).fn( buf ); + } + } + + + template unique( Buf, Pred ) + { + size_t unique( Buf buf, Pred pred ) + { + return unique_!(ElemTypeOf!(Buf), Pred).fn( buf, pred ); + } + } + + + debug( UnitTest ) + { + unittest + { + void test( char[] buf, char[] pat ) + { + assert( unique( buf ) == pat.length ); + foreach( pos, cur; pat ) + { + assert( buf[pos] == cur ); + } + } + + test( "abcdefghij".dup, "abcdefghij" ); + test( "aabcdefghi".dup, "abcdefghi" ); + test( "bcdefghijj".dup, "bcdefghij" ); + test( "abccdefghi".dup, "abcdefghi" ); + test( "abccdddefg".dup, "abcdefg" ); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Partition +//////////////////////////////////////////////////////////////////////////////// + + +version( DDoc ) +{ + /** + * Partitions buf such that all elements that satisfy pred will be placed + * before the elements that do not satisfy pred. The algorithm is not + * required to be stable. + * + * Params: + * buf = The array to partition. This parameter is not marked 'inout' + * to allow temporary slices to be sorted. As buf is not resized + * in any way, omitting the 'inout' qualifier has no effect on + * the result of this operation, even though it may be viewed + * as a side-effect. + * pred = The evaluation predicate, which should return true if the + * element satisfies the condition and false if not. This + * predicate may be any callable type. + * + * Returns: + * The number of elements that satisfy pred. + */ + size_t partition( Elem[] buf, Pred1E pred ); +} +else +{ + template partition_( Elem, Pred = IsLess!(Elem) ) + { + static assert( isCallableType!(Pred ) ); + + + size_t fn( Elem[] buf, Pred pred ) + { + // NOTE: Indexes are passed instead of references because DMD does + // not inline the reference-based version. + void exch( size_t p1, size_t p2 ) + { + Elem t = buf[p1]; + buf[p1] = buf[p2]; + buf[p2] = t; + } + + if( buf.length < 2 ) + return 0; + + size_t l = 0, + r = buf.length, + i = l, + j = r - 1; + + while( true ) + { + while( i < r && pred( buf[i] ) ) + ++i; + while( j > l && !pred( buf[j] ) ) + --j; + if( i >= j ) + break; + exch( i++, j-- ); + } + return i; + } + } + + + template partition( Buf, Pred ) + { + size_t partition( Buf buf, Pred pred ) + { + return partition_!(ElemTypeOf!(Buf), Pred).fn( buf, pred ); + } + } + + + debug( UnitTest ) + { + unittest + { + void test( char[] buf, bool delegate( char ) dg, size_t num ) + { + assert( partition( buf, dg ) == num ); + for( size_t pos = 0; pos < buf.length; ++pos ) + { + assert( pos < num ? dg( buf[pos] ) : !dg( buf[pos] ) ); + } + } + + test( "abcdefg".dup, ( char c ) { return c < 'a'; }, 0 ); + test( "gfedcba".dup, ( char c ) { return c < 'a'; }, 0 ); + test( "abcdefg".dup, ( char c ) { return c < 'h'; }, 7 ); + test( "gfedcba".dup, ( char c ) { return c < 'h'; }, 7 ); + test( "abcdefg".dup, ( char c ) { return c < 'd'; }, 3 ); + test( "gfedcba".dup, ( char c ) { return c < 'd'; }, 3 ); + test( "bbdaabc".dup, ( char c ) { return c < 'c'; }, 5 ); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Select +//////////////////////////////////////////////////////////////////////////////// + + +version( DDoc ) +{ + /** + * Partitions buf with num - 1 as a pivot such that the first num elements + * will be less than or equal to the remaining elements in the array. + * Comparisons will be performed using the supplied predicate or '<' if + * none is supplied. The algorithm is not required to be stable. + * + * Params: + * buf = The array to partition. This parameter is not marked 'inout' + * to allow temporary slices to be sorted. As buf is not resized + * in any way, omitting the 'inout' qualifier has no effect on + * the result of this operation, even though it may be viewed + * as a side-effect. + * num = The number of elements which are considered significant in + * this array, where num - 1 is the pivot around which partial + * sorting will occur. For example, if num is buf.length / 2 + * then select will effectively partition the array around its + * median value, with the elements in the first half of the array + * evaluating as less than or equal to the elements in the second + * half. + * pred = The evaluation predicate, which should return true if e1 is + * less than e2 and false if not. This predicate may be any + * callable type. + * + * Returns: + * The index of the pivot point, which will be the lesser of num - 1 and + * buf.length. + */ + size_t select( Elem[] buf, Num num, Pred2E pred = Pred2E.init ); +} +else +{ + template select_( Elem, Pred = IsLess!(Elem) ) + { + static assert( isCallableType!(Pred ) ); + + + size_t fn( Elem[] buf, size_t num, Pred pred = Pred.init ) + { + // NOTE: Indexes are passed instead of references because DMD does + // not inline the reference-based version. + void exch( size_t p1, size_t p2 ) + { + Elem t = buf[p1]; + buf[p1] = buf[p2]; + buf[p2] = t; + } + + if( buf.length < 2 ) + return buf.length; + + size_t l = 0, + r = buf.length - 1, + k = num; + + while( r > l ) + { + size_t i = l, + j = r - 1; + Elem v = buf[r]; + + while( true ) + { + while( i < r && pred( buf[i], v ) ) + ++i; + while( j > l && pred( v, buf[j] ) ) + --j; + if( i >= j ) + break; + exch( i++, j-- ); + } + exch( i, r ); + if( i >= k ) + r = i - 1; + if( i <= k ) + l = i + 1; + } + return num - 1; + } + } + + + template select( Buf, Num ) + { + size_t select( Buf buf, Num num ) + { + return select_!(ElemTypeOf!(Buf)).fn( buf, num ); + } + } + + + template select( Buf, Num, Pred ) + { + size_t select( Buf buf, Num num, Pred pred ) + { + return select_!(ElemTypeOf!(Buf), Pred).fn( buf, num, pred ); + } + } + + + debug( UnitTest ) + { + unittest + { + char[] buf = "efedcaabca".dup; + size_t num = buf.length / 2; + size_t pos = select( buf, num ); + + assert( pos == num - 1 ); + foreach( cur; buf[0 .. pos] ) + assert( cur <= buf[pos] ); + foreach( cur; buf[pos .. $] ) + assert( cur >= buf[pos] ); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Sort +//////////////////////////////////////////////////////////////////////////////// + + +version( DDoc ) +{ + /** + * Sorts buf using the supplied predicate or '<' if none is supplied. The + * algorithm is not required to be stable. The current implementation is + * based on quicksort, but uses a three-way partitioning scheme to improve + * performance for ranges containing duplicate values (Bentley and McIlroy, + * 1993). + * + * Params: + * buf = The array to sort. This parameter is not marked 'inout' to + * allow temporary slices to be sorted. As buf is not resized + * in any way, omitting the 'inout' qualifier has no effect on + * the result of this operation, even though it may be viewed + * as a side-effect. + * pred = The evaluation predicate, which should return true if e1 is + * less than e2 and false if not. This predicate may be any + * callable type. + */ + void sort( Elem[] buf, Pred2E pred = Pred2E.init ); +} +else +{ + template sort_( Elem, Pred = IsLess!(Elem) ) + { + static assert( isCallableType!(Pred ) ); + + + void fn( Elem[] buf, Pred pred = Pred.init ) + { + bool equiv( Elem p1, Elem p2 ) + { + return !pred( p1, p2 ) && !pred( p2, p1 ); + } + + // NOTE: Indexes are passed instead of references because DMD does + // not inline the reference-based version. + void exch( size_t p1, size_t p2 ) + { + Elem t = buf[p1]; + buf[p1] = buf[p2]; + buf[p2] = t; + } + + void quicksort( size_t l, size_t r ) + { + if( r <= l ) + return; + + // This implementation of quicksort improves upon the classic + // algorithm by partitioning the array into three parts, one + // each for keys smaller than, equal to, and larger than the + // partitioning element, v: + // + // |--less than v--|--equal to v--|--greater than v--[v] + // l j i r + // + // This approach sorts ranges containing duplicate elements + // more quickly. During processing, the following situation + // is maintained: + // + // |--equal--|--less--|--[###]--|--greater--|--equal--[v] + // l p i j q r + // + // Please note that this implementation varies from the typical + // algorithm by replacing the use of signed index values with + // unsigned values. + + Elem v = buf[r]; + size_t i = l, + j = r, + p = l, + q = r; + + while( true ) + { + while( pred( buf[i], v ) ) + ++i; + while( pred( v, buf[--j] ) ) + if( j == l ) break; + if( i >= j ) + break; + exch( i, j ); + if( equiv( buf[i], v ) ) + exch( p++, i ); + if( equiv( v, buf[j] ) ) + exch( --q, j ); + ++i; + } + exch( i, r ); + if( p < i ) + { + j = i - 1; + for( size_t k = l; k < p; k++, j-- ) + exch( k, j ); + quicksort( l, j ); + } + if( ++i < q ) + { + for( size_t k = r - 1; k >= q; k--, i++ ) + exch( k, i ); + quicksort( i, r ); + } + } + + if( buf.length > 1 ) + { + quicksort( 0, buf.length - 1 ); + } + } + } + + + template sort( Buf ) + { + void sort( Buf buf ) + { + return sort_!(ElemTypeOf!(Buf)).fn( buf ); + } + } + + + template sort( Buf, Pred ) + { + void sort( Buf buf, Pred pred ) + { + return sort_!(ElemTypeOf!(Buf), Pred).fn( buf, pred ); + } + } + + + debug( UnitTest ) + { + unittest + { + void test( char[] buf ) + { + sort( buf ); + char sav = buf[0]; + foreach( cur; buf ) + { + assert( cur >= sav ); + sav = cur; + } + } + + test( "mkcvalsidivjoaisjdvmzlksvdjioawmdsvmsdfefewv".dup ); + test( "asdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdf".dup ); + test( "the quick brown fox jumped over the lazy dog".dup ); + test( "abcdefghijklmnopqrstuvwxyz".dup ); + test( "zyxwvutsrqponmlkjihgfedcba".dup ); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Lower Bound +//////////////////////////////////////////////////////////////////////////////// + + +version( DDoc ) +{ + /** + * Performs a binary search of buf, returning the index of the first + * location where pat may be inserted without disrupting sort order. If + * the sort order of pat precedes all elements in buf then 0 will be + * returned. If the sort order of pat succeeds the largest element in buf + * then buf.length will be returned. Comparisons will be performed using + * the supplied predicate or '<' if none is supplied. + * + * Params: + * buf = The sorted array to search. + * pat = The pattern to search for. + * pred = The evaluation predicate, which should return true if e1 is + * less than e2 and false if not. This predicate may be any + * callable type. + * + * Returns: + * The index of the first match or buf.length if no match was found. + */ + size_t lbound( Elem[] buf, Elem pat, Pred2E pred = Pred2E.init ); +} +else +{ + template lbound_( Elem, Pred = IsLess!(Elem) ) + { + static assert( isCallableType!(Pred) ); + + + size_t fn( Elem[] buf, Elem pat, Pred pred = Pred.init ) + { + size_t beg = 0, + end = buf.length, + mid = end / 2; + + while( beg < end ) + { + if( pred( buf[mid], pat ) ) + beg = mid + 1; + else + end = mid; + mid = beg + ( end - beg ) / 2; + } + return mid; + } + } + + + template lbound( Buf, Pat ) + { + size_t lbound( Buf buf, Pat pat ) + { + return lbound_!(ElemTypeOf!(Buf)).fn( buf, pat ); + } + } + + + template lbound( Buf, Pat, Pred ) + { + size_t lbound( Buf buf, Pat pat, Pred pred ) + { + return lbound_!(ElemTypeOf!(Buf), Pred).fn( buf, pat, pred ); + } + } + + + debug( UnitTest ) + { + unittest + { + assert( lbound( "bcefg", 'a' ) == 0 ); + assert( lbound( "bcefg", 'h' ) == 5 ); + assert( lbound( "bcefg", 'd' ) == 2 ); + assert( lbound( "bcefg", 'e' ) == 2 ); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Upper Bound +//////////////////////////////////////////////////////////////////////////////// + + +version( DDoc ) +{ + /** + * Performs a binary search of buf, returning the index of the first + * location beyond where pat may be inserted without disrupting sort order. + * If the sort order of pat precedes all elements in buf then 0 will be + * returned. If the sort order of pat succeeds the largest element in buf + * then buf.length will be returned. Comparisons will be performed using + * the supplied predicate or '<' if none is supplied. + * + * Params: + * buf = The sorted array to search. + * pat = The pattern to search for. + * pred = The evaluation predicate, which should return true if e1 is + * less than e2 and false if not. This predicate may be any + * callable type. + * + * Returns: + * The index of the first match or buf.length if no match was found. + */ + size_t ubound( Elem[] buf, Elem pat, Pred2E pred = Pred2E.init ); +} +else +{ + template ubound_( Elem, Pred = IsLess!(Elem) ) + { + static assert( isCallableType!(Pred) ); + + + size_t fn( Elem[] buf, Elem pat, Pred pred = Pred.init ) + { + size_t beg = 0, + end = buf.length, + mid = end / 2; + + while( beg < end ) + { + if( !pred( pat, buf[mid] ) ) + beg = mid + 1; + else + end = mid; + mid = beg + ( end - beg ) / 2; + } + return mid; + } + } + + + template ubound( Buf, Pat ) + { + size_t ubound( Buf buf, Pat pat ) + { + return ubound_!(ElemTypeOf!(Buf)).fn( buf, pat ); + } + } + + + template ubound( Buf, Pat, Pred ) + { + size_t ubound( Buf buf, Pat pat, Pred pred ) + { + return ubound_!(ElemTypeOf!(Buf), Pred).fn( buf, pat, pred ); + } + } + + + debug( UnitTest ) + { + unittest + { + assert( ubound( "bcefg", 'a' ) == 0 ); + assert( ubound( "bcefg", 'h' ) == 5 ); + assert( ubound( "bcefg", 'd' ) == 2 ); + assert( ubound( "bcefg", 'e' ) == 3 ); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Binary Search +//////////////////////////////////////////////////////////////////////////////// + + +version( DDoc ) +{ + /** + * Performs a binary search of buf, returning true if an element equivalent + * to pat is found. Comparisons will be performed using the supplied + * predicate or '<' if none is supplied. + * + * Params: + * buf = The sorted array to search. + * pat = The pattern to search for. + * pred = The evaluation predicate, which should return true if e1 is + * less than e2 and false if not. This predicate may be any + * callable type. + * + * Returns: + * True if an element equivalent to pat is found, false if not. + */ + bool bsearch( Elem[] buf, Elem pat, Pred2E pred = Pred2E.init ); +} +else +{ + template bsearch_( Elem, Pred = IsLess!(Elem) ) + { + static assert( isCallableType!(Pred) ); + + + bool fn( Elem[] buf, Elem pat, Pred pred = Pred.init ) + { + size_t pos = lbound( buf, pat, pred ); + return pos < buf.length && !( pat < buf[pos] ); + } + } + + + template bsearch( Buf, Pat ) + { + bool bsearch( Buf buf, Pat pat ) + { + return bsearch_!(ElemTypeOf!(Buf)).fn( buf, pat ); + } + } + + + template bsearch( Buf, Pat, Pred ) + { + bool bsearch( Buf buf, Pat pat, Pred pred ) + { + return bsearch_!(ElemTypeOf!(Buf), Pred).fn( buf, pat, pred ); + } + } + + + debug( UnitTest ) + { + unittest + { + assert( !bsearch( "bcefg", 'a' ) ); + assert( bsearch( "bcefg", 'b' ) ); + assert( bsearch( "bcefg", 'c' ) ); + assert( !bsearch( "bcefg", 'd' ) ); + assert( bsearch( "bcefg", 'e' ) ); + assert( bsearch( "bcefg", 'f' ) ); + assert( bsearch( "bcefg", 'g' ) ); + assert( !bsearch( "bcefg", 'h' ) ); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Includes +//////////////////////////////////////////////////////////////////////////////// + + +version( DDoc ) +{ + /** + * Performs a parallel linear scan of setA and setB from $(LB)0 .. N$(RP) + * where N = min$(LP)setA.length, setB.length$(RP), returning true if setA + * includes all elements in setB and false if not. Both setA and setB are + * required to be sorted, and duplicates in setB require an equal number of + * duplicates in setA. Comparisons will be performed using the supplied + * predicate or '<' if none is supplied. + * + * Params: + * setA = The sorted array to evaluate. + * setB = The sorted array to match against. + * pred = The evaluation predicate, which should return true if e1 is + * less than e2 and false if not. This predicate may be any + * callable type. + * + * Returns: + * true if setA includes all elements in setB, false if not. + */ + bool includes( Elem[] setA, Elem[] setB, Pred2E pred = Pred2E.init ); +} +else +{ + template includes_( Elem, Pred = IsLess!(Elem) ) + { + static assert( isCallableType!(Pred ) ); + + + bool fn( Elem[] setA, Elem[] setB, Pred pred = Pred.init ) + { + size_t posA = 0, + posB = 0; + + while( posA < setA.length && posB < setB.length ) + { + if( pred( setB[posB], setA[posA] ) ) + return false; + else if( pred( setA[posA], setB[posB] ) ) + ++posA; + else + ++posA, ++posB; + } + return posB == setB.length; + } + } + + + template includes( BufA, BufB ) + { + bool includes( BufA setA, BufB setB ) + { + return includes_!(ElemTypeOf!(BufA)).fn( setA, setB ); + } + } + + + template includes( BufA, BufB, Pred ) + { + bool includes( BufA setA, BufB setB, Pred pred ) + { + return includes_!(ElemTypeOf!(BufA), Pred).fn( setA, setB, pred ); + } + } + + + debug( UnitTest ) + { + unittest + { + assert( includes( "abcdefg", "a" ) ); + assert( includes( "abcdefg", "g" ) ); + assert( includes( "abcdefg", "d" ) ); + assert( includes( "abcdefg", "abcdefg" ) ); + assert( includes( "aaaabbbcdddefgg", "abbbcdefg" ) ); + + assert( !includes( "abcdefg", "aaabcdefg" ) ); + assert( !includes( "abcdefg", "abcdefggg" ) ); + assert( !includes( "abbbcdefg", "abbbbcdefg" ) ); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Union Of +//////////////////////////////////////////////////////////////////////////////// + + +version( DDoc ) +{ + /** + * Computes the union of setA and setB as a set operation and returns the + * retult in a new sorted array. Both setA and setB are required to be + * sorted. If either setA or setB contain duplicates, the result will + * contain the larger number of duplicates from setA and setB. When an + * overlap occurs, entries will be copied from setA. Comparisons will be + * performed using the supplied predicate or '<' if none is supplied. + * + * Params: + * setA = The first sorted array to evaluate. + * setB = The second sorted array to evaluate. + * pred = The evaluation predicate, which should return true if e1 is + * less than e2 and false if not. This predicate may be any + * callable type. + * + * Returns: + * A new array containing the union of setA and setB. + */ + Elem[] unionOf( Elem[] setA, Elem[] setB, Pred2E pred = Pred2E.init ); +} +else +{ + template unionOf_( Elem, Pred = IsLess!(Elem) ) + { + static assert( isCallableType!(Pred ) ); + + + Elem[] fn( Elem[] setA, Elem[] setB, Pred pred = Pred.init ) + { + size_t posA = 0, + posB = 0; + Elem[] setU; + + while( posA < setA.length && posB < setB.length ) + { + if( pred( setA[posA], setB[posB] ) ) + setU ~= setA[posA++]; + else if( pred( setB[posB], setA[posA] ) ) + setU ~= setB[posB++]; + else + setU ~= setA[posA++], posB++; + } + setU ~= setA[posA .. $]; + setU ~= setB[posB .. $]; + return setU; + } + } + + + template unionOf( BufA, BufB ) + { + ElemTypeOf!(BufA)[] unionOf( BufA setA, BufB setB ) + { + return unionOf_!(ElemTypeOf!(BufA)).fn( setA, setB ); + } + } + + + template unionOf( BufA, BufB, Pred ) + { + ElemTypeOf!(BufA)[] unionOf( BufA setA, BufB setB, Pred pred ) + { + return unionOf_!(ElemTypeOf!(BufA), Pred).fn( setA, setB, pred ); + } + } + + + debug( UnitTest ) + { + unittest + { + assert( unionOf( "", "" ) == "" ); + assert( unionOf( "abc", "def" ) == "abcdef" ); + assert( unionOf( "abbbcd", "aadeefg" ) == "aabbbcdeefg" ); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Intersection Of +//////////////////////////////////////////////////////////////////////////////// + + +version( DDoc ) +{ + /** + * Computes the intersection of setA and setB as a set operation and + * returns the retult in a new sorted array. Both setA and setB are + * required to be sorted. If either setA or setB contain duplicates, the + * result will contain the smaller number of duplicates from setA and setB. + * All entries will be copied from setA. Comparisons will be performed + * using the supplied predicate or '<' if none is supplied. + * + * Params: + * setA = The first sorted array to evaluate. + * setB = The second sorted array to evaluate. + * pred = The evaluation predicate, which should return true if e1 is + * less than e2 and false if not. This predicate may be any + * callable type. + * + * Returns: + * A new array containing the intersection of setA and setB. + */ + Elem[] intersectionOf( Elem[] setA, Elem[] setB, Pred2E pred = Pred2E.init ); +} +else +{ + template intersectionOf_( Elem, Pred = IsLess!(Elem) ) + { + static assert( isCallableType!(Pred ) ); + + + Elem[] fn( Elem[] setA, Elem[] setB, Pred pred = Pred.init ) + { + size_t posA = 0, + posB = 0; + Elem[] setI; + + while( posA < setA.length && posB < setB.length ) + { + if( pred( setA[posA], setB[posB] ) ) + ++posA; + else if( pred( setB[posB], setA[posA] ) ) + ++posB; + else + setI ~= setA[posA++], posB++; + } + return setI; + } + } + + + template intersectionOf( BufA, BufB ) + { + ElemTypeOf!(BufA)[] intersectionOf( BufA setA, BufB setB ) + { + return intersectionOf_!(ElemTypeOf!(BufA)).fn( setA, setB ); + } + } + + + template intersectionOf( BufA, BufB, Pred ) + { + ElemTypeOf!(BufA)[] intersectionOf( BufA setA, BufB setB, Pred pred ) + { + return intersectionOf_!(ElemTypeOf!(BufA), Pred).fn( setA, setB, pred ); + } + } + + + debug( UnitTest ) + { + unittest + { + assert( intersectionOf( "", "" ) == "" ); + assert( intersectionOf( "abc", "def" ) == "" ); + assert( intersectionOf( "abbbcd", "aabdddeefg" ) == "abd" ); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Missing From +//////////////////////////////////////////////////////////////////////////////// + + +version( DDoc ) +{ + /** + * Returns a new array containing all elements in setA which are not + * present in setB. Both setA and setB are required to be sorted. + * Comparisons will be performed using the supplied predicate or '<' + * if none is supplied. + * + * Params: + * setA = The first sorted array to evaluate. + * setB = The second sorted array to evaluate. + * pred = The evaluation predicate, which should return true if e1 is + * less than e2 and false if not. This predicate may be any + * callable type. + * + * Returns: + * A new array containing the elements in setA that are not in setB. + */ + Elem[] missingFrom( Elem[] setA, Elem[] setB, Pred2E pred = Pred2E.init ); +} +else +{ + template missingFrom_( Elem, Pred = IsLess!(Elem) ) + { + static assert( isCallableType!(Pred ) ); + + + Elem[] fn( Elem[] setA, Elem[] setB, Pred pred = Pred.init ) + { + size_t posA = 0, + posB = 0; + Elem[] setM; + + while( posA < setA.length && posB < setB.length ) + { + if( pred( setA[posA], setB[posB] ) ) + setM ~= setA[posA++]; + else if( pred( setB[posB], setA[posA] ) ) + ++posB; + else + ++posA, ++posB; + } + setM ~= setA[posA .. $]; + return setM; + } + } + + + template missingFrom( BufA, BufB ) + { + ElemTypeOf!(BufA)[] missingFrom( BufA setA, BufB setB ) + { + return missingFrom_!(ElemTypeOf!(BufA)).fn( setA, setB ); + } + } + + + template missingFrom( BufA, BufB, Pred ) + { + ElemTypeOf!(BufA)[] missingFrom( BufA setA, BufB setB, Pred pred ) + { + return missingFrom_!(ElemTypeOf!(BufA), Pred).fn( setA, setB, pred ); + } + } + + + debug( UnitTest ) + { + unittest + { + assert( missingFrom( "", "" ) == "" ); + assert( missingFrom( "", "abc" ) == "" ); + assert( missingFrom( "abc", "" ) == "abc" ); + assert( missingFrom( "abc", "abc" ) == "" ); + assert( missingFrom( "abc", "def" ) == "abc" ); + assert( missingFrom( "abbbcd", "abd" ) == "bbc" ); + assert( missingFrom( "abcdef", "bc" ) == "adef" ); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Difference Of +//////////////////////////////////////////////////////////////////////////////// + + +version( DDoc ) +{ + /** + * Returns a new array containing all elements in setA which are not + * present in setB and the elements in setB which are not present in + * setA. Both setA and setB are required to be sorted. Comparisons + * will be performed using the supplied predicate or '<' if none is + * supplied. + * + * Params: + * setA = The first sorted array to evaluate. + * setB = The second sorted array to evaluate. + * pred = The evaluation predicate, which should return true if e1 is + * less than e2 and false if not. This predicate may be any + * callable type. + * + * Returns: + * A new array containing the elements in setA that are not in setB + * and the elements in setB that are not in setA. + */ + Elem[] differenceOf( Elem[] setA, Elem[] setB, Pred2E pred = Pred2E.init ); +} +else +{ + template differenceOf_( Elem, Pred = IsLess!(Elem) ) + { + static assert( isCallableType!(Pred ) ); + + + Elem[] fn( Elem[] setA, Elem[] setB, Pred pred = Pred.init ) + { + size_t posA = 0, + posB = 0; + Elem[] setD; + + while( posA < setA.length && posB < setB.length ) + { + if( pred( setA[posA], setB[posB] ) ) + setD ~= setA[posA++]; + else if( pred( setB[posB], setA[posA] ) ) + setD ~= setB[posB++]; + else + ++posA, ++posB; + } + setD ~= setA[posA .. $]; + setD ~= setB[posB .. $]; + return setD; + } + } + + + template differenceOf( BufA, BufB ) + { + ElemTypeOf!(BufA)[] differenceOf( BufA setA, BufB setB ) + { + return differenceOf_!(ElemTypeOf!(BufA)).fn( setA, setB ); + } + } + + + template differenceOf( BufA, BufB, Pred ) + { + ElemTypeOf!(BufA)[] differenceOf( BufA setA, BufB setB, Pred pred ) + { + return differenceOf_!(ElemTypeOf!(BufA), Pred).fn( setA, setB, pred ); + } + } + + + debug( UnitTest ) + { + unittest + { + assert( differenceOf( "", "" ) == "" ); + assert( differenceOf( "", "abc" ) == "abc" ); + assert( differenceOf( "abc", "" ) == "abc" ); + assert( differenceOf( "abc", "abc" ) == "" ); + assert( differenceOf( "abc", "def" ) == "abcdef" ); + assert( differenceOf( "abbbcd", "abd" ) == "bbc" ); + assert( differenceOf( "abd", "abbbcd" ) == "bbc" ); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Make Heap +//////////////////////////////////////////////////////////////////////////////// + + +version( DDoc ) +{ + /** + * Converts buf to a heap using the supplied predicate or '<' if none is + * supplied. + * + * Params: + * buf = The array to convert. This parameter is not marked 'inout' to + * allow temporary slices to be sorted. As buf is not resized in + * any way, omitting the 'inout' qualifier has no effect on the + * result of this operation, even though it may be viewed as a + * side-effect. + * pred = The evaluation predicate, which should return true if e1 is + * less than e2 and false if not. This predicate may be any + * callable type. + */ + void makeHeap( Elem[] buf, Pred2E pred = Pred2E.init ); +} +else +{ + template makeHeap_( Elem, Pred = IsLess!(Elem) ) + { + static assert( isCallableType!(Pred ) ); + + + void fn( Elem[] buf, Pred pred = Pred.init ) + { + // NOTE: Indexes are passed instead of references because DMD does + // not inline the reference-based version. + void exch( size_t p1, size_t p2 ) + { + Elem t = buf[p1]; + buf[p1] = buf[p2]; + buf[p2] = t; + } + + void fixDown( size_t pos, size_t end ) + { + if( end <= pos ) + return; + while( pos <= ( end - 1 ) / 2 ) + { + size_t nxt = 2 * pos + 1; + + if( nxt < end && pred( buf[nxt], buf[nxt + 1] ) ) + ++nxt; + if( !pred( buf[pos], buf[nxt] ) ) + break; + exch( pos, nxt ); + pos = nxt; + } + } + + if( buf.length < 2 ) + return; + + size_t end = buf.length - 1, + pos = end / 2 + 2; + + do + { + fixDown( --pos, end ); + } while( pos > 0 ); + } + } + + + template makeHeap( Buf ) + { + void makeHeap( Buf buf ) + { + return makeHeap_!(ElemTypeOf!(Buf)).fn( buf ); + } + } + + + template makeHeap( Buf, Pred ) + { + void makeHeap( Buf buf, Pred pred ) + { + return makeHeap_!(ElemTypeOf!(Buf), Pred).fn( buf, pred ); + } + } + + + debug( UnitTest ) + { + unittest + { + void basic( char[] buf ) + { + if( buf.length < 2 ) + return; + + size_t pos = 0, + end = buf.length - 1; + + while( pos <= ( end - 1 ) / 2 ) + { + assert( buf[pos] >= buf[2 * pos + 1] ); + if( 2 * pos + 1 < end ) + { + assert( buf[pos] >= buf[2 * pos + 2] ); + } + ++pos; + } + } + + void test( char[] buf ) + { + makeHeap( buf ); + basic( buf ); + } + + test( "mkcvalsidivjoaisjdvmzlksvdjioawmdsvmsdfefewv".dup ); + test( "asdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdf".dup ); + test( "the quick brown fox jumped over the lazy dog".dup ); + test( "abcdefghijklmnopqrstuvwxyz".dup ); + test( "zyxwvutsrqponmlkjihgfedcba".dup ); + test( "ba".dup ); + test( "a".dup ); + test( "".dup ); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Push Heap +//////////////////////////////////////////////////////////////////////////////// + + +version( DDoc ) +{ + /** + * Adds val to buf by appending it and adjusting it up the heap. + * + * Params: + * buf = The heap to modify. This parameter is marked 'inout' because + * buf.length will be altered. + * val = The element to push onto buf. + * pred = The evaluation predicate, which should return true if e1 is + * less than e2 and false if not. This predicate may be any + * callable type. + */ + void pushHeap( inout Elem[] buf, Elem val, Pred2E pred = Pred2E.init ); +} +else +{ + template pushHeap_( Elem, Pred = IsLess!(Elem) ) + { + static assert( isCallableType!(Pred ) ); + + + void fn( inout Elem[] buf, Elem val, Pred pred = Pred.init ) + { + // NOTE: Indexes are passed instead of references because DMD does + // not inline the reference-based version. + void exch( size_t p1, size_t p2 ) + { + Elem t = buf[p1]; + buf[p1] = buf[p2]; + buf[p2] = t; + } + + void fixUp( size_t pos ) + { + if( pos < 1 ) + return; + size_t par = ( pos - 1 ) / 2; + while( pos > 0 && pred( buf[par], buf[pos] ) ) + { + exch( par, pos ); + pos = par; + par = ( pos - 1 ) / 2; + } + } + + buf ~= val; + if( buf.length > 1 ) + { + fixUp( buf.length - 1 ); + } + } + } + + + template pushHeap( Buf, Val ) + { + void pushHeap( inout Buf buf, Val val ) + { + return pushHeap_!(ElemTypeOf!(Buf)).fn( buf, val ); + } + } + + + template pushHeap( Buf, Val, Pred ) + { + void pushHeap( inout Buf buf, Val val, Pred pred ) + { + return pushHeap_!(ElemTypeOf!(Buf), Pred).fn( buf, val, pred ); + } + } + + + debug( UnitTest ) + { + unittest + { + void basic( char[] buf ) + { + if( buf.length < 2 ) + return; + + size_t pos = 0, + end = buf.length - 1; + + while( pos <= ( end - 1 ) / 2 ) + { + assert( buf[pos] >= buf[2 * pos + 1] ); + if( 2 * pos + 1 < end ) + { + assert( buf[pos] >= buf[2 * pos + 2] ); + } + ++pos; + } + } + + char[] buf; + + foreach( cur; "abcdefghijklmnopqrstuvwxyz" ) + { + pushHeap( buf, cur ); + basic( buf ); + } + + buf.length = 0; + + foreach( cur; "zyxwvutsrqponmlkjihgfedcba" ) + { + pushHeap( buf, cur ); + basic( buf ); + } + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Pop Heap +//////////////////////////////////////////////////////////////////////////////// + + +version( DDoc ) +{ + /** + * Removes the top element from buf by swapping it with the bottom element, + * adjusting it down the heap, and reducing the length of buf by one. + * + * Params: + * buf = The heap to modify. This parameter is marked 'inout' because + * buf.length will be altered. + * pred = The evaluation predicate, which should return true if e1 is + * less than e2 and false if not. This predicate may be any + * callable type. + */ + void popHeap( inout Elem[] buf, Pred2E pred = Pred2E.init ); +} +else +{ + template popHeap_( Elem, Pred = IsLess!(Elem) ) + { + static assert( isCallableType!(Pred ) ); + + + void fn( inout Elem[] buf, Pred pred = Pred.init ) + { + // NOTE: Indexes are passed instead of references because DMD does + // not inline the reference-based version. + void exch( size_t p1, size_t p2 ) + { + Elem t = buf[p1]; + buf[p1] = buf[p2]; + buf[p2] = t; + } + + void fixDown( size_t pos, size_t end ) + { + if( end <= pos ) + return; + while( pos <= ( end - 1 ) / 2 ) + { + size_t nxt = 2 * pos + 1; + + if( nxt < end && pred( buf[nxt], buf[nxt + 1] ) ) + ++nxt; + if( !pred( buf[pos], buf[nxt] ) ) + break; + exch( pos, nxt ); + pos = nxt; + } + } + + if( buf.length > 1 ) + { + exch( 0, buf.length - 1 ); + fixDown( 0, buf.length - 2 ); + } + if( buf.length > 0 ) + { + buf.length = buf.length - 1; + } + } + } + + + template popHeap( Buf ) + { + void popHeap( inout Buf buf ) + { + return popHeap_!(ElemTypeOf!(Buf)).fn( buf ); + } + } + + + template popHeap( Buf, Pred ) + { + void popHeap( inout Buf buf, Pred pred ) + { + return popHeap_!(ElemTypeOf!(Buf), Pred).fn( buf, pred ); + } + } + + + debug( UnitTest ) + { + unittest + { + void test( char[] buf ) + { + if( buf.length < 2 ) + return; + + size_t pos = 0, + end = buf.length - 1; + + while( pos <= ( end - 1 ) / 2 ) + { + assert( buf[pos] >= buf[2 * pos + 1] ); + if( 2 * pos + 1 < end ) + { + assert( buf[pos] >= buf[2 * pos + 2] ); + } + ++pos; + } + } + + char[] buf = "zyxwvutsrqponmlkjihgfedcba".dup; + + while( buf.length > 0 ) + { + popHeap( buf ); + test( buf ); + } + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Sort Heap +//////////////////////////////////////////////////////////////////////////////// + + +version( DDoc ) +{ + /** + * Sorts buf as a heap using the supplied predicate or '<' if none is + * supplied. Calling makeHeap and sortHeap on an array in succession + * has the effect of sorting the array using the heapsort algorithm. + * + * Params: + * buf = The heap to sort. This parameter is not marked 'inout' to + * allow temporary slices to be sorted. As buf is not resized + * in any way, omitting the 'inout' qualifier has no effect on + * the result of this operation, even though it may be viewed + * as a side-effect. + * pred = The evaluation predicate, which should return true if e1 is + * less than e2 and false if not. This predicate may be any + * callable type. + */ + void sortHeap( Elem[] buf, Pred2E pred = Pred2E.init ); +} +else +{ + template sortHeap_( Elem, Pred = IsLess!(Elem) ) + { + static assert( isCallableType!(Pred ) ); + + + void fn( Elem[] buf, Pred pred = Pred.init ) + { + // NOTE: Indexes are passed instead of references because DMD does + // not inline the reference-based version. + void exch( size_t p1, size_t p2 ) + { + Elem t = buf[p1]; + buf[p1] = buf[p2]; + buf[p2] = t; + } + + void fixDown( size_t pos, size_t end ) + { + if( end <= pos ) + return; + while( pos <= ( end - 1 ) / 2 ) + { + size_t nxt = 2 * pos + 1; + + if( nxt < end && pred( buf[nxt], buf[nxt + 1] ) ) + ++nxt; + if( !pred( buf[pos], buf[nxt] ) ) + break; + exch( pos, nxt ); + pos = nxt; + } + } + + if( buf.length < 2 ) + return; + + size_t pos = buf.length - 1; + + while( pos > 0 ) + { + exch( 0, pos ); + fixDown( 0, --pos ); + } + } + } + + + template sortHeap( Buf ) + { + void sortHeap( Buf buf ) + { + return sortHeap_!(ElemTypeOf!(Buf)).fn( buf ); + } + } + + + template sortHeap( Buf, Pred ) + { + void sortHeap( Buf buf, Pred pred ) + { + return sortHeap_!(ElemTypeOf!(Buf), Pred).fn( buf, pred ); + } + } + + + debug( UnitTest ) + { + unittest + { + char[] buf = "zyxwvutsrqponmlkjihgfedcba".dup; + + sortHeap( buf ); + char sav = buf[0]; + foreach( cur; buf ) + { + assert( cur >= sav ); + sav = cur; + } + } + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/core/Atomic.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/core/Atomic.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,1644 @@ +/** + * The atomic module is intended to provide some basic support for lock-free + * concurrent programming. Some common operations are defined, each of which + * may be performed using the specified memory barrier or a less granular + * barrier if the hardware does not support the version requested. This + * model is based on a design by Alexander Terekhov as outlined in + * + * this thread. Another useful reference for memory ordering on modern + * architectures is this + * article by Paul McKenney. + * + * Copyright: Copyright (C) 2005-2006 Sean Kelly. All rights reserved. + * License: BSD style: $(LICENSE) + * Authors: Sean Kelly + */ +module tango.core.Atomic; + + +//////////////////////////////////////////////////////////////////////////////// +// Synchronization Options +//////////////////////////////////////////////////////////////////////////////// + + +/** + * Memory synchronization flag. If the supplied option is not available on the + * current platform then a stronger method will be used instead. + */ +enum msync +{ + raw, /// not sequenced + hlb, /// hoist-load barrier + hsb, /// hoist-store barrier + slb, /// sink-load barrier + ssb, /// sink-store barrier + acq, /// hoist-load + hoist-store barrier + rel, /// sink-load + sink-store barrier + seq, /// fully sequenced (acq + rel) +} + + +//////////////////////////////////////////////////////////////////////////////// +// Internal Type Checking +//////////////////////////////////////////////////////////////////////////////// + + +private +{ + version( DDoc ) {} else + { + import tango.core.Traits; + + + template isValidAtomicType( T ) + { + const bool isValidAtomicType = T.sizeof == byte.sizeof || + T.sizeof == short.sizeof || + T.sizeof == int.sizeof || + T.sizeof == long.sizeof; + } + + + template isValidNumericType( T ) + { + const bool isValidNumericType = isIntegerType!( T ) || + isPointerType!( T ); + } + + + template isHoistOp( msync ms ) + { + const bool isHoistOp = ms == msync.hlb || + ms == msync.hsb || + ms == msync.acq || + ms == msync.seq; + } + + + template isSinkOp( msync ms ) + { + const bool isSinkOp = ms == msync.slb || + ms == msync.ssb || + ms == msync.rel || + ms == msync.seq; + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// DDoc Documentation for Atomic Functions +//////////////////////////////////////////////////////////////////////////////// + + +version( DDoc ) +{ + //////////////////////////////////////////////////////////////////////////// + // Atomic Load + //////////////////////////////////////////////////////////////////////////// + + + /** + * Supported msync values: + * msync.raw + * msync.hlb + * msync.acq + * msync.seq + */ + template atomicLoad( msync ms, T ) + { + /** + * Refreshes the contents of 'val' from main memory. This operation is + * both lock-free and atomic. + * + * Params: + * val = The value to load. This value must be properly aligned. + * + * Returns: + * The loaded value. + */ + T atomicLoad( inout T val ) + { + return val; + } + } + + + //////////////////////////////////////////////////////////////////////////// + // Atomic Store + //////////////////////////////////////////////////////////////////////////// + + + /** + * Supported msync values: + * msync.raw + * msync.ssb + * msync.acq + * msync.rel + * msync.seq + */ + template atomicStore( msync ms, T ) + { + /** + * Stores 'newval' to the memory referenced by 'val'. This operation + * is both lock-free and atomic. + * + * Params: + * val = The destination variable. + * newval = The value to store. + */ + void atomicStore( inout T val, T newval ) + { + + } + } + + + //////////////////////////////////////////////////////////////////////////// + // Atomic StoreIf + //////////////////////////////////////////////////////////////////////////// + + + /** + * Supported msync values: + * msync.raw + * msync.ssb + * msync.acq + * msync.rel + * msync.seq + */ + template atomicStoreIf( msync ms, T ) + { + /** + * Stores 'newval' to the memory referenced by 'val' if val is equal to + * 'equalTo'. This operation is both lock-free and atomic. + * + * Params: + * val = The destination variable. + * newval = The value to store. + * equalTo = The comparison value. + * + * Returns: + * true if the store occurred, false if not. + */ + bool atomicStoreIf( inout T val, T newval, T equalTo ) + { + return false; + } + } + + + //////////////////////////////////////////////////////////////////////////// + // Atomic Increment + //////////////////////////////////////////////////////////////////////////// + + + /** + * Supported msync values: + * msync.raw + * msync.ssb + * msync.acq + * msync.rel + * msync.seq + */ + template atomicIncrement( msync ms, T ) + { + /** + * This operation is only legal for built-in value and pointer types, + * and is equivalent to an atomic "val = val + 1" operation. This + * function exists to facilitate use of the optimized increment + * instructions provided by some architecures. If no such instruction + * exists on the target platform then the behavior will perform the + * operation using more traditional means. This operation is both + * lock-free and atomic. + * + * Params: + * val = The value to increment. + * + * Returns: + * The result of an atomicLoad of val immediately following the + * increment operation. This value is not required to be equal to the + * newly stored value. Thus, competing writes are allowed to occur + * between the increment and successive load operation. + */ + T atomicIncrement( inout T val ) + { + return val; + } + } + + + //////////////////////////////////////////////////////////////////////////// + // Atomic Decrement + //////////////////////////////////////////////////////////////////////////// + + + /** + * Supported msync values: + * msync.raw + * msync.ssb + * msync.acq + * msync.rel + * msync.seq + */ + template atomicDecrement( msync ms, T ) + { + /** + * This operation is only legal for built-in value and pointer types, + * and is equivalent to an atomic "val = val - 1" operation. This + * function exists to facilitate use of the optimized decrement + * instructions provided by some architecures. If no such instruction + * exists on the target platform then the behavior will perform the + * operation using more traditional means. This operation is both + * lock-free and atomic. + * + * Params: + * val = The value to decrement. + * + * Returns: + * The result of an atomicLoad of val immediately following the + * increment operation. This value is not required to be equal to the + * newly stored value. Thus, competing writes are allowed to occur + * between the increment and successive load operation. + */ + T atomicDecrement( inout T val ) + { + return val; + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// x86 Atomic Function Implementation +//////////////////////////////////////////////////////////////////////////////// + + +else version( D_InlineAsm_X86 ) +{ + version( X86 ) + { + version( BuildInfo ) + { + pragma( msg, "tango.core.Atomic: using IA-32 inline asm" ); + } + + version = Has32BitOps; + version = Has64BitCAS; + } + version( X86_64 ) + { + version( BuildInfo ) + { + pragma( msg, "tango.core.Atomic: using AMD64 inline asm" ); + } + + version = Has64BitOps; + } + + private + { + //////////////////////////////////////////////////////////////////////// + // x86 Value Requirements + //////////////////////////////////////////////////////////////////////// + + + // NOTE: Strictly speaking, the x86 supports atomic operations on + // unaligned values. However, this is far slower than the + // common case, so such behavior should be prohibited. + template atomicValueIsProperlyAligned( T ) + { + bool atomicValueIsProperlyAligned( size_t addr ) + { + return addr % T.sizeof == 0; + } + } + + + //////////////////////////////////////////////////////////////////////// + // x86 Synchronization Requirements + //////////////////////////////////////////////////////////////////////// + + + // NOTE: While x86 loads have acquire semantics for stores, it appears + // that independent loads may be reordered by some processors + // (notably the AMD64). This implies that the hoist-load barrier + // op requires an ordering instruction, which also extends this + // requirement to acquire ops (though hoist-store should not need + // one if support is added for this later). However, since no + // modern architectures will reorder dependent loads to occur + // before the load they depend on (except the Alpha), raw loads + // are actually a possible means of ordering specific sequences + // of loads in some instances. The original atomic<> + // implementation provides a 'ddhlb' ordering specifier for + // data-dependent loads to handle this situation, but as there + // are no plans to support the Alpha there is no reason to add + // that option here. + // + // For reference, the old behavior (acquire semantics for loads) + // required a memory barrier if: ms == msync.seq || isSinkOp!(ms) + template needsLoadBarrier( msync ms ) + { + const bool needsLoadBarrier = ms != msync.raw; + } + + + // NOTE: x86 stores implicitly have release semantics so a membar is only + // necessary on acquires. + template needsStoreBarrier( msync ms ) + { + const bool needsStoreBarrier = ms == msync.seq || isHoistOp!(ms); + } + } + + + //////////////////////////////////////////////////////////////////////////// + // Atomic Load + //////////////////////////////////////////////////////////////////////////// + + + template atomicLoad( msync ms = msync.seq, T ) + { + T atomicLoad( inout T val ) + in + { + assert( atomicValueIsProperlyAligned!(T)( cast(size_t) &val ) ); + } + body + { + static if( T.sizeof == byte.sizeof ) + { + //////////////////////////////////////////////////////////////// + // 1 Byte Load + //////////////////////////////////////////////////////////////// + + + static if( needsLoadBarrier!(ms) ) + { + volatile asm + { + mov BL, 42; + mov AL, 42; + mov ECX, val; + lock; + cmpxchg [ECX], BL; + } + } + else + { + volatile + { + return val; + } + } + } + else static if( T.sizeof == short.sizeof ) + { + //////////////////////////////////////////////////////////////// + // 2 Byte Load + //////////////////////////////////////////////////////////////// + + static if( needsLoadBarrier!(ms) ) + { + volatile asm + { + mov BX, 42; + mov AX, 42; + mov ECX, val; + lock; + cmpxchg [ECX], BX; + } + } + else + { + volatile + { + return val; + } + } + } + else static if( T.sizeof == int.sizeof ) + { + //////////////////////////////////////////////////////////////// + // 4 Byte Load + //////////////////////////////////////////////////////////////// + + + static if( needsLoadBarrier!(ms) ) + { + volatile asm + { + mov EBX, 42; + mov EAX, 42; + mov ECX, val; + lock; + cmpxchg [ECX], EBX; + } + } + else + { + volatile + { + return val; + } + } + } + else static if( T.sizeof == long.sizeof ) + { + //////////////////////////////////////////////////////////////// + // 8 Byte Load + //////////////////////////////////////////////////////////////// + + + version( Has64BitOps ) + { + //////////////////////////////////////////////////////////// + // 8 Byte Load on 64-Bit Processor + //////////////////////////////////////////////////////////// + + + static if( needsLoadBarrier!(ms) ) + { + volatile asm + { + mov RAX, val; + lock; + mov RAX, [RAX]; + } + } + else + { + volatile + { + return val; + } + } + } + else + { + //////////////////////////////////////////////////////////// + // 8 Byte Load on 32-Bit Processor + //////////////////////////////////////////////////////////// + + + pragma( msg, "This operation is only available on 64-bit platforms." ); + static assert( false ); + } + } + else + { + //////////////////////////////////////////////////////////////// + // Not a 1, 2, 4, or 8 Byte Type + //////////////////////////////////////////////////////////////// + + + pragma( msg, "Invalid template type specified." ); + static assert( false ); + } + } + } + + + //////////////////////////////////////////////////////////////////////////// + // Atomic Store + //////////////////////////////////////////////////////////////////////////// + + + template atomicStore( msync ms = msync.seq, T ) + { + void atomicStore( inout T val, T newval ) + in + { + assert( atomicValueIsProperlyAligned!(T)( cast(size_t) &val ) ); + } + body + { + static if( T.sizeof == byte.sizeof ) + { + //////////////////////////////////////////////////////////////// + // 1 Byte Store + //////////////////////////////////////////////////////////////// + + + static if( needsStoreBarrier!(ms) ) + { + volatile asm + { + mov EAX, val; + mov BL, newval; + lock; + xchg [EAX], BL; + } + } + else + { + volatile asm + { + mov EAX, val; + mov BL, newval; + mov [EAX], BL; + } + } + } + else static if( T.sizeof == short.sizeof ) + { + //////////////////////////////////////////////////////////////// + // 2 Byte Store + //////////////////////////////////////////////////////////////// + + + static if( needsStoreBarrier!(ms) ) + { + volatile asm + { + mov EAX, val; + mov BX, newval; + lock; + xchg [EAX], BX; + } + } + else + { + volatile asm + { + mov EAX, val; + mov BX, newval; + mov [EAX], BX; + } + } + } + else static if( T.sizeof == int.sizeof ) + { + //////////////////////////////////////////////////////////////// + // 4 Byte Store + //////////////////////////////////////////////////////////////// + + + static if( needsStoreBarrier!(ms) ) + { + volatile asm + { + mov EAX, val; + mov EBX, newval; + lock; + xchg [EAX], EBX; + } + } + else + { + volatile asm + { + mov EAX, val; + mov EBX, newval; + mov [EAX], EBX; + } + } + } + else static if( T.sizeof == long.sizeof ) + { + //////////////////////////////////////////////////////////////// + // 8 Byte Store + //////////////////////////////////////////////////////////////// + + + version( Has64BitOps ) + { + //////////////////////////////////////////////////////////// + // 8 Byte Store on 64-Bit Processor + //////////////////////////////////////////////////////////// + + + static if( needsStoreBarrier!(ms) ) + { + volatile asm + { + mov RAX, val; + mov RBX, newval; + lock; + xchg [RAX], RBX; + } + } + else + { + volatile asm + { + mov RAX, val; + mov RBX, newval; + mov [RAX], RBX; + } + } + } + else + { + //////////////////////////////////////////////////////////// + // 8 Byte Store on 32-Bit Processor + //////////////////////////////////////////////////////////// + + + pragma( msg, "This operation is only available on 64-bit platforms." ); + static assert( false ); + } + } + else + { + //////////////////////////////////////////////////////////////// + // Not a 1, 2, 4, or 8 Byte Type + //////////////////////////////////////////////////////////////// + + + pragma( msg, "Invalid template type specified." ); + static assert( false ); + } + } + } + + + //////////////////////////////////////////////////////////////////////////// + // Atomic Store If + //////////////////////////////////////////////////////////////////////////// + + + template atomicStoreIf( msync ms = msync.seq, T ) + { + bool atomicStoreIf( inout T val, T newval, T equalTo ) + in + { + // NOTE: 32 bit x86 systems support 8 byte CAS, which only requires + // 4 byte alignment, so use size_t as the align type here. + static if( T.sizeof > size_t.sizeof ) + assert( atomicValueIsProperlyAligned!(size_t)( cast(size_t) &val ) ); + else + assert( atomicValueIsProperlyAligned!(T)( cast(size_t) &val ) ); + } + body + { + static if( T.sizeof == byte.sizeof ) + { + //////////////////////////////////////////////////////////////// + // 1 Byte StoreIf + //////////////////////////////////////////////////////////////// + + + volatile asm + { + mov BL, newval; + mov AL, equalTo; + mov ECX, val; + lock; // lock always needed to make this op atomic + cmpxchg [ECX], BL; + setz AL; + } + } + else static if( T.sizeof == short.sizeof ) + { + //////////////////////////////////////////////////////////////// + // 2 Byte StoreIf + //////////////////////////////////////////////////////////////// + + + volatile asm + { + mov BX, newval; + mov AX, equalTo; + mov ECX, val; + lock; // lock always needed to make this op atomic + cmpxchg [ECX], BX; + setz AL; + } + } + else static if( T.sizeof == int.sizeof ) + { + //////////////////////////////////////////////////////////////// + // 4 Byte StoreIf + //////////////////////////////////////////////////////////////// + + + volatile asm + { + mov EBX, newval; + mov EAX, equalTo; + mov ECX, val; + lock; // lock always needed to make this op atomic + cmpxchg [ECX], EBX; + setz AL; + } + } + else static if( T.sizeof == long.sizeof ) + { + //////////////////////////////////////////////////////////////// + // 8 Byte StoreIf + //////////////////////////////////////////////////////////////// + + + version( Has64BitOps ) + { + //////////////////////////////////////////////////////////// + // 8 Byte StoreIf on 64-Bit Processor + //////////////////////////////////////////////////////////// + + + volatile asm + { + mov RBX, newval; + mov RAX, equalTo; + mov RCX, val; + lock; // lock always needed to make this op atomic + cmpxchg [RCX], RBX; + setz AL; + } + } + else version( Has64BitCAS ) + { + //////////////////////////////////////////////////////////// + // 8 Byte StoreIf on 32-Bit Processor + //////////////////////////////////////////////////////////// + + + volatile asm + { + lea EDI, newval; + mov EBX, [EDI]; + mov ECX, 4[EDI]; + lea EDI, equalTo; + mov EAX, [EDI]; + mov EDX, 4[EDI]; + mov EDI, val; + lock; // lock always needed to make this op atomic + cmpxch8b [EDI]; + setz AL; + } + } + } + else + { + //////////////////////////////////////////////////////////////// + // Not a 1, 2, 4, or 8 Byte Type + //////////////////////////////////////////////////////////////// + + + pragma( msg, "Invalid template type specified." ); + static assert( false ); + } + } + } + + + //////////////////////////////////////////////////////////////////////////// + // Atomic Increment + //////////////////////////////////////////////////////////////////////////// + + + template atomicIncrement( msync ms = msync.seq, T ) + { + // + // NOTE: This operation is only valid for integer or pointer types + // + static assert( isValidNumericType!(T) ); + + + T atomicIncrement( inout T val ) + in + { + assert( atomicValueIsProperlyAligned!(T)( cast(size_t) &val ) ); + } + body + { + static if( T.sizeof == byte.sizeof ) + { + //////////////////////////////////////////////////////////////// + // 1 Byte Increment + //////////////////////////////////////////////////////////////// + + + volatile asm + { + mov EAX, val; + lock; // lock always needed to make this op atomic + inc [EAX]; + mov AL, [EAX]; + } + } + else static if( T.sizeof == short.sizeof ) + { + //////////////////////////////////////////////////////////////// + // 2 Byte Increment + //////////////////////////////////////////////////////////////// + + + volatile asm + { + mov EAX, val; + lock; // lock always needed to make this op atomic + inc [EAX]; + mov AX, [EAX]; + } + } + else static if( T.sizeof == int.sizeof ) + { + //////////////////////////////////////////////////////////////// + // 4 Byte Increment + //////////////////////////////////////////////////////////////// + + + volatile asm + { + mov EAX, val; + lock; // lock always needed to make this op atomic + inc [EAX]; + mov EAX, [EAX]; + } + } + else static if( T.sizeof == long.sizeof ) + { + //////////////////////////////////////////////////////////////// + // 8 Byte Increment + //////////////////////////////////////////////////////////////// + + + version( Has64BitOps ) + { + //////////////////////////////////////////////////////////// + // 8 Byte Increment on 64-Bit Processor + //////////////////////////////////////////////////////////// + + + volatile asm + { + mov RAX, val; + lock; // lock always needed to make this op atomic + inc [RAX]; + mov RAX, [RAX]; + } + } + else + { + //////////////////////////////////////////////////////////// + // 8 Byte Increment on 32-Bit Processor + //////////////////////////////////////////////////////////// + + + pragma( msg, "This operation is only available on 64-bit platforms." ); + static assert( false ); + } + } + else + { + //////////////////////////////////////////////////////////////// + // Not a 1, 2, 4, or 8 Byte Type + //////////////////////////////////////////////////////////////// + + + pragma( msg, "Invalid template type specified." ); + static assert( false ); + } + } + } + + + //////////////////////////////////////////////////////////////////////////// + // Atomic Decrement + //////////////////////////////////////////////////////////////////////////// + + + template atomicDecrement( msync ms = msync.seq, T ) + { + // + // NOTE: This operation is only valid for integer or pointer types + // + static assert( isValidNumericType!(T) ); + + + T atomicDecrement( inout T val ) + in + { + assert( atomicValueIsProperlyAligned!(T)( cast(size_t) &val ) ); + } + body + { + static if( T.sizeof == byte.sizeof ) + { + //////////////////////////////////////////////////////////////// + // 1 Byte Decrement + //////////////////////////////////////////////////////////////// + + + volatile asm + { + mov EAX, val; + lock; // lock always needed to make this op atomic + dec [EAX]; + mov AL, [EAX]; + } + } + else static if( T.sizeof == short.sizeof ) + { + //////////////////////////////////////////////////////////////// + // 2 Byte Decrement + //////////////////////////////////////////////////////////////// + + + volatile asm + { + mov EAX, val; + lock; // lock always needed to make this op atomic + dec [EAX]; + mov AX, [EAX]; + } + } + else static if( T.sizeof == int.sizeof ) + { + //////////////////////////////////////////////////////////////// + // 4 Byte Decrement + //////////////////////////////////////////////////////////////// + + + volatile asm + { + mov EAX, val; + lock; // lock always needed to make this op atomic + dec [EAX]; + mov EAX, [EAX]; + } + } + else static if( T.sizeof == long.sizeof ) + { + //////////////////////////////////////////////////////////////// + // 8 Byte Decrement + //////////////////////////////////////////////////////////////// + + + version( Has64BitOps ) + { + //////////////////////////////////////////////////////////// + // 8 Byte Decrement on 64-Bit Processor + //////////////////////////////////////////////////////////// + + + volatile asm + { + mov RAX, val; + lock; // lock always needed to make this op atomic + dec [RAX]; + mov RAX, [RAX]; + } + } + else + { + //////////////////////////////////////////////////////////// + // 8 Byte Decrement on 32-Bit Processor + //////////////////////////////////////////////////////////// + + + pragma( msg, "This operation is only available on 64-bit platforms." ); + static assert( false ); + } + } + else + { + //////////////////////////////////////////////////////////////// + // Not a 1, 2, 4, or 8 Byte Type + //////////////////////////////////////////////////////////////// + + + pragma( msg, "Invalid template type specified." ); + static assert( false ); + } + } + } +} +else +{ + version( BuildInfo ) + { + pragma( msg, "tango.core.Atomic: using synchronized ops" ); + } + + private + { + //////////////////////////////////////////////////////////////////////// + // Default Value Requirements + //////////////////////////////////////////////////////////////////////// + + + template atomicValueIsProperlyAligned( T ) + { + bool atomicValueIsProperlyAligned( size_t addr ) + { + return addr % T.sizeof == 0; + } + } + + + //////////////////////////////////////////////////////////////////////// + // Default Synchronization Requirements + //////////////////////////////////////////////////////////////////////// + + + template needsLoadBarrier( msync ms ) + { + const bool needsLoadBarrier = ms != msync.raw; + } + + + template needsStoreBarrier( msync ms ) + { + const bool needsStoreBarrier = ms != msync.raw; + } + } + + + //////////////////////////////////////////////////////////////////////////// + // Atomic Load + //////////////////////////////////////////////////////////////////////////// + + + template atomicLoad( msync ms = msync.seq, T ) + { + T atomicLoad( inout T val ) + in + { + assert( atomicValueIsProperlyAligned!(T)( cast(size_t) &val ) ); + } + body + { + static if( T.sizeof <= (void*).sizeof ) + { + //////////////////////////////////////////////////////////////// + // <= (void*).sizeof Byte Load + //////////////////////////////////////////////////////////////// + + + static if( needsLoadBarrier!(ms) ) + { + synchronized + { + return val; + } + } + else + { + volatile + { + return val; + } + } + } + else + { + //////////////////////////////////////////////////////////////// + // > (void*).sizeof Byte Type + //////////////////////////////////////////////////////////////// + + + pragma( msg, "Invalid template type specified." ); + static assert( false ); + } + } + } + + + //////////////////////////////////////////////////////////////////////////// + // Atomic Store + //////////////////////////////////////////////////////////////////////////// + + + template atomicStore( msync ms = msync.seq, T ) + { + void atomicStore( inout T val, T newval ) + in + { + assert( atomicValueIsProperlyAligned!(T)( cast(size_t) &val ) ); + } + body + { + static if( T.sizeof <= (void*).sizeof ) + { + //////////////////////////////////////////////////////////////// + // <= (void*).sizeof Byte Store + //////////////////////////////////////////////////////////////// + + + static if( needsStoreBarrier!(ms) ) + { + synchronized + { + val = newval; + } + } + else + { + volatile + { + val = newval; + } + } + } + else + { + //////////////////////////////////////////////////////////////// + // > (void*).sizeof Byte Type + //////////////////////////////////////////////////////////////// + + + pragma( msg, "Invalid template type specified." ); + static assert( false ); + } + } + } + + + //////////////////////////////////////////////////////////////////////////// + // Atomic Store If + //////////////////////////////////////////////////////////////////////////// + + + template atomicStoreIf( msync ms = msync.seq, T ) + { + bool atomicStoreIf( inout T val, T newval, T equalTo ) + in + { + assert( atomicValueIsProperlyAligned!(T)( cast(size_t) &val ) ); + } + body + { + static if( T.sizeof <= (void*).sizeof ) + { + //////////////////////////////////////////////////////////////// + // <= (void*).sizeof Byte StoreIf + //////////////////////////////////////////////////////////////// + + + synchronized + { + if( val == equalTo ) + { + val = newval; + return true; + } + return false; + } + } + else + { + //////////////////////////////////////////////////////////////// + // > (void*).sizeof Byte Type + //////////////////////////////////////////////////////////////// + + + pragma( msg, "Invalid template type specified." ); + static assert( false ); + } + } + } + + + ///////////////////////////////////////////////////////////////////////////// + // Atomic Increment + //////////////////////////////////////////////////////////////////////////// + + + template atomicIncrement( msync ms = msync.seq, T ) + { + // + // NOTE: This operation is only valid for integer or pointer types + // + static assert( isValidNumericType!(T) ); + + + T atomicIncrement( inout T val ) + in + { + assert( atomicValueIsProperlyAligned!(T)( cast(size_t) &val ) ); + } + body + { + static if( T.sizeof <= (void*).sizeof ) + { + //////////////////////////////////////////////////////////////// + // <= (void*).sizeof Byte Increment + //////////////////////////////////////////////////////////////// + + + synchronized + { + return ++val; + } + } + else + { + //////////////////////////////////////////////////////////////// + // > (void*).sizeof Byte Type + //////////////////////////////////////////////////////////////// + + + pragma( msg, "Invalid template type specified." ); + static assert( false ); + } + } + } + + + //////////////////////////////////////////////////////////////////////////// + // Atomic Decrement + //////////////////////////////////////////////////////////////////////////// + + + template atomicDecrement( msync ms = msync.seq, T ) + { + // + // NOTE: This operation is only valid for integer or pointer types + // + static assert( isValidNumericType!(T) ); + + + T atomicDecrement( inout T val ) + in + { + assert( atomicValueIsProperlyAligned!(T)( cast(size_t) &val ) ); + } + body + { + static if( T.sizeof <= (void*).sizeof ) + { + //////////////////////////////////////////////////////////////// + // <= (void*).sizeof Byte Decrement + //////////////////////////////////////////////////////////////// + + + synchronized + { + return --val; + } + } + else + { + //////////////////////////////////////////////////////////////// + // > (void*).sizeof Byte Type + //////////////////////////////////////////////////////////////// + + + pragma( msg, "Invalid template type specified." ); + static assert( false ); + } + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Atomic +//////////////////////////////////////////////////////////////////////////////// + + +/** + * This struct represents a value which will be subject to competing access. + * All accesses to this value will be synchronized with main memory, and + * various memory barriers may be employed for instruction ordering. Any + * primitive type of size equal to or smaller than the memory bus size is + * allowed, so 32-bit machines may use values with size <= int.sizeof and + * 64-bit machines may use values with size <= long.sizeof. The one exception + * to this rule is that architectures that support DCAS will allow double-wide + * storeIf operations. The 32-bit x86 architecture, for example, supports + * 64-bit storeIf operations. + */ +struct Atomic( T ) +{ + //////////////////////////////////////////////////////////////////////////// + // Atomic Load + //////////////////////////////////////////////////////////////////////////// + + + template load( msync ms = msync.seq ) + { + static assert( ms == msync.raw || ms == msync.hlb || + ms == msync.acq || ms == msync.seq, + "ms must be one of: msync.raw, msync.hlb, msync.acq, msync.seq" ); + + /** + * Refreshes the contents of this value from main memory. This + * operation is both lock-free and atomic. + * + * Returns: + * The loaded value. + */ + T load() + { + return atomicLoad!(ms,T)( m_val ); + } + } + + + //////////////////////////////////////////////////////////////////////////// + // Atomic Store + //////////////////////////////////////////////////////////////////////////// + + + template store( msync ms = msync.seq ) + { + static assert( ms == msync.raw || ms == msync.ssb || + ms == msync.acq || ms == msync.rel || + ms == msync.seq, + "ms must be one of: msync.raw, msync.ssb, msync.acq, msync.rel, msync.seq" ); + + /** + * Stores 'newval' to the memory referenced by this value. This + * operation is both lock-free and atomic. + * + * Params: + * newval = The value to store. + */ + void store( T newval ) + { + atomicStore!(ms,T)( m_val, newval ); + } + } + + + //////////////////////////////////////////////////////////////////////////// + // Atomic StoreIf + //////////////////////////////////////////////////////////////////////////// + + + template storeIf( msync ms = msync.seq ) + { + static assert( ms == msync.raw || ms == msync.ssb || + ms == msync.acq || ms == msync.rel || + ms == msync.seq, + "ms must be one of: msync.raw, msync.ssb, msync.acq, msync.rel, msync.seq" ); + + /** + * Stores 'newval' to the memory referenced by this value if val is + * equal to 'equalTo'. This operation is both lock-free and atomic. + * + * Params: + * newval = The value to store. + * equalTo = The comparison value. + * + * Returns: + * true if the store occurred, false if not. + */ + bool storeIf( T newval, T equalTo ) + { + return atomicStoreIf!(ms,T)( m_val, newval, equalTo ); + } + } + + + //////////////////////////////////////////////////////////////////////////// + // Numeric Functions + //////////////////////////////////////////////////////////////////////////// + + + /** + * The following additional functions are available for integer types. + */ + static if( isValidNumericType!(T) ) + { + //////////////////////////////////////////////////////////////////////// + // Atomic Increment + //////////////////////////////////////////////////////////////////////// + + + template increment( msync ms = msync.seq ) + { + static assert( ms == msync.raw || ms == msync.ssb || + ms == msync.acq || ms == msync.rel || + ms == msync.seq, + "ms must be one of: msync.raw, msync.ssb, msync.acq, msync.rel, msync.seq" ); + + /** + * This operation is only legal for built-in value and pointer + * types, and is equivalent to an atomic "val = val + 1" operation. + * This function exists to facilitate use of the optimized + * increment instructions provided by some architecures. If no + * such instruction exists on the target platform then the + * behavior will perform the operation using more traditional + * means. This operation is both lock-free and atomic. + * + * Returns: + * The result of an atomicLoad of val immediately following the + * increment operation. This value is not required to be equal to + * the newly stored value. Thus, competing writes are allowed to + * occur between the increment and successive load operation. + */ + T increment() + { + return atomicIncrement!(ms,T)( m_val ); + } + } + + + //////////////////////////////////////////////////////////////////////// + // Atomic Decrement + //////////////////////////////////////////////////////////////////////// + + + template decrement( msync ms = msync.seq ) + { + static assert( ms == msync.raw || ms == msync.ssb || + ms == msync.acq || ms == msync.rel || + ms == msync.seq, + "ms must be one of: msync.raw, msync.ssb, msync.acq, msync.rel, msync.seq" ); + + /** + * This operation is only legal for built-in value and pointer + * types, and is equivalent to an atomic "val = val - 1" operation. + * This function exists to facilitate use of the optimized + * decrement instructions provided by some architecures. If no + * such instruction exists on the target platform then the behavior + * will perform the operation using more traditional means. This + * operation is both lock-free and atomic. + * + * Returns: + * The result of an atomicLoad of val immediately following the + * increment operation. This value is not required to be equal to + * the newly stored value. Thus, competing writes are allowed to + * occur between the increment and successive load operation. + */ + T decrement() + { + return atomicDecrement!(ms,T)( m_val ); + } + } + } + +private: + T m_val; +} + + +//////////////////////////////////////////////////////////////////////////////// +// Support Code for Unit Tests +//////////////////////////////////////////////////////////////////////////////// + + +private +{ + version( DDoc ) {} else + { + template testLoad( msync ms, T ) + { + void testLoad( T val = T.init + 1 ) + { + T base; + Atomic!(T) atom; + + assert( atom.load!(ms)() == base ); + base = val; + atom.m_val = val; + assert( atom.load!(ms)() == base ); + } + } + + + template testStore( msync ms, T ) + { + void testStore( T val = T.init + 1 ) + { + T base; + Atomic!(T) atom; + + assert( atom.m_val == base ); + base = val; + atom.store!(ms)( base ); + assert( atom.m_val == base ); + } + } + + + template testStoreIf( msync ms, T ) + { + void testStoreIf( T val = T.init + 1 ) + { + T base; + Atomic!(T) atom; + + assert( atom.m_val == base ); + base = val; + atom.storeIf!(ms)( base, val ); + assert( atom.m_val != base ); + atom.storeIf!(ms)( base, T.init ); + assert( atom.m_val == base ); + } + } + + + template testIncrement( msync ms, T ) + { + void testIncrement( T val = T.init + 1 ) + { + T base = val; + T incr = val; + Atomic!(T) atom; + + atom.m_val = val; + assert( atom.m_val == base && incr == base ); + base = cast(T)( base + 1 ); + incr = atom.increment!(ms)(); + assert( atom.m_val == base && incr == base ); + } + } + + + template testDecrement( msync ms, T ) + { + void testDecrement( T val = T.init + 1 ) + { + T base = val; + T decr = val; + Atomic!(T) atom; + + atom.m_val = val; + assert( atom.m_val == base && decr == base ); + base = cast(T)( base - 1 ); + decr = atom.decrement!(ms)(); + assert( atom.m_val == base && decr == base ); + } + } + + + template testType( T ) + { + void testType( T val = T.init +1 ) + { + testLoad!(msync.raw, T)( val ); + testLoad!(msync.hlb, T)( val ); + testLoad!(msync.acq, T)( val ); + testLoad!(msync.seq, T)( val ); + + testStore!(msync.raw, T)( val ); + testStore!(msync.ssb, T)( val ); + testStore!(msync.acq, T)( val ); + testStore!(msync.rel, T)( val ); + testStore!(msync.seq, T)( val ); + + testStoreIf!(msync.raw, T)( val ); + testStoreIf!(msync.ssb, T)( val ); + testStoreIf!(msync.acq, T)( val ); + testStoreIf!(msync.rel, T)( val ); + testStoreIf!(msync.seq, T)( val ); + + static if( isValidNumericType!(T) ) + { + testIncrement!(msync.raw, T)( val ); + testIncrement!(msync.ssb, T)( val ); + testIncrement!(msync.acq, T)( val ); + testIncrement!(msync.rel, T)( val ); + testIncrement!(msync.seq, T)( val ); + + testDecrement!(msync.raw, T)( val ); + testDecrement!(msync.ssb, T)( val ); + testDecrement!(msync.acq, T)( val ); + testDecrement!(msync.rel, T)( val ); + testDecrement!(msync.seq, T)( val ); + } + } + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Unit Tests +//////////////////////////////////////////////////////////////////////////////// + + +debug( UnitTest ) +{ + unittest + { + testType!(bool)(); + + testType!(byte)(); + testType!(ubyte)(); + + testType!(short)(); + testType!(ushort)(); + + testType!(int)(); + testType!(uint)(); + + int x; + testType!(void*)( &x ); + + version( Has64BitOps ) + { + testType!(long)(); + testType!(ulong)(); + } + else version( Has64BitCAS ) + { + testStoreIf!(msync.raw, long)(); + testStoreIf!(msync.ssb, long)(); + testStoreIf!(msync.acq, long)(); + testStoreIf!(msync.rel, long)(); + testStoreIf!(msync.seq, long)(); + + testStoreIf!(msync.raw, ulong)(); + testStoreIf!(msync.ssb, ulong)(); + testStoreIf!(msync.acq, ulong)(); + testStoreIf!(msync.rel, ulong)(); + testStoreIf!(msync.seq, ulong)(); + } + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/core/BitArray.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/core/BitArray.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,971 @@ +/** + * This module contains a packed bit array implementation in the style of D's + * built-in dynamic arrays. + * + * Copyright: Copyright (C) 2005-2006 Digital Mars, www.digitalmars.com. + * All rights reserved. + * License: BSD style: $(LICENSE) + * Authors: Walter Bright, Sean Kelly + */ +module tango.core.BitArray; + + +private import tango.core.BitManip; + + +/** + * An array of bits. + */ +struct BitArray +{ + size_t len; + uint* ptr; + + + /** + * + */ + static BitArray opCall( bool[] bits ) + { + BitArray temp; + + temp.length = bits.length; + foreach( pos, val; bits ) + temp[pos] = val; + return temp; + } + + /** + * + */ + size_t length() + { + return len; + } + + + /** + * + */ + void length(size_t newlen) + { + if (newlen != len) + { + size_t olddim = dim(); + size_t newdim = (newlen + 31) / 32; + + if (newdim != olddim) + { + // Create a fake array so we can use D's realloc machinery + uint[] b = ptr[0 .. olddim]; + + b.length = newdim; // realloc + ptr = b.ptr; + if (newdim & 31) + { + // Set any pad bits to 0 + ptr[newdim - 1] &= ~(~0 << (newdim & 31)); + } + } + len = newlen; + } + } + + + /** + * + */ + size_t dim() + { + return (len + 31) / 32; + } + + + /** + * Support for array.dup property for BitArray. + */ + BitArray dup() + { + BitArray ba; + + uint[] b = ptr[0 .. dim].dup; + ba.len = len; + ba.ptr = b.ptr; + return ba; + } + + + debug( UnitTest ) + { + unittest + { + BitArray a; + BitArray b; + int i; + + a.length = 3; + a[0] = 1; a[1] = 0; a[2] = 1; + b = a.dup; + assert(b.length == 3); + for (i = 0; i < 3; i++) + { + //printf("b[%d] = %d\n", i, b[i]); + assert(b[i] == (((i ^ 1) & 1) ? true : false)); + } + } + } + + + /** + * Set BitArray to contents of ba[] + */ + void opAssign(bool[] ba) + { + length = ba.length; + foreach (i, b; ba) + { + (*this)[i] = b; + } + } + + + /** + * Map BitArray onto v[], with numbits being the number of bits + * in the array. Does not copy the data. + * + * This is the inverse of opCast. + */ + void init(void[] v, size_t numbits) + in + { + assert(numbits <= v.length * 8); + assert((v.length & 3) == 0); + } + body + { + ptr = cast(uint*)v.ptr; + len = numbits; + } + + + debug( UnitTest ) + { + unittest + { + BitArray a = [1,0,1,0,1]; + BitArray b; + void[] v; + + v = cast(void[])a; + b.init(v, a.length); + + assert(b[0] == 1); + assert(b[1] == 0); + assert(b[2] == 1); + assert(b[3] == 0); + assert(b[4] == 1); + + a[0] = 0; + assert(b[0] == 0); + + assert(a == b); + } + } + + + /** + * Support for array.reverse property for BitArray. + */ + BitArray reverse() + out (result) + { + assert(result == *this); + } + body + { + if (len >= 2) + { + bool t; + size_t lo, hi; + + lo = 0; + hi = len - 1; + for (; lo < hi; lo++, hi--) + { + t = (*this)[lo]; + (*this)[lo] = (*this)[hi]; + (*this)[hi] = t; + } + } + return *this; + } + + + debug( UnitTest ) + { + unittest + { + BitArray b; + static bool[5] data = [1,0,1,1,0]; + int i; + + b = data; + b.reverse; + for (i = 0; i < data.length; i++) + { + assert(b[i] == data[4 - i]); + } + } + } + + + /** + * Support for array.sort property for BitArray. + */ + BitArray sort() + out (result) + { + assert(result == *this); + } + body + { + if (len >= 2) + { + size_t lo, hi; + + lo = 0; + hi = len - 1; + while (1) + { + while (1) + { + if (lo >= hi) + goto Ldone; + if ((*this)[lo] == true) + break; + lo++; + } + + while (1) + { + if (lo >= hi) + goto Ldone; + if ((*this)[hi] == false) + break; + hi--; + } + + (*this)[lo] = false; + (*this)[hi] = true; + + lo++; + hi--; + } + Ldone: + ; + } + return *this; + } + + + debug( UnitTest ) + { + unittest + { + static uint x = 0b1100011000; + static BitArray ba = { 10, &x }; + + ba.sort; + for (size_t i = 0; i < 6; i++) + assert(ba[i] == false); + for (size_t i = 6; i < 10; i++) + assert(ba[i] == true); + } + } + + + /** + * Support for foreach loops for BitArray. + */ + int opApply(int delegate(inout bool) dg) + { + int result; + + for (size_t i = 0; i < len; i++) + { + bool b = opIndex(i); + result = dg(b); + opIndexAssign(b,i); + if (result) + break; + } + return result; + } + + /** ditto */ + int opApply(int delegate(inout size_t, inout bool) dg) + { + int result; + + for (size_t i = 0; i < len; i++) + { + bool b = opIndex(i); + result = dg(i, b); + opIndexAssign(b,i); + if (result) + break; + } + return result; + } + + + debug( UnitTest ) + { + unittest + { + BitArray a = [1,0,1]; + + int i; + foreach (b;a) + { + switch (i) + { + case 0: assert(b == true); break; + case 1: assert(b == false); break; + case 2: assert(b == true); break; + default: assert(0); + } + i++; + } + + foreach (j,b;a) + { + switch (j) + { + case 0: assert(b == true); break; + case 1: assert(b == false); break; + case 2: assert(b == true); break; + default: assert(0); + } + } + } + } + + + /** + * Support for operators == and != for bit arrays. + */ + int opEquals(BitArray a2) + { + int i; + + if (this.length != a2.length) + return 0; // not equal + byte *p1 = cast(byte*)this.ptr; + byte *p2 = cast(byte*)a2.ptr; + uint n = this.length / 8; + for (i = 0; i < n; i++) + { + if (p1[i] != p2[i]) + return 0; // not equal + } + + ubyte mask; + + n = this.length & 7; + mask = cast(ubyte)((1 << n) - 1); + //printf("i = %d, n = %d, mask = %x, %x, %x\n", i, n, mask, p1[i], p2[i]); + return (mask == 0) || (p1[i] & mask) == (p2[i] & mask); + } + + debug( UnitTest ) + { + unittest + { + BitArray a = [1,0,1,0,1]; + BitArray b = [1,0,1]; + BitArray c = [1,0,1,0,1,0,1]; + BitArray d = [1,0,1,1,1]; + BitArray e = [1,0,1,0,1]; + + assert(a != b); + assert(a != c); + assert(a != d); + assert(a == e); + } + } + + + /** + * Implement comparison operators. + */ + int opCmp(BitArray a2) + { + uint len; + uint i; + + len = this.length; + if (a2.length < len) + len = a2.length; + ubyte* p1 = cast(ubyte*)this.ptr; + ubyte* p2 = cast(ubyte*)a2.ptr; + uint n = len / 8; + for (i = 0; i < n; i++) + { + if (p1[i] != p2[i]) + break; // not equal + } + for (uint j = i * 8; j < len; j++) + { ubyte mask = cast(ubyte)(1 << j); + int c; + + c = cast(int)(p1[i] & mask) - cast(int)(p2[i] & mask); + if (c) + return c; + } + return cast(int)this.len - cast(int)a2.length; + } + + debug( UnitTest ) + { + unittest + { + BitArray a = [1,0,1,0,1]; + BitArray b = [1,0,1]; + BitArray c = [1,0,1,0,1,0,1]; + BitArray d = [1,0,1,1,1]; + BitArray e = [1,0,1,0,1]; + + assert(a > b); + assert(a >= b); + assert(a < c); + assert(a <= c); + assert(a < d); + assert(a <= d); + assert(a == e); + assert(a <= e); + assert(a >= e); + } + } + + + /** + * Convert to void[]. + */ + void[] opCast() + { + return cast(void[])ptr[0 .. dim]; + } + + + debug( UnitTest ) + { + unittest + { + BitArray a = [1,0,1,0,1]; + void[] v = cast(void[])a; + + assert(v.length == a.dim * uint.sizeof); + } + } + + + /** + * Support for [$(I index)] operation for BitArray. + */ + bool opIndex(size_t i) + in + { + assert(i < len); + } + body + { + return cast(bool)bt(ptr, i); + } + + + /** + * Support for unary operator ~ for bit arrays. + */ + BitArray opCom() + { + auto dim = this.dim(); + + BitArray result; + + result.length = len; + for (size_t i = 0; i < dim; i++) + result.ptr[i] = ~this.ptr[i]; + if (len & 31) + result.ptr[dim - 1] &= ~(~0 << (len & 31)); + return result; + } + + + debug( UnitTest ) + { + unittest + { + BitArray a = [1,0,1,0,1]; + BitArray b = ~a; + + assert(b[0] == 0); + assert(b[1] == 1); + assert(b[2] == 0); + assert(b[3] == 1); + assert(b[4] == 0); + } + } + + + /** + * Support for binary operator & for bit arrays. + */ + BitArray opAnd(BitArray e2) + in + { + assert(len == e2.length); + } + body + { + auto dim = this.dim(); + + BitArray result; + + result.length = len; + for (size_t i = 0; i < dim; i++) + result.ptr[i] = this.ptr[i] & e2.ptr[i]; + return result; + } + + + debug( UnitTest ) + { + unittest + { + BitArray a = [1,0,1,0,1]; + BitArray b = [1,0,1,1,0]; + + BitArray c = a & b; + + assert(c[0] == 1); + assert(c[1] == 0); + assert(c[2] == 1); + assert(c[3] == 0); + assert(c[4] == 0); + } + } + + + /** + * Support for binary operator | for bit arrays. + */ + BitArray opOr(BitArray e2) + in + { + assert(len == e2.length); + } + body + { + auto dim = this.dim(); + + BitArray result; + + result.length = len; + for (size_t i = 0; i < dim; i++) + result.ptr[i] = this.ptr[i] | e2.ptr[i]; + return result; + } + + + debug( UnitTest ) + { + unittest + { + BitArray a = [1,0,1,0,1]; + BitArray b = [1,0,1,1,0]; + + BitArray c = a | b; + + assert(c[0] == 1); + assert(c[1] == 0); + assert(c[2] == 1); + assert(c[3] == 1); + assert(c[4] == 1); + } + } + + + /** + * Support for binary operator ^ for bit arrays. + */ + BitArray opXor(BitArray e2) + in + { + assert(len == e2.length); + } + body + { + auto dim = this.dim(); + + BitArray result; + + result.length = len; + for (size_t i = 0; i < dim; i++) + result.ptr[i] = this.ptr[i] ^ e2.ptr[i]; + return result; + } + + + debug( UnitTest ) + { + unittest + { + BitArray a = [1,0,1,0,1]; + BitArray b = [1,0,1,1,0]; + + BitArray c = a ^ b; + + assert(c[0] == 0); + assert(c[1] == 0); + assert(c[2] == 0); + assert(c[3] == 1); + assert(c[4] == 1); + } + } + + + /** + * Support for binary operator - for bit arrays. + * + * $(I a - b) for BitArrays means the same thing as $(I a & ~b). + */ + BitArray opSub(BitArray e2) + in + { + assert(len == e2.length); + } + body + { + auto dim = this.dim(); + + BitArray result; + + result.length = len; + for (size_t i = 0; i < dim; i++) + result.ptr[i] = this.ptr[i] & ~e2.ptr[i]; + return result; + } + + + debug( UnitTest ) + { + unittest + { + BitArray a = [1,0,1,0,1]; + BitArray b = [1,0,1,1,0]; + + BitArray c = a - b; + + assert(c[0] == 0); + assert(c[1] == 0); + assert(c[2] == 0); + assert(c[3] == 0); + assert(c[4] == 1); + } + } + + + /** + * Support for binary operator ~ for bit arrays. + */ + BitArray opCat(bool b) + { + BitArray r; + + r = this.dup; + r.length = len + 1; + r[len] = b; + return r; + } + + + /** ditto */ + BitArray opCat_r(bool b) + { + BitArray r; + + r.length = len + 1; + r[0] = b; + for (size_t i = 0; i < len; i++) + r[1 + i] = (*this)[i]; + return r; + } + + + /** ditto */ + BitArray opCat(BitArray b) + { + BitArray r; + + r = this.dup(); + r ~= b; + return r; + } + + + debug( UnitTest ) + { + unittest + { + BitArray a = [1,0]; + BitArray b = [0,1,0]; + BitArray c; + + c = (a ~ b); + assert(c.length == 5); + assert(c[0] == 1); + assert(c[1] == 0); + assert(c[2] == 0); + assert(c[3] == 1); + assert(c[4] == 0); + + c = (a ~ true); + assert(c.length == 3); + assert(c[0] == 1); + assert(c[1] == 0); + assert(c[2] == 1); + + c = (false ~ a); + assert(c.length == 3); + assert(c[0] == 0); + assert(c[1] == 1); + assert(c[2] == 0); + } + } + + + /** + * Support for [$(I index)] operation for BitArray. + */ + bool opIndexAssign(bool b, size_t i) + in + { + assert(i < len); + } + body + { + if (b) + bts(ptr, i); + else + btr(ptr, i); + return b; + } + + + /** + * Support for operator &= bit arrays. + */ + BitArray opAndAssign(BitArray e2) + in + { + assert(len == e2.length); + } + body + { + auto dim = this.dim(); + + for (size_t i = 0; i < dim; i++) + ptr[i] &= e2.ptr[i]; + return *this; + } + + + debug( UnitTest ) + { + unittest + { + BitArray a = [1,0,1,0,1]; + BitArray b = [1,0,1,1,0]; + + a &= b; + assert(a[0] == 1); + assert(a[1] == 0); + assert(a[2] == 1); + assert(a[3] == 0); + assert(a[4] == 0); + } + } + + + /** + * Support for operator |= for bit arrays. + */ + BitArray opOrAssign(BitArray e2) + in + { + assert(len == e2.length); + } + body + { + auto dim = this.dim(); + + for (size_t i = 0; i < dim; i++) + ptr[i] |= e2.ptr[i]; + return *this; + } + + + debug( UnitTest ) + { + unittest + { + BitArray a = [1,0,1,0,1]; + BitArray b = [1,0,1,1,0]; + + a |= b; + assert(a[0] == 1); + assert(a[1] == 0); + assert(a[2] == 1); + assert(a[3] == 1); + assert(a[4] == 1); + } + } + + + /** + * Support for operator ^= for bit arrays. + */ + BitArray opXorAssign(BitArray e2) + in + { + assert(len == e2.length); + } + body + { + auto dim = this.dim(); + + for (size_t i = 0; i < dim; i++) + ptr[i] ^= e2.ptr[i]; + return *this; + } + + + debug( UnitTest ) + { + unittest + { + BitArray a = [1,0,1,0,1]; + BitArray b = [1,0,1,1,0]; + + a ^= b; + assert(a[0] == 0); + assert(a[1] == 0); + assert(a[2] == 0); + assert(a[3] == 1); + assert(a[4] == 1); + } + } + + + /** + * Support for operator -= for bit arrays. + * + * $(I a -= b) for BitArrays means the same thing as $(I a &= ~b). + */ + BitArray opSubAssign(BitArray e2) + in + { + assert(len == e2.length); + } + body + { + auto dim = this.dim(); + + for (size_t i = 0; i < dim; i++) + ptr[i] &= ~e2.ptr[i]; + return *this; + } + + + debug( UnitTest ) + { + unittest + { + BitArray a = [1,0,1,0,1]; + BitArray b = [1,0,1,1,0]; + + a -= b; + assert(a[0] == 0); + assert(a[1] == 0); + assert(a[2] == 0); + assert(a[3] == 0); + assert(a[4] == 1); + } + } + + + /** + * Support for operator ~= for bit arrays. + */ + BitArray opCatAssign(bool b) + { + length = len + 1; + (*this)[len - 1] = b; + return *this; + } + + + debug( UnitTest ) + { + unittest + { + BitArray a = [1,0,1,0,1]; + BitArray b; + + b = (a ~= true); + assert(a[0] == 1); + assert(a[1] == 0); + assert(a[2] == 1); + assert(a[3] == 0); + assert(a[4] == 1); + assert(a[5] == 1); + + assert(b == a); + } + } + + + /** + * ditto + */ + BitArray opCatAssign(BitArray b) + { + auto istart = len; + length = len + b.length; + for (auto i = istart; i < len; i++) + (*this)[i] = b[i - istart]; + return *this; + } + + + debug( UnitTest ) + { + unittest + { + BitArray a = [1,0]; + BitArray b = [0,1,0]; + BitArray c; + + c = (a ~= b); + assert(a.length == 5); + assert(a[0] == 1); + assert(a[1] == 0); + assert(a[2] == 0); + assert(a[3] == 1); + assert(a[4] == 0); + + assert(c == a); + } + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/core/BitManip.di --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/core/BitManip.di Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,44 @@ +// D import file generated from 'core/BitManip.d' +module tango.core.BitManip; +version (DDoc) +{ + int bsf(uint v); + int bsr(uint v); + int bt(uint* p, uint bitnum); + int btc(uint* p, uint bitnum); + int btr(uint* p, uint bitnum); + int bts(uint* p, uint bitnum); + uint bswap(uint v); + ubyte inp(uint port_address); + ushort inpw(uint port_address); + uint inpl(uint port_address); + ubyte outp(uint port_address, ubyte value); + ushort outpw(uint port_address, ushort value); + uint outpl(uint port_address, uint value); +} +else +{ + public +{ + import std.intrinsic; +} +} +int popcnt(uint x) +{ +x = x - (x >> 1 & 1431655765); +x = ((x & -858993460u) >> 2) + (x & 858993459); +x += x >> 4; +x &= 252645135; +x += x >> 8; +x &= 16711935; +x += x >> 16; +x &= 65535; +return x; +} +debug (UnitTest) +{ + } +uint bitswap(uint x); +debug (UnitTest) +{ + } diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/core/ByteSwap.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/core/ByteSwap.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,117 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: October 2004 + + version: Feb 20th 2005 - Asm version removed by Aleksey Bobnev + + author: Kris, Aleksey Bobnev + +*******************************************************************************/ + +module tango.core.ByteSwap; + +import tango.core.BitManip; + +/******************************************************************************* + + Reverse byte order for specific datum sizes. Note that the + byte-swap approach avoids alignment issues, so is probably + faster overall than a traditional 'shift' implementation. + +*******************************************************************************/ + +struct ByteSwap +{ + /*********************************************************************** + + ***********************************************************************/ + + final static void swap16 (void *dst, uint bytes) + { + ubyte* p = cast(ubyte*) dst; + while (bytes) + { + ubyte b = p[0]; + p[0] = p[1]; + p[1] = b; + + p += short.sizeof; + bytes -= short.sizeof; + } + } + + /*********************************************************************** + + ***********************************************************************/ + + final static void swap32 (void *dst, uint bytes) + { + uint* p = cast(uint*) dst; + while (bytes) + { + *p = bswap(*p); + p ++; + bytes -= int.sizeof; + } + } + + /*********************************************************************** + + ***********************************************************************/ + + final static void swap64 (void *dst, uint bytes) + { + uint* p = cast(uint*) dst; + while (bytes) + { + uint i = p[0]; + p[0] = bswap(p[1]); + p[1] = bswap(i); + + p += (long.sizeof / int.sizeof); + bytes -= long.sizeof; + } + } + + /*********************************************************************** + + ***********************************************************************/ + + final static void swap80 (void *dst, uint bytes) + { + ubyte* p = cast(ubyte*) dst; + while (bytes) + { + ubyte b = p[0]; + p[0] = p[9]; + p[9] = b; + + b = p[1]; + p[1] = p[8]; + p[8] = b; + + b = p[2]; + p[2] = p[7]; + p[7] = b; + + b = p[3]; + p[3] = p[6]; + p[6] = b; + + b = p[4]; + p[4] = p[5]; + p[5] = b; + + p += real.sizeof; + bytes -= real.sizeof; + } + } +} + + + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/core/Exception.di --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/core/Exception.di Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,278 @@ +// D import file generated from 'core/Exception.d' +module tango.core.Exception; +private +{ + alias void(* assertHandlerType)(char[] file, size_t line, char[] msg = null); + alias TracedExceptionInfo(* traceHandlerType)(void* ptr = null); + assertHandlerType assertHandler = null; + traceHandlerType traceHandler = null; +} +interface TracedExceptionInfo +{ + int opApply(int delegate(ref char[])); +} +class OutOfMemoryException : Exception +{ + this(char[] file, size_t line) +{ +super("Memory allocation failed",file,line); +} + char[] toString() +{ +return msg ? super.toString() : "Memory allocation failed"; +} +} +class TracedException : Exception +{ + this(char[] msg) +{ +super(msg); +m_info = traceContext(); +} + this(char[] msg, Exception e) +{ +super(msg,e); +m_info = traceContext(); +} + this(char[] msg, char[] file, size_t line) +{ +super(msg,file,line); +m_info = traceContext(); +} + char[] toString(); + int opApply(int delegate(ref char[] buf) dg); + private +{ + TracedExceptionInfo m_info; +} +} +class PlatformException : TracedException +{ + this(char[] msg) +{ +super(msg); +} +} +class AssertException : TracedException +{ + this(char[] file, size_t line) +{ +super("Assertion failure",file,line); +} + this(char[] msg, char[] file, size_t line) +{ +super(msg,file,line); +} +} +class ArrayBoundsException : TracedException +{ + this(char[] file, size_t line) +{ +super("Array index out of bounds",file,line); +} +} +class FinalizeException : TracedException +{ + ClassInfo info; + this(ClassInfo c, Exception e = null) +{ +super("Finalization error",e); +info = c; +} + char[] toString() +{ +assert(0); +} +} +class SwitchException : TracedException +{ + this(char[] file, size_t line) +{ +super("No appropriate switch clause found",file,line); +} +} +class TextException : TracedException +{ + this(char[] msg) +{ +super(msg); +} +} +class UnicodeException : TextException +{ + size_t idx; + this(char[] msg, size_t idx) +{ +super(msg); +this.idx = idx; +} +} +class ThreadException : PlatformException +{ + this(char[] msg) +{ +super(msg); +} +} +class FiberException : ThreadException +{ + this(char[] msg) +{ +super(msg); +} +} +class SyncException : PlatformException +{ + this(char[] msg) +{ +super(msg); +} +} +class IOException : PlatformException +{ + this(char[] msg) +{ +super(msg); +} +} +private +{ + class VfsException : IOException +{ + this(char[] msg) +{ +super(msg); +} +} +} +private +{ + class ClusterException : IOException +{ + this(char[] msg) +{ +super(msg); +} +} +} +class SocketException : IOException +{ + this(char[] msg) +{ +super(msg); +} +} +class HostException : IOException +{ + this(char[] msg) +{ +super(msg); +} +} +class AddressException : IOException +{ + this(char[] msg) +{ +super(msg); +} +} +class SocketAcceptException : SocketException +{ + this(char[] msg) +{ +super(msg); +} +} +class ProcessException : PlatformException +{ + this(char[] msg) +{ +super(msg); +} +} +class RegexException : TextException +{ + this(char[] msg) +{ +super(msg); +} +} +class LocaleException : TextException +{ + this(char[] msg) +{ +super(msg); +} +} +class RegistryException : TracedException +{ + this(char[] msg) +{ +super(msg); +} +} +class IllegalArgumentException : TracedException +{ + this(char[] msg) +{ +super(msg); +} +} +class IllegalElementException : IllegalArgumentException +{ + this(char[] msg) +{ +super(msg); +} +} +class NoSuchElementException : TracedException +{ + this(char[] msg) +{ +super(msg); +} +} +class CorruptedIteratorException : NoSuchElementException +{ + this(char[] msg) +{ +super(msg); +} +} +void setAssertHandler(assertHandlerType h) +{ +assertHandler = h; +} +void setTraceHandler(traceHandlerType h) +{ +traceHandler = h; +} +extern (C) +{ + void onAssertError(char[] file, size_t line); +} +extern (C) +{ + void onAssertErrorMsg(char[] file, size_t line, char[] msg); +} +TracedExceptionInfo traceContext(void* ptr = null); +extern (C) +{ + void onArrayBoundsError(char[] file, size_t line); +} +extern (C) +{ + void onFinalizeError(ClassInfo info, Exception ex); +} +extern (C) +{ + void onOutOfMemoryError(); +} +extern (C) +{ + void onSwitchError(char[] file, size_t line); +} +extern (C) +{ + void onUnicodeError(char[] msg, size_t idx); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/core/Memory.di --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/core/Memory.di Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,246 @@ +// D import file generated from 'core/Memory.d' +module tango.core.Memory; +private +{ + extern (C) +{ + void gc_init(); +} + extern (C) +{ + void gc_term(); +} + extern (C) +{ + void gc_enable(); +} + extern (C) +{ + void gc_disable(); +} + extern (C) +{ + void gc_collect(); +} + extern (C) +{ + uint gc_getAttr(void* p); +} + extern (C) +{ + uint gc_setAttr(void* p, uint a); +} + extern (C) +{ + uint gc_clrAttr(void* p, uint a); +} + extern (C) +{ + void* gc_malloc(size_t sz, uint ba = 0); +} + extern (C) +{ + void* gc_calloc(size_t sz, uint ba = 0); +} + extern (C) +{ + void* gc_realloc(void* p, size_t sz, uint ba = 0); +} + extern (C) +{ + size_t gc_extend(void* p, size_t mx, size_t sz); +} + extern (C) +{ + void gc_free(void* p); +} + extern (C) +{ + void* gc_addrOf(void* p); +} + extern (C) +{ + size_t gc_sizeOf(void* p); +} + struct BlkInfo_ +{ + void* base; + size_t size; + uint attr; +} + extern (C) +{ + BlkInfo_ gc_query(void* p); +} + extern (C) +{ + void gc_addRoot(void* p); +} + extern (C) +{ + void gc_addRange(void* p, size_t sz); +} + extern (C) +{ + void gc_removeRoot(void* p); +} + extern (C) +{ + void gc_removeRange(void* p); +} + alias bool(* collectHandlerType)(Object obj); +} +struct GC +{ + static +{ + void enable() +{ +gc_enable(); +} +} + static +{ + void disable() +{ +gc_disable(); +} +} + static +{ + void collect() +{ +gc_collect(); +} +} + enum BlkAttr : uint +{ +FINALIZE = 1, +NO_SCAN = 2, +NO_MOVE = 4, +} + alias BlkInfo_ BlkInfo; + static +{ + uint getAttr(void* p) +{ +return gc_getAttr(p); +} +} + static +{ + uint setAttr(void* p, uint a) +{ +return gc_setAttr(p,a); +} +} + static +{ + uint clrAttr(void* p, uint a) +{ +return gc_clrAttr(p,a); +} +} + static +{ + void* malloc(size_t sz, uint ba = 0) +{ +return gc_malloc(sz,ba); +} +} + static +{ + void* calloc(size_t sz, uint ba = 0) +{ +return gc_calloc(sz,ba); +} +} + static +{ + void* realloc(void* p, size_t sz, uint ba = 0) +{ +return gc_realloc(p,sz,ba); +} +} + static +{ + size_t extend(void* p, size_t mx, size_t sz) +{ +return gc_extend(p,mx,sz); +} +} + static +{ + void free(void* p) +{ +gc_free(p); +} +} + static +{ + void* addrOf(void* p) +{ +return gc_addrOf(p); +} +} + static +{ + size_t sizeOf(void* p) +{ +return gc_sizeOf(p); +} +} + static +{ + BlkInfo query(void* p) +{ +return gc_query(p); +} +} + static +{ + void addRoot(void* p) +{ +gc_addRoot(p); +} +} + static +{ + void addRange(void* p, size_t sz) +{ +gc_addRange(p,sz); +} +} + static +{ + void removeRoot(void* p) +{ +gc_removeRoot(p); +} +} + static +{ + void removeRange(void* p) +{ +gc_removeRange(p); +} +} + static +{ + void collectHandler(collectHandlerType h) +{ +sm_collectHandler = h; +} +} + private +{ + static +{ + collectHandlerType sm_collectHandler = null; +} +} +} +extern (C) +{ + bool onCollectResource(Object obj); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/core/Runtime.di --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/core/Runtime.di Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,38 @@ +// D import file generated from 'core/Runtime.d' +module tango.core.Runtime; +private +{ + extern (C) +{ + bool rt_isHalting(); +} + alias bool(* moduleUnitTesterType)(); +} +struct Runtime +{ + static +{ + bool isHalting() +{ +return rt_isHalting(); +} +} + static +{ + void moduleUnitTester(moduleUnitTesterType h) +{ +sm_moduleUnitTester = h; +} +} + private +{ + static +{ + moduleUnitTesterType sm_moduleUnitTester = null; +} +} +} +extern (C) +{ + bool runModuleUnitTests(); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/core/Signal.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/core/Signal.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,276 @@ +/** + * The signal module provides a basic implementation of the listener pattern + * using the "Signals and Slots" model from Qt. + * + * Copyright: Copyright (C) 2005-2006 Sean Kelly. All rights reserved. + * License: BSD style: $(LICENSE) + * Authors: Sean Kelly + */ +module tango.core.Signal; + + +private import tango.core.Array; + + +/** + * A signal is an event which contains a collection of listeners (called + * slots). When a signal is called, that call will be propagated to each + * attached slot in a synchronous manner. It is legal for a slot to call a + * signal's attach and detach methods when it is signaled. When this occurs, + * attach events will be queued and processed after the signal has propagated + * to all slots, but detach events are processed immediately. This ensures + * that it is safe for slots to be deleted at any time, even within a slot + * routine. + * + * Example: + * ----------------------------------------------------------------------------- + * + * class Button + * { + * Signal!(Button) press; + * } + * + * void wasPressed( Button b ) + * { + * printf( "Button was pressed.\n" ); + * } + * + * Button b = new Button; + * + * b.press.attach( &wasPressed ); + * b.press( b ); + * + * ----------------------------------------------------------------------------- + * + * Please note that this implementation does not use weak pointers to store + * references to slots. This design was chosen because weak pointers are + * inherently unsafe when combined with non-deterministic destruction, with + * many of the same limitations as destructors in the same situation. It is + * still possible to obtain weak-pointer behavior, but this must be done + * through a proxy object instead. + */ +struct Signal( Args... ) +{ + alias void delegate(Args) SlotDg; /// + alias void function(Args) SlotFn; /// + + alias opCall call; /// Alias to simplify chained calling. + + + /** + * The signal procedure. When called, each of the attached slots will be + * called synchronously. + * + * args = The signal arguments. + */ + void opCall( Args args ) + { + synchronized + { + m_blk = true; + + for( size_t i = 0; i < m_dgs.length; ++i ) + { + if( m_dgs[i] !is null ) + m_dgs[i]( args ); + } + m_dgs.length = m_dgs.remove( cast(SlotDg) null ); + + for( size_t i = 0; i < m_fns.length; ++i ) + { + if( m_fns[i] !is null ) + m_fns[i]( args ); + } + m_fns.length = m_fns.remove( cast(SlotFn) null ); + + m_blk = false; + + procAdds(); + } + } + + + /** + * Attaches a delegate to this signal. A delegate may be either attached + * or detached, so successive calls to attach for the same delegate will + * have no effect. + * + * dg = The delegate to attach. + */ + void attach( SlotDg dg ) + { + synchronized + { + if( m_blk ) + { + m_add ~= Add( dg ); + } + else + { + auto pos = m_dgs.find( dg ); + if( pos == m_dgs.length ) + m_dgs ~= dg; + } + } + } + + + /** + * Attaches a function to this signal. A function may be either attached + * or detached, so successive calls to attach for the same function will + * have no effect. + * + * fn = The function to attach. + */ + void attach( SlotFn fn ) + { + synchronized + { + if( m_blk ) + { + m_add ~= Add( fn ); + } + else + { + auto pos = m_fns.find( fn ); + if( pos == m_fns.length ) + m_fns ~= fn; + } + } + } + + + /** + * Detaches a delegate from this signal. + * + * dg = The delegate to detach. + */ + void detach( SlotDg dg ) + { + synchronized + { + auto pos = m_dgs.find( dg ); + if( pos < m_dgs.length ) + m_dgs[pos] = null; + } + } + + + /** + * Detaches a function from this signal. + * + * fn = The function to detach. + */ + void detach( SlotFn fn ) + { + synchronized + { + auto pos = m_fns.find( fn ); + if( pos < m_fns.length ) + m_fns[pos] = null; + } + } + + +private: + struct Add + { + enum Type + { + DG, + FN + } + + static Add opCall( SlotDg d ) + { + Add e; + e.ty = Type.DG; + e.dg = d; + return e; + } + + static Add opCall( SlotFn f ) + { + Add e; + e.ty = Type.FN; + e.fn = f; + return e; + } + + union + { + SlotDg dg; + SlotFn fn; + } + Type ty; + } + + + void procAdds() + { + foreach( a; m_add ) + { + if( a.ty == Add.Type.DG ) + m_dgs ~= a.dg; + else + m_fns ~= a.fn; + } + m_add.length = 0; + } + + + SlotDg[] m_dgs; + SlotFn[] m_fns; + Add[] m_add; + bool m_blk; +} + + +debug( UnitTest ) +{ + unittest + { + class Button + { + Signal!(Button) press; + } + + int count = 0; + + void wasPressedA( Button b ) + { + ++count; + } + + void wasPressedB( Button b ) + { + ++count; + } + + Button b = new Button; + + b.press.attach( &wasPressedA ); + b.press( b ); + assert( count == 1 ); + + count = 0; + b.press.attach( &wasPressedB ); + b.press( b ); + assert( count == 2 ); + + count = 0; + b.press.attach( &wasPressedA ); + b.press( b ); + assert( count == 2 ); + + count = 0; + b.press.detach( &wasPressedB ); + b.press( b ); + assert( count == 1 ); + + count = 0; + b.press.detach( &wasPressedA ); + b.press( b ); + assert( count == 0 ); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/core/Thread.di --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/core/Thread.di Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,746 @@ +// D import file generated from 'core/Thread.d' +module tango.core.Thread; +version = StackGrowsDown; +public +{ +} +private +{ + import tango.core.Exception; + extern (C) +{ + void* rt_stackBottom(); +} + extern (C) +{ + void* rt_stackTop(); +} + void* getStackBottom() +{ +return rt_stackBottom(); +} + void* getStackTop(); +} +version (Win32) +{ + private +{ + import tango.stdc.stdint; + import tango.sys.win32.UserGdi; + const +{ + DWORD TLS_OUT_OF_INDEXES = -1u; +} + extern (Windows) +{ + alias uint(* btex_fptr)(void*); +} + extern (C) +{ + uintptr_t _beginthreadex(void*, uint, btex_fptr, void*, uint, uint*); +} + extern (Windows) +{ + uint thread_entryPoint(void* arg); +} + HANDLE GetCurrentThreadHandle() +{ +const uint DUPLICATE_SAME_ACCESS = 2; +HANDLE curr = GetCurrentThread(); +HANDLE proc = GetCurrentProcess(); +HANDLE hndl; +DuplicateHandle(proc,curr,proc,&hndl,0,TRUE,DUPLICATE_SAME_ACCESS); +return hndl; +} +} +} +else +{ + version (Posix) +{ + private +{ + import tango.stdc.posix.semaphore; + import tango.stdc.posix.pthread; + import tango.stdc.posix.signal; + import tango.stdc.posix.time; + import tango.stdc.errno; + extern (C) +{ + int getErrno(); +} + version (GNU) +{ + import gcc.builtins; +} + extern (C) +{ + void* thread_entryPoint(void* arg); +} + sem_t suspendCount; + extern (C) +{ + void thread_suspendHandler(int sig); +} + extern (C) +{ + void thread_resumeHandler(int sig) +in +{ +assert(sig == SIGUSR2); +} +body +{ +} +} +} +} +else +{ + static assert(false,"Unknown threading implementation."); +} +} +class Thread +{ + this(void(* fn)(), size_t sz = 0) +in +{ +assert(fn); +} +body +{ +m_fn = fn; +m_sz = sz; +m_call = Call.FN; +m_curr = &m_main; +} + this(void delegate() dg, size_t sz = 0) +in +{ +assert(dg); +} +body +{ +m_dg = dg; +m_sz = sz; +m_call = Call.DG; +m_curr = &m_main; +} + final +{ + void start(); +} + final +{ + void join(bool rethrow = true); +} + final +{ + char[] name(); +} + final +{ + void name(char[] val); +} + final +{ + bool isDaemon(); +} + final +{ + void isDaemon(bool val); +} + final +{ + bool isRunning(); +} + static const +{ + int PRIORITY_MIN; +} + static const +{ + int PRIORITY_MAX; +} + final +{ + int priority(); +} + final +{ + void priority(int val); +} + static +{ + void sleep(double period); +} + static +{ + void yield(); +} + static +{ + Thread getThis(); +} + static +{ + Thread[] getAll(); +} + static +{ + int opApply(int delegate(ref Thread) dg); +} + static const +{ + uint LOCAL_MAX = 64; +} + static +{ + uint createLocal(); +} + static +{ + void deleteLocal(uint key); +} + static +{ + void* getLocal(uint key) +{ +return getThis().m_local[key]; +} +} + static +{ + void* setLocal(uint key, void* val) +{ +return getThis().m_local[key] = val; +} +} + static this(); + private +{ + this() +{ +m_call = Call.NO; +m_curr = &m_main; +} + final +{ + void run(); +} + private +{ + enum Call +{ +NO, +FN, +DG, +} + version (Win32) +{ + alias uint TLSKey; + alias uint ThreadAddr; +} +else +{ + version (Posix) +{ + alias pthread_key_t TLSKey; + alias pthread_t ThreadAddr; +} +} + static +{ + bool[LOCAL_MAX] sm_local; +} + static +{ + TLSKey sm_this; +} + void*[LOCAL_MAX] m_local; + version (Win32) +{ + HANDLE m_hndl; +} + ThreadAddr m_addr; + Call m_call; + char[] m_name; + union +{ +void(* m_fn)(); +void delegate() m_dg; +} + size_t m_sz; + version (Posix) +{ + bool m_isRunning; +} + bool m_isDaemon; + Object m_unhandled; + private +{ + static +{ + void setThis(Thread t); +} + private +{ + final +{ + void pushContext(Context* c) +in +{ +assert(!c.within); +} +body +{ +c.within = m_curr; +m_curr = c; +} +} + final +{ + void popContext() +in +{ +assert(m_curr && m_curr.within); +} +body +{ +Context* c = m_curr; +m_curr = c.within; +c.within = null; +} +} + final +{ + Context* topContext() +in +{ +assert(m_curr); +} +body +{ +return m_curr; +} +} + static +{ + struct Context +{ + void* bstack; + void* tstack; + Context* within; + Context* next; + Context* prev; +} +} + Context m_main; + Context* m_curr; + bool m_lock; + version (Win32) +{ + uint[8] m_reg; +} + private +{ + static +{ + Object slock() +{ +return Thread.classinfo; +} +} + static +{ + Context* sm_cbeg; +} + static +{ + size_t sm_clen; +} + static +{ + Thread sm_tbeg; +} + static +{ + size_t sm_tlen; +} + Thread prev; + Thread next; + static +{ + void add(Context* c); +} + static +{ + void remove(Context* c); +} + static +{ + void add(Thread t); +} + static +{ + void remove(Thread t); +} +} +} +} +} +} +} +extern (C) +{ + void thread_init(); +} +extern (C) +{ + void thread_attachThis(); +} +extern (C) +{ + void thread_detachThis() +{ +Thread.remove(Thread.getThis()); +} +} +extern (C) +{ + void thread_joinAll(); +} +private +{ + bool multiThreadedFlag = false; +} +extern (C) +{ + bool thread_needLock() +{ +return multiThreadedFlag; +} +} +private +{ + uint suspendDepth = 0; +} +extern (C) +{ + void thread_suspendAll(); +} +extern (C) +{ + void thread_resumeAll(); +} +private +{ + alias void delegate(void*, void*) scanAllThreadsFn; +} +extern (C) +{ + void thread_scanAll(scanAllThreadsFn scan, void* curStackTop = null); +} +template ThreadLocal(T) +{ +class ThreadLocal +{ + this(T def = T.init) +{ +m_def = def; +m_key = Thread.createLocal(); +} + T val() +{ +Wrap* wrap = cast(Wrap*)Thread.getLocal(m_key); +return wrap ? wrap.val : m_def; +} + T val(T newval) +{ +Wrap* wrap = cast(Wrap*)Thread.getLocal(m_key); +if (wrap is null) +{ +wrap = new Wrap; +Thread.setLocal(m_key,wrap); +} +wrap.val = newval; +return newval; +} + private +{ + struct Wrap +{ + T val; +} + T m_def; + uint m_key; +} +} +} +class ThreadGroup +{ + final +{ + Thread create(void(* fn)()); +} + final +{ + Thread create(void delegate() dg); +} + final +{ + void add(Thread t); +} + final +{ + void remove(Thread t); +} + final +{ + int opApply(int delegate(ref Thread) dg); +} + final +{ + void joinAll(bool rethrow = true); +} + private +{ + Thread[Thread] m_all; +} +} +private +{ + version (D_InlineAsm_X86) +{ + version (X86_64) +{ +} +else +{ + version (Win32) +{ + version = AsmX86_Win32; +} +else +{ + version (Posix) +{ + version = AsmX86_Posix; +} +} +} +} +else +{ + version (PPC) +{ + version (Posix) +{ + version = AsmPPC_Posix; +} +} +} + version (Posix) +{ + import tango.stdc.posix.unistd; + import tango.stdc.posix.sys.mman; + import tango.stdc.posix.stdlib; + version (AsmX86_Win32) +{ +} +else +{ + version (AsmX86_Posix) +{ +} +else +{ + version (AsmPPC_Posix) +{ +} +else +{ + import tango.stdc.posix.ucontext; +} +} +} +} + const +{ + size_t PAGESIZE; +} +} +static this(); +private +{ + extern (C) +{ + void fiber_entryPoint(); +} + version (AsmPPC_Posix) +{ + extern (C) +{ + void fiber_switchContext(void** oldp, void* newp); +} +} +else +{ + extern (C) +{ + void fiber_switchContext(void** oldp, void* newp); +} +} +} +class Fiber +{ + this(void(* fn)(), size_t sz = PAGESIZE) +in +{ +assert(fn); +} +body +{ +m_fn = fn; +m_call = Call.FN; +m_state = State.HOLD; +allocStack(sz); +initStack(); +} + this(void delegate() dg, size_t sz = PAGESIZE) +in +{ +assert(dg); +} +body +{ +m_dg = dg; +m_call = Call.DG; +m_state = State.HOLD; +allocStack(sz); +initStack(); +} + final +{ + void call(bool rethrow = true); +} + final +{ + void reset() +in +{ +assert(m_state == State.TERM); +assert(m_ctxt.tstack == m_ctxt.bstack); +} +body +{ +m_state = State.HOLD; +initStack(); +m_unhandled = null; +} +} + enum State +{ +HOLD, +EXEC, +TERM, +} + final +{ + State state() +{ +return m_state; +} +} + static +{ + void yield(); +} + static +{ + void yieldAndThrow(Object obj); +} + static +{ + Fiber getThis(); +} + static this(); + private +{ + this() +{ +m_call = Call.NO; +} + final +{ + void run(); +} + private +{ + enum Call +{ +NO, +FN, +DG, +} + Call m_call; + union +{ +void(* m_fn)(); +void delegate() m_dg; +} + bool m_isRunning; + Object m_unhandled; + State m_state; + private +{ + final +{ + void allocStack(size_t sz); +} + final +{ + void freeStack(); +} + final +{ + void initStack(); +} + Thread.Context* m_ctxt; + size_t m_size; + void* m_pmem; + static if(is(typeof(ucontext_t))) +{ + static +{ + ucontext_t sm_utxt = void; +} + ucontext_t m_utxt = void; + ucontext_t* m_ucur = null; +} + private +{ + static +{ + void setThis(Fiber f); +} + static +{ + Thread.TLSKey sm_this; +} + private +{ + final +{ + void switchIn(); +} + final +{ + void switchOut(); +} +} +} +} +} +} +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/core/Traits.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/core/Traits.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,219 @@ +/** + * The traits module defines tools useful for obtaining detailed type + * information at compile-time. + * + * Copyright: Copyright (C) 2005-2006 Sean Kelly. All rights reserved. + * License: BSD style: $(LICENSE) + * Authors: Sean Kelly + */ +module tango.core.Traits; + + +/** + * + */ +template isCharType( T ) +{ + const bool isCharType = is( T == char ) || + is( T == wchar ) || + is( T == dchar ); +} + + +/** + * + */ +template isSignedIntegerType( T ) +{ + const bool isSignedIntegerType = is( T == byte ) || + is( T == short ) || + is( T == int ) || + is( T == long )/+|| + is( T == cent )+/; +} + + +/** + * + */ +template isUnsignedIntegerType( T ) +{ + const bool isUnsignedIntegerType = is( T == ubyte ) || + is( T == ushort ) || + is( T == uint ) || + is( T == ulong )/+|| + is( T == ucent )+/; +} + + +/** + * + */ +template isIntegerType( T ) +{ + const bool isIntegerType = isSignedIntegerType!(T) || + isUnsignedIntegerType!(T); +} + + +/** + * + */ +template isRealType( T ) +{ + const bool isRealType = is( T == float ) || + is( T == double ) || + is( T == real ); +} + + +/** + * + */ +template isComplexType( T ) +{ + const bool isComplexType = is( T == cfloat ) || + is( T == cdouble ) || + is( T == creal ); +} + + +/** + * + */ +template isImaginaryType( T ) +{ + const bool isImaginaryType = is( T == ifloat ) || + is( T == idouble ) || + is( T == ireal ); +} + + +/** + * + */ +template isFloatingPointType( T ) +{ + const bool isFloatingPointType = isRealType!(T) || + isComplexType!(T) || + isImaginaryType!(T); +} + + +/** + * + */ +template isPointerType( T ) +{ + const bool isPointerType = is( typeof(*T) ); +} + + +/** + * + */ +template isReferenceType( T ) +{ + + const bool isReferenceType = isPointerType!(T) || + is( T == class ) || + is( T == interface ) || + is( T == delegate ); +} + + +/** + * + */ +template isDynamicArrayType( T ) +{ + const bool isDynamicArrayType = is( typeof(T.init[0])[] == T ); +} + + +/** + * + */ +template isStaticArrayType( T ) +{ + const bool isStaticArrayType = is( typeof(T.init)[(T).sizeof / typeof(T.init).sizeof] == T ); +} + + +/** + * + */ +private template isAssocArrayType( T ) +{ + const bool isAssocArrayType = is( typeof(T.init.values[0])[typeof(T.init.keys[0])] == T ); +} + + +/** + * + */ +template isCallableType( T ) +{ + const bool isCallableType = is( T == function ) || + is( typeof(*T) == function ) || + is( T == delegate ) || + is( typeof(T.opCall) == function ); +} + + +/** + * + */ +template ReturnTypeOf( Fn ) +{ + static if( is( Fn Ret == return ) ) + alias Ret ReturnTypeOf; + else + static assert( false, "Argument has no return type." ); +} + + +/** + * + */ +template ReturnTypeOf( alias fn ) +{ + alias ReturnTypeOf!(typeof(fn)) ReturnTypeOf; +} + + +/** + * + */ +template ParameterTupleOf( Fn ) +{ + static if( is( Fn Params == function ) ) + alias Params ParameterTupleOf; + else static if( is( Fn Params == delegate ) ) + alias ParameterTupleOf!(Params) ParameterTupleOf; + else static if( is( Fn Params == Params* ) ) + alias ParameterTupleOf!(Params) ParameterTupleOf; + else + static assert( false, "Argument has no parameters." ); +} + + +/** + * + */ +template ParameterTupleOf( alias fn ) +{ + alias ParameterTupleOf!(typeof(fn)) ParameterTupleOf; +} + + +/** + * + */ +template BaseTypeTupleOf( T ) +{ + static if( is( T Base == super ) ) + alias Base BaseTypeTupleOf; + else + static assert( false, "Argument is not a class or interface." ); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/core/Tuple.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/core/Tuple.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,223 @@ +/** + * The tuple module defines a template struct used for arbitrary data grouping. + * + * Copyright: Copyright (C) 2005-2006 Sean Kelly. All rights reserved. + * License: BSD style: $(LICENSE) + * Authors: Walter Bright, Sean Kelly + */ +module tango.core.Tuple; + + +/** + * A Tuple is a an aggregate of typed values. Tuples are useful for returning + * a set of values from a function or for passing a set of parameters to a + * function. + * + * NOTE: Since the transition from user-defined to built-in tuples, the ability + * to return tuples from a function has been lost. Until this issue is + * addressed within the language, tuples must be enclosed in a struct + * if they are to be returned from a function. + * + * Example: + * ---------------------------------------------------------------------- + * + * alias Tuple!(int, real) T1; + * alias Tuple!(int, long) T2; + * struct Wrap( Vals... ) + * { + * Vals val; + * } + * + * Wrap!(T2) func( T1 val ) + * { + * Wrap!(T2) ret; + * ret.val[0] = val[0]; + * ret.val[1] = val[0] * cast(long) val[1]; + * return ret; + * } + * + * ---------------------------------------------------------------------- + * + * This is the original tuple example, and demonstates what should be possible + * with tuples. Hopefully, language support will be added for this feature + * soon. + * + * Example: + * ---------------------------------------------------------------------- + * + * alias Tuple!(int, real) T1; + * alias Tuple!(int, long) T2; + * + * T2 func( T1 val ) + * { + * T2 ret; + * ret[0] = val[0]; + * ret[1] = val[0] * cast(long) val[1]; + * return ret; + * } + * + * + * // tuples may be composed + * alias Tuple!(int) IntTuple; + * alias Tuple!(IntTuple, long) RetTuple; + * + * // tuples are equivalent to a set of function parameters of the same type + * RetTuple t = func( 1, 2.3 ); + * + * ---------------------------------------------------------------------- + */ +template Tuple( TList... ) +{ + alias TList Tuple; +} + + +/** + * Returns the index of the first occurrence of T in TList or Tlist.length if + * not found. + */ +template IndexOf( T, TList... ) +{ + static if( TList.length == 0 ) + const size_t IndexOf = 0; + else static if( is( T == TList[0] ) ) + const size_t IndexOf = 0; + else + const size_t IndexOf = 1 + IndexOf!( T, TList[1 .. $] ); +} + + +/** + * Returns a Tuple with the first occurrence of T removed from TList. + */ +template Remove( T, TList... ) +{ + static if( TList.length == 0 ) + alias TList Remove; + else static if( is( T == TList[0] ) ) + alias TList[1 .. $] Remove; + else + alias Tuple!( TList[0], Remove!( T, TList[1 .. $] ) ) Remove; +} + + +/** + * Returns a Tuple with all occurrences of T removed from TList. + */ +template RemoveAll( T, TList... ) +{ + static if( TList.length == 0 ) + alias TList RemoveAll; + else static if( is( T == TList[0] ) ) + alias .RemoveAll!( T, TList[1 .. $] ) RemoveAll; + else + alias Tuple!( TList[0], .RemoveAll!( T, TList[1 .. $] ) ) RemoveAll; +} + + +/** + * Returns a Tuple with the first offuccrence of T replaced with U. + */ +template Replace( T, U, TList... ) +{ + static if( TList.length == 0 ) + alias TList Replace; + else static if( is( T == TList[0] ) ) + alias Tuple!(U, TList[1 .. $]) Replace; + else + alias Tuple!( TList[0], Replace!( T, U, TList[1 .. $] ) ) Replace; +} + + +/** + * Returns a Tuple with all occurrences of T replaced with U. + */ +template ReplaceAll( T, U, TList... ) +{ + static if( TList.length == 0 ) + alias TList ReplaceAll; + else static if( is( T == TList[0] ) ) + alias Tuple!( U, ReplaceAll!( T, U, TList[1 .. $] ) ) ReplaceAll; + else + alias Tuple!( TList[0], ReplaceAll!( T, U, TList[1 .. $] ) ) ReplaceAll; +} + + +/** + * Returns a Tuple with the types from TList declared in reverse order. + */ +template Reverse( TList... ) +{ + static if( TList.length == 0 ) + alias TList Reverse; + else + alias Tuple!( Reverse!( TList[1 .. $]), TList[0] ) Reverse; +} + + +/** + * Returns a Tuple with all duplicate types removed. + */ +template Unique( TList... ) +{ + static if( TList.length == 0 ) + alias TList Unique; + else + alias Tuple!( TList[0], + Unique!( RemoveAll!( TList[0], + TList[1 .. $] ) ) ) Unique; +} + + +/** + * Returns the type from TList that is the most derived from T. If no such + * type is found then T will be returned. + */ +template MostDerived( T, TList... ) +{ + static if( TList.length == 0 ) + alias T MostDerived; + else static if( is( TList[0] : T ) ) + alias MostDerived!( TList[0], TList[1 .. $] ) MostDerived; + else + alias MostDerived!( T, TList[1 .. $] ) MostDerived; +} + + +/** + * Returns a Tuple with the types sorted so that the most derived types are + * ordered before the remaining types. + */ +template DerivedToFront( TList... ) +{ + static if( TList.length == 0 ) + alias TList DerivedToFront; + else + alias Tuple!( MostDerived!( TList[0], TList[1 .. $] ), + DerivedToFront!( ReplaceAll!( MostDerived!( TList[0], TList[1 .. $] ), + TList[0], + TList[1 .. $] ) ) ) DerivedToFront; +} + + +/* + * A brief test of the above templates. + */ +static assert( 0 == IndexOf!(int, int, float, char)); +static assert( 1 == IndexOf!(float, int, float, char)); +static assert( 3 == IndexOf!(double, int, float, char)); + +static assert( is( Remove!(int, int, float, int) == Remove!(void, float, int) ) ); +static assert( is( RemoveAll!(int, int, float, int) == Remove!(void, float) ) ); +static assert( is( Remove!(float, int, float, int) == Remove!(void, int, int) ) ); +static assert( is( Remove!(double, int, float, int) == Remove!(void, int, float, int) ) ); + +static assert( is( Replace!(int, char, int, float, int) == Remove!(void, char, float, int) ) ); +static assert( is( ReplaceAll!(int, char, int, float, int) == Remove!(void, char, float, char) ) ); +static assert( is( Replace!(float, char, int, float, int) == Remove!(void, int, char, int) ) ); +static assert( is( Replace!(double, char, int, float, int) == Remove!(void, int, float, int) ) ); + +static assert( is( Reverse!(float, float[], double, char, int) == + Unique!(int, char, double, float[], char, int, float, double) ) ); + +static assert( is( MostDerived!(int, long, short) == short ) ); diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/core/Vararg.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/core/Vararg.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,92 @@ +/** + * The vararg module is intended to facilitate vararg manipulation in D. + * It should be interface compatible with the C module "stdarg," and the + * two modules may share a common implementation if possible (as is done + * here). + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Hauke Duden, Walter Bright + */ +module tango.core.Vararg; + + +version( GNU ) +{ + public import std.stdarg; +} +else +{ + /** + * The base vararg list type. + */ + alias void* va_list; + + + template va_start( T ) + { + /** + * This function initializes the supplied argument pointer for subsequent + * use by va_arg and va_end. + * + * Params: + * ap = The argument pointer to initialize. + * paramn = The identifier of the rightmost parameter in the function + * parameter list. + */ + void va_start( out va_list ap, inout T parmn ) + { + ap = cast(va_list) ( cast(void*) &parmn + ( ( T.sizeof + int.sizeof - 1 ) & ~( int.sizeof - 1 ) ) ); + } + } + + + template va_arg( T ) + { + /** + * This function returns the next argument in the sequence referenced by + * the supplied argument pointer. The argument pointer will be adjusted + * to point to the next arggument in the sequence. + * + * Params: + * ap = The argument pointer. + * + * Returns: + * The next argument in the sequence. The result is undefined if ap + * does not point to a valid argument. + */ + T va_arg( inout va_list ap ) + { + T arg = *cast(T*) ap; + ap = cast(va_list) ( cast(void*) ap + ( ( T.sizeof + int.sizeof - 1 ) & ~( int.sizeof - 1 ) ) ); + return arg; + } + } + + + /** + * This function cleans up any resources allocated by va_start. It is + * currently a no-op and exists mostly for syntax compatibility with + * the variadric argument functions for C. + * + * Params: + * ap = The argument pointer. + */ + void va_end( va_list ap ) + { + + } + + + /** + * This function copied the argument pointer src to dst. + * + * Params: + * src = The source pointer. + * dst = The destination pointer. + */ + void va_copy( out va_list dst, va_list src ) + { + dst = src; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/core/Variant.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/core/Variant.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,677 @@ +/** + * The variant module contains a variant, or polymorphic type. + * + * Copyright: Copyright (C) 2005-2007 The Tango Team. All rights reserved. + * License: BSD style: $(LICENSE) + * Authors: Daniel Keep, Sean Kelly + */ +module tango.core.Variant; + +private import tango.core.Exception : TracedException; +private import tango.core.Vararg : va_list; + +private +{ + template maxT(uint a, uint b) + { + const maxT = (a > b) ? a : b; + } + + struct AtomicTypes + { + union + { + bool _bool; + char _char; + wchar _wchar; + dchar _dchar; + byte _byte; + short _short; + int _int; + long _long; + ubyte _ubyte; + ushort _ushort; + uint _uint; + ulong _ulong; + float _float; + double _double; + real _real; + ifloat _ifloat; + idouble _idouble; + ireal _ireal; + void* ptr; + void[] arr; + Object obj; + ubyte[maxT!(_real.sizeof,arr.sizeof)] data; + } + } + + template isAtomicType(T) + { + static if( is( T == bool ) + || is( T == char ) + || is( T == wchar ) + || is( T == dchar ) + || is( T == byte ) + || is( T == short ) + || is( T == int ) + || is( T == long ) + || is( T == ubyte ) + || is( T == ushort ) + || is( T == uint ) + || is( T == ulong ) + || is( T == float ) + || is( T == double ) + || is( T == real ) + || is( T == ifloat ) + || is( T == idouble ) + || is( T == ireal ) ) + const isAtomicType = true; + else + const isAtomicType = false; + } + + template isArray(T) + { + static if( is( T U : U[] ) ) + const isArray = true; + else + const isArray = false; + } + + template isPointer(T) + { + static if( is( T U : U* ) ) + const isPointer = true; + else + const isPointer = false; + } + + template isObject(T) + { + static if( is( T : Object ) ) + const isObject = true; + else + const isObject = false; + } + + template isStaticArray(T) + { + static if( is( typeof(T.init)[(T).sizeof / typeof(T.init).sizeof] == T ) ) + const isStaticArray = true; + else + const isStaticArray = false; + } + + bool isAny(T,argsT...)(T v, argsT args) + { + foreach( arg ; args ) + if( v is arg ) return true; + return false; + } + + const tibool = typeid(bool); + const tichar = typeid(char); + const tiwchar = typeid(wchar); + const tidchar = typeid(dchar); + const tibyte = typeid(byte); + const tishort = typeid(short); + const tiint = typeid(int); + const tilong = typeid(long); + const tiubyte = typeid(ubyte); + const tiushort = typeid(ushort); + const tiuint = typeid(uint); + const tiulong = typeid(ulong); + const tifloat = typeid(float); + const tidouble = typeid(double); + const tireal = typeid(real); + const tiifloat = typeid(ifloat); + const tiidouble = typeid(idouble); + const tiireal = typeid(ireal); + + bool canImplicitCastTo(dsttypeT)(TypeInfo srctype) + { + static if( is( dsttypeT == char ) ) + return isAny(srctype, tibool, tiubyte); + + else static if( is( dsttypeT == wchar ) ) + return isAny(srctype, tibool, tiubyte, tiushort, tichar); + + else static if( is( dsttypeT == dchar ) ) + return isAny(srctype, tibool, tiubyte, tiushort, tiuint, tichar, + tiwchar); + + else static if( is( dsttypeT == byte ) ) + return isAny(srctype, tibool); + + else static if( is( dsttypeT == ubyte ) ) + return isAny(srctype, tibool, tichar); + + else static if( is( dsttypeT == short ) ) + return isAny(srctype, tibool, tibyte, tiubyte, tichar); + + else static if( is( dsttypeT == ushort ) ) + return isAny(srctype, tibool, tibyte, tiubyte, tichar, tiwchar); + + else static if( is( dsttypeT == int ) ) + return isAny(srctype, tibool, tibyte, tiubyte, tishort, tiushort, + tichar, tiwchar); + + else static if( is( dsttypeT == uint ) ) + return isAny(srctype, tibool, tibyte, tiubyte, tishort, tiushort, + tichar, tiwchar, tidchar); + + else static if( is( dsttypeT == long ) || is( dsttypeT == ulong ) ) + return isAny(srctype, tibool, tibyte, tiubyte, tishort, tiushort, + tiint, tiuint, tichar, tiwchar, tidchar); + + else static if( is( dsttypeT == float ) ) + return isAny(srctype, tibool, tibyte, tiubyte); + + else static if( is( dsttypeT == double ) ) + return isAny(srctype, tibool, tibyte, tiubyte, tifloat); + + else static if( is( dsttypeT == real ) ) + return isAny(srctype, tibool, tibyte, tiubyte, tifloat, tidouble); + + else static if( is( dsttypeT == idouble ) ) + return isAny(srctype, tiifloat); + + else static if( is( dsttypeT == ireal ) ) + return isAny(srctype, tiifloat, tiidouble); + + else + return false; + } + + template storageT(T) + { + static if( isStaticArray!(T) ) + alias typeof(T.dup) storageT; + else + alias T storageT; + } +} + +/** + * This exception is thrown whenever you attempt to get the value of a Variant + * without using a compatible type. + */ +class VariantTypeMismatchException : TracedException +{ + this(TypeInfo expected, TypeInfo got) + { + super("cannot convert "~expected.toString + ~" value to a "~got.toString); + } +} + +/** + * The Variant type is used to dynamically store values of different types at + * runtime. + * + * You can create a Variant using either the pseudo-constructor or direct + * assignment. + * + * ----- + * Variant v = Variant(42); + * v = "abc"; + * ----- + */ +struct Variant +{ + /** + * This pseudo-constructor is used to place a value into a new Variant. + * + * Params: + * value = The value you wish to put in the Variant. + * + * Returns: + * The new Variant. + */ + static Variant opCall(T)(T value) + { + Variant _this; + + static if( isStaticArray!(T) ) + _this = value.dup; + + else + _this = value; + + return _this; + } + + /** + * This operator allows you to assign arbitrary values directly into an + * existing Variant. + * + * Params: + * value = The value you wish to put in the Variant. + * + * Returns: + * The new value of the assigned-to variant. + */ + Variant opAssign(T)(T value) + { + static if( isStaticArray!(T) ) + { + return (*this = value.dup); + } + else + { + type = typeid(T); + + static if( isAtomicType!(T) ) + { + mixin("this.value._"~T.stringof~"=value;"); + } + else static if( isArray!(T) ) + { + this.value.arr = (cast(void*)value.ptr) + [0 .. value.length]; + } + else static if( isPointer!(T) ) + { + this.value.ptr = cast(void*)T; + } + else static if( isObject!(T) ) + { + this.value.obj = T; + } + else + { + if( T.sizeof <= this.value.data.length ) + { + this.value.data[0..T.sizeof] = + (cast(ubyte*)&value)[0..T.sizeof]; + } + else + { + auto buffer = (cast(ubyte*)&value)[0..T.sizeof].dup; + this.value.arr = cast(void[])buffer; + } + } + return *this; + } + } + + /** + * This member can be used to determine if the value stored in the Variant + * is of the specified type. Note that this comparison is exact: it does + * not take implicit casting rules into account. + * + * Returns: + * true if the Variant contains a value of type T, false otherwise. + */ + bool isA(T)() + { + return cast(bool)(typeid(T) is type); + } + + /** + * This member can be used to determine if the value stored in the Variant + * is of the specified type. This comparison attempts to take implicit + * conversion rules into account. + * + * Returns: + * true if the Variant contains a value of type T, or if the Variant + * contains a value that can be implicitly cast to type T; false + * otherwise. + */ + bool isImplicitly(T)() + { + return ( cast(bool)(typeid(T) is type) + || canImplicitCastTo!(T)(type) ); + } + + /** + * This determines whether the Variant has an assigned value or not. It + * is simply short-hand for calling the isA member with a type of void. + * + * Returns: + * true if the Variant does not contain a value, false otherwise. + */ + bool isEmpty() + { + return isA!(void); + } + + /** + * This member will clear the Variant, returning it to an empty state. + */ + void clear() + { + _type = typeid(void); + value = value.init; + } + + /** + * This is the primary mechanism for extracting a value from a Variant. + * Given a destination type S, it will attempt to extract the value of the + * Variant into that type. If the value contained within the Variant + * cannot be implicitly cast to the given type S, it will throw an + * exception. + * + * You can check to see if this operation will fail by calling the + * isImplicitly member with the type S. + * + * Returns: + * The value stored within the Variant. + */ + storageT!(S) get(S)() + { + alias storageT!(S) T; + + if( type !is typeid(T) + // Let D do runtime check itself + && !isObject!(T) + // Allow implicit upcasts + && !canImplicitCastTo!(T)(type) + ) + throw new VariantTypeMismatchException(type,typeid(T)); + + static if( isAtomicType!(T) ) + { + if( type is typeid(T) ) + { + return mixin("this.value._"~T.stringof); + } + else + { + if( type is tibool ) return cast(T)this.value._bool; + else if( type is tichar ) return cast(T)this.value._char; + else if( type is tiwchar ) return cast(T)this.value._wchar; + else if( type is tidchar ) return cast(T)this.value._dchar; + else if( type is tibyte ) return cast(T)this.value._byte; + else if( type is tishort ) return cast(T)this.value._short; + else if( type is tiint ) return cast(T)this.value._int; + else if( type is tilong ) return cast(T)this.value._long; + else if( type is tiubyte ) return cast(T)this.value._ubyte; + else if( type is tiushort ) return cast(T)this.value._ushort; + else if( type is tiuint ) return cast(T)this.value._uint; + else if( type is tiulong ) return cast(T)this.value._ulong; + else if( type is tifloat ) return cast(T)this.value._float; + else if( type is tidouble ) return cast(T)this.value._double; + else if( type is tireal ) return cast(T)this.value._real; + else if( type is tiifloat ) return cast(T)this.value._ifloat; + else if( type is tiidouble ) return cast(T)this.value._idouble; + else if( type is tiireal ) return cast(T)this.value._ireal; + else + throw new VariantTypeMismatchException(type,typeid(T)); + } + } + else static if( isArray!(T) ) + { + return (cast(typeof(T[0])*)this.value.arr.ptr) + [0 .. this.value.arr.length]; + } + else static if( isPointer!(T) ) + { + return cast(T)this.value.ptr; + } + else static if( isObject!(T) ) + { + return cast(T)this.value.obj; + } + else + { + if( T.sizeof <= this.value.data.length ) + { + T result; + (cast(ubyte*)&result)[0..T.sizeof] = + this.value.data[0..T.sizeof]; + return result; + } + else + { + T result; + (cast(ubyte*)&result)[0..T.sizeof] = + (cast(ubyte[])this.value.arr)[0..T.sizeof]; + return result; + } + } + assert(false); + } + + /** + * The following operator overloads are defined for the sake of + * convenience. It is important to understand that they do not allow you + * to use a Variant as both the left-hand and right-hand sides of an + * expression. One side of the operator must be a concrete type in order + * for the Variant to know what code to generate. + */ + typeof(T+T) opAdd(T)(T rhs) { return get!(T) + rhs; } + typeof(T+T) opAdd_r(T)(T lhs) { return lhs + get!(T); } /// ditto + typeof(T-T) opSub(T)(T rhs) { return get!(T) - rhs; } /// ditto + typeof(T-T) opSub_r(T)(T lhs) { return lhs - get!(T); } /// ditto + typeof(T*T) opMul(T)(T rhs) { return get!(T) * rhs; } /// ditto + typeof(T*T) opMul_r(T)(T lhs) { return lhs * get!(T); } /// ditto + typeof(T/T) opDiv(T)(T rhs) { return get!(T) / rhs; } /// ditto + typeof(T/T) opDiv_r(T)(T lhs) { return lhs / get!(T); } /// ditto + typeof(T%T) opMod(T)(T rhs) { return get!(T) % rhs; } /// ditto + typeof(T%T) opMod_r(T)(T lhs) { return lhs % get!(T); } /// ditto + typeof(T&T) opAnd(T)(T rhs) { return get!(T) & rhs; } /// ditto + typeof(T&T) opAnd_r(T)(T lhs) { return lhs & get!(T); } /// ditto + typeof(T|T) opOr(T)(T rhs) { return get!(T) | rhs; } /// ditto + typeof(T|T) opOr_r(T)(T lhs) { return lhs | get!(T); } /// ditto + typeof(T^T) opXor(T)(T rhs) { return get!(T) ^ rhs; } /// ditto + typeof(T^T) opXor_r(T)(T lhs) { return lhs ^ get!(T); } /// ditto + typeof(T<>T) opShr(T)(T rhs) { return get!(T) >> rhs; } /// ditto + typeof(T>>T) opShr_r(T)(T lhs) { return lhs >> get!(T); } /// ditto + typeof(T>>>T) opUShr(T)(T rhs) { return get!(T) >>> rhs; } /// ditto + typeof(T>>>T) opUShr_r(T)(T lhs){ return lhs >>> get!(T); } /// ditto + typeof(T~T) opCat(T)(T rhs) { return get!(T) ~ rhs; } /// ditto + typeof(T~T) opCat_r(T)(T lhs) { return lhs ~ get!(T); } /// ditto + + Variant opAddAssign(T)(T value) { return (*this = get!(T) + value); } /// ditto + Variant opSubAssign(T)(T value) { return (*this = get!(T) - value); } /// ditto + Variant opMulAssign(T)(T value) { return (*this = get!(T) * value); } /// ditto + Variant opDivAssign(T)(T value) { return (*this = get!(T) / value); } /// ditto + Variant opModAssign(T)(T value) { return (*this = get!(T) % value); } /// ditto + Variant opAndAssign(T)(T value) { return (*this = get!(T) & value); } /// ditto + Variant opOrAssign(T)(T value) { return (*this = get!(T) | value); } /// ditto + Variant opXorAssign(T)(T value) { return (*this = get!(T) ^ value); } /// ditto + Variant opShlAssign(T)(T value) { return (*this = get!(T) << value); } /// ditto + Variant opShrAssign(T)(T value) { return (*this = get!(T) >> value); } /// ditto + Variant opUShrAssign(T)(T value){ return (*this = get!(T) >>> value); } /// ditto + Variant opCatAssign(T)(T value) { return (*this = get!(T) ~ value); } /// ditto + + /** + * The following operators can be used with Variants on both sides. Note + * that these operators do not follow the standard rules of + * implicit conversions. + */ + int opEquals(T)(T rhs) + { + static if( is( T == Variant ) ) + return opEqualsVariant(rhs); + else + return get!(T) == rhs; + } + + /// ditto + int opCmp(T)(T rhs) + { + static if( is( T == Variant ) ) + return opCmpVariant(rhs); + else + { + auto lhs = get!(T); + return (lhs < rhs) ? -1 : (lhs == rhs) ? 0 : 1; + } + } + + /// ditto + hash_t toHash() + { + return type.getHash(data.ptr); + } + + /** + * Performs "stringification" of the value stored within the Variant. In + * the case of the Variant having no assigned value, it will return the + * string "Variant.init". + * + * Returns: + * The string representation of the value contained within the Variant. + */ + char[] toString() + { + return type.toString; + } + + /** + * This can be used to retrieve the TypeInfo for the currently stored + * value. + */ + TypeInfo type() + { + return _type; + } + +private: + TypeInfo _type = typeid(void); + AtomicTypes value; + + TypeInfo type(TypeInfo v) + { + return (_type = v); + } + + int opEqualsVariant(Variant rhs) + { + if( type != rhs.type ) return false; + return cast(bool) type.equals(data.ptr, rhs.data.ptr); + } + + int opCmpVariant(Variant rhs) + { + if( type != rhs.type ) + throw new VariantTypeMismatchException(type, rhs.type); + return type.compare(data.ptr, rhs.data.ptr); + } + + void[] data() + { + if( type.tsize <= value.data.length ) + return cast(void[])(value.data); + else + return value.arr; + } +} + +debug( UnitTest ) +{ + unittest + { + Variant v; + assert( v.isA!(void), v.type.toString ); + assert( v.isEmpty, v.type.toString ); + + v = 42; + assert( v.isA!(int), v.type.toString ); + assert( v.isImplicitly!(long), v.type.toString ); + assert( v.isImplicitly!(ulong), v.type.toString ); + assert( !v.isImplicitly!(uint), v.type.toString ); + assert( v.get!(int) == 42 ); + assert( v.get!(long) == 42L ); + assert( v.get!(ulong) == 42uL ); + + v.clear; + assert( v.isA!(void), v.type.toString ); + assert( v.isEmpty, v.type.toString ); + + v = "Hello, World!"c; + assert( v.isA!(char[]), v.type.toString ); + assert( !v.isImplicitly!(wchar[]), v.type.toString ); + assert( v.get!(char[]) == "Hello, World!" ); + + v = [1,2,3,4,5]; + assert( v.isA!(int[]), v.type.toString ); + assert( v.get!(int[]) == [1,2,3,4,5] ); + + v = 3.1413; + assert( v.isA!(double), v.type.toString ); + assert( v.isImplicitly!(real), v.type.toString ); + assert( !v.isImplicitly!(float), v.type.toString ); + assert( v.get!(double) == 3.1413 ); + + auto u = Variant(v); + assert( u.isA!(double), u.type.toString ); + assert( u.get!(double) == 3.1413 ); + + v = 38; + assert( v + 4 == 42 ); + assert( 4 + v == 42 ); + assert( v - 4 == 34 ); + assert( 4 - v == -34 ); + assert( v * 2 == 76 ); + assert( 2 * v == 76 ); + assert( v / 2 == 19 ); + assert( 2 / v == 0 ); + assert( v % 2 == 0 ); + assert( 2 % v == 2 ); + assert( (v & 6) == 6 ); + assert( (6 & v) == 6 ); + assert( (v | 9) == 47 ); + assert( (9 | v) == 47 ); + assert( (v ^ 5) == 35 ); + assert( (5 ^ v) == 35 ); + assert( v << 1 == 76 ); + assert( 1 << Variant(2) == 4 ); + assert( v >> 1 == 19 ); + assert( 4 >> Variant(2) == 1 ); + + assert( Variant("abc") ~ "def" == "abcdef" ); + assert( "abc" ~ Variant("def") == "abcdef" ); + + v = 38; v += 4; assert( v == 42 ); + v = 38; v -= 4; assert( v == 34 ); + v = 38; v *= 2; assert( v == 76 ); + v = 38; v /= 2; assert( v == 19 ); + v = 38; v %= 2; assert( v == 0 ); + v = 38; v &= 6; assert( v == 6 ); + v = 38; v |= 9; assert( v == 47 ); + v = 38; v ^= 5; assert( v == 35 ); + v = 38; v <<= 1; assert( v == 76 ); + v = 38; v >>= 1; assert( v == 19 ); + + v = "abc"; v ~= "def"; assert( v == "abcdef" ); + + assert( Variant(0) < Variant(42) ); + assert( Variant(42) > Variant(0) ); + assert( Variant(21) == Variant(21) ); + assert( Variant(0) != Variant(42) ); + assert( Variant("bar") == Variant("bar") ); + assert( Variant("foo") != Variant("bar") ); + { + auto v1 = Variant(42); + auto v2 = Variant("foo"); + auto v3 = Variant(1+2.0i); + + int[Variant] hash; + hash[v1] = 0; + hash[v2] = 1; + hash[v3] = 2; + + assert( hash[v1] == 0 ); + assert( hash[v2] == 1 ); + assert( hash[v3] == 2 ); + } + { + int[char[]] hash; + hash["a"] = 1; + hash["b"] = 2; + hash["c"] = 3; + Variant vhash = hash; + + assert( vhash.get!(int[char[]])["a"] == 1 ); + assert( vhash.get!(int[char[]])["b"] == 2 ); + assert( vhash.get!(int[char[]])["c"] == 3 ); + } + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/core/Version.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/core/Version.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,19 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Jan 2007: Initial release + + author: Kris + + Exposes the library version number + +*******************************************************************************/ + +module tango.core.Version; + +public const Tango = 0.994f; + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/core/sync/Barrier.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/core/sync/Barrier.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,148 @@ +/** + * The barrier module provides a primitive for synchronizing the progress of + * a group of threads. + * + * Copyright: Copyright (C) 2005-2006 Sean Kelly. All rights reserved. + * License: BSD style: $(LICENSE) + * Authors: Sean Kelly + */ +module tango.core.sync.Barrier; + + +public import tango.core.Exception : SyncException; +private import tango.core.sync.Condition; +private import tango.core.sync.Mutex; + +version( Win32 ) +{ + private import tango.sys.win32.UserGdi; +} +else version( Posix ) +{ + private import tango.stdc.errno; + private import tango.stdc.posix.pthread; +} + + +//////////////////////////////////////////////////////////////////////////////// +// Barrier +// +// void wait(); +//////////////////////////////////////////////////////////////////////////////// + + +/** + * This class represents a barrier across which threads may only travel in + * groups of a specific size. + */ +class Barrier +{ + //////////////////////////////////////////////////////////////////////////// + // Initialization + //////////////////////////////////////////////////////////////////////////// + + + /** + * Initializes a barrier object which releases threads in groups of limit + * in size. + * + * Params: + * limit = The number of waiting threads to release in unison. + * + * Throws: + * SyncException on error. + */ + this( uint limit ) + in + { + assert( limit > 0 ); + } + body + { + m_lock = new Mutex; + m_cond = new Condition( m_lock ); + m_group = 0; + m_limit = limit; + m_count = limit; + } + + + //////////////////////////////////////////////////////////////////////////// + // General Actions + //////////////////////////////////////////////////////////////////////////// + + + /** + * Wait for the pre-determined number of threads and then proceed. + * + * Throws: + * SyncException on error. + */ + void wait() + { + synchronized( m_lock ) + { + uint group = m_group; + + if( --m_count == 0 ) + { + m_group++; + m_count = m_limit; + m_cond.notifyAll(); + } + while( group == m_group ) + m_cond.wait(); + } + } + + +private: + Mutex m_lock; + Condition m_cond; + uint m_group; + uint m_limit; + uint m_count; +} + + +//////////////////////////////////////////////////////////////////////////////// +// Unit Tests +//////////////////////////////////////////////////////////////////////////////// + + +debug( UnitTest ) +{ + private import tango.core.Thread; + + + unittest + { + int numThreads = 10; + auto barrier = new Barrier( numThreads ); + auto synInfo = new Object; + int numReady = 0; + int numPassed = 0; + + void threadFn() + { + synchronized( synInfo ) + { + ++numReady; + } + barrier.wait(); + synchronized( synInfo ) + { + ++numPassed; + } + } + + auto group = new ThreadGroup; + + for( int i = 0; i < numThreads; ++i ) + { + group.create( &threadFn ); + } + group.joinAll(); + assert( numReady == numThreads && numPassed == numThreads ); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/core/sync/Condition.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/core/sync/Condition.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,560 @@ +/** + * The condition module provides a primitive for synchronized condition + * checking. + * + * Copyright: Copyright (C) 2005-2006 Sean Kelly. All rights reserved. + * License: BSD style: $(LICENSE) + * Authors: Sean Kelly + */ +module tango.core.sync.Condition; + + +public import tango.core.Exception : SyncException; +public import tango.core.sync.Mutex; + +version( Win32 ) +{ + private import tango.core.sync.Semaphore; + private import tango.sys.win32.UserGdi; +} +else version( Posix ) +{ + private import tango.core.sync.Config; + private import tango.stdc.errno; + private import tango.stdc.posix.pthread; + private import tango.stdc.posix.time; +} + + +//////////////////////////////////////////////////////////////////////////////// +// Condition +// +// void wait(); +// void notify(); +// void notifyAll(); +//////////////////////////////////////////////////////////////////////////////// + + +/** + * This class represents a condition variable as concieved by C.A.R. Hoare. As + * per Mesa type monitors however, "signal" has been replaced with "notify" to + * indicate that control is not transferred to the waiter when a notification + * is sent. + */ +class Condition +{ + //////////////////////////////////////////////////////////////////////////// + // Initialization + //////////////////////////////////////////////////////////////////////////// + + + /** + * Initializes a condition object which is associated with the supplied + * mutex object. + * + * Params: + * m = The mutex with which this condition will be associated. + * + * Throws: + * SyncException on error. + */ + this( Mutex m ) + { + version( Win32 ) + { + m_blockLock = CreateSemaphoreA( null, 1, 1, null ); + if( m_blockLock == m_blockLock.init ) + throw new SyncException( "Unable to initialize condition" ); + scope(failure) CloseHandle( m_blockLock ); + + m_blockQueue = CreateSemaphoreA( null, 0, int.max, null ); + if( m_blockQueue == m_blockQueue.init ) + throw new SyncException( "Unable to initialize condition" ); + scope(failure) CloseHandle( m_blockQueue ); + + InitializeCriticalSection( &m_unblockLock ); + m_assocMutex = m; + } + else version( Posix ) + { + m_mutexAddr = m.handleAddr(); + + int rc = pthread_cond_init( &m_hndl, null ); + if( rc ) + throw new SyncException( "Unable to initialize condition" ); + } + } + + + ~this() + { + version( Win32 ) + { + BOOL rc = CloseHandle( m_blockLock ); + assert( rc, "Unable to destroy condition" ); + rc = CloseHandle( m_blockQueue ); + assert( rc, "Unable to destroy condition" ); + DeleteCriticalSection( &m_unblockLock ); + } + else version( Posix ) + { + int rc = pthread_cond_destroy( &m_hndl ); + assert( !rc, "Unable to destroy condition" ); + } + } + + + //////////////////////////////////////////////////////////////////////////// + // General Actions + //////////////////////////////////////////////////////////////////////////// + + + /** + * Wait until notified. + * + * Throws: + * SyncException on error. + */ + void wait() + { + version( Win32 ) + { + timedWait( INFINITE ); + } + else version( Posix ) + { + int rc = pthread_cond_wait( &m_hndl, m_mutexAddr ); + if( rc ) + throw new SyncException( "Unable to wait for condition" ); + } + } + + + /** + * Suspends the calling thread until a notification occurs or until the + * supplied time period has elapsed. The supplied period may be up to a + * maximum of (uint.max - 1) milliseconds. + * + * Params: + * period = The time to wait, in seconds (fractional values are accepted). + * + * In: + * period must be less than (uint.max - 1) milliseconds. + * + * Returns: + * true if notified before the timeout and false if not. + * + * Throws: + * SyncException on error. + */ + bool wait( double period ) + in + { + // NOTE: The fractional value added to period is to correct fp error. + assert( period * 1000 + 0.1 < uint.max - 1 ); + } + body + { + version( Win32 ) + { + return timedWait( cast(uint)(period * 1000 + 0.1) ); + } + else version( Posix ) + { + timespec t; + + getTimespec( t ); + adjTimespec( t, period ); + int rc = pthread_cond_timedwait( &m_hndl, m_mutexAddr, &t ); + if( !rc ) + return true; + if( rc == ETIMEDOUT ) + return false; + throw new SyncException( "Unable to wait for condition" ); + } + } + + /** + * Notifies one waiter. + * + * Throws: + * SyncException on error. + */ + void notify() + { + version( Win32 ) + { + notify( false ); + } + else version( Posix ) + { + int rc = pthread_cond_signal( &m_hndl ); + if( rc ) + throw new SyncException( "Unable to notify condition" ); + } + } + + + /** + * Notifies all waiters. + * + * Throws: + * SyncException on error. + */ + void notifyAll() + { + version( Win32 ) + { + notify( true ); + } + else version( Posix ) + { + int rc = pthread_cond_broadcast( &m_hndl ); + if( rc ) + throw new SyncException( "Unable to notify condition" ); + } + } + + +private: + version( Win32 ) + { + bool timedWait( DWORD timeout ) + { + int numSignalsLeft; + int numWaitersGone; + DWORD rc; + + rc = WaitForSingleObject( m_blockLock, INFINITE ); + assert( rc == WAIT_OBJECT_0 ); + + m_numWaitersBlocked++; + + rc = ReleaseSemaphore( m_blockLock, 1, null ); + assert( rc ); + + m_assocMutex.unlock(); + scope(failure) m_assocMutex.lock(); + + rc = WaitForSingleObject( m_blockQueue, timeout ); + assert( rc == WAIT_OBJECT_0 || rc == WAIT_TIMEOUT ); + bool timedOut = (rc == WAIT_TIMEOUT); + + EnterCriticalSection( &m_unblockLock ); + scope(failure) LeaveCriticalSection( &m_unblockLock ); + + if( (numSignalsLeft = m_numWaitersToUnblock) != 0 ) + { + if ( timedOut ) + { + // timeout (or canceled) + if( m_numWaitersBlocked != 0 ) + { + m_numWaitersBlocked--; + // do not unblock next waiter below (already unblocked) + numSignalsLeft = 0; + } + else + { + // spurious wakeup pending!! + m_numWaitersGone = 1; + } + } + if( --m_numWaitersToUnblock == 0 ) + { + if( m_numWaitersBlocked != 0 ) + { + // open the gate + rc = ReleaseSemaphore( m_blockLock, 1, null ); + assert( rc ); + // do not open the gate below again + numSignalsLeft = 0; + } + else if( (numWaitersGone = m_numWaitersGone) != 0 ) + { + m_numWaitersGone = 0; + } + } + } + else if( ++m_numWaitersGone == int.max / 2 ) + { + // timeout/canceled or spurious event :-) + rc = WaitForSingleObject( m_blockLock, INFINITE ); + assert( rc == WAIT_OBJECT_0 ); + // something is going on here - test of timeouts? + m_numWaitersBlocked -= m_numWaitersGone; + rc = ReleaseSemaphore( m_blockLock, 1, null ); + assert( rc == WAIT_OBJECT_0 ); + m_numWaitersGone = 0; + } + + LeaveCriticalSection( &m_unblockLock ); + + if( numSignalsLeft == 1 ) + { + // better now than spurious later (same as ResetEvent) + for( ; numWaitersGone > 0; --numWaitersGone ) + { + rc = WaitForSingleObject( m_blockQueue, INFINITE ); + assert( rc == WAIT_OBJECT_0 ); + } + // open the gate + rc = ReleaseSemaphore( m_blockLock, 1, null ); + assert( rc ); + } + else if( numSignalsLeft != 0 ) + { + // unblock next waiter + rc = ReleaseSemaphore( m_blockQueue, 1, null ); + assert( rc ); + } + m_assocMutex.lock(); + return !timedOut; + } + + + void notify( bool all ) + { + DWORD rc; + + EnterCriticalSection( &m_unblockLock ); + scope(failure) LeaveCriticalSection( &m_unblockLock ); + + if( m_numWaitersToUnblock != 0 ) + { + if( m_numWaitersBlocked == 0 ) + { + LeaveCriticalSection( &m_unblockLock ); + return; + } + if( all ) + { + m_numWaitersToUnblock += m_numWaitersBlocked; + m_numWaitersBlocked = 0; + } + else + { + m_numWaitersToUnblock++; + m_numWaitersBlocked--; + } + LeaveCriticalSection( &m_unblockLock ); + } + else if( m_numWaitersBlocked > m_numWaitersGone ) + { + rc = WaitForSingleObject( m_blockLock, INFINITE ); + assert( rc == WAIT_OBJECT_0 ); + if( 0 != m_numWaitersGone ) + { + m_numWaitersBlocked -= m_numWaitersGone; + m_numWaitersGone = 0; + } + if( all ) + { + m_numWaitersToUnblock = m_numWaitersBlocked; + m_numWaitersBlocked = 0; + } + else + { + m_numWaitersToUnblock = 1; + m_numWaitersBlocked--; + } + LeaveCriticalSection( &m_unblockLock ); + rc = ReleaseSemaphore( m_blockQueue, 1, null ); + assert( rc ); + } + else + { + LeaveCriticalSection( &m_unblockLock ); + } + } + + + // NOTE: This implementation uses Algorithm 8c as described here: + // http://groups.google.com/group/comp.programming.threads/ + // browse_frm/thread/1692bdec8040ba40/e7a5f9d40e86503a + HANDLE m_blockLock; // auto-reset event (now semaphore) + HANDLE m_blockQueue; // auto-reset event (now semaphore) + Mutex m_assocMutex; // external mutex/CS + CRITICAL_SECTION m_unblockLock; // internal mutex/CS + int m_numWaitersGone = 0; + int m_numWaitersBlocked = 0; + int m_numWaitersToUnblock = 0; + } + else version( Posix ) + { + pthread_cond_t m_hndl; + pthread_mutex_t* m_mutexAddr; + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Unit Tests +//////////////////////////////////////////////////////////////////////////////// + + +debug( UnitTest ) +{ + private import tango.core.Thread; + private import tango.core.sync.Mutex; + private import tango.core.sync.Semaphore; + + + void testNotify() + { + auto mutex = new Mutex; + auto condReady = new Condition( mutex ); + auto semDone = new Semaphore; + auto synLoop = new Object; + int numWaiters = 10; + int numTries = 10; + int numReady = 0; + int numTotal = 0; + int numDone = 0; + int numPost = 0; + + void waiter() + { + for( int i = 0; i < numTries; ++i ) + { + synchronized( mutex ) + { + while( numReady < 1 ) + { + condReady.wait(); + } + --numReady; + ++numTotal; + } + + synchronized( synLoop ) + { + ++numDone; + } + semDone.wait(); + } + } + + auto group = new ThreadGroup; + + for( int i = 0; i < numWaiters; ++i ) + group.create( &waiter ); + + for( int i = 0; i < numTries; ++i ) + { + for( int j = 0; j < numWaiters; ++j ) + { + synchronized( mutex ) + { + ++numReady; + condReady.notify(); + } + } + while( true ) + { + synchronized( synLoop ) + { + if( numDone >= numWaiters ) + break; + } + Thread.yield(); + } + for( int j = 0; j < numWaiters; ++j ) + { + semDone.notify(); + } + } + + group.joinAll(); + assert( numTotal == numWaiters * numTries ); + } + + + void testNotifyAll() + { + auto mutex = new Mutex; + auto condReady = new Condition( mutex ); + int numWaiters = 10; + int numReady = 0; + int numDone = 0; + bool alert = false; + + void waiter() + { + synchronized( mutex ) + { + ++numReady; + while( !alert ) + condReady.wait(); + ++numDone; + } + } + + auto group = new ThreadGroup; + + for( int i = 0; i < numWaiters; ++i ) + group.create( &waiter ); + + while( true ) + { + synchronized( mutex ) + { + if( numReady >= numWaiters ) + { + alert = true; + condReady.notifyAll(); + break; + } + } + Thread.yield(); + } + group.joinAll(); + assert( numReady == numWaiters && numDone == numWaiters ); + } + + + void testWaitTimeout() + { + auto mutex = new Mutex; + auto condReady = new Condition( mutex ); + bool waiting = false; + bool alertedOne = true; + bool alertedTwo = true; + + void waiter() + { + synchronized( mutex ) + { + waiting = true; + alertedOne = condReady.wait( 1 ); + alertedTwo = condReady.wait( 1 ); + } + } + + auto thread = new Thread( &waiter ); + thread.start(); + + while( true ) + { + synchronized( mutex ) + { + if( waiting ) + { + condReady.notify(); + break; + } + } + Thread.yield(); + } + thread.join(); + assert( waiting && alertedOne && !alertedTwo ); + } + + + unittest + { + testNotify(); + testNotifyAll(); + testWaitTimeout(); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/core/sync/Config.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/core/sync/Config.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,69 @@ +/** + * The config module contains utility routines and configuration information + * specific to this package. + * + * Copyright: Copyright (C) 2005-2006 Sean Kelly. All rights reserved. + * License: BSD style: $(LICENSE) + * Authors: Sean Kelly + */ +module tango.core.sync.Config; + + +public import tango.core.Exception : SyncException; + + +version( Posix ) +{ + private import tango.stdc.posix.time; + private import tango.stdc.posix.sys.time; + + + void getTimespec( inout timespec t ) + { + static if( is( typeof( clock_gettime ) ) ) + { + clock_gettime( CLOCK_REALTIME, &t ); + } + else + { + timeval tv; + + gettimeofday( &tv, null ); + (cast(byte*) &t)[0 .. t.sizeof] = 0; + t.tv_sec = cast(typeof(t.tv_sec)) tv.tv_sec; + t.tv_nsec = cast(typeof(t.tv_nsec)) tv.tv_usec * 1_000; + } + } + + + void adjTimespec( inout timespec t, double v ) + { + enum + { + SECS_TO_NANOS = 1_000_000_000 + } + + // NOTE: The fractional value added to period is to correct fp error. + v += 0.000_000_000_1; + + if( t.tv_sec.max - t.tv_sec < v ) + { + t.tv_sec = t.tv_sec.max; + t.tv_nsec = 0; + } + else + { + alias typeof(t.tv_sec) Secs; + alias typeof(t.tv_nsec) Nanos; + + t.tv_sec += cast(Secs) v; + auto ns = cast(long)((v % 1.0) * SECS_TO_NANOS); + if( SECS_TO_NANOS - t.tv_nsec < ns ) + { + t.tv_sec += 1; + ns -= SECS_TO_NANOS; + } + t.tv_nsec += cast(Nanos) ns; + } + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/core/sync/Mutex.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/core/sync/Mutex.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,242 @@ +/** + * The mutex module provides a primitive for maintaining mutually exclusive + * access. + * + * Copyright: Copyright (C) 2005-2006 Sean Kelly. All rights reserved. + * License: BSD style: $(LICENSE) + * Authors: Sean Kelly + */ +module tango.core.sync.Mutex; + + +public import tango.core.Exception : SyncException; + +version( Win32 ) +{ + private import tango.sys.win32.UserGdi; +} +else version( Posix ) +{ + private import tango.stdc.posix.pthread; +} + + +//////////////////////////////////////////////////////////////////////////////// +// Mutex +// +// void lock(); +// void unlock(); +// bool tryLock(); +//////////////////////////////////////////////////////////////////////////////// + + +/** + * This class represents a general purpose, recursive mutex. + */ +class Mutex : + Object.Monitor +{ + //////////////////////////////////////////////////////////////////////////// + // Initialization + //////////////////////////////////////////////////////////////////////////// + + + /** + * Initializes a mutex object. + * + * Throws: + * SyncException on error. + */ + this() + { + version( Win32 ) + { + InitializeCriticalSection( &m_hndl ); + } + else version( Posix ) + { + int rc = pthread_mutex_init( &m_hndl, &sm_attr ); + if( rc ) + throw new SyncException( "Unable to initialize mutex" ); + } + m_proxy.link = this; + (cast(void**) this)[1] = &m_proxy; + } + + + ~this() + { + version( Win32 ) + { + DeleteCriticalSection( &m_hndl ); + } + else version( Posix ) + { + int rc = pthread_mutex_destroy( &m_hndl ); + assert( !rc, "Unable to destroy mutex" ); + } + (cast(void**) this)[1] = null; + } + + + //////////////////////////////////////////////////////////////////////////// + // General Actions + //////////////////////////////////////////////////////////////////////////// + + + /** + * If this lock is not already held by the caller, the lock is acquired, + * then the internal counter is incremented by one. + * + * Throws: + * SyncException on error. + */ + void lock() + { + version( Win32 ) + { + EnterCriticalSection( &m_hndl ); + } + else version( Posix ) + { + int rc = pthread_mutex_lock( &m_hndl ); + if( rc ) + throw new SyncException( "Unable to lock mutex" ); + } + } + + + /** + * Decrements the internal lock count by one. If this brings the count to + * zero, the lock is released. + * + * Throws: + * SyncException on error. + */ + void unlock() + { + version( Win32 ) + { + LeaveCriticalSection( &m_hndl ); + } + else version( Posix ) + { + int rc = pthread_mutex_unlock( &m_hndl ); + if( rc ) + throw new SyncException( "Unable to unlock mutex" ); + } + } + + + /** + * If the lock is held by another caller, the method returns. Otherwise, + * the lock is acquired if it is not already held, and then the internal + * counter is incremented by one. + * + * Returns: + * true if the lock was acquired and false if not. + * + * Throws: + * SyncException on error. + */ + bool tryLock() + { + version( Win32 ) + { + return TryEnterCriticalSection( &m_hndl ) != 0; + } + else version( Posix ) + { + return pthread_mutex_trylock( &m_hndl ) == 0; + } + } + + + version( Posix ) + { + static this() + { + int rc = pthread_mutexattr_init( &sm_attr ); + assert( !rc ); + + rc = pthread_mutexattr_settype( &sm_attr, PTHREAD_MUTEX_RECURSIVE ); + assert( !rc ); + } + + + static ~this() + { + int rc = pthread_mutexattr_destroy( &sm_attr ); + assert( !rc ); + } + } + + +private: + version( Win32 ) + { + CRITICAL_SECTION m_hndl; + } + else version( Posix ) + { + static pthread_mutexattr_t sm_attr; + + pthread_mutex_t m_hndl; + } + + struct MonitorProxy + { + Object.Monitor link; + } + + MonitorProxy m_proxy; + + +package: + version( Posix ) + { + pthread_mutex_t* handleAddr() + { + return &m_hndl; + } + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Unit Tests +//////////////////////////////////////////////////////////////////////////////// + + +debug( UnitTest ) +{ + private import tango.core.Thread; + + + unittest + { + auto mutex = new Mutex; + int numThreads = 10; + int numTries = 1000; + int lockCount = 0; + + void testFn() + { + for( int i = 0; i < numTries; ++i ) + { + synchronized( mutex ) + { + ++lockCount; + } + } + } + + auto group = new ThreadGroup; + + for( int i = 0; i < numThreads; ++i ) + group.create( &testFn ); + + group.joinAll(); + assert( lockCount == numThreads * numTries ); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/core/sync/ReadWriteMutex.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/core/sync/ReadWriteMutex.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,513 @@ +/** + * The read/write mutex module provides a primitive for maintaining shared read + * access and mutually exclusive write access. + * + * Copyright: Copyright (C) 2005-2006 Sean Kelly. All rights reserved. + * License: BSD style: $(LICENSE) + * Authors: Sean Kelly + */ +module tango.core.sync.ReadWriteMutex; + + +public import tango.core.Exception : SyncException; +private import tango.core.sync.Condition; +private import tango.core.sync.Mutex; + +version( Win32 ) +{ + private import tango.sys.win32.UserGdi; +} +else version( Posix ) +{ + private import tango.stdc.posix.pthread; +} + + +//////////////////////////////////////////////////////////////////////////////// +// ReadWriteMutex +// +// Reader reader(); +// Writer writer(); +//////////////////////////////////////////////////////////////////////////////// + + +/** + * This class represents a mutex that allows any number of readers to enter, + * but when a writer enters, all other readers and writers are blocked. + * + * Please note that this mutex is not recursive and is intended to guard access + * to data only. Also, no deadlock checking is in place because doing so would + * require dynamic memory allocation, which would reduce performance by an + * unacceptable amount. As a result, any attempt to recursively acquire this + * mutex may well deadlock the caller, particularly if a write lock is acquired + * while holding a read lock, or vice-versa. In practice, this should not be + * an issue however, because it is uncommon to call deeply into unknown code + * while holding a lock that simply protects data. + */ +class ReadWriteMutex +{ + /** + * Defines the policy used by this mutex. Currently, two policies are + * defined. + * + * The first will queue writers until no readers hold the mutex, then + * pass the writers through one at a time. If a reader acquires the mutex + * while there are still writers queued, the reader will take precedence. + * + * The second will queue readers if there are any writers queued. Writers + * are passed through one at a time, and once there are no writers present, + * all queued readers will be alerted. + * + * Future policies may offer a more even balance between reader and writer + * precedence. + */ + enum Policy + { + PREFER_READERS, /// Readers get preference. This may starve writers. + PREFER_WRITERS /// Writers get preference. This may starve readers. + } + + + //////////////////////////////////////////////////////////////////////////// + // Initialization + //////////////////////////////////////////////////////////////////////////// + + + /** + * Initializes a read/write mutex object with the supplied policy. + * + * Params: + * policy = The policy to use. + * + * Throws: + * SyncException on error. + */ + this( Policy policy = Policy.PREFER_WRITERS ) + { + m_commonMutex = new Mutex; + if( !m_commonMutex ) + throw new SyncException( "Unable to initialize mutex" ); + scope(failure) delete m_commonMutex; + + m_readerQueue = new Condition( m_commonMutex ); + if( !m_readerQueue ) + throw new SyncException( "Unable to initialize mutex" ); + scope(failure) delete m_readerQueue; + + m_writerQueue = new Condition( m_commonMutex ); + if( !m_writerQueue ) + throw new SyncException( "Unable to initialize mutex" ); + scope(failure) delete m_writerQueue; + + m_policy = policy; + version(LLVMDC) + { + pragma(msg, "ReadWriteMutex is broken on LLVMDC"); + } + else + { + m_reader = new Reader; + m_writer = new Writer; + } + } + + + //////////////////////////////////////////////////////////////////////////// + // General Properties + //////////////////////////////////////////////////////////////////////////// + + + /** + * Gets the policy for the associated mutex. + * + * Returns: + * The policy used by this mutex. + */ + Policy policy() + { + return m_policy; + } + + + //////////////////////////////////////////////////////////////////////////// + // Reader/Writer Handles + //////////////////////////////////////////////////////////////////////////// + + + /** + * Gets an object representing the reader lock for the associated mutex. + * + * Returns: + * A reader sub-mutex. + */ + Reader reader() + { + return m_reader; + } + + + /** + * Gets an object representing the writer lock for the associated mutex. + * + * Returns: + * A writer sub-mutex. + */ + Writer writer() + { + return m_writer; + } + + + //////////////////////////////////////////////////////////////////////////// + // Reader + //////////////////////////////////////////////////////////////////////////// + + + /** + * This class can be considered a mutex in its own right, and is used to + * negotiate a read lock for the enclosing mutex. + */ + class Reader : + Object.Monitor + { + /** + * Initializes a read/write mutex reader proxy object. + */ + this() + { + m_proxy.link = this; + (cast(void**) this)[1] = &m_proxy; + } + + + /** + * Acquires a read lock on the enclosing mutex. + */ + void lock() + { + synchronized( m_commonMutex ) + { + ++m_numQueuedReaders; + scope(exit) --m_numQueuedReaders; + + while( shouldQueueReader() ) + m_readerQueue.wait(); + ++m_numActiveReaders; + } + } + + + /** + * Releases a read lock on the enclosing mutex. + */ + void unlock() + { + synchronized( m_commonMutex ) + { + if( --m_numActiveReaders < 1 ) + { + if( m_numQueuedWriters > 0 ) + m_writerQueue.notify(); + } + } + } + + + /** + * Attempts to acquire a read lock on the enclosing mutex. If one can + * be obtained without blocking, the lock is acquired and true is + * returned. If not, the lock is not acquired and false is returned. + * + * Returns: + * true if the lock was acquired and false if not. + */ + bool tryLock() + { + synchronized( m_commonMutex ) + { + if( shouldQueueReader() ) + return false; + ++m_numActiveReaders; + return true; + } + } + + + private: + bool shouldQueueReader() + { + if( m_numActiveWriters > 0 ) + return true; + + switch( m_policy ) + { + case Policy.PREFER_WRITERS: + return m_numQueuedWriters > 0; + + case Policy.PREFER_READERS: + default: + break; + } + + return false; + } + + struct MonitorProxy + { + Object.Monitor link; + } + + MonitorProxy m_proxy; + } + + + //////////////////////////////////////////////////////////////////////////// + // Writer + //////////////////////////////////////////////////////////////////////////// + + + /** + * This class can be considered a mutex in its own right, and is used to + * negotiate a write lock for the enclosing mutex. + */ + class Writer : + Object.Monitor + { + /** + * Initializes a read/write mutex writer proxy object. + */ + this() + { + m_proxy.link = this; + (cast(void**) this)[1] = &m_proxy; + } + + + /** + * Acquires a write lock on the enclosing mutex. + */ + void lock() + { + synchronized( m_commonMutex ) + { + ++m_numQueuedWriters; + scope(exit) --m_numQueuedWriters; + + while( shouldQueueWriter() ) + m_writerQueue.wait(); + ++m_numActiveWriters; + } + } + + + /** + * Releases a write lock on the enclosing mutex. + */ + void unlock() + { + synchronized( m_commonMutex ) + { + if( --m_numActiveWriters < 1 ) + { + switch( m_policy ) + { + default: + case Policy.PREFER_READERS: + if( m_numQueuedReaders > 0 ) + m_readerQueue.notifyAll(); + else if( m_numQueuedWriters > 0 ) + m_writerQueue.notify(); + break; + case Policy.PREFER_WRITERS: + if( m_numQueuedWriters > 0 ) + m_writerQueue.notify(); + else if( m_numQueuedReaders > 0 ) + m_readerQueue.notifyAll(); + } + } + } + } + + + /** + * Attempts to acquire a write lock on the enclosing mutex. If one can + * be obtained without blocking, the lock is acquired and true is + * returned. If not, the lock is not acquired and false is returned. + * + * Returns: + * true if the lock was acquired and false if not. + */ + bool tryLock() + { + synchronized( m_commonMutex ) + { + if( shouldQueueWriter() ) + return false; + ++m_numActiveWriters; + return true; + } + } + + + private: + bool shouldQueueWriter() + { + if( m_numActiveWriters > 0 || + m_numActiveReaders > 0 ) + return true; + switch( m_policy ) + { + case Policy.PREFER_READERS: + return m_numQueuedReaders > 0; + + case Policy.PREFER_WRITERS: + default: + break; + } + + return false; + } + + struct MonitorProxy + { + Object.Monitor link; + } + + MonitorProxy m_proxy; + } + + +private: + Policy m_policy; + Reader m_reader; + Writer m_writer; + + Mutex m_commonMutex; + Condition m_readerQueue; + Condition m_writerQueue; + + int m_numQueuedReaders; + int m_numActiveReaders; + int m_numQueuedWriters; + int m_numActiveWriters; +} + + +//////////////////////////////////////////////////////////////////////////////// +// Unit Tests +//////////////////////////////////////////////////////////////////////////////// + + +debug( UnitTest ) +{ + private import tango.core.Thread; + + + void testRead( ReadWriteMutex.Policy policy ) + { + auto mutex = new ReadWriteMutex( policy ); + auto synInfo = new Object; + int numThreads = 10; + int numReaders = 0; + int maxReaders = 0; + + void readerFn() + { + synchronized( mutex.reader() ) + { + synchronized( synInfo ) + { + if( ++numReaders > maxReaders ) + maxReaders = numReaders; + } + Thread.yield(); + synchronized( synInfo ) + { + --numReaders; + } + } + } + + auto group = new ThreadGroup; + + for( int i = 0; i < numThreads; ++i ) + { + group.create( &readerFn ); + } + group.joinAll(); + assert( numReaders < 1 && maxReaders > 1 ); + } + + + void testReadWrite( ReadWriteMutex.Policy policy ) + { + auto mutex = new ReadWriteMutex( policy ); + auto synInfo = new Object; + int numThreads = 10; + int numReaders = 0; + int numWriters = 0; + int maxReaders = 0; + int maxWriters = 0; + int numTries = 20; + + void readerFn() + { + for( int i = 0; i < numTries; ++i ) + { + synchronized( mutex.reader() ) + { + synchronized( synInfo ) + { + if( ++numReaders > maxReaders ) + maxReaders = numReaders; + } + Thread.yield(); + synchronized( synInfo ) + { + --numReaders; + } + } + } + } + + void writerFn() + { + for( int i = 0; i < numTries; ++i ) + { + synchronized( mutex.writer() ) + { + synchronized( synInfo ) + { + if( ++numWriters > maxWriters ) + maxWriters = numWriters; + } + Thread.yield(); + synchronized( synInfo ) + { + --numWriters; + } + } + } + } + + auto group = new ThreadGroup; + + for( int i = 0; i < numThreads; ++i ) + { + group.create( &readerFn ); + group.create( &writerFn ); + } + group.joinAll(); + assert( numReaders < 1 && maxReaders > 1 && + numWriters < 1 && maxWriters < 2 ); + } + + + unittest + { + testRead( ReadWriteMutex.Policy.PREFER_READERS ); + testRead( ReadWriteMutex.Policy.PREFER_WRITERS ); + testReadWrite( ReadWriteMutex.Policy.PREFER_READERS ); + testReadWrite( ReadWriteMutex.Policy.PREFER_WRITERS ); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/core/sync/Semaphore.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/core/sync/Semaphore.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,401 @@ +/** + * The semaphore module provides a general use semaphore for synchronization. + * + * Copyright: Copyright (C) 2005-2006 Sean Kelly. All rights reserved. + * License: BSD style: $(LICENSE) + * Authors: Sean Kelly + */ +module tango.core.sync.Semaphore; + + +public import tango.core.Exception : SyncException; + +version( Win32 ) +{ + private import tango.sys.win32.UserGdi; +} +else version( Posix ) +{ + private import tango.core.sync.Config; + private import tango.stdc.errno; + private import tango.stdc.posix.pthread; + private import tango.stdc.posix.semaphore; +} + + +//////////////////////////////////////////////////////////////////////////////// +// Semaphore +// +// void wait(); +// void notify(); +// bool tryWait(); +//////////////////////////////////////////////////////////////////////////////// + + +/** + * This class represents a general counting semaphore as concieved by Edsger + * Dijkstra. As per Mesa type monitors however, "signal" has been replaced + * with "notify" to indicate that control is not transferred to the waiter when + * a notification is sent. + */ +class Semaphore +{ + //////////////////////////////////////////////////////////////////////////// + // Initialization + //////////////////////////////////////////////////////////////////////////// + + + /** + * Initializes a semaphore object with the specified initial count. + * + * Params: + * count = The initial count for the semaphore. + * + * Throws: + * SyncException on error. + */ + this( uint count = 0 ) + { + version( Win32 ) + { + m_hndl = CreateSemaphoreA( null, count, int.max, null ); + if( m_hndl == m_hndl.init ) + throw new SyncException( "Unable to create semaphore" ); + } + else version( Posix ) + { + int rc = sem_init( &m_hndl, 0, count ); + if( rc ) + throw new SyncException( "Unable to create semaphore" ); + } + } + + + ~this() + { + version( Win32 ) + { + BOOL rc = CloseHandle( m_hndl ); + assert( rc, "Unable to destroy semaphore" ); + } + else version( Posix ) + { + int rc = sem_destroy( &m_hndl ); + assert( !rc, "Unable to destroy semaphore" ); + } + } + + + //////////////////////////////////////////////////////////////////////////// + // General Actions + //////////////////////////////////////////////////////////////////////////// + + + /** + * Wait until the current count is above zero, then atomically decrement + * the count by one and return. + * + * Throws: + * SyncException on error. + */ + void wait() + { + version( Win32 ) + { + DWORD rc = WaitForSingleObject( m_hndl, INFINITE ); + if( rc != WAIT_OBJECT_0 ) + throw new SyncException( "Unable to wait for semaphore" ); + } + else version( Posix ) + { + while( true ) + { + if( !sem_wait( &m_hndl ) ) + return; + if( errno != EINTR ) + throw new SyncException( "Unable to wait for semaphore" ); + } + } + } + + + /** + * Suspends the calling thread until the current count moves above zero or + * until the supplied time period has elapsed. If the count moves above + * zero in this interval, then atomically decrement the count by one and + * return true. Otherwise, return false. The supplied period may be up to + * a maximum of (uint.max - 1) milliseconds. + * + * Params: + * period = The number of seconds to wait. + * + * In: + * period must be less than (uint.max - 1) milliseconds. + * + * Returns: + * true if notified before the timeout and false if not. + * + * Throws: + * SyncException on error. + */ + bool wait( double period ) + in + { + assert( period * 1000 + 0.1 < uint.max - 1); + } + body + { + version( Win32 ) + { + DWORD t = cast(DWORD)(period * 1000 + 0.1); + switch( WaitForSingleObject( m_hndl, t ) ) + { + case WAIT_OBJECT_0: + return true; + case WAIT_TIMEOUT: + return false; + default: + throw new SyncException( "Unable to wait for semaphore" ); + } + } + else version( Posix ) + { + timespec t; + + getTimespec( t ); + adjTimespec( t, period ); + + while( true ) + { + if( !sem_timedwait( &m_hndl, &t ) ) + return true; + if( errno == ETIMEDOUT ) + return false; + if( errno != EINTR ) + throw new SyncException( "Unable to wait for semaphore" ); + } + } + + // -w trip + return false; + } + + + /** + * Atomically increment the current count by one. This will notify one + * waiter, if there are any in the queue. + * + * Throws: + * SyncException on error. + */ + void notify() + { + version( Win32 ) + { + if( !ReleaseSemaphore( m_hndl, 1, null ) ) + throw new SyncException( "Unable to notify semaphore" ); + } + else version( Posix ) + { + int rc = sem_post( &m_hndl ); + if( rc ) + throw new SyncException( "Unable to notify semaphore" ); + } + } + + + /** + * If the current count is equal to zero, return. Otherwise, atomically + * decrement the count by one and return true. + * + * Returns: + * true if the count was above zero and false if not. + * + * Throws: + * SyncException on error. + */ + bool tryWait() + { + version( Win32 ) + { + switch( WaitForSingleObject( m_hndl, 0 ) ) + { + case WAIT_OBJECT_0: + return true; + case WAIT_TIMEOUT: + return false; + default: + throw new SyncException( "Unable to wait for semaphore" ); + } + } + else version( Posix ) + { + while( true ) + { + if( !sem_trywait( &m_hndl ) ) + return true; + if( errno == EAGAIN ) + return false; + if( errno != EINTR ) + throw new SyncException( "Unable to wait for semaphore" ); + } + } + + // -w trip + return false; + } + + +private: + version( Win32 ) + { + HANDLE m_hndl; + } + else version( Posix ) + { + sem_t m_hndl; + } +} + + +//////////////////////////////////////////////////////////////////////////////// +// Unit Tests +//////////////////////////////////////////////////////////////////////////////// + + +debug( UnitTest ) +{ + private import tango.core.Thread; + + + void testWait() + { + auto semaphore = new Semaphore; + int numToProduce = 10; + bool allProduced = false; + auto synProduced = new Object; + int numConsumed = 0; + auto synConsumed = new Object; + int numConsumers = 10; + int numComplete = 0; + auto synComplete = new Object; + + void consumer() + { + while( true ) + { + semaphore.wait(); + + synchronized( synProduced ) + { + if( allProduced ) + break; + } + + synchronized( synConsumed ) + { + ++numConsumed; + } + } + + synchronized( synComplete ) + { + ++numComplete; + } + } + + void producer() + { + assert( !semaphore.tryWait() ); + + for( int i = 0; i < numToProduce; ++i ) + { + semaphore.notify(); + Thread.yield(); + } + + synchronized( synProduced ) + { + allProduced = true; + } + + for( int i = 0; i < numConsumers; ++i ) + { + semaphore.notify(); + Thread.yield(); + } + + for( int i = numConsumers * 10; i > 0; --i ) + { + synchronized( synComplete ) + { + if( numComplete == numConsumers ) + break; + } + } + + synchronized( synComplete ) + { + assert( numComplete == numConsumers ); + } + assert( numConsumed == numToProduce ); + + assert( !semaphore.tryWait() ); + semaphore.notify(); + assert( semaphore.tryWait() ); + assert( !semaphore.tryWait() ); + } + + auto group = new ThreadGroup; + + for( int i = 0; i < numConsumers; ++i ) + group.create( &consumer ); + group.create( &producer ); + group.joinAll(); + } + + + void testWaitTimeout() + { + auto synReady = new Object; + auto semReady = new Semaphore; + bool waiting = false; + bool alertedOne = true; + bool alertedTwo = true; + + void waiter() + { + synchronized( synReady ) + { + waiting = true; + } + alertedOne = semReady.wait( 0.1 ); + alertedTwo = semReady.wait( 0.1 ); + } + + auto thread = new Thread( &waiter ); + thread.start(); + + while( true ) + { + synchronized( synReady ) + { + if( waiting ) + { + semReady.notify(); + break; + } + } + Thread.yield(); + } + thread.join(); + assert( waiting && alertedOne && !alertedTwo ); + } + + + unittest + { + testWait(); + testWaitTimeout(); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/group/collection.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/group/collection.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,44 @@ +/** + * + * copyright: Copyright (c) 2007 Steven Schveighoffer. All rights reserved + * license: BSD style: $(LICENSE) + * version: Nov 2007: Initial release + * author: schveiguy + * + * Convenience module to import all collection related modules + */ + +module tango.group.collection; + +public import tango.util.collection.HashMap, + tango.util.collection.TreeMap, + tango.util.collection.TreeBag, + tango.util.collection.LinkMap, + tango.util.collection.HashSet, + tango.util.collection.LinkSeq, + tango.util.collection.ArrayBag, + tango.util.collection.ArraySeq, + tango.util.collection.CircularSeq; + +public import tango.util.collection.model.Seq, + tango.util.collection.model.Map, + tango.util.collection.model.Set, + tango.util.collection.model.Bag, + tango.util.collection.model.View, + tango.util.collection.model.BagView, + tango.util.collection.model.SeqView, + tango.util.collection.model.MapView, + tango.util.collection.model.SetView, + tango.util.collection.model.Iterator, + tango.util.collection.model.Sortable, + tango.util.collection.model.Dispenser, + tango.util.collection.model.Comparator, + tango.util.collection.model.HashParams, + tango.util.collection.model.SortedKeys, + tango.util.collection.model.SortedValues, + tango.util.collection.model.GuardIterator; + + +public import tango.util.collection.iterator.ArrayIterator, + tango.util.collection.iterator.FilteringIterator, + tango.util.collection.iterator.InterleavingIterator; diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/group/convert.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/group/convert.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,21 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Nov 2007: Initial release + + author: Kris + + Convenience module to import renamed text conversions + +*******************************************************************************/ + +module tango.net.convert; + +public import Utf = tango.text.convert.Utf; +public import Float = tango.text.convert.Float; +public import Integer = tango.text.convert.Integer; +public import TimeStamp = tango.text.convert.TimeStamp; + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/group/digest.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/group/digest.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,25 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Dec 2007: Initial release + + author: Kris + + Convenience module to import tango.io.digest modules + +*******************************************************************************/ + +module tango.group.digest; + +public import tango.io.digest.Md2; +public import tango.io.digest.Md4; +public import tango.io.digest.Md5; +public import tango.io.digest.Sha0; +public import tango.io.digest.Sha1; +public import tango.io.digest.Sha01; +public import tango.io.digest.Sha256; +public import tango.io.digest.Sha512; +public import tango.io.digest.Tiger; diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/group/file.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/group/file.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,31 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Dec 2007: Initial release + + author: Kris + + Convenience module to import tango.io + +*******************************************************************************/ + +module tango.group.file; + +public import tango.io.File, + tango.io.Print, + tango.io.Stdout, + tango.io.Buffer, + tango.io.Conduit, + tango.io.Console, + tango.io.FilePath, + tango.io.FileScan, + tango.io.FileConst, + tango.io.FileRoots, + tango.io.FileSystem, + tango.io.GrowBuffer, + tango.io.FileConduit, + tango.io.UnicodeFile, + tango.io.MappedBuffer; diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/group/http.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/group/http.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,20 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Dec 2007: Initial release + + author: Kris + + Convenience module to import tango.net.http modules + +*******************************************************************************/ + +module tango.group.http; + +public import tango.net.http.HttpGet; +public import tango.net.http.HttpPost; +public import tango.net.http.HttpConst; +public import tango.net.http.HttpClient; diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/group/log.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/group/log.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,29 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Dec 2007: Initial release + + author: Kris + + Convenience module to import tango.util.log modules + +*******************************************************************************/ + +module tango.group.log; + +public import tango.util.log.Log; +public import tango.util.log.Logger; +public import tango.util.log.Hierarchy; +public import tango.util.log.DateLayout; +public import tango.util.log.Log4Layout; +public import tango.util.log.EventLayout; +public import tango.util.log.FileAppender; +public import tango.util.log.MailAppender; +public import tango.util.log.SocketAppender; +public import tango.util.log.ConsoleAppender; +public import tango.util.log.RollingFileAppender; + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/group/math.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/group/math.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,24 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Dec 2007: Initial release + + author: Kris + + Convenience module to import tango.math modules + +*******************************************************************************/ + +module tango.group.math; + +public import tango.math.Math; +public import tango.math.IEEE; +public import tango.math.Random; +public import tango.math.Bessel; +public import tango.math.Elliptic; +public import tango.math.Probability; +public import tango.math.ErrorFunction; +public import tango.math.GammaFunction; diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/group/net.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/group/net.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,26 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Dec 2007: Initial release + + author: Kris + + Convenience module to import tango.net modules + +*******************************************************************************/ + +module tango.group.net; + +public import tango.net.Uri; +public import tango.net.ServerSocket; +public import tango.net.SocketConduit; +public import tango.net.SocketListener; +public import tango.net.InternetAddress; +public import tango.net.DatagramConduit; +public import tango.net.MulticastConduit; + + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/group/stream.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/group/stream.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,30 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Dec 2007: Initial release + + author: Kris + + Convenience module to import streams + +*******************************************************************************/ + +module tango.group.stream; + +public import tango.io.stream.UtfStream, + tango.io.stream.MapStream, + tango.io.stream.LineStream, + tango.io.stream.DataStream, + tango.io.stream.FileStream, + tango.io.stream.TypedStream, + tango.io.stream.SnoopStream, + tango.io.stream.FormatStream, + tango.io.stream.GreedyStream, + tango.io.stream.DigestStream, + tango.io.stream.EndianStream, + tango.io.stream.BufferStream, + tango.io.stream.TextFileStream, + tango.io.stream.DataFileStream; diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/group/text.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/group/text.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,24 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Dec 2007: Initial release + + author: Kris + + Convenience module to import text modules + +*******************************************************************************/ + +module tango.group.text; + +public import tango.text.Text; +public import tango.text.Regex; +public import tango.text.Ascii; + +public import Util = tango.text.Util; + + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/group/time.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/group/time.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,21 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Dec 2007: Initial release + + author: Kris + + Convenience module to import tango.time modules + +*******************************************************************************/ + +module tango.group.time; + +public import tango.time.Time; +public import tango.time.Clock; +public import tango.time.ISO8601; +public import tango.time.WallClock; +public import tango.time.StopWatch; diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/Buffer.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/Buffer.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,1420 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Mar 2004: Initial release + Dec 2006: Outback release + + authors: Kris + +*******************************************************************************/ + +module tango.io.Buffer; + +private import tango.core.Exception; + +public import tango.io.model.IBuffer, + tango.io.model.IConduit; + +/****************************************************************************** + +******************************************************************************/ + +extern (C) +{ + protected void * memcpy (void *dst, void *src, uint); +} + +/******************************************************************************* + + Buffer is central concept in Tango I/O. Each buffer acts + as a queue (line) where items are removed from the front + and new items are added to the back. Buffers are modeled + by tango.io.model.IBuffer, and a concrete implementation + is provided by this class. + + Buffer can be read from and written to directly, though + various data-converters and filters are often leveraged + to apply structure to what might otherwise be simple raw + data. + + Buffers may also be tokenized by applying an Iterator. + This can be handy when one is dealing with text input, + and/or the content suits a more fluid format than most + typical converters support. Iterator tokens are mapped + directly onto buffer content (sliced), making them quite + efficient in practice. Like other types of buffer client, + multiple iterators can be mapped onto one common buffer + and access will be serialized. + + Buffers are sometimes memory-only, in which case there + is nothing left to do when a client has consumed all the + content. Other buffers are themselves bound to an external + device called a conduit. When this is the case, a consumer + will eventually cause a buffer to reload via its associated + conduit and previous buffer content will be lost. + + A similar approach is applied to clients which populate a + buffer, whereby the content of a full buffer will be flushed + to a bound conduit before continuing. Another variation is + that of a memory-mapped buffer, whereby the buffer content + is mapped directly to virtual memory exposed via the OS. This + can be used to address large files as an array of content. + + Direct buffer manipulation typically involves appending, + as in the following example: + --- + // create a small buffer + auto buf = new Buffer (256); + + auto foo = "to write some D"; + + // append some text directly to it + buf.append ("now is the time for all good men ").append(foo); + --- + + Alternatively, one might use a formatter to append the buffer: + --- + auto output = new FormatOutput (new Buffer(256)); + output.format ("now is the time for {} good men {}", 3, foo); + --- + + A slice() method will return all valid content within a buffer. + GrowBuffer can be used instead, where one wishes to append beyond + a specified limit. + + A common usage of a buffer is in conjunction with a conduit, + such as FileConduit. Each conduit exposes a preferred-size for + its associated buffers, utilized during buffer construction: + --- + auto file = new FileConduit ("file.name"); + auto buf = new Buffer (file); + --- + + However, this is typically hidden by higher level constructors + such as those exposed via the stream wrappers. For example: + --- + auto input = new DataInput (new FileInput("file.name")); + --- + + There is indeed a buffer between the resultant stream and the + file source, but explicit buffer construction is unecessary in + common cases. + + An Iterator is constructed in a similar manner, where you provide + it an input stream to operate upon. There's a variety of iterators + available in the tango.text.stream package, and they are templated + for each of utf8, utf16, and utf32. This example uses a line iterator + to sweep a text file: + --- + auto lines = new LineInput (new FileInput("file.name")); + foreach (line; lines) + Cout(line).newline; + --- + + Buffers are useful for many purposes within Tango, but there + are times when it may be more appropriate to sidestep them. For + such cases, all conduit derivatives (such as FileConduit) support + direct array-based IO via a pair of read() and write() methods. + +*******************************************************************************/ + +class Buffer : IBuffer +{ + protected OutputStream sink; // optional data sink + protected InputStream source; // optional data source + protected void[] data; // the raw data buffer + protected uint index; // current read position + protected uint extent; // limit of valid content + protected uint dimension; // maximum extent of content + + + protected static char[] overflow = "output buffer is full"; + protected static char[] underflow = "input buffer is empty"; + protected static char[] eofRead = "end-of-flow whilst reading"; + protected static char[] eofWrite = "end-of-flow whilst writing"; + + /*********************************************************************** + + Ensure the buffer remains valid between method calls + + ***********************************************************************/ + + invariant + { + assert (index <= extent); + assert (extent <= dimension); + } + + /*********************************************************************** + + Construct a buffer + + Params: + conduit = the conduit to buffer + + Remarks: + Construct a Buffer upon the provided conduit. A relevant + buffer size is supplied via the provided conduit. + + ***********************************************************************/ + + this (IConduit conduit) + { + assert (conduit); + + this (conduit.bufferSize); + setConduit (conduit); + } + + /*********************************************************************** + + Construct a buffer + + Params: + stream = an input stream + capacity = desired buffer capacity + + Remarks: + Construct a Buffer upon the provided input stream. + + ***********************************************************************/ + + this (InputStream stream, uint capacity) + { + this (capacity); + input = stream; + } + + /*********************************************************************** + + Construct a buffer + + Params: + stream = an output stream + capacity = desired buffer capacity + + Remarks: + Construct a Buffer upon the provided output stream. + + ***********************************************************************/ + + this (OutputStream stream, uint capacity) + { + this (capacity); + output = stream; + } + + /*********************************************************************** + + Construct a buffer + + Params: + capacity = the number of bytes to make available + + Remarks: + Construct a Buffer with the specified number of bytes. + + ***********************************************************************/ + + this (uint capacity = 0) + { + setContent (new ubyte[capacity], 0); + } + + /*********************************************************************** + + Construct a buffer + + Params: + data = the backing array to buffer within + + Remarks: + Prime a buffer with an application-supplied array. All content + is considered valid for reading, and thus there is no writable + space initially available. + + ***********************************************************************/ + + this (void[] data) + { + setContent (data, data.length); + } + + /*********************************************************************** + + Construct a buffer + + Params: + data = the backing array to buffer within + readable = the number of bytes initially made + readable + + Remarks: + Prime buffer with an application-supplied array, and + indicate how much readable data is already there. A + write operation will begin writing immediately after + the existing readable content. + + This is commonly used to attach a Buffer instance to + a local array. + + ***********************************************************************/ + + this (void[] data, uint readable) + { + setContent (data, readable); + } + + /*********************************************************************** + + Attempt to share an upstream Buffer, and create an instance + where there not one available. + + Params: + stream = an input stream + size = a hint of the desired buffer size. Defaults to the + conduit-defined size + + Remarks: + If an upstream Buffer instances is visible, it will be shared. + Otherwise, a new instance is created based upon the bufferSize + exposed by the stream endpoint (conduit). + + ***********************************************************************/ + + static IBuffer share (InputStream stream, uint size=uint.max) + { + auto b = cast(Buffered) stream; + if (b) + return b.buffer; + + if (size is uint.max) + size = stream.conduit.bufferSize; + + return new Buffer (stream, size); + } + + /*********************************************************************** + + Attempt to share an upstream Buffer, and create an instance + where there not one available. + + Params: + stream = an output stream + size = a hint of the desired buffer size. Defaults to the + conduit-defined size + + Remarks: + If an upstream Buffer instances is visible, it will be shared. + Otherwise, a new instance is created based upon the bufferSize + exposed by the stream endpoint (conduit). + + ***********************************************************************/ + + static IBuffer share (OutputStream stream, uint size=uint.max) + { + auto b = cast(Buffered) stream; + if (b) + return b.buffer; + + if (size is uint.max) + size = stream.conduit.bufferSize; + + return new Buffer (stream, size); + } + + /*********************************************************************** + + Reset the buffer content + + Params: + data = the backing array to buffer within. All content + is considered valid + + Returns: + the buffer instance + + Remarks: + Set the backing array with all content readable. Writing + to this will either flush it to an associated conduit, or + raise an Eof condition. Use clear() to reset the content + (make it all writable). + + ***********************************************************************/ + + IBuffer setContent (void[] data) + { + return setContent (data, data.length); + } + + /*********************************************************************** + + Reset the buffer content + + Params: + data = the backing array to buffer within + readable = the number of bytes within data considered + valid + + Returns: + the buffer instance + + Remarks: + Set the backing array with some content readable. Writing + to this will either flush it to an associated conduit, or + raise an Eof condition. Use clear() to reset the content + (make it all writable). + + ***********************************************************************/ + + IBuffer setContent (void[] data, uint readable) + { + this.data = data; + this.extent = readable; + this.dimension = data.length; + + // reset to start of input + this.index = 0; + + return this; + } + + /*********************************************************************** + + Access buffer content + + Params: + size = number of bytes to access + eat = whether to consume the content or not + + Returns: + the corresponding buffer slice when successful, or + null if there's not enough data available (Eof; Eob). + + Remarks: + Read a slice of data from the buffer, loading from the + conduit as necessary. The specified number of bytes is + sliced from the buffer, and marked as having been read + when the 'eat' parameter is set true. When 'eat' is set + false, the read position is not adjusted. + + Note that the slice cannot be larger than the size of + the buffer ~ use method fill(void[]) instead where you + simply want the content copied, or use conduit.read() + to extract directly from an attached conduit. Also note + that if you need to retain the slice, then it should be + .dup'd before the buffer is compressed or repopulated. + + Examples: + --- + // create a buffer with some content + auto buffer = new Buffer ("hello world"); + + // consume everything unread + auto slice = buffer.slice (buffer.readable); + --- + + ***********************************************************************/ + + void[] slice (uint size, bool eat = true) + { + if (size > readable) + { + if (source is null) + error (underflow); + + // make some space? This will try to leave as much content + // in the buffer as possible, such that entire records may + // be aliased directly from within. + if (size > writable) + { + if (size > dimension) + error (underflow); + compress (); + } + + // populate tail of buffer with new content + do { + if (fill(source) is IConduit.Eof) + error (eofRead); + } while (size > readable); + } + + auto i = index; + if (eat) + index += size; + return data [i .. i + size]; + } + + /********************************************************************** + + Fill the provided buffer. Returns the number of bytes + actually read, which will be less that dst.length when + Eof has been reached and IConduit.Eof thereafter + + **********************************************************************/ + + uint fill (void[] dst) + { + uint len = 0; + + while (len < dst.length) + { + uint i = read (dst [len .. $]); + if (i is IConduit.Eof) + return (len > 0) ? len : IConduit.Eof; + len += i; + } + return len; + } + + /*********************************************************************** + + Copy buffer content into the provided dst + + Params: + dst = destination of the content + bytes = size of dst + + Returns: + A reference to the populated content + + Remarks: + Fill the provided array with content. We try to satisfy + the request from the buffer content, and read directly + from an attached conduit where more is required. + + ***********************************************************************/ + + void[] readExact (void* dst, uint bytes) + { + auto tmp = dst [0 .. bytes]; + if (fill (tmp) != bytes) + error (eofRead); + + return tmp; + } + + /*********************************************************************** + + Append content + + Params: + src = the content to _append + + Returns a chaining reference if all content was written. + Throws an IOException indicating eof or eob if not. + + Remarks: + Append an array to this buffer, and flush to the + conduit as necessary. This is often used in lieu of + a Writer. + + ***********************************************************************/ + + IBuffer append (void[] src) + { + return append (src.ptr, src.length); + } + + /*********************************************************************** + + Append content + + Params: + src = the content to _append + length = the number of bytes in src + + Returns a chaining reference if all content was written. + Throws an IOException indicating eof or eob if not. + + Remarks: + Append an array to this buffer, and flush to the + conduit as necessary. This is often used in lieu of + a Writer. + + ***********************************************************************/ + + IBuffer append (void* src, uint length) + { + if (length > writable) + // can we write externally? + if (sink) + { + flush (); + + // check for pathological case + if (length > dimension) + { + do { + auto written = sink.write (src [0 .. length]); + if (written is IConduit.Eof) + error (eofWrite); + src += written, length -= written; + } while (length > dimension); + } + } + else + error (overflow); + + copy (src, length); + return this; + } + + /*********************************************************************** + + Append content + + Params: + other = a buffer with content available + + Returns: + Returns a chaining reference if all content was written. + Throws an IOException indicating eof or eob if not. + + Remarks: + Append another buffer to this one, and flush to the + conduit as necessary. This is often used in lieu of + a Writer. + + ***********************************************************************/ + + IBuffer append (IBuffer other) + { + return append (other.slice); + } + + /*********************************************************************** + + Consume content from a producer + + Params: + The content to consume. This is consumed verbatim, and in + raw binary format ~ no implicit conversions are performed. + + Remarks: + This is often used in lieu of a Writer, and enables simple + classes, such as FilePath and Uri, to emit content directly + into a buffer (thus avoiding potential heap activity) + + Examples: + --- + auto path = new FilePath (somepath); + + path.produce (&buffer.consume); + --- + + ***********************************************************************/ + + void consume (void[] x) + { + append (x); + } + + /*********************************************************************** + + Retrieve the valid content + + Returns: + a void[] slice of the buffer + + Remarks: + Return a void[] slice of the buffer, from the current position + up to the limit of valid content. The content remains in the + buffer for future extraction. + + ***********************************************************************/ + + void[] slice () + { + return data [index .. extent]; + } + + /*********************************************************************** + + Move the current read location + + Params: + size = the number of bytes to move + + Returns: + Returns true if successful, false otherwise. + + Remarks: + Skip ahead by the specified number of bytes, streaming from + the associated conduit as necessary. + + Can also reverse the read position by 'size' bytes, when size + is negative. This may be used to support lookahead operations. + Note that a negative size will fail where there is not sufficient + content available in the buffer (can't _skip beyond the beginning). + + ***********************************************************************/ + + bool skip (int size) + { + if (size < 0) + { + size = -size; + if (index >= size) + { + index -= size; + return true; + } + return false; + } + return slice(size) !is null; + } + + /*********************************************************************** + + Iterator support + + Params: + scan = the delagate to invoke with the current content + + Returns: + Returns true if a token was isolated, false otherwise. + + Remarks: + Upon success, the delegate should return the byte-based + index of the consumed pattern (tail end of it). Failure + to match a pattern should be indicated by returning an + IConduit.Eof + + Each pattern is expected to be stripped of the delimiter. + An end-of-file condition causes trailing content to be + placed into the token. Requests made beyond Eof result + in empty matches (length is zero). + + Note that additional iterator and/or reader instances + will operate in lockstep when bound to a common buffer. + + ***********************************************************************/ + + bool next (uint delegate (void[]) scan) + { + while (read(scan) is IConduit.Eof) + // not found - are we streaming? + if (source) + { + // did we start at the beginning? + if (position) + // nope - move partial token to start of buffer + compress (); + else + // no more space in the buffer? + if (writable is 0) + error ("Token is too large to fit within buffer"); + + // read another chunk of data + if (fill(source) is IConduit.Eof) + return false; + } + else + return false; + + return true; + } + + /*********************************************************************** + + Available content + + Remarks: + Return count of _readable bytes remaining in buffer. This is + calculated simply as limit() - position() + + ***********************************************************************/ + + uint readable () + { + return extent - index; + } + + /*********************************************************************** + + Available space + + Remarks: + Return count of _writable bytes available in buffer. This is + calculated simply as capacity() - limit() + + ***********************************************************************/ + + uint writable () + { + return dimension - extent; + } + + /*********************************************************************** + + Write into this buffer + + Params: + dg = the callback to provide buffer access to + + Returns: + Returns whatever the delegate returns. + + Remarks: + Exposes the raw data buffer at the current _write position, + The delegate is provided with a void[] representing space + available within the buffer at the current _write position. + + The delegate should return the appropriate number of bytes + if it writes valid content, or IConduit.Eof on error. + + ***********************************************************************/ + + uint write (uint delegate (void[]) dg) + { + int count = dg (data [extent..dimension]); + + if (count != IConduit.Eof) + { + extent += count; + assert (extent <= dimension); + } + return count; + } + + /*********************************************************************** + + Read directly from this buffer + + Params: + dg = callback to provide buffer access to + + Returns: + Returns whatever the delegate returns. + + Remarks: + Exposes the raw data buffer at the current _read position. The + delegate is provided with a void[] representing the available + data, and should return zero to leave the current _read position + intact. + + If the delegate consumes data, it should return the number of + bytes consumed; or IConduit.Eof to indicate an error. + + ***********************************************************************/ + + uint read (uint delegate (void[]) dg) + { + int count = dg (data [index..extent]); + + if (count != IConduit.Eof) + { + index += count; + assert (index <= extent); + } + return count; + } + + /*********************************************************************** + + Compress buffer space + + Returns: + the buffer instance + + Remarks: + If we have some data left after an export, move it to + front-of-buffer and set position to be just after the + remains. This is for supporting certain conduits which + choose to write just the initial portion of a request. + + Limit is set to the amount of data remaining. Position + is always reset to zero. + + ***********************************************************************/ + + IBuffer compress () + { + uint r = readable (); + + if (index > 0 && r > 0) + // content may overlap ... + memcpy (&data[0], &data[index], r); + + index = 0; + extent = r; + return this; + } + + /*********************************************************************** + + Fill buffer from the specific conduit + + Returns: + Returns the number of bytes read, or Conduit.Eof + + Remarks: + Try to _fill the available buffer with content from the + specified conduit. We try to read as much as possible + by clearing the buffer when all current content has been + eaten. If there is no space available, nothing will be + read. + + ***********************************************************************/ + + uint fill (InputStream src) + { + if (src is null) + return IConduit.Eof; + + if (readable is 0) + index = extent = 0; // same as clear(), but without chain + else + if (writable is 0) + return 0; + + return write (&src.read); + } + + /*********************************************************************** + + Drain buffer content to the specific conduit + + Returns: + Returns the number of bytes written + + Remarks: + Write as much of the buffer that the associated conduit + can consume. The conduit is not obliged to consume all + content, so some may remain within the buffer. + + Throws an IOException on premature Eof. + + ***********************************************************************/ + + final uint drain (OutputStream dst) + { + if (dst is null) + return IConduit.Eof; + + uint ret = read (&dst.write); + if (ret is IConduit.Eof) + error (eofWrite); + + compress (); + return ret; + } + + /*********************************************************************** + + Truncate buffer content + + Remarks: + Truncate the buffer within its extent. Returns true if + the new length is valid, false otherwise. + + ***********************************************************************/ + + bool truncate (uint length) + { + if (length <= data.length) + { + extent = length; + return true; + } + return false; + } + + /*********************************************************************** + + Access buffer limit + + Returns: + Returns the limit of readable content within this buffer. + + Remarks: + Each buffer has a capacity, a limit, and a position. The + capacity is the maximum content a buffer can contain, limit + represents the extent of valid content, and position marks + the current read location. + + ***********************************************************************/ + + uint limit () + { + return extent; + } + + /*********************************************************************** + + Access buffer capacity + + Returns: + Returns the maximum capacity of this buffer + + Remarks: + Each buffer has a capacity, a limit, and a position. The + capacity is the maximum content a buffer can contain, limit + represents the extent of valid content, and position marks + the current read location. + + ***********************************************************************/ + + uint capacity () + { + return dimension; + } + + /*********************************************************************** + + Access buffer read position + + Returns: + Returns the current read-position within this buffer + + Remarks: + Each buffer has a capacity, a limit, and a position. The + capacity is the maximum content a buffer can contain, limit + represents the extent of valid content, and position marks + the current read location. + + ***********************************************************************/ + + uint position () + { + return index; + } + + /*********************************************************************** + + Set external conduit + + Params: + conduit = the conduit to attach to + + Remarks: + Sets the external conduit associated with this buffer. + + Buffers do not require an external conduit to operate, but + it can be convenient to associate one. For example, methods + fill() & drain() use it to import/export content as necessary. + + ***********************************************************************/ + + IBuffer setConduit (IConduit conduit) + { + sink = conduit.output; + source = conduit.input; + return this; + } + + /*********************************************************************** + + Set output stream + + Params: + sink = the stream to attach to + + Remarks: + Sets the external output stream associated with this buffer. + + Buffers do not require an external stream to operate, but + it can be convenient to associate one. For example, methods + fill & drain use them to import/export content as necessary. + + ***********************************************************************/ + + final IBuffer output (OutputStream sink) + { + this.sink = sink; + return this; + } + + /*********************************************************************** + + Set input stream + + Params: + source = the stream to attach to + + Remarks: + Sets the external input stream associated with this buffer. + + Buffers do not require an external stream to operate, but + it can be convenient to associate one. For example, methods + fill & drain use them to import/export content as necessary. + + ***********************************************************************/ + + final IBuffer input (InputStream source) + { + this.source = source; + return this; + } + + /*********************************************************************** + + Access buffer content + + Remarks: + Return the entire backing array. Exposed for subclass usage + only + + ***********************************************************************/ + + protected void[] getContent () + { + return data; + } + + /*********************************************************************** + + Copy content into buffer + + Params: + src = the soure of the content + size = the length of content at src + + Remarks: + Bulk _copy of data from 'src'. The new content is made + available for reading. This is exposed for subclass use + only + + ***********************************************************************/ + + protected void copy (void *src, uint size) + { + // avoid "out of bounds" test on zero size + if (size) + { + // content may overlap ... + memcpy (&data[extent], src, size); + extent += size; + } + } + + /*********************************************************************** + + Cast to a target type without invoking the wrath of the + runtime checks for misalignment. Instead, we truncate the + array length + + ***********************************************************************/ + + static T[] convert(T)(void[] x) + { + return (cast(T*) x.ptr) [0 .. (x.length / T.sizeof)]; + } + + + + /**********************************************************************/ + /*********************** Buffered Interface ***************************/ + /**********************************************************************/ + + IBuffer buffer () + { + return this; + } + + + /**********************************************************************/ + /******************** Stream & Conduit Interfaces *********************/ + /**********************************************************************/ + + + /*********************************************************************** + + Return the name of this conduit + + ***********************************************************************/ + + override char[] toString () + { + return ""; + } + + /*********************************************************************** + + Generic IOException thrower + + Params: + msg = a text message describing the exception reason + + Remarks: + Throw an IOException with the provided message + + ***********************************************************************/ + + final void error (char[] msg) + { + throw new IOException (msg); + } + + /*********************************************************************** + + Flush all buffer content to the specific conduit + + Remarks: + Flush the contents of this buffer. This will block until + all content is actually flushed via the associated conduit, + whereas drain() will not. + + Do nothing where a conduit is not attached, enabling memory + buffers to treat flush as a noop. + + Throws an IOException on premature Eof. + + ***********************************************************************/ + + override OutputStream flush () + { + if (sink) + { + while (readable() > 0) + drain (sink); + + // flush the filter chain also + sink.flush; + } + return this; + } + + /*********************************************************************** + + Clear buffer content + + Remarks: + Reset 'position' and 'limit' to zero. This effectively + clears all content from the buffer. + + ***********************************************************************/ + + override InputStream clear () + { + index = extent = 0; + + // clear the filter chain also + if (source) + source.clear; + return this; + } + + /*********************************************************************** + + Copy content via this buffer from the provided src + conduit. + + Remarks: + The src conduit has its content transferred through + this buffer via a series of fill & drain operations, + until there is no more content available. The buffer + content should be explicitly flushed by the caller. + + Throws an IOException on premature eof + + ***********************************************************************/ + + override OutputStream copy (InputStream src) + { + while (fill(src) != IConduit.Eof) + // don't drain until we actually need to + if (writable is 0) + if (sink) + drain (sink); + else + error (overflow); + return this; + } + + /*********************************************************************** + + Transfer content into the provided dst + + Params: + dst = destination of the content + + Returns: + return the number of bytes read, which may be less than + dst.length. Eof is returned when no further content is + available. + + Remarks: + Populates the provided array with content. We try to + satisfy the request from the buffer content, and read + directly from an attached conduit when the buffer is + empty. + + ***********************************************************************/ + + override uint read (void[] dst) + { + uint content = readable(); + if (content) + { + if (content >= dst.length) + content = dst.length; + + // transfer buffer content + dst [0 .. content] = data [index .. index + content]; + index += content; + } + else + if (source) + { + // pathological cases read directly from conduit + if (dst.length > dimension) + content = source.read (dst); + else + // keep buffer partially populated + if ((content = fill(source)) != IConduit.Eof && content > 0) + content = read (dst); + } + else + content = IConduit.Eof; + return content; + } + + /*********************************************************************** + + Emulate OutputStream.write() + + Params: + src = the content to write + + Returns: + return the number of bytes written, which may be less than + provided (conceptually). + + Remarks: + Appends src content to the buffer, flushing to an attached + conduit as necessary. An IOException is thrown upon write + failure. + + ***********************************************************************/ + + override uint write (void[] src) + { + append (src.ptr, src.length); + return src.length; + } + + /*********************************************************************** + + Access configured conduit + + Returns: + Returns the conduit associated with this buffer. Returns + null if the buffer is purely memory based; that is, it's + not backed by some external medium. + + Remarks: + Buffers do not require an external conduit to operate, but + it can be convenient to associate one. For example, methods + fill() & drain() use it to import/export content as necessary. + + ***********************************************************************/ + + final override IConduit conduit () + { + if (sink) + return sink.conduit; + else + if (source) + return source.conduit; + return this; + } + + /*********************************************************************** + + Return a preferred size for buffering conduit I/O + + ***********************************************************************/ + + final override uint bufferSize () + { + return 32 * 1024; + } + + /*********************************************************************** + + Is the conduit alive? + + ***********************************************************************/ + + final override bool isAlive () + { + return true; + } + + /*********************************************************************** + + Exposes configured output stream + + Returns: + Returns the OutputStream associated with this buffer. Returns + null if the buffer is not attached to an output; that is, it's + not backed by some external medium. + + Remarks: + Buffers do not require an external stream to operate, but + it can be convenient to associate them. For example, methods + fill & drain use them to import/export content as necessary. + + ***********************************************************************/ + + final OutputStream output () + { + return sink; + } + + /*********************************************************************** + + Exposes configured input stream + + Returns: + Returns the InputStream associated with this buffer. Returns + null if the buffer is not attached to an input; that is, it's + not backed by some external medium. + + Remarks: + Buffers do not require an external stream to operate, but + it can be convenient to associate them. For example, methods + fill & drain use them to import/export content as necessary. + + ***********************************************************************/ + + final InputStream input () + { + return source; + } + + /*********************************************************************** + + Release external resources + + ***********************************************************************/ + + final override void detach () + { + } + + /*********************************************************************** + + Close the stream + + Remarks: + Propagate request to an attached OutputStream (this is a + requirement for the OutputStream interface) + + ***********************************************************************/ + + override void close () + { + if (sink) + sink.close; + else + if (source) + source.close; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/Conduit.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/Conduit.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,384 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: March 2004 + + author: Kris + +*******************************************************************************/ + +module tango.io.Conduit; + +private import tango.core.Exception; + +public import tango.io.model.IConduit; + +/******************************************************************************* + + Conduit abstract base-class, implementing interface IConduit. + Only the conduit-specific read(), write(), fileHandle() and + bufferSize() need to be implemented for a concrete conduit + implementation. See FileConduit for an example. + + Conduits provide virtualized access to external content, and + represent things like files or Internet connections. Conduits + expose a pair of streams, are modelled by tango.io.model.IConduit, + and are implemented via classes such as FileConduit & SocketConduit. + + Additional kinds of conduit are easy to construct: one either + subclasses tango.io.Conduit, or implements tango.io.model.IConduit. + A conduit typically reads and writes from/to an IBuffer in large + chunks, typically the entire buffer. Alternatively, one can invoke + input.read(dst[]) and/or output.write(src[]) directly. + +*******************************************************************************/ + +class Conduit : IConduit, ISelectable +{ + /*********************************************************************** + + Return the name of this conduit + + ***********************************************************************/ + + abstract char[] toString (); + + /*********************************************************************** + + Return a preferred size for buffering conduit I/O + + ***********************************************************************/ + + abstract uint bufferSize (); + + /*********************************************************************** + + Models a handle-oriented device. We need to revisit this + + TODO: figure out how to avoid exposing this in the general + case + + ***********************************************************************/ + + abstract Handle fileHandle (); + + /*********************************************************************** + + Read from conduit into a target array. The provided dst + will be populated with content from the conduit. + + Returns the number of bytes read, which may be less than + requested in dst. Eof is returned whenever an end-of-flow + condition arises. + + ***********************************************************************/ + + abstract uint read (void[] dst); + + /*********************************************************************** + + Write to conduit from a source array. The provided src + content will be written to the conduit. + + Returns the number of bytes written from src, which may + be less than the quantity provided. Eof is returned when + an end-of-flow condition arises. + + ***********************************************************************/ + + abstract uint write (void [] src); + + /*********************************************************************** + + Disconnect this conduit + + ***********************************************************************/ + + abstract void detach (); + + /*********************************************************************** + + Is the conduit alive? Default behaviour returns true + + ***********************************************************************/ + + bool isAlive () + { + return true; + } + + /*********************************************************************** + + Return the host. This is part of the Stream interface + + ***********************************************************************/ + + final IConduit conduit() + { + return this; + } + + /*********************************************************************** + + clear any buffered input + + ***********************************************************************/ + + InputStream clear () {return this;} + + /*********************************************************************** + + Write buffered output + + ***********************************************************************/ + + OutputStream flush () {return this;} + + /*********************************************************************** + + Close this conduit + + Remarks: + Both input and output are detached, and are no longer usable + + ***********************************************************************/ + + final void close () + { + this.detach; + } + + /*********************************************************************** + + Return the current input stream + + ***********************************************************************/ + + final InputStream input () + { + return this; + } + + /*********************************************************************** + + Return the current output stream + + ***********************************************************************/ + + final OutputStream output () + { + return this; + } + + /*********************************************************************** + + Throw an IOException, with the provided message + + ***********************************************************************/ + + final void error (char[] msg) + { + throw new IOException (msg); + } + + /*********************************************************************** + + Transfer the content of another conduit to this one. Returns + the dst OutputStream, or throws IOException on failure. + + ***********************************************************************/ + + final OutputStream copy (InputStream src) + { + return transfer (src, this); + } + + /*********************************************************************** + + Transfer the content of one stream to another. Returns + the dst OutputStream, and throws IOException on failure. + Queries dst to identify what size of buffer to utilize. + + ***********************************************************************/ + + static OutputStream transfer (InputStream src, OutputStream dst) + { + uint len = 0; + auto con = dst.conduit; + auto tmp = new byte [con.bufferSize]; + while ((len = src.read(tmp)) != IConduit.Eof) + { + auto p = tmp.ptr; + for (uint j; len > 0; len -= j, p += j) + if ((j = dst.write (p[0..len])) is IConduit.Eof) + con.error ("Conduit.copy :: Eof while writing to: "~con.toString); + } + delete tmp; + return dst; + } +} + + +/******************************************************************************* + + Base class for input stream filtering + +*******************************************************************************/ + +class InputFilter : InputStream +{ + protected InputStream host; + + /*********************************************************************** + + Attach to the provided stream + + ***********************************************************************/ + + this (InputStream host) + { + assert (host, "input stream host cannot be null"); + this.host = host; + } + + /*********************************************************************** + + Return the hosting conduit + + ***********************************************************************/ + + IConduit conduit () + { + return host.conduit; + } + + /*********************************************************************** + + Read from conduit into a target array. The provided dst + will be populated with content from the conduit. + + Returns the number of bytes read, which may be less than + requested in dst. Eof is returned whenever an end-of-flow + condition arises. + + ***********************************************************************/ + + uint read (void[] dst) + { + return host.read (dst); + } + + /*********************************************************************** + + Clear any buffered content + + ***********************************************************************/ + + InputStream clear () + { + host.clear; + return this; + } + + /*********************************************************************** + + Close the input + + ***********************************************************************/ + + void close () + { + host.close; + } +} + + +/******************************************************************************* + + Base class for output stream filtering + +*******************************************************************************/ + +class OutputFilter : OutputStream +{ + protected OutputStream host; + + /*********************************************************************** + + Attach to the provided stream + + ***********************************************************************/ + + this (OutputStream host) + { + assert (host, "output stream host cannot be null"); + this.host = host; + } + + /*********************************************************************** + + Return the hosting conduit + + ***********************************************************************/ + + IConduit conduit () + { + return host.conduit; + } + + /*********************************************************************** + + Write to conduit from a source array. The provided src + content will be written to the conduit. + + Returns the number of bytes written from src, which may + be less than the quantity provided. Eof is returned when + an end-of-flow condition arises. + + ***********************************************************************/ + + uint write (void[] src) + { + return host.write (src); + } + + /*********************************************************************** + + Emit/purge buffered content + + ***********************************************************************/ + + OutputStream flush () + { + host.flush; + return this; + } + + /*********************************************************************** + + Close the output + + ***********************************************************************/ + + void close () + { + host.close; + } + + /*********************************************************************** + + Transfer the content of another conduit to this one. Returns + a reference to this class, or throws IOException on failure. + + ***********************************************************************/ + + OutputStream copy (InputStream src) + { + return Conduit.transfer (src, this); + } +} + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/Console.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/Console.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,652 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: Feb 2005 + version: Heavily revised for unicode; November 2005 + Outback release: December 2006 + + author: Kris + +*******************************************************************************/ + +module tango.io.Console; + +private import tango.sys.Common; + +private import tango.io.Buffer, + tango.io.DeviceConduit; + + +version (Posix) + private import tango.stdc.posix.unistd; // needed for isatty() + + +/******************************************************************************* + + low level console IO support. + + Note that for a while this was templated for each of char, wchar, + and dchar. It became clear after some usage that the console is + more useful if it sticks to Utf8 only. See ConsoleConduit below + for details. + + Redirecting the standard IO handles (via a shell) operates as one + would expect, though the redirected content should likely restrict + itself to utf8 + +*******************************************************************************/ + +struct Console +{ + version (Win32) + const char[] Eol = "\r\n"; + else + const char[] Eol = "\n"; + + + /********************************************************************** + + Model console input as a buffer. Note that we read utf8 + only. + + **********************************************************************/ + + class Input + { + private Buffer buffer; + private bool redirect; + + public alias copyln get; + + /************************************************************** + + Attach console input to the provided device + + **************************************************************/ + + private this (Conduit conduit, bool redirected) + { + redirect = redirected; + buffer = new Buffer (conduit); + } + + /************************************************************** + + Return the next line available from the console, + or null when there is nothing available. The value + returned is a duplicate of the buffer content (it + has .dup applied). + + Each line ending is removed unless parameter raw is + set to true + + **************************************************************/ + + final char[] copyln (bool raw = false) + { + char[] line; + + return readln (line, raw) ? line.dup : null; + } + + /************************************************************** + + Retreive a line of text from the console and map + it to the given argument. The input is sliced, + not copied, so use .dup appropriately. Each line + ending is removed unless parameter raw is set to + true. + + Returns false when there is no more input. + + **************************************************************/ + + final bool readln (inout char[] content, bool raw=false) + { + uint line (void[] input) + { + auto text = cast(char[]) input; + foreach (i, c; text) + if (c is '\n') + { + auto j = i; + if (raw) + ++j; + else + if (j && (text[j-1] is '\r')) + --j; + content = text [0 .. j]; + return i+1; + } + return IConduit.Eof; + } + + return buffer.next(&line) || + (content = cast(char[]) buffer.slice(buffer.readable), false); + } + + /************************************************************** + + Return the associated stream + + **************************************************************/ + + final InputStream stream () + { + return buffer; + } + + /************************************************************** + + Is this device redirected? + + Returns: + True if redirected, false otherwise. + + Remarks: + Reflects the console redirection status from when + this module was instantiated + + **************************************************************/ + + final bool redirected () + { + return redirect; + } + + /************************************************************** + + Set redirection state to the provided boolean + + Remarks: + Configure the console redirection status, where + a redirected console is more efficient (dictates + whether newline() performs automatic flushing or + not) + + **************************************************************/ + + final Input redirected (bool yes) + { + redirect = yes; + return this; + } + + /************************************************************** + + Returns the configured source + + Remarks: + Provides access to the underlying mechanism for + console input. Use this to retain prior state + when temporarily switching inputs + + **************************************************************/ + + final InputStream input () + { + return buffer.input; + } + + /************************************************************** + + Divert input to an alternate source + + **************************************************************/ + + final Input input (InputStream source) + { + buffer.input = source; + return this; + } + } + + + /********************************************************************** + + Console output accepts utf8 only, by default + + **********************************************************************/ + + class Output + { + private Buffer buffer; + private bool redirect; + + public alias append opCall; + public alias flush opCall; + + /************************************************************** + + Attach console output to the provided device + + **************************************************************/ + + private this (Conduit conduit, bool redirected) + { + redirect = redirected; + buffer = new Buffer (conduit); + } + + /************************************************************** + + Append to the console. We accept UTF8 only, so + all other encodings should be handled via some + higher level API + + **************************************************************/ + + final Output append (char[] x) + { + buffer.append (x.ptr, x.length); + return this; + } + + /************************************************************** + + Append content + + Params: + other = an object with a useful toString() method + + Returns: + Returns a chaining reference if all content was + written. Throws an IOException indicating eof or + eob if not. + + Remarks: + Append the result of other.toString() to the console + + **************************************************************/ + + final Output append (Object other) + { + return append (other.toString); + } + + /************************************************************** + + Append a newline and flush the console buffer. If + the output is redirected, flushing does not occur + automatically. + + Returns: + Returns a chaining reference if content was written. + Throws an IOException indicating eof or eob if not. + + Remarks: + Emit a newline into the buffer, and autoflush the + current buffer content for an interactive console. + Redirected consoles do not flush automatically on + a newline. + + **************************************************************/ + + final Output newline () + { + buffer.append (Eol); + if (redirect is false) + buffer.flush; + + return this; + } + + /************************************************************** + + Explicitly flush console output + + Returns: + Returns a chaining reference if content was written. + Throws an IOException indicating eof or eob if not. + + Remarks: + Flushes the console buffer to attached conduit + + **************************************************************/ + + final Output flush () + { + buffer.flush; + return this; + } + + /************************************************************** + + Return the associated stream + + **************************************************************/ + + final OutputStream stream () + { + return buffer; + } + + /************************************************************** + + Is this device redirected? + + Returns: + True if redirected, false otherwise. + + Remarks: + Reflects the console redirection status + + **************************************************************/ + + final bool redirected () + { + return redirect; + } + + /************************************************************** + + Set redirection state to the provided boolean + + Remarks: + Configure the console redirection status, where + a redirected console is more efficient (dictates + whether newline() performs automatic flushing or + not) + + **************************************************************/ + + final Output redirected (bool yes) + { + redirect = yes; + return this; + } + + /************************************************************** + + Returns the configured output sink + + Remarks: + Provides access to the underlying mechanism for + console output. Use this to retain prior state + when temporarily switching outputs + + **************************************************************/ + + final OutputStream output () + { + return buffer.output; + } + + /************************************************************** + + Divert output to an alternate sink + + **************************************************************/ + + final Output output (OutputStream sink) + { + buffer.output = sink; + return this; + } + } + + + /*********************************************************************** + + Conduit for specifically handling the console devices. This + takes care of certain implementation details on the Win32 + platform. + + Note that the console is fixed at Utf8 for both linux and + Win32. The latter is actually Utf16 native, but it's just + too much hassle for a developer to handle the distinction + when it really should be a no-brainer. In particular, the + Win32 console functions don't work with redirection. This + causes additional difficulties that can be ameliorated by + asserting console I/O is always Utf8, in all modes. + + ***********************************************************************/ + + class Conduit : DeviceConduit + { + private bool redirected = false; + + /*********************************************************************** + + Return the name of this conduit + + ***********************************************************************/ + + override char[] toString() + { + return ""; + } + + /*************************************************************** + + Windows-specific code + + ***************************************************************/ + + version (Win32) + { + private wchar[] input; + private wchar[] output; + + /******************************************************* + + Create a FileConduit on the provided + FileDevice. + + This is strictly for adapting existing + devices such as Stdout and friends + + *******************************************************/ + + this (uint handle) + { + input = new wchar [1024 * 1]; + output = new wchar [1024 * 1]; + reopen (cast(Handle) handle); + } + + /******************************************************* + + Gain access to the standard IO handles + + *******************************************************/ + + private override void reopen (Handle handle_) + { + static const DWORD[] id = [ + cast(DWORD) -10, + cast(DWORD) -11, + cast(DWORD) -12 + ]; + static const char[][] f = [ + "CONIN$\0", + "CONOUT$\0", + "CONOUT$\0" + ]; + + assert (handle_ < 3); + handle = GetStdHandle (id[handle_]); + if (handle is null) + handle = CreateFileA (f[handle_].ptr, + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + null, OPEN_EXISTING, 0, cast(HANDLE) 0); + if (handle is null) + error (); + + // are we redirecting? + DWORD mode; + if (! GetConsoleMode (handle, &mode)) + redirected = true; + } + + /******************************************************* + + Write a chunk of bytes to the console from the + provided array (typically that belonging to + an IBuffer) + + *******************************************************/ + + version (Win32SansUnicode) + {} + else + { + override uint write (void[] src) + { + if (redirected) + return super.write (src); + else + { + DWORD i = src.length; + + // protect conversion from empty strings + if (i is 0) + return 0; + + // expand buffer appropriately + if (output.length < i) + output.length = i; + + // convert into output buffer + i = MultiByteToWideChar (CP_UTF8, 0, cast(char*) src.ptr, i, + output.ptr, output.length); + + // flush produced output + for (wchar* p=output.ptr, end=output.ptr+i; p < end; p+=i) + { + const int MAX = 16 * 1024; + + // avoid console limitation of 64KB + DWORD len = end - p; + if (len > MAX) + { + len = MAX; + // check for trailing surrogate ... + if ((p[len-1] & 0xfc00) is 0xdc00) + --len; + } + if (! WriteConsoleW (handle, p, len, &i, null)) + error(); + } + return src.length; + } + } + } + + /******************************************************* + + Read a chunk of bytes from the console into the + provided array (typically that belonging to + an IBuffer) + + *******************************************************/ + + version (Win32SansUnicode) + {} + else + { + protected override uint read (void[] dst) + { + if (redirected) + return super.read (dst); + else + { + DWORD i = dst.length / 4; + + assert (i); + + if (i > input.length) + i = input.length; + + // read a chunk of wchars from the console + if (! ReadConsoleW (handle, input.ptr, i, &i, null)) + error(); + + // no input ~ go home + if (i is 0) + return Eof; + + // translate to utf8, directly into dst + i = WideCharToMultiByte (CP_UTF8, 0, input.ptr, i, + cast(char*) dst.ptr, dst.length, null, null); + if (i is 0) + error (); + + return i; + } + } + } + + } + else + { + /******************************************************* + + Create a FileConduit on the provided + FileDevice. + + This is strictly for adapting existing + devices such as Stdout and friends + + *******************************************************/ + + private this (Handle handle) + { + reopen (handle); + redirected = (isatty(handle) is 0); + } + } + } +} + + +/****************************************************************************** + + Globals representing Console IO + +******************************************************************************/ + +static Console.Input Cin; /// the standard input stream +static Console.Output Cout, /// the standard output stream + Cerr; /// the standard error stream + + +/****************************************************************************** + + Instantiate Console access + +******************************************************************************/ + +static this () +{ + auto conduit = new Console.Conduit (0); + Cin = new Console.Input (conduit, conduit.redirected); + + conduit = new Console.Conduit (1); + Cout = new Console.Output (conduit, conduit.redirected); + + conduit = new Console.Conduit (2); + Cerr = new Console.Output (conduit, conduit.redirected); +} + + +/****************************************************************************** + + Flush outputs before we exit + + (good idea from Frits Van Bommel) + +******************************************************************************/ + +static ~this() +{ + synchronized (Cout) + Cout.flush; + + synchronized (Cerr) + Cerr.flush; +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/DeviceConduit.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/DeviceConduit.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,240 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: May 2005 + + author: Kris + +*******************************************************************************/ + +module tango.io.DeviceConduit; + +private import tango.sys.Common; + +public import tango.io.Conduit; + +private import tango.core.Exception; + +/******************************************************************************* + + Implements a means of reading and writing a file device. Conduits + are the primary means of accessing external data, and are usually + routed through a Buffer. + +*******************************************************************************/ + +class DeviceConduit : Conduit +{ + /// expose in superclass definition also + public alias Conduit.error error; + + /*********************************************************************** + + Throw an IOException noting the last error + + ***********************************************************************/ + + final void error () + { + super.error (toString() ~ " :: " ~ SysError.lastMsg); + } + + /*********************************************************************** + + Return the name of this device + + ***********************************************************************/ + + override char[] toString() + { + return ""; + } + + /*********************************************************************** + + Return a preferred size for buffering conduit I/O + + ***********************************************************************/ + + override uint bufferSize () + { + return 1024 * 16; + } + + /*********************************************************************** + + Windows-specific code + + ***********************************************************************/ + + version (Win32) + { + protected HANDLE handle; + + /*************************************************************** + + Gain access to the standard IO handles (console etc). + + ***************************************************************/ + + protected void reopen (Handle handle) + { + this.handle = cast(HANDLE) handle; + } + + /*************************************************************** + + Return the underlying OS handle of this Conduit + + ***************************************************************/ + + final override Handle fileHandle () + { + return cast(Handle) handle; + } + + /*************************************************************** + + Release the underlying file + + ***************************************************************/ + + override void detach () + { + if (handle) + if (! CloseHandle (handle)) + error (); + handle = cast(HANDLE) null; + } + + /*************************************************************** + + Read a chunk of bytes from the file into the provided + array (typically that belonging to an IBuffer). + + Returns the number of bytes read, or Eof when there is + no further data + + ***************************************************************/ + + override uint read (void[] dst) + { + DWORD read; + void *p = dst.ptr; + + if (! ReadFile (handle, p, dst.length, &read, null)) + // make Win32 behave like linux + if (SysError.lastCode is ERROR_BROKEN_PIPE) + return Eof; + else + error (); + + if (read is 0 && dst.length > 0) + return Eof; + return read; + } + + /*************************************************************** + + Write a chunk of bytes to the file from the provided + array (typically that belonging to an IBuffer) + + ***************************************************************/ + + override uint write (void[] src) + { + DWORD written; + + if (! WriteFile (handle, src.ptr, src.length, &written, null)) + error (); + + return written; + } + } + + + /*********************************************************************** + + Unix-specific code. + + ***********************************************************************/ + + version (Posix) + { + protected int handle = -1; + + /*************************************************************** + + Gain access to the standard IO handles (console etc). + + ***************************************************************/ + + protected void reopen (Handle handle) + { + this.handle = handle; + } + + /*************************************************************** + + Return the underlying OS handle of this Conduit + + ***************************************************************/ + + final override Handle fileHandle () + { + return cast(Handle) handle; + } + + /*************************************************************** + + Release the underlying file + + ***************************************************************/ + + override void detach () + { + if (handle >= 0) + if (posix.close (handle) is -1) + error (); + handle = -1; + } + + /*************************************************************** + + Read a chunk of bytes from the file into the provided + array (typically that belonging to an IBuffer) + + ***************************************************************/ + + override uint read (void[] dst) + { + int read = posix.read (handle, dst.ptr, dst.length); + if (read == -1) + error (); + else + if (read is 0 && dst.length > 0) + return Eof; + return read; + } + + /*************************************************************** + + Write a chunk of bytes to the file from the provided + array (typically that belonging to an IBuffer) + + ***************************************************************/ + + override uint write (void[] src) + { + int written = posix.write (handle, src.ptr, src.length); + if (written is -1) + error (); + return written; + } + } +} + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/File.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/File.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,154 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Mar 2005: Initial release + version: Feb 2007: No longer a proxy subclass + + author: Kris + +*******************************************************************************/ + +module tango.io.File; + +private import tango.io.FilePath, + tango.io.FileConduit; + +private import tango.core.Exception; + +/******************************************************************************* + + A wrapper atop of FileConduit to expose a simpler API. This one + returns the entire file content as a void[], and sets the content + to reflect a given void[]. + + Method read() returns the current content of the file, whilst write() + sets the file content, and file length, to the provided array. Method + append() adds content to the tail of the file. + + Methods to inspect the file system, check the status of a file or + directory and other facilities are made available via the associated + path (exposed via the path() method) + +*******************************************************************************/ + +class File +{ + private PathView path_; + + /*********************************************************************** + + Construct a File from a text string + + ***********************************************************************/ + + this (char[] path) + { + this (new FilePath (path)); + } + + /*********************************************************************** + + Construct a File from the provided FilePath + + ***********************************************************************/ + + this (PathView path) + { + path_ = path; + } + + /*********************************************************************** + + Call-site shortcut to create a File instance. This + enables the same syntax as struct usage, so may expose + a migration path + + ***********************************************************************/ + + static File opCall (char[] path) + { + return new File (path); + } + + /*********************************************************************** + + Return the path for this file instance + + ***********************************************************************/ + + final PathView path () + { + return path_; + } + + /*********************************************************************** + + Return the content of the file. + + ***********************************************************************/ + + final void[] read () + { + scope conduit = new FileConduit (path_); + scope (exit) + conduit.close; + + // allocate enough space for the entire file + auto content = new ubyte [cast(uint) conduit.length]; + + //read the content + if (conduit.input.read (content) != content.length) + conduit.error ("unexpected eof"); + + return content; + } + + /*********************************************************************** + + Set the file content and length to reflect the given array. + + ***********************************************************************/ + + final File write (void[] content) + { + return write (content, FileConduit.ReadWriteCreate); + } + + /*********************************************************************** + + Append content to the file. + + ***********************************************************************/ + + final File append (void[] content) + { + return write (content, FileConduit.WriteAppending); + } + + /*********************************************************************** + + Set the file content and length to reflect the given array. + + ***********************************************************************/ + + private File write (void[] content, FileConduit.Style style) + { + scope conduit = new FileConduit (path_, style); + scope (exit) + conduit.close; + + conduit.output.write (content); + return this; + } +} + +debug (File) +{ + void main() + { + auto content = File("file.d").read; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/FileConduit.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/FileConduit.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,583 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: March 2004 + Outback release: December 2006 + + author: $(UL Kris) + $(UL John Reimer) + $(UL Anders F Bjorklund (Darwin patches)) + $(UL Chris Sauls (Win95 file support)) + +*******************************************************************************/ + +module tango.io.FileConduit; + +private import tango.sys.Common; + +public import tango.io.FilePath; + +private import tango.io.DeviceConduit; + +private import Utf = tango.text.convert.Utf; + +/******************************************************************************* + + Other O/S functions + +*******************************************************************************/ + +version (Win32) + private extern (Windows) BOOL SetEndOfFile (HANDLE); + else + private extern (C) int ftruncate (int, int); + + +/******************************************************************************* + + Implements a means of reading and writing a generic file. Conduits + are the primary means of accessing external data and FileConduit + extends the basic pattern by providing file-specific methods to + set the file size, seek to a specific file position and so on. + + Serial input and output is straightforward. In this example we + copy a file directly to the console: + --- + // open a file for reading + auto from = new FileConduit ("test.txt"); + + // stream directly to console + Stdout.copy (from); + --- + + And here we copy one file to another: + --- + // open another for writing + auto to = new FileConduit ("copy.txt", FileConduit.WriteCreate); + + // copy file + to.output.copy (new FileConduit("test.txt")); + --- + + To load a file directly into memory one might do this: + --- + // open file for reading + auto fc = new FileConduit ("test.txt"); + + // create an array to house the entire file + auto content = new char[fc.length]; + + // read the file content. Return value is the number of bytes read + auto bytesRead = fc.input.read (content); + --- + + Conversely, one may write directly to a FileConduit, like so: + --- + // open file for writing + auto to = new FileConduit ("text.txt", FileConduit.WriteCreate); + + // write an array of content to it + auto bytesWritten = to.output.write (content); + --- + + FileConduit can just as easily handle random IO. Here we use seek() + to relocate the file pointer and, for variation, apply a protocol to + perform simple input and output: + --- + // open a file for reading + auto fc = new FileConduit ("random.bin", FileConduit.ReadWriteCreate); + + // construct (binary) reader & writer upon this conduit + auto read = new Reader (fc); + auto write = new Writer (fc); + + int x=10, y=20; + + // write some data, and flush output since protocol IO is buffered + write (x) (y) (); + + // rewind to file start + fc.seek (0); + + // read data back again + read (x) (y); + + fc.close(); + --- + + See File, FilePath, FileConst, FileScan, and FileSystem for + additional functionality related to file manipulation. + + Compile with -version=Win32SansUnicode to enable Win95 & Win32s file + support. + +*******************************************************************************/ + +class FileConduit : DeviceConduit, DeviceConduit.Seek +{ + /*********************************************************************** + + Fits into 32 bits ... + + ***********************************************************************/ + + struct Style + { + align (1): + + Access access; /// access rights + Open open; /// how to open + Share share; /// how to share + Cache cache; /// how to cache + } + + /*********************************************************************** + + ***********************************************************************/ + + enum Access : ubyte { + Read = 0x01, /// is readable + Write = 0x02, /// is writable + ReadWrite = 0x03, /// both + } + + /*********************************************************************** + + ***********************************************************************/ + + enum Open : ubyte { + Exists=0, /// must exist + Create, /// create or truncate + Sedate, /// create if necessary + Append, /// create if necessary + }; + + /*********************************************************************** + + ***********************************************************************/ + + enum Share : ubyte { + None=0, /// no sharing + Read, /// shared reading + ReadWrite, /// open for anything + }; + + /*********************************************************************** + + ***********************************************************************/ + + enum Cache : ubyte { + None = 0x00, /// don't optimize + Random = 0x01, /// optimize for random + Stream = 0x02, /// optimize for stream + WriteThru = 0x04, /// backing-cache flag + }; + + /*********************************************************************** + + Read an existing file + + ***********************************************************************/ + + const Style ReadExisting = {Access.Read, Open.Exists}; + + /*********************************************************************** + + Write on an existing file. Do not create + + ***********************************************************************/ + + const Style WriteExisting = {Access.Write, Open.Exists}; + + /*********************************************************************** + + Write on a clean file. Create if necessary + + ***********************************************************************/ + + const Style WriteCreate = {Access.Write, Open.Create}; + + /*********************************************************************** + + Write at the end of the file + + ***********************************************************************/ + + deprecated const Style WriteAppending = {Access.Write, Open.Append}; + + /*********************************************************************** + + Read and write an existing file + + ***********************************************************************/ + + const Style ReadWriteExisting = {Access.ReadWrite, Open.Exists}; + + /*********************************************************************** + + Read & write on a clean file. Create if necessary + + ***********************************************************************/ + + const Style ReadWriteCreate = {Access.ReadWrite, Open.Create}; + + /*********************************************************************** + + Read and Write. Use existing file if present + + ***********************************************************************/ + + const Style ReadWriteOpen = {Access.ReadWrite, Open.Sedate}; + + + + + // the file we're working with + private PathView path_; + + // the style we're opened with + private Style style_; + + /*********************************************************************** + + Create a FileConduit with the provided path and style. + + ***********************************************************************/ + + this (char[] name, Style style = ReadExisting) + { + this (new FilePath(name), style); + } + + /*********************************************************************** + + Create a FileConduit with the provided path and style. + + ***********************************************************************/ + + this (PathView path, Style style = ReadExisting) + { + // remember who we are + path_ = path; + + // open the file + open (this.style_ = style); + } + + /*********************************************************************** + + Return the PathView used by this file. + + ***********************************************************************/ + + PathView path () + { + return path_; + } + + /*********************************************************************** + + Return the Style used for this file. + + ***********************************************************************/ + + Style style () + { + return style_; + } + + /*********************************************************************** + + Return the name of the FilePath used by this file. + + ***********************************************************************/ + + override char[] toString () + { + return path_.toString; + } + + /*********************************************************************** + + Return the current file position. + + ***********************************************************************/ + + long position () + { + return seek (0, Seek.Anchor.Current); + } + + /*********************************************************************** + + Return the total length of this file. + + ***********************************************************************/ + + long length () + { + long pos, + ret; + + pos = position (); + ret = seek (0, Seek.Anchor.End); + seek (pos); + return ret; + } + + + /*********************************************************************** + + Windows-specific code + + ***********************************************************************/ + + version(Win32) + { + private bool appending; + + /*************************************************************** + + Open a file with the provided style. + + ***************************************************************/ + + protected void open (Style style) + { + DWORD attr, + share, + access, + create; + + alias DWORD[] Flags; + + static const Flags Access = + [ + 0, // invalid + GENERIC_READ, + GENERIC_WRITE, + GENERIC_READ | GENERIC_WRITE, + ]; + + static const Flags Create = + [ + OPEN_EXISTING, // must exist + CREATE_ALWAYS, // truncate always + OPEN_ALWAYS, // create if needed + OPEN_ALWAYS, // (for appending) + ]; + + static const Flags Share = + [ + 0, + FILE_SHARE_READ, + FILE_SHARE_READ | FILE_SHARE_WRITE, + ]; + + static const Flags Attr = + [ + 0, + FILE_FLAG_RANDOM_ACCESS, + FILE_FLAG_SEQUENTIAL_SCAN, + 0, + FILE_FLAG_WRITE_THROUGH, + ]; + + attr = Attr[style.cache]; + share = Share[style.share]; + create = Create[style.open]; + access = Access[style.access]; + + version (Win32SansUnicode) + handle = CreateFileA (path.cString.ptr, access, share, + null, create, + attr | FILE_ATTRIBUTE_NORMAL, + cast(HANDLE) null); + else + { + wchar[256] tmp = void; + auto name = Utf.toString16 (path.cString, tmp); + handle = CreateFileW (name.ptr, access, share, + null, create, + attr | FILE_ATTRIBUTE_NORMAL, + cast(HANDLE) null); + } + + if (handle is INVALID_HANDLE_VALUE) + error (); + + // move to end of file? + if (style.open is Open.Append) + appending = true; + } + + /*************************************************************** + + Write a chunk of bytes to the file from the provided + array (typically that belonging to an IBuffer) + + ***************************************************************/ + + override uint write (void[] src) + { + DWORD written; + + // try to emulate the Unix O_APPEND mode + if (appending) + SetFilePointer (handle, 0, null, Seek.Anchor.End); + + return super.write (src); + } + + /*************************************************************** + + Ensures that data is flushed immediately to disk + + ***************************************************************/ +/+ + override void commit () + { + if (style_.access & Access.Write) + if (! FlushFileBuffers (handle)) + error (); + } ++/ + /*************************************************************** + + Set the file size to be that of the current seek + position. The file must be writable for this to + succeed. + + ***************************************************************/ + + void truncate () + { + // must have Generic_Write access + if (! SetEndOfFile (handle)) + error (); + } + + /*************************************************************** + + Set the file seek position to the specified offset + from the given anchor. + + ***************************************************************/ + + long seek (long offset, Seek.Anchor anchor = Seek.Anchor.Begin) + { + LONG high = cast(LONG) (offset >> 32); + long result = SetFilePointer (handle, cast(LONG) offset, + &high, anchor); + + if (result is -1 && + GetLastError() != ERROR_SUCCESS) + error (); + + return result + (cast(long) high << 32); + } + } + + + /*********************************************************************** + + Unix-specific code. Note that some methods are 32bit only + + ***********************************************************************/ + + version (Posix) + { + /*************************************************************** + + Open a file with the provided style. + + Note that files default to no-sharing. That is, + they are locked exclusively to the host process + unless otherwise stipulated. We do this in order + to expose the same default behaviour as Win32 + + NO FILE LOCKING FOR BORKED POSIX + + ***************************************************************/ + + protected void open (Style style) + { + alias int[] Flags; + + const O_LARGEFILE = 0x8000; + + static const Flags Access = + [ + 0, // invalid + O_RDONLY, + O_WRONLY, + O_RDWR, + ]; + + static const Flags Create = + [ + 0, // open existing + O_CREAT | O_TRUNC, // truncate always + O_CREAT, // create if needed + O_APPEND | O_CREAT, // append + ]; + + static const short[] Locks = + [ + F_WRLCK, // no sharing + F_RDLCK, // shared read + ]; + + auto mode = Access[style.access] | Create[style.open]; + + // always open as a large file + handle = posix.open (path.cString.ptr, mode | O_LARGEFILE, 0666); + if (handle is -1) + error (); + } + + /*************************************************************** + + Ensures that data is flushed immediately to disk + + ***************************************************************/ +/+ + override void commit () + { + // no Posix API for this :( + } ++/ + /*************************************************************** + + Set the file size to be that of the current seek + position. The file must be writable for this to + succeed. + + ***************************************************************/ + + void truncate () + { + // set filesize to be current seek-position + if (ftruncate (handle, position) is -1) + error (); + } + + /*************************************************************** + + Set the file seek position to the specified offset + from the given anchor. + + ***************************************************************/ + + long seek (long offset, Seek.Anchor anchor = Seek.Anchor.Begin) + { + long result = posix.lseek (handle, offset, anchor); + if (result is -1) + error (); + return result; + } + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/FileConst.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/FileConst.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,65 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: March 2005 + + author: Kris + +*******************************************************************************/ + +module tango.io.FileConst; + +/******************************************************************************* + + A set of file-system specific constants for file and path + separators (chars and strings). + + Keep these constants mirrored for each OS + +*******************************************************************************/ + +struct FileConst +{ + version (Win32) + { + enum : char + { + CurrentDirChar = '.', + RootSeparatorChar = ':', + FileSeparatorChar = '.', + PathSeparatorChar = '/', + SystemPathChar = ';', + } + + static const char[] ParentDirString = ".."; + static const char[] CurrentDirString = "."; + static const char[] FileSeparatorString = "."; + static const char[] RootSeparatorString = ":"; + static const char[] PathSeparatorString = "/"; + static const char[] SystemPathString = ";"; + + static const char[] NewlineString = "\r\n"; + } + + version (Posix) + { + enum : char + { + CurrentDirChar = '.', + FileSeparatorChar = '.', + PathSeparatorChar = '/', + SystemPathChar = ':', + } + + static const char[] ParentDirString = ".."; + static const char[] CurrentDirString = "."; + static const char[] FileSeparatorString = "."; + static const char[] PathSeparatorString = "/"; + static const char[] SystemPathString = ":"; + + static const char[] NewlineString = "\n"; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/FilePath.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/FilePath.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,2083 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Oct 2004: Initial version + version: Nov 2006: Australian version + version: Feb 2007: Mutating version + version: Mar 2007: Folded FileProxy in + version: Nov 2007: VFS dictates '/' always be used + + author: Kris + +*******************************************************************************/ + +module tango.io.FilePath; + +private import tango.sys.Common; + +private import tango.io.FileConst; + +private import tango.core.Exception; + +private import tango.time.Time; + +/******************************************************************************* + +*******************************************************************************/ + +version (Win32) + { + version (Win32SansUnicode) + { + alias char T; + private extern (C) int strlen (char *s); + private alias WIN32_FIND_DATA FIND_DATA; + } + else + { + alias wchar T; + private extern (C) int wcslen (wchar *s); + private alias WIN32_FIND_DATAW FIND_DATA; + } + } + +version (Posix) + { + private import tango.stdc.stdio; + private import tango.stdc.string; + private import tango.stdc.posix.utime; + private import tango.stdc.posix.dirent; + } + +/******************************************************************************* + +*******************************************************************************/ + +private extern (C) void memmove (void* dst, void* src, uint bytes); + +/******************************************************************************* + + Models a file path. These are expected to be used as the constructor + argument to various file classes. The intention is that they easily + convert to other representations such as absolute, canonical, or Url. + + File paths containing non-ansi characters should be UTF-8 encoded. + Supporting Unicode in this manner was deemed to be more suitable + than providing a wchar version of FilePath, and is both consistent + & compatible with the approach taken with the Uri class. + + FilePath is designed to be transformed, thus each mutating method + modifies the internal content. There is a read-only base-class + called PathView, which can be used to provide a view into the + content as desired. + + Note that patterns of adjacent '.' separators are treated specially + in that they will be assigned to the name instead of the suffix. In + addition, a '.' at the start of a name signifies it does not belong + to the suffix i.e. ".file" is a name rather than a suffix. + + Note also that normalization of path-separators occurs by default. + This means that the use of '\' characters with be converted into + '/' instead while parsing. To mutate the path into an O/S native + version, use the native() method. To obtain a copy instead, use the + path.dup.native sequence + + Compile with -version=Win32SansUnicode to enable Win95 & Win32s file + support. + +*******************************************************************************/ + +class FilePath : PathView +{ + private char[] fp; // filepath with trailing 0 + + private bool dir_; // this represents a dir? + + private int end_, // before the trailing 0 + name_, // file/dir name + folder_, // path before name + suffix_; // after rightmost '.' + + public alias set opAssign; // path = x; + public alias append opCatAssign; // path ~= x; + + /*********************************************************************** + + Filter used for screening paths via toList() + + ***********************************************************************/ + + public alias bool delegate (FilePath, bool) Filter; + + /*********************************************************************** + + Passed around during file-scanning + + ***********************************************************************/ + + struct FileInfo + { + char[] path, + name; + ulong bytes; + bool folder; + } + + /*********************************************************************** + + Call-site shortcut to create a FilePath instance. This + enables the same syntax as struct usage, so may expose + a migration path + + ***********************************************************************/ + + static FilePath opCall (char[] filepath = null) + { + return new FilePath (filepath); + } + + /*********************************************************************** + + Create a FilePath from a copy of the provided string. + + FilePath assumes both path & name are present, and therefore + may split what is otherwise a logically valid path. That is, + the 'name' of a file is typically the path segment following + a rightmost path-separator. The intent is to treat files and + directories in the same manner; as a name with an optional + ancestral structure. It is possible to bias the interpretation + by adding a trailing path-separator to the argument. Doing so + will result in an empty name attribute. + + With regard to the filepath copy, we found the common case to + be an explicit .dup, whereas aliasing appeared to be rare by + comparison. We also noted a large proportion interacting with + C-oriented OS calls, implying the postfix of a null terminator. + Thus, FilePath combines both as a single operation. + + ***********************************************************************/ + + this (char[] filepath = null) + { + set (filepath); + } + + // now converts to '/' always. Use toNative to get Win32 paths + deprecated this (char[] filepath, bool native) + { + set (filepath); + } + + /*********************************************************************** + + Return the complete text of this filepath + + ***********************************************************************/ + + final char[] toString () + { + return fp [0 .. end_]; + } + + /*********************************************************************** + + Duplicate this path + + ***********************************************************************/ + + final FilePath dup () + { + return FilePath (toString); + } + + /*********************************************************************** + + Return the complete text of this filepath as a null + terminated string for use with a C api. Use toString + instead for any D api. + + Note that the nul is always embedded within the string + maintained by FilePath, so there's no heap overhead when + making a C call + + ***********************************************************************/ + + final char[] cString () + { + return fp [0 .. end_+1]; + } + + /*********************************************************************** + + Return the root of this path. Roots are constructs such as + "c:" + + ***********************************************************************/ + + final char[] root () + { + return fp [0 .. folder_]; + } + + /*********************************************************************** + + Return the file path. Paths may start and end with a "/". + The root path is "/" and an unspecified path is returned as + an empty string. Directory paths may be split such that the + directory name is placed into the 'name' member; directory + paths are treated no differently than file paths + + ***********************************************************************/ + + final char[] folder () + { + return fp [folder_ .. name_]; + } + + /*********************************************************************** + + Returns a path representing the parent of this one. This + will typically return the current path component, though + with a special case where the name component is empty. In + such cases, the path is scanned for a prior segment: + --- + normal: /x/y/z => /x/y + special: /x/y/ => /x + --- + + Note that this returns a path suitable for splitting into + path and name components (there's no trailing separator). + + See pop() also, which is generally more useful when working + with FilePath instances + + ***********************************************************************/ + + final char[] parent () + { + auto p = path; + if (name.length is 0) + for (int i=p.length-1; --i > 0;) + if (p[i] is FileConst.PathSeparatorChar) + { + p = p[0 .. i]; + break; + } + return stripped (p); + } + + /*********************************************************************** + + Return the name of this file, or directory. + + ***********************************************************************/ + + final char[] name () + { + return fp [name_ .. suffix_]; + } + + /*********************************************************************** + + Ext is the tail of the filename, rightward of the rightmost + '.' separator e.g. path "foo.bar" has ext "bar". Note that + patterns of adjacent separators are treated specially; for + example, ".." will wind up with no ext at all + + ***********************************************************************/ + + final char[] ext () + { + auto x = suffix; + if (x.length) + x = x [1..$]; + return x; + } + + /*********************************************************************** + + Suffix is like ext, but includes the separator e.g. path + "foo.bar" has suffix ".bar" + + ***********************************************************************/ + + final char[] suffix () + { + return fp [suffix_ .. end_]; + } + + /*********************************************************************** + + return the root + folder combination + + ***********************************************************************/ + + final char[] path () + { + return fp [0 .. name_]; + } + + /*********************************************************************** + + return the name + suffix combination + + ***********************************************************************/ + + final char[] file () + { + return fp [name_ .. end_]; + } + + /*********************************************************************** + + Returns true if all fields are equal. + + ***********************************************************************/ + + final override int opEquals (Object o) + { + return (this is o) || (o && toString == o.toString); + } + + /*********************************************************************** + + Does this FilePath equate to the given text? + + ***********************************************************************/ + + final override int opEquals (char[] s) + { + return toString() == s; + } + + /*********************************************************************** + + Returns true if this FilePath is *not* relative to the + current working directory + + ***********************************************************************/ + + final bool isAbsolute () + { + return (folder_ > 0) || + (folder_ < end_ && fp[folder_] is FileConst.PathSeparatorChar); + } + + /*********************************************************************** + + Returns true if this FilePath is empty + + ***********************************************************************/ + + final bool isEmpty () + { + return end_ is 0; + } + + /*********************************************************************** + + Returns true if this FilePath has a parent. Note that a + parent is defined by the presence of a path-separator in + the path. This means 'foo' within "\foo" is considered a + child of the root + + ***********************************************************************/ + + final bool isChild () + { + return folder.length > 0; + } + + /*********************************************************************** + + Replace all 'from' instances with 'to' + + ***********************************************************************/ + + final FilePath replace (char from, char to) + { + foreach (inout char c; path) + if (c is from) + c = to; + return this; + } + + /*********************************************************************** + + Convert path separators to a standard format, using '/' as + the path separator. This is compatible with URI and all of + the contemporary O/S which Tango supports. Known exceptions + include the Windows command-line processor, which considers + '/' characters to be switches instead. Use the native() + method to support that. + + Note: mutates the current path. + + ***********************************************************************/ + + final FilePath standard () + { + return replace ('\\', '/'); + } + + /*********************************************************************** + + Convert to native O/S path separators where that is required, + such as when dealing with the Windows command-line. + + Note: mutates the current path. Use this pattern to obtain a + copy instead: path.dup.native + + ***********************************************************************/ + + final FilePath native () + { + version (Win32) + return replace ('/', '\\'); + else + return this; + } + + /*********************************************************************** + + Concatenate text to this path; no separators are added. + See join() also + + ***********************************************************************/ + + final FilePath cat (char[][] others...) + { + foreach (other; others) + { + auto len = end_ + other.length; + expand (len); + fp [end_ .. len] = other; + fp [len] = 0; + end_ = len; + } + return parse; + } + + /*********************************************************************** + + Append a folder to this path. A leading separator is added + as required + + ***********************************************************************/ + + final FilePath append (char[] path) + { + if (file.length) + path = prefixed (path); + return cat (path); + } + + /*********************************************************************** + + Prepend a folder to this path. A trailing separator is added + if needed + + ***********************************************************************/ + + final FilePath prepend (char[] path) + { + adjust (0, folder_, folder_, padded (path)); + return parse; + } + + /*********************************************************************** + + Reset the content of this path to that of another and + reparse + + ***********************************************************************/ + + FilePath set (FilePath path) + { + return set (path.toString); + } + + /*********************************************************************** + + Reset the content of this path, and reparse. + + ***********************************************************************/ + + final FilePath set (char[] path) + { + end_ = path.length; + + expand (end_); + if (end_) + fp[0 .. end_] = path; + + fp[end_] = '\0'; + return parse; + } + + /*********************************************************************** + + Sidestep the normal lookup for paths that are known to + be folders. Where folder is true, file-system lookups + will be skipped. + + ***********************************************************************/ + + final FilePath isFolder (bool folder) + { + dir_ = folder; + return this; + } + + /*********************************************************************** + + Replace the root portion of this path + + ***********************************************************************/ + + final FilePath root (char[] other) + { + auto x = adjust (0, folder_, folder_, padded (other, ':')); + folder_ += x; + suffix_ += x; + name_ += x; + return this; + } + + /*********************************************************************** + + Replace the folder portion of this path. The folder will be + padded with a path-separator as required + + ***********************************************************************/ + + final FilePath folder (char[] other) + { + auto x = adjust (folder_, name_, name_ - folder_, padded (other)); + suffix_ += x; + name_ += x; + return this; + } + + /*********************************************************************** + + Replace the name portion of this path + + ***********************************************************************/ + + final FilePath name (char[] other) + { + auto x = adjust (name_, suffix_, suffix_ - name_, other); + suffix_ += x; + return this; + } + + /*********************************************************************** + + Replace the suffix portion of this path. The suffix will be + prefixed with a file-separator as required + + ***********************************************************************/ + + final FilePath suffix (char[] other) + { + adjust (suffix_, end_, end_ - suffix_, prefixed (other, '.')); + return this; + } + + /*********************************************************************** + + Replace the root and folder portions of this path and + reparse. The replacement will be padded with a path + separator as required + + ***********************************************************************/ + + final FilePath path (char[] other) + { + adjust (0, name_, name_, padded (other)); + return parse; + } + + /*********************************************************************** + + Replace the file and suffix portions of this path and + reparse. The replacement will be prefixed with a suffix + separator as required + + ***********************************************************************/ + + final FilePath file (char[] other) + { + adjust (name_, end_, end_ - name_, other); + return parse; + } + + /*********************************************************************** + + Pop to the parent of the current filepath (in place) + + ***********************************************************************/ + + final FilePath pop () + { + auto path = parent(); + end_ = path.length; + fp[end_] = '\0'; + return parse; + } + + /*********************************************************************** + + Join a set of path specs together. A path separator is + potentially inserted between each of the segments. + + ***********************************************************************/ + + static char[] join (char[][] paths...) + { + char[] result; + + foreach (path; paths) + result ~= padded (path); + + return result.length ? result [0 .. $-1] : null; + } + + /*********************************************************************** + + Return an adjusted path such that non-empty instances do not + have a trailing separator + + ***********************************************************************/ + + static char[] stripped (char[] path, char c = FileConst.PathSeparatorChar) + { + if (path.length && path[$-1] is c) + path = path [0 .. $-1]; + return path; + } + + /*********************************************************************** + + Return an adjusted path such that non-empty instances always + have a trailing separator + + ***********************************************************************/ + + static char[] padded (char[] path, char c = FileConst.PathSeparatorChar) + { + if (path.length && path[$-1] != c) + path = path ~ c; + return path; + } + + /*********************************************************************** + + Return an adjusted path such that non-empty instances always + have a prefixed separator + + ***********************************************************************/ + + static char[] prefixed (char[] s, char c = FileConst.PathSeparatorChar) + { + if (s.length && s[0] != c) + s = c ~ s; + return s; + } + + /*********************************************************************** + + Parse the path spec + + ***********************************************************************/ + + private final FilePath parse () + { + folder_ = 0; + name_ = suffix_ = -1; + + for (int i=end_; --i >= 0;) + switch (fp[i]) + { + case FileConst.FileSeparatorChar: + if (name_ < 0) + if (suffix_ < 0 && i && fp[i-1] != '.') + suffix_ = i; + break; + + version (Win32) + { + case '\\': + fp[i] = '/'; + } + case FileConst.PathSeparatorChar: + if (name_ < 0) + name_ = i + 1; + break; + + version (Win32) + { + case FileConst.RootSeparatorChar: + folder_ = i + 1; + break; + } + + default: + break; + } + + if (name_ < 0) + name_ = folder_; + + if (suffix_ < 0 || suffix_ is name_) + suffix_ = end_; + + return this; + } + + /*********************************************************************** + + Potentially make room for more content + + ***********************************************************************/ + + private final void expand (uint size) + { + ++size; + if (fp.length < size) + fp.length = (size + 127) & ~127; + } + + /*********************************************************************** + + Insert/delete internal content + + ***********************************************************************/ + + private final int adjust (int head, int tail, int len, char[] sub) + { + len = sub.length - len; + + // don't destroy self-references! + if (len && sub.ptr >= fp.ptr+head+len && sub.ptr < fp.ptr+fp.length) + { + char[512] tmp = void; + assert (sub.length < tmp.length); + sub = tmp[0..sub.length] = sub; + } + + // make some room if necessary + expand (len + end_); + + // slide tail around to insert or remove space + memmove (fp.ptr+tail+len, fp.ptr+tail, end_ +1 - tail); + + // copy replacement + memmove (fp.ptr + head, sub.ptr, sub.length); + + // adjust length + end_ += len; + return len; + } + + + /**********************************************************************/ + /********************** file-system methods ***************************/ + /**********************************************************************/ + + + /*********************************************************************** + + Does this path currently exist? + + ***********************************************************************/ + + final bool exists () + { + try { + fileSize(); + return true; + } catch (IOException){} + return false; + } + + /*********************************************************************** + + Returns the time of the last modification. Accurate + to whatever the OS supports + + ***********************************************************************/ + + final Time modified () + { + return timeStamps.modified; + } + + /*********************************************************************** + + Returns the time of the last access. Accurate to + whatever the OS supports + + ***********************************************************************/ + + final Time accessed () + { + return timeStamps.accessed; + } + + /*********************************************************************** + + Returns the time of file creation. Accurate to + whatever the OS supports + + ***********************************************************************/ + + final Time created () + { + return timeStamps.created; + } + + /*********************************************************************** + + Create an entire path consisting of this folder along with + all parent folders. The path must not contain '.' or '..' + segments. Related methods include PathUtil.normalize() and + FileSystem.toAbsolute() + + Note that each segment is created as a folder, including the + trailing segment. + + Returns: a chaining reference (this) + + Throws: IOException upon systen errors + + Throws: IllegalArgumentException if the path contains invalid + path segment names (such as '.' or '..') or a segment + exists but as a file instead of a folder + + ***********************************************************************/ + + final FilePath create () + { + auto segment = name; + if (segment.length > 0) + { + if (segment == FileConst.CurrentDirString || + segment == FileConst.ParentDirString) + badArg ("FilePath.create :: invalid path: "); + + if (this.exists) + if (this.isFolder) + return this; + else + badArg ("FilePath.create :: file/folder conflict: "); + + FilePath(this.parent).create; + return createFolder; + } + return this; + } + + /*********************************************************************** + + List the set of filenames within this folder, using + the provided filter to control the list: + --- + bool delegate (FilePath path, bool isFolder) Filter + --- + + Returning true from the filter includes the given path, + whilst returning false excludes it. Parameter 'isFolder' + indicates whether the path is a file or folder. + + Note that paths composed of '.' characters are ignored. + + ***********************************************************************/ + + final FilePath[] toList (Filter filter = null) + { + FilePath[] paths; + + foreach (info; this) + { + auto p = from (info); + + // test this entry for inclusion + if (filter is null || filter (p, info.folder)) + paths ~= p; + else + delete p; + } + + return paths; + } + + /*********************************************************************** + + Construct a FilePath from the given FileInfo + + ***********************************************************************/ + + static FilePath from (ref FileInfo info) + { + char[512] tmp = void; + + auto len = info.path.length + info.name.length; + assert (len < tmp.length); + + // construct full pathname + tmp [0 .. info.path.length] = info.path; + tmp [info.path.length .. len] = info.name; + + return FilePath(tmp[0 .. len]).isFolder(info.folder); + } + + /*********************************************************************** + + change the name or location of a file/directory, and + adopt the provided Path + + ***********************************************************************/ + + final FilePath rename (FilePath dst) + { + return rename (dst.toString); + } + + /*********************************************************************** + + Throw an exception using the last known error + + ***********************************************************************/ + + private void exception () + { + throw new IOException (toString ~ ": " ~ SysError.lastMsg); + } + + /*********************************************************************** + + Throw an exception using the last known error + + ***********************************************************************/ + + private void badArg (char[] msg) + { + throw new IllegalArgumentException (msg ~ toString); + } + + /*********************************************************************** + + ***********************************************************************/ + + version (Win32) + { + /*************************************************************** + + return a wchar[] instance of the path + + ***************************************************************/ + + private wchar[] toString16 (wchar[] tmp, char[] path) + { + auto i = MultiByteToWideChar (CP_UTF8, 0, + path.ptr, path.length, + tmp.ptr, tmp.length); + return tmp [0..i]; + } + + /*************************************************************** + + return a char[] instance of the path + + ***************************************************************/ + + private char[] toString (char[] tmp, wchar[] path) + { + auto i = WideCharToMultiByte (CP_UTF8, 0, path.ptr, path.length, + tmp.ptr, tmp.length, null, null); + return tmp [0..i]; + } + + /*************************************************************** + + return a wchar[] instance of the path + + ***************************************************************/ + + private wchar[] name16 (wchar[] tmp, bool withNull=true) + { + int offset = withNull ? 0 : 1; + return toString16 (tmp, this.cString[0 .. $-offset]); + } + + /*************************************************************** + + Get info about this path + + ***************************************************************/ + + private DWORD getInfo (inout WIN32_FILE_ATTRIBUTE_DATA info) + { + version (Win32SansUnicode) + { + if (! GetFileAttributesExA (this.cString.ptr, GetFileInfoLevelStandard, &info)) + exception; + } + else + { + wchar[MAX_PATH] tmp = void; + if (! GetFileAttributesExW (name16(tmp).ptr, GetFileInfoLevelStandard, &info)) + exception; + } + + return info.dwFileAttributes; + } + + /*************************************************************** + + Get flags for this path + + ***************************************************************/ + + private DWORD getFlags () + { + WIN32_FILE_ATTRIBUTE_DATA info = void; + + return getInfo (info); + } + + /*************************************************************** + + Return the file length (in bytes) + + ***************************************************************/ + + final ulong fileSize () + { + WIN32_FILE_ATTRIBUTE_DATA info = void; + + getInfo (info); + return (cast(ulong) info.nFileSizeHigh << 32) + + info.nFileSizeLow; + } + + /*************************************************************** + + Is this file writable? + + ***************************************************************/ + + final bool isWritable () + { + return (getFlags & FILE_ATTRIBUTE_READONLY) == 0; + } + + /*************************************************************** + + Is this file actually a folder/directory? + + ***************************************************************/ + + final bool isFolder () + { + if (dir_) + return true; + + return (getFlags & FILE_ATTRIBUTE_DIRECTORY) != 0; + } + + /*************************************************************** + + Return timestamp information + + ***************************************************************/ + + final Stamps timeStamps () + { + static Time convert (FILETIME time) + { + return Time (TimeSpan.Epoch1601 + *cast(long*) &time); + } + + WIN32_FILE_ATTRIBUTE_DATA info = void; + Stamps time = void; + + getInfo (info); + time.modified = convert (info.ftLastWriteTime); + time.accessed = convert (info.ftLastAccessTime); + time.created = convert (info.ftCreationTime); + return time; + } + + /*********************************************************************** + + Transfer the content of another file to this one. Returns a + reference to this class on success, or throws an IOException + upon failure. + + ***********************************************************************/ + + final FilePath copy (char[] source) + { + auto src = new FilePath (source); + + version (Win32SansUnicode) + { + if (! CopyFileA (src.cString.ptr, this.cString.ptr, false)) + exception; + } + else + { + wchar[MAX_PATH+1] tmp1 = void; + wchar[MAX_PATH+1] tmp2 = void; + + if (! CopyFileW (toString16(tmp1, src.cString).ptr, name16(tmp2).ptr, false)) + exception; + } + + return this; + } + + /*************************************************************** + + Remove the file/directory from the file-system + + ***************************************************************/ + + final FilePath remove () + { + if (isFolder) + { + version (Win32SansUnicode) + { + if (! RemoveDirectoryA (this.cString.ptr)) + exception; + } + else + { + wchar[MAX_PATH] tmp = void; + if (! RemoveDirectoryW (name16(tmp).ptr)) + exception; + } + } + else + version (Win32SansUnicode) + { + if (! DeleteFileA (this.cString.ptr)) + exception; + } + else + { + wchar[MAX_PATH] tmp = void; + if (! DeleteFileW (name16(tmp).ptr)) + exception; + } + + return this; + } + + /*************************************************************** + + change the name or location of a file/directory, and + adopt the provided Path + + ***************************************************************/ + + final FilePath rename (char[] dst) + { + const int Typical = MOVEFILE_REPLACE_EXISTING + + MOVEFILE_COPY_ALLOWED + + MOVEFILE_WRITE_THROUGH; + + int result; + char[] cstr = dst ~ '\0'; + + version (Win32SansUnicode) + result = MoveFileExA (this.cString.ptr, cstr.ptr, Typical); + else + { + wchar[MAX_PATH] tmp1 = void; + wchar[MAX_PATH] tmp2 = void; + result = MoveFileExW (name16(tmp1).ptr, toString16(tmp2, cstr).ptr, Typical); + } + + if (! result) + exception; + + this.set (dst); + return this; + } + + /*************************************************************** + + Create a new file + + ***************************************************************/ + + final FilePath createFile () + { + HANDLE h; + + version (Win32SansUnicode) + h = CreateFileA (this.cString.ptr, GENERIC_WRITE, + 0, null, CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL, cast(HANDLE) 0); + else + { + wchar[MAX_PATH] tmp = void; + h = CreateFileW (name16(tmp).ptr, GENERIC_WRITE, + 0, null, CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL, cast(HANDLE) 0); + } + + if (h == INVALID_HANDLE_VALUE) + exception; + + if (! CloseHandle (h)) + exception; + + return this; + } + + /*************************************************************** + + Create a new directory + + ***************************************************************/ + + final FilePath createFolder () + { + version (Win32SansUnicode) + { + if (! CreateDirectoryA (this.cString.ptr, null)) + exception; + } + else + { + wchar[MAX_PATH] tmp = void; + if (! CreateDirectoryW (name16(tmp).ptr, null)) + exception; + } + return this; + } + + /*************************************************************** + + List the set of filenames within this folder. + + Each path and filename is passed to the provided + delegate, along with the path prefix and whether + the entry is a folder or not. + + Returns the number of files scanned. + + ***************************************************************/ + + final int opApply (int delegate(ref FileInfo) dg) + { + HANDLE h; + int ret; + char[] prefix; + char[MAX_PATH+1] tmp = void; + FIND_DATA fileinfo = void; + + int next() + { + version (Win32SansUnicode) + return FindNextFileA (h, &fileinfo); + else + return FindNextFileW (h, &fileinfo); + } + + static T[] padded (T[] s, T[] ext) + { + if (s.length is 0 || s[$-1] != '\\') + return s ~ "\\" ~ ext; + return s ~ ext; + } + + version (Win32SansUnicode) + h = FindFirstFileA (padded(this.toString, "*\0").ptr, &fileinfo); + else + { + wchar[MAX_PATH] host = void; + h = FindFirstFileW (padded(name16(host, false), "*\0").ptr, &fileinfo); + } + + if (h is INVALID_HANDLE_VALUE) + exception; + + scope (exit) + FindClose (h); + + prefix = FilePath.padded (this.toString); + do { + version (Win32SansUnicode) + { + auto len = strlen (fileinfo.cFileName.ptr); + auto str = fileinfo.cFileName.ptr [0 .. len]; + } + else + { + auto len = wcslen (fileinfo.cFileName.ptr); + auto str = toString (tmp, fileinfo.cFileName [0 .. len]); + } + + // skip hidden/system files + if ((fileinfo.dwFileAttributes & (FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN)) is 0) + { + FileInfo info = void; + info.name = str; + info.path = prefix; + info.bytes = (cast(ulong) fileinfo.nFileSizeHigh << 32) + fileinfo.nFileSizeLow; + info.folder = (fileinfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; + + // skip "..." names + if (str.length > 3 || str != "..."[0 .. str.length]) + if ((ret = dg(info)) != 0) + break; + } + } while (next); + + return ret; + } + } + + + /*********************************************************************** + + ***********************************************************************/ + + version (Posix) + { + /*************************************************************** + + Get info about this path + + ***************************************************************/ + + private uint getInfo (inout stat_t stats) + { + if (posix.stat (this.cString.ptr, &stats)) + exception; + + return stats.st_mode; + } + + /*************************************************************** + + Return the file length (in bytes) + + ***************************************************************/ + + final ulong fileSize () + { + stat_t stats = void; + + getInfo (stats); + return cast(ulong) stats.st_size; // 32 bits only + } + + /*************************************************************** + + Is this file writable? + + ***************************************************************/ + + final bool isWritable () + { + stat_t stats = void; + + return (getInfo(stats) & O_RDONLY) == 0; + } + + /*************************************************************** + + Is this file actually a folder/directory? + + ***************************************************************/ + + final bool isFolder () + { + stat_t stats = void; + + return (getInfo(stats) & S_IFDIR) != 0; + } + + /*************************************************************** + + Return timestamp information + + ***************************************************************/ + + final Stamps timeStamps () + { + static Time convert (timeval* tv) + { + return Time.epoch1970 + + TimeSpan.seconds(tv.tv_sec) + + TimeSpan.micros(tv.tv_usec); + } + + stat_t stats = void; + Stamps time = void; + + getInfo (stats); + + time.modified = convert (cast(timeval*) &stats.st_mtime); + time.accessed = convert (cast(timeval*) &stats.st_atime); + time.created = convert (cast(timeval*) &stats.st_ctime); + return time; + } + + /*********************************************************************** + + Transfer the content of another file to this one. Returns a + reference to this class on success, or throws an IOException + upon failure. + + ***********************************************************************/ + + final FilePath copy (char[] source) + { + auto from = new FilePath (source); + + auto src = posix.open (from.cString.ptr, O_RDONLY, 0640); + scope (exit) + if (src != -1) + posix.close (src); + + auto dst = posix.open (this.cString.ptr, O_CREAT | O_RDWR, 0660); + scope (exit) + if (dst != -1) + posix.close (dst); + + if (src is -1 || dst is -1) + exception; + + // copy content + ubyte[] buf = new ubyte [16 * 1024]; + int read = posix.read (src, buf.ptr, buf.length); + while (read > 0) + { + auto p = buf.ptr; + do { + int written = posix.write (dst, p, read); + p += written; + read -= written; + if (written is -1) + exception; + } while (read > 0); + read = posix.read (src, buf.ptr, buf.length); + } + if (read is -1) + exception; + + // copy timestamps + stat_t stats; + if (posix.stat (from.cString.ptr, &stats)) + exception; + + utimbuf utim; + utim.actime = stats.st_atime; + utim.modtime = stats.st_mtime; + if (utime (this.cString.ptr, &utim) is -1) + exception; + + return this; + } + + /*************************************************************** + + Remove the file/directory from the file-system + + ***************************************************************/ + + final FilePath remove () + { + if (isFolder) + { + if (posix.rmdir (this.cString.ptr)) + exception; + } + else + if (tango.stdc.stdio.remove (this.cString.ptr) == -1) + exception; + + return this; + } + + /*************************************************************** + + change the name or location of a file/directory, and + adopt the provided FilePath + + ***************************************************************/ + + final FilePath rename (char[] dst) + { + char[] cstr = dst ~ '\0'; + if (tango.stdc.stdio.rename (this.cString.ptr, cstr.ptr) == -1) + exception; + + this.set (dst); + return this; + } + + /*************************************************************** + + Create a new file + + ***************************************************************/ + + final FilePath createFile () + { + int fd; + + fd = posix.open (this.cString.ptr, O_CREAT | O_WRONLY | O_TRUNC, 0660); + if (fd == -1) + exception; + + if (posix.close(fd) == -1) + exception; + + return this; + } + + /*************************************************************** + + Create a new directory + + ***************************************************************/ + + final FilePath createFolder () + { + if (posix.mkdir (this.cString.ptr, 0777)) + exception; + + return this; + } + + /*************************************************************** + + List the set of filenames within this folder. + + Each path and filename is passed to the provided + delegate, along with the path prefix and whether + the entry is a folder or not. + + Returns the number of files scanned. + + ***************************************************************/ + + final int opApply (int delegate(ref FileInfo) dg) + { + int ret; + DIR* dir; + dirent entry; + dirent* pentry; + stat_t sbuf; + char[] prefix; + char[] sfnbuf; + + dir = tango.stdc.posix.dirent.opendir (this.cString.ptr); + if (! dir) + exception; + + scope (exit) + tango.stdc.posix.dirent.closedir (dir); + + // ensure a trailing '/' is present + prefix = FilePath.padded (this.toString); + + // prepare our filename buffer + sfnbuf = prefix.dup; + + // pentry is null at end of listing, or on an error + while (readdir_r (dir, &entry, &pentry), pentry != null) + { + auto len = tango.stdc.string.strlen (entry.d_name.ptr); + auto str = entry.d_name.ptr [0 .. len]; + ++len; // include the null + + // resize the buffer as necessary ... + if (sfnbuf.length < prefix.length + len) + sfnbuf.length = prefix.length + len; + + sfnbuf [prefix.length .. prefix.length + len] + = entry.d_name.ptr [0 .. len]; + + // skip "..." names + if (str.length > 3 || str != "..."[0 .. str.length]) + { + if (stat (sfnbuf.ptr, &sbuf)) + exception; + + FileInfo info = void; + info.name = str; + info.path = prefix; + info.folder = (sbuf.st_mode & S_IFDIR) != 0; + info.bytes = (sbuf.st_mode & S_IFREG) != 0 ? sbuf.st_size : 0; + + if ((ret = dg(info)) != 0) + break; + } + } + return ret; + } + } +} + + + +/******************************************************************************* + +*******************************************************************************/ + +interface PathView +{ + /*********************************************************************** + + TimeStamp information. Accurate to whatever the OS supports + + ***********************************************************************/ + + struct Stamps + { + Time created, /// time created + accessed, /// last time accessed + modified; /// last time modified + } + + /*********************************************************************** + + Return the complete text of this filepath + + ***********************************************************************/ + + abstract char[] toString (); + + /*********************************************************************** + + Return the complete text of this filepath + + ***********************************************************************/ + + abstract char[] cString (); + + /*********************************************************************** + + Return the root of this path. Roots are constructs such as + "c:" + + ***********************************************************************/ + + abstract char[] root (); + + /*********************************************************************** + + Return the file path. Paths may start and end with a "/". + The root path is "/" and an unspecified path is returned as + an empty string. Directory paths may be split such that the + directory name is placed into the 'name' member; directory + paths are treated no differently than file paths + + ***********************************************************************/ + + abstract char[] folder (); + + /*********************************************************************** + + Return the name of this file, or directory, excluding a + suffix. + + ***********************************************************************/ + + abstract char[] name (); + + /*********************************************************************** + + Ext is the tail of the filename, rightward of the rightmost + '.' separator e.g. path "foo.bar" has ext "bar". Note that + patterns of adjacent separators are treated specially; for + example, ".." will wind up with no ext at all + + ***********************************************************************/ + + abstract char[] ext (); + + /*********************************************************************** + + Suffix is like ext, but includes the separator e.g. path + "foo.bar" has suffix ".bar" + + ***********************************************************************/ + + abstract char[] suffix (); + + /*********************************************************************** + + return the root + folder combination + + ***********************************************************************/ + + abstract char[] path (); + + /*********************************************************************** + + return the name + suffix combination + + ***********************************************************************/ + + abstract char[] file (); + + /*********************************************************************** + + Returns true if this FilePath is *not* relative to the + current working directory. + + ***********************************************************************/ + + abstract bool isAbsolute (); + + /*********************************************************************** + + Returns true if this FilePath is empty + + ***********************************************************************/ + + abstract bool isEmpty (); + + /*********************************************************************** + + Returns true if this FilePath has a parent + + ***********************************************************************/ + + abstract bool isChild (); + + /*********************************************************************** + + Does this path currently exist? + + ***********************************************************************/ + + abstract bool exists (); + + /*********************************************************************** + + Returns the time of the last modification. Accurate + to whatever the OS supports + + ***********************************************************************/ + + abstract Time modified (); + + /*********************************************************************** + + Returns the time of the last access. Accurate to + whatever the OS supports + + ***********************************************************************/ + + abstract Time accessed (); + + /*********************************************************************** + + Returns the time of file creation. Accurate to + whatever the OS supports + + ***********************************************************************/ + + abstract Time created (); + + /*********************************************************************** + + Return the file length (in bytes) + + ***********************************************************************/ + + abstract ulong fileSize (); + + /*********************************************************************** + + Is this file writable? + + ***********************************************************************/ + + abstract bool isWritable (); + + /*********************************************************************** + + Is this file actually a folder/directory? + + ***********************************************************************/ + + abstract bool isFolder (); + + /*********************************************************************** + + Return timestamp information + + ***********************************************************************/ + + abstract Stamps timeStamps (); +} + + + + + +/******************************************************************************* + +*******************************************************************************/ + +debug (UnitTest) +{ + unittest + { + version(Win32) + { + auto fp = new FilePath(r"C:/home/foo/bar"); + fp ~= "john"; + assert (fp == r"C:/home/foo/bar/john"); + fp = r"C:/"; + fp ~= "john"; + assert (fp == r"C:/john"); + fp = "foo.bar"; + fp ~= "john"; + assert (fp == r"foo.bar/john"); + fp = ""; + fp ~= "john"; + assert (fp == r"john"); + + fp = r"C:/home/foo/bar/john/foo.d"; + assert (fp.pop == r"C:/home/foo/bar/john"); + assert (fp.pop == r"C:/home/foo/bar"); + assert (fp.pop == r"C:/home/foo"); + assert (fp.pop == r"C:/home"); + assert (fp.pop == r"C:"); + assert (fp.pop == r"C:"); + + // special case for popping empty names + fp = r"C:/home/foo/bar/john/"; + assert (fp.pop == r"C:/home/foo/bar", fp.toString); + + fp = new FilePath; + fp = r"C:/home/foo/bar/john/"; + assert (fp.isAbsolute); + assert (fp.name == ""); + assert (fp.folder == r"/home/foo/bar/john/"); + assert (fp == r"C:/home/foo/bar/john/"); + assert (fp.path == r"C:/home/foo/bar/john/"); + assert (fp.file == r""); + assert (fp.suffix == r""); + assert (fp.root == r"C:"); + assert (fp.ext == ""); + assert (fp.isChild); + + fp = new FilePath(r"C:/home/foo/bar/john"); + assert (fp.isAbsolute); + assert (fp.name == "john"); + assert (fp.folder == r"/home/foo/bar/"); + assert (fp == r"C:/home/foo/bar/john"); + assert (fp.path == r"C:/home/foo/bar/"); + assert (fp.file == r"john"); + assert (fp.suffix == r""); + assert (fp.ext == ""); + assert (fp.isChild); + + fp.pop; + assert (fp.isAbsolute); + assert (fp.name == "bar"); + assert (fp.folder == r"/home/foo/"); + assert (fp == r"C:/home/foo/bar"); + assert (fp.path == r"C:/home/foo/"); + assert (fp.file == r"bar"); + assert (fp.suffix == r""); + assert (fp.ext == ""); + assert (fp.isChild); + + fp.pop; + assert (fp.isAbsolute); + assert (fp.name == "foo"); + assert (fp.folder == r"/home/"); + assert (fp == r"C:/home/foo"); + assert (fp.path == r"C:/home/"); + assert (fp.file == r"foo"); + assert (fp.suffix == r""); + assert (fp.ext == ""); + assert (fp.isChild); + + fp.pop; + assert (fp.isAbsolute); + assert (fp.name == "home"); + assert (fp.folder == r"/"); + assert (fp == r"C:/home"); + assert (fp.path == r"C:/"); + assert (fp.file == r"home"); + assert (fp.suffix == r""); + assert (fp.ext == ""); + assert (fp.isChild); + + fp = new FilePath(r"foo/bar/john.doe"); + assert (!fp.isAbsolute); + assert (fp.name == "john"); + assert (fp.folder == r"foo/bar/"); + assert (fp.suffix == r".doe"); + assert (fp.file == r"john.doe"); + assert (fp == r"foo/bar/john.doe"); + assert (fp.ext == "doe"); + assert (fp.isChild); + + fp = new FilePath(r"c:doe"); + assert (fp.isAbsolute); + assert (fp.suffix == r""); + assert (fp == r"c:doe"); + assert (fp.folder == r""); + assert (fp.name == "doe"); + assert (fp.file == r"doe"); + assert (fp.ext == ""); + assert (!fp.isChild); + + fp = new FilePath(r"/doe"); + assert (fp.isAbsolute); + assert (fp.suffix == r""); + assert (fp == r"/doe"); + assert (fp.name == "doe"); + assert (fp.folder == r"/"); + assert (fp.file == r"doe"); + assert (fp.ext == ""); + assert (fp.isChild); + + fp = new FilePath(r"john.doe.foo"); + assert (!fp.isAbsolute); + assert (fp.name == "john.doe"); + assert (fp.folder == r""); + assert (fp.suffix == r".foo"); + assert (fp == r"john.doe.foo"); + assert (fp.file == r"john.doe.foo"); + assert (fp.ext == "foo"); + assert (!fp.isChild); + + fp = new FilePath(r".doe"); + assert (!fp.isAbsolute); + assert (fp.suffix == r""); + assert (fp == r".doe"); + assert (fp.name == ".doe"); + assert (fp.folder == r""); + assert (fp.file == r".doe"); + assert (fp.ext == ""); + assert (!fp.isChild); + + fp = new FilePath(r"doe"); + assert (!fp.isAbsolute); + assert (fp.suffix == r""); + assert (fp == r"doe"); + assert (fp.name == "doe"); + assert (fp.folder == r""); + assert (fp.file == r"doe"); + assert (fp.ext == ""); + assert (!fp.isChild); + + fp = new FilePath(r"."); + assert (!fp.isAbsolute); + assert (fp.suffix == r""); + assert (fp == r"."); + assert (fp.name == "."); + assert (fp.folder == r""); + assert (fp.file == r"."); + assert (fp.ext == ""); + assert (!fp.isChild); + + fp = new FilePath(r".."); + assert (!fp.isAbsolute); + assert (fp.suffix == r""); + assert (fp == r".."); + assert (fp.name == ".."); + assert (fp.folder == r""); + assert (fp.file == r".."); + assert (fp.ext == ""); + assert (!fp.isChild); + + fp = new FilePath(r"c:/a/b/c/d/e/foo.bar"); + assert (fp.isAbsolute); + fp.folder (r"/a/b/c/"); + assert (fp.suffix == r".bar"); + assert (fp == r"c:/a/b/c/foo.bar"); + assert (fp.name == "foo"); + assert (fp.folder == r"/a/b/c/"); + assert (fp.file == r"foo.bar"); + assert (fp.ext == "bar"); + assert (fp.isChild); + + fp = new FilePath(r"c:/a/b/c/d/e/foo.bar"); + assert (fp.isAbsolute); + fp.folder (r"/a/b/c/d/e/f/g/"); + assert (fp.suffix == r".bar"); + assert (fp == r"c:/a/b/c/d/e/f/g/foo.bar"); + assert (fp.name == "foo"); + assert (fp.folder == r"/a/b/c/d/e/f/g/"); + assert (fp.file == r"foo.bar"); + assert (fp.ext == "bar"); + assert (fp.isChild); + + fp = new FilePath(r"C:\foo\bar\test.bar"); + assert (fp.path == "C:/foo/bar/"); + fp = new FilePath(r"C:/foo/bar/test.bar"); + assert (fp.path == r"C:/foo/bar/"); + + fp = new FilePath(""); + assert (fp.isEmpty); + assert (!fp.isChild); + assert (!fp.isAbsolute); + assert (fp.suffix == r""); + assert (fp == r""); + assert (fp.name == ""); + assert (fp.folder == r""); + assert (fp.file == r""); + assert (fp.ext == ""); +/+ + fp = new FilePath(r"C:/foo/bar/test.bar"); + fp = new FilePath(fp.asPath ("foo")); + assert (fp.name == r"test"); + assert (fp.folder == r"foo/"); + assert (fp.path == r"C:foo/"); + assert (fp.ext == ".bar"); + + fp = new FilePath(fp.asPath ("")); + assert (fp.name == r"test"); + assert (fp.folder == r""); + assert (fp.path == r"C:"); + assert (fp.ext == ".bar"); + + fp = new FilePath(r"c:/joe/bar"); + assert(fp.cat(r"foo/bar/") == r"c:/joe/bar/foo/bar/"); + assert(fp.cat(new FilePath(r"foo/bar")).toString == r"c:/joe/bar/foo/bar"); + + assert (FilePath.join (r"a/b/c/d", r"e/f/" r"g") == r"a/b/c/d/e/f/g"); + + fp = new FilePath(r"C:/foo/bar/test.bar"); + assert (fp.asExt(null) == r"C:/foo/bar/test"); + assert (fp.asExt("foo") == r"C:/foo/bar/test.foo"); ++/ + } + } +} + + +debug (FilePath) +{ + import tango.io.Console; + + void main() + { + Cout (FilePath("c:/temp/").file("foo.bar")).newline; + } + +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/FileRoots.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/FileRoots.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,121 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: March 2004 + + author: Kris, FreeEagle + +*******************************************************************************/ + +module tango.io.FileRoots; + +private import tango.sys.Common; + + +version (Win32) + { + private import Text = tango.text.Util; + private extern (Windows) DWORD GetLogicalDriveStringsA (DWORD, LPTSTR); + } + +version (Posix) + { + private import tango.io.FileConduit; + private import Integer = tango.text.convert.Integer; + } + +/******************************************************************************* + + Models an OS-specific file-system. Included here are methods to + list the system roots ("C:", "D:", etc) + +*******************************************************************************/ + +struct FileRoots +{ + version (Win32) + { + /*************************************************************** + + List the set of root devices (C:, D: etc) + + ***************************************************************/ + + static char[][] list () + { + int len; + char[] str; + char[][] roots; + + // acquire drive strings + len = GetLogicalDriveStringsA (0, null); + if (len) + { + str = new char [len]; + GetLogicalDriveStringsA (len, str.ptr); + + // split roots into seperate strings + roots = Text.delimit (str [0 .. $-1], "\0"); + } + return roots; + } + } + + + version (Posix) + { + /*************************************************************** + + List the set of root devices. + + ***************************************************************/ + + static char[][] list () + { + version(darwin) + { + assert(0); + return null; + } + else + { + char[] path = ""; + char[][] list; + int spaces; + + auto fc = new FileConduit("/etc/mtab"); + scope (exit) + fc.close; + + auto content = new char[cast(int) fc.length]; + fc.input.read (content); + + for(int i = 0; i < content.length; i++) + { + if(content[i] == ' ') spaces++; + else if(content[i] == '\n') + { + spaces = 0; + list ~= path; + path = ""; + } + else if(spaces == 1) + { + if(content[i] == '\\') + { + path ~= Integer.parse(content[++i..i+3], 8u); + i += 2; + } + else path ~= content[i]; + } + } + + return list; + } + } + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/FileScan.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/FileScan.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,202 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Jun 2004: Initial release + version: Dec 2006: Pacific release + + author: Kris + +*******************************************************************************/ + +module tango.io.FileScan; + +public import tango.io.FilePath; + +private import tango.core.Exception; + +/******************************************************************************* + + Recursively scan files and directories, adding filtered files to + an output structure as we go. This can be used to produce a list + of subdirectories and the files contained therein. The following + example lists all files with suffix ".d" located via the current + directory, along with the folders containing them: + --- + auto scan = new FileScan; + + scan (".", ".d"); + + Stdout.formatln ("{} Folders", scan.folders.length); + foreach (folder; scan.folders) + Stdout.formatln ("{}", folder); + + Stdout.formatln ("\n{} Files", scan.files.length); + foreach (file; scan.files) + Stdout.formatln ("{}", file); + --- + + This is unlikely the most efficient method to scan a vast number of + files, but operates in a convenient manner + +*******************************************************************************/ + +class FileScan +{ + alias sweep opCall; + + FilePath[] fileSet; + char[][] errorSet; + FilePath[] folderSet; + + /*********************************************************************** + + Alias for Filter delegate. Accepts a FilePath & a bool as + arguments and returns a bool. + + The FilePath argument represents a file found by the scan, + and the bool whether the FilePath represents a folder. + + The filter should return true, if matched by the filter. Note + that returning false where the path is a folder will result + in all files contained being ignored. To always recurse folders, + do something like this: + --- + return (isDir || match (fp.name)); + --- + + ***********************************************************************/ + + alias FilePath.Filter Filter; + + /*********************************************************************** + + Return all the errors found in the last scan + + ***********************************************************************/ + + public char[][] errors () + { + return errorSet; + } + + /*********************************************************************** + + Return all the files found in the last scan + + ***********************************************************************/ + + public FilePath[] files () + { + return fileSet; + } + + /*********************************************************************** + + Return all directories found in the last scan + + ***********************************************************************/ + + public FilePath[] folders () + { + return folderSet; + } + + /*********************************************************************** + + Sweep a set of files and directories from the given parent + path, with no filtering applied + + ***********************************************************************/ + + FileScan sweep (char[] path, bool recurse=true) + { + return sweep (path, cast(Filter) null, recurse); + } + + /*********************************************************************** + + Sweep a set of files and directories from the given parent + path, where the files are filtered by the given suffix + + ***********************************************************************/ + + FileScan sweep (char[] path, char[] match, bool recurse=true) + { + return sweep (path, (FilePath fp, bool isDir) + {return isDir || fp.suffix == match;}, recurse); + } + + /*********************************************************************** + + Sweep a set of files and directories from the given parent + path, where the files are filtered by the provided delegate + + ***********************************************************************/ + + FileScan sweep (char[] path, Filter filter, bool recurse=true) + { + errorSet = null, fileSet = folderSet = null; + return scan (new FilePath(path), filter, recurse); + } + + /*********************************************************************** + + Internal routine to locate files and sub-directories. We + skip entries with names composed only of '.' characters. + + ***********************************************************************/ + + private FileScan scan (FilePath folder, Filter filter, bool recurse) + { + try { + auto paths = folder.toList (filter); + + auto count = fileSet.length; + foreach (path; paths) + if (! path.isFolder) + fileSet ~= path; + else + if (recurse) + scan (path, filter, recurse); + + // add packages only if there's something in them + if (fileSet.length > count) + folderSet ~= folder; + + } catch (IOException e) + errorSet ~= e.toString; + return this; + } +} + + +/******************************************************************************* + +*******************************************************************************/ + +debug (FileScan) +{ + import tango.io.Stdout; + + void main() + { + auto scan = new FileScan; + + scan ("."); + + Stdout.formatln ("{} Folders", scan.folders.length); + foreach (folder; scan.folders) + Stdout (folder).newline; + + Stdout.formatln ("\n{} Files", scan.files.length); + foreach (file; scan.files) + Stdout (file).newline; + + Stdout.formatln ("\n{} Errors", scan.errors.length); + foreach (error; scan.errors) + Stdout (error).newline; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/FileSystem.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/FileSystem.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,251 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Mar 2004: Initial release + version: Feb 2007: Now using mutating paths + + author: Kris, Chris Sauls (Win95 file support) + +*******************************************************************************/ + +module tango.io.FileSystem; + +private import tango.sys.Common; + +private import tango.io.FilePath; + +private import tango.core.Exception; + +version (Posix) + { + private import tango.stdc.string; + private import tango.stdc.posix.unistd; + } + +/******************************************************************************* + + Models an OS-specific file-system. Included here are methods to + manipulate the current working directory, and to convert a path + to its absolute form. + +*******************************************************************************/ + +class FileSystem +{ + /*********************************************************************** + + Convert the provided path to an absolute path, using the + current working directory where prefix is not provided. + If the given path is already an absolute path, return it + intact. + + Returns the provided path, adjusted as necessary + + ***********************************************************************/ + + static FilePath toAbsolute (FilePath target, char[] prefix=null) + { + if (! target.isAbsolute) + { + if (prefix is null) + prefix = getDirectory; + + target.prepend (target.padded(prefix)); + } + return target; + } + + /*********************************************************************** + + ***********************************************************************/ + + private static void exception (char[] msg) + { + throw new IOException (msg); + } + + /*********************************************************************** + + ***********************************************************************/ + + version (Win32) + { + /*************************************************************** + + Set the current working directory + + ***************************************************************/ + + static void setDirectory (char[] path) + { + version (Win32SansUnicode) + { + char[MAX_PATH+1] tmp = void; + tmp[0..path.length] = path; + tmp[path.length] = 0; + + if (! SetCurrentDirectoryA (tmp.ptr)) + exception ("Failed to set current directory"); + } + else + { + // convert into output buffer + wchar[MAX_PATH+1] tmp = void; + assert (path.length < tmp.length); + auto i = MultiByteToWideChar (CP_UTF8, 0, + path.ptr, path.length, + tmp.ptr, tmp.length); + tmp[i] = 0; + + if (! SetCurrentDirectoryW (tmp.ptr)) + exception ("Failed to set current directory"); + } + } + + /*************************************************************** + + Return the current working directory + + ***************************************************************/ + + static char[] getDirectory () + { + char[] path; + + version (Win32SansUnicode) + { + int len = GetCurrentDirectoryA (0, null); + auto dir = new char [len]; + GetCurrentDirectoryA (len, dir.ptr); + if (len) + { + dir[len-1] = '\\'; + path = dir; + } + else + exception ("Failed to get current directory"); + } + else + { + wchar[MAX_PATH+2] tmp = void; + + auto len = GetCurrentDirectoryW (0, null); + assert (len < tmp.length); + auto dir = new char [len * 3]; + GetCurrentDirectoryW (len, tmp.ptr); + auto i = WideCharToMultiByte (CP_UTF8, 0, tmp.ptr, len, + dir.ptr, dir.length, null, null); + if (len && i) + { + path = dir[0..i]; + path[$-1] = '\\'; + } + else + exception ("Failed to get current directory"); + } + + return path; + } + } + + /*********************************************************************** + + ***********************************************************************/ + + version (Posix) + { + /*************************************************************** + + Set the current working directory + + ***************************************************************/ + + static void setDirectory (char[] path) + { + char[512] tmp = void; + tmp [path.length] = 0; + tmp[0..path.length] = path; + + if (tango.stdc.posix.unistd.chdir (tmp.ptr)) + exception ("Failed to set current directory"); + } + + /*************************************************************** + + Return the current working directory + + ***************************************************************/ + + static char[] getDirectory () + { + char[512] tmp = void; + + char *s = tango.stdc.posix.unistd.getcwd (tmp.ptr, tmp.length); + if (s is null) + exception ("Failed to get current directory"); + + auto path = s[0 .. strlen(s)+1].dup; + path[$-1] = '/'; + return path; + } + } +} + + +/****************************************************************************** + +******************************************************************************/ + +debug (FileSystem) +{ + import tango.io.Stdout; + + static void foo (FilePath path) + { + Stdout("all: ") (path).newline; + Stdout("path: ") (path.path).newline; + Stdout("file: ") (path.file).newline; + Stdout("folder: ") (path.folder).newline; + Stdout("name: ") (path.name).newline; + Stdout("ext: ") (path.ext).newline; + Stdout("suffix: ") (path.suffix).newline.newline; + } + + void main() + { + auto path = new FilePath ("."); + foo (path); + + path.set (".."); + foo (path); + + path.set ("..."); + foo (path); + + path.set (r"\x\y\.file"); + foo (path); + + path.suffix = ".foo"; + foo (path); + + path.set ("file.bar"); + FileSystem.toAbsolute(path); + foo(path); + + path.set (r"arf\test"); + foo(path); + FileSystem.toAbsolute(path); + foo(path); + + path.name = "foo"; + foo(path); + + path.suffix = ".d"; + path.name = path.suffix; + foo(path); + + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/GrowBuffer.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/GrowBuffer.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,159 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: March 2004 + + author: Kris + +*******************************************************************************/ + +module tango.io.GrowBuffer; + +private import tango.io.Buffer; + +public import tango.io.model.IBuffer; + +/******************************************************************************* + + Subclass to provide support for content growth. This is handy when + you want to keep a buffer around as a scratchpad. + +*******************************************************************************/ + +class GrowBuffer : Buffer +{ + private uint increment; + + alias Buffer.slice slice; + alias Buffer.append append; + + /*********************************************************************** + + Create a GrowBuffer with the specified initial size. + + ***********************************************************************/ + + this (uint size = 1024, uint increment = 1024) + { + super (size); + + assert (increment >= 32); + this.increment = increment; + } + + /*********************************************************************** + + Create a GrowBuffer with the specified initial size. + + ***********************************************************************/ + + this (IConduit conduit, uint size = 1024) + { + this (size, size); + setConduit (conduit); + } + + /*********************************************************************** + + Read a chunk of data from the buffer, loading from the + conduit as necessary. The specified number of bytes is + loaded into the buffer, and marked as having been read + when the 'eat' parameter is set true. When 'eat' is set + false, the read position is not adjusted. + + Returns the corresponding buffer slice when successful. + + ***********************************************************************/ + + override void[] slice (uint size, bool eat = true) + { + if (size > readable) + { + if (source is null) + error (underflow); + + if (size + index > dimension) + makeRoom (size); + + // populate tail of buffer with new content + do { + if (fill(source) is IConduit.Eof) + error (eofRead); + } while (size > readable); + } + + uint i = index; + if (eat) + index += size; + return data [i .. i + size]; + } + + /*********************************************************************** + + Append an array of data to this buffer. This is often used + in lieu of a Writer. + + ***********************************************************************/ + + override IBuffer append (void *src, uint length) + { + if (length > writable) + makeRoom (length); + + copy (src, length); + return this; + } + + /*********************************************************************** + + Try to fill the available buffer with content from the + specified conduit. + + Returns the number of bytes read, or IConduit.Eof + + ***********************************************************************/ + + override uint fill (InputStream src) + { + if (writable <= increment/8) + makeRoom (increment); + + return write (&src.read); + } + + /*********************************************************************** + + Expand and consume the conduit content, up to the maximum + size indicated by the argument or until conduit.Eof + + Returns the number of bytes in the buffer + + ***********************************************************************/ + + uint fill (uint size = uint.max) + { + while (readable < size) + if (fill(source) is IConduit.Eof) + break; + return readable; + } + + /*********************************************************************** + + make some room in the buffer + + ***********************************************************************/ + + private uint makeRoom (uint size) + { + if (size < increment) + size = increment; + + dimension += size; + data.length = dimension; + return writable(); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/MappedBuffer.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/MappedBuffer.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,331 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: March 2004 + + author: Kris + +*******************************************************************************/ + +module tango.io.MappedBuffer; + +private import tango.sys.Common; + +private import tango.io.Buffer; + +private import tango.core.Exception; + +public import tango.io.FileConduit; + +/******************************************************************************* + + Win32 declarations + +*******************************************************************************/ + +version (Win32) + private extern (Windows) + { + BOOL UnmapViewOfFile (LPCVOID); + BOOL FlushViewOfFile (LPCVOID, DWORD); + LPVOID MapViewOfFile (HANDLE, DWORD, DWORD, DWORD, DWORD); + HANDLE CreateFileMappingA (HANDLE, LPSECURITY_ATTRIBUTES, DWORD, DWORD, DWORD, LPCTSTR); + } + +version (Posix) + { + private import tango.stdc.posix.sys.mman; + } + + +/******************************************************************************* + + Subclass to treat the buffer as a seekable entity, where all + capacity is available for reading and/or writing. To achieve + this we must effectively disable the 'limit' watermark, and + locate write operations around 'position' instead. + +*******************************************************************************/ + +class MappedBuffer : Buffer, IConduit.Seek +{ + private FileConduit host; // the hosting file + + version (Win32) + { + private void* base; // array pointer + private HANDLE mmFile; // mapped file + + /*************************************************************** + + Construct a MappedBuffer upon the given FileConduit. + One should set the file size using seek() & truncate() + to setup the available working space. + + ***************************************************************/ + + this (FileConduit host) + { + super (0); + + this.host = host; + + // can only do 32bit mapping on 32bit platform + auto size = host.length; + assert (size <= uint.max); + + auto access = host.style.access; + + DWORD flags = PAGE_READONLY; + if (access & host.Access.Write) + flags = PAGE_READWRITE; + + auto handle = cast(HANDLE) host.fileHandle; + mmFile = CreateFileMappingA (handle, null, flags, 0, 0, null); + if (mmFile is null) + host.error (); + + flags = FILE_MAP_READ; + if (access & host.Access.Write) + flags |= FILE_MAP_WRITE; + + base = MapViewOfFile (mmFile, flags, 0, 0, 0); + if (base is null) + host.error; + + void[] mem = base [0 .. cast(int) size]; + setContent (mem); + } + + /*************************************************************** + + Release this mapped buffer without flushing + + ***************************************************************/ + + override void close () + { + if (base) + UnmapViewOfFile (base); + + if (mmFile) + CloseHandle (mmFile); + + mmFile = null; + base = null; + } + + /*************************************************************** + + Flush dirty content out to the drive. This + fails with error 33 if the file content is + virgin. Opening a file for ReadWriteExists + followed by a flush() will cause this. + + ***************************************************************/ + + override OutputStream flush () + { + // flush all dirty pages + if (! FlushViewOfFile (base, 0)) + host.error (); + return this; + } + } + + /*********************************************************************** + + ***********************************************************************/ + + version (Posix) + { + // Linux code: not yet tested on other POSIX systems. + private void* base; // array pointer + private ulong size; // length of file + + this (FileConduit host) + { + super(0); + + this.host = host; + size = host.length; + + // Make sure the mapping attributes are consistant with + // the FileConduit attributes. + + auto access = host.style.access; + + int flags = MAP_SHARED; + int protection = PROT_READ; + + if (access & host.Access.Write) + protection |= PROT_WRITE; + + base = mmap (null, size, protection, flags, host.fileHandle(), 0); + if (base is null) + host.error(); + + void[] mem = base [0 .. cast(int) size]; + setContent (mem); + } + + /*************************************************************** + + Release this mapped buffer without flushing + + ***************************************************************/ + + override void close () + { + // NOTE: When a process ends, all mmaps belonging to that process + // are automatically unmapped by system (Linux). + // On the other hand, this is NOT the case when the related + // file descriptor is closed. This function unmaps explicitly. + + if (base) + if (munmap (base, size)) + host.error(); + base = null; + } + + /*************************************************************** + + Flush dirty content out to the drive. + + ***************************************************************/ + + override OutputStream flush () + { + // MS_ASYNC: delayed flush; equivalent to "add-to-queue" + // MS_SYNC: function flushes file immediately; no return until flush complete + // MS_INVALIDATE: invalidate all mappings of the same file (shared) + + if (msync (base, size, MS_SYNC | MS_INVALIDATE)) + host.error(); + return this; + } + } + + /*********************************************************************** + + Seek to the specified position within the buffer, and return + the byte offset of the new location (relative to zero). + + ***********************************************************************/ + + long seek (long offset, Anchor anchor = Anchor.Begin) + { + uint pos = dimension; + + if (anchor is Anchor.Begin) + pos = cast(uint) offset; + else + if (anchor is Anchor.End) + pos -= cast(uint) offset; + else + pos = index + cast(uint) offset; + + return index = pos; + } + + /*********************************************************************** + + Return count of writable bytes available in buffer. This is + calculated simply as capacity() - limit() + + ***********************************************************************/ + + override uint writable () + { + return dimension - index; + } + + /*********************************************************************** + + Bulk copy of data from 'src'. Position is adjusted by 'size' + bytes. + + ***********************************************************************/ + + override protected void copy (void *src, uint size) + { + // avoid "out of bounds" test on zero size + if (size) + { + // content may overlap ... + memcpy (&data[index], src, size); + index += size; + } + } + + /*********************************************************************** + + Exposes the raw data buffer at the current write position, + The delegate is provided with a void[] representing space + available within the buffer at the current write position. + + The delegate should return the appropriate number of bytes + if it writes valid content, or IConduit.Eof on error. + + Returns whatever the delegate returns. + + ***********************************************************************/ + + override uint write (uint delegate (void[]) dg) + { + int count = dg (data [index .. dimension]); + + if (count != IConduit.Eof) + { + index += count; + assert (index <= dimension); + } + return count; + } + + /*********************************************************************** + + Prohibit compress() from doing anything at all. + + ***********************************************************************/ + + override IBuffer compress () + { + return this; + } + + /*********************************************************************** + + Prohibit clear() from doing anything at all. + + ***********************************************************************/ + + override InputStream clear () + { + return this; + } + + /*********************************************************************** + + Prohibit the setting of another IConduit + + ***********************************************************************/ + + override IBuffer setConduit (IConduit conduit) + { + error ("cannot setConduit on memory-mapped buffer"); + return null; + } +} + + +debug (MappedBuffer) +{ + void main() + { + auto x = new MappedBuffer(null); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/Print.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/Print.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,332 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Feb 2007: Separated from Stdout + + author: Kris + +*******************************************************************************/ + +module tango.io.Print; + +private import tango.io.model.IBuffer, + tango.io.model.IConduit; + +private import tango.text.convert.Layout; + +/******************************************************************************* + + A bridge between a Layout instance and a Buffer. This is used for + the Stdout & Stderr globals, but can be used for general purpose + buffer-formatting as desired. The Template type 'T' dictates the + text arrangement within the target buffer ~ one of char, wchar or + dchar (utf8, utf16, or utf32). + + Print exposes this style of usage: + --- + auto print = new Print!(char) (...); + + print ("hello"); => hello + print (1); => 1 + print (3.14); => 3.14 + print ('b'); => b + print (1, 2, 3); => 1, 2, 3 + print ("abc", 1, 2, 3); => abc, 1, 2, 3 + print ("abc", 1, 2) ("foo"); => abc, 1, 2foo + print ("abc") ("def") (3.14); => abcdef3.14 + + print.format ("abc {}", 1); => abc 1 + print.format ("abc {}:{}", 1, 2); => abc 1:2 + print.format ("abc {1}:{0}", 1, 2); => abc 2:1 + print.format ("abc ", 1); => abc + --- + + Note that the last example does not throw an exception. There + are several use-cases where dropping an argument is legitimate, + so we're currently not enforcing any particular trap mechanism. + + Flushing the output is achieved through the flush() method, or + via an empty pair of parens: + --- + print ("hello world") (); + print ("hello world").flush; + + print.format ("hello {}", "world") (); + print.format ("hello {}", "world").flush; + --- + + Special character sequences, such as "\n", are written directly to + the output without any translation (though an output-filter could + be inserted to perform translation as required). Platform-specific + newlines are generated instead via the newline() method, which also + flushes the output when configured to do so: + --- + print ("hello ") ("world").newline; + print.format ("hello {}", "world").newline; + print.formatln ("hello {}", "world"); + --- + + The format() method supports the range of formatting options + exposed by tango.text.convert.Layout and extensions thereof; + including the full I18N extensions where configured in that + manner. To create a French instance of Print: + --- + import tango.text.locale.Locale; + + auto locale = new Locale (Culture.getCulture ("fr-FR")); + auto print = new Print!(char) (locale, ...); + --- + + Note that Print is *not* intended to be thread-safe. Use either + tango.util.log.Trace or the standard logging facilities in order + to enable atomic console I/O + +*******************************************************************************/ + +class Print(T) : OutputStream +{ + private T[] eol; + private OutputStream output; + private Layout!(T) convert; + private bool flushLines; + + public alias print opCall; + + version (Win32) + private const T[] Eol = "\r\n"; + else + private const T[] Eol = "\n"; + + /********************************************************************** + + Construct a Print instance, tying the provided stream + to a layout formatter + + **********************************************************************/ + + this (Layout!(T) convert, OutputStream output, T[] eol = Eol) + { + assert (convert); + assert (output); + + this.eol = eol; + this.output = output; + this.convert = convert; + } + + /********************************************************************** + + Layout using the provided formatting specification + + **********************************************************************/ + + final Print format (T[] fmt, ...) + { + convert (&sink, _arguments, _argptr, fmt); + return this; + } + + /********************************************************************** + + Layout using the provided formatting specification + + **********************************************************************/ + + final Print formatln (T[] fmt, ...) + { + convert (&sink, _arguments, _argptr, fmt); + return newline; + } + + /********************************************************************** + + Unformatted layout, with commas inserted between args. + Currently supports a maximum of 24 arguments + + **********************************************************************/ + + final Print print (...) + { + static T[] slice = "{}, {}, {}, {}, {}, {}, {}, {}, " + "{}, {}, {}, {}, {}, {}, {}, {}, " + "{}, {}, {}, {}, {}, {}, {}, {}, "; + + assert (_arguments.length <= slice.length/4, "Print :: too many arguments"); + + if (_arguments.length is 0) + output.flush; + else + convert (&sink, _arguments, _argptr, slice[0 .. _arguments.length * 4 - 2]); + + return this; + } + + /*********************************************************************** + + Output a newline and optionally flush + + ***********************************************************************/ + + final Print newline () + { + output.write (eol); + if (flushLines) + output.flush; + return this; + } + + /********************************************************************** + + Control implicit flushing of newline(), where true enables + flushing. An explicit flush() will always flush the output. + + **********************************************************************/ + + final Print flush (bool yes) + { + flushLines = yes; + return this; + } + + /********************************************************************** + + Return the associated output stream + + **********************************************************************/ + + final OutputStream stream () + { + return output; + } + + /********************************************************************** + + Set the associated output stream + + **********************************************************************/ + + final Print stream (OutputStream output) + { + this.output = output; + return this; + } + + /********************************************************************** + + Return the associated Layout + + **********************************************************************/ + + final Layout!(T) layout () + { + return convert; + } + + /********************************************************************** + + Set the associated Layout + + **********************************************************************/ + + final Print layout (Layout!(T) layout) + { + convert = layout; + return this; + } + + /********************************************************************** + + Sink for passing to the formatter + + **********************************************************************/ + + private final uint sink (T[] s) + { + return output.write (s); + } + + /**********************************************************************/ + /********************* OutputStream Interface *************************/ + /**********************************************************************/ + + + /*********************************************************************** + + Return the host conduit + + ***********************************************************************/ + + IConduit conduit () + { + return output.conduit; + } + + /*********************************************************************** + + Write to conduit from a source array. The provided src + content will be written to the conduit. + + Returns the number of bytes written from src, which may + be less than the quantity provided + + ***********************************************************************/ + + uint write (void[] src) + { + return output.write (src); + } + + /********************************************************************** + + Flush the output stream + + **********************************************************************/ + + final OutputStream flush () + { + output.flush; + return this; + } + + /*********************************************************************** + + Transfer the content of another conduit to this one. Returns + a reference to this class, and throws IOException on failure. + + ***********************************************************************/ + + OutputStream copy (InputStream src) + { + output.copy (src); + return this; + } + + /*********************************************************************** + + Close the output + + ***********************************************************************/ + + void close () + { + output.close; + } +} + + +debug (Print) +{ + import tango.io.GrowBuffer; + import tango.text.convert.Layout; + + void main() + { + auto print = new Print!(char) (new Layout!(char), new GrowBuffer); + + for (int i=0;i < 1000; i++) + print(i).newline; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/Stdout.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/Stdout.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,134 @@ +/******************************************************************************* + + copyright: Copyright (c) 2005 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Nov 2005: Initial release + + author: Kris + + Standard, global formatters for console output. If you don't need + formatted output or unicode translation, consider using the module + tango.io.Console directly + + Stdout & Stderr expose this style of usage: + --- + Stdout ("hello"); => hello + Stdout (1); => 1 + Stdout (3.14); => 3.14 + Stdout ('b'); => b + Stdout (1, 2, 3); => 1, 2, 3 + Stdout ("abc", 1, 2, 3); => abc, 1, 2, 3 + Stdout ("abc", 1, 2) ("foo"); => abc, 1, 2foo + Stdout ("abc") ("def") (3.14); => abcdef3.14 + + Stdout.format ("abc {}", 1); => abc 1 + Stdout.format ("abc {}:{}", 1, 2); => abc 1:2 + Stdout.format ("abc {1}:{0}", 1, 2); => abc 2:1 + Stdout.format ("abc ", 1); => abc + --- + + Note that the last example does not throw an exception. There + are several use-cases where dropping an argument is legitimate, + so we're currently not enforcing any particular trap mechanism. + + Flushing the output is achieved through the flush() method, or + via an empty pair of parens: + --- + Stdout ("hello world") (); + Stdout ("hello world").flush; + + Stdout.format ("hello {}", "world") (); + Stdout.format ("hello {}", "world").flush; + --- + + Special character sequences, such as "\n", are written directly to + the output without any translation (though an output-filter could + be inserted to perform translation as required). Platform-specific + newlines are generated instead via the newline() method, which also + flushes the output when configured to do so: + --- + Stdout ("hello ") ("world").newline; + Stdout.format ("hello {}", "world").newline; + Stdout.formatln ("hello {}", "world"); + --- + + The format() method of both Stderr and Stdout support the range + of formatting options provided by tango.text.convert.Layout and + extensions thereof; including the full I18N extensions where it + has been configured in that manner. To enable a French Stdout, + do the following: + --- + import tango.text.locale.Locale; + + Stdout.layout = new Locale (Culture.getCulture ("fr-FR")); + --- + + Note that Stdout is a shared entity, so every usage of it will + be affected by the above example. For applications supporting + multiple regions, create multiple Locale instances instead and + cache them in an appropriate manner + + Note also that the output-stream in use is exposed by these + global instances ~ this can be leveraged, for instance, to copy a + file to the standard output: + --- + Stdout.copy (new FileConduit ("myfile")); + --- + + Note that Stdout is *not* intended to be thread-safe. Use either + tango.util.log.Trace or the standard logging facilities in order + to enable atomic console I/O + +*******************************************************************************/ + +module tango.io.Stdout; + +private import tango.io.Print, + tango.io.Console; + +private import tango.text.convert.Layout; + +/******************************************************************************* + + Construct Stdout & Stderr when this module is loaded + +*******************************************************************************/ + +static this() +{ + auto layout = new Layout!(char); + + Stdout = new Print!(char) (layout, Cout.stream); + Stderr = new Print!(char) (layout, Cerr.stream); + + Stdout.flush = !Cout.redirected; + Stderr.flush = !Cerr.redirected; +} + +public static Print!(char) Stdout, /// global standard output + Stderr; /// global error output + + +/****************************************************************************** + +******************************************************************************/ + +debug (Stdout) +{ + void main() + { + Stdout ("hello").newline; + Stdout (1).newline; + Stdout (3.14).newline; + Stdout ('b').newline; + Stdout ("abc") ("def") (3.14).newline; + Stdout ("abc", 1, 2, 3).newline; + Stdout (1, 2, 3).newline; + Stdout (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1).newline; + + Stdout ("abc {}{}{}", 1, 2, 3).newline; + Stdout.format ("abc {}{}{}", 1, 2, 3).newline; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/TempFile.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/TempFile.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,663 @@ +/****************************************************************************** + * + * copyright: Copyright © 2007 Daniel Keep. All rights reserved. + * license: BSD style: $(LICENSE) + * version: Initial release: December 2007 + * authors: Daniel Keep + * credits: Thanks to John Reimer for helping test this module under + * Linux. + * + ******************************************************************************/ + +module tango.io.TempFile; + +import tango.math.Random : Random; +import tango.io.DeviceConduit : DeviceConduit; +import tango.io.FileConduit : FileConduit; +import tango.io.FilePath : FilePath/*, PathView*/; +import tango.stdc.stringz : toStringz, toString16z; + +/****************************************************************************** + ******************************************************************************/ + +version( Win32 ) +{ + import tango.sys.Common : DWORD, LONG; + + enum : DWORD { FILE_FLAG_OPEN_REPARSE_POINT = 0x00200000 } + + version( Win32SansUnicode ) + { + import tango.sys.Common : + GetVersionExA, OSVERSIONINFO, + CreateFileA, GENERIC_READ, GENERIC_WRITE, + CREATE_NEW, FILE_ATTRIBUTE_NORMAL, FILE_FLAG_DELETE_ON_CLOSE, + FILE_SHARE_READ, FILE_SHARE_WRITE, + LPSECURITY_ATTRIBUTES, + HANDLE, INVALID_HANDLE_VALUE, + GetTempPathA, SetFilePointer, GetLastError, ERROR_SUCCESS; + + HANDLE CreateFile(FilePath fn, DWORD da, DWORD sm, + LPSECURITY_ATTRIBUTES sa, DWORD cd, DWORD faa, HANDLE tf) + { + return CreateFileA(fn.cString.ptr, da, sm, sa, cd, faa, tf); + } + + char[] GetTempPath() + { + auto len = GetTempPathA(0, null); + if( len == 0 ) + throw new Exception("could not obtain temporary path"); + + auto result = new char[len+1]; + len = GetTempPathA(len+1, result.ptr); + if( len == 0 ) + throw new Exception("could not obtain temporary path"); + return result[0..len]; + } + } + else + { + import tango.sys.Common : + GetVersionExW, OSVERSIONINFO, + CreateFileW, GENERIC_READ, GENERIC_WRITE, + CREATE_NEW, FILE_ATTRIBUTE_NORMAL, FILE_FLAG_DELETE_ON_CLOSE, + FILE_SHARE_READ, FILE_SHARE_WRITE, + LPSECURITY_ATTRIBUTES, + HANDLE, INVALID_HANDLE_VALUE, + GetTempPathW, SetFilePointer, GetLastError, ERROR_SUCCESS; + + import tango.text.convert.Utf : toString, toString16; + + HANDLE CreateFile(FilePath fn, DWORD da, DWORD sm, + LPSECURITY_ATTRIBUTES sa, DWORD cd, DWORD faa, HANDLE tf) + { + return CreateFileW(toString16(fn.cString).ptr, + da, sm, sa, cd, faa, tf); + } + + char[] GetTempPath() + { + auto len = GetTempPathW(0, null); + if( len == 0 ) + throw new Exception("could not obtain temporary path"); + + auto result = new wchar[len+1]; + len = GetTempPathW(len+1, result.ptr); + if( len == 0 ) + throw new Exception("could not obtain temporary path"); + return toString(result[0..len]); + } + } + + // Determines if reparse points (aka: symlinks) are supported. Support + // was introduced in Windows Vista. + bool reparseSupported() + { + OSVERSIONINFO versionInfo; + versionInfo.dwOSVersionInfoSize = versionInfo.sizeof; + + void e(){throw new Exception("could not determine Windows version");}; + + version( Win32SansUnicode ) + if( !GetVersionExA(&versionInfo) ) e(); + else + if( !GetVersionExW(&versionInfo) ) e(); + + return (versionInfo.dwMajorVersion >= 6); + } +} + +else version( Posix ) +{ + import tango.stdc.posix.fcntl : open, O_CREAT, O_EXCL, O_RDWR; + import tango.stdc.posix.pwd : getpwnam; + import tango.stdc.posix.unistd : access, getuid, lseek, unlink, W_OK; + import tango.stdc.posix.sys.stat : stat, stat_t; + + import tango.sys.Environment : Environment; + + enum { O_LARGEFILE = 0x8000 } + + version( linux ) + { + // NOTE: This constant is actually platform-dependant for some + // God-only-knows reason. *sigh* It should be fine for 'generic' + // architectures, but other ones will need to be double-checked. + enum { O_NOFOLLOW = 00400000 } + } + else version( darwin ) + { + enum { O_NOFOLLOW = 0x0100 } + } + else + { + pragma(msg, "Cannot use TempFile: O_NOFOLLOW is not " + "defined for this platform."); + static assert(false); + } +} + +/****************************************************************************** + * + * The TempFile class aims to provide a safe way of creating and destroying + * temporary files. The TempFile class will automatically close temporary + * files when the object is destroyed, so it is recommended that you make + * appropriate use of scoped destruction. + * + * Temporary files can be created with one of several styles, much like normal + * FileConduits. TempFile styles have the following properties: + * + * $(UL + * $(LI $(B Transience): this determines whether the file should be destroyed + * as soon as it is closed (transient,) or continue to persist even after the + * application has terminated (permanent.)) + * ) + * + * Eventually, this will be expanded to give you greater control over the + * temporary file's properties. + * + * For the typical use-case (creating a file to temporarily store data too + * large to fit into memory,) the following is sufficient: + * + * ----- + * { + * scope temp = new TempFile; + * + * // Use temp as a normal conduit; it will be automatically closed when + * // it goes out of scope. + * } + * ----- + * + * $(B Important): + * It is recommended that you $(I do not) use files created by this class to + * store sensitive information. There are several known issues with the + * current implementation that could allow an attacker to access the contents + * of these temporary files. + * + * $(B Todo): Detail security properties and guarantees. + * + ******************************************************************************/ + +class TempFile : DeviceConduit, DeviceConduit.Seek +{ + //alias FileConduit.Cache Cache; + //alias FileConduit.Share Share; + + /+enum Visibility : ubyte + { + /** + * The temporary file will have read and write access to it restricted + * to the current user. + */ + User, + /** + * The temporary file will have read and write access available to any + * user on the system. + */ + World + }+/ + + /************************************************************************** + * + * This enumeration is used to control whether the temporary file should + * persist after the TempFile object has been destroyed. + * + **************************************************************************/ + + enum Transience : ubyte + { + /** + * The temporary file should be destroyed along with the owner object. + */ + Transient, + /** + * The temporary file should persist after the object has been + * destroyed. + */ + Permanent + } + + /+enum Sensitivity : ubyte + { + /** + * Transient files will be truncated to zero length immediately + * before closure to prevent casual filesystem inspection to recover + * their contents. + * + * No additional action is taken on permanent files. + */ + None, + /** + * Transient files will be zeroed-out before truncation, to mask their + * contents from more thorough filesystem inspection. + * + * This option is not compatible with permanent files. + */ + Low + /+ + /** + * Transient files will be overwritten first with zeroes, then with + * ones, and then with a random 32- or 64-bit pattern (dependant on + * which is most efficient.) The file will then be truncated. + * + * This option is not compatible with permanent files. + */ + Medium + +/ + }+/ + + /************************************************************************** + * + * This structure is used to determine how the temporary files should be + * opened and used. + * + **************************************************************************/ + struct Style + { + align(1): + //Visibility visibility; /// + Transience transience; /// + //Sensitivity sensitivity; /// + //Share share; /// + //Cache cache; /// + int attempts = 10; /// + } + + /** + * Style for creating a transient temporary file that only the current + * user can access. + */ + static const Style Transient = {Transience.Transient}; + /** + * Style for creating a permanent temporary file that only the current + * user can access. + */ + static const Style Permanent = {Transience.Permanent}; + + // Path to the temporary file + private /*PathView*/ FilePath _path; + + // Style we've opened with + private Style _style; + + // Have we been detatched? + private bool detached = false; + + /// + this(Style style = Style.init) + { + create(style); + } + + /// + this(char[] prefix, Style style = Style.init) + { + this(FilePath(prefix), style); + } + + /// + this(FilePath prefix, Style style = Style.init) + { + create(prefix.dup, style); + } + + ~this() + { + if( !detached ) this.detach(); + } + + /************************************************************************** + * + * Returns a PathView to the temporary file. Please note that depending + * on your platform, the returned path may or may not actually exist if + * you specified a transient file. + * + **************************************************************************/ + /*PathView*/ FilePath path() + { + return _path; + } + + /************************************************************************** + * + * Indicates the style that this TempFile was created with. + * + **************************************************************************/ + Style style() + { + return _style; + } + + override char[] toString() + { + if( path.toString.length > 0 ) + return path.toString; + else + return ""; + } + + /************************************************************************** + * + * Returns the current cursor position within the file. + * + **************************************************************************/ + long position() + { + return seek(0, Seek.Anchor.Current); + } + + /************************************************************************** + * + * Returns the total length, in bytes, of the temporary file. + * + **************************************************************************/ + long length() + { + long pos, ret; + pos = position; + ret = seek(0, Seek.Anchor.End); + seek(pos); + return ret; + } + + /* + * Creates a new temporary file with the given style. + */ + private void create(Style style) + { + create(FilePath(tempPath).dup, style); + } + + private void create(FilePath prefix, Style style) + { + for( size_t i=0; i> 32); + long result = SetFilePointer (handle, cast(LONG) offset, + &high, anchor); + + if (result is -1 && + GetLastError() != ERROR_SUCCESS) + error(); + + return result + (cast(long) high << 32); + } + } + else version( Posix ) + { + private static const DEFAULT_LENGTH = 6; + private static const DEFAULT_PREFIX = ".tmp"; + + // Use "~" to work around a bug in DMD where it elides empty constants + private static const DEFAULT_SUFFIX = "~"; + + private static const JUNK_CHARS = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz0123456789"; + + /* + * Returns the path to the temporary directory. + */ + private char[] tempPath() + { + // Check for TMPDIR; failing that, use /tmp + if( auto tmpdir = Environment.get("TMPDIR") ) + return tmpdir; + else + return "/tmp/"; + } + + /* + * Creates a new temporary file at the given path, with the specified + * style. + */ + private bool create_path(FilePath path, Style style) + { + // Check suitability + { + auto parent = path.path; + auto parentz = toStringz(parent); + + // Make sure we have write access + if( access(parentz, W_OK) == -1 ) + error("do not have write access to temporary directory"); + + // Get info on directory + stat_t sb; + if( stat(parentz, &sb) == -1 ) + error("could not stat temporary directory"); + + // Get root's UID + auto pwe = getpwnam("root"); + if( pwe is null ) error("could not get root's uid"); + auto root_uid = pwe.pw_uid; + + // Make sure either we or root are the owner + if( !(sb.st_uid == root_uid || sb.st_uid == getuid) ) + error("temporary directory owned by neither root nor user"); + + // Check to see if anyone other than us can write to the dir. + if( (sb.st_mode & 022) != 0 && (sb.st_mode & 01000) == 0 ) + error("sticky bit not set on world-writable directory"); + } + + // Create file + { + auto flags = O_LARGEFILE | O_CREAT | O_EXCL + | O_NOFOLLOW | O_RDWR; + + auto pathz = path.cString.ptr; + + handle = open(pathz, flags, 0600); + if( handle is -1 ) + return false; + + if( style.transience == Transience.Transient ) + { + // BUG TODO: check to make sure the path still points + // to the file we opened. Pity you can't unlink a file + // descriptor... + + // NOTE: This should be an exception and not simply + // returning false, since this is a violation of our + // guarantees. + if( unlink(pathz) == -1 ) + error("could not remove transient file"); + } + + _path = path; + _style = style; + + return true; + } + } + + // See DDoc version + long seek(long offset, Seek.Anchor anchor = Seek.Anchor.Begin) + { + long result = lseek(handle, offset, anchor); + if (result is -1) + error(); + return result; + } + } + else version( DDoc ) + { + /********************************************************************** + * + * Seeks the temporary file's cursor to the given location. + * + **********************************************************************/ + long seek(long offset, Seek.Anchor anchor = Seek.Anchor.Begin); + } + else + { + static assert(false, "Unsupported platform"); + } + + /* + * Generates a new random file name, sans directory. + */ + private char[] randomName(uint length=DEFAULT_LENGTH, + char[] prefix=DEFAULT_PREFIX, + char[] suffix=DEFAULT_SUFFIX) + { + auto junk = new char[length]; + scope(exit) delete junk; + + foreach( ref c ; junk ) + c = JUNK_CHARS[Random.shared.next($)]; + + return prefix~junk~suffix; + } + + override void detach() + { + static assert( !is(Sensitivity) ); + super.detach(); + detached = true; + } +} + +version( TempFile_SelfTest ): + +import tango.io.Console : Cin; +import tango.io.Stdout : Stdout; + +void main() +{ + Stdout(r" +Please ensure that the transient file no longer exists once the TempFile +object is destroyed, and that the permanent file does. You should also check +the following on both: + + * the file should be owned by you, + * the owner should have read and write permissions, + * no other permissions should be set on the file. + +For POSIX systems: + + * the temp directory should be owned by either root or you, + * if anyone other than root or you can write to it, the sticky bit should be + set, + * if the directory is writable by anyone other than root or the user, and the + sticky bit is *not* set, then creating the temporary file should fail. + +You might want to delete the permanent one afterwards, too. :)") + .newline; + + Stdout.formatln("Creating a transient file:"); + { + scope tempFile = new TempFile(/*TempFile.UserPermanent*/); + scope(exit) tempFile.detach; + + Stdout.formatln(" .. path: {}", tempFile); + + tempFile.output.write("Transient temp file."); + + char[] buffer = new char[1023]; + tempFile.seek(0); + buffer = buffer[0..tempFile.input.read(buffer)]; + + Stdout.formatln(" .. contents: \"{}\"", buffer); + + Stdout(" .. press Enter to destroy TempFile object.").newline; + Cin.copyln(); + } + + Stdout.newline; + + Stdout.formatln("Creating a permanent file:"); + { + scope tempFile = new TempFile(TempFile.UserPermanent); + scope(exit) tempFile.detach; + + Stdout.formatln(" .. path: {}", tempFile); + + tempFile.output.write("Permanent temp file."); + + char[] buffer = new char[1023]; + tempFile.seek(0); + buffer = buffer[0..tempFile.input.read(buffer)]; + + Stdout.formatln(" .. contents: \"{}\"", buffer); + + Stdout(" .. press Enter to destroy TempFile object.").flush; + Cin.copyln(); + } + + Stdout("\nDone.").newline; +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/UnicodeFile.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/UnicodeFile.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,251 @@ +/******************************************************************************* + + copyright: Copyright (c) 2005 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: December 2005 + + author: Kris + +*******************************************************************************/ + +module tango.io.UnicodeFile; + +public import tango.io.FilePath; + +private import tango.io.FileConduit; + +private import tango.core.Exception; + +public import tango.text.convert.UnicodeBom; + +/******************************************************************************* + + Read and write unicode files + + For our purposes, unicode files are an encoding of textual material. + The goal of this module is to interface that external-encoding with + a programmer-defined internal-encoding. This internal encoding is + declared via the template argument T, whilst the external encoding + is either specified or derived. + + Three internal encodings are supported: char, wchar, and dchar. The + methods herein operate upon arrays of this type. For example, read() + returns an array of the type, whilst write() and append() expect an + array of said type. + + Supported external encodings are as follow: + + $(UL Encoding.Unknown) + $(UL Encoding.UTF_8) + $(UL Encoding.UTF_8N) + $(UL Encoding.UTF_16) + $(UL Encoding.UTF_16BE) + $(UL Encoding.UTF_16LE) + $(UL Encoding.UTF_32) + $(UL Encoding.UTF_32BE) + $(UL Encoding.UTF_32LE) + + These can be divided into implicit and explicit encodings. Here are + the implicit subset: + + $(UL Encoding.Unknown) + $(UL Encoding.UTF_8) + $(UL Encoding.UTF_16) + $(UL Encoding.UTF_32) + + Implicit encodings may be used to 'discover' + an unknown encoding, by examining the first few bytes of the file + content for a signature. This signature is optional for all files, + but is often written such that the content is self-describing. When + the encoding is unknown, using one of the non-explicit encodings will + cause the read() method to look for a signature and adjust itself + accordingly. It is possible that a ZWNBSP character might be confused + with the signature; today's files are supposed to use the WORD-JOINER + character instead. + + Explicit encodings are as follows: + + $(UL Encoding.UTF_8N) + $(UL Encoding.UTF_16BE) + $(UL Encoding.UTF_16LE) + $(UL Encoding.UTF_32BE) + $(UL Encoding.UTF_32LE) + + This group of encodings are for use when the file encoding is + known. These *must* be used when writing or appending, since written + content must be in a known format. It should be noted that, during a + read operation, the presence of a signature is in conflict with these + explicit varieties. + + Method read() returns the current content of the file, whilst write() + sets the file content, and file length, to the provided array. Method + append() adds content to the tail of the file. When appending, it is + your responsibility to ensure the existing and current encodings are + correctly matched. + + Methods to inspect the file system, check the status of a file or + directory, and other facilities are made available via the FilePath + superclass. + + See these links for more info: + $(UL $(LINK http://www.utf-8.com/)) + $(UL $(LINK http://www.hackcraft.net/xmlUnicode/)) + $(UL $(LINK http://www.unicode.org/faq/utf_bom.html/)) + $(UL $(LINK http://www.azillionmonkeys.com/qed/unicode.html/)) + $(UL $(LINK http://icu.sourceforge.net/docs/papers/forms_of_unicode/)) + +*******************************************************************************/ + +class UnicodeFile(T) +{ + private UnicodeBom!(T) bom; + private PathView path_; + + /*********************************************************************** + + Construct a UnicodeFile from the provided FilePath. The given + encoding represents the external file encoding, and should + be one of the Encoding.xx types + + ***********************************************************************/ + + this (PathView path, Encoding encoding) + { + bom = new UnicodeBom!(T)(encoding); + path_ = path; + } + + /*********************************************************************** + + Construct a UnicodeFile from a text string. The provided + encoding represents the external file encoding, and should + be one of the Encoding.xx types + + ***********************************************************************/ + + this (char[] path, Encoding encoding) + { + this (new FilePath(path), encoding); + } + + /*********************************************************************** + + Call-site shortcut to create a UnicodeFile instance. This + enables the same syntax as struct usage, so may expose + a migration path + + ***********************************************************************/ + + static UnicodeFile opCall (char[] name, Encoding encoding) + { + return new UnicodeFile (name, encoding); + } + + /*********************************************************************** + + Return the associated FilePath instance + + ***********************************************************************/ + + PathView path () + { + return path_; + } + + /*********************************************************************** + + Return the current encoding. This is either the originally + specified encoding, or a derived one obtained by inspecting + the file content for a BOM. The latter is performed as part + of the read() method. + + ***********************************************************************/ + + Encoding encoding () + { + return bom.encoding(); + } + + /*********************************************************************** + + Return the content of the file. The content is inspected + for a BOM signature, which is stripped. An exception is + thrown if a signature is present when, according to the + encoding type, it should not be. Conversely, An exception + is thrown if there is no known signature where the current + encoding expects one to be present. + + ***********************************************************************/ + + T[] read () + { + scope conduit = new FileConduit (path_); + scope (exit) + conduit.close; + + // allocate enough space for the entire file + auto content = new ubyte [cast(uint) conduit.length]; + + //read the content + if (conduit.read (content) != content.length) + conduit.error ("unexpected eof"); + + return bom.decode (content); + } + + /*********************************************************************** + + Set the file content and length to reflect the given array. + The content will be encoded accordingly. + + ***********************************************************************/ + + UnicodeFile write (T[] content, bool writeBom = false) + { + return write (content, FileConduit.ReadWriteCreate, writeBom); + } + + /*********************************************************************** + + Append content to the file; the content will be encoded + accordingly. + + Note that it is your responsibility to ensure the + existing and current encodings are correctly matched. + + ***********************************************************************/ + + UnicodeFile append (T[] content) + { + return write (content, FileConduit.WriteAppending, false); + } + + /*********************************************************************** + + Internal method to perform writing of content. Note that + the encoding must be of the explicit variety by the time + we get here. + + ***********************************************************************/ + + private final UnicodeFile write (T[] content, FileConduit.Style style, bool writeBom) + { + // convert to external representation (may throw an exeption) + void[] converted = bom.encode (content); + + // open file after conversion ~ in case of exceptions + scope conduit = new FileConduit (path_, style); + scope (exit) + conduit.close; + + if (writeBom) + conduit.write (bom.signature); + + // and write + conduit.write (converted); + return this; + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/archive/Zip.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/archive/Zip.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,2882 @@ +/******************************************************************************* + * + * copyright: Copyright © 2007 Daniel Keep. All rights reserved. + * + * license: BSD style: $(LICENSE) + * + * version: Initial release: December 2007 + * + * author: Daniel Keep + * + ******************************************************************************/ + +module tango.io.archive.Zip; + +/* + +TODO +==== + +* Disable UTF encoding until I've worked out what version of Zip that's + related to... (actually; it's entirely possible that's it's merely a + *proposal* at the moment.) (*Done*) + +* Make ZipEntry safe: make them aware that their creating reader has been + destroyed. + +*/ + +import tango.core.ByteSwap : ByteSwap; +import tango.io.Buffer : Buffer; +import tango.io.FileConduit : FileConduit; +import tango.io.FilePath : FilePath, PathView; +import tango.io.MappedBuffer : MappedBuffer; +import tango.io.compress.ZlibStream : ZlibInput, ZlibOutput; +import tango.io.digest.Crc32 : Crc32; +import tango.io.model.IConduit : IConduit, InputStream, OutputStream; +import tango.io.stream.DigestStream : DigestInput; +import tango.time.Time : Time, TimeSpan; +import tango.time.WallClock : WallClock; +import tango.time.chrono.Gregorian : Gregorian; + +import Integer = tango.text.convert.Integer; + +debug(Zip) import tango.io.Stdout : Stderr; + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +// +// Implementation crap +// +// Why is this here, you ask? Because of bloody DMD forward reference bugs. +// For pete's sake, Walter, FIX THEM, please! +// +// To skip to the actual user-visible stuff, search for "Shared stuff". + +private +{ + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +// +// LocalFileHeader +// + + align(1) + struct LocalFileHeaderData + { + ushort extract_version = ushort.max; + ushort general_flags = 0; + ushort compression_method = 0; + ushort modification_file_time = 0; + ushort modification_file_date = 0; + uint crc_32 = 0; // offsetof = 10 + uint compressed_size = 0; + uint uncompressed_size = 0; + ushort file_name_length = 0; + ushort extra_field_length = 0; + + debug(Zip) void dump() + { + Stderr + ("LocalFileHeader.Data {")("\n") + (" extract_version = ")(extract_version)("\n") + (" general_flags = ")(general_flags)("\n") + (" compression_method = ")(compression_method)("\n") + (" modification_file_time = ")(modification_file_time)("\n") + (" modification_file_date = ")(modification_file_date)("\n") + (" crc_32 = ")(crc_32)("\n") + (" compressed_size = ")(compressed_size)("\n") + (" uncompressed_size = ")(uncompressed_size)("\n") + (" file_name_length = ")(file_name_length)("\n") + (" extra_field_length = ")(extra_field_length)("\n") + ("}").newline; + } + } + +struct LocalFileHeader +{ + const uint signature = 0x04034b50; + + alias LocalFileHeaderData Data; + Data data; + static assert( Data.sizeof == 26 ); + + char[] file_name; + ubyte[] extra_field; + + void[] data_arr() + { + return (&data)[0..1]; + } + + void put(OutputStream output) + { + // Make sure var-length fields will fit. + if( file_name.length > ushort.max ) + ZipException.fntoolong; + + if( extra_field.length > ushort.max ) + ZipException.eftoolong; + + // Encode filename + auto file_name = utf8_to_cp437(this.file_name); + scope(exit) if( file_name !is cast(ubyte[])this.file_name ) + delete file_name; + + if( file_name is null ) + ZipException.fnencode; + + // Update lengths in data + Data data = this.data; + data.file_name_length = file_name.length; + data.extra_field_length = extra_field.length; + + // Do it + version( BigEndian ) swapAll(data); + writeExact(output, (&data)[0..1]); + writeExact(output, file_name); + writeExact(output, extra_field); + } + + void fill(InputStream src) + { + readExact(src, data_arr); + version( BigEndian ) swapAll(data); + + //debug(Zip) data.dump; + + auto tmp = new ubyte[data.file_name_length]; + readExact(src, tmp); + file_name = cp437_to_utf8(tmp); + if( cast(char*) tmp.ptr !is file_name.ptr ) delete tmp; + + extra_field = new ubyte[data.extra_field_length]; + readExact(src, extra_field); + } + + /* + * This method will check to make sure that the local and central headers + * are the same; if they're not, then that indicates that the archive is + * corrupt. + */ + bool agrees_with(FileHeader h) + { + if( data.extract_version != h.data.extract_version + || data.general_flags != h.data.general_flags + || data.compression_method != h.data.compression_method + || data.modification_file_time != h.data.modification_file_time + || data.modification_file_date != h.data.modification_file_date + || data.crc_32 != h.data.crc_32 + || data.compressed_size != h.data.compressed_size + || data.uncompressed_size != h.data.uncompressed_size + || file_name != h.file_name + || extra_field != h.extra_field ) + return false; + + // We need a separate check for the sizes and crc32, since these will + // be zero if a trailing descriptor was used. + if( !h.usingDataDescriptor && ( + data.crc_32 != h.data.crc_32 + || data.compressed_size != h.data.compressed_size + || data.uncompressed_size != h.data.uncompressed_size ) ) + return false; + + return true; + } +} + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +// +// FileHeader +// + + align(1) + struct FileHeaderData + { + ubyte zip_version; + ubyte file_attribute_type; + ushort extract_version; + ushort general_flags; + ushort compression_method; + ushort modification_file_time; + ushort modification_file_date; + uint crc_32; + uint compressed_size; + uint uncompressed_size; + ushort file_name_length; + ushort extra_field_length; + ushort file_comment_length; + ushort disk_number_start; + ushort internal_file_attributes = 0; + uint external_file_attributes = 0; + int relative_offset_of_local_header; + + debug(Zip) void dump() + { + Stderr + ("FileHeader.Data {\n") + (" zip_version = ")(zip_version)("\n") + (" file_attribute_type = ")(file_attribute_type)("\n") + (" extract_version = ")(extract_version)("\n") + (" general_flags = ")(general_flags)("\n") + (" compression_method = ")(compression_method)("\n") + (" modification_file_time = ")(modification_file_time)("\n") + (" modification_file_date = ")(modification_file_date)("\n") + (" crc_32 = ")(crc_32)("\n") + (" compressed_size = ")(compressed_size)("\n") + (" uncompressed_size = ")(uncompressed_size)("\n") + (" file_name_length = ")(file_name_length)("\n") + (" extra_field_length = ")(extra_field_length)("\n") + (" file_comment_length = ")(file_comment_length)("\n") + (" disk_number_start = ")(disk_number_start)("\n") + (" internal_file_attributes = ")(internal_file_attributes)("\n") + (" external_file_attributes = ")(external_file_attributes)("\n") + (" relative_offset_of_local_header = ")(relative_offset_of_local_header) + ("\n") + ("}").newline; + } + + void fromLocal(LocalFileHeader.Data data) + { + extract_version = data.extract_version; + general_flags = data.general_flags; + compression_method = data.compression_method; + modification_file_time = data.modification_file_time; + modification_file_date = data.modification_file_date; + crc_32 = data.crc_32; + compressed_size = data.compressed_size; + uncompressed_size = data.uncompressed_size; + file_name_length = data.file_name_length; + extra_field_length = data.extra_field_length; + } + } + +struct FileHeader +{ + const uint signature = 0x02014b50; + + alias FileHeaderData Data; + Data* data; + static assert( Data.sizeof == 42 ); + + char[] file_name; + ubyte[] extra_field; + char[] file_comment; + + bool usingDataDescriptor() + { + return !!(data.general_flags & 1<<3); + } + + uint compressionOptions() + { + return (data.general_flags >> 1) & 0b11; + } + + bool usingUtf8() + { + //return !!(data.general_flags & 1<<11); + return false; + } + + void[] data_arr() + { + return (cast(void*)data)[0 .. Data.sizeof]; + } + + void put(OutputStream output) + { + // Make sure the var-length fields will fit. + if( file_name.length > ushort.max ) + ZipException.fntoolong; + + if( extra_field.length > ushort.max ) + ZipException.eftoolong; + + if( file_comment.length > ushort.max ) + ZipException.cotoolong; + + // encode the filename and comment + auto file_name = utf8_to_cp437(this.file_name); + scope(exit) if( file_name !is cast(ubyte[])this.file_name ) + delete file_name; + auto file_comment = utf8_to_cp437(this.file_comment); + scope(exit) if( file_comment !is cast(ubyte[])this.file_comment ) + delete file_comment; + + if( file_name is null ) + ZipException.fnencode; + + if( file_comment is null && this.file_comment !is null ) + ZipException.coencode; + + // Update the lengths + Data data = *(this.data); + data.file_name_length = file_name.length; + data.extra_field_length = extra_field.length; + data.file_comment_length = file_comment.length; + + // Ok; let's do this! + version( BigEndian ) swapAll(data); + writeExact(output, (&data)[0..1]); + writeExact(output, file_name); + writeExact(output, extra_field); + writeExact(output, file_comment); + } + + long map(void[] src) + { + //debug(Zip) Stderr.formatln("FileHeader.map([0..{}])",src.length); + + auto old_ptr = src.ptr; + + data = cast(Data*) src.ptr; + src = src[Data.sizeof..$]; + version( BigEndian ) swapAll(*data); + + //debug(Zip) data.dump; + + char[] function(ubyte[]) conv_fn; + if( usingUtf8 ) + conv_fn = &cp437_to_utf8; + else + conv_fn = &utf8_to_utf8; + + file_name = conv_fn( + cast(ubyte[]) src[0..data.file_name_length]); + src = src[data.file_name_length..$]; + + extra_field = cast(ubyte[]) src[0..data.extra_field_length]; + src = src[data.extra_field_length..$]; + + file_comment = conv_fn( + cast(ubyte[]) src[0..data.file_comment_length]); + src = src[data.file_comment_length..$]; + + // Return how many bytes we've eaten + //debug(Zip) Stderr.formatln(" . used {} bytes", cast(long)(src.ptr - old_ptr)); + return cast(long)(src.ptr - old_ptr); + } +} + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +// +// EndOfCDRecord +// + + align(1) + struct EndOfCDRecordData + { + ushort disk_number = 0; + ushort disk_with_start_of_central_directory = 0; + ushort central_directory_entries_on_this_disk; + ushort central_directory_entries_total; + uint size_of_central_directory; + uint offset_of_start_of_cd_from_starting_disk; + ushort file_comment_length; + + debug(Zip) void dump() + { + Stderr + .formatln("EndOfCDRecord.Data {}","{") + .formatln(" disk_number = {}", disk_number) + .formatln(" disk_with_start_of_central_directory = {}", + disk_with_start_of_central_directory) + .formatln(" central_directory_entries_on_this_disk = {}", + central_directory_entries_on_this_disk) + .formatln(" central_directory_entries_total = {}", + central_directory_entries_total) + .formatln(" size_of_central_directory = {}", + size_of_central_directory) + .formatln(" offset_of_start_of_cd_from_starting_disk = {}", + offset_of_start_of_cd_from_starting_disk) + .formatln(" file_comment_length = {}", file_comment_length) + .formatln("}"); + } + } + +struct EndOfCDRecord +{ + const uint signature = 0x06054b50; + + alias EndOfCDRecordData Data; + Data data; + static assert( data.sizeof == 18 ); + + char[] file_comment; + + void[] data_arr() + { + return (cast(void*)&data)[0 .. data.sizeof]; + } + + void put(OutputStream output) + { + // Set up the comment; check length, encode + if( file_comment.length > ushort.max ) + ZipException.cotoolong; + + auto file_comment = utf8_to_cp437(this.file_comment); + scope(exit) if( file_comment !is cast(ubyte[])this.file_comment ) + delete file_comment; + + // Set up data block + Data data = this.data; + data.file_comment_length = file_comment.length; + + version( BigEndian ) swapAll(data); + writeExact(output, (&data)[0..1]); + } + + void fill(void[] src) + { + //Stderr.formatln("EndOfCDRecord.fill([0..{}])",src.length); + + auto _data = data_arr; + _data[] = src[0.._data.length]; + src = src[_data.length..$]; + version( BigEndian ) swapAll(data); + + //data.dump; + + file_comment = cast(char[]) src[0..data.file_comment_length].dup; + } +} + +// End of implementation crap +} + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +// +// Shared stuff + +public +{ + /** + * This enumeration denotes the kind of compression used on a file. + */ + enum Method + { + /// No compression should be used. + Store, + /// Deflate compression. + Deflate, + /** + * This is a special value used for unsupported or unrecognised + * compression methods. This value is only used internally. + */ + Unsupported + } +} + +private +{ + const ushort ZIP_VERSION = 20; + const ushort MAX_EXTRACT_VERSION = 20; + + /* compression flags + uses trailing descriptor | + utf-8 encoding | | + ^ ^ /\ */ + const ushort SUPPORTED_FLAGS = 0b00_0_0_0_0000_0_0_0_1_11_0; + const ushort UNSUPPORTED_FLAGS = ~SUPPORTED_FLAGS; + + Method toMethod(ushort method) + { + switch( method ) + { + case 0: return Method.Store; + case 8: return Method.Deflate; + default: return Method.Unsupported; + } + } + + ushort fromMethod(Method method) + { + switch( method ) + { + case Method.Store: return 0; + case Method.Deflate: return 8; + default: + assert(false, "unsupported compression method"); + } + } + + /* NOTE: This doesn't actually appear to work. Using the default magic + * number with Tango's Crc32 digest works, however. + */ + //const CRC_MAGIC = 0xdebb20e3u; +} + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +// +// ZipReader + +interface ZipReader +{ + bool streamed(); + void close(); + bool more(); + ZipEntry get(); + ZipEntry get(ZipEntry); + int opApply(int delegate(ref ZipEntry)); +} + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +// +// ZipWriter + +interface ZipWriter +{ + void finish(); + void putFile(ZipEntryInfo info, char[] path); + void putFile(ZipEntryInfo info, PathView path); + void putStream(ZipEntryInfo info, InputStream source); + void putEntry(ZipEntryInfo info, ZipEntry entry); + void putData(ZipEntryInfo info, void[] data); + Method method(); + Method method(Method); +} + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +// +// ZipBlockReader + +/** + * The ZipBlockReader class is used to parse a Zip archive. It exposes the + * contents of the archive via an iteration interface. For instance, to loop + * over all files in an archive, one can use either + * + * ----- + * foreach( entry ; reader ) + * ... + * ----- + * + * Or + * + * ----- + * while( reader.more ) + * { + * auto entry = reader.get; + * ... + * } + * ----- + * + * See the ZipEntry class for more information on the contents of entries. + * + * Note that this class can only be used with input sources which can be + * freely seeked. Also note that you may open a ZipEntry instance produced by + * this reader at any time until the ZipReader that created it is closed. + */ +class ZipBlockReader : ZipReader +{ + /** + * Creates a ZipBlockReader using the specified file on the local + * filesystem. + */ + this(char[] path) + { + this(FilePath(path)); + } + + /// ditto + this(PathView path) + { + file_source = new FileConduit(path); + this(file_source); + } + +version( none ) +{ + /** + * Creates a ZipBlockReader using the provided FileConduit instance. Where + * possible, the conduit will be wrapped in a memory-mapped buffer for + * optimum performance. If you do not want the FileConduit memory-mapped, + * either cast it to an InputStream first, or pass source.input to the + * constructor. + */ + this(FileConduit source) + { + // BUG: MappedBuffer doesn't implement IConduit.Seek + //mm_source = new MappedBuffer(source); + //this(mm_source); + this(source.input); + } +} + + /** + * Creates a ZipBlockReader using the provided InputStream. Please note + * that this InputStream must also implement the IConduit.Seek interface. + */ + this(InputStream source) + in + { + assert( cast(IConduit.Seek) source, "source stream must be seekable" ); + } + body + { + this.source = source; + this.seeker = cast(IConduit.Seek) source; + } + + bool streamed() { return false; } + + /** + * Closes the reader, and releases all resources. After this operation, + * all ZipEntry instances created by this ZipReader are invalid and should + * not be used. + */ + void close() + { + state = State.Done; + source = null; + seeker = null; + delete headers; + delete cd_data; + + if( file_source !is null ) delete file_source; + if( mm_source !is null ) delete mm_source; + } + + /** + * Returns true if and only if there are additional files in the archive + * which have not been read via the get method. This returns true before + * the first call to get (assuming the opened archive is non-empty), and + * false after the last file has been accessed. + */ + bool more() + { + switch( state ) + { + case State.Init: + read_cd; + assert( state == State.Open ); + return more; + + case State.Open: + return (current_index < headers.length); + + case State.Done: + return false; + } + } + + /** + * Retrieves the next file from the archive. Note that although this does + * perform IO operations, it will not read the contents of the file. + * + * The optional reuse argument can be used to instruct the reader to reuse + * an existing ZipEntry instance. If passed a null reference, it will + * create a new ZipEntry instance. + */ + ZipEntry get() + { + if( !more ) + ZipExhaustedException(); + + return new ZipEntry(headers[current_index++], &open_file); + } + + /// ditto + ZipEntry get(ZipEntry reuse) + { + if( !more ) + ZipExhaustedException(); + + if( reuse is null ) + return new ZipEntry(headers[current_index++], &open_file); + else + return reuse.reset(headers[current_index++], &open_file); + } + + /** + * This is used to iterate over the contents of an archive using a foreach + * loop. Please note that the iteration will reuse the ZipEntry instance + * passed to your loop. If you wish to keep the instance and re-use it + * later, you $(B must) use the dup member to create a copy. + */ + int opApply(int delegate(ref ZipEntry) dg) + { + int result = 0; + ZipEntry entry; + + while( more ) + { + entry = get(entry); + + result = dg(entry); + if( result ) + break; + } + + if( entry !is null ) + delete entry; + + return result; + } + +private: + InputStream source; + IConduit.Seek seeker; + + enum State { Init, Open, Done } + State state; + size_t current_index = 0; + FileHeader[] headers; + + // These should be killed when the reader is closed. + ubyte[] cd_data; + FileConduit file_source = null; + MappedBuffer mm_source = null; + + /* + * This function will read the contents of the central directory. Split + * or spanned archives aren't supported. + */ + void read_cd() + in + { + assert( state == State.Init ); + assert( headers is null ); + assert( cd_data is null ); + } + out + { + assert( state == State.Open ); + assert( headers !is null ); + assert( cd_data !is null ); + assert( current_index == 0 ); + } + body + { + //Stderr.formatln("ZipReader.read_cd()"); + + // First, we need to locate the end of cd record, so that we know + // where the cd itself is, and how big it is. + auto eocdr = read_eocd_record; + + // Now, make sure the archive is all in one file. + if( eocdr.data.disk_number != + eocdr.data.disk_with_start_of_central_directory + || eocdr.data.central_directory_entries_on_this_disk != + eocdr.data.central_directory_entries_total ) + ZipNotSupportedException.spanned; + + // Ok, read the whole damn thing in one go. + cd_data = new ubyte[eocdr.data.size_of_central_directory]; + long cd_offset = eocdr.data.offset_of_start_of_cd_from_starting_disk; + seeker.seek(cd_offset, IConduit.Seek.Anchor.Begin); + readExact(source, cd_data); + + // Cake. Now, we need to break it up into records. + headers = new FileHeader[ + eocdr.data.central_directory_entries_total]; + + long cdr_offset = cd_offset; + + // Ok, map the CD data into file headers. + foreach( i,ref header ; headers ) + { + //Stderr.formatln(" . reading header {}...", i); + + // Check signature + { + uint sig = (cast(uint[])(cd_data[0..4]))[0]; + version( BigEndian ) swap(sig); + if( sig != FileHeader.signature ) + ZipException.badsig("file header"); + } + + auto used = header.map(cd_data[4..$]); + cd_data = cd_data[4+used..$]; + + // Update offset for next record + cdr_offset += 4 /* for sig. */ + used; + } + + // Done! + state = State.Open; + } + + /* + * This will locate the end of CD record in the open stream. + * + * This code sucks, but that's because Zip sucks. + * + * Basically, the EOCD record is stuffed somewhere at the end of the file. + * In a brilliant move, the record is *variably sized*, which means we + * have to do a linear backwards search to find it. + * + * The header itself (including the signature) is at minimum 22 bytes + * long, plus anywhere between 0 and 2^16-1 bytes of comment. That means + * we need to read the last 2^16-1 + 22 bytes from the file, and look for + * the signature [0x50,0x4b,0x05,0x06] in [0 .. $-18]. + * + * If we find the EOCD record, we'll return its contents. If we couldn't + * find it, we'll throw an exception. + */ + EndOfCDRecord read_eocd_record() + in + { + assert( state == State.Init ); + } + body + { + //Stderr.formatln("read_eocd_record()"); + + // Signature + record + max. comment length + const max_chunk_len = 4 + EndOfCDRecord.Data.sizeof + ushort.max; + + auto file_len = seeker.seek(0, IConduit.Seek.Anchor.End); + + // We're going to need min(max_chunk_len, file_len) bytes. + long chunk_len = max_chunk_len; + if( file_len < max_chunk_len ) + chunk_len = file_len; + //Stderr.formatln(" . chunk_len = {}", chunk_len); + + // Seek back and read in the chunk. Don't forget to clean up after + // ourselves. + seeker.seek(-chunk_len, IConduit.Seek.Anchor.End); + auto chunk_offset = seeker.seek(0, IConduit.Seek.Anchor.Current); + //Stderr.formatln(" . chunk_offset = {}", chunk_offset); + auto chunk = new ubyte[chunk_len]; + scope(exit) delete chunk; + readExact(source, chunk); + + // Now look for our magic number. Don't forget that on big-endian + // machines, we need to byteswap the value we're looking for. + version( BigEndian ) + uint eocd_magic = swap(EndOfCDRecord.signature); + else + uint eocd_magic = EndOfCDRecord.signature; + + size_t eocd_loc = -1; + + for( size_t i=chunk_len-18; i>=0; --i ) + { + if( *(cast(uint*)(chunk.ptr+i)) == eocd_magic ) + { + // Found the bugger! Make sure we skip the signature (forgot + // to do that originally; talk about weird errors :P) + eocd_loc = i+4; + break; + } + } + + // If we didn't find it, then we'll assume that this is not a valid + // archive. + if( eocd_loc == -1 ) + ZipException.missingdir; + + // Ok, so we found it; now what? Now we need to read the record + // itself in. eocd_loc is the offset within the chunk where the eocd + // record was found, so slice it out. + EndOfCDRecord eocdr; + eocdr.fill(chunk[eocd_loc..$]); + + // Excellent. We're done here. + return eocdr; + } + + /* + * Opens the specified file for reading. If the raw argument passed is + * true, then the file is *not* decompressed. + */ + InputStream open_file(FileHeader header, bool raw) + { + // Check to make sure that we actually *can* open this file. + if( header.data.extract_version > MAX_EXTRACT_VERSION ) + ZipNotSupportedException.zipver(header.data.extract_version); + + if( header.data.general_flags & UNSUPPORTED_FLAGS ) + ZipNotSupportedException.flags; + + if( toMethod(header.data.compression_method) == Method.Unsupported ) + ZipNotSupportedException.method(header.data.compression_method); + + // Open a raw stream + InputStream stream = open_file_raw(header); + + // If that's all they wanted, pass it back. + if( raw ) + return stream; + + // Next up, wrap in an appropriate decompression stream + switch( toMethod(header.data.compression_method) ) + { + case Method.Store: + // Do nothing: \o/ + break; + + case Method.Deflate: + // Wrap in a zlib stream. -15 means to use a 32KB window, and + // not to look for the normal zlib header and trailer. + stream = new ZlibInput(stream, -15); + break; + + default: + assert(false); + } + + // We done, yo! + return stream; + } + + /* + * Opens a file's raw input stream. Basically, this returns a slice of + * the archive's input stream. + */ + InputStream open_file_raw(FileHeader header) + { + // Seek to and parse the local file header + seeker.seek(header.data.relative_offset_of_local_header, + IConduit.Seek.Anchor.Begin); + + { + uint sig; + readExact(source, (&sig)[0..1]); + version( BigEndian ) swap(sig); + if( sig != LocalFileHeader.signature ) + ZipException.badsig("local file header"); + } + + LocalFileHeader lheader; lheader.fill(source); + + if( !lheader.agrees_with(header) ) + ZipException.incons(header.file_name); + + // Ok; get a slice stream for the file + return new SliceSeekInputStream( + source, seeker.seek(0, IConduit.Seek.Anchor.Current), + header.data.compressed_size); + } +} + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +// +// ZipBlockWriter + +/** + * The ZipBlockWriter class is used to create a Zip archive. It uses a + * writing iterator interface. + * + * Note that this class can only be used with output streams which can be + * freely seeked. + */ + +class ZipBlockWriter : ZipWriter +{ + /** + * Creates a ZipBlockWriter using the specified file on the local + * filesystem. + */ + this(char[] path) + { + this(FilePath(path)); + } + + /// ditto + this(PathView path) + { + file_output = new FileConduit(path, FileConduit.WriteCreate); + this(file_output); + } + + /** + * Creates a ZipBlockWriter using the provided OutputStream. Please note + * that this OutputStream must also implement the IConduit.Seek interface. + */ + this(OutputStream output) + in + { + assert( output !is null ); + assert( (cast(IConduit.Seek) output) !is null ); + } + body + { + this.output = output; + this.seeker = cast(IConduit.Seek) output; + + // Default to Deflate compression + method = Method.Deflate; + } + + /** + * Finalises the archive, writes out the central directory, and closes the + * output stream. + */ + void finish() + { + put_cd; + output.close(); + output = null; + seeker = null; + + if( file_output !is null ) delete file_output; + } + + /** + * Adds a file from the local filesystem to the archive. + */ + void putFile(ZipEntryInfo info, char[] path) + { + putFile(info, FilePath(path)); + } + + /// ditto + void putFile(ZipEntryInfo info, PathView path) + { + scope file = new FileConduit(path); + scope(exit) file.close(); + putStream(info, file); + } + + /** + * Adds a file using the contents of the given InputStream to the archive. + */ + void putStream(ZipEntryInfo info, InputStream source) + { + put_compressed(info, source); + } + + /** + * Transfers a file from another archive into this archive. Note that + * this method will not perform any compression: whatever compression was + * applied to the file originally will be preserved. + */ + void putEntry(ZipEntryInfo info, ZipEntry entry) + { + put_raw(info, entry); + } + + /** + * Adds a file using the contents of the given array to the archive. + */ + void putData(ZipEntryInfo info, void[] data) + { + //scope mc = new MemoryConduit(data); + scope mc = new Buffer(data); + scope(exit) mc.close; + put_compressed(info, mc); + } + + /** + * This property allows you to control what compression method should be + * used for files being added to the archive. + */ + Method method() { return _method; } + Method method(Method v) { return _method = v; } /// ditto + +private: + OutputStream output; + IConduit.Seek seeker; + FileConduit file_output; + + Method _method; + + struct Entry + { + FileHeaderData data; + long header_position; + char[] filename; + char[] comment; + ubyte[] extra; + } + Entry[] entries; + + void put_cd() + { + // check that there aren't too many CD entries + if( entries.length > ushort.max ) + ZipException.toomanyentries; + + auto cd_pos = seeker.seek(0, IConduit.Seek.Anchor.Current); + if( cd_pos > uint.max ) + ZipException.toolong; + + foreach( entry ; entries ) + { + FileHeader header; + header.data = &entry.data; + header.file_name = entry.filename; + header.extra_field = entry.extra; + header.file_comment = entry.comment; + + write(output, FileHeader.signature); + header.put(output); + } + + auto cd_len = seeker.seek(0, IConduit.Seek.Anchor.Current) - cd_pos; + + if( cd_len > uint.max ) + ZipException.cdtoolong; + + { + EndOfCDRecord eocdr; + eocdr.data.central_directory_entries_on_this_disk = + entries.length; + eocdr.data.central_directory_entries_total = entries.length; + eocdr.data.size_of_central_directory = cd_len; + eocdr.data.offset_of_start_of_cd_from_starting_disk = cd_pos; + + write(output, EndOfCDRecord.signature); + eocdr.put(output); + } + } + + void put_raw(ZipEntryInfo info, ZipEntry entry) + { + // Write out local file header + LocalFileHeader.Data lhdata; + auto chdata = entry.header.data; + lhdata.extract_version = chdata.extract_version; + lhdata.general_flags = chdata.general_flags; + lhdata.compression_method = chdata.compression_method; + lhdata.crc_32 = chdata.crc_32; + lhdata.compressed_size = chdata.compressed_size; + lhdata.uncompressed_size = chdata.uncompressed_size; + + timeToDos(info.modified, lhdata.modification_file_time, + lhdata.modification_file_date); + + put_local_header(lhdata, info.name); + + // Store comment + entries[$-1].comment = info.comment; + + // Output file contents + { + auto input = entry.open_raw; + scope(exit) input.close; + output.copy(input).flush(); + } + } + + void put_compressed(ZipEntryInfo info, InputStream source) + { + debug(Zip) Stderr.formatln("ZipBlockWriter.put_compressed()"); + + // Write out partial local file header + auto header_pos = seeker.seek(0, IConduit.Seek.Anchor.Current); + debug(Zip) Stderr.formatln(" . header for {} at {}", info.name, header_pos); + put_local_header(info, _method); + + // Store comment + entries[$-1].comment = info.comment; + + uint crc; + uint compressed_size; + uint uncompressed_size; + + // Output file contents + { + // Input/output chains + InputStream in_chain = source; + OutputStream out_chain = new WrapSeekOutputStream(output); + + // Count number of bytes coming in from the source file + scope in_counter = new CounterInput(in_chain); + in_chain = in_counter; + scope(success) uncompressed_size = in_counter.count; + + // Count the number of bytes going out to the archive + scope out_counter = new CounterOutput(out_chain); + out_chain = out_counter; + scope(success) compressed_size = out_counter.count; + + // Add crc + scope crc_d = new Crc32(/*CRC_MAGIC*/); + scope crc_s = new DigestInput(in_chain, crc_d); + in_chain = crc_s; + scope(success) + { + debug(Zip) Stderr.formatln(" . Success: storing CRC."); + crc = crc_d.crc32Digest; + } + + // Add compression + ZlibOutput compress; + scope(exit) if( compress !is null ) delete compress; + + switch( _method ) + { + case Method.Store: + break; + + case Method.Deflate: + compress = new ZlibOutput(out_chain, + ZlibOutput.Level.init, -15); + out_chain = compress; + break; + } + + // All done. + scope(exit) in_chain.close(); + scope(success) in_chain.clear(); + scope(exit) out_chain.close(); + + out_chain.copy(in_chain).flush; + + debug(Zip) if( compress !is null ) + { + Stderr.formatln(" . compressed to {} bytes", compress.written); + } + + debug(Zip) Stderr.formatln(" . wrote {} bytes", out_counter.count); + debug(Zip) Stderr.formatln(" . contents written"); + } + + debug(Zip) Stderr.formatln(" . CRC for \"{}\": 0x{:x8}", info.name, crc); + + // Rewind, and patch the header + auto final_pos = seeker.seek(0, IConduit.Seek.Anchor.Current); + seeker.seek(header_pos); + patch_local_header(crc, compressed_size, uncompressed_size); + + // Seek back to the end of the file, and we're done! + seeker.seek(final_pos); + } + + /* + * Patches the local file header starting at the current output location + * with updated crc and size information. Also updates the current last + * Entry. + */ + void patch_local_header(uint crc_32, uint compressed_size, + uint uncompressed_size) + { + /* BUG: For some reason, this code won't compile. No idea why... if + * you instantiate LFHD, it says that there is no "offsetof" property. + */ + /+ + alias LocalFileHeaderData LFHD; + static assert( LFHD.compressed_size.offsetof + == LFHD.crc_32.offsetof + 4 ); + static assert( LFHD.uncompressed_size.offsetof + == LFHD.compressed_size.offsetof + 4 ); + +/ + + // Don't forget we have to seek past the signature, too + // BUG: .offsetof is broken here + /+seeker.seek(LFHD.crc_32.offsetof+4, IConduit.Seek.Anchor.Current);+/ + seeker.seek(10+4, IConduit.Seek.Anchor.Current); + write(output, crc_32); + write(output, compressed_size); + write(output, uncompressed_size); + + with( entries[$-1] ) + { + data.crc_32 = crc_32; + data.compressed_size = compressed_size; + data.uncompressed_size = uncompressed_size; + } + } + + /* + * Generates and outputs a local file header from the given info block and + * compression method. Note that the crc_32, compressed_size and + * uncompressed_size header fields will be set to zero, and must be + * patched. + */ + void put_local_header(ZipEntryInfo info, Method method) + { + LocalFileHeader.Data data; + + data.compression_method = fromMethod(method); + timeToDos(info.modified, data.modification_file_time, + data.modification_file_date); + + put_local_header(data, info.name); + } + + /* + * Writes the given local file header data and filename out to the output + * stream. It also appends a new Entry with the data and filename. + */ + void put_local_header(LocalFileHeaderData data, + char[] file_name) + { + // Compute Zip version + if( data.extract_version == data.extract_version.max ) + { + ushort zipver = 10; + void minver(ushort v) { zipver = v>zipver ? v : zipver; } + + { + // Compression method + switch( data.compression_method ) + { + case 0: minver(10); break; + case 8: minver(20); break; + } + + // File is a folder + if( file_name.length > 0 && file_name[$-1] == '/' + || file_name[$-1] == '\\' ) + // Is a directory, not a real file + minver(20); + } + data.extract_version = zipver; + } + + /+// Encode filename + auto file_name_437 = utf8_to_cp437(file_name); + if( file_name_437 is null ) + ZipException.fnencode;+/ + + /+// Set up file name length + if( file_name_437.length > ushort.max ) + ZipException.fntoolong; + + data.file_name_length = file_name_437.length;+/ + + LocalFileHeader header; + header.data = data; + header.file_name = file_name; + + // Write out the header and the filename + auto header_pos = seeker.seek(0, IConduit.Seek.Anchor.Current); + + write(output, LocalFileHeader.signature); + header.put(output); + + // Save the header + Entry entry; + entry.data.fromLocal(header.data); + entry.filename = file_name; + entry.header_position = header_pos; + entry.data.relative_offset_of_local_header = header_pos; + entries ~= entry; + } +} + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +// +// ZipEntry + +/** + * This class is used to represent a single entry in an archive. + * Specifically, it combines meta-data about the file (see the info field) + * along with the two basic operations on an entry: open and verify. + */ +class ZipEntry +{ + /** + * Header information on the file. See the ZipEntryInfo structure for + * more information. + */ + ZipEntryInfo info; + + /** + * Size (in bytes) of the file's uncompressed contents. + */ + uint size() + { + return header.data.uncompressed_size;; + } + + /** + * Opens a stream for reading from the file. The contents of this stream + * represent the decompressed contents of the file stored in the archive. + * + * You should not assume that the returned stream is seekable. + * + * Note that the returned stream may be safely closed without affecting + * the underlying archive stream. + * + * If the file has not yet been verified, then the stream will be checked + * as you read from it. When the stream is either exhausted or closed, + * then the integrity of the file's data will be checked. This means that + * if the file is corrupt, an exception will be thrown only after you have + * finished reading from the stream. If you wish to make sure the data is + * valid before you read from the file, call the verify method. + */ + InputStream open() + { + // If we haven't verified yet, wrap the stream in the appropriate + // decorators. + if( !verified ) + return new ZipEntryVerifier(this, open_dg(header, false)); + + else + return open_dg(header, false); + } + + /** + * Verifies the contents of this file by computing the CRC32 checksum, + * and comparing it against the stored one. Throws an exception if the + * checksums do not match. + * + * Not valid on streamed Zip archives. + */ + void verify() + { + // If we haven't verified the contents yet, just read everything in + // to trigger it. + scope s = open; + auto buffer = new ubyte[s.conduit.bufferSize]; + while( s.read(buffer) != s.Eof ) + {/*Do nothing*/} + s.close; + } + + /** + * Creates a new, independent copy of this instance. + */ + ZipEntry dup() + { + return new ZipEntry(header, open_dg); + } + +private: + /* + * Callback used to open the file. + */ + alias InputStream delegate(FileHeader, bool raw) open_dg_t; + open_dg_t open_dg; + + /* + * Raw ZIP header. + */ + FileHeader header; + + /* + * The flag used to keep track of whether the file's contents have been + * verified. + */ + bool verified = false; + + /* + * Opens a stream that does not perform any decompression or + * transformation of the file contents. This is used internally by + * ZipWriter to perform fast zip to zip transfers without having to + * decompress and then recompress the contents. + * + * Note that because zip stores CRCs for the *uncompressed* data, this + * method currently does not do any verification. + */ + InputStream open_raw() + { + return open_dg(header, true); + } + + /* + * Creates a new ZipEntry from the FileHeader. + */ + this(FileHeader header, open_dg_t open_dg) + { + this.reset(header, open_dg); + } + + /* + * Resets the current instance with new values. + */ + ZipEntry reset(FileHeader header, open_dg_t open_dg) + { + this.header = header; + this.open_dg = open_dg; + with( info ) + { + name = header.file_name.dup; + dosToTime(header.data.modification_file_time, + header.data.modification_file_date, + modified); + comment = header.file_comment.dup; + } + + this.verified = false; + + return this; + } +} + +/** + * This structure contains various pieces of meta-data on a file. The + * contents of this structure may be safely mutated. + * + * This structure is also used to specify meta-data about a file when adding + * it to an archive. + */ +struct ZipEntryInfo +{ + /// Full path and file name of this file. + char[] name; + /// Modification timestamp. If this is left uninitialised when passed to + /// a ZipWriter, it will be reset to the current system time. + Time modified = Time.min; + /// Comment on the file. + char[] comment; +} + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +// +// Exceptions +// + +import tango.core.Exception : TracedException; + +/** + * This is the base class from which all exceptions generated by this module + * derive from. + */ +class ZipException : TracedException +{ + this(char[] msg) { super(msg); } + +private: + alias typeof(this) thisT; + static void opCall(char[] msg) { throw new ZipException(msg); } + + static void badsig() + { + thisT("corrupt signature or unexpected section found"); + } + + static void badsig(char[] type) + { + thisT("corrupt "~type~" signature or unexpected section found"); + } + + static void incons(char[] name) + { + thisT("inconsistent headers for file \""~name~"\"; " + "archive is likely corrupted"); + } + + static void missingdir() + { + thisT("could not locate central archive directory; " + "file is corrupt or possibly not a Zip archive"); + } + + static void toomanyentries() + { + thisT("too many archive entries"); + } + + static void toolong() + { + thisT("archive is too long; limited to 4GB total"); + } + + static void cdtoolong() + { + thisT("central directory is too long; limited to 4GB total"); + } + + static void fntoolong() + { + thisT("file name too long; limited to 65,535 characters"); + } + + static void eftoolong() + { + thisT("extra field too long; limited to 65,535 characters"); + } + + static void cotoolong() + { + thisT("extra field too long; limited to 65,535 characters"); + } + + static void fnencode() + { + thisT("could not encode filename into codepage 437"); + } + + static void coencode() + { + thisT("could not encode comment into codepage 437"); + } + + static void tooold() + { + thisT("cannot represent dates before January 1, 1980"); + } +} + +/** + * This exception is thrown if a ZipReader detects that a file's contents do + * not match the stored checksum. + */ +class ZipChecksumException : ZipException +{ + this(char[] name) + { + super("checksum failed on zip entry \""~name~"\""); + } + +private: + static void opCall(char[] name) { throw new ZipChecksumException(name); } +} + +/** + * This exception is thrown if you call get reader method when there are no + * more files in the archive. + */ +class ZipExhaustedException : ZipException +{ + this() { super("no more entries in archive"); } + +private: + static void opCall() { throw new ZipExhaustedException; } +} + +/** + * This exception is thrown if you attempt to read an archive that uses + * features not supported by the reader. + */ +class ZipNotSupportedException : ZipException +{ + this(char[] msg) { super(msg); } + +private: + alias ZipNotSupportedException thisT; + + static void opCall(char[] msg) + { + throw new thisT(msg ~ " not supported"); + } + + static void spanned() + { + thisT("split and multi-disk archives"); + } + + static void zipver(ushort ver) + { + throw new thisT("zip format version " + ~Integer.toString(ver / 10) + ~"." + ~Integer.toString(ver % 10) + ~" not supported; maximum of version " + ~Integer.toString(MAX_EXTRACT_VERSION / 10) + ~"." + ~Integer.toString(MAX_EXTRACT_VERSION % 10) + ~" supported."); + } + + static void flags() + { + throw new thisT("unknown or unsupported file flags enabled"); + } + + static void method(ushort m) + { + // Cheat here and work out what the method *actually* is + char[] ms; + switch( m ) + { + case 0: + case 8: assert(false); // supported + + case 1: ms = "Shrink"; break; + case 2: ms = "Reduce (factor 1)"; break; + case 3: ms = "Reduce (factor 2)"; break; + case 4: ms = "Reduce (factor 3)"; break; + case 5: ms = "Reduce (factor 4)"; break; + case 6: ms = "Implode"; break; + + case 9: ms = "Deflate64"; break; + case 10: ms = "TERSE (old)"; break; + + case 12: ms = "Bzip2"; break; + case 14: ms = "LZMA"; break; + + case 18: ms = "TERSE (new)"; break; + case 19: ms = "LZ77"; break; + + case 97: ms = "WavPack"; break; + case 98: ms = "PPMd"; break; + + default: ms = "unknown"; + } + + thisT(ms ~ " compression method"); + } +} + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +// +// Convenience methods + +void createArchive(char[] archive, Method method, char[][] files...) +{ + scope zw = new ZipBlockWriter(archive); + zw.method = method; + + foreach( file ; files ) + zw.putFile(ZipEntryInfo(file), file); + + zw.finish; +} + +void createArchive(PathView archive, Method method, PathView[] files...) +{ + scope zw = new ZipBlockWriter(archive); + zw.method = method; + + foreach( file ; files ) + zw.putFile(ZipEntryInfo(file.toString), file); + + zw.finish; +} + +void extractArchive(char[] archive, char[] folder) +{ + extractArchive(FilePath(archive), FilePath(folder)); +} + +void extractArchive(PathView archive, PathView dest) +{ + scope folder = FilePath(dest.toString); + scope zr = new ZipBlockReader(archive); + + foreach( entry ; zr ) + { + // Skip directories + if( entry.info.name[$-1] == '/' ) continue; + + auto path = folder.dup.append(entry.info.name); + scope fout = new FileConduit(path, FileConduit.WriteCreate); + fout.output.copy(entry.open); + } +} + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +// +// Private implementation stuff +// + +private: + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +// +// Verification stuff + +/* + * This class wraps an input stream, and computes the CRC as it passes + * through. On the event of either a close or EOF, it checks the CRC against + * the one in the provided ZipEntry. If they don't match, it throws an + * exception. + */ + +class ZipEntryVerifier : InputStream +{ + this(ZipEntry entry, InputStream source) + in + { + assert( entry !is null ); + assert( source !is null ); + } + body + { + this.entry = entry; + this.digest = new Crc32; + this.source = new DigestInput(source, digest); + } + + IConduit conduit() + { + return source.conduit; + } + + void close() + { + check; + + this.source.close; + this.entry = null; + this.digest = null; + this.source = null; + } + + uint read(void[] dst) + { + auto bytes = source.read(dst); + if( bytes == IConduit.Eof ) + check; + return bytes; + } + + InputStream clear() + { + this.source.clear; + return this; + } + +private: + Crc32 digest; + InputStream source; + ZipEntry entry; + + void check() + { + if( digest is null ) return; + + auto crc = digest.crc32Digest; + delete digest; + + if( crc != entry.header.data.crc_32 ) + ZipChecksumException(entry.info.name); + + else + entry.verified = true; + } +} + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +// +// IO functions + +/* + * Really, seriously, read some bytes without having to go through a sodding + * buffer. + */ +void readExact(InputStream s, void[] dst) +{ + //Stderr.formatln("readExact(s, [0..{}])", dst.length); + while( dst.length > 0 ) + { + auto octets = s.read(dst); + //Stderr.formatln(" . octets = {}", octets); + if( octets == -1 ) // Beware the dangers of MAGICAL THINKING + throw new Exception("unexpected end of stream"); + dst = dst[octets..$]; + } +} + +/* + * Really, seriously, write some bytes. + */ +void writeExact(OutputStream s, void[] src) +{ + while( src.length > 0 ) + { + auto octets = s.write(src); + if( octets == -1 ) + throw new Exception("unexpected end of stream"); + src = src[octets..$]; + } +} + +void write(T)(OutputStream s, T value) +{ + version( BigEndian ) swap(value); + writeExact(s, (&value)[0..1]); +} + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +// +// Endian garbage + +void swapAll(T)(inout T data) +{ + static if( is(typeof(T.record_fields)) ) + const fields = T.record_fields; + else + const fields = data.tupleof.length; + + foreach( i,_ ; data.tupleof ) + { + if( i == fields ) break; + swap(data.tupleof[i]); + } +} + +void swap(T)(inout T data) +{ + static if( T.sizeof == 1 ) + {} + else static if( T.sizeof == 2 ) + ByteSwap.swap16(&data, 2); + else static if( T.sizeof == 4 ) + ByteSwap.swap32(&data, 4); + else static if( T.sizeof == 8 ) + ByteSwap.swap64(&data, 8); + else static if( T.sizeof == 10 ) + ByteSwap.swap80(&data, 10); + else + static assert(false, "Can't swap "~T.stringof~"s."); +} + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +// +// IBM Code Page 437 stuff +// + +const char[][] cp437_to_utf8_map_low = [ + "\u0000"[], "\u263a", "\u263b", "\u2665", + "\u2666", "\u2663", "\u2660", "\u2022", + "\u25d8", "\u25cb", "\u25d9", "\u2642", + "\u2640", "\u266a", "\u266b", "\u263c", + + "\u25b6", "\u25c0", "\u2195", "\u203c", + "\u00b6", "\u00a7", "\u25ac", "\u21a8", + "\u2191", "\u2193", "\u2192", "\u2190", + "\u221f", "\u2194", "\u25b2", "\u25bc" +]; + +const char[][] cp437_to_utf8_map_high = [ + "\u00c7"[], "\u00fc", "\u00e9", "\u00e2", + "\u00e4", "\u00e0", "\u00e5", "\u00e7", + "\u00ea", "\u00eb", "\u00e8", "\u00ef", + "\u00ee", "\u00ec", "\u00c4", "\u00c5", + + "\u00c9", "\u00e6", "\u00c6", "\u00f4", + "\u00f6", "\u00f2", "\u00fb", "\u00f9", + "\u00ff", "\u00d6", "\u00dc", "\u00f8", + "\u00a3", "\u00a5", "\u20a7", "\u0192", + + "\u00e1", "\u00ed", "\u00f3", "\u00fa", + "\u00f1", "\u00d1", "\u00aa", "\u00ba", + "\u00bf", "\u2310", "\u00ac", "\u00bd", + "\u00bc", "\u00a1", "\u00ab", "\u00bb", + + "\u2591", "\u2592", "\u2593", "\u2502", + "\u2524", "\u2561", "\u2562", "\u2556", + "\u2555", "\u2563", "\u2551", "\u2557", + "\u255d", "\u255c", "\u255b", "\u2510", + + "\u2514", "\u2534", "\u252c", "\u251c", + "\u2500", "\u253c", "\u255e", "\u255f", + "\u255a", "\u2554", "\u2569", "\u2566", + "\u2560", "\u2550", "\u256c", "\u2567", + + "\u2568", "\u2564", "\u2565", "\u2559", + "\u2558", "\u2552", "\u2553", "\u256b", + "\u256a", "\u2518", "\u250c", "\u2588", + "\u2584", "\u258c", "\u2590", "\u2580", + "\u03b1", "\u00df", "\u0393", "\u03c0", + "\u03a3", "\u03c3", "\u00b5", "\u03c4", + "\u03a6", "\u0398", "\u03a9", "\u03b4", + "\u221e", "\u03c6", "\u03b5", "\u2229", + + "\u2261", "\u00b1", "\u2265", "\u2264", + "\u2320", "\u2321", "\u00f7", "\u2248", + "\u00b0", "\u2219", "\u00b7", "\u221a", + "\u207f", "\u00b2", "\u25a0", "\u00a0" +]; + +char[] cp437_to_utf8(ubyte[] s) +{ + foreach( i,c ; s ) + { + if( (1 <= c && c <= 31) || c >= 127 ) + { + /* Damn; we got a character not in ASCII. Since this is the first + * non-ASCII character we found, copy everything up to this point + * into the output verbatim. We'll allocate twice as much space + * as there are remaining characters to ensure we don't need to do + * any further allocations. + */ + auto r = new char[i+2*(s.length-i)]; + r[0..i] = cast(char[]) s[0..i]; + size_t k=i; // current length + + // We insert new characters at r[i+j+k] + + foreach( d ; s[i..$] ) + { + if( 32 <= d && d <= 126 || d == 0 ) + { + r[k++] = d; + } + else if( 1 <= d && d <= 31 ) + { + char[] repl = cp437_to_utf8_map_low[d]; + r[k..k+repl.length] = repl[]; + k += repl.length; + } + else if( d == 127 ) + { + char[] repl = "\u2302"; + r[k..k+repl.length] = repl[]; + k += repl.length; + } + else if( d > 127 ) + { + char[] repl = cp437_to_utf8_map_high[d-128]; + r[k..k+repl.length] = repl[]; + k += repl.length; + } + else + assert(false); + } + + return r[0..k]; + } + } + + /* If we got here, then all the characters in s are also in ASCII, which + * means it's also valid UTF-8; return the string unmodified. + */ + return cast(char[]) s; +} + +debug( UnitTest ) +{ + unittest + { + char[] c(char[] s) { return cp437_to_utf8(cast(ubyte[]) s); } + + auto s = c("Hi there \x01 old \x0c!"); + assert( s == "Hi there \u263a old \u2640!", "\""~s~"\"" ); + s = c("Marker \x7f and divide \xf6."); + assert( s == "Marker \u2302 and divide \u00f7.", "\""~s~"\"" ); + } +} + +const char[dchar] utf8_to_cp437_map; + +static this() +{ + utf8_to_cp437_map = [ + '\u0000': '\x00', '\u263a': '\x01', '\u263b': '\x02', '\u2665': '\x03', + '\u2666': '\x04', '\u2663': '\x05', '\u2660': '\x06', '\u2022': '\x07', + '\u25d8': '\x08', '\u25cb': '\x09', '\u25d9': '\x0a', '\u2642': '\x0b', + '\u2640': '\x0c', '\u266a': '\x0d', '\u266b': '\x0e', '\u263c': '\x0f', + + '\u25b6': '\x10', '\u25c0': '\x11', '\u2195': '\x12', '\u203c': '\x13', + '\u00b6': '\x14', '\u00a7': '\x15', '\u25ac': '\x16', '\u21a8': '\x17', + '\u2191': '\x18', '\u2193': '\x19', '\u2192': '\x1a', '\u2190': '\x1b', + '\u221f': '\x1c', '\u2194': '\x1d', '\u25b2': '\x1e', '\u25bc': '\x1f', + + /* + * Printable ASCII range (well, most of it) is handled specially. + */ + + '\u00c7': '\x80', '\u00fc': '\x81', '\u00e9': '\x82', '\u00e2': '\x83', + '\u00e4': '\x84', '\u00e0': '\x85', '\u00e5': '\x86', '\u00e7': '\x87', + '\u00ea': '\x88', '\u00eb': '\x89', '\u00e8': '\x8a', '\u00ef': '\x8b', + '\u00ee': '\x8c', '\u00ec': '\x8d', '\u00c4': '\x8e', '\u00c5': '\x8f', + + '\u00c9': '\x90', '\u00e6': '\x91', '\u00c6': '\x92', '\u00f4': '\x93', + '\u00f6': '\x94', '\u00f2': '\x95', '\u00fb': '\x96', '\u00f9': '\x97', + '\u00ff': '\x98', '\u00d6': '\x99', '\u00dc': '\x9a', '\u00f8': '\x9b', + '\u00a3': '\x9c', '\u00a5': '\x9d', '\u20a7': '\x9e', '\u0192': '\x9f', + + '\u00e1': '\xa0', '\u00ed': '\xa1', '\u00f3': '\xa2', '\u00fa': '\xa3', + '\u00f1': '\xa4', '\u00d1': '\xa5', '\u00aa': '\xa6', '\u00ba': '\xa7', + '\u00bf': '\xa8', '\u2310': '\xa9', '\u00ac': '\xaa', '\u00bd': '\xab', + '\u00bc': '\xac', '\u00a1': '\xad', '\u00ab': '\xae', '\u00bb': '\xaf', + + '\u2591': '\xb0', '\u2592': '\xb1', '\u2593': '\xb2', '\u2502': '\xb3', + '\u2524': '\xb4', '\u2561': '\xb5', '\u2562': '\xb6', '\u2556': '\xb7', + '\u2555': '\xb8', '\u2563': '\xb9', '\u2551': '\xba', '\u2557': '\xbb', + '\u255d': '\xbc', '\u255c': '\xbd', '\u255b': '\xbe', '\u2510': '\xbf', + + '\u2514': '\xc0', '\u2534': '\xc1', '\u252c': '\xc2', '\u251c': '\xc3', + '\u2500': '\xc4', '\u253c': '\xc5', '\u255e': '\xc6', '\u255f': '\xc7', + '\u255a': '\xc8', '\u2554': '\xc9', '\u2569': '\xca', '\u2566': '\xcb', + '\u2560': '\xcc', '\u2550': '\xcd', '\u256c': '\xce', '\u2567': '\xcf', + + '\u2568': '\xd0', '\u2564': '\xd1', '\u2565': '\xd2', '\u2559': '\xd3', + '\u2558': '\xd4', '\u2552': '\xd5', '\u2553': '\xd6', '\u256b': '\xd7', + '\u256a': '\xd8', '\u2518': '\xd9', '\u250c': '\xda', '\u2588': '\xdb', + '\u2584': '\xdc', '\u258c': '\xdd', '\u2590': '\xde', '\u2580': '\xdf', + + '\u03b1': '\xe0', '\u00df': '\xe1', '\u0393': '\xe2', '\u03c0': '\xe3', + '\u03a3': '\xe4', '\u03c3': '\xe5', '\u00b5': '\xe6', '\u03c4': '\xe7', + '\u03a6': '\xe8', '\u0398': '\xe9', '\u03a9': '\xea', '\u03b4': '\xeb', + '\u221e': '\xec', '\u03c6': '\xed', '\u03b5': '\xee', '\u2229': '\xef', + + '\u2261': '\xf0', '\u00b1': '\xf1', '\u2265': '\xf2', '\u2264': '\xf3', + '\u2320': '\xf4', '\u2321': '\xf5', '\u00f7': '\xf6', '\u2248': '\xf7', + '\u00b0': '\xf8', '\u2219': '\xf9', '\u00b7': '\xfa', '\u221a': '\xfb', + '\u207f': '\xfc', '\u00b2': '\xfd', '\u25a0': '\xfe', '\u00a0': '\xff' + ]; +} + +ubyte[] utf8_to_cp437(char[] s) +{ + foreach( i,dchar c ; s ) + { + if( !((32 <= c && c <= 126) || c == 0) ) + { + /* We got a character not in CP 437: we need to create a buffer to + * hold the new string. Since UTF-8 is *always* larger than CP + * 437, we need, at most, an array of the same number of elements. + */ + auto r = new ubyte[s.length]; + r[0..i] = cast(ubyte[]) s[0..i]; + size_t k=i; + + foreach( dchar d ; s[i..$] ) + { + if( 32 <= d && d <= 126 || d == 0 ) + r[k++] = d; + + else if( d == '\u2302' ) + r[k++] = '\x7f'; + + else if( auto e_ptr = d in utf8_to_cp437_map ) + r[k++] = *e_ptr; + + else + { + throw new Exception("cannot encode character \"" + ~ Integer.toString(cast(uint)d) + ~ "\" in codepage 437."); + } + } + + return r[0..k]; + } + } + + // If we got here, then the entire string is printable ASCII, which just + // happens to *also* be valid CP 437! Huzzah! + return cast(ubyte[]) s; +} + +debug( UnitTest ) +{ + unittest + { + alias cp437_to_utf8 x; + alias utf8_to_cp437 y; + + ubyte[256] s; + foreach( i,ref c ; s ) + c = i; + + auto a = x(s); + auto b = y(a); + if(!( b == s )) + { + // Display list of characters that failed to convert as expected, + // and what value we got. + auto hex = "0123456789abcdef"; + auto msg = "".dup; + foreach( i,ch ; b ) + { + if( ch != i ) + { + msg ~= hex[i>>4]; + msg ~= hex[i&15]; + msg ~= " ("; + msg ~= hex[ch>>4]; + msg ~= hex[ch&15]; + msg ~= "), "; + } + } + msg ~= "failed."; + + assert( false, msg ); + } + } +} + +/* + * This is here to simplify the code elsewhere. + */ +char[] utf8_to_utf8(ubyte[] s) { return cast(char[]) s; } +ubyte[] utf8_to_utf8(char[] s) { return cast(ubyte[]) s; } + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +// +// Date/time stuff + +void dosToTime(ushort dostime, ushort dosdate, out Time time) +{ + uint sec, min, hour, day, mon, year; + sec = (dostime & 0b00000_000000_11111) * 2; + min = (dostime & 0b00000_111111_00000) >> 5; + hour= (dostime & 0b11111_000000_00000) >> 11; + day = (dosdate & 0b0000000_0000_11111); + mon = (dosdate & 0b0000000_1111_00000) >> 5; + year=((dosdate & 0b1111111_0000_00000) >> 9) + 1980; + + // This code sucks. + scope cal = new Gregorian; + time = Time.epoch + + TimeSpan.days(cal.getDaysInYear(year, 0)) + + TimeSpan.days(cal.getDaysInMonth(year, mon, 0)) + + TimeSpan.days(day) + + TimeSpan.hours(hour) + + TimeSpan.minutes(min) + + TimeSpan.seconds(sec); +} + +void timeToDos(Time time, out ushort dostime, out ushort dosdate) +{ + // Treat Time.min specially + if( time == Time.min ) + time = WallClock.now; + + // *muttering angrily* + scope cal = new Gregorian; + + if( cal.getYear(time) < 1980 ) + ZipException.tooold; + + auto span = time.span; + dostime = + (span.seconds / 2) + | (span.minutes << 5) + | (span.hours << 11); + + dosdate = + (cal.getDayOfMonth(time)) + | (cal.getMonth(time) << 5) + |((cal.getYear(time) - 1980) << 9); +} + +// ************************************************************************** // +// ************************************************************************** // +// ************************************************************************** // + +// Dependencies +private: + +import tango.io.Conduit : Conduit; + +/******************************************************************************* + + copyright: Copyright © 2007 Daniel Keep. All rights reserved. + + license: BSD style: $(LICENSE) + + version: Prerelease + + author: Daniel Keep + +*******************************************************************************/ + +//module tangox.io.stream.CounterStream; + +//import tango.io.Conduit : Conduit; +//import tango.io.model.IConduit : IConduit, InputStream, OutputStream; + +/** + * The counter stream classes are used to keep track of how many bytes flow + * through a stream. + * + * To use them, simply wrap it around an existing stream. The number of bytes + * that have flowed through the wrapped stream may be accessed using the + * count member. + */ +class CounterInput : InputStream +{ + /// + this(InputStream input) + in + { + assert( input !is null ); + } + body + { + this.input = input; + } + + override IConduit conduit() + { + return input.conduit; + } + + override void close() + { + input.close(); + input = null; + } + + override uint read(void[] dst) + { + auto read = input.read(dst); + if( read != IConduit.Eof ) + _count += read; + return read; + } + + override InputStream clear() + { + input.clear(); + return this; + } + + /// + long count() { return _count; } + +private: + InputStream input; + long _count; +} + +/// ditto +class CounterOutput : OutputStream +{ + /// + this(OutputStream output) + in + { + assert( output !is null ); + } + body + { + this.output = output; + } + + override IConduit conduit() + { + return output.conduit; + } + + override void close() + { + output.close(); + output = null; + } + + override uint write(void[] dst) + { + auto wrote = output.write(dst); + if( wrote != IConduit.Eof ) + _count += wrote; + return wrote; + } + + override OutputStream copy(InputStream src) + { + return Conduit.transfer(src, this); + } + + override OutputStream flush() + { + output.flush(); + return this; + } + + /// + long count() { return _count; } + +private: + OutputStream output; + long _count; +} + +/******************************************************************************* + + copyright: Copyright © 2007 Daniel Keep. All rights reserved. + + license: BSD style: $(LICENSE) + + version: Prerelease + + author: Daniel Keep + +*******************************************************************************/ + +//module tangox.io.stream.SliceStream; + +//import tango.io.Conduit : Conduit; +//import tango.io.model.IConduit : IConduit, InputStream, OutputStream; + +/** + * This stream can be used to provide stream-based access to a subset of + * another stream. It is akin to slicing an array. + * + * This stream fully supports seeking, and as such requires that the + * underlying stream also support seeking. + */ +class SliceSeekInputStream : InputStream, IConduit.Seek +{ + alias IConduit.Seek.Anchor Anchor; + + /** + * Create a new slice stream from the given source, covering the content + * starting at position begin, for length bytes. + */ + this(InputStream source, long begin, long length) + in + { + assert( source !is null ); + assert( (cast(IConduit.Seek) source) !is null ); + assert( begin >= 0 ); + assert( length >= 0 ); + } + body + { + this.source = source; + this.seeker = cast(IConduit.Seek) source; + this.begin = begin; + this.length = length; + } + + override IConduit conduit() + { + return source.conduit; + } + + override void close() + { + source = null; + seeker = null; + } + + override uint read(void[] dst) + { + // If we're at the end of the slice, return eof + if( _position >= length ) + return IConduit.Eof; + + // Otherwise, make sure we don't try to read past the end of the slice + if( _position+dst.length > length ) + dst.length = length-_position; + + // Seek source stream to the appropriate location. + if( seeker.seek(0, Anchor.Current) != begin+_position ) + seeker.seek(begin+_position, Anchor.Begin); + + // Do the read + auto read = source.read(dst); + if( read == IConduit.Eof ) + // If we got an Eof, we'll consider that a bug for the moment. + // TODO: proper exception + throw new Exception("unexpected end-of-stream"); + + _position += read; + return read; + } + + override InputStream clear() + { + source.clear(); + return this; + } + + override long seek(long offset, Anchor anchor = cast(Anchor)0) + { + switch( anchor ) + { + case Anchor.Begin: + _position = offset; + break; + + case Anchor.Current: + _position += offset; + if( _position < 0 ) _position = 0; + break; + + case Anchor.End: + _position = length+offset; + if( _position < 0 ) _position = 0; + break; + } + + return _position; + } + +private: + InputStream source; + IConduit.Seek seeker; + + long _position, begin, length; + + invariant + { + assert( cast(Object) source is cast(Object) seeker ); + assert( begin >= 0 ); + assert( length >= 0 ); + assert( _position >= 0 ); + } +} + +/** + * This stream can be used to provide stream-based access to a subset of + * another stream. It is akin to slicing an array. + */ +class SliceInputStream : InputStream +{ + /** + * Create a new slice stream from the given source, covering the content + * starting at the current seek position for length bytes. + */ + this(InputStream source, long length) + in + { + assert( source !is null ); + assert( length >= 0 ); + } + body + { + this.source = source; + this._length = length; + } + + override IConduit conduit() + { + return source.conduit; + } + + override void close() + { + source = null; + } + + override uint read(void[] dst) + { + // If we're at the end of the slice, return eof + if( _length <= 0 ) + return IConduit.Eof; + + // Otherwise, make sure we don't try to read past the end of the slice + if( dst.length > _length ) + dst.length = _length; + + // Do the read + auto read = source.read(dst); + if( read == IConduit.Eof ) + // If we got an Eof, we'll consider that a bug for the moment. + // TODO: proper exception + throw new Exception("unexpected end-of-stream"); + + _length -= read; + return read; + } + + override InputStream clear() + { + source.clear(); + return this; + } + +private: + InputStream source; + long _length; + + invariant + { + if( _length > 0 ) assert( source !is null ); + } +} + +/** + * This stream can be used to provide stream-based access to a subset of + * another stream. It is akin to slicing an array. + * + * This stream fully supports seeking, and as such requires that the + * underlying stream also support seeking. + */ +class SliceSeekOutputStream : OutputStream, IConduit.Seek +{ + alias IConduit.Seek.Anchor Anchor; + + /** + * Create a new slice stream from the given source, covering the content + * starting at position begin, for length bytes. + */ + this(OutputStream source, long begin, long length) + in + { + assert( (cast(IConduit.Seek) source) !is null ); + assert( begin >= 0 ); + assert( length >= 0 ); + } + body + { + this.source = source; + this.seeker = cast(IConduit.Seek) source; + this.begin = begin; + this.length = length; + } + + override IConduit conduit() + { + return source.conduit; + } + + override void close() + { + source = null; + seeker = null; + } + + uint write(void[] src) + { + // If we're at the end of the slice, return eof + if( _position >= length ) + return IConduit.Eof; + + // Otherwise, make sure we don't try to write past the end of the + // slice + if( _position+src.length > length ) + src.length = length-_position; + + // Seek source stream to the appropriate location. + if( seeker.seek(0, Anchor.Current) != begin+_position ) + seeker.seek(begin+_position, Anchor.Begin); + + // Do the write + auto wrote = source.write(src); + if( wrote == IConduit.Eof ) + // If we got an Eof, we'll consider that a bug for the moment. + // TODO: proper exception + throw new Exception("unexpected end-of-stream"); + + _position += wrote; + return wrote; + } + + override OutputStream copy(InputStream src) + { + return Conduit.transfer(src, this); + } + + override OutputStream flush() + { + source.flush(); + return this; + } + + override long seek(long offset, Anchor anchor = cast(Anchor)0) + { + switch( anchor ) + { + case Anchor.Begin: + _position = offset; + break; + + case Anchor.Current: + _position += offset; + if( _position < 0 ) _position = 0; + break; + + case Anchor.End: + _position = length+offset; + if( _position < 0 ) _position = 0; + break; + } + + return _position; + } + +private: + OutputStream source; + IConduit.Seek seeker; + + long _position, begin, length; + + invariant + { + assert( cast(Object) source is cast(Object) seeker ); + assert( begin >= 0 ); + assert( length >= 0 ); + assert( _position >= 0 ); + } +} + +/******************************************************************************* + + copyright: Copyright © 2007 Daniel Keep. All rights reserved. + + license: BSD style: $(LICENSE) + + version: Prerelease + + author: Daniel Keep + +*******************************************************************************/ + +//module tangox.io.stream.WrapStream; + +//import tango.io.Conduit : Conduit; +//import tango.io.model.IConduit : IConduit, InputStream, OutputStream; + +/** + * This stream can be used to provide access to another stream. + * Its distinguishing feature is that users cannot close the underlying + * stream. + * + * This stream fully supports seeking, and as such requires that the + * underlying stream also support seeking. + */ +class WrapSeekInputStream : InputStream, IConduit.Seek +{ + alias IConduit.Seek.Anchor Anchor; + + /** + * Create a new wrap stream from the given source. + */ + this(InputStream source) + in + { + assert( source !is null ); + assert( (cast(IConduit.Seek) source) !is null ); + } + body + { + this.source = source; + this.seeker = cast(IConduit.Seek) source; + this._position = seeker.seek(0, Anchor.Current); + } + + /// ditto + this(InputStream source, long position) + in + { + assert( position >= 0 ); + } + body + { + this(source); + this._position = position; + } + + override IConduit conduit() + { + return source.conduit; + } + + override void close() + { + source = null; + seeker = null; + } + + override uint read(void[] dst) + { + if( seeker.seek(0, Anchor.Current) != _position ) + seeker.seek(_position, Anchor.Begin); + + auto read = source.read(dst); + if( read != IConduit.Eof ) + _position += read; + + return read; + } + + override InputStream clear() + { + source.clear(); + return this; + } + + override long seek(long offset, Anchor anchor = cast(Anchor)0) + { + seeker.seek(_position, Anchor.Begin); + return (_position = seeker.seek(offset, anchor)); + } + +private: + InputStream source; + IConduit.Seek seeker; + long _position; + + invariant + { + assert( cast(Object) source is cast(Object) seeker ); + assert( _position >= 0 ); + } +} + +/** + * This stream can be used to provide access to another stream. + * Its distinguishing feature is that the users cannot close the underlying + * stream. + * + * This stream fully supports seeking, and as such requires that the + * underlying stream also support seeking. + */ +class WrapSeekOutputStream : OutputStream, IConduit.Seek +{ + alias IConduit.Seek.Anchor Anchor; + + /** + * Create a new wrap stream from the given source. + */ + this(OutputStream source) + in + { + assert( (cast(IConduit.Seek) source) !is null ); + } + body + { + this.source = source; + this.seeker = cast(IConduit.Seek) source; + this._position = seeker.seek(0, Anchor.Current); + } + + /// ditto + this(OutputStream source, long position) + in + { + assert( position >= 0 ); + } + body + { + this(source); + this._position = position; + } + + override IConduit conduit() + { + return source.conduit; + } + + override void close() + { + source = null; + seeker = null; + } + + uint write(void[] src) + { + if( seeker.seek(0, Anchor.Current) != _position ) + seeker.seek(_position, Anchor.Begin); + + auto wrote = source.write(src); + if( wrote != IConduit.Eof ) + _position += wrote; + return wrote; + } + + override OutputStream copy(InputStream src) + { + return Conduit.transfer(src, this); + } + + override OutputStream flush() + { + source.flush(); + return this; + } + + override long seek(long offset, Anchor anchor = cast(Anchor)0) + { + seeker.seek(_position, Anchor.Begin); + return (_position = seeker.seek(offset, anchor)); + } + +private: + OutputStream source; + IConduit.Seek seeker; + long _position; + + invariant + { + assert( cast(Object) source is cast(Object) seeker ); + assert( _position >= 0 ); + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/compress/BzipStream.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/compress/BzipStream.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,520 @@ +/******************************************************************************* + + copyright: Copyright (C) 2007 Daniel Keep. All rights reserved. + + license: BSD style: $(LICENSE) + + version: Initial release: July 2007 + + author: Daniel Keep + +*******************************************************************************/ + +module tango.io.compress.BzipStream; + +private import tango.io.compress.c.bzlib; + +private import tango.core.Exception : IOException; + +private import tango.io.Conduit : InputFilter, OutputFilter; + +private import tango.io.model.IConduit : InputStream, OutputStream, IConduit; + +private +{ + /* This constant controls the size of the input/output buffers we use + * internally. There's no particular reason to pick this size. It might + * be an idea to run some benchmarks to work out what a good number is. + */ + const BUFFER_SIZE = 4*1024; + + const DEFAULT_BLOCKSIZE = 9; + const DEFAULT_WORKFACTOR = 0; +} + +/******************************************************************************* + + This output filter can be used to perform compression of data into a bzip2 + stream. + +*******************************************************************************/ + +class BzipOutput : OutputFilter +{ + /*************************************************************************** + + This enumeration represents several pre-defined compression block + sizes, measured in hundreds of kilobytes. See the documentation for + the BzipOutput class' constructor for more details. + + ***************************************************************************/ + + enum BlockSize : int + { + Normal = 9, + Fast = 1, + Best = 9, + } + + private + { + bool bzs_valid = false; + bz_stream bzs; + ubyte[] out_chunk; + size_t _written = 0; + } + + /*************************************************************************** + + Constructs a new bzip2 compression filter. You need to pass in the + stream that the compression filter will write to. If you are using + this filter with a conduit, the idiom to use is: + + --- + auto output = new BzipOutput(myConduit.output); + output.write(myContent); + --- + + blockSize relates to the size of the window bzip2 uses when + compressing data and determines how much memory is required to + decompress a stream. It is measured in hundreds of kilobytes. + + ccording to the bzip2 documentation, there is no dramatic difference + between the various block sizes, so the default should suffice in most + cases. + + BlockSize.Normal (the default) is the same as BlockSize.Best + (or 9). The blockSize may be any integer between 1 and 9 inclusive. + + ***************************************************************************/ + + this(OutputStream stream, int blockSize = BlockSize.Normal) + { + if( blockSize < 1 || blockSize > 9 ) + throw new BzipException("bzip2 block size must be between" + " 1 and 9"); + + super(stream); + out_chunk = new ubyte[BUFFER_SIZE]; + + auto ret = BZ2_bzCompressInit(&bzs, blockSize, 0, DEFAULT_WORKFACTOR); + if( ret != BZ_OK ) + throw new BzipException(ret); + + bzs_valid = true; + } + + ~this() + { + if( bzs_valid ) + kill_bzs(); + } + + /*************************************************************************** + + Compresses the given data to the underlying conduit. + + Returns the number of bytes from src that were compressed, which may + be less than given. + + ***************************************************************************/ + + uint write(void[] src) + { + check_valid(); + scope(failure) kill_bzs(); + + bzs.avail_in = src.length; + bzs.next_in = cast(ubyte*)src.ptr; + + do + { + bzs.avail_out = out_chunk.length; + bzs.next_out = out_chunk.ptr; + + auto ret = BZ2_bzCompress(&bzs, BZ_RUN); + if( ret != BZ_RUN_OK ) + throw new BzipException(ret); + + // Push the compressed bytes out to the stream, until it's either + // written them all, or choked. + auto have = out_chunk.length-bzs.avail_out; + auto out_buffer = out_chunk[0..have]; + do + { + auto w = host.write(out_buffer); + if( w == IConduit.Eof ) + return w; + + out_buffer = out_buffer[w..$]; + _written += w; + } + while( out_buffer.length > 0 ); + } + // Loop while we are still using up the whole output buffer + while( bzs.avail_out == 0 ); + + assert( bzs.avail_in == 0, "failed to compress all provided data" ); + + return src.length; + } + + /*************************************************************************** + + This read-only property returns the number of compressed bytes that + have been written to the underlying stream. Following a call to + either close or commit, this will contain the total compressed size of + the input data stream. + + ***************************************************************************/ + + size_t written() + { + return _written; + } + + /*************************************************************************** + + commit the output + + ***************************************************************************/ + + void close() + { + if( bzs_valid ) commit; + super.close; + } + + /*************************************************************************** + + Purge any buffered content. Calling this will implicitly end the + bzip2 stream, so it should not be called until you are finished + compressing data. Any calls to either write or commit after a + compression filter has been committed will throw an exception. + + ***************************************************************************/ + + void commit() + { + check_valid(); + scope(failure) kill_bzs(); + + bzs.avail_in = 0; + bzs.next_in = null; + + bool finished = false; + + do + { + bzs.avail_out = out_chunk.length; + bzs.next_out = out_chunk.ptr; + + auto ret = BZ2_bzCompress(&bzs, BZ_FINISH); + switch( ret ) + { + case BZ_FINISH_OK: + break; + + case BZ_STREAM_END: + finished = true; + break; + + default: + throw new BzipException(ret); + } + + auto have = out_chunk.length - bzs.avail_out; + auto out_buffer = out_chunk[0..have]; + if( have > 0 ) + { + do + { + auto w = host.write(out_buffer); + if( w == IConduit.Eof ) + return w; + + out_buffer = out_buffer[w..$]; + _written += w; + } + while( out_buffer.length > 0 ); + } + } + while( !finished ); + + kill_bzs(); + } + + // This function kills the stream: it deallocates the internal state, and + // unsets the bzs_valid flag. + private void kill_bzs() + { + check_valid(); + + BZ2_bzCompressEnd(&bzs); + bzs_valid = false; + } + + // Asserts that the stream is still valid and usable (except that this + // check doesn't get elided with -release). + private void check_valid() + { + if( !bzs_valid ) + throw new BzipClosedException; + } +} + +/******************************************************************************* + + This input filter can be used to perform decompression of bzip2 streams. + +*******************************************************************************/ + +class BzipInput : InputFilter +{ + private + { + bool bzs_valid = false; + bz_stream bzs; + ubyte[] in_chunk; + } + + /*************************************************************************** + + Constructs a new bzip2 decompression filter. You need to pass in the + stream that the decompression filter will read from. If you are using + this filter with a conduit, the idiom to use is: + + --- + auto input = new BzipInput(myConduit.input); + input.read(myContent); + --- + + The small argument, if set to true, instructs bzip2 to perform + decompression using half the regular amount of memory, at the cost of + running at half speed. + + ***************************************************************************/ + + this(InputStream stream, bool small=false) + { + super(stream); + in_chunk = new ubyte[BUFFER_SIZE]; + + auto ret = BZ2_bzDecompressInit(&bzs, 0, small?1:0); + if( ret != BZ_OK ) + throw new BzipException(ret); + + bzs_valid = true; + } + + ~this() + { + if( bzs_valid ) + kill_bzs(); + } + + /*************************************************************************** + + Decompresses data from the underlying conduit into a target array. + + Returns the number of bytes stored into dst, which may be less than + requested. + + ***************************************************************************/ + + uint read(void[] dst) + { + check_valid(); + scope(failure) kill_bzs(); + + bool finished = false; + + bzs.avail_out = dst.length; + bzs.next_out = cast(ubyte*)dst.ptr; + + do + { + if( bzs.avail_in == 0 ) + { + auto len = host.read(in_chunk); + if( len == IConduit.Eof ) + return IConduit.Eof; + + bzs.avail_in = len; + bzs.next_in = in_chunk.ptr; + } + + auto ret = BZ2_bzDecompress(&bzs); + if( ret == BZ_STREAM_END ) + { + kill_bzs(); + finished = true; + } + else if( ret != BZ_OK ) + throw new BzipException(ret); + } + while( !finished && bzs.avail_out > 0 ); + + return dst.length - bzs.avail_out; + } + + /*************************************************************************** + + Clear any buffered content. No-op. + + ***************************************************************************/ + + InputStream clear() + { + check_valid(); + + // TODO: What should this method do? We don't do any heap allocation, + // so there's really nothing to clear... For now, just invalidate the + // stream... + kill_bzs(); + super.clear(); + return this; + } + + // This function kills the stream: it deallocates the internal state, and + // unsets the bzs_valid flag. + private void kill_bzs() + { + check_valid(); + + BZ2_bzDecompressEnd(&bzs); + bzs_valid = false; + } + + // Asserts that the stream is still valid and usable (except that this + // check doesn't get elided with -release). + private void check_valid() + { + if( !bzs_valid ) + throw new BzipClosedException; + } +} + +/******************************************************************************* + + This exception is thrown when an error occurs in the underlying bzip2 + library. + +*******************************************************************************/ + +class BzipException : IOException +{ + this(in int code) + { + super(codeName(code)); + } + + this(char[] msg) + { + super(msg); + } + + private char[] codeName(in int code) + { + char[] name; + + switch( code ) + { + case BZ_OK: name = "BZ_OK"; break; + case BZ_RUN_OK: name = "BZ_RUN_OK"; break; + case BZ_FLUSH_OK: name = "BZ_FLUSH_OK"; break; + case BZ_STREAM_END: name = "BZ_STREAM_END"; break; + case BZ_SEQUENCE_ERROR: name = "BZ_SEQUENCE_ERROR"; break; + case BZ_PARAM_ERROR: name = "BZ_PARAM_ERROR"; break; + case BZ_MEM_ERROR: name = "BZ_MEM_ERROR"; break; + case BZ_DATA_ERROR: name = "BZ_DATA_ERROR"; break; + case BZ_DATA_ERROR_MAGIC: name = "BZ_DATA_ERROR_MAGIC"; break; + case BZ_IO_ERROR: name = "BZ_IO_ERROR"; break; + case BZ_UNEXPECTED_EOF: name = "BZ_UNEXPECTED_EOF"; break; + case BZ_OUTBUFF_FULL: name = "BZ_OUTBUFF_FULL"; break; + case BZ_CONFIG_ERROR: name = "BZ_CONFIG_ERROR"; break; + default: name = "BZ_UNKNOWN"; + } + + return name; + } +} + +/******************************************************************************* + + This exception is thrown if you attempt to perform a read, write or flush + operation on a closed bzip2 filter stream. This can occur if the input + stream has finished, or an output stream was flushed. + +*******************************************************************************/ + +class BzipClosedException : IOException +{ + this() + { + super("cannot operate on closed bzip2 stream"); + } +} + +/* ***************************************************************************** + + This section contains a simple unit test for this module. It is hidden + behind a version statement because it introduces additional dependencies. + +***************************************************************************** */ + +debug(UnitTest): + +import tango.io.GrowBuffer : GrowBuffer; + +unittest +{ + const char[] message = + "All dwarfs are by nature dutiful, serious, literate, obedient " + "and thoughtful people whose only minor failing is a tendency, " + "after one drink, to rush at enemies screaming \"Arrrrrrgh!\" and " + "axing their legs off at the knee."; + + const ubyte[] message_z = [ + 0x42, 0x5a, 0x68, 0x39, 0x31, 0x41, 0x59, 0x26, + 0x53, 0x59, 0x40, 0x98, 0xbe, 0xaa, 0x00, 0x00, + 0x16, 0xd5, 0x80, 0x10, 0x00, 0x70, 0x05, 0x20, + 0x00, 0x3f, 0xef, 0xde, 0xe0, 0x30, 0x00, 0xac, + 0xd8, 0x8a, 0x3d, 0x34, 0x6a, 0x6d, 0x4c, 0x4f, + 0x24, 0x31, 0x0d, 0x08, 0x98, 0x9b, 0x48, 0x9a, + 0x7a, 0x80, 0x00, 0x06, 0xa6, 0xd2, 0xa7, 0xe9, + 0xaa, 0x37, 0xa8, 0xd4, 0xf5, 0x3f, 0x54, 0x63, + 0x51, 0xe9, 0x2d, 0x4b, 0x99, 0xe1, 0xcc, 0xca, + 0xda, 0x75, 0x04, 0x42, 0x14, 0xc8, 0x6a, 0x8e, + 0x23, 0xc1, 0x3e, 0xb1, 0x8a, 0x16, 0xd2, 0x55, + 0x9a, 0x3e, 0x56, 0x1a, 0xb1, 0x83, 0x11, 0xa6, + 0x50, 0x4f, 0xd3, 0xed, 0x21, 0x40, 0xaa, 0xd1, + 0x95, 0x2c, 0xda, 0xcb, 0xb7, 0x0e, 0xce, 0x65, + 0xfc, 0x63, 0xf2, 0x88, 0x5b, 0x36, 0xda, 0xf0, + 0xf5, 0xd2, 0x9c, 0xe6, 0xf1, 0x87, 0x12, 0x87, + 0xce, 0x56, 0x0c, 0xf5, 0x65, 0x4d, 0x2e, 0xd6, + 0x27, 0x61, 0x2b, 0x74, 0xcd, 0x5e, 0x3b, 0x02, + 0x42, 0x4e, 0x0b, 0x80, 0xa8, 0x70, 0x04, 0x48, + 0xfb, 0x93, 0x4c, 0x41, 0xa8, 0x2a, 0xdf, 0xf2, + 0x67, 0x37, 0x28, 0xad, 0x38, 0xd4, 0x5c, 0xd6, + 0x34, 0x8b, 0x49, 0x5e, 0x90, 0xb2, 0x06, 0xce, + 0x0a, 0x83, 0x29, 0x84, 0x20, 0xd7, 0x5f, 0xc5, + 0xdc, 0x91, 0x4e, 0x14, 0x24, 0x10, 0x26, 0x2f, + 0xaa, 0x80]; + + scope cond = new GrowBuffer; + scope comp = new BzipOutput(cond); + comp.write(message); + comp.close; + + assert( comp.written == message_z.length ); + + assert( message_z == cast(ubyte[])(cond.slice) ); + + scope decomp = new BzipInput(cond); + auto buffer = new ubyte[256]; + buffer = buffer[0 .. decomp.read(buffer)]; + + assert( cast(ubyte[])message == buffer ); +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/compress/ZlibStream.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/compress/ZlibStream.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,594 @@ +/******************************************************************************* + + copyright: Copyright (C) 2007 Daniel Keep. All rights reserved. + + license: BSD style: $(LICENSE) + + version: Initial release: July 2007 + + author: Daniel Keep + + history: Added support for "window bits", needed for Zip support. + +*******************************************************************************/ + +module tango.io.compress.ZlibStream; + +private import tango.io.compress.c.zlib; + +private import tango.stdc.stringz : fromUtf8z; + +private import tango.core.Exception : IOException; + +private import tango.io.Conduit : InputFilter, OutputFilter; + +private import tango.io.model.IConduit : InputStream, OutputStream, IConduit; + + +/* This constant controls the size of the input/output buffers we use + * internally. This should be a fairly sane value (it's suggested by the zlib + * documentation), that should only need changing for memory-constrained + * platforms/use cases. + * + * An alternative would be to make the chunk size a template parameter to the + * filters themselves, but Tango already has more than enough template + * parameters getting in the way :) + */ + +private const CHUNKSIZE = 256 * 1024; + +/******************************************************************************* + + This input filter can be used to perform decompression of zlib streams. + +*******************************************************************************/ + +class ZlibInput : InputFilter +{ + private + { + /* Used to make sure we don't try to perform operations on a dead + * stream. */ + bool zs_valid = false; + + z_stream zs; + ubyte[] in_chunk; + } + + /*************************************************************************** + + Constructs a new zlib decompression filter. You need to pass in the + stream that the decompression filter will read from. If you are using + this filter with a conduit, the idiom to use is: + + --- + auto input = new ZlibInput(myConduit.input)); + input.read(myContent); + --- + + The optional windowBits parameter is the base two logarithm of the + window size, and should be in the range 8-15, defaulting to 15 if not + specified. Additionally, the windowBits parameter may be negative to + indicate that zlib should omit the standard zlib header and trailer, + with the window size being -windowBits. + + ***************************************************************************/ + + this(InputStream stream) + { + super (stream); + in_chunk = new ubyte[CHUNKSIZE]; + + // Allocate inflate state + with( zs ) + { + zalloc = null; + zfree = null; + opaque = null; + avail_in = 0; + next_in = null; + } + + auto ret = inflateInit(&zs); + if( ret != Z_OK ) + throw new ZlibException(ret); + + zs_valid = true; + } + + /// ditto + this(InputStream stream, int windowBits) + { + super (stream); + in_chunk = new ubyte[CHUNKSIZE]; + + // Allocate inflate state + with( zs ) + { + zalloc = null; + zfree = null; + opaque = null; + avail_in = 0; + next_in = null; + } + + auto ret = inflateInit2(&zs, windowBits); + if( ret != Z_OK ) + throw new ZlibException(ret); + + zs_valid = true; + } + + ~this() + { + if( zs_valid ) + kill_zs(); + } + + /*************************************************************************** + + Decompresses data from the underlying conduit into a target array. + + Returns the number of bytes stored into dst, which may be less than + requested. + + ***************************************************************************/ + + override uint read(void[] dst) + { + if( !zs_valid ) + return IConduit.Eof; + + // Check to see if we've run out of input data. If we have, get some + // more. + if( zs.avail_in == 0 ) + { + auto len = host.read(in_chunk); + if( len == IConduit.Eof ) + return IConduit.Eof; + + zs.avail_in = len; + zs.next_in = in_chunk.ptr; + } + + // We'll tell zlib to inflate straight into the target array. + zs.avail_out = dst.length; + zs.next_out = cast(ubyte*)dst.ptr; + auto ret = inflate(&zs, Z_NO_FLUSH); + + switch( ret ) + { + case Z_NEED_DICT: + // Whilst not technically an error, this should never happen + // for general-use code, so treat it as an error. + case Z_DATA_ERROR: + case Z_MEM_ERROR: + kill_zs(); + throw new ZlibException(ret); + + case Z_STREAM_END: + // zlib stream is finished; kill the stream so we don't try to + // read from it again. + kill_zs(); + break; + + default: + } + + return dst.length - zs.avail_out; + } + + /*************************************************************************** + + Clear any buffered content. No-op. + + ***************************************************************************/ + + override InputStream clear() + { + check_valid(); + + // TODO: What should this method do? We don't do any heap allocation, + // so there's really nothing to clear... For now, just invalidate the + // stream... + kill_zs(); + + super.clear(); + return this; + } + + // This function kills the stream: it deallocates the internal state, and + // unsets the zs_valid flag. + private void kill_zs() + { + check_valid(); + + inflateEnd(&zs); + zs_valid = false; + } + + // Asserts that the stream is still valid and usable (except that this + // check doesn't get elided with -release). + private void check_valid() + { + if( !zs_valid ) + throw new ZlibClosedException; + } +} + +/******************************************************************************* + + This output filter can be used to perform compression of data into a zlib + stream. + +*******************************************************************************/ + +class ZlibOutput : OutputFilter +{ + /*************************************************************************** + + This enumeration represents several pre-defined compression levels. + + None instructs zlib to perform no compression whatsoever, and simply + store the data stream. Note that this actually expands the stream + slightly to accommodate the zlib stream metadata. + + Fast instructs zlib to perform a minimal amount of compression, Best + indicates that you want the maximum level of compression and Normal + (the default level) is a compromise between the two. The exact + compression level Normal represents is determined by the underlying + zlib library, but is typically level 6. + + Any integer between -1 and 9 inclusive may be used as a level, + although the symbols in this enumeration should suffice for most + use-cases. + + ***************************************************************************/ + + enum Level : int + { + Normal = -1, + None = 0, + Fast = 1, + Best = 9 + } + + private + { + bool zs_valid = false; + z_stream zs; + ubyte[] out_chunk; + size_t _written = 0; + } + + /*************************************************************************** + + Constructs a new zlib compression filter. You need to pass in the + stream that the compression filter will write to. If you are using + this filter with a conduit, the idiom to use is: + + --- + auto output = new ZlibOutput(myConduit.output); + output.write(myContent); + --- + + The optional windowBits parameter is the base two logarithm of the + window size, and should be in the range 8-15, defaulting to 15 if not + specified. Additionally, the windowBits parameter may be negative to + indicate that zlib should omit the standard zlib header and trailer, + with the window size being -windowBits. + + ***************************************************************************/ + + this(OutputStream stream, Level level = Level.Normal) + { + super(stream); + out_chunk = new ubyte[CHUNKSIZE]; + + // Allocate deflate state + with( zs ) + { + zalloc = null; + zfree = null; + opaque = null; + } + + auto ret = deflateInit(&zs, level); + if( ret != Z_OK ) + throw new ZlibException(ret); + + zs_valid = true; + } + + /// ditto + this(OutputStream stream, Level level, int windowBits) + { + super(stream); + out_chunk = new ubyte[CHUNKSIZE]; + + // Allocate deflate state + with( zs ) + { + zalloc = null; + zfree = null; + opaque = null; + } + + auto ret = deflateInit2(&zs, level, Z_DEFLATED, windowBits, 8, + Z_DEFAULT_STRATEGY); + if( ret != Z_OK ) + throw new ZlibException(ret); + + zs_valid = true; + } + + ~this() + { + if( zs_valid ) + kill_zs(); + } + + /*************************************************************************** + + Compresses the given data to the underlying conduit. + + Returns the number of bytes from src that were compressed; write + should always consume all data provided to it, although it may not be + immediately written to the underlying output stream. + + ***************************************************************************/ + + override uint write(void[] src) + { + check_valid(); + scope(failure) kill_zs(); + + zs.avail_in = src.length; + zs.next_in = cast(ubyte*)src.ptr; + + do + { + zs.avail_out = out_chunk.length; + zs.next_out = out_chunk.ptr; + + auto ret = deflate(&zs, Z_NO_FLUSH); + if( ret == Z_STREAM_ERROR ) + throw new ZlibException(ret); + + // Push the compressed bytes out to the stream, until it's either + // written them all, or choked. + auto have = out_chunk.length-zs.avail_out; + auto out_buffer = out_chunk[0..have]; + do + { + auto w = host.write(out_buffer); + if( w == IConduit.Eof ) + return w; + + out_buffer = out_buffer[w..$]; + _written += w; + } + while( out_buffer.length > 0 ); + } + // Loop while we are still using up the whole output buffer + while( zs.avail_out == 0 ); + + assert( zs.avail_in == 0, "failed to compress all provided data" ); + + return src.length; + } + + /*************************************************************************** + + This read-only property returns the number of compressed bytes that + have been written to the underlying stream. Following a call to + either close or commit, this will contain the total compressed size of + the input data stream. + + ***************************************************************************/ + + size_t written() + { + return _written; + } + + /*************************************************************************** + + commit the output + + ***************************************************************************/ + + override void close() + { + // Only commit if the stream is still open. + if( zs_valid ) commit; + + super.close; + } + + /*************************************************************************** + + Purge any buffered content. Calling this will implicitly end the zlib + stream, so it should not be called until you are finished compressing + data. Any calls to either write or commit after a compression filter + has been committed will throw an exception. + + ***************************************************************************/ + + void commit() + { + check_valid(); + scope(failure) kill_zs(); + + zs.avail_in = 0; + zs.next_in = null; + + bool finished = false; + + do + { + zs.avail_out = out_chunk.length; + zs.next_out = out_chunk.ptr; + + auto ret = deflate(&zs, Z_FINISH); + switch( ret ) + { + case Z_OK: + // Keep going + break; + + case Z_STREAM_END: + // We're done! + finished = true; + break; + + default: + throw new ZlibException(ret); + } + + auto have = out_chunk.length - zs.avail_out; + auto out_buffer = out_chunk[0..have]; + if( have > 0 ) + { + do + { + auto w = host.write(out_buffer); + if( w == IConduit.Eof ) + return w; + + out_buffer = out_buffer[w..$]; + _written += w; + } + while( out_buffer.length > 0 ); + } + } + while( !finished ); + + kill_zs(); + } + + // This function kills the stream: it deallocates the internal state, and + // unsets the zs_valid flag. + private void kill_zs() + { + check_valid(); + + deflateEnd(&zs); + zs_valid = false; + } + + // Asserts that the stream is still valid and usable (except that this + // check doesn't get elided with -release). + private void check_valid() + { + if( !zs_valid ) + throw new ZlibClosedException; + } +} + +/******************************************************************************* + + This exception is thrown if you attempt to perform a read, write or flush + operation on a closed zlib filter stream. This can occur if the input + stream has finished, or an output stream was flushed. + +*******************************************************************************/ + +class ZlibClosedException : IOException +{ + this() + { + super("cannot operate on closed zlib stream"); + } +} + +/******************************************************************************* + + This exception is thrown when an error occurs in the underlying zlib + library. Where possible, it will indicate both the name of the error, and + any textural message zlib has provided. + +*******************************************************************************/ + +class ZlibException : IOException +{ + this(int code) + { + super(codeName(code)); + } + + this(int code, char* msg) + { + super(codeName(code)~": "~fromUtf8z(msg)); + } + + protected char[] codeName(int code) + { + char[] name; + + switch( code ) + { + case Z_OK: name = "Z_OK"; break; + case Z_STREAM_END: name = "Z_STREAM_END"; break; + case Z_NEED_DICT: name = "Z_NEED_DICT"; break; + case Z_ERRNO: name = "Z_ERRNO"; break; + case Z_STREAM_ERROR: name = "Z_STREAM_ERROR"; break; + case Z_DATA_ERROR: name = "Z_DATA_ERROR"; break; + case Z_MEM_ERROR: name = "Z_MEM_ERROR"; break; + case Z_BUF_ERROR: name = "Z_BUF_ERROR"; break; + case Z_VERSION_ERROR: name = "Z_VERSION_ERROR"; break; + default: name = "Z_UNKNOWN"; + } + + return name; + } +} + +/* ***************************************************************************** + + This section contains a simple unit test for this module. It is hidden + behind a version statement because it introduces additional dependencies. + +***************************************************************************** */ + +debug(UnitTest) { + +import tango.io.GrowBuffer : GrowBuffer; + +unittest +{ + // One ring to rule them all, one ring to find them, + // One ring to bring them all and in the darkness bind them. + const char[] message = + "Ash nazg durbatulûk, ash nazg gimbatul, " + "ash nazg thrakatulûk, agh burzum-ishi krimpatul."; + + // This compressed data was created using Python 2.5's built in zlib + // module, with the default compression level. + const ubyte[] message_z = [ + 0x78,0x9c,0x73,0x2c,0xce,0x50,0xc8,0x4b, + 0xac,0x4a,0x57,0x48,0x29,0x2d,0x4a,0x4a, + 0x2c,0x29,0xcd,0x39,0xbc,0x3b,0x5b,0x47, + 0x21,0x11,0x26,0x9a,0x9e,0x99,0x0b,0x16, + 0x45,0x12,0x2a,0xc9,0x28,0x4a,0xcc,0x46, + 0xa8,0x4c,0xcf,0x50,0x48,0x2a,0x2d,0xaa, + 0x2a,0xcd,0xd5,0xcd,0x2c,0xce,0xc8,0x54, + 0xc8,0x2e,0xca,0xcc,0x2d,0x00,0xc9,0xea, + 0x01,0x00,0x1f,0xe3,0x22,0x99]; + + scope cond_z = new GrowBuffer; + scope comp = new ZlibOutput(cond_z); + comp.write (message); + comp.close; + + assert( comp.written == message_z.length ); + + assert( message_z == cast(ubyte[])(cond_z.slice) ); + + scope decomp = new ZlibInput(cond_z); + auto buffer = new ubyte[256]; + buffer = buffer[0 .. decomp.read(buffer)]; + + assert( cast(ubyte[])message == buffer ); +} +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/compress/c/bzlib.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/compress/c/bzlib.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,269 @@ +/* Converted to D from bzlib.h by htod */ + +module tango.io.compress.c.bzlib; + +/*-------------------------------------------------------------*/ +/*--- Public header file for the library. ---*/ +/*--- bzlib.h ---*/ +/*-------------------------------------------------------------*/ + +/* ------------------------------------------------------------------ + This file is part of bzip2/libbzip2, a program and library for + lossless, block-sorting data compression. + + bzip2/libbzip2 version 1.0.4 of 20 December 2006 + Copyright (C) 1996-2006 Julian Seward + + Please read the WARNING, DISCLAIMER and PATENTS sections in the + README file. + + This program is released under the terms of the license contained + in the file LICENSE. + ------------------------------------------------------------------ */ + +extern(C): + +const BZ_RUN = 0; +const BZ_FLUSH = 1; +const BZ_FINISH = 2; + +const BZ_OK = 0; +const BZ_RUN_OK = 1; +const BZ_FLUSH_OK = 2; +const BZ_FINISH_OK = 3; +const BZ_STREAM_END = 4; +const BZ_SEQUENCE_ERROR = -1; +const BZ_PARAM_ERROR = -2; +const BZ_MEM_ERROR = -3; +const BZ_DATA_ERROR = -4; +const BZ_DATA_ERROR_MAGIC = -5; +const BZ_IO_ERROR = -6; +const BZ_UNEXPECTED_EOF = -7; +const BZ_OUTBUFF_FULL = -8; +const BZ_CONFIG_ERROR = -9; + +struct bz_stream +{ + ubyte *next_in; + uint avail_in; + uint total_in_lo32; + uint total_in_hi32; + ubyte *next_out; + uint avail_out; + uint total_out_lo32; + uint total_out_hi32; + void *state; + void * function(void *, int , int )bzalloc; + void function(void *, void *)bzfree; + void *opaque; +} + +import tango.stdc.stdio : FILE; + +/*-- Core (low-level) library functions --*/ + +//C BZ_EXTERN int BZ_API(BZ2_bzCompressInit) ( +//C bz_stream* strm, +//C int blockSize100k, +//C int verbosity, +//C int workFactor +//C ); +extern (Windows): +int BZ2_bzCompressInit(bz_stream *strm, int blockSize100k, int verbosity, int workFactor); + +//C BZ_EXTERN int BZ_API(BZ2_bzCompress) ( +//C bz_stream* strm, +//C int action +//C ); +int BZ2_bzCompress(bz_stream *strm, int action); + +//C BZ_EXTERN int BZ_API(BZ2_bzCompressEnd) ( +//C bz_stream* strm +//C ); +int BZ2_bzCompressEnd(bz_stream *strm); + +//C BZ_EXTERN int BZ_API(BZ2_bzDecompressInit) ( +//C bz_stream *strm, +//C int verbosity, +//C int small +//C ); +int BZ2_bzDecompressInit(bz_stream *strm, int verbosity, int small); + +//C BZ_EXTERN int BZ_API(BZ2_bzDecompress) ( +//C bz_stream* strm +//C ); +int BZ2_bzDecompress(bz_stream *strm); + +//C BZ_EXTERN int BZ_API(BZ2_bzDecompressEnd) ( +//C bz_stream *strm +//C ); +int BZ2_bzDecompressEnd(bz_stream *strm); + + + +/*-- High(er) level library functions --*/ + +version(BZ_NO_STDIO){}else{ + +const BZ_MAX_UNUSED = 5000; +alias void BZFILE; + +//C BZ_EXTERN BZFILE* BZ_API(BZ2_bzReadOpen) ( +//C int* bzerror, +//C FILE* f, +//C int verbosity, +//C int small, +//C void* unused, +//C int nUnused +//C ); +extern (Windows): +BZFILE * BZ2_bzReadOpen(int *bzerror, FILE *f, int verbosity, int small, void *unused, int nUnused); + +//C BZ_EXTERN void BZ_API(BZ2_bzReadClose) ( +//C int* bzerror, +//C BZFILE* b +//C ); +void BZ2_bzReadClose(int *bzerror, BZFILE *b); + +//C BZ_EXTERN void BZ_API(BZ2_bzReadGetUnused) ( +//C int* bzerror, +//C BZFILE* b, +//C void** unused, +//C int* nUnused +//C ); +void BZ2_bzReadGetUnused(int *bzerror, BZFILE *b, void **unused, int *nUnused); + +//C BZ_EXTERN int BZ_API(BZ2_bzRead) ( +//C int* bzerror, +//C BZFILE* b, +//C void* buf, +//C int len +//C ); +int BZ2_bzRead(int *bzerror, BZFILE *b, void *buf, int len); + +//C BZ_EXTERN BZFILE* BZ_API(BZ2_bzWriteOpen) ( +//C int* bzerror, +//C FILE* f, +//C int blockSize100k, +//C int verbosity, +//C int workFactor +//C ); +BZFILE * BZ2_bzWriteOpen(int *bzerror, FILE *f, int blockSize100k, int verbosity, int workFactor); + +//C BZ_EXTERN void BZ_API(BZ2_bzWrite) ( +//C int* bzerror, +//C BZFILE* b, +//C void* buf, +//C int len +//C ); +void BZ2_bzWrite(int *bzerror, BZFILE *b, void *buf, int len); + +//C BZ_EXTERN void BZ_API(BZ2_bzWriteClose) ( +//C int* bzerror, +//C BZFILE* b, +//C int abandon, +//C unsigned int* nbytes_in, +//C unsigned int* nbytes_out +//C ); +void BZ2_bzWriteClose(int *bzerror, BZFILE *b, int abandon, uint *nbytes_in, uint *nbytes_out); + +//C BZ_EXTERN void BZ_API(BZ2_bzWriteClose64) ( +//C int* bzerror, +//C BZFILE* b, +//C int abandon, +//C unsigned int* nbytes_in_lo32, +//C unsigned int* nbytes_in_hi32, +//C unsigned int* nbytes_out_lo32, +//C unsigned int* nbytes_out_hi32 +//C ); +void BZ2_bzWriteClose64(int *bzerror, BZFILE *b, int abandon, uint *nbytes_in_lo32, uint *nbytes_in_hi32, uint *nbytes_out_lo32, uint *nbytes_out_hi32); + +} + +/*-- Utility functions --*/ + +//C BZ_EXTERN int BZ_API(BZ2_bzBuffToBuffCompress) ( +//C char* dest, +//C unsigned int* destLen, +//C char* source, +//C unsigned int sourceLen, +//C int blockSize100k, +//C int verbosity, +//C int workFactor +//C ); +int BZ2_bzBuffToBuffCompress(char *dest, uint *destLen, char *source, uint sourceLen, int blockSize100k, int verbosity, int workFactor); + +//C BZ_EXTERN int BZ_API(BZ2_bzBuffToBuffDecompress) ( +//C char* dest, +//C unsigned int* destLen, +//C char* source, +//C unsigned int sourceLen, +//C int small, +//C int verbosity +//C ); +int BZ2_bzBuffToBuffDecompress(char *dest, uint *destLen, char *source, uint sourceLen, int small, int verbosity); + + +/*-- + Code contributed by Yoshioka Tsuneo (tsuneo@rr.iij4u.or.jp) + to support better zlib compatibility. + This code is not _officially_ part of libbzip2 (yet); + I haven't tested it, documented it, or considered the + threading-safeness of it. + If this code breaks, please contact both Yoshioka and me. +--*/ + +//C BZ_EXTERN const char * BZ_API(BZ2_bzlibVersion) ( +//C void +//C ); +char * BZ2_bzlibVersion(); + +version(BZ_NO_STDIO){}else{ + +//C BZ_EXTERN BZFILE * BZ_API(BZ2_bzopen) ( +//C const char *path, +//C const char *mode +//C ); +BZFILE * BZ2_bzopen(char *path, char *mode); + +//C BZ_EXTERN BZFILE * BZ_API(BZ2_bzdopen) ( +//C int fd, +//C const char *mode +//C ); +BZFILE * BZ2_bzdopen(int fd, char *mode); + +//C BZ_EXTERN int BZ_API(BZ2_bzread) ( +//C BZFILE* b, +//C void* buf, +//C int len +//C ); +int BZ2_bzread(BZFILE *b, void *buf, int len); + +//C BZ_EXTERN int BZ_API(BZ2_bzwrite) ( +//C BZFILE* b, +//C void* buf, +//C int len +//C ); +int BZ2_bzwrite(BZFILE *b, void *buf, int len); + +//C BZ_EXTERN int BZ_API(BZ2_bzflush) ( +//C BZFILE* b +//C ); +int BZ2_bzflush(BZFILE *b); + +//C BZ_EXTERN void BZ_API(BZ2_bzclose) ( +//C BZFILE* b +//C ); +void BZ2_bzclose(BZFILE *b); + +//C BZ_EXTERN const char * BZ_API(BZ2_bzerror) ( +//C BZFILE *b, +//C int *errnum +//C ); +char * BZ2_bzerror(BZFILE *b, int *errnum); + +} + +/*-------------------------------------------------------------*/ +/*--- end bzlib.h ---*/ +/*-------------------------------------------------------------*/ diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/compress/c/zlib.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/compress/c/zlib.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,1446 @@ +/* zlib.h -- interface of the 'zlib' general purpose compression library + version 1.2.3, July 18th, 2005 + + Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt + (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). +*/ + +module tango.io.compress.c.zlib; + +extern (C): + +const char* ZLIB_VERSION = "1.2.3"; +const uint ZLIB_VERNUM = 0x1230; + +/* + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed + data. This version of the library supports only one compression method + (deflation) but other algorithms will be added later and will have the same + stream interface. + + Compression can be done in a single step if the buffers are large + enough (for example if an input file is mmap'ed), or can be done by + repeated calls of the compression function. In the latter case, the + application must provide more input and/or consume the output + (providing more output space) before each call. + + The compressed data format used by default by the in-memory functions is + the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped + around a deflate stream, which is itself documented in RFC 1951. + + The library also supports reading and writing files in gzip (.gz) format + with an interface similar to that of stdio using the functions that start + with "gz". The gzip format is different from the zlib format. gzip is a + gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. + + This library can optionally read and write gzip streams in memory as well. + + The zlib format was designed to be compact and fast for use in memory + and on communications channels. The gzip format was designed for single- + file compression on file systems, has a larger header than zlib to maintain + directory information, and uses a different, slower check method than zlib. + + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never + crash even in case of corrupted input. +*/ + +private +{ + import tango.stdc.config : c_long, c_ulong; + + version( Posix ) + { + import tango.stdc.posix.sys.types : z_off_t = off_t; + } + else + { + alias c_long z_off_t; + } + + alias ubyte Byte; + alias uint uInt; + alias c_ulong uLong; + + alias Byte Bytef; + alias char charf; + alias int intf; + alias uInt uIntf; + alias uLong uLongf; + + alias void* voidpc; // TODO: normally const + alias void* voidpf; + alias void* voidp; + + alias voidpf function(voidpf opaque, uInt items, uInt size) alloc_func; + alias void function(voidpf opaque, voidpf address) free_func; + + struct internal_state {} +} + +struct z_stream +{ + Bytef* next_in; /* next input byte */ + uInt avail_in; /* number of bytes available at next_in */ + uLong total_in; /* total nb of input bytes read so far */ + + Bytef* next_out; /* next output byte should be put there */ + uInt avail_out; /* remaining free space at next_out */ + uLong total_out; /* total nb of bytes output so far */ + + char* msg; /* last error message, NULL if no error */ + internal_state* state; /* not visible by applications */ + + alloc_func zalloc; /* used to allocate the internal state */ + free_func zfree; /* used to free the internal state */ + voidpf opaque; /* private data object passed to zalloc and zfree */ + + int data_type; /* best guess about the data type: binary or text */ + uLong adler; /* adler32 value of the uncompressed data */ + uLong reserved; /* reserved for future use */ +} + +alias z_stream* z_streamp; + +/* + gzip header information passed to and from zlib routines. See RFC 1952 + for more details on the meanings of these fields. +*/ +struct gz_header +{ + int text; /* true if compressed data believed to be text */ + uLong time; /* modification time */ + int xflags; /* extra flags (not used when writing a gzip file) */ + int os; /* operating system */ + Bytef* extra; /* pointer to extra field or Z_NULL if none */ + uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ + uInt extra_max; /* space at extra (only when reading header) */ + Bytef* name; /* pointer to zero-terminated file name or Z_NULL */ + uInt name_max; /* space at name (only when reading header) */ + Bytef* comment; /* pointer to zero-terminated comment or Z_NULL */ + uInt comm_max; /* space at comment (only when reading header) */ + int hcrc; /* true if there was or will be a header crc */ + int done; /* true when done reading gzip header (not used + when writing a gzip file) */ +} + +alias gz_header* gz_headerp; + +/* + The application must update next_in and avail_in when avail_in has + dropped to zero. It must update next_out and avail_out when avail_out + has dropped to zero. The application must initialize zalloc, zfree and + opaque before calling the init function. All other fields are set by the + compression library and must not be updated by the application. + + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the + opaque value. + + zalloc must return Z_NULL if there is not enough memory for the object. + If zlib is used in a multi-threaded application, zalloc and zfree must be + thread safe. + + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this + if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, + pointers returned by zalloc for objects of exactly 65536 bytes *must* + have their offset normalized to zero. The default allocation function + provided by this library ensures this (see zutil.c). To reduce memory + requirements and avoid any allocation of 64K objects, at the expense of + compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). + + The fields total_in and total_out can be used for statistics or + progress reports. After compression, total_in holds the total size of + the uncompressed data and may be saved for use in the decompressor + (particularly if the decompressor wants to decompress everything in + a single step). +*/ + + /* constants */ + +enum +{ + Z_NO_FLUSH = 0, + Z_PARTIAL_FLUSH = 1, /* will be removed, use Z_SYNC_FLUSH instead */ + Z_SYNC_FLUSH = 2, + Z_FULL_FLUSH = 3, + Z_FINISH = 4, + Z_BLOCK = 5, +} +/* Allowed flush values; see deflate() and inflate() below for details */ + +enum +{ + Z_OK = 0, + Z_STREAM_END = 1, + Z_NEED_DICT = 2, + Z_ERRNO = -1, + Z_STREAM_ERROR = -2, + Z_DATA_ERROR = -3, + Z_MEM_ERROR = -4, + Z_BUF_ERROR = -5, + Z_VERSION_ERROR = -6, +} +/* Return codes for the compression/decompression functions. Negative + * values are errors, positive values are used for special but normal events. + */ + +enum +{ + Z_NO_COMPRESSION = 0, + Z_BEST_SPEED = 1, + Z_BEST_COMPRESSION = 9, + Z_DEFAULT_COMPRESSION = -1, +} +/* compression levels */ + +enum +{ + Z_FILTERED = 1, + Z_HUFFMAN_ONLY = 2, + Z_RLE = 3, + Z_FIXED = 4, + Z_DEFAULT_STRATEGY = 0, +} +/* compression strategy; see deflateInit2() below for details */ + +enum +{ + Z_BINARY = 0, + Z_TEXT = 1, + Z_ASCII = Z_TEXT, /* for compatibility with 1.2.2 and earlier */ + Z_UNKNOWN = 2, +} +/* Possible values of the data_type field (though see inflate()) */ + +enum +{ + Z_DEFLATED = 8, +} +/* The deflate compression method (the only one supported in this version) */ + +const Z_NULL = null; /* for initializing zalloc, zfree, opaque */ + +alias zlibVersion zlib_version; +/* for compatibility with versions < 1.0.2 */ + + /* basic functions */ + +char* zlibVersion(); +/* The application can compare zlibVersion and ZLIB_VERSION for consistency. + If the first character differs, the library code actually used is + not compatible with the zlib.h header file used by the application. + This check is automatically made by deflateInit and inflateInit. + */ + +/* +int deflateInit (z_streamp strm, int level); + + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. + If zalloc and zfree are set to Z_NULL, deflateInit updates them to + use default allocation functions. + + The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: + 1 gives best speed, 9 gives best compression, 0 gives no compression at + all (the input data is simply copied a block at a time). + Z_DEFAULT_COMPRESSION requests a default compromise between speed and + compression (currently equivalent to level 6). + + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if level is not a valid compression level, + Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible + with the version assumed by the caller (ZLIB_VERSION). + msg is set to null if there is no error message. deflateInit does not + perform any compression: this will be done by deflate(). +*/ + + +int deflate(z_streamp strm, int flush); +/* + deflate compresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce some + output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. deflate performs one or both of the + following actions: + + - Compress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in and avail_in are updated and + processing will resume at this point for the next call of deflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. This action is forced if the parameter flush is non zero. + Forcing flush frequently degrades the compression ratio, so this parameter + should be set only when necessary (in interactive applications). + Some output may be provided even if flush is not set. + + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating avail_in or avail_out accordingly; avail_out + should never be zero before the call. The application can consume the + compressed output when it wants, for example when the output buffer is full + (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK + and with zero avail_out, it must be called again after making room in the + output buffer because there might be more output pending. + + Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to + decide how much data to accumualte before producing output, in order to + maximize compression. + + If the parameter flush is set to Z_SYNC_FLUSH, all pending output is + flushed to the output buffer and the output is aligned on a byte boundary, so + that the decompressor can get all input data available so far. (In particular + avail_in is zero after the call if enough output space has been provided + before the call.) Flushing may degrade compression for some compression + algorithms and so it should be used only when necessary. + + If flush is set to Z_FULL_FLUSH, all output is flushed as with + Z_SYNC_FLUSH, and the compression state is reset so that decompression can + restart from this point if previous compressed data has been damaged or if + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + compression. + + If deflate returns with avail_out == 0, this function must be called again + with the same value of the flush parameter and more output space (updated + avail_out), until the flush is complete (deflate returns with non-zero + avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that + avail_out is greater than six to avoid repeated flush markers due to + avail_out == 0 on return. + + If the parameter flush is set to Z_FINISH, pending input is processed, + pending output is flushed and deflate returns with Z_STREAM_END if there + was enough output space; if deflate returns with Z_OK, this function must be + called again with Z_FINISH and more output space (updated avail_out) but no + more input data, until it returns with Z_STREAM_END or an error. After + deflate has returned Z_STREAM_END, the only possible operations on the + stream are deflateReset or deflateEnd. + + Z_FINISH can be used immediately after deflateInit if all the compression + is to be done in a single step. In this case, avail_out must be at least + the value returned by deflateBound (see below). If deflate does not return + Z_STREAM_END, then it must be called again as described above. + + deflate() sets strm->adler to the adler32 checksum of all input read + so far (that is, total_in bytes). + + deflate() may update strm->data_type if it can make a good guess about + the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered + binary. This field is only for information purposes and does not affect + the compression algorithm in any manner. + + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible + (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not + fatal, and deflate() can be called again with more input and more output + space to continue compressing. +*/ + + +int deflateEnd(z_streamp strm); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. + + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, + msg may be set but then points to a static string (which must not be + deallocated). +*/ + + +/* +int inflateInit(z_streamp strm); + + Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. If next_in is not Z_NULL and avail_in is large enough (the exact + value depends on the compression method), inflateInit determines the + compression method from the zlib header and allocates all data structures + accordingly; otherwise the allocation will be deferred to the first call of + inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to + use default allocation functions. + + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller. msg is set to null if there is no error + message. inflateInit does not perform any decompression apart from reading + the zlib header if present: this will be done by inflate(). (So next_in and + avail_in may be modified, but next_out and avail_out are unchanged.) +*/ + + +int inflate(z_streamp strm, int flush); +/* + inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. inflate performs one or both of the + following actions: + + - Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in is updated and processing + will resume at this point for the next call of inflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. inflate() provides as much output as possible, until there + is no more input data or no more space in the output buffer (see below + about the flush parameter). + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating the next_* and avail_* values accordingly. + The application can consume the uncompressed output when it wants, for + example when the output buffer is full (avail_out == 0), or after each + call of inflate(). If inflate returns Z_OK and with zero avail_out, it + must be called again after making room in the output buffer because there + might be more output pending. + + The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, + Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much + output as possible to the output buffer. Z_BLOCK requests that inflate() stop + if and when it gets to the next deflate block boundary. When decoding the + zlib or gzip format, this will cause inflate() to return immediately after + the header and before the first block. When doing a raw inflate, inflate() + will go ahead and process the first block, and will return when it gets to + the end of that block, or when it runs out of data. + + The Z_BLOCK option assists in appending to or combining deflate streams. + Also to assist in this, on return inflate() will set strm->data_type to the + number of unused bits in the last byte taken from strm->next_in, plus 64 + if inflate() is currently decoding the last block in the deflate stream, + plus 128 if inflate() returned immediately after decoding an end-of-block + code or decoding the complete header up to just before the first byte of the + deflate stream. The end-of-block will not be indicated until all of the + uncompressed data from that block has been written to strm->next_out. The + number of unused bits may in general be greater than seven, except when + bit 7 of data_type is set, in which case the number of unused bits will be + less than eight. + + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step + (a single call of inflate), the parameter flush should be set to + Z_FINISH. In this case all pending input is processed and all pending + output is flushed; avail_out must be large enough to hold all the + uncompressed data. (The size of the uncompressed data may have been saved + by the compressor for this purpose.) The next operation on this stream must + be inflateEnd to deallocate the decompression state. The use of Z_FINISH + is never required, but can be used to inform inflate that a faster approach + may be used for the single inflate() call. + + In this implementation, inflate() always flushes as much output as + possible to the output buffer, and always uses the faster approach on the + first call. So the only effect of the flush parameter in this implementation + is on the return value of inflate(), as noted below, or when it returns early + because Z_BLOCK is used. + + If a preset dictionary is needed after this call (see inflateSetDictionary + below), inflate sets strm->adler to the adler32 checksum of the dictionary + chosen by the compressor and returns Z_NEED_DICT; otherwise it sets + strm->adler to the adler32 checksum of all output produced so far (that is, + total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described + below. At the end of the stream, inflate() checks that its computed adler32 + checksum is equal to that saved by the compressor and returns Z_STREAM_END + only if the checksum is correct. + + inflate() will decompress and check either zlib-wrapped or gzip-wrapped + deflate data. The header type is detected automatically. Any information + contained in the gzip header is not retained, so applications that need that + information should instead use raw inflate, see inflateInit2() below, or + inflateBack() and perform their own processing of the gzip header and + trailer. + + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect check + value), Z_STREAM_ERROR if the stream structure was inconsistent (for example + if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory, + Z_BUF_ERROR if no progress is possible or if there was not enough room in the + output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + inflate() can be called again with more input and more output space to + continue decompressing. If Z_DATA_ERROR is returned, the application may then + call inflateSync() to look for a good compression block if a partial recovery + of the data is desired. +*/ + + +int inflateEnd(z_streamp strm); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. + + inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state + was inconsistent. In the error case, msg may be set but then points to a + static string (which must not be deallocated). +*/ + + /* Advanced functions */ + +/* + The following functions are needed only in some special applications. +*/ + +/* +int deflateInit2 (z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy); + + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by + the caller. + + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library. + + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead. + + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits + determines the window size. deflate() will then generate raw deflate data + with no zlib header or trailer, and will not compute an adler32 check value. + + windowBits can also be greater than 15 for optional gzip encoding. Add + 16 to windowBits to write a simple gzip header and trailer around the + compressed data instead of a zlib wrapper. The gzip header will have no + file name, no extra data, no comment, no modification time (set to zero), + no header crc, and the operating system will be set to 255 (unknown). If a + gzip stream is being written, strm->adler is a crc32 instead of an adler32. + + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but + is slow and reduces compression ratio; memLevel=9 uses maximum memory + for optimal speed. The default value is 8. See zconf.h for total memory + usage as a function of windowBits and memLevel. + + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match), or Z_RLE to limit match distances to one (run-length + encoding). Filtered data consists mostly of small values with a somewhat + random distribution. In this case, the compression algorithm is tuned to + compress them better. The effect of Z_FILTERED is to force more Huffman + coding and less string matching; it is somewhat intermediate between + Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as + Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy + parameter only affects the compression ratio but not the correctness of the + compressed output even if it is not set appropriately. Z_FIXED prevents the + use of dynamic Huffman codes, allowing for a simpler decoder for special + applications. + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid + method). msg is set to null if there is no error message. deflateInit2 does + not perform any compression: this will be done by deflate(). +*/ + +int deflateSetDictionary(z_streamp strm, + Bytef* dictionary, + uInt dictLength); +/* + Initializes the compression dictionary from the given byte sequence + without producing any compressed output. This function must be called + immediately after deflateInit, deflateInit2 or deflateReset, before any + call of deflate. The compressor and decompressor must use exactly the same + dictionary (see inflateSetDictionary). + + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy; the data can then be compressed better than + with the default empty dictionary. + + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size in + deflate or deflate2. Thus the strings most likely to be useful should be + put at the end of the dictionary, not at the front. In addition, the + current implementation of deflate will use at most the window size minus + 262 bytes of the provided dictionary. + + Upon return of this function, strm->adler is set to the adler32 value + of the dictionary; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The adler32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.) If a raw deflate was requested, then the + adler32 value is not computed and strm->adler is not set. + + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if the compression method is bsort). deflateSetDictionary does not + perform any compression: this will be done by deflate(). +*/ + +int deflateCopy(z_streamp dest, + z_streamp source); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and + can consume lots of memory. + + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being NULL). msg is left unchanged in both source and + destination. +*/ + +int deflateReset(z_streamp strm); +/* + This function is equivalent to deflateEnd followed by deflateInit, + but does not free and reallocate all the internal compression state. + The stream will keep the same compression level and any other attributes + that may have been set by deflateInit2. + + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL). +*/ + +int deflateParams(z_streamp strm, + int level, + int strategy); +/* + Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2. This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different + strategy. If the compression level is changed, the input available so far + is compressed with the old level (and may be flushed); the new level will + take effect only at the next call of deflate(). + + Before the call of deflateParams, the stream state must be set as for + a call of deflate(), since the currently available input may have to + be compressed and flushed. In particular, strm->avail_out must be non-zero. + + deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source + stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR + if strm->avail_out was zero. +*/ + +int deflateTune(z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain); +/* + Fine tune deflate's internal compression parameters. This should only be + used by someone who understands the algorithm used by zlib's deflate for + searching for the best matching string, and even then only by the most + fanatic optimizer trying to squeeze out the last compressed bit for their + specific input data. Read the deflate.c source code for the meaning of the + max_lazy, good_length, nice_length, and max_chain parameters. + + deflateTune() can be called after deflateInit() or deflateInit2(), and + returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. + */ + +uLong deflateBound(z_streamp strm, + uLong sourceLen); +/* + deflateBound() returns an upper bound on the compressed size after + deflation of sourceLen bytes. It must be called after deflateInit() + or deflateInit2(). This would be used to allocate an output buffer + for deflation in a single pass, and so would be called before deflate(). +*/ + +int deflatePrime(z_streamp strm, + int bits, + int value); +/* + deflatePrime() inserts bits in the deflate output stream. The intent + is that this function is used to start off the deflate output with the + bits leftover from a previous deflate stream when appending to it. As such, + this function can only be used for raw deflate, and must be used before the + first deflate() call after a deflateInit2() or deflateReset(). bits must be + less than or equal to 16, and that many of the least significant bits of + value will be inserted in the output. + + deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +int deflateSetHeader(z_streamp strm, + gz_headerp head); +/* + deflateSetHeader() provides gzip header information for when a gzip + stream is requested by deflateInit2(). deflateSetHeader() may be called + after deflateInit2() or deflateReset() and before the first call of + deflate(). The text, time, os, extra field, name, and comment information + in the provided gz_header structure are written to the gzip header (xflag is + ignored -- the extra flags are set according to the compression level). The + caller must assure that, if not Z_NULL, name and comment are terminated with + a zero byte, and that if extra is not Z_NULL, that extra_len bytes are + available there. If hcrc is true, a gzip header crc is included. Note that + the current versions of the command-line version of gzip (up through version + 1.3.x) do not support header crc's, and will report that it is a "multi-part + gzip file" and give up. + + If deflateSetHeader is not used, the default gzip header has text false, + the time set to zero, and os set to 255, with no extra, name, or comment + fields. The gzip header is returned to the default state by deflateReset(). + + deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +int inflateInit2(z_streamp strm, + int windowBits); + + This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller. + + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. windowBits must be greater than or equal to the windowBits value + provided to deflateInit2() while compressing, or it must be equal to 15 if + deflateInit2() was not used. If a compressed stream with a larger window + size is given as input, inflate() will return with the error code + Z_DATA_ERROR instead of trying to allocate a larger window. + + windowBits can also be -8..-15 for raw inflate. In this case, -windowBits + determines the window size. inflate() will then process raw deflate data, + not looking for a zlib or gzip header, not generating a check value, and not + looking for any check values for comparison at the end of the stream. This + is for use with other formats that use the deflate compressed data format + such as zip. Those formats provide their own check values. If a custom + format is developed using the raw deflate format for compressed data, it is + recommended that a check value such as an adler32 or a crc32 be applied to + the uncompressed data as is done in the zlib, gzip, and zip formats. For + most applications, the zlib format should be used as is. Note that comments + above on the use in deflateInit2() applies to the magnitude of windowBits. + + windowBits can also be greater than 15 for optional gzip decoding. Add + 32 to windowBits to enable zlib and gzip decoding with automatic header + detection, or add 16 to decode only the gzip format (the zlib format will + return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is + a crc32 instead of an adler32. + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as a null strm). msg + is set to null if there is no error message. inflateInit2 does not perform + any decompression apart from reading the zlib header if present: this will + be done by inflate(). (So next_in and avail_in may be modified, but next_out + and avail_out are unchanged.) +*/ + +int inflateSetDictionary(z_streamp strm, + Bytef* dictionary, + uInt dictLength); +/* + Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate, + if that call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the adler32 value returned by that call of inflate. + The compressor and decompressor must use exactly the same dictionary (see + deflateSetDictionary). For raw inflate, this function can be called + immediately after inflateInit2() or inflateReset() and before any call of + inflate() to set the dictionary. The application must insure that the + dictionary that was used for compression is provided. + + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect adler32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate(). +*/ + +int inflateSync(z_streamp strm); +/* + Skips invalid compressed data until a full flush point (see above the + description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. + + inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR + if no more input was provided, Z_DATA_ERROR if no flush point has been found, + or Z_STREAM_ERROR if the stream structure was inconsistent. In the success + case, the application may save the current current value of total_in which + indicates where valid compressed data was found. In the error case, the + application may repeatedly call inflateSync, providing more input each time, + until success or end of the input data. +*/ + +int inflateCopy(z_streamp dest, + z_streamp source); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when randomly accessing a large stream. The + first pass through the stream can periodically record the inflate state, + allowing restarting inflate at those points when randomly accessing the + stream. + + inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being NULL). msg is left unchanged in both source and + destination. +*/ + +int inflateReset(z_streamp strm); +/* + This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate all the internal decompression state. + The stream will keep attributes that may have been set by inflateInit2. + + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL). +*/ + +int inflatePrime(z_streamp strm, + int bits, + int value); +/* + This function inserts bits in the inflate input stream. The intent is + that this function is used to start inflating at a bit position in the + middle of a byte. The provided bits will be used before any bytes are used + from next_in. This function should only be used with raw inflate, and + should be used before the first inflate() call after inflateInit2() or + inflateReset(). bits must be less than or equal to 16, and that many of the + least significant bits of value will be inserted in the input. + + inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +int inflateGetHeader(z_streamp strm, + gz_headerp head); +/* + inflateGetHeader() requests that gzip header information be stored in the + provided gz_header structure. inflateGetHeader() may be called after + inflateInit2() or inflateReset(), and before the first call of inflate(). + As inflate() processes the gzip stream, head->done is zero until the header + is completed, at which time head->done is set to one. If a zlib stream is + being decoded, then head->done is set to -1 to indicate that there will be + no gzip header information forthcoming. Note that Z_BLOCK can be used to + force inflate() to return immediately after header processing is complete + and before any actual data is decompressed. + + The text, time, xflags, and os fields are filled in with the gzip header + contents. hcrc is set to true if there is a header CRC. (The header CRC + was valid if done is set to one.) If extra is not Z_NULL, then extra_max + contains the maximum number of bytes to write to extra. Once done is true, + extra_len contains the actual extra field length, and extra contains the + extra field, or that field truncated if extra_max is less than extra_len. + If name is not Z_NULL, then up to name_max characters are written there, + terminated with a zero unless the length is greater than name_max. If + comment is not Z_NULL, then up to comm_max characters are written there, + terminated with a zero unless the length is greater than comm_max. When + any of extra, name, or comment are not Z_NULL and the respective field is + not present in the header, then that field is set to Z_NULL to signal its + absence. This allows the use of deflateSetHeader() with the returned + structure to duplicate the header. However if those fields are set to + allocated memory, then the application will need to save those pointers + elsewhere so that they can be eventually freed. + + If inflateGetHeader is not used, then the header information is simply + discarded. The header is always checked for validity, including the header + CRC if present. inflateReset() will reset the process to discard the header + information. The application would need to call inflateGetHeader() again to + retrieve the header from the next gzip stream. + + inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +int inflateBackInit(z_streamp strm, + int windowBits, + ubyte* window); + + Initialize the internal stream state for decompression using inflateBack() + calls. The fields zalloc, zfree and opaque in strm must be initialized + before the call. If zalloc and zfree are Z_NULL, then the default library- + derived memory allocation routines are used. windowBits is the base two + logarithm of the window size, in the range 8..15. window is a caller + supplied buffer of that size. Except for special applications where it is + assured that deflate was used with small window sizes, windowBits must be 15 + and a 32K byte window must be supplied to be able to decompress general + deflate streams. + + See inflateBack() for the usage of these routines. + + inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of + the paramaters are invalid, Z_MEM_ERROR if the internal state could not + be allocated, or Z_VERSION_ERROR if the version of the library does not + match the version of the header file. +*/ + +alias uint function(void*, ubyte**) in_func; +alias int function(void*, ubyte*, uint) out_func; + +int inflateBack(z_streamp strm, + in_func in_fn, + void* in_desc, + out_func out_fn, + void* out_desc); +/* + inflateBack() does a raw inflate with a single call using a call-back + interface for input and output. This is more efficient than inflate() for + file i/o applications in that it avoids copying between the output and the + sliding window by simply making the window itself the output buffer. This + function trusts the application to not change the output buffer passed by + the output function, at least until inflateBack() returns. + + inflateBackInit() must be called first to allocate the internal state + and to initialize the state with the user-provided window buffer. + inflateBack() may then be used multiple times to inflate a complete, raw + deflate stream with each call. inflateBackEnd() is then called to free + the allocated state. + + A raw deflate stream is one with no zlib or gzip header or trailer. + This routine would normally be used in a utility that reads zip or gzip + files and writes out uncompressed files. The utility would decode the + header and process the trailer on its own, hence this routine expects + only the raw deflate stream to decompress. This is different from the + normal behavior of inflate(), which expects either a zlib or gzip header and + trailer around the deflate stream. + + inflateBack() uses two subroutines supplied by the caller that are then + called by inflateBack() for input and output. inflateBack() calls those + routines until it reads a complete deflate stream and writes out all of the + uncompressed data, or until it encounters an error. The function's + parameters and return types are defined above in the in_func and out_func + typedefs. inflateBack() will call in(in_desc, &buf) which should return the + number of bytes of provided input, and a pointer to that input in buf. If + there is no input available, in() must return zero--buf is ignored in that + case--and inflateBack() will return a buffer error. inflateBack() will call + out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() + should return zero on success, or non-zero on failure. If out() returns + non-zero, inflateBack() will return with an error. Neither in() nor out() + are permitted to change the contents of the window provided to + inflateBackInit(), which is also the buffer that out() uses to write from. + The length written by out() will be at most the window size. Any non-zero + amount of input may be provided by in(). + + For convenience, inflateBack() can be provided input on the first call by + setting strm->next_in and strm->avail_in. If that input is exhausted, then + in() will be called. Therefore strm->next_in must be initialized before + calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called + immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in + must also be initialized, and then if strm->avail_in is not zero, input will + initially be taken from strm->next_in[0 .. strm->avail_in - 1]. + + The in_desc and out_desc parameters of inflateBack() is passed as the + first parameter of in() and out() respectively when they are called. These + descriptors can be optionally used to pass any information that the caller- + supplied in() and out() functions need to do their job. + + On return, inflateBack() will set strm->next_in and strm->avail_in to + pass back any unused input that was provided by the last in() call. The + return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR + if in() or out() returned an error, Z_DATA_ERROR if there was a format + error in the deflate stream (in which case strm->msg is set to indicate the + nature of the error), or Z_STREAM_ERROR if the stream was not properly + initialized. In the case of Z_BUF_ERROR, an input or output error can be + distinguished using strm->next_in which will be Z_NULL only if in() returned + an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to + out() returning non-zero. (in() will always be called before out(), so + strm->next_in is assured to be defined if out() returns non-zero.) Note + that inflateBack() cannot return Z_OK. +*/ + +int inflateBackEnd(z_streamp strm); +/* + All memory allocated by inflateBackInit() is freed. + + inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream + state was inconsistent. +*/ + +uLong zlibCompileFlags(); +/* Return flags indicating compile-time options. + + Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: + 1.0: size of uInt + 3.2: size of uLong + 5.4: size of voidpf (pointer) + 7.6: size of z_off_t + + Compiler, assembler, and debug options: + 8: DEBUG + 9: ASMV or ASMINF -- use ASM code + 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention + 11: 0 (reserved) + + One-time table building (smaller code, but not thread-safe if true): + 12: BUILDFIXED -- build static block decoding tables when needed + 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed + 14,15: 0 (reserved) + + Library content (indicates missing functionality): + 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking + deflate code when not needed) + 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect + and decode gzip streams (to avoid linking crc code) + 18-19: 0 (reserved) + + Operation variations (changes in library functionality): + 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate + 21: FASTEST -- deflate algorithm with only one, lowest compression level + 22,23: 0 (reserved) + + The sprintf variant used by gzprintf (zero is best): + 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format + 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! + 26: 0 = returns value, 1 = void -- 1 means inferred string length returned + + Remainder: + 27-31: 0 (reserved) + */ + + + /* utility functions */ + +/* + The following utility functions are implemented on top of the + basic stream-oriented functions. To simplify the interface, some + default options are assumed (compression level and memory usage, + standard memory allocation functions). The source code of these + utility functions can easily be modified if you need special options. +*/ + +int compress(Bytef* dest, + uLongf* destLen, + Bytef* source, + uLong sourceLen); +/* + Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be at least the value returned + by compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + This function can be used to compress a whole file at once if the + input file is mmap'ed. + compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer. +*/ + +int compress2(Bytef* dest, + uLongf* destLen, + Bytef* source, + uLong sourceLen, + int level); +/* + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ + +uLong compressBound(uLong sourceLen); +/* + compressBound() returns an upper bound on the compressed size after + compress() or compress2() on sourceLen bytes. It would be used before + a compress() or compress2() call to allocate the destination buffer. +*/ + +int uncompress(Bytef* dest, + uLongf* destLen, + Bytef* source, + uLong sourceLen); +/* + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be large enough to hold the + entire uncompressed data. (The size of the uncompressed data must have + been saved previously by the compressor and transmitted to the decompressor + by some mechanism outside the scope of this compression library.) + Upon exit, destLen is the actual size of the compressed buffer. + This function can be used to decompress a whole file at once if the + input file is mmap'ed. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. +*/ + + +typedef voidp gzFile; + +gzFile gzopen(char* path, char* mode); +/* + Opens a gzip (.gz) file for reading or writing. The mode parameter + is as in fopen ("rb" or "wb") but can also include a compression level + ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for + Huffman only compression as in "wb1h", or 'R' for run-length encoding + as in "wb1R". (See the description of deflateInit2 for more information + about the strategy parameter.) + + gzopen can be used to read a file which is not in gzip format; in this + case gzread will directly read from the file without decompression. + + gzopen returns NULL if the file could not be opened or if there was + insufficient memory to allocate the (de)compression state; errno + can be checked to distinguish the two cases (if errno is zero, the + zlib error is Z_MEM_ERROR). */ + +gzFile gzdopen(int fd, char* mode); +/* + gzdopen() associates a gzFile with the file descriptor fd. File + descriptors are obtained from calls like open, dup, creat, pipe or + fileno (in the file has been previously opened with fopen). + The mode parameter is as in gzopen. + The next call of gzclose on the returned gzFile will also close the + file descriptor fd, just like fclose(fdopen(fd), mode) closes the file + descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). + gzdopen returns NULL if there was insufficient memory to allocate + the (de)compression state. +*/ + +int gzsetparams(gzFile file, int level, int strategy); +/* + Dynamically update the compression level or strategy. See the description + of deflateInit2 for the meaning of these parameters. + gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not + opened for writing. +*/ + +int gzread(gzFile file, voidp buf, uint len); +/* + Reads the given number of uncompressed bytes from the compressed file. + If the input file was not in gzip format, gzread copies the given number + of bytes into the buffer. + gzread returns the number of uncompressed bytes actually read (0 for + end of file, -1 for error). */ + +int gzwrite(gzFile file, voidpc buf, uint len); +/* + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes actually written + (0 in case of error). +*/ + +int gzprintf (gzFile file, char* format, ...); +/* + Converts, formats, and writes the args to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written (0 in case of error). The number of + uncompressed bytes written is limited to 4095. The caller should assure that + this limit is not exceeded. If it is exceeded, then gzprintf() will return + return an error (0) with nothing written. In this case, there may also be a + buffer overflow with unpredictable consequences, which is possible only if + zlib was compiled with the insecure functions sprintf() or vsprintf() + because the secure snprintf() or vsnprintf() functions were not available. +*/ + +int gzputs(gzFile file, char* s); +/* + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + gzputs returns the number of characters written, or -1 in case of error. +*/ + +char* gzgets(gzFile file, char* buf, int len); +/* + Reads bytes from the compressed file until len-1 characters are read, or + a newline character is read and transferred to buf, or an end-of-file + condition is encountered. The string is then terminated with a null + character. + gzgets returns buf, or Z_NULL in case of error. +*/ + +int gzputc(gzFile file, int c); +/* + Writes c, converted to an unsigned char, into the compressed file. + gzputc returns the value that was written, or -1 in case of error. +*/ + +int gzgetc (gzFile file); +/* + Reads one byte from the compressed file. gzgetc returns this byte + or -1 in case of end of file or error. +*/ + +int gzungetc(int c, gzFile file); +/* + Push one character back onto the stream to be read again later. + Only one character of push-back is allowed. gzungetc() returns the + character pushed, or -1 on failure. gzungetc() will fail if a + character has been pushed but not read yet, or if c is -1. The pushed + character will be discarded if the stream is repositioned with gzseek() + or gzrewind(). +*/ + +int gzflush(gzFile file, int flush); +/* + Flushes all pending output into the compressed file. The parameter + flush is as in the deflate() function. The return value is the zlib + error number (see function gzerror below). gzflush returns Z_OK if + the flush parameter is Z_FINISH and all output could be flushed. + gzflush should be called only when strictly necessary because it can + degrade compression. +*/ + +z_off_t gzseek (gzFile file, z_off_t offset, int whence); +/* + Sets the starting position for the next gzread or gzwrite on the + given compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); + the value SEEK_END is not supported. + If the file is opened for reading, this function is emulated but can be + extremely slow. If the file is opened for writing, only forward seeks are + supported; gzseek then compresses a sequence of zeroes up to the new + starting position. + + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error, in + particular if the file is opened for writing and the new starting position + would be before the current position. +*/ + +int gzrewind(gzFile file); +/* + Rewinds the given file. This function is supported only for reading. + + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) +*/ + +z_off_t gztell (gzFile file); +/* + Returns the starting position for the next gzread or gzwrite on the + given compressed file. This position represents a number of bytes in the + uncompressed data stream. + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + +int gzeof(gzFile file); +/* + Returns 1 when EOF has previously been detected reading the given + input stream, otherwise zero. +*/ + +int gzdirect(gzFile file); +/* + Returns 1 if file is being read directly without decompression, otherwise + zero. +*/ + +int gzclose(gzFile file); +/* + Flushes all pending output if necessary, closes the compressed file + and deallocates all the (de)compression state. The return value is the zlib + error number (see function gzerror below). +*/ + +char* gzerror(gzFile file, int* errnum); +/* + Returns the error message for the last error which occurred on the + given compressed file. errnum is set to zlib error number. If an + error occurred in the file system and not in the compression library, + errnum is set to Z_ERRNO and the application may consult errno + to get the exact error code. +*/ + +void gzclearerr(gzFile file); +/* + Clears the error and end-of-file flags for file. This is analogous to the + clearerr() function in stdio. This is useful for continuing to read a gzip + file that is being written concurrently. +*/ + + /* checksum functions */ + +/* + These functions are not related to compression but are exported + anyway because they might be useful in applications using the + compression library. +*/ + +uLong adler32(uLong adler, Bytef* buf, uInt len); +/* + Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. If buf is NULL, this function returns + the required initial value for the checksum. + An Adler-32 checksum is almost as reliable as a CRC32 but can be computed + much faster. Usage example: + + uLong adler = adler32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + adler = adler32(adler, buffer, length); + } + if (adler != original_adler) error(); +*/ + +uLong adler32_combine(uLong adler1, uLong adler2, z_off_t len2); +/* + Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 + and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for + each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of + seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. +*/ + +uLong crc32(uLong crc, Bytef* buf, uInt len); +/* + Update a running CRC-32 with the bytes buf[0..len-1] and return the + updated CRC-32. If buf is NULL, this function returns the required initial + value for the for the crc. Pre- and post-conditioning (one's complement) is + performed within this function so it shouldn't be done by the application. + Usage example: + + uLong crc = crc32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + crc = crc32(crc, buffer, length); + } + if (crc != original_crc) error(); +*/ + +uLong crc32_combine(uLong crc1, uLong crc2, z_off_t len2); + +/* + Combine two CRC-32 check values into one. For two sequences of bytes, + seq1 and seq2 with lengths len1 and len2, CRC-32 check values were + calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 + check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and + len2. +*/ + + + /* various hacks, don't look :) */ + +/* deflateInit and inflateInit are macros to allow checking the zlib version + * and the compiler's view of z_stream: + */ +int deflateInit_(z_streamp strm, + int level, + char* ver, + int stream_size); +int inflateInit_(z_streamp strm, + char* ver, + int stream_size); +int deflateInit2_(z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy, + char* ver, + int stream_size); +int inflateInit2_(z_streamp strm, + int windowBits, + char* ver, + int stream_size); +int inflateBackInit_(z_streamp strm, + int windowBits, + ubyte* window, + char* ver, + int stream_size); + +extern (D) int deflateInit(z_streamp strm, + int level) +{ + return deflateInit_(strm, + level, + ZLIB_VERSION, + z_stream.sizeof); +} + +extern (D) int inflateInit(z_streamp strm) +{ + return inflateInit_(strm, + ZLIB_VERSION, + z_stream.sizeof); +} + +extern (D) int deflateInit2(z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy) +{ + return deflateInit2_(strm, + level, + method, + windowBits, + memLevel, + strategy, + ZLIB_VERSION, + z_stream.sizeof); +} + +extern (D) int inflateInit2(z_streamp strm, + int windowBits) +{ + return inflateInit2_(strm, + windowBits, + ZLIB_VERSION, + z_stream.sizeof); +} + +extern (D) int inflateBackInit(z_streamp strm, + int windowBits, + ubyte* window) +{ + return inflateBackInit_(strm, + windowBits, + window, + ZLIB_VERSION, + z_stream.sizeof); +} + +char* zError(int); +int inflateSyncPoint(z_streamp z); +uLongf* get_crc_table(); diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/digest/Crc32.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/digest/Crc32.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,122 @@ +/******************************************************************************* + + copyright: Copyright (c) 2006 James Pelcis. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: August 2006 + + author: James Pelcis + +*******************************************************************************/ + +module tango.io.digest.Crc32; + +public import tango.io.digest.Digest; + + +/** This class implements the CRC-32 checksum algorithm. + The digest returned is a little-endian 4 byte string. */ +final class Crc32 : Digest +{ + private uint[256] table; + private uint result = 0xffffffff; + + /** + * Create a cloned CRC32 + */ + this (Crc32 crc32) + { + this.table[] = crc32.table[]; + this.result = crc32.result; + } + + /** + * Prepare Crc32 to checksum the data with a given polynomial. + * + * Params: + * polynomial = The magic CRC number to base calculations on. The + * default compatible with ZIP, PNG, ethernet and others. Note: This + * default value has poor error correcting properties. + */ + this (uint polynomial = 0xEDB88320U) + { + for (int i = 0; i < 256; i++) + { + uint value = i; + for (int j = 8; j > 0; j--) + { + if (value & 1) { + value &= 0xFFFFFFFE; + value /= 2; + value &= 0x7FFFFFFF; + value ^= polynomial; + } + else + { + value &= 0xFFFFFFFE; + value /= 2; + value &= 0x7FFFFFFF; + } + } + table[i] = value; + } + } + + /** */ + override void update (void[] input) + { + uint r = result; // DMD optimization + foreach (ubyte value; cast(ubyte[]) input) + { + auto i = cast(ubyte) r;// & 0xff; + i ^= value; + r &= 0xFFFFFF00; + r /= 0x100; + r &= 16777215; + r ^= table[i]; + } + result = r; + } + + /** The Crc32 digestSize is 4 */ + override uint digestSize () + { + return 4; + } + + /** */ + override ubyte[] binaryDigest(ubyte[] buf = null) { + if (buf.length < 4) + buf.length = 4; + uint v = ~result; + buf[3] = cast(ubyte) (v >> 24); + buf[2] = cast(ubyte) (v >> 16); + buf[1] = cast(ubyte) (v >> 8); + buf[0] = cast(ubyte) (v); + result = 0xffffffff; + return buf; + } + + /** Returns the Crc32 digest as a uint */ + uint crc32Digest() { + uint ret = ~result; + result = 0xffffffff; + return ret; + } +} + +version (UnitTest) +{ + unittest + { + scope c = new Crc32(); + static ubyte[] data = [1,2,3,4,5,6,7,8,9,10]; + c.update(data); + assert(c.binaryDigest() == cast(ubyte[]) x"7b572025"); + c.update(data); + assert(c.crc32Digest == 0x2520577b); + c.update(data); + assert(c.hexDigest() == "7b572025"); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/digest/Digest.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/digest/Digest.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,140 @@ +/****************************************************************************** + + copyright: Copyright (c) 2006 Tango. All rights reserved + + license: BSD style: see doc/license.txt for details + + version: Initial release: Feb 2006 + + author: Regan Heath, Oskar Linde + + This module defines the Digest interface. + +******************************************************************************/ + +module tango.io.digest.Digest; + +private import tango.stdc.stdlib : alloca; + +/******************************************************************************* + + The DigestTransform interface defines the interface of message + digest algorithms, such as MD5 and SHA. Message digests are + secure hash functions that take a message of arbitrary length + and produce a fix length digest as output. + + A object implementing the DigestTransform should start out initialized. + The data is processed though calls to the update method. Once all data + has been sent to the algorithm, the digest is finalized and computed + with the digest method. + + The digest method may only be called once. After the digest + method has been called, the algorithm is reset to its initial + state. + + Using the update method, data may be processed piece by piece, + which is useful for cases involving streams of data. + + For example: + --- + // create an MD5 hash algorithm + Md5 hash = new Md5(); + + // process some data + hash.update("The quick brown fox"); + + // process some more data + hash.update(" jumps over the lazy dog"); + + // conclude algorithm and produce digest + ubyte[] digest = hash.binaryDigest(); + --- + +******************************************************************************/ + +abstract class Digest +{ + /********************************************************************* + + Processes data + + Remarks: + Updates the hash algorithm state with new data + + *********************************************************************/ + + abstract void update(void[] data); + + /******************************************************************** + + Computes the digest and resets the state + + Params: + buffer = a buffer can be supplied for the digest to be + written to + + Remarks: + If the buffer is not large enough to hold the + digest, a new buffer is allocated and returned. + The algorithm state is always reset after a call to + binaryDigest. Use the digestSize method to find out how + large the buffer has to be. + + *********************************************************************/ + + abstract ubyte[] binaryDigest(ubyte[] buffer = null); + + /******************************************************************** + + Returns the size in bytes of the digest + + Returns: + the size of the digest in bytes + + Remarks: + Returns the size of the digest. + + *********************************************************************/ + + abstract uint digestSize(); + + /********************************************************************* + + Computes the digest as a hex string and resets the state + + Params: + buffer = a buffer can be supplied in which the digest + will be written. It needs to be able to hold + 2 * digestSize chars + + Remarks: + If the buffer is not large enough to hold the hex digest, + a new buffer is allocated and returned. The algorithm + state is always reset after a call to hexDigest. + + *********************************************************************/ + + char[] hexDigest (char[] buffer = null) + { + uint ds = digestSize(); + + if (buffer.length < ds * 2) + buffer.length = ds * 2; + + ubyte[] buf = (cast(ubyte *) alloca(ds))[0..ds]; + ubyte[] ret = binaryDigest(buf); + assert(ret.ptr == buf.ptr); + + static char[] hexdigits = "0123456789abcdef"; + int i = 0; + + foreach (b; buf) + { + buffer[i++] = hexdigits[b >> 4]; + buffer[i++] = hexdigits[b & 0xf]; + } + + return buffer; + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/digest/Md2.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/digest/Md2.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,272 @@ +/******************************************************************************* + + copyright: Copyright (c) 2006 Tango. All rights reserved + + license: BSD style: see doc/license.txt for details + + version: Initial release: Feb 2006 + + author: Regan Heath, Oskar Linde + + This module implements the MD2 Message Digest Algorithm as described + by RFC 1319 The MD2 Message-Digest Algorithm. B. Kaliski. April 1992. + +*******************************************************************************/ + +module tango.io.digest.Md2; + +public import tango.io.digest.Digest; + +private import tango.io.digest.MerkleDamgard; + +/******************************************************************************* + +*******************************************************************************/ + +class Md2 : MerkleDamgard +{ + private ubyte[16] C, + state; + + /*********************************************************************** + + Construct an Md2 + + ***********************************************************************/ + + this() { } + + /*********************************************************************** + + Initialize the cipher + + Remarks: + Returns the cipher state to it's initial value + + ***********************************************************************/ + + protected override void reset() + { + super.reset(); + state[] = 0; + C[] = 0; + } + + /*********************************************************************** + + Obtain the digest + + Returns: + the digest + + Remarks: + Returns a digest of the current cipher state, this may + be the final digest, or a digest of the state between + calls to update() + + ***********************************************************************/ + + protected override void createDigest(ubyte[] buf) + { + buf[] = state; + } + + /*********************************************************************** + + The MD 2 digest size is 16 bytes + + ***********************************************************************/ + + uint digestSize() { return 16; } + + /*********************************************************************** + + block size + + Returns: + the block size + + Remarks: + Specifies the size (in bytes) of the block of data to pass to + each call to transform(). For MD2 the blockSize is 16. + + ***********************************************************************/ + + protected override uint blockSize() + { + return 16; + } + + /*********************************************************************** + + Length padding size + + Returns: + the length padding size + + Remarks: + Specifies the size (in bytes) of the padding which uses the + length of the data which has been ciphered, this padding is + carried out by the padLength method. For MD2 the addSize is + 0 + + ***********************************************************************/ + + protected override uint addSize() + { + return 0; + } + + /*********************************************************************** + + Pads the cipher data + + Params: + data = a slice of the cipher buffer to fill with padding + + Remarks: + Fills the passed buffer slice with the appropriate padding + for the final call to transform(). This padding will fill + the cipher buffer up to blockSize()-addSize(). + + ***********************************************************************/ + + protected override void padMessage (ubyte[] data) + { + /* Padding is performed as follows: "i" bytes of value "i" + * are appended to the message so that the length in bytes + * of the padded message becomes congruent to 0, modulo 16. + * At least one byte and at most 16 bytes are appended. + */ + data[0..$] = cast(ubyte) data.length; + } + + /*********************************************************************** + + Performs the cipher on a block of data + + Params: + data = the block of data to cipher + + Remarks: + The actual cipher algorithm is carried out by this method on + the passed block of data. This method is called for every + blockSize() bytes of input data and once more with the + remaining data padded to blockSize(). + + ***********************************************************************/ + + protected override void transform (ubyte[] input) + { + ubyte[48] X; + uint t,i,j; + + X[0..16] = state[]; + X[16..32] = input[]; + + for (i = 0; i < 16; i++) + X[i+32] = cast(ubyte) (state[i] ^ input[i]); + + t = 0; + for (i = 0; i < 18; i++) + { + for (j = 0; j < 48; j++) + t = X[j] ^= PI[t]; + t = (t + i) & 0xff; + } + + state[] = X[0..16]; + + t = C[15]; + + for (i = 0; i < 16; i++) + t = C[i] ^= PI[input[i] ^ t]; + } + + /*********************************************************************** + + Final processing of cipher. + + Remarks: + This method is called after the final transform just prior to + the creation of the final digest. The MD2 algorithm requires + an additional step at this stage. Future ciphers may or may not + require this method. + + ***********************************************************************/ + + protected override void extend() + { + transform(C); + } +} + + +/******************************************************************************* + +*******************************************************************************/ + +private const ubyte[256] PI = +[ + 41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236, 240, 6, + 19, 98, 167, 5, 243, 192, 199, 115, 140, 152, 147, 43, 217, 188, + 76, 130, 202, 30, 155, 87, 60, 253, 212, 224, 22, 103, 66, 111, 24, + 138, 23, 229, 18, 190, 78, 196, 214, 218, 158, 222, 73, 160, 251, + 245, 142, 187, 47, 238, 122, 169, 104, 121, 145, 21, 178, 7, 63, + 148, 194, 16, 137, 11, 34, 95, 33, 128, 127, 93, 154, 90, 144, 50, + 39, 53, 62, 204, 231, 191, 247, 151, 3, 255, 25, 48, 179, 72, 165, + 181, 209, 215, 94, 146, 42, 172, 86, 170, 198, 79, 184, 56, 210, + 150, 164, 125, 182, 118, 252, 107, 226, 156, 116, 4, 241, 69, 157, + 112, 89, 100, 113, 135, 32, 134, 91, 207, 101, 230, 45, 168, 2, 27, + 96, 37, 173, 174, 176, 185, 246, 28, 70, 97, 105, 52, 64, 126, 15, + 85, 71, 163, 35, 221, 81, 175, 58, 195, 92, 249, 206, 186, 197, + 234, 38, 44, 83, 13, 110, 133, 40, 132, 9, 211, 223, 205, 244, 65, + 129, 77, 82, 106, 220, 55, 200, 108, 193, 171, 250, 36, 225, 123, + 8, 12, 189, 177, 74, 120, 136, 149, 139, 227, 99, 232, 109, 233, + 203, 213, 254, 59, 0, 29, 57, 242, 239, 183, 14, 102, 88, 208, 228, + 166, 119, 114, 248, 235, 117, 75, 10, 49, 68, 80, 180, 143, 237, + 31, 26, 219, 153, 141, 51, 159, 17, 131, 20 +]; + + +/******************************************************************************* + +*******************************************************************************/ + +version (UnitTest) +{ + unittest + { + static char[][] strings = + [ + "", + "a", + "abc", + "message digest", + "abcdefghijklmnopqrstuvwxyz", + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", + "12345678901234567890123456789012345678901234567890123456789012345678901234567890" + ]; + + static char[][] results = + [ + "8350e5a3e24c153df2275c9f80692773", + "32ec01ec4a6dac72c0ab96fb34c0b5d1", + "da853b0d3f88d99b30283a69e6ded6bb", + "ab4f496bfb2a530b219ff33031fe06b0", + "4e8ddff3650292ab5a4108c3aa47940b", + "da33def2a42df13975352846c30338cd", + "d5976f79d83d3a0dc9806c3c66f3efd8" + ]; + + Md2 h = new Md2(); + + foreach (int i, char[] s; strings) + { + h.update(s); + char[] d = h.hexDigest(); + assert(d == results[i],":("~s~")("~d~")!=("~results[i]~")"); + } + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/digest/Md4.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/digest/Md4.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,375 @@ +/******************************************************************************* + + copyright: Copyright (c) 2006 Tango. All rights reserved + + license: BSD style: see doc/license.txt for details + + version: Initial release: Feb 2006 + + author: Regan Heath, Oskar Linde + + This module implements the MD4 Message Digest Algorithm as described + by RFC 1320 The MD4 Message-Digest Algorithm. R. Rivest. April 1992. + +*******************************************************************************/ + +module tango.io.digest.Md4; + +public import tango.io.digest.Digest; + +private import tango.io.digest.MerkleDamgard; + +/******************************************************************************* + +*******************************************************************************/ + +class Md4 : MerkleDamgard +{ + protected uint[4] context; + private const ubyte padChar = 0x80; + + /*********************************************************************** + + Construct an Md4 + + ***********************************************************************/ + + this() { } + + /*********************************************************************** + + The MD 4 digest size is 16 bytes + + ***********************************************************************/ + + uint digestSize() { return 16; } + + /*********************************************************************** + + Initialize the cipher + + Remarks: + Returns the cipher state to it's initial value + + ***********************************************************************/ + + override void reset() + { + super.reset(); + context[] = initial[]; + } + + /*********************************************************************** + + Obtain the digest + + Returns: + the digest + + Remarks: + Returns a digest of the current cipher state, this may be the + final digest, or a digest of the state between calls to update() + + ***********************************************************************/ + + override void createDigest(ubyte[] buf) + { + version (BigEndian) + ByteSwap.swap32 (context.ptr, context.length * uint.sizeof); + + buf[] = cast(ubyte[]) context; + } + + /*********************************************************************** + + block size + + Returns: + the block size + + Remarks: + Specifies the size (in bytes) of the block of data to pass to + each call to transform(). For MD4 the blockSize is 64. + + ***********************************************************************/ + + protected override uint blockSize() { return 64; } + + /*********************************************************************** + + Length padding size + + Returns: + the length padding size + + Remarks: + Specifies the size (in bytes) of the padding which uses the + length of the data which has been ciphered, this padding is + carried out by the padLength method. For MD4 the addSize is 8. + + ***********************************************************************/ + + protected override uint addSize() { return 8; } + + /*********************************************************************** + + Pads the cipher data + + Params: + data = a slice of the cipher buffer to fill with padding + + Remarks: + Fills the passed buffer slice with the appropriate padding for + the final call to transform(). This padding will fill the cipher + buffer up to blockSize()-addSize(). + + ***********************************************************************/ + + protected override void padMessage(ubyte[] data) + { + data[0] = padChar; + data[1..$] = 0; + } + + /*********************************************************************** + + Performs the length padding + + Params: + data = the slice of the cipher buffer to fill with padding + length = the length of the data which has been ciphered + + Remarks: + Fills the passed buffer slice with addSize() bytes of padding + based on the length in bytes of the input data which has been + ciphered. + + ***********************************************************************/ + + protected override void padLength(ubyte[] data, ulong length) + { + length <<= 3; + littleEndian64((cast(ubyte*)&length)[0..8],cast(ulong[]) data); + } + + /*********************************************************************** + + Performs the cipher on a block of data + + Params: + data = the block of data to cipher + + Remarks: + The actual cipher algorithm is carried out by this method on + the passed block of data. This method is called for every + blockSize() bytes of input data and once more with the remaining + data padded to blockSize(). + + ***********************************************************************/ + + protected override void transform(ubyte[] input) + { + uint a,b,c,d; + uint[16] x; + + littleEndian32(input,x); + + a = context[0]; + b = context[1]; + c = context[2]; + d = context[3]; + + /* Round 1 */ + ff(a, b, c, d, x[ 0], S11, 0); /* 1 */ + ff(d, a, b, c, x[ 1], S12, 0); /* 2 */ + ff(c, d, a, b, x[ 2], S13, 0); /* 3 */ + ff(b, c, d, a, x[ 3], S14, 0); /* 4 */ + ff(a, b, c, d, x[ 4], S11, 0); /* 5 */ + ff(d, a, b, c, x[ 5], S12, 0); /* 6 */ + ff(c, d, a, b, x[ 6], S13, 0); /* 7 */ + ff(b, c, d, a, x[ 7], S14, 0); /* 8 */ + ff(a, b, c, d, x[ 8], S11, 0); /* 9 */ + ff(d, a, b, c, x[ 9], S12, 0); /* 10 */ + ff(c, d, a, b, x[10], S13, 0); /* 11 */ + ff(b, c, d, a, x[11], S14, 0); /* 12 */ + ff(a, b, c, d, x[12], S11, 0); /* 13 */ + ff(d, a, b, c, x[13], S12, 0); /* 14 */ + ff(c, d, a, b, x[14], S13, 0); /* 15 */ + ff(b, c, d, a, x[15], S14, 0); /* 16 */ + + /* Round 2 */ + gg(a, b, c, d, x[ 0], S21, 0x5a827999); /* 17 */ + gg(d, a, b, c, x[ 4], S22, 0x5a827999); /* 18 */ + gg(c, d, a, b, x[ 8], S23, 0x5a827999); /* 19 */ + gg(b, c, d, a, x[12], S24, 0x5a827999); /* 20 */ + gg(a, b, c, d, x[ 1], S21, 0x5a827999); /* 21 */ + gg(d, a, b, c, x[ 5], S22, 0x5a827999); /* 22 */ + gg(c, d, a, b, x[ 9], S23, 0x5a827999); /* 23 */ + gg(b, c, d, a, x[13], S24, 0x5a827999); /* 24 */ + gg(a, b, c, d, x[ 2], S21, 0x5a827999); /* 25 */ + gg(d, a, b, c, x[ 6], S22, 0x5a827999); /* 26 */ + gg(c, d, a, b, x[10], S23, 0x5a827999); /* 27 */ + gg(b, c, d, a, x[14], S24, 0x5a827999); /* 28 */ + gg(a, b, c, d, x[ 3], S21, 0x5a827999); /* 29 */ + gg(d, a, b, c, x[ 7], S22, 0x5a827999); /* 30 */ + gg(c, d, a, b, x[11], S23, 0x5a827999); /* 31 */ + gg(b, c, d, a, x[15], S24, 0x5a827999); /* 32 */ + + /* Round 3 */ + hh(a, b, c, d, x[ 0], S31, 0x6ed9eba1); /* 33 */ + hh(d, a, b, c, x[ 8], S32, 0x6ed9eba1); /* 34 */ + hh(c, d, a, b, x[ 4], S33, 0x6ed9eba1); /* 35 */ + hh(b, c, d, a, x[12], S34, 0x6ed9eba1); /* 36 */ + hh(a, b, c, d, x[ 2], S31, 0x6ed9eba1); /* 37 */ + hh(d, a, b, c, x[10], S32, 0x6ed9eba1); /* 38 */ + hh(c, d, a, b, x[ 6], S33, 0x6ed9eba1); /* 39 */ + hh(b, c, d, a, x[14], S34, 0x6ed9eba1); /* 40 */ + hh(a, b, c, d, x[ 1], S31, 0x6ed9eba1); /* 41 */ + hh(d, a, b, c, x[ 9], S32, 0x6ed9eba1); /* 42 */ + hh(c, d, a, b, x[ 5], S33, 0x6ed9eba1); /* 43 */ + hh(b, c, d, a, x[13], S34, 0x6ed9eba1); /* 44 */ + hh(a, b, c, d, x[ 3], S31, 0x6ed9eba1); /* 45 */ + hh(d, a, b, c, x[11], S32, 0x6ed9eba1); /* 46 */ + hh(c, d, a, b, x[ 7], S33, 0x6ed9eba1); /* 47 */ + hh(b, c, d, a, x[15], S34, 0x6ed9eba1); /* 48 */ + + context[0] += a; + context[1] += b; + context[2] += c; + context[3] += d; + + x[] = 0; + } + + /*********************************************************************** + + ***********************************************************************/ + + protected static uint f(uint x, uint y, uint z) + { + return (x&y)|(~x&z); + } + + /*********************************************************************** + + ***********************************************************************/ + + protected static uint h(uint x, uint y, uint z) + { + return x^y^z; + } + + /*********************************************************************** + + ***********************************************************************/ + + private static uint g(uint x, uint y, uint z) + { + return (x&y)|(x&z)|(y&z); + } + + /*********************************************************************** + + ***********************************************************************/ + + private static void ff(inout uint a, uint b, uint c, uint d, uint x, uint s, uint ac) + { + a += f(b, c, d) + x + ac; + a = rotateLeft(a, s); + } + + /*********************************************************************** + + ***********************************************************************/ + + private static void gg(inout uint a, uint b, uint c, uint d, uint x, uint s, uint ac) + { + a += g(b, c, d) + x + ac; + a = rotateLeft(a, s); + } + + /*********************************************************************** + + ***********************************************************************/ + + private static void hh(inout uint a, uint b, uint c, uint d, uint x, uint s, uint ac) + { + a += h(b, c, d) + x + ac; + a = rotateLeft(a, s); + } + + /*********************************************************************** + + ***********************************************************************/ + + private static const uint[4] initial = + [ + 0x67452301, + 0xefcdab89, + 0x98badcfe, + 0x10325476 + ]; + + /*********************************************************************** + + ***********************************************************************/ + + private static enum + { + S11 = 3, + S12 = 7, + S13 = 11, + S14 = 19, + S21 = 3, + S22 = 5, + S23 = 9, + S24 = 13, + S31 = 3, + S32 = 9, + S33 = 11, + S34 = 15, + } +} + + +/******************************************************************************* + +*******************************************************************************/ + +version (UnitTest) +{ + unittest + { + static char[][] strings = + [ + "", + "a", + "abc", + "message digest", + "abcdefghijklmnopqrstuvwxyz", + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", + "12345678901234567890123456789012345678901234567890123456789012345678901234567890" + ]; + + static char[][] results = + [ + "31d6cfe0d16ae931b73c59d7e0c089c0", + "bde52cb31de33e46245e05fbdbd6fb24", + "a448017aaf21d8525fc10ae87aa6729d", + "d9130a8164549fe818874806e1c7014b", + "d79e1c308aa5bbcdeea8ed63df412da9", + "043f8582f241db351ce627e153e7f0e4", + "e33b4ddc9c38f2199c3e7b164fcc0536" + ]; + + Md4 h = new Md4(); + + foreach (int i, char[] s; strings) + { + h.update(s); + char[] d = h.hexDigest; + assert(d == results[i],":("~s~")("~d~")!=("~results[i]~")"); + } + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/digest/Md5.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/digest/Md5.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,272 @@ +/******************************************************************************* + + copyright: Copyright (c) 2006 Tango. All rights reserved + + license: BSD style: see doc/license.txt for details + + version: Initial release: Feb 2006 + + author: Regan Heath, Oskar Linde + + This module implements the MD5 Message Digest Algorithm as described + by RFC 1321 The MD5 Message-Digest Algorithm. R. Rivest. April 1992. + +*******************************************************************************/ + +module tango.io.digest.Md5; + +public import tango.io.digest.Md4; + +private import tango.io.digest.MerkleDamgard; + +/******************************************************************************* + +*******************************************************************************/ + +final class Md5 : Md4 +{ + /*********************************************************************** + + ***********************************************************************/ + + private enum + { + S11 = 7, + S12 = 12, + S13 = 17, + S14 = 22, + S21 = 5, + S22 = 9, + S23 = 14, + S24 = 20, + S31 = 4, + S32 = 11, + S33 = 16, + S34 = 23, + S41 = 6, + S42 = 10, + S43 = 15, + S44 = 21 + }; + + /*********************************************************************** + + Construct an Md5 + + ***********************************************************************/ + + this() { } + + + /*********************************************************************** + + Performs the cipher on a block of data + + Params: + data = the block of data to cipher + + Remarks: + The actual cipher algorithm is carried out by this method on + the passed block of data. This method is called for every + blockSize() bytes of input data and once more with the remaining + data padded to blockSize(). + + ***********************************************************************/ + + protected override void transform(ubyte[] input) + { + uint a,b,c,d; + uint[16] x; + + littleEndian32(input,x); + + a = context[0]; + b = context[1]; + c = context[2]; + d = context[3]; + + /* Round 1 */ + ff(a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ + ff(d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ + ff(c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ + ff(b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ + ff(a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ + ff(d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ + ff(c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ + ff(b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ + ff(a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ + ff(d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ + ff(c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ + ff(b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ + ff(a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ + ff(d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ + ff(c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ + ff(b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ + + /* Round 2 */ + gg(a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ + gg(d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ + gg(c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ + gg(b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ + gg(a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ + gg(d, a, b, c, x[10], S22, 0x2441453); /* 22 */ + gg(c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ + gg(b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ + gg(a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ + gg(d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ + gg(c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ + gg(b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ + gg(a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ + gg(d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ + gg(c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ + gg(b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ + + /* Round 3 */ + hh(a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ + hh(d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ + hh(c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ + hh(b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ + hh(a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ + hh(d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ + hh(c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ + hh(b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ + hh(a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ + hh(d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ + hh(c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ + hh(b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ + hh(a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ + hh(d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ + hh(c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ + hh(b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ + + /* Round 4 */ /* Md5 not md4 */ + ii(a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ + ii(d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ + ii(c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ + ii(b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ + ii(a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ + ii(d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ + ii(c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ + ii(b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ + ii(a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ + ii(d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ + ii(c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ + ii(b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ + ii(a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ + ii(d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ + ii(c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ + ii(b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ + + context[0] += a; + context[1] += b; + context[2] += c; + context[3] += d; + + x[] = 0; + } + + /*********************************************************************** + + ***********************************************************************/ + + private static uint g(uint x, uint y, uint z) + { + return (x&z)|(y&~z); + } + + /*********************************************************************** + + ***********************************************************************/ + + private static uint i(uint x, uint y, uint z) + { + return y^(x|~z); + } + + /*********************************************************************** + + ***********************************************************************/ + + private static void ff(inout uint a, uint b, uint c, uint d, uint x, uint s, uint ac) + { + a += f(b, c, d) + x + ac; + a = rotateLeft(a, s); + a += b; + } + + /*********************************************************************** + + ***********************************************************************/ + + private static void gg(inout uint a, uint b, uint c, uint d, uint x, uint s, uint ac) + { + a += g(b, c, d) + x + ac; + a = rotateLeft(a, s); + a += b; + } + + /*********************************************************************** + + ***********************************************************************/ + + private static void hh(inout uint a, uint b, uint c, uint d, uint x, uint s, uint ac) + { + a += h(b, c, d) + x + ac; + a = rotateLeft(a, s); + a += b; + } + + /*********************************************************************** + + ***********************************************************************/ + + private static void ii(inout uint a, uint b, uint c, uint d, uint x, uint s, uint ac) + { + a += i(b, c, d) + x + ac; + a = rotateLeft(a, s); + a += b; + } +} + + +/******************************************************************************* + +*******************************************************************************/ + +version (UnitTest) +{ + unittest + { + static char[][] strings = + [ + "", + "a", + "abc", + "message digest", + "abcdefghijklmnopqrstuvwxyz", + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", + "12345678901234567890123456789012345678901234567890123456789012345678901234567890" + ]; + + static char[][] results = + [ + "d41d8cd98f00b204e9800998ecf8427e", + "0cc175b9c0f1b6a831c399e269772661", + "900150983cd24fb0d6963f7d28e17f72", + "f96b697d7cb7938d525a2f31aaf161d0", + "c3fcd3d76192e4007dfb496cca67e13b", + "d174ab98d277d9f5a5611c2c9f419d9f", + "57edf4a22be3c955ac49da2e2107b67a" + ]; + + Md5 h = new Md5(); + + foreach (int i, char[] s; strings) + { + h.update(cast(ubyte[]) s); + char[] d = h.hexDigest; + + assert(d == results[i],":("~s~")("~d~")!=("~results[i]~")"); + } + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/digest/MerkleDamgard.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/digest/MerkleDamgard.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,399 @@ +/******************************************************************************* + copyright: Copyright (c) 2006 Tango. All rights reserved + + license: BSD style: see doc/license.txt for details + + version: Initial release: Feb 2006 + + author: Regan Heath, Oskar Linde + + This module implements a generic Merkle-Damgard hash function + +*******************************************************************************/ + +module tango.io.digest.MerkleDamgard; + +public import tango.core.ByteSwap; + +public import tango.io.digest.Digest; + +/******************************************************************************* + + Extending MerkleDamgard to create a custom hash function requires + the implementation of a number of abstract methods. These include: + --- + public uint digestSize(); + protected void reset(); + protected void createDigest(ubyte[] buf); + protected uint blockSize(); + protected uint addSize(); + protected void padMessage(ubyte[] data); + protected void transform(ubyte[] data); + --- + + In addition there exist two further abstract methods; these methods + have empty default implementations since in some cases they are not + required: + --- + protected abstract void padLength(ubyte[] data, ulong length); + protected abstract void extend(); + --- + + The method padLength() is required to implement the SHA series of + Hash functions and also the Tiger algorithm. Method extend() is + required only to implement the MD2 digest. + + The basic sequence of internal events is as follows: + $(UL + $(LI transform(), 0 or more times) + $(LI padMessage()) + $(LI padLength()) + $(LI transform()) + $(LI extend()) + $(LI createDigest()) + $(LI reset()) + ) + +*******************************************************************************/ + +package class MerkleDamgard : Digest +{ + private uint bytes; + private ubyte[] buffer; + + /*********************************************************************** + + Constructs the digest + + Params: + buf = a buffer with enough space to hold the digest + + Remarks: + Constructs the digest. + + ***********************************************************************/ + + protected abstract void createDigest(ubyte[] buf); + + /*********************************************************************** + + Digest block size + + Returns: + the block size + + Remarks: + Specifies the size (in bytes) of the block of data to pass to + each call to transform(). + + ***********************************************************************/ + + protected abstract uint blockSize(); + + /*********************************************************************** + + Length padding size + + Returns: + the length padding size + + Remarks: + Specifies the size (in bytes) of the padding which + uses the length of the data which has been fed to the + algorithm, this padding is carried out by the + padLength method. + + ***********************************************************************/ + + protected abstract uint addSize(); + + /*********************************************************************** + + Pads the digest data + + Params: + data = a slice of the digest buffer to fill with padding + + Remarks: + Fills the passed buffer slice with the appropriate + padding for the final call to transform(). This + padding will fill the message data buffer up to + blockSize()-addSize(). + + ***********************************************************************/ + + protected abstract void padMessage(ubyte[] data); + + /*********************************************************************** + + Performs the length padding + + Params: + data = the slice of the digest buffer to fill with padding + length = the length of the data which has been processed + + Remarks: + Fills the passed buffer slice with addSize() bytes of padding + based on the length in bytes of the input data which has been + processed. + + ***********************************************************************/ + + protected void padLength(ubyte[] data, ulong length) {} + + /*********************************************************************** + + Performs the digest on a block of data + + Params: + data = the block of data to digest + + Remarks: + The actual digest algorithm is carried out by this method on + the passed block of data. This method is called for every + blockSize() bytes of input data and once more with the remaining + data padded to blockSize(). + + ***********************************************************************/ + + protected abstract void transform(ubyte[] data); + + /*********************************************************************** + + Final processing of digest. + + Remarks: + This method is called after the final transform just prior to + the creation of the final digest. The MD2 algorithm requires + an additional step at this stage. Future digests may or may not + require this method. + + ***********************************************************************/ + + protected void extend() {} + + /*********************************************************************** + + Construct a digest + + Remarks: + Constructs the internal buffer for use by the digest, the buffer + size (in bytes) is defined by the abstract method blockSize(). + + ***********************************************************************/ + + this() + { + buffer = new ubyte[blockSize()]; + reset(); + } + + /*********************************************************************** + + Initialize the digest + + Remarks: + Returns the digest state to its initial value + + ***********************************************************************/ + + protected void reset() + { + bytes = 0; + } + + /*********************************************************************** + + Digest additional data + + Params: + input = the data to digest + + Remarks: + Continues the digest operation on the additional data. + + ***********************************************************************/ + + void update (void[] input) + { + auto block = blockSize(); + uint i = bytes & (block-1); + ubyte[] data = cast(ubyte[]) input; + + bytes += data.length; + + if (data.length+i < block) + buffer[i..i+data.length] = data[]; + else + { + buffer[i..block] = data[0..block-i]; + transform (buffer); + + for (i=block-i; i+block-1 < data.length; i += block) + transform(data[i..i+block]); + + buffer[0..data.length-i] = data[i..data.length]; + } + } + + /*********************************************************************** + + Complete the digest + + Returns: + the completed digest + + Remarks: + Concludes the algorithm producing the final digest. + + ***********************************************************************/ + + ubyte[] binaryDigest (ubyte[] buf = null) + { + auto block = blockSize(); + uint i = bytes & (block-1); + + if (i < block-addSize) + padMessage (buffer[i..block-addSize]); + else + { + padMessage (buffer[i..block]); + transform (buffer); + buffer[] = 0; + } + + padLength (buffer[block-addSize..block], bytes); + transform (buffer); + + extend (); + + if (buf.length < digestSize()) + buf.length = digestSize(); + + createDigest (buf); + + reset (); + return buf; + } + + /*********************************************************************** + + Converts 8 bit to 32 bit Little Endian + + Params: + input = the source array + output = the destination array + + Remarks: + Converts an array of ubyte[] into uint[] in Little Endian byte order. + + ***********************************************************************/ + + static protected final void littleEndian32(ubyte[] input, uint[] output) + { + assert(output.length == input.length/4); + output[] = cast(uint[]) input; + + version (BigEndian) + ByteSwap.swap32 (output.ptr, output.length * uint.sizeof); + } + + /*********************************************************************** + + Converts 8 bit to 32 bit Big Endian + + Params: + input = the source array + output = the destination array + + Remarks: + Converts an array of ubyte[] into uint[] in Big Endian byte order. + + ***********************************************************************/ + + static protected final void bigEndian32(ubyte[] input, uint[] output) + { + assert(output.length == input.length/4); + output[] = cast(uint[]) input; + + version(LittleEndian) + ByteSwap.swap32 (output.ptr, output.length * uint.sizeof); + } + + /*********************************************************************** + + Converts 8 bit to 64 bit Little Endian + + Params: + input = the source array + output = the destination array + + Remarks: + Converts an array of ubyte[] into ulong[] in Little Endian byte order. + + ***********************************************************************/ + + static protected final void littleEndian64(ubyte[] input, ulong[] output) + { + assert(output.length == input.length/8); + output[] = cast(ulong[]) input; + + version (BigEndian) + ByteSwap.swap64 (output.ptr, output.length * ulong.sizeof); + } + + /*********************************************************************** + + Converts 8 bit to 64 bit Big Endian + + Params: input = the source array + output = the destination array + + Remarks: + Converts an array of ubyte[] into ulong[] in Big Endian byte order. + + ***********************************************************************/ + + static protected final void bigEndian64(ubyte[] input, ulong[] output) + { + assert(output.length == input.length/8); + output[] = cast(ulong[]) input; + + version (LittleEndian) + ByteSwap.swap64 (output.ptr, output.length * ulong.sizeof); + } + + /*********************************************************************** + + Rotate left by n + + Params: + x = the value to rotate + n = the amount to rotate by + + Remarks: + Rotates a 32 bit value by the specified amount. + + ***********************************************************************/ + + static protected final uint rotateLeft(uint x, uint n) + { + /+version (D_InlineAsm_X86) + version (DigitalMars) + { + asm { + naked; + mov ECX,EAX; + mov EAX,4[ESP]; + rol EAX,CL; + ret 4; + } + } + else + return (x << n) | (x >> (32-n)); + else +/ + return (x << n) | (x >> (32-n)); + } +} + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/digest/Sha0.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/digest/Sha0.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,118 @@ +/******************************************************************************* + + copyright: Copyright (c) 2006 Tango. All rights reserved + + license: BSD style: see doc/license.txt for details + + version: Initial release: Feb 2006 + + author: Regan Heath, Oskar Linde + + This module implements the SHA-0 Algorithm described by Secure + Hash Standard, FIPS PUB 180 + +*******************************************************************************/ + +module tango.io.digest.Sha0; + +private import tango.io.digest.Sha01; + +public import tango.io.digest.Digest; + +/******************************************************************************* + +*******************************************************************************/ + +final class Sha0 : Sha01 +{ + /*********************************************************************** + + Construct an Sha0 + + ***********************************************************************/ + + this() { } + + /*********************************************************************** + + ***********************************************************************/ + + final protected override void transform(ubyte[] input) + { + uint A,B,C,D,E,TEMP; + uint[16] W; + uint s; + + bigEndian32(input,W); + + A = context[0]; + B = context[1]; + C = context[2]; + D = context[3]; + E = context[4]; + + for(uint t = 0; t < 80; t++) { + s = t & mask; + if (t >= 16) expand(W,s); + TEMP = rotateLeft(A,5) + f(t,B,C,D) + E + W[s] + K[t/20]; + E = D; D = C; C = rotateLeft(B,30); B = A; A = TEMP; + } + + context[0] += A; + context[1] += B; + context[2] += C; + context[3] += D; + context[4] += E; + } + + /*********************************************************************** + + ***********************************************************************/ + + final static protected void expand(uint W[], uint s) + { + W[s] = W[(s+13)&mask] ^ W[(s+8)&mask] ^ W[(s+2)&mask] ^ W[s]; + } + + +} + + +/******************************************************************************* + +*******************************************************************************/ + +version (UnitTest) +{ + unittest + { + static char[][] strings = + [ + "", + "abc", + "message digest", + "abcdefghijklmnopqrstuvwxyz", + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", + "12345678901234567890123456789012345678901234567890123456789012345678901234567890" + ]; + + static char[][] results = + [ + "f96cea198ad1dd5617ac084a3d92c6107708c0ef", + "0164b8a914cd2a5e74c4f7ff082c4d97f1edf880", + "c1b0f222d150ebb9aa36a40cafdc8bcbed830b14", + "b40ce07a430cfd3c033039b9fe9afec95dc1bdcd", + "79e966f7a3a990df33e40e3d7f8f18d2caebadfa", + "4aa29d14d171522ece47bee8957e35a41f3e9cff", + ]; + + Sha0 h = new Sha0(); + + foreach (int i, char[] s; strings) + { + h.update(s); + char[] d = h.hexDigest(); + assert(d == results[i],":("~s~")("~d~")!=("~results[i]~")"); + } + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/digest/Sha01.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/digest/Sha01.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,185 @@ +/******************************************************************************* + + copyright: Copyright (c) 2006 Tango. All rights reserved + + license: BSD style: see doc/license.txt for details + + version: Initial release: Feb 2006 + + author: Regan Heath, Oskar Linde + + This module implements common parts of the SHA-0 and SHA-1 algoritms + +*******************************************************************************/ + +module tango.io.digest.Sha01; + +private import tango.core.ByteSwap; + +private import tango.io.digest.MerkleDamgard; + +/******************************************************************************* + +*******************************************************************************/ + +package abstract class Sha01 : MerkleDamgard +{ + protected uint[5] context; + private static const ubyte padChar = 0x80; + package static const uint mask = 0x0000000F; + + /*********************************************************************** + + The digest size of Sha-0 and Sha-1 is 20 bytes + + ***********************************************************************/ + + final uint digestSize() { return 20; } + + /*********************************************************************** + + Initialize the cipher + + Remarks: + Returns the cipher state to it's initial value + + ***********************************************************************/ + + final protected override void reset() + { + super.reset(); + context[] = initial[]; + } + + /*********************************************************************** + + Obtain the digest + + Returns: + the digest + + Remarks: + Returns a digest of the current cipher state, this may be the + final digest, or a digest of the state between calls to update() + + ***********************************************************************/ + + final protected override void createDigest(ubyte[] buf) + { + version (LittleEndian) + ByteSwap.swap32 (context.ptr, context.length * uint.sizeof); + + buf[] = cast(ubyte[]) context; + } + + /*********************************************************************** + + block size + + Returns: + the block size + + Remarks: + Specifies the size (in bytes) of the block of data to pass to + each call to transform(). For SHA0 the blockSize is 64. + + ***********************************************************************/ + + final protected override uint blockSize() { return 64; } + + /*********************************************************************** + + Length padding size + + Returns: + the length padding size + + Remarks: + Specifies the size (in bytes) of the padding which uses the + length of the data which has been ciphered, this padding is + carried out by the padLength method. For SHA0 the addSize is 0. + + ***********************************************************************/ + + final protected override uint addSize() {return 8;} + + /*********************************************************************** + + Pads the cipher data + + Params: + data = a slice of the cipher buffer to fill with padding + + Remarks: + Fills the passed buffer slice with the appropriate padding for + the final call to transform(). This padding will fill the cipher + buffer up to blockSize()-addSize(). + + ***********************************************************************/ + + final protected override void padMessage(ubyte[] data) + { + data[0] = padChar; + data[1..$] = 0; + } + + /*********************************************************************** + + Performs the length padding + + Params: + data = the slice of the cipher buffer to fill with padding + length = the length of the data which has been ciphered + + Remarks: + Fills the passed buffer slice with addSize() bytes of padding + based on the length in bytes of the input data which has been + ciphered. + + ***********************************************************************/ + + final protected override void padLength(ubyte[] data, ulong length) + { + length <<= 3; + for(int j = data.length-1; j >= 0; j--) + data[$-j-1] = cast(ubyte) (length >> j*data.length); + } + + + /*********************************************************************** + + ***********************************************************************/ + + protected static uint f(uint t, uint B, uint C, uint D) + { + if (t < 20) return (B & C) | ((~B) & D); + else if (t < 40) return B ^ C ^ D; + else if (t < 60) return (B & C) | (B & D) | (C & D); + else return B ^ C ^ D; + } + + /*********************************************************************** + + ***********************************************************************/ + + private static const uint[] K = + [ + 0x5A827999, + 0x6ED9EBA1, + 0x8F1BBCDC, + 0xCA62C1D6 + ]; + + /*********************************************************************** + + ***********************************************************************/ + + private static const uint[5] initial = + [ + 0x67452301, + 0xEFCDAB89, + 0x98BADCFE, + 0x10325476, + 0xC3D2E1F0 + ]; +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/digest/Sha1.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/digest/Sha1.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,135 @@ +/******************************************************************************* + + copyright: Copyright (c) 2006 Tango. All rights reserved + + license: BSD style: see doc/license.txt for details + + version: Initial release: Feb 2006 + + author: Regan Heath, Oskar Linde + + This module implements the SHA-1 Algorithm described by Secure Hash + Standard, FIPS PUB 180-1, and RFC 3174 US Secure Hash Algorithm 1 + (SHA1). D. Eastlake 3rd, P. Jones. September 2001. + +*******************************************************************************/ + +module tango.io.digest.Sha1; + +private import tango.io.digest.Sha01; + +public import tango.io.digest.Digest; + +/******************************************************************************* + +*******************************************************************************/ + +final class Sha1 : Sha01 +{ + /*********************************************************************** + + Construct a Sha1 hash algorithm context + + ***********************************************************************/ + + this() { } + + /*********************************************************************** + + Performs the cipher on a block of data + + Params: + data = the block of data to cipher + + Remarks: + The actual cipher algorithm is carried out by this method on + the passed block of data. This method is called for every + blockSize() bytes of input data and once more with the remaining + data padded to blockSize(). + + ***********************************************************************/ + + final protected override void transform(ubyte[] input) + { + uint A,B,C,D,E,TEMP; + uint[16] W; + uint s; + + bigEndian32(input,W); + A = context[0]; + B = context[1]; + C = context[2]; + D = context[3]; + E = context[4]; + + for(uint t = 0; t < 80; t++) { + s = t & mask; + if (t >= 16) + expand(W,s); + TEMP = rotateLeft(A,5) + f(t,B,C,D) + E + W[s] + K[t/20]; + E = D; D = C; C = rotateLeft(B,30); B = A; A = TEMP; + } + + context[0] += A; + context[1] += B; + context[2] += C; + context[3] += D; + context[4] += E; + } + + /*********************************************************************** + + ***********************************************************************/ + + final static void expand (uint[] W, uint s) + { + W[s] = rotateLeft(W[(s+13)&mask] ^ W[(s+8)&mask] ^ W[(s+2)&mask] ^ W[s],1); + } + +} + + +/******************************************************************************* + +*******************************************************************************/ + +version (UnitTest) +{ + unittest + { + static char[][] strings = + [ + "abc", + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + "a", + "0123456701234567012345670123456701234567012345670123456701234567" + ]; + + static char[][] results = + [ + "a9993e364706816aba3e25717850c26c9cd0d89d", + "84983e441c3bd26ebaae4aa1f95129e5e54670f1", + "34aa973cd4c4daa4f61eeb2bdbad27316534016f", + "dea356a2cddd90c7a7ecedc5ebb563934f460452" + ]; + + static int[] repeat = + [ + 1, + 1, + 1000000, + 10 + ]; + + Sha1 h = new Sha1(); + + foreach (int i, char[] s; strings) + { + for(int r = 0; r < repeat[i]; r++) + h.update(s); + + char[] d = h.hexDigest(); + assert(d == results[i],":("~s~")("~d~")!=("~results[i]~")"); + } + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/digest/Sha256.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/digest/Sha256.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,349 @@ +/******************************************************************************* + + copyright: Copyright (c) 2006 Tango. All rights reserved + + license: BSD style: see doc/license.txt for details + + version: Initial release: Feb 2006 + + author: Regan Heath, Oskar Linde + + This module implements the SHA-256 Algorithm described by Secure + Hash Standard, FIPS PUB 180-2 + +*******************************************************************************/ + +module tango.io.digest.Sha256; + +private import tango.core.ByteSwap; + +public import tango.io.digest.Digest; + +private import tango.io.digest.MerkleDamgard; + +/******************************************************************************* + +*******************************************************************************/ + +final class Sha256 : MerkleDamgard +{ + private uint[8] context; + private const uint padChar = 0x80; + + /*********************************************************************** + + Construct an Sha256 + + ***********************************************************************/ + + this() { } + + /*********************************************************************** + + Initialize the cipher + + Remarks: + Returns the cipher state to it's initial value + + ***********************************************************************/ + + protected override void reset() + { + super.reset(); + context[] = initial[]; + } + + /*********************************************************************** + + Obtain the digest + + Remarks: + Returns a digest of the current cipher state, this may be the + final digest, or a digest of the state between calls to update() + + ***********************************************************************/ + + protected override void createDigest (ubyte[] buf) + { + version (LittleEndian) + ByteSwap.swap32 (context.ptr, context.length * uint.sizeof); + + buf[] = cast(ubyte[]) context; + } + + /*********************************************************************** + + The digest size of Sha-256 is 32 bytes + + ***********************************************************************/ + + uint digestSize() { return 32; } + + /*********************************************************************** + + Cipher block size + + Returns: + the block size + + Remarks: + Specifies the size (in bytes) of the block of data to pass to + each call to transform(). For SHA256 the blockSize is 64. + + ***********************************************************************/ + + protected override uint blockSize() { return 64; } + + /*********************************************************************** + + Length padding size + + Returns: + the length padding size + + Remarks: + Specifies the size (in bytes) of the padding which uses the + length of the data which has been ciphered, this padding is + carried out by the padLength method. For SHA256 the addSize is 8. + + ***********************************************************************/ + + protected override uint addSize() { return 8; } + + /*********************************************************************** + + Pads the cipher data + + Params: + data = a slice of the cipher buffer to fill with padding + + Remarks: + Fills the passed buffer slice with the appropriate padding for + the final call to transform(). This padding will fill the cipher + buffer up to blockSize()-addSize(). + + ***********************************************************************/ + + protected override void padMessage(ubyte[] data) + { + data[0] = padChar; + data[1..$] = 0; + } + + /*********************************************************************** + + Performs the length padding + + Params: + data = the slice of the cipher buffer to fill with padding + length = the length of the data which has been ciphered + + Remarks: + Fills the passed buffer slice with addSize() bytes of padding + based on the length in bytes of the input data which has been + ciphered. + + ***********************************************************************/ + + protected override void padLength(ubyte[] data, ulong length) + { + length <<= 3; + for(int j = data.length-1; j >= 0; j--) + data[$-j-1] = cast(ubyte) (length >> j*8); + } + + /*********************************************************************** + + Performs the cipher on a block of data + + Params: + data = the block of data to cipher + + Remarks: + The actual cipher algorithm is carried out by this method on + the passed block of data. This method is called for every + blockSize() bytes of input data and once more with the remaining + data padded to blockSize(). + + ***********************************************************************/ + + protected override void transform(ubyte[] input) + { + uint[64] W; + uint a,b,c,d,e,f,g,h; + uint j,t1,t2; + + a = context[0]; + b = context[1]; + c = context[2]; + d = context[3]; + e = context[4]; + f = context[5]; + g = context[6]; + h = context[7]; + + bigEndian32(input,W[0..16]); + for(j = 16; j < 64; j++) { + W[j] = mix1(W[j-2]) + W[j-7] + mix0(W[j-15]) + W[j-16]; + } + + for(j = 0; j < 64; j++) { + t1 = h + sum1(e) + Ch(e,f,g) + K[j] + W[j]; + t2 = sum0(a) + Maj(a,b,c); + h = g; + g = f; + f = e; + e = d + t1; + d = c; + c = b; + b = a; + a = t1 + t2; + } + + context[0] += a; + context[1] += b; + context[2] += c; + context[3] += d; + context[4] += e; + context[5] += f; + context[6] += g; + context[7] += h; + } + + /*********************************************************************** + + ***********************************************************************/ + + private static uint Ch(uint x, uint y, uint z) + { + return (x&y)^(~x&z); + } + + /*********************************************************************** + + ***********************************************************************/ + + private static uint Maj(uint x, uint y, uint z) + { + return (x&y)^(x&z)^(y&z); + } + + /*********************************************************************** + + ***********************************************************************/ + + private static uint sum0(uint x) + { + return rotateRight(x,2)^rotateRight(x,13)^rotateRight(x,22); + } + + /*********************************************************************** + + ***********************************************************************/ + + private static uint sum1(uint x) + { + return rotateRight(x,6)^rotateRight(x,11)^rotateRight(x,25); + } + + /*********************************************************************** + + ***********************************************************************/ + + private static uint mix0(uint x) + { + return rotateRight(x,7)^rotateRight(x,18)^shiftRight(x,3); + } + + /*********************************************************************** + + ***********************************************************************/ + + private static uint mix1(uint x) + { + return rotateRight(x,17)^rotateRight(x,19)^shiftRight(x,10); + } + + /*********************************************************************** + + ***********************************************************************/ + + private static uint rotateRight(uint x, uint n) + { + return (x >> n) | (x << (32-n)); + } + + /*********************************************************************** + + ***********************************************************************/ + + private static uint shiftRight(uint x, uint n) + { + return x >> n; + } +} + + +/******************************************************************************* + +*******************************************************************************/ + +private static uint[] K = +[ + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 +]; + +/******************************************************************************* + +*******************************************************************************/ + +private static const uint[8] initial = +[ + 0x6a09e667, + 0xbb67ae85, + 0x3c6ef372, + 0xa54ff53a, + 0x510e527f, + 0x9b05688c, + 0x1f83d9ab, + 0x5be0cd19 +]; + +/******************************************************************************* + +*******************************************************************************/ + +version (UnitTest) +{ + unittest + { + static char[][] strings = + [ + "abc", + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" + ]; + + static char[][] results = + [ + "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad", + "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1" + ]; + + Sha256 h = new Sha256(); + + foreach (int i, char[] s; strings) + { + h.update(s); + char[] d = h.hexDigest(); + assert(d == results[i],"Cipher:("~s~")("~d~")!=("~results[i]~")"); + } + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/digest/Sha512.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/digest/Sha512.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,360 @@ +/******************************************************************************* + + copyright: Copyright (c) 2006 Tango. All rights reserved + + license: BSD style: see doc/license.txt for details + + version: Initial release: Feb 2006 + + author: Regan Heath, Oskar Linde + + This module implements the SHA-512 Algorithm described by Secure + Hash Standard, FIPS PUB 180-2 + +*******************************************************************************/ + +module tango.io.digest.Sha512; + +private import tango.core.ByteSwap; + +private import tango.io.digest.MerkleDamgard; + +public import tango.io.digest.Digest; + +/******************************************************************************* + +*******************************************************************************/ + +final class Sha512 : MerkleDamgard +{ + private ulong[8] context; + private const uint padChar = 0x80; + + /*********************************************************************** + + Construct a Sha512 hash algorithm context + + ***********************************************************************/ + + this() { } + + /*********************************************************************** + + ***********************************************************************/ + + protected override void createDigest(ubyte[] buf) + { + version (LittleEndian) + ByteSwap.swap64(context.ptr, context.length * ulong.sizeof); + + buf[] = cast(ubyte[]) context[]; + } + + /*********************************************************************** + + The digest size of Sha-512 is 64 bytes + + ***********************************************************************/ + + override uint digestSize() {return 64;} + + /*********************************************************************** + + Initialize the cipher + + Remarks: + Returns the cipher state to it's initial value + + ***********************************************************************/ + + protected override void reset() + { + super.reset(); + context[] = initial[]; + } + + /*********************************************************************** + + Cipher block size + + Returns: + the block size + + Remarks: + Specifies the size (in bytes) of the block of data to pass to + each call to transform(). For SHA512 the blockSize is 128. + + ***********************************************************************/ + + protected override uint blockSize() { return 128; } + + /*********************************************************************** + + Length padding size + + Returns: + the length padding size + + Remarks: + Specifies the size (in bytes) of the padding which uses the + length of the data which has been ciphered, this padding is + carried out by the padLength method. For SHA512 the addSize is 16. + + ***********************************************************************/ + + protected override uint addSize() { return 16; } + + /*********************************************************************** + + Pads the cipher data + + Params: + data = a slice of the cipher buffer to fill with padding + + Remarks: + Fills the passed buffer slice with the appropriate padding for + the final call to transform(). This padding will fill the cipher + buffer up to blockSize()-addSize(). + + ***********************************************************************/ + + protected override void padMessage(ubyte[] data) + { + data[0] = padChar; + data[1..$] = 0; + } + + /*********************************************************************** + + Performs the length padding + + Params: + data = the slice of the cipher buffer to fill with padding + length = the length of the data which has been ciphered + + Remarks: + Fills the passed buffer slice with addSize() bytes of padding + based on the length in bytes of the input data which has been + ciphered. + + ***********************************************************************/ + + protected override void padLength(ubyte[] data, ulong length) + { + length <<= 3; + for(int j = data.length-1; j >= 0; j--) { + data[data.length-j-1] = cast(ubyte) (length >> j*8); + } + data[0..8] = 0; + } + + /*********************************************************************** + + Performs the cipher on a block of data + + Params: + data = the block of data to cipher + + Remarks: + The actual cipher algorithm is carried out by this method on + the passed block of data. This method is called for every + blockSize() bytes of input data and once more with the remaining + data padded to blockSize(). + + ***********************************************************************/ + + protected override void transform(ubyte[] input) + { + ulong[80] W; + ulong a,b,c,d,e,f,g,h; + ulong t1,t2; + uint j; + + a = context[0]; + b = context[1]; + c = context[2]; + d = context[3]; + e = context[4]; + f = context[5]; + g = context[6]; + h = context[7]; + + bigEndian64(input,W[0..16]); + for(j = 16; j < 80; j++) { + W[j] = mix1(W[j-2]) + W[j-7] + mix0(W[j-15]) + W[j-16]; + } + + for(j = 0; j < 80; j++) { + t1 = h + sum1(e) + Ch(e,f,g) + K[j] + W[j]; + t2 = sum0(a) + Maj(a,b,c); + h = g; + g = f; + f = e; + e = d + t1; + d = c; + c = b; + b = a; + a = t1 + t2; + } + + context[0] += a; + context[1] += b; + context[2] += c; + context[3] += d; + context[4] += e; + context[5] += f; + context[6] += g; + context[7] += h; + } + + /*********************************************************************** + + ***********************************************************************/ + + private static ulong Ch(ulong x, ulong y, ulong z) + { + return (x&y)^(~x&z); + } + + /*********************************************************************** + + ***********************************************************************/ + + private static ulong Maj(ulong x, ulong y, ulong z) + { + return (x&y)^(x&z)^(y&z); + } + + /*********************************************************************** + + ***********************************************************************/ + + private static ulong sum0(ulong x) + { + return rotateRight(x,28)^rotateRight(x,34)^rotateRight(x,39); + } + + /*********************************************************************** + + ***********************************************************************/ + + private static ulong sum1(ulong x) + { + return rotateRight(x,14)^rotateRight(x,18)^rotateRight(x,41); + } + + /*********************************************************************** + + ***********************************************************************/ + + private static ulong mix0(ulong x) + { + return rotateRight(x,1)^rotateRight(x,8)^shiftRight(x,7); + } + + /*********************************************************************** + + ***********************************************************************/ + + private static ulong mix1(ulong x) + { + return rotateRight(x,19)^rotateRight(x,61)^shiftRight(x,6); + } + + /*********************************************************************** + + ***********************************************************************/ + + private static ulong rotateRight(ulong x, uint n) + { + return (x >> n) | (x << (64-n)); + } + + /*********************************************************************** + + ***********************************************************************/ + + private static ulong shiftRight(ulong x, uint n) + { + return x >> n; + } + +} + +/******************************************************************************* + +*******************************************************************************/ + +private static const ulong[] K = +[ + 0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc, + 0x3956c25bf348b538, 0x59f111f1b605d019, 0x923f82a4af194f9b, 0xab1c5ed5da6d8118, + 0xd807aa98a3030242, 0x12835b0145706fbe, 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2, + 0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, 0xc19bf174cf692694, + 0xe49b69c19ef14ad2, 0xefbe4786384f25e3, 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65, + 0x2de92c6f592b0275, 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5, + 0x983e5152ee66dfab, 0xa831c66d2db43210, 0xb00327c898fb213f, 0xbf597fc7beef0ee4, + 0xc6e00bf33da88fc2, 0xd5a79147930aa725, 0x06ca6351e003826f, 0x142929670a0e6e70, + 0x27b70a8546d22ffc, 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df, + 0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, 0x92722c851482353b, + 0xa2bfe8a14cf10364, 0xa81a664bbc423001, 0xc24b8b70d0f89791, 0xc76c51a30654be30, + 0xd192e819d6ef5218, 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8, + 0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8, + 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3, + 0x748f82ee5defb2fc, 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec, + 0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, 0xc67178f2e372532b, + 0xca273eceea26619c, 0xd186b8c721c0c207, 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178, + 0x06f067aa72176fba, 0x0a637dc5a2c898a6, 0x113f9804bef90dae, 0x1b710b35131c471b, + 0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c, + 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817 +]; + +/******************************************************************************* + +*******************************************************************************/ + +private static const ulong[8] initial = +[ + 0x6a09e667f3bcc908, + 0xbb67ae8584caa73b, + 0x3c6ef372fe94f82b, + 0xa54ff53a5f1d36f1, + 0x510e527fade682d1, + 0x9b05688c2b3e6c1f, + 0x1f83d9abfb41bd6b, + 0x5be0cd19137e2179 +]; + + +/******************************************************************************* + +*******************************************************************************/ + +version (UnitTest) +{ + unittest + { + static char[][] strings = + [ + "", + "abc", + "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" + ]; + + static char[][] results = + [ + "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e", + "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f", + "8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909" + ]; + + Sha512 h = new Sha512; + + foreach (int i, char[] s; strings) + { + h.update(cast(ubyte[])s); + char[] d = h.hexDigest(); + assert(d == results[i],"DigestTransform:("~s~")("~d~")!=("~results[i]~")"); + } + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/digest/Tiger.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/digest/Tiger.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,896 @@ +/******************************************************************************* + + copyright: Copyright (c) 2006 Tango. All rights reserved + + license: BSD style: see doc/license.txt for details + + version: Initial release: Feb 2006 + + author: Regan Heath, Oskar Linde + + This module implements the Tiger algorithm by Ross Anderson and Eli + Biham. + +*******************************************************************************/ + +module tango.io.digest.Tiger; + +private import tango.core.ByteSwap; + +private import tango.io.digest.MerkleDamgard; + +public import tango.io.digest.Digest; + +/******************************************************************************* + +*******************************************************************************/ + +final class Tiger : MerkleDamgard +{ + private ulong[3] context; + private uint npass = 3; + private const uint padChar = 0x01; + + /*********************************************************************** + + ***********************************************************************/ + + private static const ulong[3] initial = + [ + 0x0123456789ABCDEF, + 0xFEDCBA9876543210, + 0xF096A5B4C3B2E187 + ]; + + /*********************************************************************** + + Construct an Tiger + + ***********************************************************************/ + + this() { } + + /*********************************************************************** + + The size of a tiger digest is 24 bytes + + ***********************************************************************/ + + override uint digestSize() {return 24;} + + + /*********************************************************************** + + Initialize the cipher + + Remarks: + Returns the cipher state to it's initial value + + ***********************************************************************/ + + override void reset() + { + super.reset(); + context[] = initial[]; + } + + /*********************************************************************** + + Obtain the digest + + Returns: + the digest + + Remarks: + Returns a digest of the current cipher state, this may be the + final digest, or a digest of the state between calls to update() + + ***********************************************************************/ + + override void createDigest(ubyte[] buf) + { + version (LittleEndian) + ByteSwap.swap64 (context.ptr, context.length * ulong.sizeof); + buf[] = cast(ubyte[]) context; + } + + /*********************************************************************** + + Get the number of passes being performed + + Returns: + the number of passes + + Remarks: + The Tiger algorithm may perform an arbitrary number of passes + the minimum recommended number is 3 and this number should be + quite secure however the "ultra-cautious" may wish to increase + this number. + + ***********************************************************************/ + + uint passes() + { + return npass; + } + + /*********************************************************************** + + Set the number of passes to be performed + + Params: + n = the number of passes to perform + + Remarks: + The Tiger algorithm may perform an arbitrary number of passes + the minimum recommended number is 3 and this number should be + quite secure however the "ultra-cautious" may wish to increase + this number. + + ***********************************************************************/ + + void passes(uint n) + { + if (n < 3) return ; + npass = n; + } + + /*********************************************************************** + + block size + + Returns: + the block size + + Remarks: + Specifies the size (in bytes) of the block of data to pass to + each call to transform(). For Tiger the blockSize is 64. + + ***********************************************************************/ + + protected override uint blockSize() { return 64; } + + /*********************************************************************** + + Length padding size + + Returns: + the length padding size + + Remarks: + Specifies the size (in bytes) of the padding which uses the + length of the data which has been ciphered, this padding is + carried out by the padLength method. For Tiger the addSize is 8. + + ***********************************************************************/ + + protected uint addSize() { return 8; } + + /*********************************************************************** + + Pads the cipher data + + Params: + data = a slice of the cipher buffer to fill with padding + + Remarks: + Fills the passed buffer slice with the appropriate padding for + the final call to transform(). This padding will fill the cipher + buffer up to blockSize()-addSize(). + + ***********************************************************************/ + + protected override void padMessage(ubyte[] at) + { + at[0] = padChar; + at[1..at.length] = 0; + } + + /*********************************************************************** + + Performs the length padding + + Params: + data = the slice of the cipher buffer to fill with padding + length = the length of the data which has been ciphered + + Remarks: + Fills the passed buffer slice with addSize() bytes of padding + based on the length in bytes of the input data which has been + ciphered. + + ***********************************************************************/ + + protected override void padLength(ubyte[] at, ulong length) + { + length <<= 3; + littleEndian64((cast(ubyte*)&length)[0..8],cast(ulong[]) at); + } + + /*********************************************************************** + + Performs the cipher on a block of data + + Params: + data = the block of data to cipher + + Remarks: + The actual cipher algorithm is carried out by this method on + the passed block of data. This method is called for every + blockSize() bytes of input data and once more with the remaining + data padded to blockSize(). + + ***********************************************************************/ + + protected override void transform(ubyte[] input) + { + ulong tmpa,a,b,c; + ulong[8] x; + uint i; + + littleEndian64(input,x); + + a = context[0]; + b = context[1]; + c = context[2]; + + for(i = 0; i < npass; i++) { + if (i > 0) keySchedule(x); + pass(a,b,c,x,(i==0)?5:(i==1)?7:9); + tmpa = a; a = c; c = b; b = tmpa; + } + + context[0] = a ^ context[0]; + context[1] = b - context[1]; + context[2] = c + context[2]; + + x[] = 0; + } + + /*********************************************************************** + + ***********************************************************************/ + + private static ubyte getByte(ulong c, uint b1, uint b2 = 0) + { + return cast(ubyte) (c >> (b1*8) >> (b2*8)); + } + + /*********************************************************************** + + ***********************************************************************/ + + private static void round(inout ulong a, inout ulong b, inout ulong c, ulong x, ulong mul) + { + c ^= x; + a -= t1[getByte(c,0)] ^ t2[getByte(c,2)] ^ t3[getByte(c,4)] ^ t4[getByte(c,4,2)]; + b += t4[getByte(c,1)] ^ t3[getByte(c,3)] ^ t2[getByte(c,4,1)] ^ t1[getByte(c,4,3)]; + b *= mul; + } + + /*********************************************************************** + + ***********************************************************************/ + + private static void pass(inout ulong a, inout ulong b, inout ulong c, ulong[8] x, ulong mul) + { + round(a,b,c,x[0],mul); + round(b,c,a,x[1],mul); + round(c,a,b,x[2],mul); + round(a,b,c,x[3],mul); + round(b,c,a,x[4],mul); + round(c,a,b,x[5],mul); + round(a,b,c,x[6],mul); + round(b,c,a,x[7],mul); + } + + /*********************************************************************** + + ***********************************************************************/ + + private static void keySchedule(ulong[8] x) + { + x[0] -= x[7] ^ 0xA5A5A5A5A5A5A5A5; + x[1] ^= x[0]; + x[2] += x[1]; + x[3] -= x[2] ^ ((~x[1])<<19); + x[4] ^= x[3]; + x[5] += x[4]; + x[6] -= x[5] ^ ((~x[4])>>23); + x[7] ^= x[6]; + x[0] += x[7]; + x[1] -= x[0] ^ ((~x[7])<<19); + x[2] ^= x[1]; + x[3] += x[2]; + x[4] -= x[3] ^ ((~x[2])>>23); + x[5] ^= x[4]; + x[6] += x[5]; + x[7] -= x[6] ^ 0x0123456789ABCDEF; + } + + /*********************************************************************** + + ***********************************************************************/ + + private static ulong[] t1() { return table[0..256]; } + private static ulong[] t2() { return table[256..512]; } + private static ulong[] t3() { return table[512..768]; } + private static ulong[] t4() { return table[768..1024]; } +} + + +/******************************************************************************* + +*******************************************************************************/ + +private static ulong[1024] table = +[ + 0x02aab17cf7e90c5e /* 0 */, 0xac424b03e243a8ec /* 1 */, + 0x72cd5be30dd5fcd3 /* 2 */, 0x6d019b93f6f97f3a /* 3 */, + 0xcd9978ffd21f9193 /* 4 */, 0x7573a1c9708029e2 /* 5 */, + 0xb164326b922a83c3 /* 6 */, 0x46883eee04915870 /* 7 */, + 0xeaace3057103ece6 /* 8 */, 0xc54169b808a3535c /* 9 */, + 0x4ce754918ddec47c /* 10 */, 0x0aa2f4dfdc0df40c /* 11 */, + 0x10b76f18a74dbefa /* 12 */, 0xc6ccb6235ad1ab6a /* 13 */, + 0x13726121572fe2ff /* 14 */, 0x1a488c6f199d921e /* 15 */, + 0x4bc9f9f4da0007ca /* 16 */, 0x26f5e6f6e85241c7 /* 17 */, + 0x859079dbea5947b6 /* 18 */, 0x4f1885c5c99e8c92 /* 19 */, + 0xd78e761ea96f864b /* 20 */, 0x8e36428c52b5c17d /* 21 */, + 0x69cf6827373063c1 /* 22 */, 0xb607c93d9bb4c56e /* 23 */, + 0x7d820e760e76b5ea /* 24 */, 0x645c9cc6f07fdc42 /* 25 */, + 0xbf38a078243342e0 /* 26 */, 0x5f6b343c9d2e7d04 /* 27 */, + 0xf2c28aeb600b0ec6 /* 28 */, 0x6c0ed85f7254bcac /* 29 */, + 0x71592281a4db4fe5 /* 30 */, 0x1967fa69ce0fed9f /* 31 */, + 0xfd5293f8b96545db /* 32 */, 0xc879e9d7f2a7600b /* 33 */, + 0x860248920193194e /* 34 */, 0xa4f9533b2d9cc0b3 /* 35 */, + 0x9053836c15957613 /* 36 */, 0xdb6dcf8afc357bf1 /* 37 */, + 0x18beea7a7a370f57 /* 38 */, 0x037117ca50b99066 /* 39 */, + 0x6ab30a9774424a35 /* 40 */, 0xf4e92f02e325249b /* 41 */, + 0x7739db07061ccae1 /* 42 */, 0xd8f3b49ceca42a05 /* 43 */, + 0xbd56be3f51382f73 /* 44 */, 0x45faed5843b0bb28 /* 45 */, + 0x1c813d5c11bf1f83 /* 46 */, 0x8af0e4b6d75fa169 /* 47 */, + 0x33ee18a487ad9999 /* 48 */, 0x3c26e8eab1c94410 /* 49 */, + 0xb510102bc0a822f9 /* 50 */, 0x141eef310ce6123b /* 51 */, + 0xfc65b90059ddb154 /* 52 */, 0xe0158640c5e0e607 /* 53 */, + 0x884e079826c3a3cf /* 54 */, 0x930d0d9523c535fd /* 55 */, + 0x35638d754e9a2b00 /* 56 */, 0x4085fccf40469dd5 /* 57 */, + 0xc4b17ad28be23a4c /* 58 */, 0xcab2f0fc6a3e6a2e /* 59 */, + 0x2860971a6b943fcd /* 60 */, 0x3dde6ee212e30446 /* 61 */, + 0x6222f32ae01765ae /* 62 */, 0x5d550bb5478308fe /* 63 */, + 0xa9efa98da0eda22a /* 64 */, 0xc351a71686c40da7 /* 65 */, + 0x1105586d9c867c84 /* 66 */, 0xdcffee85fda22853 /* 67 */, + 0xccfbd0262c5eef76 /* 68 */, 0xbaf294cb8990d201 /* 69 */, + 0xe69464f52afad975 /* 70 */, 0x94b013afdf133e14 /* 71 */, + 0x06a7d1a32823c958 /* 72 */, 0x6f95fe5130f61119 /* 73 */, + 0xd92ab34e462c06c0 /* 74 */, 0xed7bde33887c71d2 /* 75 */, + 0x79746d6e6518393e /* 76 */, 0x5ba419385d713329 /* 77 */, + 0x7c1ba6b948a97564 /* 78 */, 0x31987c197bfdac67 /* 79 */, + 0xde6c23c44b053d02 /* 80 */, 0x581c49fed002d64d /* 81 */, + 0xdd474d6338261571 /* 82 */, 0xaa4546c3e473d062 /* 83 */, + 0x928fce349455f860 /* 84 */, 0x48161bbacaab94d9 /* 85 */, + 0x63912430770e6f68 /* 86 */, 0x6ec8a5e602c6641c /* 87 */, + 0x87282515337ddd2b /* 88 */, 0x2cda6b42034b701b /* 89 */, + 0xb03d37c181cb096d /* 90 */, 0xe108438266c71c6f /* 91 */, + 0x2b3180c7eb51b255 /* 92 */, 0xdf92b82f96c08bbc /* 93 */, + 0x5c68c8c0a632f3ba /* 94 */, 0x5504cc861c3d0556 /* 95 */, + 0xabbfa4e55fb26b8f /* 96 */, 0x41848b0ab3baceb4 /* 97 */, + 0xb334a273aa445d32 /* 98 */, 0xbca696f0a85ad881 /* 99 */, + 0x24f6ec65b528d56c /* 100 */, 0x0ce1512e90f4524a /* 101 */, + 0x4e9dd79d5506d35a /* 102 */, 0x258905fac6ce9779 /* 103 */, + 0x2019295b3e109b33 /* 104 */, 0xf8a9478b73a054cc /* 105 */, + 0x2924f2f934417eb0 /* 106 */, 0x3993357d536d1bc4 /* 107 */, + 0x38a81ac21db6ff8b /* 108 */, 0x47c4fbf17d6016bf /* 109 */, + 0x1e0faadd7667e3f5 /* 110 */, 0x7abcff62938beb96 /* 111 */, + 0xa78dad948fc179c9 /* 112 */, 0x8f1f98b72911e50d /* 113 */, + 0x61e48eae27121a91 /* 114 */, 0x4d62f7ad31859808 /* 115 */, + 0xeceba345ef5ceaeb /* 116 */, 0xf5ceb25ebc9684ce /* 117 */, + 0xf633e20cb7f76221 /* 118 */, 0xa32cdf06ab8293e4 /* 119 */, + 0x985a202ca5ee2ca4 /* 120 */, 0xcf0b8447cc8a8fb1 /* 121 */, + 0x9f765244979859a3 /* 122 */, 0xa8d516b1a1240017 /* 123 */, + 0x0bd7ba3ebb5dc726 /* 124 */, 0xe54bca55b86adb39 /* 125 */, + 0x1d7a3afd6c478063 /* 126 */, 0x519ec608e7669edd /* 127 */, + 0x0e5715a2d149aa23 /* 128 */, 0x177d4571848ff194 /* 129 */, + 0xeeb55f3241014c22 /* 130 */, 0x0f5e5ca13a6e2ec2 /* 131 */, + 0x8029927b75f5c361 /* 132 */, 0xad139fabc3d6e436 /* 133 */, + 0x0d5df1a94ccf402f /* 134 */, 0x3e8bd948bea5dfc8 /* 135 */, + 0xa5a0d357bd3ff77e /* 136 */, 0xa2d12e251f74f645 /* 137 */, + 0x66fd9e525e81a082 /* 138 */, 0x2e0c90ce7f687a49 /* 139 */, + 0xc2e8bcbeba973bc5 /* 140 */, 0x000001bce509745f /* 141 */, + 0x423777bbe6dab3d6 /* 142 */, 0xd1661c7eaef06eb5 /* 143 */, + 0xa1781f354daacfd8 /* 144 */, 0x2d11284a2b16affc /* 145 */, + 0xf1fc4f67fa891d1f /* 146 */, 0x73ecc25dcb920ada /* 147 */, + 0xae610c22c2a12651 /* 148 */, 0x96e0a810d356b78a /* 149 */, + 0x5a9a381f2fe7870f /* 150 */, 0xd5ad62ede94e5530 /* 151 */, + 0xd225e5e8368d1427 /* 152 */, 0x65977b70c7af4631 /* 153 */, + 0x99f889b2de39d74f /* 154 */, 0x233f30bf54e1d143 /* 155 */, + 0x9a9675d3d9a63c97 /* 156 */, 0x5470554ff334f9a8 /* 157 */, + 0x166acb744a4f5688 /* 158 */, 0x70c74caab2e4aead /* 159 */, + 0xf0d091646f294d12 /* 160 */, 0x57b82a89684031d1 /* 161 */, + 0xefd95a5a61be0b6b /* 162 */, 0x2fbd12e969f2f29a /* 163 */, + 0x9bd37013feff9fe8 /* 164 */, 0x3f9b0404d6085a06 /* 165 */, + 0x4940c1f3166cfe15 /* 166 */, 0x09542c4dcdf3defb /* 167 */, + 0xb4c5218385cd5ce3 /* 168 */, 0xc935b7dc4462a641 /* 169 */, + 0x3417f8a68ed3b63f /* 170 */, 0xb80959295b215b40 /* 171 */, + 0xf99cdaef3b8c8572 /* 172 */, 0x018c0614f8fcb95d /* 173 */, + 0x1b14accd1a3acdf3 /* 174 */, 0x84d471f200bb732d /* 175 */, + 0xc1a3110e95e8da16 /* 176 */, 0x430a7220bf1a82b8 /* 177 */, + 0xb77e090d39df210e /* 178 */, 0x5ef4bd9f3cd05e9d /* 179 */, + 0x9d4ff6da7e57a444 /* 180 */, 0xda1d60e183d4a5f8 /* 181 */, + 0xb287c38417998e47 /* 182 */, 0xfe3edc121bb31886 /* 183 */, + 0xc7fe3ccc980ccbef /* 184 */, 0xe46fb590189bfd03 /* 185 */, + 0x3732fd469a4c57dc /* 186 */, 0x7ef700a07cf1ad65 /* 187 */, + 0x59c64468a31d8859 /* 188 */, 0x762fb0b4d45b61f6 /* 189 */, + 0x155baed099047718 /* 190 */, 0x68755e4c3d50baa6 /* 191 */, + 0xe9214e7f22d8b4df /* 192 */, 0x2addbf532eac95f4 /* 193 */, + 0x32ae3909b4bd0109 /* 194 */, 0x834df537b08e3450 /* 195 */, + 0xfa209da84220728d /* 196 */, 0x9e691d9b9efe23f7 /* 197 */, + 0x0446d288c4ae8d7f /* 198 */, 0x7b4cc524e169785b /* 199 */, + 0x21d87f0135ca1385 /* 200 */, 0xcebb400f137b8aa5 /* 201 */, + 0x272e2b66580796be /* 202 */, 0x3612264125c2b0de /* 203 */, + 0x057702bdad1efbb2 /* 204 */, 0xd4babb8eacf84be9 /* 205 */, + 0x91583139641bc67b /* 206 */, 0x8bdc2de08036e024 /* 207 */, + 0x603c8156f49f68ed /* 208 */, 0xf7d236f7dbef5111 /* 209 */, + 0x9727c4598ad21e80 /* 210 */, 0xa08a0896670a5fd7 /* 211 */, + 0xcb4a8f4309eba9cb /* 212 */, 0x81af564b0f7036a1 /* 213 */, + 0xc0b99aa778199abd /* 214 */, 0x959f1ec83fc8e952 /* 215 */, + 0x8c505077794a81b9 /* 216 */, 0x3acaaf8f056338f0 /* 217 */, + 0x07b43f50627a6778 /* 218 */, 0x4a44ab49f5eccc77 /* 219 */, + 0x3bc3d6e4b679ee98 /* 220 */, 0x9cc0d4d1cf14108c /* 221 */, + 0x4406c00b206bc8a0 /* 222 */, 0x82a18854c8d72d89 /* 223 */, + 0x67e366b35c3c432c /* 224 */, 0xb923dd61102b37f2 /* 225 */, + 0x56ab2779d884271d /* 226 */, 0xbe83e1b0ff1525af /* 227 */, + 0xfb7c65d4217e49a9 /* 228 */, 0x6bdbe0e76d48e7d4 /* 229 */, + 0x08df828745d9179e /* 230 */, 0x22ea6a9add53bd34 /* 231 */, + 0xe36e141c5622200a /* 232 */, 0x7f805d1b8cb750ee /* 233 */, + 0xafe5c7a59f58e837 /* 234 */, 0xe27f996a4fb1c23c /* 235 */, + 0xd3867dfb0775f0d0 /* 236 */, 0xd0e673de6e88891a /* 237 */, + 0x123aeb9eafb86c25 /* 238 */, 0x30f1d5d5c145b895 /* 239 */, + 0xbb434a2dee7269e7 /* 240 */, 0x78cb67ecf931fa38 /* 241 */, + 0xf33b0372323bbf9c /* 242 */, 0x52d66336fb279c74 /* 243 */, + 0x505f33ac0afb4eaa /* 244 */, 0xe8a5cd99a2cce187 /* 245 */, + 0x534974801e2d30bb /* 246 */, 0x8d2d5711d5876d90 /* 247 */, + 0x1f1a412891bc038e /* 248 */, 0xd6e2e71d82e56648 /* 249 */, + 0x74036c3a497732b7 /* 250 */, 0x89b67ed96361f5ab /* 251 */, + 0xffed95d8f1ea02a2 /* 252 */, 0xe72b3bd61464d43d /* 253 */, + 0xa6300f170bdc4820 /* 254 */, 0xebc18760ed78a77a /* 255 */, + 0xe6a6be5a05a12138 /* 256 */, 0xb5a122a5b4f87c98 /* 257 */, + 0x563c6089140b6990 /* 258 */, 0x4c46cb2e391f5dd5 /* 259 */, + 0xd932addbc9b79434 /* 260 */, 0x08ea70e42015aff5 /* 261 */, + 0xd765a6673e478cf1 /* 262 */, 0xc4fb757eab278d99 /* 263 */, + 0xdf11c6862d6e0692 /* 264 */, 0xddeb84f10d7f3b16 /* 265 */, + 0x6f2ef604a665ea04 /* 266 */, 0x4a8e0f0ff0e0dfb3 /* 267 */, + 0xa5edeef83dbcba51 /* 268 */, 0xfc4f0a2a0ea4371e /* 269 */, + 0xe83e1da85cb38429 /* 270 */, 0xdc8ff882ba1b1ce2 /* 271 */, + 0xcd45505e8353e80d /* 272 */, 0x18d19a00d4db0717 /* 273 */, + 0x34a0cfeda5f38101 /* 274 */, 0x0be77e518887caf2 /* 275 */, + 0x1e341438b3c45136 /* 276 */, 0xe05797f49089ccf9 /* 277 */, + 0xffd23f9df2591d14 /* 278 */, 0x543dda228595c5cd /* 279 */, + 0x661f81fd99052a33 /* 280 */, 0x8736e641db0f7b76 /* 281 */, + 0x15227725418e5307 /* 282 */, 0xe25f7f46162eb2fa /* 283 */, + 0x48a8b2126c13d9fe /* 284 */, 0xafdc541792e76eea /* 285 */, + 0x03d912bfc6d1898f /* 286 */, 0x31b1aafa1b83f51b /* 287 */, + 0xf1ac2796e42ab7d9 /* 288 */, 0x40a3a7d7fcd2ebac /* 289 */, + 0x1056136d0afbbcc5 /* 290 */, 0x7889e1dd9a6d0c85 /* 291 */, + 0xd33525782a7974aa /* 292 */, 0xa7e25d09078ac09b /* 293 */, + 0xbd4138b3eac6edd0 /* 294 */, 0x920abfbe71eb9e70 /* 295 */, + 0xa2a5d0f54fc2625c /* 296 */, 0xc054e36b0b1290a3 /* 297 */, + 0xf6dd59ff62fe932b /* 298 */, 0x3537354511a8ac7d /* 299 */, + 0xca845e9172fadcd4 /* 300 */, 0x84f82b60329d20dc /* 301 */, + 0x79c62ce1cd672f18 /* 302 */, 0x8b09a2add124642c /* 303 */, + 0xd0c1e96a19d9e726 /* 304 */, 0x5a786a9b4ba9500c /* 305 */, + 0x0e020336634c43f3 /* 306 */, 0xc17b474aeb66d822 /* 307 */, + 0x6a731ae3ec9baac2 /* 308 */, 0x8226667ae0840258 /* 309 */, + 0x67d4567691caeca5 /* 310 */, 0x1d94155c4875adb5 /* 311 */, + 0x6d00fd985b813fdf /* 312 */, 0x51286efcb774cd06 /* 313 */, + 0x5e8834471fa744af /* 314 */, 0xf72ca0aee761ae2e /* 315 */, + 0xbe40e4cdaee8e09a /* 316 */, 0xe9970bbb5118f665 /* 317 */, + 0x726e4beb33df1964 /* 318 */, 0x703b000729199762 /* 319 */, + 0x4631d816f5ef30a7 /* 320 */, 0xb880b5b51504a6be /* 321 */, + 0x641793c37ed84b6c /* 322 */, 0x7b21ed77f6e97d96 /* 323 */, + 0x776306312ef96b73 /* 324 */, 0xae528948e86ff3f4 /* 325 */, + 0x53dbd7f286a3f8f8 /* 326 */, 0x16cadce74cfc1063 /* 327 */, + 0x005c19bdfa52c6dd /* 328 */, 0x68868f5d64d46ad3 /* 329 */, + 0x3a9d512ccf1e186a /* 330 */, 0x367e62c2385660ae /* 331 */, + 0xe359e7ea77dcb1d7 /* 332 */, 0x526c0773749abe6e /* 333 */, + 0x735ae5f9d09f734b /* 334 */, 0x493fc7cc8a558ba8 /* 335 */, + 0xb0b9c1533041ab45 /* 336 */, 0x321958ba470a59bd /* 337 */, + 0x852db00b5f46c393 /* 338 */, 0x91209b2bd336b0e5 /* 339 */, + 0x6e604f7d659ef19f /* 340 */, 0xb99a8ae2782ccb24 /* 341 */, + 0xccf52ab6c814c4c7 /* 342 */, 0x4727d9afbe11727b /* 343 */, + 0x7e950d0c0121b34d /* 344 */, 0x756f435670ad471f /* 345 */, + 0xf5add442615a6849 /* 346 */, 0x4e87e09980b9957a /* 347 */, + 0x2acfa1df50aee355 /* 348 */, 0xd898263afd2fd556 /* 349 */, + 0xc8f4924dd80c8fd6 /* 350 */, 0xcf99ca3d754a173a /* 351 */, + 0xfe477bacaf91bf3c /* 352 */, 0xed5371f6d690c12d /* 353 */, + 0x831a5c285e687094 /* 354 */, 0xc5d3c90a3708a0a4 /* 355 */, + 0x0f7f903717d06580 /* 356 */, 0x19f9bb13b8fdf27f /* 357 */, + 0xb1bd6f1b4d502843 /* 358 */, 0x1c761ba38fff4012 /* 359 */, + 0x0d1530c4e2e21f3b /* 360 */, 0x8943ce69a7372c8a /* 361 */, + 0xe5184e11feb5ce66 /* 362 */, 0x618bdb80bd736621 /* 363 */, + 0x7d29bad68b574d0b /* 364 */, 0x81bb613e25e6fe5b /* 365 */, + 0x071c9c10bc07913f /* 366 */, 0xc7beeb7909ac2d97 /* 367 */, + 0xc3e58d353bc5d757 /* 368 */, 0xeb017892f38f61e8 /* 369 */, + 0xd4effb9c9b1cc21a /* 370 */, 0x99727d26f494f7ab /* 371 */, + 0xa3e063a2956b3e03 /* 372 */, 0x9d4a8b9a4aa09c30 /* 373 */, + 0x3f6ab7d500090fb4 /* 374 */, 0x9cc0f2a057268ac0 /* 375 */, + 0x3dee9d2dedbf42d1 /* 376 */, 0x330f49c87960a972 /* 377 */, + 0xc6b2720287421b41 /* 378 */, 0x0ac59ec07c00369c /* 379 */, + 0xef4eac49cb353425 /* 380 */, 0xf450244eef0129d8 /* 381 */, + 0x8acc46e5caf4deb6 /* 382 */, 0x2ffeab63989263f7 /* 383 */, + 0x8f7cb9fe5d7a4578 /* 384 */, 0x5bd8f7644e634635 /* 385 */, + 0x427a7315bf2dc900 /* 386 */, 0x17d0c4aa2125261c /* 387 */, + 0x3992486c93518e50 /* 388 */, 0xb4cbfee0a2d7d4c3 /* 389 */, + 0x7c75d6202c5ddd8d /* 390 */, 0xdbc295d8e35b6c61 /* 391 */, + 0x60b369d302032b19 /* 392 */, 0xce42685fdce44132 /* 393 */, + 0x06f3ddb9ddf65610 /* 394 */, 0x8ea4d21db5e148f0 /* 395 */, + 0x20b0fce62fcd496f /* 396 */, 0x2c1b912358b0ee31 /* 397 */, + 0xb28317b818f5a308 /* 398 */, 0xa89c1e189ca6d2cf /* 399 */, + 0x0c6b18576aaadbc8 /* 400 */, 0xb65deaa91299fae3 /* 401 */, + 0xfb2b794b7f1027e7 /* 402 */, 0x04e4317f443b5beb /* 403 */, + 0x4b852d325939d0a6 /* 404 */, 0xd5ae6beefb207ffc /* 405 */, + 0x309682b281c7d374 /* 406 */, 0xbae309a194c3b475 /* 407 */, + 0x8cc3f97b13b49f05 /* 408 */, 0x98a9422ff8293967 /* 409 */, + 0x244b16b01076ff7c /* 410 */, 0xf8bf571c663d67ee /* 411 */, + 0x1f0d6758eee30da1 /* 412 */, 0xc9b611d97adeb9b7 /* 413 */, + 0xb7afd5887b6c57a2 /* 414 */, 0x6290ae846b984fe1 /* 415 */, + 0x94df4cdeacc1a5fd /* 416 */, 0x058a5bd1c5483aff /* 417 */, + 0x63166cc142ba3c37 /* 418 */, 0x8db8526eb2f76f40 /* 419 */, + 0xe10880036f0d6d4e /* 420 */, 0x9e0523c9971d311d /* 421 */, + 0x45ec2824cc7cd691 /* 422 */, 0x575b8359e62382c9 /* 423 */, + 0xfa9e400dc4889995 /* 424 */, 0xd1823ecb45721568 /* 425 */, + 0xdafd983b8206082f /* 426 */, 0xaa7d29082386a8cb /* 427 */, + 0x269fcd4403b87588 /* 428 */, 0x1b91f5f728bdd1e0 /* 429 */, + 0xe4669f39040201f6 /* 430 */, 0x7a1d7c218cf04ade /* 431 */, + 0x65623c29d79ce5ce /* 432 */, 0x2368449096c00bb1 /* 433 */, + 0xab9bf1879da503ba /* 434 */, 0xbc23ecb1a458058e /* 435 */, + 0x9a58df01bb401ecc /* 436 */, 0xa070e868a85f143d /* 437 */, + 0x4ff188307df2239e /* 438 */, 0x14d565b41a641183 /* 439 */, + 0xee13337452701602 /* 440 */, 0x950e3dcf3f285e09 /* 441 */, + 0x59930254b9c80953 /* 442 */, 0x3bf299408930da6d /* 443 */, + 0xa955943f53691387 /* 444 */, 0xa15edecaa9cb8784 /* 445 */, + 0x29142127352be9a0 /* 446 */, 0x76f0371fff4e7afb /* 447 */, + 0x0239f450274f2228 /* 448 */, 0xbb073af01d5e868b /* 449 */, + 0xbfc80571c10e96c1 /* 450 */, 0xd267088568222e23 /* 451 */, + 0x9671a3d48e80b5b0 /* 452 */, 0x55b5d38ae193bb81 /* 453 */, + 0x693ae2d0a18b04b8 /* 454 */, 0x5c48b4ecadd5335f /* 455 */, + 0xfd743b194916a1ca /* 456 */, 0x2577018134be98c4 /* 457 */, + 0xe77987e83c54a4ad /* 458 */, 0x28e11014da33e1b9 /* 459 */, + 0x270cc59e226aa213 /* 460 */, 0x71495f756d1a5f60 /* 461 */, + 0x9be853fb60afef77 /* 462 */, 0xadc786a7f7443dbf /* 463 */, + 0x0904456173b29a82 /* 464 */, 0x58bc7a66c232bd5e /* 465 */, + 0xf306558c673ac8b2 /* 466 */, 0x41f639c6b6c9772a /* 467 */, + 0x216defe99fda35da /* 468 */, 0x11640cc71c7be615 /* 469 */, + 0x93c43694565c5527 /* 470 */, 0xea038e6246777839 /* 471 */, + 0xf9abf3ce5a3e2469 /* 472 */, 0x741e768d0fd312d2 /* 473 */, + 0x0144b883ced652c6 /* 474 */, 0xc20b5a5ba33f8552 /* 475 */, + 0x1ae69633c3435a9d /* 476 */, 0x97a28ca4088cfdec /* 477 */, + 0x8824a43c1e96f420 /* 478 */, 0x37612fa66eeea746 /* 479 */, + 0x6b4cb165f9cf0e5a /* 480 */, 0x43aa1c06a0abfb4a /* 481 */, + 0x7f4dc26ff162796b /* 482 */, 0x6cbacc8e54ed9b0f /* 483 */, + 0xa6b7ffefd2bb253e /* 484 */, 0x2e25bc95b0a29d4f /* 485 */, + 0x86d6a58bdef1388c /* 486 */, 0xded74ac576b6f054 /* 487 */, + 0x8030bdbc2b45805d /* 488 */, 0x3c81af70e94d9289 /* 489 */, + 0x3eff6dda9e3100db /* 490 */, 0xb38dc39fdfcc8847 /* 491 */, + 0x123885528d17b87e /* 492 */, 0xf2da0ed240b1b642 /* 493 */, + 0x44cefadcd54bf9a9 /* 494 */, 0x1312200e433c7ee6 /* 495 */, + 0x9ffcc84f3a78c748 /* 496 */, 0xf0cd1f72248576bb /* 497 */, + 0xec6974053638cfe4 /* 498 */, 0x2ba7b67c0cec4e4c /* 499 */, + 0xac2f4df3e5ce32ed /* 500 */, 0xcb33d14326ea4c11 /* 501 */, + 0xa4e9044cc77e58bc /* 502 */, 0x5f513293d934fcef /* 503 */, + 0x5dc9645506e55444 /* 504 */, 0x50de418f317de40a /* 505 */, + 0x388cb31a69dde259 /* 506 */, 0x2db4a83455820a86 /* 507 */, + 0x9010a91e84711ae9 /* 508 */, 0x4df7f0b7b1498371 /* 509 */, + 0xd62a2eabc0977179 /* 510 */, 0x22fac097aa8d5c0e /* 511 */, + 0xf49fcc2ff1daf39b /* 512 */, 0x487fd5c66ff29281 /* 513 */, + 0xe8a30667fcdca83f /* 514 */, 0x2c9b4be3d2fcce63 /* 515 */, + 0xda3ff74b93fbbbc2 /* 516 */, 0x2fa165d2fe70ba66 /* 517 */, + 0xa103e279970e93d4 /* 518 */, 0xbecdec77b0e45e71 /* 519 */, + 0xcfb41e723985e497 /* 520 */, 0xb70aaa025ef75017 /* 521 */, + 0xd42309f03840b8e0 /* 522 */, 0x8efc1ad035898579 /* 523 */, + 0x96c6920be2b2abc5 /* 524 */, 0x66af4163375a9172 /* 525 */, + 0x2174abdcca7127fb /* 526 */, 0xb33ccea64a72ff41 /* 527 */, + 0xf04a4933083066a5 /* 528 */, 0x8d970acdd7289af5 /* 529 */, + 0x8f96e8e031c8c25e /* 530 */, 0xf3fec02276875d47 /* 531 */, + 0xec7bf310056190dd /* 532 */, 0xf5adb0aebb0f1491 /* 533 */, + 0x9b50f8850fd58892 /* 534 */, 0x4975488358b74de8 /* 535 */, + 0xa3354ff691531c61 /* 536 */, 0x0702bbe481d2c6ee /* 537 */, + 0x89fb24057deded98 /* 538 */, 0xac3075138596e902 /* 539 */, + 0x1d2d3580172772ed /* 540 */, 0xeb738fc28e6bc30d /* 541 */, + 0x5854ef8f63044326 /* 542 */, 0x9e5c52325add3bbe /* 543 */, + 0x90aa53cf325c4623 /* 544 */, 0xc1d24d51349dd067 /* 545 */, + 0x2051cfeea69ea624 /* 546 */, 0x13220f0a862e7e4f /* 547 */, + 0xce39399404e04864 /* 548 */, 0xd9c42ca47086fcb7 /* 549 */, + 0x685ad2238a03e7cc /* 550 */, 0x066484b2ab2ff1db /* 551 */, + 0xfe9d5d70efbf79ec /* 552 */, 0x5b13b9dd9c481854 /* 553 */, + 0x15f0d475ed1509ad /* 554 */, 0x0bebcd060ec79851 /* 555 */, + 0xd58c6791183ab7f8 /* 556 */, 0xd1187c5052f3eee4 /* 557 */, + 0xc95d1192e54e82ff /* 558 */, 0x86eea14cb9ac6ca2 /* 559 */, + 0x3485beb153677d5d /* 560 */, 0xdd191d781f8c492a /* 561 */, + 0xf60866baa784ebf9 /* 562 */, 0x518f643ba2d08c74 /* 563 */, + 0x8852e956e1087c22 /* 564 */, 0xa768cb8dc410ae8d /* 565 */, + 0x38047726bfec8e1a /* 566 */, 0xa67738b4cd3b45aa /* 567 */, + 0xad16691cec0dde19 /* 568 */, 0xc6d4319380462e07 /* 569 */, + 0xc5a5876d0ba61938 /* 570 */, 0x16b9fa1fa58fd840 /* 571 */, + 0x188ab1173ca74f18 /* 572 */, 0xabda2f98c99c021f /* 573 */, + 0x3e0580ab134ae816 /* 574 */, 0x5f3b05b773645abb /* 575 */, + 0x2501a2be5575f2f6 /* 576 */, 0x1b2f74004e7e8ba9 /* 577 */, + 0x1cd7580371e8d953 /* 578 */, 0x7f6ed89562764e30 /* 579 */, + 0xb15926ff596f003d /* 580 */, 0x9f65293da8c5d6b9 /* 581 */, + 0x6ecef04dd690f84c /* 582 */, 0x4782275fff33af88 /* 583 */, + 0xe41433083f820801 /* 584 */, 0xfd0dfe409a1af9b5 /* 585 */, + 0x4325a3342cdb396b /* 586 */, 0x8ae77e62b301b252 /* 587 */, + 0xc36f9e9f6655615a /* 588 */, 0x85455a2d92d32c09 /* 589 */, + 0xf2c7dea949477485 /* 590 */, 0x63cfb4c133a39eba /* 591 */, + 0x83b040cc6ebc5462 /* 592 */, 0x3b9454c8fdb326b0 /* 593 */, + 0x56f56a9e87ffd78c /* 594 */, 0x2dc2940d99f42bc6 /* 595 */, + 0x98f7df096b096e2d /* 596 */, 0x19a6e01e3ad852bf /* 597 */, + 0x42a99ccbdbd4b40b /* 598 */, 0xa59998af45e9c559 /* 599 */, + 0x366295e807d93186 /* 600 */, 0x6b48181bfaa1f773 /* 601 */, + 0x1fec57e2157a0a1d /* 602 */, 0x4667446af6201ad5 /* 603 */, + 0xe615ebcacfb0f075 /* 604 */, 0xb8f31f4f68290778 /* 605 */, + 0x22713ed6ce22d11e /* 606 */, 0x3057c1a72ec3c93b /* 607 */, + 0xcb46acc37c3f1f2f /* 608 */, 0xdbb893fd02aaf50e /* 609 */, + 0x331fd92e600b9fcf /* 610 */, 0xa498f96148ea3ad6 /* 611 */, + 0xa8d8426e8b6a83ea /* 612 */, 0xa089b274b7735cdc /* 613 */, + 0x87f6b3731e524a11 /* 614 */, 0x118808e5cbc96749 /* 615 */, + 0x9906e4c7b19bd394 /* 616 */, 0xafed7f7e9b24a20c /* 617 */, + 0x6509eadeeb3644a7 /* 618 */, 0x6c1ef1d3e8ef0ede /* 619 */, + 0xb9c97d43e9798fb4 /* 620 */, 0xa2f2d784740c28a3 /* 621 */, + 0x7b8496476197566f /* 622 */, 0x7a5be3e6b65f069d /* 623 */, + 0xf96330ed78be6f10 /* 624 */, 0xeee60de77a076a15 /* 625 */, + 0x2b4bee4aa08b9bd0 /* 626 */, 0x6a56a63ec7b8894e /* 627 */, + 0x02121359ba34fef4 /* 628 */, 0x4cbf99f8283703fc /* 629 */, + 0x398071350caf30c8 /* 630 */, 0xd0a77a89f017687a /* 631 */, + 0xf1c1a9eb9e423569 /* 632 */, 0x8c7976282dee8199 /* 633 */, + 0x5d1737a5dd1f7abd /* 634 */, 0x4f53433c09a9fa80 /* 635 */, + 0xfa8b0c53df7ca1d9 /* 636 */, 0x3fd9dcbc886ccb77 /* 637 */, + 0xc040917ca91b4720 /* 638 */, 0x7dd00142f9d1dcdf /* 639 */, + 0x8476fc1d4f387b58 /* 640 */, 0x23f8e7c5f3316503 /* 641 */, + 0x032a2244e7e37339 /* 642 */, 0x5c87a5d750f5a74b /* 643 */, + 0x082b4cc43698992e /* 644 */, 0xdf917becb858f63c /* 645 */, + 0x3270b8fc5bf86dda /* 646 */, 0x10ae72bb29b5dd76 /* 647 */, + 0x576ac94e7700362b /* 648 */, 0x1ad112dac61efb8f /* 649 */, + 0x691bc30ec5faa427 /* 650 */, 0xff246311cc327143 /* 651 */, + 0x3142368e30e53206 /* 652 */, 0x71380e31e02ca396 /* 653 */, + 0x958d5c960aad76f1 /* 654 */, 0xf8d6f430c16da536 /* 655 */, + 0xc8ffd13f1be7e1d2 /* 656 */, 0x7578ae66004ddbe1 /* 657 */, + 0x05833f01067be646 /* 658 */, 0xbb34b5ad3bfe586d /* 659 */, + 0x095f34c9a12b97f0 /* 660 */, 0x247ab64525d60ca8 /* 661 */, + 0xdcdbc6f3017477d1 /* 662 */, 0x4a2e14d4decad24d /* 663 */, + 0xbdb5e6d9be0a1eeb /* 664 */, 0x2a7e70f7794301ab /* 665 */, + 0xdef42d8a270540fd /* 666 */, 0x01078ec0a34c22c1 /* 667 */, + 0xe5de511af4c16387 /* 668 */, 0x7ebb3a52bd9a330a /* 669 */, + 0x77697857aa7d6435 /* 670 */, 0x004e831603ae4c32 /* 671 */, + 0xe7a21020ad78e312 /* 672 */, 0x9d41a70c6ab420f2 /* 673 */, + 0x28e06c18ea1141e6 /* 674 */, 0xd2b28cbd984f6b28 /* 675 */, + 0x26b75f6c446e9d83 /* 676 */, 0xba47568c4d418d7f /* 677 */, + 0xd80badbfe6183d8e /* 678 */, 0x0e206d7f5f166044 /* 679 */, + 0xe258a43911cbca3e /* 680 */, 0x723a1746b21dc0bc /* 681 */, + 0xc7caa854f5d7cdd3 /* 682 */, 0x7cac32883d261d9c /* 683 */, + 0x7690c26423ba942c /* 684 */, 0x17e55524478042b8 /* 685 */, + 0xe0be477656a2389f /* 686 */, 0x4d289b5e67ab2da0 /* 687 */, + 0x44862b9c8fbbfd31 /* 688 */, 0xb47cc8049d141365 /* 689 */, + 0x822c1b362b91c793 /* 690 */, 0x4eb14655fb13dfd8 /* 691 */, + 0x1ecbba0714e2a97b /* 692 */, 0x6143459d5cde5f14 /* 693 */, + 0x53a8fbf1d5f0ac89 /* 694 */, 0x97ea04d81c5e5b00 /* 695 */, + 0x622181a8d4fdb3f3 /* 696 */, 0xe9bcd341572a1208 /* 697 */, + 0x1411258643cce58a /* 698 */, 0x9144c5fea4c6e0a4 /* 699 */, + 0x0d33d06565cf620f /* 700 */, 0x54a48d489f219ca1 /* 701 */, + 0xc43e5eac6d63c821 /* 702 */, 0xa9728b3a72770daf /* 703 */, + 0xd7934e7b20df87ef /* 704 */, 0xe35503b61a3e86e5 /* 705 */, + 0xcae321fbc819d504 /* 706 */, 0x129a50b3ac60bfa6 /* 707 */, + 0xcd5e68ea7e9fb6c3 /* 708 */, 0xb01c90199483b1c7 /* 709 */, + 0x3de93cd5c295376c /* 710 */, 0xaed52edf2ab9ad13 /* 711 */, + 0x2e60f512c0a07884 /* 712 */, 0xbc3d86a3e36210c9 /* 713 */, + 0x35269d9b163951ce /* 714 */, 0x0c7d6e2ad0cdb5fa /* 715 */, + 0x59e86297d87f5733 /* 716 */, 0x298ef221898db0e7 /* 717 */, + 0x55000029d1a5aa7e /* 718 */, 0x8bc08ae1b5061b45 /* 719 */, + 0xc2c31c2b6c92703a /* 720 */, 0x94cc596baf25ef42 /* 721 */, + 0x0a1d73db22540456 /* 722 */, 0x04b6a0f9d9c4179a /* 723 */, + 0xeffdafa2ae3d3c60 /* 724 */, 0xf7c8075bb49496c4 /* 725 */, + 0x9cc5c7141d1cd4e3 /* 726 */, 0x78bd1638218e5534 /* 727 */, + 0xb2f11568f850246a /* 728 */, 0xedfabcfa9502bc29 /* 729 */, + 0x796ce5f2da23051b /* 730 */, 0xaae128b0dc93537c /* 731 */, + 0x3a493da0ee4b29ae /* 732 */, 0xb5df6b2c416895d7 /* 733 */, + 0xfcabbd25122d7f37 /* 734 */, 0x70810b58105dc4b1 /* 735 */, + 0xe10fdd37f7882a90 /* 736 */, 0x524dcab5518a3f5c /* 737 */, + 0x3c9e85878451255b /* 738 */, 0x4029828119bd34e2 /* 739 */, + 0x74a05b6f5d3ceccb /* 740 */, 0xb610021542e13eca /* 741 */, + 0x0ff979d12f59e2ac /* 742 */, 0x6037da27e4f9cc50 /* 743 */, + 0x5e92975a0df1847d /* 744 */, 0xd66de190d3e623fe /* 745 */, + 0x5032d6b87b568048 /* 746 */, 0x9a36b7ce8235216e /* 747 */, + 0x80272a7a24f64b4a /* 748 */, 0x93efed8b8c6916f7 /* 749 */, + 0x37ddbff44cce1555 /* 750 */, 0x4b95db5d4b99bd25 /* 751 */, + 0x92d3fda169812fc0 /* 752 */, 0xfb1a4a9a90660bb6 /* 753 */, + 0x730c196946a4b9b2 /* 754 */, 0x81e289aa7f49da68 /* 755 */, + 0x64669a0f83b1a05f /* 756 */, 0x27b3ff7d9644f48b /* 757 */, + 0xcc6b615c8db675b3 /* 758 */, 0x674f20b9bcebbe95 /* 759 */, + 0x6f31238275655982 /* 760 */, 0x5ae488713e45cf05 /* 761 */, + 0xbf619f9954c21157 /* 762 */, 0xeabac46040a8eae9 /* 763 */, + 0x454c6fe9f2c0c1cd /* 764 */, 0x419cf6496412691c /* 765 */, + 0xd3dc3bef265b0f70 /* 766 */, 0x6d0e60f5c3578a9e /* 767 */, + 0x5b0e608526323c55 /* 768 */, 0x1a46c1a9fa1b59f5 /* 769 */, + 0xa9e245a17c4c8ffa /* 770 */, 0x65ca5159db2955d7 /* 771 */, + 0x05db0a76ce35afc2 /* 772 */, 0x81eac77ea9113d45 /* 773 */, + 0x528ef88ab6ac0a0d /* 774 */, 0xa09ea253597be3ff /* 775 */, + 0x430ddfb3ac48cd56 /* 776 */, 0xc4b3a67af45ce46f /* 777 */, + 0x4ececfd8fbe2d05e /* 778 */, 0x3ef56f10b39935f0 /* 779 */, + 0x0b22d6829cd619c6 /* 780 */, 0x17fd460a74df2069 /* 781 */, + 0x6cf8cc8e8510ed40 /* 782 */, 0xd6c824bf3a6ecaa7 /* 783 */, + 0x61243d581a817049 /* 784 */, 0x048bacb6bbc163a2 /* 785 */, + 0xd9a38ac27d44cc32 /* 786 */, 0x7fddff5baaf410ab /* 787 */, + 0xad6d495aa804824b /* 788 */, 0xe1a6a74f2d8c9f94 /* 789 */, + 0xd4f7851235dee8e3 /* 790 */, 0xfd4b7f886540d893 /* 791 */, + 0x247c20042aa4bfda /* 792 */, 0x096ea1c517d1327c /* 793 */, + 0xd56966b4361a6685 /* 794 */, 0x277da5c31221057d /* 795 */, + 0x94d59893a43acff7 /* 796 */, 0x64f0c51ccdc02281 /* 797 */, + 0x3d33bcc4ff6189db /* 798 */, 0xe005cb184ce66af1 /* 799 */, + 0xff5ccd1d1db99bea /* 800 */, 0xb0b854a7fe42980f /* 801 */, + 0x7bd46a6a718d4b9f /* 802 */, 0xd10fa8cc22a5fd8c /* 803 */, + 0xd31484952be4bd31 /* 804 */, 0xc7fa975fcb243847 /* 805 */, + 0x4886ed1e5846c407 /* 806 */, 0x28cddb791eb70b04 /* 807 */, + 0xc2b00be2f573417f /* 808 */, 0x5c9590452180f877 /* 809 */, + 0x7a6bddfff370eb00 /* 810 */, 0xce509e38d6d9d6a4 /* 811 */, + 0xebeb0f00647fa702 /* 812 */, 0x1dcc06cf76606f06 /* 813 */, + 0xe4d9f28ba286ff0a /* 814 */, 0xd85a305dc918c262 /* 815 */, + 0x475b1d8732225f54 /* 816 */, 0x2d4fb51668ccb5fe /* 817 */, + 0xa679b9d9d72bba20 /* 818 */, 0x53841c0d912d43a5 /* 819 */, + 0x3b7eaa48bf12a4e8 /* 820 */, 0x781e0e47f22f1ddf /* 821 */, + 0xeff20ce60ab50973 /* 822 */, 0x20d261d19dffb742 /* 823 */, + 0x16a12b03062a2e39 /* 824 */, 0x1960eb2239650495 /* 825 */, + 0x251c16fed50eb8b8 /* 826 */, 0x9ac0c330f826016e /* 827 */, + 0xed152665953e7671 /* 828 */, 0x02d63194a6369570 /* 829 */, + 0x5074f08394b1c987 /* 830 */, 0x70ba598c90b25ce1 /* 831 */, + 0x794a15810b9742f6 /* 832 */, 0x0d5925e9fcaf8c6c /* 833 */, + 0x3067716cd868744e /* 834 */, 0x910ab077e8d7731b /* 835 */, + 0x6a61bbdb5ac42f61 /* 836 */, 0x93513efbf0851567 /* 837 */, + 0xf494724b9e83e9d5 /* 838 */, 0xe887e1985c09648d /* 839 */, + 0x34b1d3c675370cfd /* 840 */, 0xdc35e433bc0d255d /* 841 */, + 0xd0aab84234131be0 /* 842 */, 0x08042a50b48b7eaf /* 843 */, + 0x9997c4ee44a3ab35 /* 844 */, 0x829a7b49201799d0 /* 845 */, + 0x263b8307b7c54441 /* 846 */, 0x752f95f4fd6a6ca6 /* 847 */, + 0x927217402c08c6e5 /* 848 */, 0x2a8ab754a795d9ee /* 849 */, + 0xa442f7552f72943d /* 850 */, 0x2c31334e19781208 /* 851 */, + 0x4fa98d7ceaee6291 /* 852 */, 0x55c3862f665db309 /* 853 */, + 0xbd0610175d53b1f3 /* 854 */, 0x46fe6cb840413f27 /* 855 */, + 0x3fe03792df0cfa59 /* 856 */, 0xcfe700372eb85e8f /* 857 */, + 0xa7be29e7adbce118 /* 858 */, 0xe544ee5cde8431dd /* 859 */, + 0x8a781b1b41f1873e /* 860 */, 0xa5c94c78a0d2f0e7 /* 861 */, + 0x39412e2877b60728 /* 862 */, 0xa1265ef3afc9a62c /* 863 */, + 0xbcc2770c6a2506c5 /* 864 */, 0x3ab66dd5dce1ce12 /* 865 */, + 0xe65499d04a675b37 /* 866 */, 0x7d8f523481bfd216 /* 867 */, + 0x0f6f64fcec15f389 /* 868 */, 0x74efbe618b5b13c8 /* 869 */, + 0xacdc82b714273e1d /* 870 */, 0xdd40bfe003199d17 /* 871 */, + 0x37e99257e7e061f8 /* 872 */, 0xfa52626904775aaa /* 873 */, + 0x8bbbf63a463d56f9 /* 874 */, 0xf0013f1543a26e64 /* 875 */, + 0xa8307e9f879ec898 /* 876 */, 0xcc4c27a4150177cc /* 877 */, + 0x1b432f2cca1d3348 /* 878 */, 0xde1d1f8f9f6fa013 /* 879 */, + 0x606602a047a7ddd6 /* 880 */, 0xd237ab64cc1cb2c7 /* 881 */, + 0x9b938e7225fcd1d3 /* 882 */, 0xec4e03708e0ff476 /* 883 */, + 0xfeb2fbda3d03c12d /* 884 */, 0xae0bced2ee43889a /* 885 */, + 0x22cb8923ebfb4f43 /* 886 */, 0x69360d013cf7396d /* 887 */, + 0x855e3602d2d4e022 /* 888 */, 0x073805bad01f784c /* 889 */, + 0x33e17a133852f546 /* 890 */, 0xdf4874058ac7b638 /* 891 */, + 0xba92b29c678aa14a /* 892 */, 0x0ce89fc76cfaadcd /* 893 */, + 0x5f9d4e0908339e34 /* 894 */, 0xf1afe9291f5923b9 /* 895 */, + 0x6e3480f60f4a265f /* 896 */, 0xeebf3a2ab29b841c /* 897 */, + 0xe21938a88f91b4ad /* 898 */, 0x57dfeff845c6d3c3 /* 899 */, + 0x2f006b0bf62caaf2 /* 900 */, 0x62f479ef6f75ee78 /* 901 */, + 0x11a55ad41c8916a9 /* 902 */, 0xf229d29084fed453 /* 903 */, + 0x42f1c27b16b000e6 /* 904 */, 0x2b1f76749823c074 /* 905 */, + 0x4b76eca3c2745360 /* 906 */, 0x8c98f463b91691bd /* 907 */, + 0x14bcc93cf1ade66a /* 908 */, 0x8885213e6d458397 /* 909 */, + 0x8e177df0274d4711 /* 910 */, 0xb49b73b5503f2951 /* 911 */, + 0x10168168c3f96b6b /* 912 */, 0x0e3d963b63cab0ae /* 913 */, + 0x8dfc4b5655a1db14 /* 914 */, 0xf789f1356e14de5c /* 915 */, + 0x683e68af4e51dac1 /* 916 */, 0xc9a84f9d8d4b0fd9 /* 917 */, + 0x3691e03f52a0f9d1 /* 918 */, 0x5ed86e46e1878e80 /* 919 */, + 0x3c711a0e99d07150 /* 920 */, 0x5a0865b20c4e9310 /* 921 */, + 0x56fbfc1fe4f0682e /* 922 */, 0xea8d5de3105edf9b /* 923 */, + 0x71abfdb12379187a /* 924 */, 0x2eb99de1bee77b9c /* 925 */, + 0x21ecc0ea33cf4523 /* 926 */, 0x59a4d7521805c7a1 /* 927 */, + 0x3896f5eb56ae7c72 /* 928 */, 0xaa638f3db18f75dc /* 929 */, + 0x9f39358dabe9808e /* 930 */, 0xb7defa91c00b72ac /* 931 */, + 0x6b5541fd62492d92 /* 932 */, 0x6dc6dee8f92e4d5b /* 933 */, + 0x353f57abc4beea7e /* 934 */, 0x735769d6da5690ce /* 935 */, + 0x0a234aa642391484 /* 936 */, 0xf6f9508028f80d9d /* 937 */, + 0xb8e319a27ab3f215 /* 938 */, 0x31ad9c1151341a4d /* 939 */, + 0x773c22a57bef5805 /* 940 */, 0x45c7561a07968633 /* 941 */, + 0xf913da9e249dbe36 /* 942 */, 0xda652d9b78a64c68 /* 943 */, + 0x4c27a97f3bc334ef /* 944 */, 0x76621220e66b17f4 /* 945 */, + 0x967743899acd7d0b /* 946 */, 0xf3ee5bcae0ed6782 /* 947 */, + 0x409f753600c879fc /* 948 */, 0x06d09a39b5926db6 /* 949 */, + 0x6f83aeb0317ac588 /* 950 */, 0x01e6ca4a86381f21 /* 951 */, + 0x66ff3462d19f3025 /* 952 */, 0x72207c24ddfd3bfb /* 953 */, + 0x4af6b6d3e2ece2eb /* 954 */, 0x9c994dbec7ea08de /* 955 */, + 0x49ace597b09a8bc4 /* 956 */, 0xb38c4766cf0797ba /* 957 */, + 0x131b9373c57c2a75 /* 958 */, 0xb1822cce61931e58 /* 959 */, + 0x9d7555b909ba1c0c /* 960 */, 0x127fafdd937d11d2 /* 961 */, + 0x29da3badc66d92e4 /* 962 */, 0xa2c1d57154c2ecbc /* 963 */, + 0x58c5134d82f6fe24 /* 964 */, 0x1c3ae3515b62274f /* 965 */, + 0xe907c82e01cb8126 /* 966 */, 0xf8ed091913e37fcb /* 967 */, + 0x3249d8f9c80046c9 /* 968 */, 0x80cf9bede388fb63 /* 969 */, + 0x1881539a116cf19e /* 970 */, 0x5103f3f76bd52457 /* 971 */, + 0x15b7e6f5ae47f7a8 /* 972 */, 0xdbd7c6ded47e9ccf /* 973 */, + 0x44e55c410228bb1a /* 974 */, 0xb647d4255edb4e99 /* 975 */, + 0x5d11882bb8aafc30 /* 976 */, 0xf5098bbb29d3212a /* 977 */, + 0x8fb5ea14e90296b3 /* 978 */, 0x677b942157dd025a /* 979 */, + 0xfb58e7c0a390acb5 /* 980 */, 0x89d3674c83bd4a01 /* 981 */, + 0x9e2da4df4bf3b93b /* 982 */, 0xfcc41e328cab4829 /* 983 */, + 0x03f38c96ba582c52 /* 984 */, 0xcad1bdbd7fd85db2 /* 985 */, + 0xbbb442c16082ae83 /* 986 */, 0xb95fe86ba5da9ab0 /* 987 */, + 0xb22e04673771a93f /* 988 */, 0x845358c9493152d8 /* 989 */, + 0xbe2a488697b4541e /* 990 */, 0x95a2dc2dd38e6966 /* 991 */, + 0xc02c11ac923c852b /* 992 */, 0x2388b1990df2a87b /* 993 */, + 0x7c8008fa1b4f37be /* 994 */, 0x1f70d0c84d54e503 /* 995 */, + 0x5490adec7ece57d4 /* 996 */, 0x002b3c27d9063a3a /* 997 */, + 0x7eaea3848030a2bf /* 998 */, 0xc602326ded2003c0 /* 999 */, + 0x83a7287d69a94086 /* 1000 */, 0xc57a5fcb30f57a8a /* 1001 */, + 0xb56844e479ebe779 /* 1002 */, 0xa373b40f05dcbce9 /* 1003 */, + 0xd71a786e88570ee2 /* 1004 */, 0x879cbacdbde8f6a0 /* 1005 */, + 0x976ad1bcc164a32f /* 1006 */, 0xab21e25e9666d78b /* 1007 */, + 0x901063aae5e5c33c /* 1008 */, 0x9818b34448698d90 /* 1009 */, + 0xe36487ae3e1e8abb /* 1010 */, 0xafbdf931893bdcb4 /* 1011 */, + 0x6345a0dc5fbbd519 /* 1012 */, 0x8628fe269b9465ca /* 1013 */, + 0x1e5d01603f9c51ec /* 1014 */, 0x4de44006a15049b7 /* 1015 */, + 0xbf6c70e5f776cbb1 /* 1016 */, 0x411218f2ef552bed /* 1017 */, + 0xcb0c0708705a36a3 /* 1018 */, 0xe74d14754f986044 /* 1019 */, + 0xcd56d9430ea8280e /* 1020 */, 0xc12591d7535f5065 /* 1021 */, + 0xc83223f1720aef96 /* 1022 */, 0xc3a0396f7363a51f /* 1023 */ +]; + + +/******************************************************************************* + +*******************************************************************************/ + +version (UnitTest) +{ + unittest + { + static char[][] strings = [ + "", + "abc", + "Tiger", + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-", + "ABCDEFGHIJKLMNOPQRSTUVWXYZ=abcdefghijklmnopqrstuvwxyz+0123456789", + "Tiger - A Fast New Hash Function, by Ross Anderson and Eli Biham", + "Tiger - A Fast New Hash Function, by Ross Anderson and Eli Biham, proceedings of Fast Software Encryption 3, Cambridge.", + "Tiger - A Fast New Hash Function, by Ross Anderson and Eli Biham, proceedings of Fast Software Encryption 3, Cambridge, 1996.", + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-" + ]; + static char[][] results = [ + "24f0130c63ac933216166e76b1bb925ff373de2d49584e7a", + "f258c1e88414ab2a527ab541ffc5b8bf935f7b951c132951", + "9f00f599072300dd276abb38c8eb6dec37790c116f9d2bdf", + "87fb2a9083851cf7470d2cf810e6df9eb586445034a5a386", + "467db80863ebce488df1cd1261655de957896565975f9197", + "0c410a042968868a1671da5a3fd29a725ec1e457d3cdb303", + "ebf591d5afa655ce7f22894ff87f54ac89c811b6b0da3193", + "3d9aeb03d1bd1a6357b2774dfd6d5b24dd68151d503974fc", + "00b83eb4e53440c576ac6aaee0a7485825fd15e70a59ffe4" + ]; + + Tiger h = new Tiger(); + + foreach(int i, char[] s; strings) { + h.update(cast(ubyte[]) s); + + char[] d = h.hexDigest(); + + assert(d == results[i],":("~s~")("~d~")!=("~results[i]~")"); + + } + + ubyte[65536] buffer; + + for (uint i = 0; i < 65536; i++) + buffer[i] = cast(ubyte) i; + + h.update(buffer); + char[] e = h.hexDigest(); + + assert(e == "8ef43951b3f5f4fd1d41afe51b420e710462f233c3aaa8e1", + ":(65k)("~e~")!=(8ef43951b3f5f4fd1d41afe51b420e710462f233c3aaa8e1)"); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/model/IBuffer.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/model/IBuffer.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,622 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Mar 2004: Initial release + Dec 2006: Outback release + + author: Kris + +*******************************************************************************/ + +module tango.io.model.IBuffer; + +private import tango.io.model.IConduit; + +/******************************************************************************* + + Buffer is central concept in Tango I/O. Each buffer acts + as a queue (line) where items are removed from the front + and new items are added to the back. Buffers are modeled + by this interface and implemented in various ways. + + Buffer can be read from and written to directly, though + various data-converters and filters are often leveraged + to apply structure to what might otherwise be simple raw + data. + + Buffers may also be tokenized by applying an Iterator. + This can be handy when one is dealing with text input, + and/or the content suits a more fluid format than most + typical converters support. Iterator tokens are mapped + directly onto buffer content (sliced), making them quite + efficient in practice. Like other types of buffer client, + multiple iterators can be mapped onto one common buffer + and access will be serialized. + + Buffers are sometimes memory-only, in which case there + is nothing left to do when a client has consumed all the + content. Other buffers are themselves bound to an external + device called a conduit. When this is the case, a consumer + will eventually cause a buffer to reload via its associated + conduit and previous buffer content will be lost. + + A similar approach is applied to clients which populate a + buffer, whereby the content of a full buffer will be flushed + to a bound conduit before continuing. Another variation is + that of a memory-mapped buffer, whereby the buffer content + is mapped directly to virtual memory exposed via the OS. This + can be used to address large files as an array of content. + + See tango.io.Buffer for more info. + +*******************************************************************************/ + +abstract class IBuffer : IConduit, Buffered +{ + alias append opCall; + alias flush opCall; + + /*********************************************************************** + + implements Buffered interface + + ***********************************************************************/ + + abstract IBuffer buffer (); + + /*********************************************************************** + + Return the backing array + + ***********************************************************************/ + + abstract void[] getContent (); + + /*********************************************************************** + + Return a void[] slice of the buffer up to the limit of + valid content. + + ***********************************************************************/ + + abstract void[] slice (); + + /*********************************************************************** + + Set the backing array with all content readable. Writing + to this will either flush it to an associated conduit, or + raise an Eof condition. Use IBuffer.clear() to reset the + content (make it all writable). + + ***********************************************************************/ + + abstract IBuffer setContent (void[] data); + + /*********************************************************************** + + Set the backing array with some content readable. Writing + to this will either flush it to an associated conduit, or + raise an Eof condition. Use IBuffer.clear() to reset the + content (make it all writable). + + ***********************************************************************/ + + abstract IBuffer setContent (void[] data, uint readable); + + /*********************************************************************** + + Append an array of data into this buffer, and flush to the + conduit as necessary. Returns a chaining reference if all + data was written; throws an IOException indicating eof or + eob if not. + + This is often used in lieu of a Writer. + + ***********************************************************************/ + + abstract IBuffer append (void* content, uint length); + + /*********************************************************************** + + Append an array of data into this buffer, and flush to the + conduit as necessary. Returns a chaining reference if all + data was written; throws an IOException indicating eof or + eob if not. + + This is often used in lieu of a Writer. + + ***********************************************************************/ + + abstract IBuffer append (void[] content); + + /*********************************************************************** + + Append another buffer to this one, and flush to the + conduit as necessary. Returns a chaining reference if all + data was written; throws an IOException indicating eof or + eob if not. + + This is often used in lieu of a Writer. + + ***********************************************************************/ + + abstract IBuffer append (IBuffer other); + + /*********************************************************************** + + Consume content from a producer + + Params: + The content to consume. This is consumed verbatim, and in + raw binary format ~ no implicit conversions are performed. + + Remarks: + This is often used in lieu of a Writer, and enables simple + classes, such as FilePath and Uri, to emit content directly + into a buffer (thus avoiding potential heap activity) + + Examples: + --- + auto path = new FilePath (somepath); + + path.produce (&buffer.consume); + --- + + ***********************************************************************/ + + abstract void consume (void[] src); + + /*********************************************************************** + + Read a chunk of data from the buffer, loading from the + conduit as necessary. The requested number of bytes are + loaded into the buffer, and marked as having been read + when the 'eat' parameter is set true. When 'eat' is set + false, the read position is not adjusted. + + Returns the corresponding buffer slice when successful, + or null if there's not enough data available (Eof; Eob). + + ***********************************************************************/ + + abstract void[] slice (uint size, bool eat = true); + + /*********************************************************************** + + Access buffer content + + Params: + dst = destination of the content + bytes = size of dst + + Returns: + A reference to the populated content + + Remarks: + Fill the provided array with content. We try to satisfy + the request from the buffer content, and read directly + from an attached conduit where more is required. + + ***********************************************************************/ + + abstract void[] readExact (void* dst, uint bytes); + + /********************************************************************** + + Fill the provided buffer. Returns the number of bytes + actually read, which will be less than dst.length when + Eof has been reached and IConduit.Eof thereafter. + + **********************************************************************/ + + abstract uint fill (void[] dst); + + /*********************************************************************** + + Exposes the raw data buffer at the current write position, + The delegate is provided with a void[] representing space + available within the buffer at the current write position. + + The delegate should return the approriate number of bytes + if it writes valid content, or IConduit.Eof on error. + + Returns whatever the delegate returns. + + ***********************************************************************/ + + abstract uint write (uint delegate (void[]) writer); + + /*********************************************************************** + + Exposes the raw data buffer at the current read position. The + delegate is provided with a void[] representing the available + data, and should return zero to leave the current read position + intact. + + If the delegate consumes data, it should return the number of + bytes consumed; or IConduit.Eof to indicate an error. + + Returns whatever the delegate returns. + + ***********************************************************************/ + + abstract uint read (uint delegate (void[]) reader); + + /*********************************************************************** + + If we have some data left after an export, move it to + front-of-buffer and set position to be just after the + remains. This is for supporting certain conduits which + choose to write just the initial portion of a request. + + Limit is set to the amount of data remaining. Position + is always reset to zero. + + ***********************************************************************/ + + abstract IBuffer compress (); + + /*********************************************************************** + + Skip ahead by the specified number of bytes, streaming from + the associated conduit as necessary. + + Can also reverse the read position by 'size' bytes. This may + be used to support lookahead-type operations. + + Returns true if successful, false otherwise. + + ***********************************************************************/ + + abstract bool skip (int size); + + /*********************************************************************** + + Support for tokenizing iterators. + + Upon success, the delegate should return the byte-based + index of the consumed pattern (tail end of it). Failure + to match a pattern should be indicated by returning an + IConduit.Eof. + + Each pattern is expected to be stripped of the delimiter. + An end-of-file condition causes trailing content to be + placed into the token. Requests made beyond Eof result + in empty matches (length == zero). + + Note that additional iterator and/or reader instances + will stay in lockstep when bound to a common buffer. + + Returns true if a token was isolated, false otherwise. + + ***********************************************************************/ + + abstract bool next (uint delegate (void[])); + + /*********************************************************************** + + Try to _fill the available buffer with content from the + specified conduit. We try to read as much as possible + by clearing the buffer when all current content has been + eaten. If there is no space available, nothing will be + read. + + Returns the number of bytes read, or Conduit.Eof. + + ***********************************************************************/ + + abstract uint fill (InputStream src); + + /*********************************************************************** + + Write as much of the buffer that the associated conduit + can consume. + + Returns the number of bytes written, or Conduit.Eof. + + ***********************************************************************/ + + abstract uint drain (OutputStream dst); + + /*********************************************************************** + + Truncate the buffer within its extent. Returns true if + the new 'extent' is valid, false otherwise. + + ***********************************************************************/ + + abstract bool truncate (uint extent); + + /*********************************************************************** + + Return count of readable bytes remaining in buffer. This is + calculated simply as limit() - position(). + + ***********************************************************************/ + + abstract uint readable (); + + /*********************************************************************** + + Return count of writable bytes available in buffer. This is + calculated simply as capacity() - limit(). + + ***********************************************************************/ + + abstract uint writable (); + + /*********************************************************************** + + Returns the limit of readable content within this buffer. + + ***********************************************************************/ + + abstract uint limit (); + + /*********************************************************************** + + Returns the total capacity of this buffer. + + ***********************************************************************/ + + abstract uint capacity (); + + /*********************************************************************** + + Returns the current position within this buffer. + + ***********************************************************************/ + + abstract uint position (); + + /*********************************************************************** + + Sets the external conduit associated with this buffer. + + Buffers do not require an external conduit to operate, but + it can be convenient to associate one. For example, methods + read and write use it to import/export content as necessary. + + ***********************************************************************/ + + abstract IBuffer setConduit (IConduit conduit); + + /*********************************************************************** + + Set output stream + + Params: + sink = the stream to attach to + + Remarks: + Sets the external output stream associated with this buffer. + + Buffers do not require an external stream to operate, but + it can be convenient to associate one. For example, methods + fill & drain use them to import/export content as necessary. + + ***********************************************************************/ + + abstract IBuffer output (OutputStream sink); + + /*********************************************************************** + + Set input stream + + Params: + source = the stream to attach to + + Remarks: + Sets the external input stream associated with this buffer. + + Buffers do not require an external stream to operate, but + it can be convenient to associate one. For example, methods + fill & drain use them to import/export content as necessary. + + ***********************************************************************/ + + abstract IBuffer input (InputStream source); + + /*********************************************************************** + + Transfer content into the provided dst. + + Params: + dst = destination of the content + + Returns: + Return the number of bytes read, which may be less than + dst.length. Eof is returned when no further content is + available. + + Remarks: + Populates the provided array with content. We try to + satisfy the request from the buffer content, and read + directly from an attached conduit when the buffer is + empty. + + ***********************************************************************/ + + abstract uint read (void[] dst); + + /*********************************************************************** + + Emulate OutputStream.write() + + Params: + src = the content to write + + Returns: + Return the number of bytes written, which will be Eof when + the content cannot be written. + + Remarks: + Appends all of dst to the buffer, flushing to an attached + conduit as necessary. + + ***********************************************************************/ + + abstract uint write (void[] src); + + /*********************************************************************** + + Exposes configured output stream + + Returns: + Returns the OutputStream associated with this buffer. Returns + null if the buffer is not attached to an output; that is, it's + not backed by some external medium. + + Remarks: + Buffers do not require an external stream to operate, but + it can be convenient to associate them. For example, methods + fill & drain use them to import/export content as necessary. + + ***********************************************************************/ + + abstract OutputStream output (); + + /*********************************************************************** + + Exposes configured input stream + + Returns: + Returns the InputStream associated with this buffer. Returns + null if the buffer is not attached to an input; that is, it's + not backed by some external medium. + + Remarks: + Buffers do not require an external stream to operate, but + it can be convenient to associate them. For example, methods + fill & drain use them to import/export content as necessary. + + ***********************************************************************/ + + abstract InputStream input (); + + /*********************************************************************** + + Throw an exception with the provided message + + ***********************************************************************/ + + abstract void error (char[] msg); + + /*********************************************************************** + + Access configured conduit + + Returns: + Returns the conduit associated with this buffer. Returns + null if the buffer is purely memory based; that is, it's + not backed by some external medium. + + Remarks: + Buffers do not require an external conduit to operate, but + it can be convenient to associate one. For example, methods + fill() & drain() use it to import/export content as necessary. + + ***********************************************************************/ + + abstract IConduit conduit (); + + /*********************************************************************** + + Return a preferred size for buffering conduit I/O. + + ***********************************************************************/ + + abstract uint bufferSize (); + + /*********************************************************************** + + Return the name of this conduit. + + ***********************************************************************/ + + abstract char[] toString (); + + /*********************************************************************** + + Is the conduit alive? + + ***********************************************************************/ + + abstract bool isAlive (); + + /*********************************************************************** + + Flush the contents of this buffer to the related conduit. + Throws an IOException on premature eof. + + ***********************************************************************/ + + abstract OutputStream flush (); + + /*********************************************************************** + + Reset position and limit to zero. + + ***********************************************************************/ + + abstract InputStream clear (); + + /*********************************************************************** + + Copy content via this buffer from the provided src + conduit. + + Remarks: + The src conduit has its content transferred through + this buffer via a series of fill & drain operations, + until there is no more content available. The buffer + content should be explicitly flushed by the caller. + + Throws an IOException on premature Eof. + + ***********************************************************************/ + + abstract OutputStream copy (InputStream src); + + /*********************************************************************** + + Release external resources + + ***********************************************************************/ + + abstract void detach (); + + /*********************************************************************** + + Close the stream + + Remarks: + Propagate request to an attached OutputStream (this is a + requirement for the OutputStream interface) + + ***********************************************************************/ + + abstract void close (); +} + + +/******************************************************************************* + + Supported by streams which are prepared to share an internal buffer + instance. This is intended to avoid a situation whereby content is + shunted unnecessarily from one buffer to another when "decorator" + streams are connected together in arbitrary ways. + + Do not implement this if the internal buffer should not be accessed + directly by another stream e.g. if wrapper methods manipulate content + on the way in or out of the buffer. + +*******************************************************************************/ + +interface Buffered +{ + IBuffer buffer(); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/model/IConduit.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/model/IConduit.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,248 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: March 2004 + Outback release: December 2006 + + author: Kris + +*******************************************************************************/ + +module tango.io.model.IConduit; + +public import tango.io.model.IBuffer; + +/******************************************************************************* + + Conduits provide virtualized access to external content, and + represent things like files or Internet connections. Conduits + expose a pair of streams, are modelled by tango.io.model.IConduit, + and are implemented via classes such as FileConduit & SocketConduit. + + Additional kinds of conduit are easy to construct: one either + subclasses tango.io.Conduit, or implements tango.io.model.IConduit. + A conduit typically reads and writes from/to an IBuffer in large + chunks, typically the entire buffer. Alternatively, one can invoke + input.read(dst[]) and/or output.write(src[]) directly. + +*******************************************************************************/ + +interface IConduit : InputStream, OutputStream +{ + /*********************************************************************** + + Return the input stream + + ***********************************************************************/ + + abstract InputStream input (); + + /*********************************************************************** + + Return the output stream + + ***********************************************************************/ + + abstract OutputStream output (); + + /*********************************************************************** + + Return a preferred size for buffering conduit I/O + + ***********************************************************************/ + + abstract uint bufferSize (); + + /*********************************************************************** + + Return the name of this conduit + + ***********************************************************************/ + + abstract char[] toString (); + + /*********************************************************************** + + Is the conduit alive? + + ***********************************************************************/ + + abstract bool isAlive (); + + /*********************************************************************** + + Release external resources + + ***********************************************************************/ + + abstract void detach (); + + /*********************************************************************** + + Throw a generic IO exception with the provided msg + + ***********************************************************************/ + + abstract void error (char[] msg); + + /*********************************************************************** + + Models the ability to seek within a conduit + + ***********************************************************************/ + + interface Seek + { + /*************************************************************** + + The anchor positions supported by seek() + + ***************************************************************/ + + enum Anchor { + Begin = 0, + Current = 1, + End = 2, + }; + + /*************************************************************** + + Move the file position to the given offset from the + provided anchor point, and return adjusted position. + + ***************************************************************/ + + long seek (long offset, Anchor anchor = Anchor.Begin); + } +} + + +/******************************************************************************* + + Describes how to make an IO entity usable with selectors + +*******************************************************************************/ + +interface ISelectable +{ + typedef int Handle = -1; /// opaque OS file-handle + + /*********************************************************************** + + Models a handle-oriented device. + + TODO: figure out how to avoid exposing this in the general + case + + ***********************************************************************/ + + Handle fileHandle (); +} + + +/******************************************************************************* + + The common attributes of streams + +*******************************************************************************/ + +interface IOStream +{ + enum : uint + { + Eof = uint.max /// the End-of-Flow identifer + } + + /*********************************************************************** + + Return the host conduit + + ***********************************************************************/ + + IConduit conduit (); + + + /*********************************************************************** + + Close the input + + ***********************************************************************/ + + void close (); +} + + +/******************************************************************************* + + The Tango input stream + +*******************************************************************************/ + +interface InputStream : IOStream +{ + /*********************************************************************** + + Read from conduit into a target array. The provided dst + will be populated with content from the conduit. + + Returns the number of bytes read, which may be less than + requested in dst. Eof is returned whenever an end-of-flow + condition arises. + + ***********************************************************************/ + + uint read (void[] dst); + + /*********************************************************************** + + Clear any buffered content + + ***********************************************************************/ + + InputStream clear (); +} + + +/******************************************************************************* + + The Tango output stream + +*******************************************************************************/ + +interface OutputStream : IOStream +{ + /*********************************************************************** + + Write to conduit from a source array. The provided src + content will be written to the conduit. + + Returns the number of bytes written from src, which may + be less than the quantity provided. Eof is returned when + an end-of-flow condition arises. + + ***********************************************************************/ + + uint write (void[] src); + + /*********************************************************************** + + Transfer the content of another conduit to this one. Returns + a reference to this class, and throws IOException on failure. + + ***********************************************************************/ + + OutputStream copy (InputStream src); + + /*********************************************************************** + + Purge buffered content + + ***********************************************************************/ + + OutputStream flush (); +} + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/model/IListener.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/model/IListener.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,30 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: April 2004 + + author: Kris + +*******************************************************************************/ + +module tango.io.model.IListener; + + +/****************************************************************************** + +******************************************************************************/ + +interface IListener +{ + /*********************************************************************** + + Stop listening; this may be delayed until after the next + valid read operation. + + ***********************************************************************/ + + void cancel (); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/protocol/Allocator.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/protocol/Allocator.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,221 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: October 2004 + Outback release: December 2006 + + author: Kris + + Allocators to use in conjunction with the Reader class. These are + intended to manage array allocation for a variety of Reader.get() + methods + +*******************************************************************************/ + +module tango.io.protocol.Allocator; + +private import tango.io.protocol.model.IProtocol; + + +/******************************************************************************* + + Simple allocator, copying into the heap for each array requested: + this is the default behaviour for Reader instances + +*******************************************************************************/ + +class HeapCopy : IAllocator +{ + private IProtocol protocol_; + + /*********************************************************************** + + ***********************************************************************/ + + this (IProtocol protocol) + { + protocol_ = protocol; + } + + /*********************************************************************** + + ***********************************************************************/ + + final IProtocol protocol () + { + return protocol_; + } + + /*********************************************************************** + + ***********************************************************************/ + + final void reset () + { + } + + /*********************************************************************** + + ***********************************************************************/ + + final void[] allocate (IProtocol.Reader reader, uint bytes, IProtocol.Type type) + { + return reader ((new void[bytes]).ptr, bytes, type); + } +} + + +/******************************************************************************* + + Allocate from within a private heap space. This supports reading + data as 'records', reusing the same chunk of memory for each record + loaded. The ctor takes an argument defining the initial allocation + made, and this will be increased as necessary to accomodate larger + records. Use the reset() method to indicate end of record (reuse + memory for subsequent requests), or set the autoreset flag to reuse + upon each array request. + +*******************************************************************************/ + +class HeapSlice : IAllocator +{ + private uint used; + private void[] buffer; + private IProtocol protocol_; + private bool autoreset; + + /*********************************************************************** + + ***********************************************************************/ + + this (IProtocol protocol, uint width=4096, bool autoreset=false) + { + protocol_ = protocol; + buffer = new void[width]; + this.autoreset = autoreset; + } + + /*********************************************************************** + + ***********************************************************************/ + + final IProtocol protocol () + { + return protocol_; + } + + /*********************************************************************** + + Reset content length to zero + + ***********************************************************************/ + + final void reset () + { + used = 0; + } + + /*********************************************************************** + + No allocation: copy into a reserved arena. + + With HeapSlice, it is normal to allocate space large + enough to contain, say, a record of data. The reserved + space will grow to accomodate larger records. A reset() + call should be made between each record read, to ensure + the space is being reused. + + ***********************************************************************/ + + final void[] allocate (IProtocol.Reader reader, uint bytes, IProtocol.Type type) + { + if (autoreset) + used = 0; + + if ((used + bytes) > buffer.length) + buffer.length = (used + bytes) * 2; + + auto ptr = &buffer[used]; + used += bytes; + + return reader (ptr, bytes, type); + } +} + + +/******************************************************************************* + + Alias directly from the buffer instead of allocating from the heap. + This avoids both heap activity and copying, but requires some care + in terms of usage. See methods allocate() for details + +*******************************************************************************/ + +class BufferSlice : IAllocator +{ + private IProtocol protocol_; + + /*********************************************************************** + + ***********************************************************************/ + + this (IProtocol protocol) + { + protocol_ = protocol; + } + + /*********************************************************************** + + ***********************************************************************/ + + final IProtocol protocol () + { + return protocol_; + } + + /*********************************************************************** + + Move all unconsumed data to the front of the buffer, freeing + up space for more + + ***********************************************************************/ + + final void reset () + { + protocol.buffer.compress; + } + + /*********************************************************************** + + No alloc or copy: alias directly from buffer. While this is + very efficient (no heap activity) it should be used only in + scenarios where content is known to fit within a buffer, and + there is no conversion of said content e.g. take care when + using with EndianProtocol since it will convert within the + buffer, potentially confusing additional buffer clients. + + With BufferSlice, it is considered normal to create a Buffer + large enough to contain, say, a file and subsequently slice + all strings/arrays directly from this buffer. Smaller Buffers + can be used in a record-oriented manner similar to HeapSlice: + invoke reset() before each record is processed to ensure here + is sufficient space available in the buffer to house a complete + record. GrowBuffer could be used in the latter case, to ensure + the largest record width is always accomodated. + + A good use of this is in handling of network traffic, where + incoming data is often transient and of a known extent. For + another potential use, consider the quantity of distinct text + arrays generated by an XML parser -- would be convenient to + slice all of them from a single allocation instead + + ***********************************************************************/ + + final void[] allocate (IProtocol.Reader reader, uint bytes, IProtocol.Type type) + { + return protocol_.buffer.slice (bytes); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/protocol/EndianProtocol.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/protocol/EndianProtocol.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,169 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Jan 2007 : initial release + + author: Kris + +*******************************************************************************/ + +module tango.io.protocol.EndianProtocol; + +private import tango.core.ByteSwap; + +private import tango.io.model.IBuffer, + tango.io.model.IConduit; + +private import tango.io.protocol.NativeProtocol; + +/******************************************************************************* + +*******************************************************************************/ + +class EndianProtocol : NativeProtocol +{ + /*********************************************************************** + + ***********************************************************************/ + + this (IConduit conduit, bool prefix=true) + { + super (conduit, prefix); + } + + /*********************************************************************** + + ***********************************************************************/ + + override void[] read (void* dst, uint bytes, Type type) + { + auto ret = super.read (dst, bytes, type); + + switch (type) + { + case Type.Short: + case Type.UShort: + case Type.Utf16: + ByteSwap.swap16 (dst, bytes); + break; + + case Type.Int: + case Type.UInt: + case Type.Float: + case Type.Utf32: + ByteSwap.swap32 (dst, bytes); + break; + + case Type.Long: + case Type.ULong: + case Type.Double: + ByteSwap.swap64 (dst, bytes); + break; + + case Type.Real: + ByteSwap.swap80 (dst, bytes); + break; + + default: + break; + } + + return ret; + } + + /*********************************************************************** + + ***********************************************************************/ + + override void write (void* src, uint bytes, Type type) + { + alias void function (void* dst, uint bytes) Swapper; + + void write (int mask, Swapper mutate) + { + uint writer (void[] dst) + { + // cap bytes written + uint len = dst.length & mask; + if (len > bytes) + len = bytes; + + dst [0..len] = src [0..len]; + mutate (dst.ptr, len); + return len; + } + + while (bytes) + if (bytes -= buffer_.write (&writer)) + // flush if we used all buffer space + buffer_.drain (buffer.output); + } + + + switch (type) + { + case Type.Short: + case Type.UShort: + case Type.Utf16: + write (~1, &ByteSwap.swap16); + break; + + case Type.Int: + case Type.UInt: + case Type.Float: + case Type.Utf32: + write (~3, &ByteSwap.swap32); + break; + + case Type.Long: + case Type.ULong: + case Type.Double: + write (~7, &ByteSwap.swap64); + break; + + case Type.Real: + write (~15, &ByteSwap.swap80); + break; + + default: + super.write (src, bytes, type); + break; + } + } +} + + +/******************************************************************************* + +*******************************************************************************/ + +debug (UnitTest) +{ + import tango.io.Buffer; + + unittest + { + void[] alloc (EndianProtocol.Reader reader, uint bytes, EndianProtocol.Type type) + { + return reader ((new void[bytes]).ptr, bytes, type); + } + + char[] mule; + char[] test = "testing testing 123"; + + auto protocol = new EndianProtocol (new Buffer(32)); + protocol.writeArray (test.ptr, test.length, protocol.Type.Utf8); + + mule = cast(char[]) protocol.readArray (mule.ptr, mule.length, protocol.Type.Utf8, &alloc); + assert (mule == test); + + } +} + + + + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/protocol/NativeProtocol.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/protocol/NativeProtocol.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,121 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Jan 2007 : initial release + + author: Kris + +*******************************************************************************/ + +module tango.io.protocol.NativeProtocol; + +private import tango.io.Buffer; + +private import tango.io.protocol.model.IProtocol; + +/******************************************************************************* + +*******************************************************************************/ + +class NativeProtocol : IProtocol +{ + protected bool prefix_; + protected IBuffer buffer_; + + /*********************************************************************** + + ***********************************************************************/ + + this (IConduit conduit, bool prefix=true) + { + this.prefix_ = prefix; + + auto b = cast(Buffered) conduit; + buffer_ = b ? b.buffer : new Buffer(conduit); + } + + /*********************************************************************** + + ***********************************************************************/ + + IBuffer buffer () + { + return buffer_; + } + + /*********************************************************************** + + ***********************************************************************/ + + void[] read (void* dst, uint bytes, Type type) + { + return buffer_.readExact (dst, bytes); + } + + /*********************************************************************** + + ***********************************************************************/ + + void write (void* src, uint bytes, Type type) + { + buffer_.append (src, bytes); + } + + /*********************************************************************** + + ***********************************************************************/ + + void[] readArray (void* dst, uint bytes, Type type, Allocator alloc) + { + if (prefix_) + { + read (&bytes, bytes.sizeof, Type.UInt); + return alloc (&read, bytes, type); + } + + return read (dst, bytes, type); + } + + /*********************************************************************** + + ***********************************************************************/ + + void writeArray (void* src, uint bytes, Type type) + { + if (prefix_) + write (&bytes, bytes.sizeof, Type.UInt); + + write (src, bytes, type); + } +} + + + +/******************************************************************************* + +*******************************************************************************/ + +debug (UnitTest) +{ + import tango.io.Buffer; + import tango.io.protocol.Writer; + import tango.io.protocol.Reader; + import tango.io.protocol.NativeProtocol; + + unittest + { + auto protocol = new NativeProtocol (new Buffer(32)); + auto input = new Reader (protocol); + auto output = new Writer (protocol); + + char[] foo; + output ("testing testing 123"c); + input (foo); + assert (foo == "testing testing 123"); + } +} + + \ No newline at end of file diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/protocol/PickleProtocol.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/protocol/PickleProtocol.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,59 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Jan 2007 : initial release + + author: Kris + +*******************************************************************************/ + +module tango.io.protocol.PickleProtocol; + +/******************************************************************************* + +*******************************************************************************/ + +version (BigEndian) + { + private import tango.io.protocol.NativeProtocol; + public alias NativeProtocol PickleProtocol; + } + else + { + private import tango.io.protocol.EndianProtocol; + public alias EndianProtocol PickleProtocol; + } + + +/******************************************************************************* + +*******************************************************************************/ + +debug (UnitTest) +{ + import tango.io.Buffer; + + unittest + { + int test = 0xcc55ff00; + + auto protocol = new PickleProtocol (new Buffer(32)); + protocol.write (&test, test.sizeof, protocol.Type.Int); + + auto ptr = protocol.buffer.slice (test.sizeof, false).ptr; + protocol.read (&test, test.sizeof, protocol.Type.Int); + + assert (test == 0xcc55ff00); + + version (LittleEndian) + assert (*cast(int*) ptr == 0x00ff55cc); + } +} + + + + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/protocol/Reader.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/protocol/Reader.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,619 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Oct 2004: Initial release + Dec 2006: Outback release + + author: Kris + +*******************************************************************************/ + +module tango.io.protocol.Reader; + +private import tango.io.Buffer; + +public import tango.io.model.IBuffer, + tango.io.model.IConduit; + +public import tango.io.protocol.model.IReader; + +private import tango.io.protocol.model.IProtocol; + +/******************************************************************************* + + Reader base-class. Each reader operates upon an IBuffer, which is + provided at construction time. Readers are simple converters of data, + and have reasonably rigid rules regarding data format. For example, + each request for data expects the content to be available; an exception + is thrown where this is not the case. If the data is arranged in a more + relaxed fashion, consider using IBuffer directly instead. + + All readers support the full set of native data types, plus a full + selection of array types. The latter can be configured to produce + either a copy (.dup) of the buffer content, or a slice. See classes + HeapCopy, BufferSlice and HeapSlice for more on this topic. Applications + can disable memory management by configuring a Reader with one of the + binary oriented protocols, and ensuring the optional protocol 'prefix' + is disabled. + + Readers support Java-esque get() notation. However, the Tango + style is to place IO elements within their own parenthesis, like + so: + + --- + int count; + char[] verse; + + read (verse) (count); + --- + + Note that each element read is distict; this style is affectionately + known as "whisper". The code below illustrates basic operation upon a + memory buffer: + + --- + auto buf = new Buffer (256); + + // map same buffer into both reader and writer + auto read = new Reader (buf); + auto write = new Writer (buf); + + int i = 10; + long j = 20; + double d = 3.14159; + char[] c = "fred"; + + // write data using whisper syntax + write (c) (i) (j) (d); + + // read them back again + read (c) (i) (j) (d); + + + // same thing again, but using put() syntax instead + write.put(c).put(i).put(j).put(d); + read.get(c).get(i).get(j).get(d); + --- + + Note that certain protocols, such as the basic binary implementation, + expect to retrieve the number of array elements from the source. For + example: when reading an array from a file, the number of elements + is read from the file also, and the configurable memory-manager is + invoked to provide the array space. If content is not arranged in + such a manner you may read array content directly either by creating + a Reader with a protocol configured to sidestep array-prefixing, or + by accessing buffer content directly (via the methods exposed there) + e.g. + + --- + void[10] data; + + reader.buffer.fill (data); + --- + + Readers may also be used with any class implementing the IReadable + interface, along with any struct implementing an equivalent method + +*******************************************************************************/ + +class Reader : IReader +{ + // the buffer associated with this reader. Note that this + // should not change over the lifetime of the reader, since + // it is assumed to be immutable elsewhere + private IBuffer buffer_; + + // memory-manager for array requests + private IAllocator memory; + private IProtocol.Allocator allocator_; + + // the assigned serialization protocol + private IProtocol.ArrayReader arrays; + private IProtocol.Reader elements; + + /*********************************************************************** + + Construct a Reader upon the provided stream. We do our own + protocol handling, equivalent to the NativeProtocol. Array + allocation is supported via the heap + + ***********************************************************************/ + + this (InputStream stream) + { + auto b = cast(Buffered) stream; + buffer_ = (b ? b.buffer : new Buffer (stream.conduit)); + + allocator_ = &allocate; + elements = &readElement; + arrays = &readArray; + } + + /*********************************************************************** + + Construct Reader on the provided protocol. This configures + the IO conversion to be that of the protocol, but allocation + of arrays is still handled by the heap + + ***********************************************************************/ + + this (IProtocol protocol) + { + allocator_ = &allocate; + elements = &protocol.read; + arrays = &protocol.readArray; + buffer_ = protocol.buffer; + } + + /*********************************************************************** + + Set the array allocator, and protocol, for this Reader. See + method allocator() for more info + + ***********************************************************************/ + + this (IAllocator allocator) + { + this (allocator.protocol); + allocator_ = &allocator.allocate; + } + + /*********************************************************************** + + Return the buffer associated with this reader + + ***********************************************************************/ + + final IBuffer buffer () + { + return buffer_; + } + + /*********************************************************************** + + Get the allocator to use for array management. Arrays are + generally allocated by the IReader, via configured managers. + A number of Allocator classes are available to manage memory + when reading array content. Alternatively, the application + may obtain responsibility for allocation by selecting one of + the NativeProtocol deriviatives and setting 'prefix' to be + false. The latter disables internal array management. + + Gaining access to the allocator can expose some additional + controls. For example, some allocators benefit from a reset + operation after each data 'record' has been processed. + + By default, an IReader will allocate each array from the + heap. You can change that by constructing the Reader + with an Allocator of choice. For instance, there is a + BufferSlice which will slice an array directly from + the buffer where possible. Also available is the record- + oriented HeaoSlice, which slices memory from within + a pre-allocated heap area, and should be reset by the client + code after each record has been read (to avoid unnecessary + growth). + + See module tango.io.protocol.Allocator for more information + + ***********************************************************************/ + + final IAllocator allocator () + { + return memory; + } + + /*********************************************************************** + + Extract a readable class from the current read-position + + ***********************************************************************/ + + final IReader get (IReader.Closure dg) + { + dg (this); + return this; + } + + /*********************************************************************** + + Extract a readable class from the current read-position + + ***********************************************************************/ + + final IReader get (IReadable x) + { + if (x is null) + buffer_.error ("Reader.get :: attempt to read a null IReadable object"); + + return get (&x.read); + } + + /*********************************************************************** + + Extract a boolean value from the current read-position + + ***********************************************************************/ + + final IReader get (inout bool x) + { + elements (&x, x.sizeof, IProtocol.Type.Bool); + return this; + } + + /*********************************************************************** + + Extract an unsigned byte value from the current read-position + + ***********************************************************************/ + + final IReader get (inout ubyte x) + { + elements (&x, x.sizeof, IProtocol.Type.UByte); + return this; + } + + /*********************************************************************** + + Extract a byte value from the current read-position + + ***********************************************************************/ + + final IReader get (inout byte x) + { + elements (&x, x.sizeof, IProtocol.Type.Byte); + return this; + } + + /*********************************************************************** + + Extract an unsigned short value from the current read-position + + ***********************************************************************/ + + final IReader get (inout ushort x) + { + elements (&x, x.sizeof, IProtocol.Type.UShort); + return this; + } + + /*********************************************************************** + + Extract a short value from the current read-position + + ***********************************************************************/ + + final IReader get (inout short x) + { + elements (&x, x.sizeof, IProtocol.Type.Short); + return this; + } + + /*********************************************************************** + + Extract a unsigned int value from the current read-position + + ***********************************************************************/ + + final IReader get (inout uint x) + { + elements (&x, x.sizeof, IProtocol.Type.UInt); + return this; + } + + /*********************************************************************** + + Extract an int value from the current read-position + + ***********************************************************************/ + + final IReader get (inout int x) + { + elements (&x, x.sizeof, IProtocol.Type.Int); + return this; + } + + /*********************************************************************** + + Extract an unsigned long value from the current read-position + + ***********************************************************************/ + + final IReader get (inout ulong x) + { + elements (&x, x.sizeof, IProtocol.Type.ULong); + return this; + } + + /*********************************************************************** + + Extract a long value from the current read-position + + ***********************************************************************/ + + final IReader get (inout long x) + { + elements (&x, x.sizeof, IProtocol.Type.Long); + return this; + } + + /*********************************************************************** + + Extract a float value from the current read-position + + ***********************************************************************/ + + final IReader get (inout float x) + { + elements (&x, x.sizeof, IProtocol.Type.Float); + return this; + } + + /*********************************************************************** + + Extract a double value from the current read-position + + ***********************************************************************/ + + final IReader get (inout double x) + { + elements (&x, x.sizeof, IProtocol.Type.Double); + return this; + } + + /*********************************************************************** + + Extract a real value from the current read-position + + ***********************************************************************/ + + final IReader get (inout real x) + { + elements (&x, x.sizeof, IProtocol.Type.Real); + return this; + } + + /*********************************************************************** + + Extract a char value from the current read-position + + ***********************************************************************/ + + final IReader get (inout char x) + { + elements (&x, x.sizeof, IProtocol.Type.Utf8); + return this; + } + + /*********************************************************************** + + Extract a wide char value from the current read-position + + ***********************************************************************/ + + final IReader get (inout wchar x) + { + elements (&x, x.sizeof, IProtocol.Type.Utf16); + return this; + } + + /*********************************************************************** + + Extract a double char value from the current read-position + + ***********************************************************************/ + + final IReader get (inout dchar x) + { + elements (&x, x.sizeof, IProtocol.Type.Utf32); + return this; + } + + /*********************************************************************** + + Extract an boolean array from the current read-position + + ***********************************************************************/ + + final IReader get (inout bool[] x) + { + return loadArray (cast(void[]*) &x, bool.sizeof, IProtocol.Type.Bool); + } + + /*********************************************************************** + + Extract an unsigned byte array from the current read-position + + ***********************************************************************/ + + final IReader get (inout ubyte[] x) + { + return loadArray (cast(void[]*) &x, ubyte.sizeof, IProtocol.Type.UByte); + } + + /*********************************************************************** + + Extract a byte array from the current read-position + + ***********************************************************************/ + + final IReader get (inout byte[] x) + { + return loadArray (cast(void[]*) &x, byte.sizeof, IProtocol.Type.Byte); + } + + /*********************************************************************** + + Extract an unsigned short array from the current read-position + + ***********************************************************************/ + + final IReader get (inout ushort[] x) + { + return loadArray (cast(void[]*) &x, ushort.sizeof, IProtocol.Type.UShort); + } + + /*********************************************************************** + + Extract a short array from the current read-position + + ***********************************************************************/ + + final IReader get (inout short[] x) + { + return loadArray (cast(void[]*) &x, short.sizeof, IProtocol.Type.Short); + } + + /*********************************************************************** + + Extract a unsigned int array from the current read-position + + ***********************************************************************/ + + final IReader get (inout uint[] x) + { + return loadArray (cast(void[]*) &x, uint.sizeof, IProtocol.Type.UInt); + } + + /*********************************************************************** + + Extract an int array from the current read-position + + ***********************************************************************/ + + final IReader get (inout int[] x) + { + return loadArray (cast(void[]*) &x, int.sizeof, IProtocol.Type.Int); + } + + /*********************************************************************** + + Extract an unsigned long array from the current read-position + + ***********************************************************************/ + + final IReader get (inout ulong[] x) + { + return loadArray (cast(void[]*) &x, ulong.sizeof, IProtocol.Type.ULong); + } + + /*********************************************************************** + + Extract a long array from the current read-position + + ***********************************************************************/ + + final IReader get (inout long[] x) + { + return loadArray (cast(void[]*) &x,long.sizeof, IProtocol.Type.Long); + } + + /*********************************************************************** + + Extract a float array from the current read-position + + ***********************************************************************/ + + final IReader get (inout float[] x) + { + return loadArray (cast(void[]*) &x, float.sizeof, IProtocol.Type.Float); + } + + /*********************************************************************** + + Extract a double array from the current read-position + + ***********************************************************************/ + + final IReader get (inout double[] x) + { + return loadArray (cast(void[]*) &x, double.sizeof, IProtocol.Type.Double); + } + + /*********************************************************************** + + Extract a real array from the current read-position + + ***********************************************************************/ + + final IReader get (inout real[] x) + { + return loadArray (cast(void[]*) &x, real.sizeof, IProtocol.Type.Real); + } + + /*********************************************************************** + + Extract a char array from the current read-position + + ***********************************************************************/ + + final IReader get (inout char[] x) + { + return loadArray (cast(void[]*) &x, char.sizeof, IProtocol.Type.Utf8); + } + + /*********************************************************************** + + Extract a wchar array from the current read-position + + ***********************************************************************/ + + final IReader get (inout wchar[] x) + { + return loadArray (cast(void[]*) &x, wchar.sizeof, IProtocol.Type.Utf16); + } + + /*********************************************************************** + + Extract a dchar array from the current read-position + + ***********************************************************************/ + + final IReader get (inout dchar[] x) + { + return loadArray (cast(void[]*) &x, dchar.sizeof, IProtocol.Type.Utf32); + } + + + + /*********************************************************************** + + ***********************************************************************/ + + private IReader loadArray (void[]* x, uint width, IProtocol.Type type) + { + *x = arrays (x.ptr, x.length * width, type, allocator_) [0 .. $/width]; + return this; + } + + /*********************************************************************** + + ***********************************************************************/ + + private void[] allocate (IProtocol.Reader reader, uint bytes, IProtocol.Type type) + { + return reader ((new void[bytes]).ptr, bytes, type); + } + + /*********************************************************************** + + ***********************************************************************/ + + private void[] readElement (void* dst, uint bytes, IProtocol.Type type) + { + return buffer_.readExact (dst, bytes); + } + + /*********************************************************************** + + ***********************************************************************/ + + private void[] readArray (void* dst, uint bytes, IProtocol.Type type, IProtocol.Allocator alloc) + { + readElement (&bytes, bytes.sizeof, IProtocol.Type.UInt); + return alloc (&readElement, bytes, type); + } +} + \ No newline at end of file diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/protocol/Writer.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/protocol/Writer.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,586 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Oct 2004: Initial release + Dec 2006: Outback release + + author: Kris + +*******************************************************************************/ + +module tango.io.protocol.Writer; + +private import tango.io.Buffer, + tango.io.FileConst; + +public import tango.io.model.IBuffer, + tango.io.model.IConduit; + +public import tango.io.protocol.model.IWriter; + +private import tango.io.protocol.model.IProtocol; + +/******************************************************************************* + + Writer base-class. Writers provide the means to append formatted + data to an IBuffer, and expose a convenient method of handling a + variety of data types. In addition to writing native types such + as integer and char[], writers also process any class which has + implemented the IWritable interface (one method). + + All writers support the full set of native data types, plus their + fundamental array variants. Operations may be chained back-to-back. + + Writers support a Java-esque put() notation. However, the Tango style + is to place IO elements within their own parenthesis, like so: + + --- + write (count) (" green bottles"); + --- + + Note that each written element is distict; this style is affectionately + known as "whisper". The code below illustrates basic operation upon a + memory buffer: + + --- + auto buf = new Buffer (256); + + // map same buffer into both reader and writer + auto read = new Reader (buf); + auto write = new Writer (buf); + + int i = 10; + long j = 20; + double d = 3.14159; + char[] c = "fred"; + + // write data types out + write (c) (i) (j) (d); + + // read them back again + read (c) (i) (j) (d); + + + // same thing again, but using put() syntax instead + write.put(c).put(i).put(j).put(d); + read.get(c).get(i).get(j).get(d); + --- + + Writers may also be used with any class implementing the IWritable + interface, along with any struct implementing an equivalent function. + +*******************************************************************************/ + +class Writer : IWriter +{ + // the buffer associated with this writer. Note that this + // should not change over the lifetime of the reader, since + // it is assumed to be immutable elsewhere + package IBuffer buffer_; + + package IProtocol.ArrayWriter arrays; + package IProtocol.Writer elements; + + // end of line sequence + package char[] eol = FileConst.NewlineString; + + /*********************************************************************** + + Construct a Writer on the provided Protocol + + ***********************************************************************/ + + this (IProtocol protocol) + { + buffer_ = protocol.buffer; + elements = &protocol.write; + arrays = &protocol.writeArray; + } + + /*********************************************************************** + + Construct a Writer on the given OutputStream. We do our own + protocol handling, equivalent to the NativeProtocol. + + ***********************************************************************/ + + this (OutputStream stream) + { + auto b = cast(Buffered) stream; + buffer_ = (b ? b.buffer : new Buffer (stream.conduit)); + + arrays = &writeArray; + elements = &writeElement; + } + + /*********************************************************************** + + Return the associated buffer + + ***********************************************************************/ + + final IBuffer buffer () + { + return buffer_; + } + + /*********************************************************************** + + Emit a newline + + ***********************************************************************/ + + IWriter newline () + { + return put (eol); + } + + /*********************************************************************** + + set the newline sequence + + ***********************************************************************/ + + IWriter newline (char[] eol) + { + this.eol = eol; + return this; + } + + /*********************************************************************** + + Flush the output of this writer and return a chaining ref + + ***********************************************************************/ + + final IWriter flush () + { + buffer_.flush; + return this; + } + + /*********************************************************************** + + Flush this writer. This is a convenience method used by + the "whisper" syntax. + + ***********************************************************************/ + + final IWriter put () + { + return flush; + } + + /*********************************************************************** + + Write via a delegate to the current buffer-position + + ***********************************************************************/ + + final IWriter put (IWriter.Closure dg) + { + dg (this); + return this; + } + + /*********************************************************************** + + Write a class to the current buffer-position + + ***********************************************************************/ + + final IWriter put (IWritable x) + { + if (x is null) + buffer_.error ("Writer.put :: attempt to write a null IWritable object"); + + return put (&x.write); + } + + /*********************************************************************** + + Write a boolean value to the current buffer-position + + ***********************************************************************/ + + final IWriter put (bool x) + { + elements (&x, x.sizeof, IProtocol.Type.Bool); + return this; + } + + /*********************************************************************** + + Write an unsigned byte value to the current buffer-position + + ***********************************************************************/ + + final IWriter put (ubyte x) + { + elements (&x, x.sizeof, IProtocol.Type.UByte); + return this; + } + + /*********************************************************************** + + Write a byte value to the current buffer-position + + ***********************************************************************/ + + final IWriter put (byte x) + { + elements (&x, x.sizeof, IProtocol.Type.Byte); + return this; + } + + /*********************************************************************** + + Write an unsigned short value to the current buffer-position + + ***********************************************************************/ + + final IWriter put (ushort x) + { + elements (&x, x.sizeof, IProtocol.Type.UShort); + return this; + } + + /*********************************************************************** + + Write a short value to the current buffer-position + + ***********************************************************************/ + + final IWriter put (short x) + { + elements (&x, x.sizeof, IProtocol.Type.Short); + return this; + } + + /*********************************************************************** + + Write a unsigned int value to the current buffer-position + + ***********************************************************************/ + + final IWriter put (uint x) + { + elements (&x, x.sizeof, IProtocol.Type.UInt); + return this; + } + + /*********************************************************************** + + Write an int value to the current buffer-position + + ***********************************************************************/ + + final IWriter put (int x) + { + elements (&x, x.sizeof, IProtocol.Type.Int); + return this; + } + + /*********************************************************************** + + Write an unsigned long value to the current buffer-position + + ***********************************************************************/ + + final IWriter put (ulong x) + { + elements (&x, x.sizeof, IProtocol.Type.ULong); + return this; + } + + /*********************************************************************** + + Write a long value to the current buffer-position + + ***********************************************************************/ + + final IWriter put (long x) + { + elements (&x, x.sizeof, IProtocol.Type.Long); + return this; + } + + /*********************************************************************** + + Write a float value to the current buffer-position + + ***********************************************************************/ + + final IWriter put (float x) + { + elements (&x, x.sizeof, IProtocol.Type.Float); + return this; + } + + /*********************************************************************** + + Write a double value to the current buffer-position + + ***********************************************************************/ + + final IWriter put (double x) + { + elements (&x, x.sizeof, IProtocol.Type.Double); + return this; + } + + /*********************************************************************** + + Write a real value to the current buffer-position + + ***********************************************************************/ + + final IWriter put (real x) + { + elements (&x, x.sizeof, IProtocol.Type.Real); + return this; + } + + /*********************************************************************** + + Write a char value to the current buffer-position + + ***********************************************************************/ + + final IWriter put (char x) + { + elements (&x, x.sizeof, IProtocol.Type.Utf8); + return this; + } + + /*********************************************************************** + + Write a wchar value to the current buffer-position + + ***********************************************************************/ + + final IWriter put (wchar x) + { + elements (&x, x.sizeof, IProtocol.Type.Utf16); + return this; + } + + /*********************************************************************** + + Write a dchar value to the current buffer-position + + ***********************************************************************/ + + final IWriter put (dchar x) + { + elements (&x, x.sizeof, IProtocol.Type.Utf32); + return this; + } + + /*********************************************************************** + + Write a boolean array to the current buffer-position + + ***********************************************************************/ + + final IWriter put (bool[] x) + { + arrays (x.ptr, x.length * bool.sizeof, IProtocol.Type.Bool); + return this; + } + + /*********************************************************************** + + Write a byte array to the current buffer-position + + ***********************************************************************/ + + final IWriter put (byte[] x) + { + arrays (x.ptr, x.length * byte.sizeof, IProtocol.Type.Byte); + return this; + } + + /*********************************************************************** + + Write an unsigned byte array to the current buffer-position + + ***********************************************************************/ + + final IWriter put (ubyte[] x) + { + arrays (x.ptr, x.length * ubyte.sizeof, IProtocol.Type.UByte); + return this; + } + + /*********************************************************************** + + Write a short array to the current buffer-position + + ***********************************************************************/ + + final IWriter put (short[] x) + { + arrays (x.ptr, x.length * short.sizeof, IProtocol.Type.Short); + return this; + } + + /*********************************************************************** + + Write an unsigned short array to the current buffer-position + + ***********************************************************************/ + + final IWriter put (ushort[] x) + { + arrays (x.ptr, x.length * ushort.sizeof, IProtocol.Type.UShort); + return this; + } + + /*********************************************************************** + + Write an int array to the current buffer-position + + ***********************************************************************/ + + final IWriter put (int[] x) + { + arrays (x.ptr, x.length * int.sizeof, IProtocol.Type.Int); + return this; + } + + /*********************************************************************** + + Write an unsigned int array to the current buffer-position + + ***********************************************************************/ + + final IWriter put (uint[] x) + { + arrays (x.ptr, x.length * uint.sizeof, IProtocol.Type.UInt); + return this; + } + + /*********************************************************************** + + Write a long array to the current buffer-position + + ***********************************************************************/ + + final IWriter put (long[] x) + { + arrays (x.ptr, x.length * long.sizeof, IProtocol.Type.Long); + return this; + } + + /*********************************************************************** + + Write an unsigned long array to the current buffer-position + + ***********************************************************************/ + + final IWriter put (ulong[] x) + { + arrays (x.ptr, x.length * ulong.sizeof, IProtocol.Type.ULong); + return this; + } + + /*********************************************************************** + + Write a float array to the current buffer-position + + ***********************************************************************/ + + final IWriter put (float[] x) + { + arrays (x.ptr, x.length * float.sizeof, IProtocol.Type.Float); + return this; + } + + /*********************************************************************** + + Write a double array to the current buffer-position + + ***********************************************************************/ + + final IWriter put (double[] x) + { + arrays (x.ptr, x.length * double.sizeof, IProtocol.Type.Double); + return this; + } + + /*********************************************************************** + + Write a real array to the current buffer-position + + ***********************************************************************/ + + final IWriter put (real[] x) + { + arrays (x.ptr, x.length * real.sizeof, IProtocol.Type.Real); + return this; + } + + /*********************************************************************** + + Write a char array to the current buffer-position + + ***********************************************************************/ + + final IWriter put (char[] x) + { + arrays (x.ptr, x.length * char.sizeof, IProtocol.Type.Utf8); + return this; + } + + /*********************************************************************** + + Write a wchar array to the current buffer-position + + ***********************************************************************/ + + final IWriter put (wchar[] x) + { + arrays (x.ptr, x.length * wchar.sizeof, IProtocol.Type.Utf16); + return this; + } + + /*********************************************************************** + + Write a dchar array to the current buffer-position + + ***********************************************************************/ + + final IWriter put (dchar[] x) + { + arrays (x.ptr, x.length * dchar.sizeof, IProtocol.Type.Utf32); + return this; + } + + /*********************************************************************** + + Dump array content into the buffer. Note that the default + behaviour is to prefix with the array byte count + + ***********************************************************************/ + + private void writeArray (void* src, uint bytes, IProtocol.Type type) + { + put (bytes); + writeElement (src, bytes, type); + } + + /*********************************************************************** + + Dump content into the buffer + + ***********************************************************************/ + + private void writeElement (void* src, uint bytes, IProtocol.Type type) + { + buffer_.append (src [0 .. bytes]); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/protocol/model/IProtocol.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/protocol/model/IProtocol.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,112 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Jan 2007: initial release + + author: Kris + +*******************************************************************************/ + +module tango.io.protocol.model.IProtocol; + +private import tango.io.model.IBuffer; + +/******************************************************************************* + +*******************************************************************************/ + +abstract class IProtocol +{ + enum Type + { + Void = 0, + Utf8, + Bool, + Byte, + UByte, + Utf16, + Short, + UShort, + Utf32, + Int, + UInt, + Float, + Long, + ULong, + Double, + Real, + Obj, + Pointer, + } + + /*********************************************************************** + + ***********************************************************************/ + + alias void delegate (void* src, uint bytes, Type type) Writer; + alias void delegate (void* src, uint bytes, Type type) ArrayWriter; + + alias void[] delegate (void* dst, uint bytes, Type type) Reader; + alias void[] delegate (Reader reader, uint bytes, Type type) Allocator; + + alias void[] delegate (void* dst, uint bytes, Type type, Allocator) ArrayReader; + + /*********************************************************************** + + ***********************************************************************/ + + abstract IBuffer buffer (); + + /*********************************************************************** + + ***********************************************************************/ + + abstract void[] read (void* dst, uint bytes, Type type); + + /*********************************************************************** + + ***********************************************************************/ + + abstract void write (void* src, uint bytes, Type type); + + /*********************************************************************** + + ***********************************************************************/ + + abstract void[] readArray (void* dst, uint bytes, Type type, Allocator alloc); + + /*********************************************************************** + + ***********************************************************************/ + + abstract void writeArray (void* src, uint bytes, Type type); +} + + +/******************************************************************************* + +*******************************************************************************/ + +abstract class IAllocator +{ + /*********************************************************************** + + ***********************************************************************/ + + abstract void reset (); + + /*********************************************************************** + + ***********************************************************************/ + + abstract IProtocol protocol (); + + /*********************************************************************** + + ***********************************************************************/ + + abstract void[] allocate (IProtocol.Reader, uint bytes, IProtocol.Type); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/protocol/model/IReader.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/protocol/model/IReader.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,205 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Oct 2004: Initial release + Dec 2006: Outback release + + author: Kris + Ivan Senji (the "alias get" idea) + +*******************************************************************************/ + +module tango.io.protocol.model.IReader; + +public import tango.io.model.IBuffer; + +private import tango.io.protocol.model.IProtocol; + +/******************************************************************************* + + IReader interface. Each reader operates upon an IBuffer, which is + provided at construction time. Readers are simple converters of data, + and have reasonably rigid rules regarding data format. For example, + each request for data expects the content to be available; an exception + is thrown where this is not the case. If the data is arranged in a more + relaxed fashion, consider using IBuffer directly instead. + + All readers support the full set of native data types, plus a full + selection of array types. The latter can be configured to produce + either a copy (.dup) of the buffer content, or a slice. See classes + HeapCopy, BufferSlice and HeapSlice for more on this topic. Applications + can disable memory management by configuring a Reader with one of the + binary oriented protocols, and ensuring the optional protocol 'prefix' + is disabled. + + Readers support Java-esque get() notation. However, the Tango + style is to place IO elements within their own parenthesis, like + so: + + --- + int count; + char[] verse; + + read (verse) (count); + --- + + Note that each element read is distict; this style is affectionately + known as "whisper". The code below illustrates basic operation upon a + memory buffer: + + --- + auto buf = new Buffer (256); + + // map same buffer into both reader and writer + auto read = new Reader (buf); + auto write = new Writer (buf); + + int i = 10; + long j = 20; + double d = 3.14159; + char[] c = "fred"; + + // write data using whisper syntax + write (c) (i) (j) (d); + + // read them back again + read (c) (i) (j) (d); + + + // same thing again, but using put() syntax instead + write.put(c).put(i).put(j).put(d); + read.get(c).get(i).get(j).get(d); + --- + + Note that certain protocols, such as the basic binary implementation, + expect to retrieve the number of array elements from the source. For + example: when reading an array from a file, the number of elements + is read from the file also, and the configurable memory-manager is + invoked to provide the array space. If content is not arranged in + such a manner you may read array content directly either by creating + a Reader with a protocol configured to sidestep array-prefixing, or + by accessing buffer content directly (via the methods exposed there) + e.g. + + --- + void[10] data; + + reader.buffer.fill (data); + --- + + Readers may also be used with any class implementing the IReadable + interface, along with any struct implementing an equivalent method + +*******************************************************************************/ + +abstract class IReader // could be an interface, but that causes poor codegen +{ + alias get opCall; + + /*********************************************************************** + + These are the basic reader methods + + ***********************************************************************/ + + abstract IReader get (inout bool x); + abstract IReader get (inout byte x); /// ditto + abstract IReader get (inout ubyte x); /// ditto + abstract IReader get (inout short x); /// ditto + abstract IReader get (inout ushort x); /// ditto + abstract IReader get (inout int x); /// ditto + abstract IReader get (inout uint x); /// ditto + abstract IReader get (inout long x); /// ditto + abstract IReader get (inout ulong x); /// ditto + abstract IReader get (inout float x); /// ditto + abstract IReader get (inout double x); /// ditto + abstract IReader get (inout real x); /// ditto + abstract IReader get (inout char x); /// ditto + abstract IReader get (inout wchar x); /// ditto + abstract IReader get (inout dchar x); /// ditto + + abstract IReader get (inout bool[] x); /// ditto + abstract IReader get (inout byte[] x); /// ditto + abstract IReader get (inout short[] x); /// ditto + abstract IReader get (inout int[] x); /// ditto + abstract IReader get (inout long[] x); /// ditto + abstract IReader get (inout ubyte[] x); /// ditto + abstract IReader get (inout ushort[] x); /// ditto + abstract IReader get (inout uint[] x); /// ditto + abstract IReader get (inout ulong[] x); /// ditto + abstract IReader get (inout float[] x); /// ditto + abstract IReader get (inout double[] x); /// ditto + abstract IReader get (inout real[] x); /// ditto + abstract IReader get (inout char[] x); /// ditto + abstract IReader get (inout wchar[] x); /// ditto + abstract IReader get (inout dchar[] x); /// ditto + + /*********************************************************************** + + This is the mechanism used for binding arbitrary classes + to the IO system. If a class implements IReadable, it can + be used as a target for IReader get() operations. That is, + implementing IReadable is intended to transform any class + into an IReader adaptor for the content held therein. + + ***********************************************************************/ + + abstract IReader get (IReadable); + + alias void delegate (IReader) Closure; + + abstract IReader get (Closure); + + /*********************************************************************** + + Return the buffer associated with this reader + + ***********************************************************************/ + + abstract IBuffer buffer (); + + /*********************************************************************** + + Get the allocator to use for array management. Arrays are + generally allocated by the IReader, via configured managers. + A number of Allocator classes are available to manage memory + when reading array content. Alternatively, the application + may obtain responsibility for allocation by selecting one of + the NativeProtocol deriviatives and setting 'prefix' to be + false. The latter disables internal array management. + + Gaining access to the allocator can expose some additional + controls. For example, some allocators benefit from a reset + operation after each data 'record' has been processed. + + By default, an IReader will allocate each array from the + heap. You can change that by constructing the Reader + with an Allocator of choice. For instance, there is a + BufferSlice which will slice an array directly from + the buffer where possible. Also available is the record- + oriented HeaoSlice, which slices memory from within + a pre-allocated heap area, and should be reset by the client + code after each record has been read (to avoid unnecessary + growth). + + See module tango.io.protocol.Allocator for more information + + ***********************************************************************/ + + abstract IAllocator allocator (); +} + +/******************************************************************************* + + Any class implementing IReadable becomes part of the Reader framework + +*******************************************************************************/ + +interface IReadable +{ + void read (IReader input); +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/protocol/model/IWriter.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/protocol/model/IWriter.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,167 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Mar 2004: Initial release + Dec 2006: Outback release + + author: Kris + Ivan Senji (the "alias put" idea) + +*******************************************************************************/ + +module tango.io.protocol.model.IWriter; + +public import tango.io.model.IBuffer; + +/******************************************************************************* + + IWriter interface. Writers provide the means to append formatted + data to an IBuffer, and expose a convenient method of handling a + variety of data types. In addition to writing native types such + as integer and char[], writers also process any class which has + implemented the IWritable interface (one method). + + All writers support the full set of native data types, plus their + fundamental array variants. Operations may be chained back-to-back. + + Writers support a Java-esque put() notation. However, the Tango style + is to place IO elements within their own parenthesis, like so: + + --- + write (count) (" green bottles"); + --- + + Note that each written element is distict; this style is affectionately + known as "whisper". The code below illustrates basic operation upon a + memory buffer: + + --- + auto buf = new Buffer (256); + + // map same buffer into both reader and writer + auto read = new Reader (buf); + auto write = new Writer (buf); + + int i = 10; + long j = 20; + double d = 3.14159; + char[] c = "fred"; + + // write data types out + write (c) (i) (j) (d); + + // read them back again + read (c) (i) (j) (d); + + + // same thing again, but using put() syntax instead + write.put(c).put(i).put(j).put(d); + read.get(c).get(i).get(j).get(d); + + --- + + Writers may also be used with any class implementing the IWritable + interface, along with any struct implementing an equivalent function. + +*******************************************************************************/ + +abstract class IWriter // could be an interface, but that causes poor codegen +{ + alias put opCall; + + /*********************************************************************** + + These are the basic writer methods + + ***********************************************************************/ + + abstract IWriter put (bool x); + abstract IWriter put (ubyte x); ///ditto + abstract IWriter put (byte x); ///ditto + abstract IWriter put (ushort x); ///ditto + abstract IWriter put (short x); ///ditto + abstract IWriter put (uint x); ///ditto + abstract IWriter put (int x); ///ditto + abstract IWriter put (ulong x); ///ditto + abstract IWriter put (long x); ///ditto + abstract IWriter put (float x); ///ditto + abstract IWriter put (double x); ///ditto + abstract IWriter put (real x); ///ditto + abstract IWriter put (char x); ///ditto + abstract IWriter put (wchar x); ///ditto + abstract IWriter put (dchar x); ///ditto + + abstract IWriter put (bool[] x); + abstract IWriter put (byte[] x); ///ditto + abstract IWriter put (short[] x); ///ditto + abstract IWriter put (int[] x); ///ditto + abstract IWriter put (long[] x); ///ditto + abstract IWriter put (ubyte[] x); ///ditto + abstract IWriter put (ushort[] x); ///ditto + abstract IWriter put (uint[] x); ///ditto + abstract IWriter put (ulong[] x); ///ditto + abstract IWriter put (float[] x); ///ditto + abstract IWriter put (double[] x); ///ditto + abstract IWriter put (real[] x); ///ditto + abstract IWriter put (char[] x); ///ditto + abstract IWriter put (wchar[] x); ///ditto + abstract IWriter put (dchar[] x); ///ditto + + /*********************************************************************** + + This is the mechanism used for binding arbitrary classes + to the IO system. If a class implements IWritable, it can + be used as a target for IWriter put() operations. That is, + implementing IWritable is intended to transform any class + into an IWriter adaptor for the content held therein + + ***********************************************************************/ + + abstract IWriter put (IWritable); + + alias void delegate (IWriter) Closure; + + abstract IWriter put (Closure); + + /*********************************************************************** + + Emit a newline + + ***********************************************************************/ + + abstract IWriter newline (); + + /*********************************************************************** + + Flush the output of this writer. Throws an IOException + if the operation fails. These are aliases for each other + + ***********************************************************************/ + + abstract IWriter flush (); + abstract IWriter put (); ///ditto + + /*********************************************************************** + + Return the associated buffer + + ***********************************************************************/ + + abstract IBuffer buffer (); +} + + +/******************************************************************************* + + Interface to make any class compatible with any IWriter + +*******************************************************************************/ + +interface IWritable +{ + abstract void write (IWriter input); +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/selector/AbstractSelector.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/selector/AbstractSelector.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,394 @@ +/******************************************************************************* + copyright: Copyright (c) 2006 Juan Jose Comellas. All rights reserved + license: BSD style: $(LICENSE) + author: Juan Jose Comellas +*******************************************************************************/ + +module tango.io.selector.AbstractSelector; + +public import tango.io.model.IConduit; +public import tango.io.selector.SelectorException; + +private import tango.io.selector.model.ISelector; +private import tango.sys.Common; +private import tango.stdc.errno; + +version (Windows) +{ + public struct timeval + { + int tv_sec; // seconds + int tv_usec; // microseconds + } +} + +/** + * Base class for all selectors. + * + * A selector is a multiplexor for I/O events associated to a Conduit. + * All selectors must implement this interface. + * + * A selector needs to be initialized by calling the open() method to pass + * it the initial amount of conduits that it will handle and the maximum + * amount of events that will be returned per call to select(). In both cases, + * these values are only hints and may not even be used by the specific + * ISelector implementation you choose to use, so you cannot make any + * assumptions regarding what results from the call to select() (i.e. you + * may receive more or less events per call to select() than what was passed + * in the 'maxEvents' argument. The amount of conduits that the selector can + * manage will be incremented dynamically if necessary. + * + * To add, modify or remove conduit registrations to the selector you use + * the register(), reregister() and unregister() methods respectively. + * + * To wait for events from the conduits you need to call any of the select() + * methods. The selector cannot be modified from another thread while + * blocking on a call to these methods. + * + * Once the selector is no longer used you must call the close() method so + * that the selector can free any resources it may have allocated in the call + * to open(). + * + * See_Also: ISelector + * + * Examples: + * --- + * import tango.io.selector.model.ISelector; + * import tango.io.Stdout; + * import tango.net.SocketConduit; + * + * AbstractSelector selector; + * SocketConduit conduit1; + * SocketConduit conduit2; + * MyClass object1; + * MyClass object2; + * uint eventCount; + * + * // Initialize the selector assuming that it will deal with 2 conduits and + * // will receive 2 events per invocation to the select() method. + * selector.open(2, 2); + * + * selector.register(conduit, Event.Read, object1); + * selector.register(conduit, Event.Write, object2); + * + * eventCount = selector.select(); + * + * if (eventCount > 0) + * { + * char[16] buffer; + * int count; + * + * foreach (SelectionKey key, selector.selectedSet()) + * { + * if (key.isReadable()) + * { + * count = (cast(SocketConduit) key.conduit).read(buffer); + * if (count != IConduit.Eof) + * { + * Stdout.format("Received '{0}' from peer\n", buffer[0..count]); + * selector.reregister(key.conduit, Event.Write, key.attachment); + * } + * else + * { + * selector.unregister(key.conduit); + * key.conduit.close(); + * } + * } + * + * if (key.isWritable()) + * { + * count = (cast(SocketConduit) key.conduit).write("MESSAGE"); + * if (count != IConduit.Eof) + * { + * Stdout("Sent 'MESSAGE' to peer\n"); + * selector.reregister(key.conduit, Event.Read, key.attachment); + * } + * else + * { + * selector.unregister(key.conduit); + * key.conduit.close(); + * } + * } + * + * if (key.isError() || key.isHangup() || key.isInvalidHandle()) + * { + * selector.unregister(key.conduit); + * key.conduit.close(); + * } + * } + * } + * + * selector.close(); + * --- + */ +abstract class AbstractSelector: ISelector +{ + /** + * Restart interrupted system calls when blocking inside a call to select. + */ + protected bool _restartInterruptedSystemCall = true; + + /** + * Indicates whether interrupted system calls will be restarted when + * blocking inside a call to select. + */ + public bool restartInterruptedSystemCall() + { + return _restartInterruptedSystemCall; + } + + /** + * Sets whether interrupted system calls will be restarted when + * blocking inside a call to select. + */ + public void restartInterruptedSystemCall(bool value) + { + _restartInterruptedSystemCall = value; + } + + /** + * Initialize the selector. + * + * Params: + * size = value that provides a hint for the maximum amount of + * conduits that will be registered + * maxEvents = value that provides a hint for the maximum amount of + * conduit events that will be returned in the selection + * set per call to select. + */ + public abstract void open(uint size, uint maxEvents); + + /** + * Free any operating system resources that may have been allocated in the + * call to open(). + * + * Remarks: + * Not all of the selectors need to free resources other than allocated + * memory, but those that do will normally also add a call to close() in + * their destructors. + */ + public abstract void close(); + + /** + * Associate a conduit to the selector and track specific I/O events. + * + * Params: + * conduit = conduit that will be associated to the selector + * events = bit mask of Event values that represent the events that + * will be tracked for the conduit. + * attachment = optional object with application-specific data that will + * be available when an event is triggered for the conduit + * + * Examples: + * --- + * AbstractSelector selector; + * SocketConduit conduit; + * MyClass object; + * + * selector.register(conduit, Event.Read | Event.Write, object); + * --- + */ + public abstract void register(ISelectable conduit, Event events, + Object attachment); + + /** + * Modify the events that are being tracked or the 'attachment' field + * for an already registered conduit. + * + * Params: + * conduit = conduit that will be associated to the selector + * events = bit mask of Event values that represent the events that + * will be tracked for the conduit. + * attachment = optional object with application-specific data that will + * be available when an event is triggered for the conduit + * + * Remarks: + * The 'attachment' member of the SelectionKey will always be overwritten, + * even if it's null. + * + * Examples: + * --- + * AbstractSelector selector; + * SocketConduit conduit; + * MyClass object; + * + * selector.reregister(conduit, Event.Write, object); + * --- + */ + public abstract void reregister(ISelectable conduit, Event events, + Object attachment); + + /** + * Remove a conduit from the selector. + * + * Params: + * conduit = conduit that had been previously associated to the + * selector; it can be null. + * + * Remarks: + * Unregistering a null conduit is allowed and no exception is thrown + * if this happens. + */ + public abstract void unregister(ISelectable conduit); + + /** + * Wait for I/O events from the registered conduits for a specified + * amount of time. + * + * Returns: + * The amount of conduits that have received events; 0 if no conduits + * have received events within the specified timeout; and -1 if the + * wakeup() method has been called from another thread. + * + * Remarks: + * This method is the same as calling select(TimeSpan.max). + */ + public int select() + { + return select(TimeSpan.max); + } + + /** + * Wait for I/O events from the registered conduits for a specified + * amount of time. + * + * Note: This representation of timeout is not always accurate, so it is + * possible that the function will return with a timeout before the + * specified period. For more accuracy, use the TimeSpan version. + * + * Params: + * timeout = the maximum amount of time in seconds that the + * selector will wait for events from the conduits; the + * amount of time is relative to the current system time + * (i.e. just the number of milliseconds that the selector + * has to wait for the events). + * + * Returns: + * The amount of conduits that have received events; 0 if no conduits + * have received events within the specified timeout. + */ + public int select(double timeout) + { + return select(TimeSpan.interval(timeout)); + } + + /** + * Wait for I/O events from the registered conduits for a specified + * amount of time. + * + * Params: + * timeout = TimeSpan with the maximum amount of time that the + * selector will wait for events from the conduits; the + * amount of time is relative to the current system time + * (i.e. just the number of milliseconds that the selector + * has to wait for the events). + * + * Returns: + * The amount of conduits that have received events; 0 if no conduits + * have received events within the specified timeout; and -1 if the + * wakeup() method has been called from another thread. + */ + public abstract int select(TimeSpan timeout); + + /** + * Causes the first call to select() that has not yet returned to return + * immediately. + * + * If another thread is currently blocked in an call to any of the + * select() methods then that call will return immediately. If no + * selection operation is currently in progress then the next invocation + * of one of these methods will return immediately. In any case the value + * returned by that invocation may be non-zero. Subsequent invocations of + * the select() methods will block as usual unless this method is invoked + * again in the meantime. + */ + // public abstract void wakeup(); + + /** + * Return the selection set resulting from the call to any of the select() + * methods. + * + * Remarks: + * If the call to select() was unsuccessful or it did not return any + * events, the returned value will be null. + */ + public abstract ISelectionSet selectedSet(); + + /** + * Return the selection key resulting from the registration of a conduit + * to the selector. + * + * Remarks: + * If the conduit is not registered to the selector the returned + * value will be null. No exception will be thrown by this method. + */ + public abstract SelectionKey key(ISelectable conduit); + + /** + * Cast the time duration to a C timeval struct. + */ + public timeval* toTimeval(timeval* tv, TimeSpan interval) + in + { + assert(tv !is null); + } + body + { + tv.tv_sec = cast(typeof(tv.tv_sec)) interval.seconds; + tv.tv_usec = cast(typeof(tv.tv_usec)) (interval.micros % 1_000_000); + return tv; + } + + /** + * Check the 'errno' global variable from the C standard library and + * throw an exception with the description of the error. + * + * Params: + * file = name of the source file where the check is being made; you + * would normally use __FILE__ for this parameter. + * line = line number of the source file where this method was called; + * you would normally use __LINE__ for this parameter. + * + * Throws: + * RegisteredConduitException when the conduit should not be registered + * but it is (EEXIST); UnregisteredConduitException when the conduit + * should be registered but it isn't (ENOENT); + * InterruptedSystemCallException when a system call has been interrupted + * (EINTR); OutOfMemoryException if a memory allocation fails (ENOMEM); + * SelectorException for any of the other cases in which errno is not 0. + */ + protected void checkErrno(char[] file, size_t line) + { + int errorCode = errno; + switch (errorCode) + { + case EBADF: + throw new SelectorException("Bad file descriptor", file, line); + // break; + case EEXIST: + throw new RegisteredConduitException(file, line); + // break; + case EINTR: + throw new InterruptedSystemCallException(file, line); + // break; + case EINVAL: + throw new SelectorException("An invalid parameter was sent to a system call", file, line); + // break; + case ENFILE: + throw new SelectorException("Maximum number of open files reached", file, line); + // break; + case ENOENT: + throw new UnregisteredConduitException(file, line); + // break; + case ENOMEM: + throw new OutOfMemoryException(file, line); + // break; + case EPERM: + throw new SelectorException("The conduit cannot be used with this Selector", file, line); + // break; + default: + throw new SelectorException("Unknown Selector error: " ~ SysError.lookup(errorCode), file, line); + // break; + } + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/selector/EpollSelector.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/selector/EpollSelector.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,465 @@ +/******************************************************************************* + copyright: Copyright (c) 2006 Juan Jose Comellas. All rights reserved + license: BSD style: $(LICENSE) + author: Juan Jose Comellas +*******************************************************************************/ + +module tango.io.selector.EpollSelector; + + +version (linux) +{ + public import tango.io.model.IConduit; + + private import tango.io.selector.model.ISelector; + private import tango.io.selector.AbstractSelector; + private import tango.sys.Common; + private import tango.sys.linux.linux; + private import tango.stdc.errno; + + debug (selector) + private import tango.io.Stdout; + + + /** + * Selector that uses the Linux epoll* family of system calls. + * + * This selector is the best option when dealing with large amounts of + * conduits under Linux. It will scale much better than any of the other + * options (PollSelector, SelectSelector). For small amounts of conduits + * (n < 20) the PollSelector will probably be more performant. + * + * See_Also: ISelector, AbstractSelector + * + * Examples: + * --- + * import tango.io.selector.EpollSelector; + * import tango.io.Stdout; + * import tango.net.SocketConduit; + * + * SocketConduit conduit1; + * SocketConduit conduit2; + * EpollSelector selector = new EpollSelector(); + * MyClass object1 = new MyClass(); + * MyClass object2 = new MyClass(); + * uint eventCount; + * + * // Initialize the selector assuming that it will deal with 10 conduits and + * // will receive 3 events per invocation to the select() method. + * selector.open(10, 3); + * + * selector.register(conduit1, Event.Read, object1); + * selector.register(conduit2, Event.Write, object2); + * + * eventCount = selector.select(); + * + * if (eventCount > 0) + * { + * char[16] buffer; + * int count; + * + * foreach (SelectionKey key, selector.selectedSet()) + * { + * if (key.isReadable()) + * { + * count = (cast(SocketConduit) key.conduit).read(buffer); + * if (count != IConduit.Eof) + * { + * Stdout.format("Received '{0}' from peer\n", buffer[0..count]); + * selector.reregister(key.conduit, Event.Write, key.attachment); + * } + * else + * { + * selector.unregister(key.conduit); + * key.conduit.close(); + * } + * } + * + * if (key.isWritable()) + * { + * count = (cast(SocketConduit) key.conduit).write("MESSAGE"); + * if (count != IConduit.Eof) + * { + * Stdout("Sent 'MESSAGE' to peer"); + * selector.reregister(key.conduit, Event.Read, key.attachment); + * } + * else + * { + * selector.unregister(key.conduit); + * key.conduit.close(); + * } + * } + * + * if (key.isError() || key.isHangup() || key.isInvalidHandle()) + * { + * selector.unregister(key.conduit); + * key.conduit.close(); + * } + * } + * } + * + * selector.close(); + * --- + */ + public class EpollSelector: AbstractSelector + { + /** + * Alias for the select() method as we're not reimplementing it in + * this class. + */ + alias AbstractSelector.select select; + + /** + * Default number of SelectionKey's that will be handled by the + * EpollSelector. + */ + public const uint DefaultSize = 64; + /** + * Default maximum number of events that will be received per + * invocation to select(). + */ + public const uint DefaultMaxEvents = 16; + + + /** Map to associate the conduit handles with their selection keys */ + private SelectionKey[ISelectable.Handle] _keys; + /** File descriptor returned by the epoll_create() system call. */ + private int _epfd = -1; + /** + * Array of events that is filled by epoll_wait() inside the call + * to select(). + */ + private epoll_event[] _events; + /** Number of events resulting from the call to select() */ + private int _eventCount = 0; + + + /** + * Destructor + */ + ~this() + { + // Make sure that we release the epoll file descriptor once this + // object is garbage collected. + close(); + } + + /** + * Open the epoll selector, makes a call to epoll_create() + * + * Params: + * size = maximum amount of conduits that will be registered; + * it will grow dynamically if needed. + * maxEvents = maximum amount of conduit events that will be + * returned in the selection set per call to select(); + * this limit is enforced by this selector. + * + * Throws: + * SelectorException if there are not enough resources to open the + * selector (e.g. not enough file handles or memory available). + */ + public void open(uint size = DefaultSize, uint maxEvents = DefaultMaxEvents) + in + { + assert(size > 0); + assert(maxEvents > 0); + } + body + { + _events = new epoll_event[maxEvents]; + + _epfd = epoll_create(cast(int) size); + if (_epfd < 0) + { + checkErrno(__FILE__, __LINE__); + } + } + + /** + * Close the selector, releasing the file descriptor that had been + * created in the previous call to open(). + * + * Remarks: + * It can be called multiple times without harmful side-effects. + */ + public void close() + { + if (_epfd >= 0) + { + .close(_epfd); + _epfd = -1; + } + _events = null; + _eventCount = 0; + } + + /** + * Associate a conduit to the selector and track specific I/O events. + * + * Params: + * conduit = conduit that will be associated to the selector; + * must be a valid conduit (i.e. not null and open). + * events = bit mask of Event values that represent the events + * that will be tracked for the conduit. + * attachment = optional object with application-specific data that + * will be available when an event is triggered for the + * conduit + * + * Throws: + * RegisteredConduitException if the conduit had already been + * registered to the selector; SelectorException if there are not + * enough resources to add the conduit to the selector. + * + * Examples: + * --- + * selector.register(conduit, Event.Read | Event.Write, object); + * --- + */ + public void register(ISelectable conduit, Event events, Object attachment = null) + in + { + assert(conduit !is null && conduit.fileHandle() >= 0); + } + body + { + epoll_event event; + SelectionKey key = new SelectionKey(conduit, events, attachment); + + event.events = events; + // We associate the selection key to the epoll_event to be able to + // retrieve it efficiently when we get events for this handle. + event.data.ptr = cast(void*) key; + + if (epoll_ctl(_epfd, EPOLL_CTL_ADD, conduit.fileHandle(), &event) == 0) + { + // We keep the keys in a map to make sure that the key is not + // garbage collected while there is still a reference to it in + // an epoll_event. This also allows to to efficiently find the + // key corresponding to a handle in methods where this + // association is not provided automatically. + _keys[conduit.fileHandle()] = key; + } + else + { + checkErrno(__FILE__, __LINE__); + } + } + + /** + * Modify the events that are being tracked or the 'attachment' field + * for an already registered conduit. + * + * Params: + * conduit = conduit that will be associated to the selector; + * must be a valid conduit (i.e. not null and open). + * events = bit mask of Event values that represent the events + * that will be tracked for the conduit. + * attachment = optional object with application-specific data that + * will be available when an event is triggered for the + * conduit + * + * Remarks: + * The 'attachment' member of the SelectionKey will always be + * overwritten, even if it's null. + * + * Throws: + * UnregisteredConduitException if the conduit had not been previously + * registered to the selector; SelectorException if there are not + * enough resources to modify the conduit registration. + * + * Examples: + * --- + * selector.reregister(conduit, Event.Write, object); + * --- + */ + public void reregister(ISelectable conduit, Event events, Object attachment = null) + in + { + assert(conduit !is null && conduit.fileHandle() >= 0); + } + body + { + SelectionKey* key = (conduit.fileHandle() in _keys); + + if (key !is null) + { + epoll_event event; + + (*key).events = events; + (*key).attachment = attachment; + + event.events = events; + event.data.ptr = cast(void*) *key; + + if (epoll_ctl(_epfd, EPOLL_CTL_MOD, conduit.fileHandle(), &event) != 0) + { + checkErrno(__FILE__, __LINE__); + } + } + else + { + throw new UnregisteredConduitException(__FILE__, __LINE__); + } + } + + /** + * Remove a conduit from the selector. + * + * Params: + * conduit = conduit that had been previously associated to the + * selector; it can be null. + * + * Remarks: + * Unregistering a null conduit is allowed and no exception is thrown + * if this happens. + * + * Throws: + * UnregisteredConduitException if the conduit had not been previously + * registered to the selector; SelectorException if there are not + * enough resources to remove the conduit registration. + */ + public void unregister(ISelectable conduit) + { + if (conduit !is null) + { + if (epoll_ctl(_epfd, EPOLL_CTL_DEL, conduit.fileHandle(), null) == 0) + { + _keys.remove(conduit.fileHandle()); + } + else + { + checkErrno(__FILE__, __LINE__); + } + } + } + + /** + * Wait for I/O events from the registered conduits for a specified + * amount of time. + * + * Params: + * timeout = TimeSpan with the maximum amount of time that the + * selector will wait for events from the conduits; the + * amount of time is relative to the current system time + * (i.e. just the number of milliseconds that the selector + * has to wait for the events). + * + * Returns: + * The amount of conduits that have received events; 0 if no conduits + * have received events within the specified timeout; and -1 if the + * wakeup() method has been called from another thread. + * + * Throws: + * InterruptedSystemCallException if the underlying system call was + * interrupted by a signal and the 'restartInterruptedSystemCall' + * property was set to false; SelectorException if there were no + * resources available to wait for events from the conduits. + */ + public int select(TimeSpan timeout) + { + int to = (timeout != TimeSpan.max ? cast(int) timeout.millis : -1); + + while (true) + { + // FIXME: add support for the wakeup() call. + _eventCount = epoll_wait(_epfd, _events.ptr, _events.length, to); + if (_eventCount >= 0) + { + break; + } + else + { + if (errno != EINTR || !_restartInterruptedSystemCall) + { + checkErrno(__FILE__, __LINE__); + } + debug (selector) + Stdout("--- Restarting epoll_wait() after being interrupted by a signal\n"); + } + } + return _eventCount; + } + + /** + * Return the selection set resulting from the call to any of the + * select() methods. + * + * Remarks: + * If the call to select() was unsuccessful or it did not return any + * events, the returned value will be null. + */ + public ISelectionSet selectedSet() + { + return (_eventCount > 0 ? new EpollSelectionSet(_events[0.._eventCount]) : null); + } + + /** + * Return the selection key resulting from the registration of a + * conduit to the selector. + * + * Remarks: + * If the conduit is not registered to the selector the returned + * value will be null. No exception will be thrown by this method. + */ + public SelectionKey key(ISelectable conduit) + { + return (conduit !is null ? _keys[conduit.fileHandle()] : null); + } + + unittest + { + } + } + + /** + * Class used to hold the list of Conduits that have received events. + */ + private class EpollSelectionSet: ISelectionSet + { + private epoll_event[] _events; + + protected this(epoll_event[] events) + { + _events = events; + } + + public uint length() + { + return _events.length; + } + + /** + * Iterate over all the Conduits that have received events. + */ + public int opApply(int delegate(inout SelectionKey) dg) + { + int rc = 0; + SelectionKey key; + + debug (selector) + Stdout.format("--- EpollSelectionSet.opApply() ({0} events)\n", _events.length); + + foreach (epoll_event event; _events) + { + // Only invoke the delegate if there is an event for the conduit. + if (event.events != 0) + { + key = cast(SelectionKey) event.data.ptr; + key.events = cast(Event) event.events; + + debug (selector) + Stdout.format("--- Event 0x{0:x} for handle {1}\n", + cast(uint) event.events, cast(int) key.conduit.fileHandle()); + + rc = dg(key); + if (rc != 0) + { + break; + } + } + } + return rc; + } + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/selector/PollSelector.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/selector/PollSelector.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,495 @@ +/******************************************************************************* + copyright: Copyright (c) 2006 Juan Jose Comellas. All rights reserved + license: BSD style: $(LICENSE) + author: Juan Jose Comellas +*******************************************************************************/ + +module tango.io.selector.PollSelector; + +version (Posix) +{ + public import tango.io.model.IConduit; + + private import tango.io.selector.model.ISelector; + private import tango.io.selector.AbstractSelector; + private import tango.io.selector.SelectorException; + private import tango.sys.Common; + private import tango.stdc.errno; + + version (linux) + private import tango.sys.linux.linux; + + debug (selector) + private import tango.io.Stdout; + + + /** + * Selector that uses the poll() system call to receive I/O events for + * the registered conduits. To use this class you would normally do + * something like this: + * + * Examples: + * --- + * import tango.io.selector.PollSelector; + * + * Socket socket; + * ISelector selector = new PollSelector(); + * + * selector.open(100, 10); + * + * // Register to read from socket + * selector.register(socket, Event.Read); + * + * int eventCount = selector.select(0.1); // 0.1 seconds + * if (eventCount > 0) + * { + * // We can now read from the socket + * socket.read(); + * } + * else if (eventCount == 0) + * { + * // Timeout + * } + * else if (eventCount == -1) + * { + * // Another thread called the wakeup() method. + * } + * else + * { + * // Error: should never happen. + * } + * + * selector.close(); + * --- + */ + public class PollSelector: AbstractSelector + { + /** + * Alias for the select() method as we're not reimplementing it in + * this class. + */ + alias AbstractSelector.select select; + + /** + * Default number of SelectionKey's that will be handled by the + * PollSelector. + */ + public const uint DefaultSize = 64; + + /** Map to associate the conduit handles with their selection keys */ + private PollSelectionKey[ISelectable.Handle] _keys; + private SelectionKey[] _selectedKeys; + private pollfd[] _pfds; + private uint _count = 0; + private int _eventCount = 0; + + /** + * Open the poll()-based selector. + * + * Params: + * size = maximum amount of conduits that will be registered; + * it will grow dynamically if needed. + * maxEvents = maximum amount of conduit events that will be + * returned in the selection set per call to select(); + * this value is currently not used by this selector. + */ + public void open(uint size = DefaultSize, uint maxEvents = DefaultSize) + in + { + assert(size > 0); + } + body + { + _pfds = new pollfd[size]; + } + + /** + * Close the selector. + * + * Remarks: + * It can be called multiple times without harmful side-effects. + */ + public void close() + { + _keys = null; + _selectedKeys = null; + _pfds = null; + _count = 0; + _eventCount = 0; + } + + /** + * Associate a conduit to the selector and track specific I/O events. + * + * Params: + * conduit = conduit that will be associated to the selector; + * must be a valid conduit (i.e. not null and open). + * events = bit mask of Event values that represent the events + * that will be tracked for the conduit. + * attachment = optional object with application-specific data that + * will be available when an event is triggered for the + * conduit + * + * Throws: + * RegisteredConduitException if the conduit had already been + * registered to the selector. + * + * Examples: + * --- + * selector.register(conduit, Event.Read | Event.Write, object); + * --- + */ + public void register(ISelectable conduit, Event events, Object attachment = null) + in + { + assert(conduit !is null && conduit.fileHandle() >= 0); + } + body + { + debug (selector) + Stdout.format("--- PollSelector.register(handle={0}, events=0x{1:x})\n", + cast(int) conduit.fileHandle(), cast(uint) events); + + // We make sure that the conduit is not already registered to + // the Selector + if ((conduit.fileHandle() in _keys) is null) + { + if (_count == _pfds.length) + _pfds.length = _pfds.length + 1; + + _pfds[_count].fd = conduit.fileHandle(); + _pfds[_count].events = cast(short) events; + _pfds[_count].revents = 0; + + _keys[conduit.fileHandle()] = new PollSelectionKey(conduit, events, _count, attachment); + _count++; + } + else + { + throw new RegisteredConduitException(__FILE__, __LINE__); + } + } + + /** + * Modify the events that are being tracked or the 'attachment' field + * for an already registered conduit. + * + * Params: + * conduit = conduit that will be associated to the selector; + * must be a valid conduit (i.e. not null and open). + * events = bit mask of Event values that represent the events + * that will be tracked for the conduit. + * attachment = optional object with application-specific data that + * will be available when an event is triggered for the + * conduit + * + * Remarks: + * The 'attachment' member of the SelectionKey will always be + * overwritten, even if it's null. + * + * Throws: + * UnregisteredConduitException if the conduit had not been previously + * registered to the selector. + * + * Examples: + * --- + * selector.reregister(conduit, Event.Write, object); + * --- + */ + public void reregister(ISelectable conduit, Event events, Object attachment = null) + in + { + assert(conduit !is null && conduit.fileHandle() >= 0); + } + body + { + debug (selector) + Stdout.format("--- PollSelector.reregister(handle={0}, events=0x{1:x})", + cast(int) conduit.fileHandle(), cast(uint) events); + + PollSelectionKey* current = (conduit.fileHandle() in _keys); + + if (current !is null) + { + debug (selector) + Stdout.format("--- Adding pollfd in index {0} (of {1})\n", + current.index, _count); + + (*current).events = events; + (*current).attachment = attachment; + + _pfds[current.index].events = cast(short) events; + } + else + { + throw new UnregisteredConduitException(__FILE__, __LINE__); + } + } + + /** + * Remove a conduit from the selector. + * + * Params: + * conduit = conduit that had been previously associated to the + * selector; it can be null. + * + * Remarks: + * Unregistering a null conduit is allowed and no exception is thrown + * if this happens. + * + * Throws: + * UnregisteredConduitException if the conduit had not been previously + * registered to the selector. + */ + public void unregister(ISelectable conduit) + { + if (conduit !is null) + { + try + { + debug (selector) + Stdout.format("--- PollSelector.unregister(handle={0})\n", + cast(int) conduit.fileHandle()); + + PollSelectionKey* removed = (conduit.fileHandle() in _keys); + + if (removed !is null) + { + debug (selector) + Stdout.format("--- Removing pollfd in index {0} (of {1})\n", + removed.index, _count); + + for (uint i = removed.index + 1; i > 0 && i < _count; i++) + { + _pfds[i - 1] = _pfds[i]; + } + _count--; + + _keys.remove(conduit.fileHandle()); + } + else + { + debug (selector) + Stdout.format("--- PollSelector.unregister(handle={0}): conduit was not found\n", + cast(int) conduit.fileHandle()); + throw new UnregisteredConduitException(__FILE__, __LINE__); + } + } + catch (Exception e) + { + debug (selector) + Stdout.format("--- Exception inside PollSelector.unregister(handle={0}): {1}", + cast(int) conduit.fileHandle(), e.toString()); + + throw new UnregisteredConduitException(__FILE__, __LINE__); + } + } + } + + /** + * Wait for I/O events from the registered conduits for a specified + * amount of time. + * + * Params: + * timeout = Timespan with the maximum amount of time that the + * selector will wait for events from the conduits; the + * amount of time is relative to the current system time + * (i.e. just the number of milliseconds that the selector + * has to wait for the events). + * + * Returns: + * The amount of conduits that have received events; 0 if no conduits + * have received events within the specified timeout; and -1 if the + * wakeup() method has been called from another thread. + * + * Throws: + * InterruptedSystemCallException if the underlying system call was + * interrupted by a signal and the 'restartInterruptedSystemCall' + * property was set to false; SelectorException if there were no + * resources available to wait for events from the conduits. + */ + public int select(TimeSpan timeout) + { + int to = (timeout != TimeSpan.max ? cast(int) timeout.millis : -1); + + debug (selector) + Stdout.format("--- PollSelector.select({0} ms): waiting on {1} handles\n", + to, _count); + + // We run the call to poll() inside a loop in case the system call + // was interrupted by a signal and we need to restart it. + while (true) + { + _eventCount = poll(_pfds.ptr, _count, to); + if (_eventCount > 0) + { + int i = 0; + PollSelectionKey* key; + + if (_selectedKeys is null) + { + _selectedKeys = new SelectionKey[16]; + } + + // FIXME: add support for the wakeup() call. + foreach (pollfd pfd; _pfds[0 .. _count]) + { + if (i < _eventCount) + { + if (pfd.revents != 0) + { + debug (selector) + Stdout.format("--- Found events 0x{0:x} for handle {1} (index {2})\n", + cast(uint) pfd.revents, cast(int) pfd.fd, i); + + // Find the key whose handle received an event + key = ((cast(ISelectable.Handle) pfd.fd) in _keys); + if (key !is null) + { + // Enlarge the array of necessary + if (i >= _selectedKeys.length) + { + // The underlying array worries about + // incrementing the allocated block + // efficiently. + _selectedKeys.length = i + 1; + } + + (*key).events = cast(Event) pfd.revents; + + _selectedKeys[i] = *key; + i++; + } + else + { + debug (selector) + Stdout.format("--- Handle {0} was not found in the Selector\n", + cast(int) pfd.fd); + } + } + } + else + { + break; + } + } + _selectedKeys.length = i; + break; + } + else if (_eventCount == 0) + { + // Timeout + break; + } + else // if (eventCount < 0) + { + if (errno != EINTR || !_restartInterruptedSystemCall) + { + // The call to checkErrno() ends up throwing an exception + checkErrno(__FILE__, __LINE__); + } + debug (selector) + Stdout.print("--- Restarting poll() after being interrupted\n"); + } + } + return _eventCount; + } + + /** + * Return the selection set resulting from the call to any of the + * select() methods. + * + * Remarks: + * If the call to select() was unsuccessful or it did not return any + * events, the returned value will be null. + */ + public ISelectionSet selectedSet() + { + return (_eventCount > 0 ? new PollSelectionSet(_selectedKeys) : null); + } + + /** + * Return the selection key resulting from the registration of a + * conduit to the selector. + * + * Remarks: + * If the conduit is not registered to the selector the returned + * value will be null. No exception will be thrown by this method. + */ + public SelectionKey key(ISelectable conduit) + { + return (conduit !is null ? _keys[conduit.fileHandle()] : null); + } + + unittest + { + } + } + + /** + * Class used to hold the list of Conduits that have received events. + */ + private class PollSelectionSet: ISelectionSet + { + private SelectionKey[] _keys; + + protected this(SelectionKey[] keys) + { + _keys = keys; + } + + public uint length() + { + return _keys.length; + } + + /** + * Iterate over all the Conduits that have received events. + */ + public int opApply(int delegate(inout SelectionKey) dg) + { + int rc = 0; + + foreach (SelectionKey current; _keys) + { + if (dg(current) != 0) + { + rc = -1; + break; + } + } + return rc; + } + } + + /** + * Class that holds the information that the PollSelector needs to deal + * with each registered Conduit. + */ + private class PollSelectionKey: SelectionKey + { + private uint _index; + + public this() + { + } + + public this(ISelectable conduit, Event events, uint index, Object attachment) + { + super(conduit, events, attachment); + + _index = index; + } + + public uint index() + { + return _index; + } + + public void index(uint index) + { + _index = index; + } + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/selector/SelectSelector.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/selector/SelectSelector.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,959 @@ +/******************************************************************************* + copyright: Copyright (c) 2006 Juan Jose Comellas. All rights reserved + license: BSD style: $(LICENSE) + author: Juan Jose Comellas +*******************************************************************************/ + +module tango.io.selector.SelectSelector; + +public import tango.io.model.IConduit; + +private import tango.io.selector.model.ISelector; +private import tango.io.selector.AbstractSelector; +private import tango.io.selector.SelectorException; +private import tango.sys.Common; + +private import tango.stdc.errno; + +debug (selector) +{ + private import tango.io.Stdout; + private import tango.text.convert.Integer; +} + + +version (Windows) +{ + import tango.core.Thread; + + private + { + // Opaque struct + struct fd_set + { + } + + extern (Windows) int select(int nfds, fd_set* readfds, fd_set* writefds, + fd_set* errorfds, timeval* timeout); + } +} + + +/** + * Selector that uses the select() system call to receive I/O events for + * the registered conduits. To use this class you would normally do + * something like this: + * + * Examples: + * --- + * import tango.io.selector.SelectSelector; + * + * Socket socket; + * ISelector selector = new SelectSelector(); + * + * selector.open(100, 10); + * + * // Register to read from socket + * selector.register(socket, Event.Read); + * + * int eventCount = selector.select(0.1); // 0.1 seconds + * if (eventCount > 0) + * { + * // We can now read from the socket + * socket.read(); + * } + * else if (eventCount == 0) + * { + * // Timeout + * } + * else if (eventCount == -1) + * { + * // Another thread called the wakeup() method. + * } + * else + * { + * // Error: should never happen. + * } + * + * selector.close(); + * --- + */ +public class SelectSelector: AbstractSelector +{ + /** + * Alias for the select() method as we're not reimplementing it in + * this class. + */ + alias AbstractSelector.select select; + + uint _size; + private SelectionKey[ISelectable.Handle] _keys; + private HandleSet _readSet; + private HandleSet _writeSet; + private HandleSet _exceptionSet; + private HandleSet _selectedReadSet; + private HandleSet _selectedWriteSet; + private HandleSet _selectedExceptionSet; + int _eventCount; + version (Posix) + { + private ISelectable.Handle _maxfd = cast(ISelectable.Handle) -1; + + /** + * Default number of SelectionKey's that will be handled by the + * SelectSelector. + */ + public const uint DefaultSize = 1024; + } + else + { + /** + * Default number of SelectionKey's that will be handled by the + * SelectSelector. + */ + public const uint DefaultSize = 63; + } + + /** + * Open the select()-based selector. + * + * Params: + * size = maximum amount of conduits that will be registered; + * it will grow dynamically if needed. + * maxEvents = maximum amount of conduit events that will be + * returned in the selection set per call to select(); + * this value is currently not used by this selector. + */ + public void open(uint size = DefaultSize, uint maxEvents = DefaultSize) + in + { + assert(size > 0); + } + body + { + _size = size; + } + + /** + * Close the selector. + * + * Remarks: + * It can be called multiple times without harmful side-effects. + */ + public void close() + { + _size = 0; + _keys = null; + _readSet = null; + _writeSet = null; + _exceptionSet = null; + _selectedReadSet = null; + _selectedWriteSet = null; + _selectedExceptionSet = null; + } + + /** + * Associate a conduit to the selector and track specific I/O events. + * + * Params: + * conduit = conduit that will be associated to the selector; + * must be a valid conduit (i.e. not null and open). + * events = bit mask of Event values that represent the events + * that will be tracked for the conduit. + * attachment = optional object with application-specific data that + * will be available when an event is triggered for the + * conduit + * + * Throws: + * RegisteredConduitException if the conduit had already been + * registered to the selector. + * + * Examples: + * --- + * selector.register(conduit, Event.Read | Event.Write, object); + * --- + */ + public void register(ISelectable conduit, Event events, Object attachment = null) + in + { + assert(conduit !is null && conduit.fileHandle() >= 0); + } + body + { + ISelectable.Handle handle = conduit.fileHandle(); + + debug (selector) + Stdout.format("--- SelectSelector.register(handle={0}, events=0x{1:x})\n", + cast(int) handle, cast(uint) events); + + // We make sure that the conduit is not already registered to + // the Selector + SelectionKey* key = (conduit.fileHandle() in _keys); + + if (key is null) + { + // Keep record of the Conduits for whom we're tracking events. + _keys[handle] = new SelectionKey(conduit, events, attachment); + + if ((events & Event.Read) || (events & Event.Hangup)) + { + if (_readSet is null) + { + _readSet = new HandleSet(_size); + _selectedReadSet = new HandleSet(_size); + } + _readSet.set(handle); + } + + if (events & Event.Write) + { + if (_writeSet is null) + { + _writeSet = new HandleSet(_size); + _selectedWriteSet = new HandleSet(_size); + } + _writeSet.set(handle); + } + + if (events & Event.Error) + { + if (_exceptionSet is null) + { + _exceptionSet = new HandleSet(_size); + _selectedExceptionSet = new HandleSet(_size); + } + _exceptionSet.set(handle); + } + + version (Posix) + { + if (handle > _maxfd) + _maxfd = handle; + } + } + else + { + throw new RegisteredConduitException(__FILE__, __LINE__); + } + } + + /** + * Modify the events that are being tracked or the 'attachment' field + * for an already registered conduit. + * + * Params: + * conduit = conduit that will be associated to the selector; + * must be a valid conduit (i.e. not null and open). + * events = bit mask of Event values that represent the events + * that will be tracked for the conduit. + * attachment = optional object with application-specific data that + * will be available when an event is triggered for the + * conduit + * + * Remarks: + * The 'attachment' member of the SelectionKey will always be + * overwritten, even if it's null. + * + * Throws: + * UnregisteredConduitException if the conduit had not been previously + * registered to the selector. + * + * Examples: + * --- + * selector.reregister(conduit, Event.Write, object); + * --- + */ + public void reregister(ISelectable conduit, Event events, Object attachment = null) + in + { + assert(conduit !is null && conduit.fileHandle() >= 0); + } + body + { + ISelectable.Handle handle = conduit.fileHandle(); + + debug (selector) + Stdout.format("--- SelectSelector.reregister(handle={0}, events=0x{1:x})\n", + cast(int) handle, cast(uint) events); + + SelectionKey *key = (handle in _keys); + if (key !is null) + { + if ((events & Event.Read) || (events & Event.Hangup)) + { + if (_readSet is null) + { + _readSet = new HandleSet(_size); + _selectedReadSet = new HandleSet(_size); + } + _readSet.set(handle); + } + else if (_readSet !is null) + { + _readSet.clear(handle); + } + + if ((events & Event.Write)) + { + if (_writeSet is null) + { + _writeSet = new HandleSet(_size); + _selectedWriteSet = new HandleSet(_size); + } + _writeSet.set(handle); + } + else if (_writeSet !is null) + { + _writeSet.clear(handle); + } + + if (events & Event.Error) + { + if (_exceptionSet is null) + { + _exceptionSet = new HandleSet(_size); + _selectedExceptionSet = new HandleSet(_size); + } + _exceptionSet.set(handle); + } + else if (_exceptionSet !is null) + { + _exceptionSet.clear(handle); + } + + version (Posix) + { + if (handle > _maxfd) + _maxfd = handle; + } + + (*key).events = events; + (*key).attachment = attachment; + } + else + { + throw new UnregisteredConduitException(__FILE__, __LINE__); + } + } + + /** + * Remove a conduit from the selector. + * + * Params: + * conduit = conduit that had been previously associated to the + * selector; it can be null. + * + * Remarks: + * Unregistering a null conduit is allowed and no exception is thrown + * if this happens. + * + * Throws: + * UnregisteredConduitException if the conduit had not been previously + * registered to the selector. + */ + public void unregister(ISelectable conduit) + { + if (conduit !is null) + { + ISelectable.Handle handle = conduit.fileHandle(); + + debug (selector) + Stdout.format("--- SelectSelector.unregister(handle={0})\n", + cast(int) handle); + + SelectionKey* removed = (handle in _keys); + + if (removed !is null) + { + if (_exceptionSet !is null) + { + _exceptionSet.clear(handle); + } + if (_writeSet !is null) + { + _writeSet.clear(handle); + } + if (_readSet !is null) + { + _readSet.clear(handle); + } + _keys.remove(handle); + + version (Posix) + { + // If we're removing the biggest handle we've entered so far + // we need to recalculate this value for the set. + if (handle == _maxfd) + { + while (--_maxfd >= 0) + { + if ((_readSet !is null && _readSet.isSet(_maxfd)) || + (_writeSet !is null && _writeSet.isSet(_maxfd)) || + (_exceptionSet !is null && _exceptionSet.isSet(_maxfd))) + { + break; + } + } + } + } + } + else + { + debug (selector) + Stdout.format("--- SelectSelector.unregister(handle={0}): conduit was not found\n", + cast(int) conduit.fileHandle()); + throw new UnregisteredConduitException(__FILE__, __LINE__); + } + } + } + + /** + * Wait for I/O events from the registered conduits for a specified + * amount of time. + * + * Params: + * timeout = TimeSpan with the maximum amount of time that the + * selector will wait for events from the conduits; the + * amount of time is relative to the current system time + * (i.e. just the number of milliseconds that the selector + * has to wait for the events). + * + * Returns: + * The amount of conduits that have received events; 0 if no conduits + * have received events within the specified timeout; and -1 if the + * wakeup() method has been called from another thread. + * + * Throws: + * InterruptedSystemCallException if the underlying system call was + * interrupted by a signal and the 'restartInterruptedSystemCall' + * property was set to false; SelectorException if there were no + * resources available to wait for events from the conduits. + */ + public int select(TimeSpan timeout) + { + fd_set *readfds; + fd_set *writefds; + fd_set *exceptfds; + timeval tv; + version (Windows) + bool handlesAvailable = false; + + debug (selector) + Stdout.format("--- SelectSelector.select(timeout={0} msec)\n", timeout.millis); + + if (_readSet !is null) + { + debug (selector) + _readSet.dump("_readSet"); + + version (Windows) + handlesAvailable = handlesAvailable || (_readSet.length > 0); + + readfds = cast(fd_set*) _selectedReadSet.copy(_readSet); + } + if (_writeSet !is null) + { + debug (selector) + _writeSet.dump("_writeSet"); + + version (Windows) + handlesAvailable = handlesAvailable || (_writeSet.length > 0); + + writefds = cast(fd_set*) _selectedWriteSet.copy(_writeSet); + } + if (_exceptionSet !is null) + { + debug (selector) + _exceptionSet.dump("_exceptionSet"); + + version (Windows) + handlesAvailable = handlesAvailable || (_exceptionSet.length > 0); + + exceptfds = cast(fd_set*) _selectedExceptionSet.copy(_exceptionSet); + } + + version (Posix) + { + while (true) + { + toTimeval(&tv, timeout); + + // FIXME: add support for the wakeup() call. + _eventCount = .select(_maxfd + 1, readfds, writefds, exceptfds, timeout is TimeSpan.max ? null : &tv); + + debug (selector) + Stdout.format("--- .select() returned {0} (maxfd={1})\n", + _eventCount, cast(int) _maxfd); + if (_eventCount >= 0) + { + break; + } + else + { + if (errno != EINTR || !_restartInterruptedSystemCall) + { + // checkErrno() always throws an exception + checkErrno(__FILE__, __LINE__); + } + debug (selector) + Stdout.print("--- Restarting select() after being interrupted\n"); + } + } + } + else + { + // Windows returns an error when select() is called with all three + // handle sets empty, so we emulate the POSIX behavior by calling + // Thread.sleep(). + if (handlesAvailable) + { + toTimeval(&tv, timeout); + + // FIXME: Can a system call be interrupted on Windows? + _eventCount = .select(ISelectable.Handle.max, readfds, writefds, exceptfds, timeout is TimeSpan.max ? null : &tv); + + debug (selector) + Stdout.format("--- .select() returned {0}\n", _eventCount); + } + else + { + Thread.sleep(timeout.interval()); + _eventCount = 0; + } + } + return _eventCount; + } + + /** + * Return the selection set resulting from the call to any of the + * select() methods. + * + * Remarks: + * If the call to select() was unsuccessful or it did not return any + * events, the returned value will be null. + */ + public ISelectionSet selectedSet() + { + return (_eventCount > 0 ? new SelectSelectionSet(_keys, cast(uint) _eventCount, _selectedReadSet, + _selectedWriteSet, _selectedExceptionSet) : null); + } + + /** + * Return the selection key resulting from the registration of a + * conduit to the selector. + * + * Remarks: + * If the conduit is not registered to the selector the returned + * value will be null. No exception will be thrown by this method. + */ + public SelectionKey key(ISelectable conduit) + { + return (conduit !is null ? _keys[conduit.fileHandle()] : null); + } +} + +/** + * SelectionSet for the select()-based Selector. + */ +private class SelectSelectionSet: ISelectionSet +{ + private SelectionKey[ISelectable.Handle] _keys; + private uint _eventCount; + private HandleSet _readSet; + private HandleSet _writeSet; + private HandleSet _exceptionSet; + + protected this(SelectionKey[ISelectable.Handle] keys, uint eventCount, + HandleSet readSet, HandleSet writeSet, HandleSet exceptionSet) + { + _keys = keys; + _eventCount = eventCount; + _readSet = readSet; + _writeSet = writeSet; + _exceptionSet = exceptionSet; + } + + public uint length() + { + return _eventCount; + } + + public int opApply(int delegate(inout SelectionKey) dg) + { + int rc = 0; + ISelectable.Handle handle; + Event events; + + debug (selector) + Stdout.format("--- SelectSelectionSet.opApply() ({0} elements)\n", _eventCount); + + foreach (SelectionKey current; _keys) + { + handle = current.conduit.fileHandle(); + + if (_readSet !is null && _readSet.isSet(handle)) + events = Event.Read; + else + events = Event.None; + + if (_writeSet !is null && _writeSet.isSet(handle)) + events |= Event.Write; + + if (_exceptionSet !is null && _exceptionSet.isSet(handle)) + events |= Event.Error; + + // Only invoke the delegate if there is an event for the conduit. + if (events != Event.None) + { + current.events = events; + + debug (selector) + Stdout.format("--- Calling foreach delegate with selection key ({0}, 0x{1:x})\n", + cast(int) handle, cast(uint) events); + + if (dg(current) != 0) + { + rc = -1; + break; + } + } + else + { + debug (selector) + Stdout.format("--- Handle {0} doesn't have pending events\n", + cast(int) handle); + } + } + return rc; + } +} + + +version (Windows) +{ + /** + * Helper class used by the select()-based Selector to store handles. + * On Windows the handles are kept in an array of uints and the first + * element of the array stores the array "length" (i.e. number of handles + * in the array). Everything is stored so that the native select() API + * can use the HandleSet without additional conversions by just casting it + * to a fd_set*. + */ + private class HandleSet + { + /** Default number of handles that will be held in the HandleSet. */ + public const uint DefaultSize = 63; + + private uint[] _buffer; + + /** + * Constructor. Sets the initial number of handles that will be held + * in the HandleSet. + */ + public this(uint size = DefaultSize) + { + _buffer = new uint[1 + size]; + _buffer[0] = 0; + } + + /** + * Return the number of handles present in the HandleSet. + */ + public uint length() + { + return _buffer[0]; + } + + /** + * Remove all the handles from the set. + */ + private void reset() + { + _buffer[0] = 0; + } + + /** + * Add the handle to the set. + */ + public void set(ISelectable.Handle handle) + in + { + assert(handle >= 0); + } + body + { + if (!isSet(handle)) + { + // If we added too many sockets we increment the size of the buffer + if (++_buffer[0] >= _buffer.length) + { + _buffer.length = _buffer[0] + 1; + } + _buffer[_buffer[0]] = cast(uint) handle; + } + } + + /** + * Remove the handle from the set. + */ + public void clear(ISelectable.Handle handle) + { + for (uint i = 1; i <= _buffer[0]; ++i) + { + if (_buffer[i] == cast(uint) handle) + { + // We don't need to keep the handles in the order in which + // they were inserted, so we optimize the removal by + // copying the last element to the position of the removed + // element. + if (i != _buffer[0]) + { + _buffer[i] = _buffer[_buffer[0]]; + } + _buffer[0]--; + return; + } + } + } + + /** + * Copy the contents of the HandleSet into this instance. + */ + private HandleSet copy(HandleSet handleSet) + { + if (handleSet !is null) + { + _buffer[] = handleSet._buffer[]; + } + else + { + _buffer = null; + } + return this; + } + + /** + * Check whether the handle has been set. + */ + public bool isSet(ISelectable.Handle handle) + { + uint* start; + uint* stop; + + for (start = _buffer.ptr + 1, stop = start + _buffer[0]; start != stop; start++) + { + if (*start == cast(uint) handle) + return true; + } + return false; + } + + /** + * Cast the current object to a pointer to an fd_set, to be used with the + * select() system call. + */ + public fd_set* opCast() + { + return cast(fd_set*) _buffer.ptr; + } + + + debug (selector) + { + /** + * Dump the contents of a HandleSet into stdout. + */ + void dump(char[] name = null) + { + if (_buffer !is null && _buffer.length > 0 && _buffer[0] > 0) + { + char[] handleStr = new char[16]; + char[] handleListStr; + bool isFirst = true; + + if (name is null) + { + name = "HandleSet"; + } + + for (uint i = 1; i < _buffer[0]; ++i) + { + if (!isFirst) + { + handleListStr ~= ", "; + } + else + { + isFirst = false; + } + + handleListStr ~= itoa(handleStr, _buffer[i]); + } + + Stdout.formatln("--- {0}[{1}]: {2}", name, _buffer[0], handleListStr); + } + } + } + } +} +else version (Posix) +{ + private import tango.core.BitManip; + + /** + * Helper class used by the select()-based Selector to store handles. + * On POSIX-compatible platforms the handles are kept in an array of bits. + * Everything is stored so that the native select() API can use the + * HandleSet without additional conversions by casting it to a fd_set*. + */ + private class HandleSet + { + /** Default number of handles that will be held in the HandleSet. */ + const uint DefaultSize = 1024; + /** Number of bits per element held in the _buffer */ + const uint BitsPerElement = uint.sizeof * 8; + + private uint[] _buffer; + + /** + * Constructor. Sets the initial number of handles that will be held + * in the HandleSet. + */ + protected this(uint size = DefaultSize) + { + uint count; + + if (size < 1024) + size = 1024; + + count = size / BitsPerElement; + if (size % BitsPerElement != 0) + count++; + _buffer = new uint[count]; + } + + /** + * Return the number of handles present in the HandleSet. + */ + public uint length() + { + return _buffer.length; + } + + /** + * Remove all the handles from the set. + */ + public void reset() + { + _buffer[] = 0; + } + + /** + * Add a handle to the set. + */ + public void set(ISelectable.Handle handle) + { + // If we added too many sockets we increment the size of the buffer + if (cast(uint) handle >= BitsPerElement * _buffer.length) + { + _buffer.length = cast(uint) handle + 1; + } + bts(&_buffer[elementOffset(handle)], bitOffset(handle)); + } + + /** + * Remove a handle from the set. + */ + public void clear(ISelectable.Handle handle) + { + btr(&_buffer[elementOffset(handle)], bitOffset(handle)); + } + + /** + * Copy the contents of the HandleSet into this instance. + */ + private HandleSet copy(HandleSet handleSet) + { + if (handleSet !is null) + { + _buffer[] = handleSet._buffer[]; + } + else + { + _buffer = null; + } + return this; + } + + /** + * Check whether the handle has been set. + */ + public bool isSet(ISelectable.Handle handle) + { + return (bt(&_buffer[elementOffset(handle)], bitOffset(handle)) != 0); + } + + /** + * Cast the current object to a pointer to an fd_set, to be used with the + * select() system call. + */ + public fd_set* opCast() + { + return cast(fd_set*) _buffer; + } + + /** + * Calculate the offset (in uints) of a handle in the set. + */ + private static uint elementOffset(ISelectable.Handle handle) + { + return cast(uint) handle / BitsPerElement; + } + + /** + * Calculate the offset of the bit corresponding to a handle in the set. + */ + private static uint bitOffset(ISelectable.Handle handle) + { + return cast(uint) handle % BitsPerElement; + } + + debug (selector) + { + /** + * Dump the contents of a HandleSet into stdout. + */ + void dump(char[] name = null) + { + if (_buffer !is null && _buffer.length > 0) + { + char[] handleStr = new char[16]; + char[] handleListStr; + bool isFirst = true; + + if (name is null) + { + name = "HandleSet"; + } + + for (uint i = 0; i < _buffer.length * _buffer[0].sizeof; ++i) + { + if (isSet(cast(ISelectable.Handle) i)) + { + if (!isFirst) + { + handleListStr ~= ", "; + } + else + { + isFirst = false; + } + handleListStr ~= itoa(handleStr, i); + } + } + Stdout.formatln("--- {0}: {1}", name, handleListStr); + } + } + } + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/selector/Selector.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/selector/Selector.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,151 @@ +/******************************************************************************* + copyright: Copyright (c) 2006 Juan Jose Comellas. All rights reserved + license: BSD style: $(LICENSE) + author: Juan Jose Comellas +*******************************************************************************/ + +module tango.io.selector.Selector; + +/** + * A multiplexor of conduit I/O events. + * + * A Selector can wait for I/O events (Read, Write, etc.) for multiple + * conduits efficiently (i.e. without consuming CPU cycles). + * + * The Selector is an alias for your system's most efficient I/O multiplexor, + * which will be determined during compilation. + * + * To create a Selector you need to use the open() method and when you decide + * you no longer need it you should call its close() method to free any system + * resources it may be consuming. All selectors that need to free resources + * when close() is called also implement a destructor that automatically calls + * this method. This means that if you declare your selector instance with the + * 'auto' keyword you won't have to worry about doing it manually. + * + * Once you have open()'ed your selector you need to associate the conduits to + * it by using the register() method. This method receives the conduit and the + * events you want to track for it. For example, if you wanted to read from + * the conduit you would do: + * + * --- + * selector.register(conduit, Event.Read, myObject); + * --- + * + * This method also accepts an optional third parameter to associate a + * user-defined object to the conduit. These three parameters together define + * a SelectionKey, which is what you'll receive when the conduit is "selected" + * (i.e. receives an event). + * + * If you need to modify your conduit's registration you need to use the + * reregister() method, which works like register(), but expects to be passed + * a conduit that has already been associated to the selector: + * + * --- + * selector.reregister(conduit, Event.Write, myObject); + * --- + * + * If you need to remove a conduit from the selector you do it by calling + * unregister(): + * + * --- + * selector.unregister(conduit); + * --- + * + * Once you are done setting up the conduits you will want to wait for I/O + * events for them. To do that you need to use the select() method. This + * method blocks until either one of the conduits is selected or the + * specified timeout is reached. Even though it has two different versions: + * a) select(); b) select(Interval); the first one is just the same as doing + * select(Interval.max). In that case we don't have a timeout and + * select() blocks until a conduit receives an event. + * + * When select() returns you will receive an integer; if this integer is + * bigger than 0, it indicates the number of conduits that have been selected. + * If this number is 0, the it means that the selector reached a timeout, and + * if it's -1, then it means that there was an error. A normal block that deals + * with the selection process would look like this: + * + * --- + * try + * { + * int eventCount = selector.select(10.0); + * if (eventCount > 0) + * { + * // Process the I/O events in the selected set + * } + * else if (eventCount == 0) + * { + * // Timeout + * } + * else if (eventCount == -1) + * { + * // Error + * } + * else + * { + * // Error: should never happen. + * } + * } + * catch (SelectorException e) + * { + * Stdout.format("Exception caught: {0}", e.toString()).newline(); + * } + * --- + * + * Finally, to gather the events you need to iterate over the selector's + * selection set, which can be accessed via the selectedSet() method. + * + * --- + * foreach (SelectionKey key; selector.selectedSet()) + * { + * if (key.isReadable()) + * { + * // Read from conduit + * // [...] + * // Then register it for writing + * selector.reregister(key.conduit, Event.Write, key.attachment); + * } + * + * if (key.isWriteable()) + * { + * // Write to conduit + * // [...] + * // Then register it for reading + * selector.reregister(key.conduit, Event.Read, key.attachment); + * } + * + * if (key.isError()) + * { + * // Problem with conduit; remove it from selector + * selector.remove(conduit); + * } + * } + * --- + */ +version (linux) +{ + public import tango.io.selector.EpollSelector; + + /** + * Default Selector for Linux. + */ + alias EpollSelector Selector; +} +else version(Posix) +{ + public import tango.io.selector.PollSelector; + + /** + * Default Selector for POSIX-compatible platforms. + */ + alias PollSelector Selector; +} +else +{ + public import tango.io.selector.SelectSelector; + + /** + * Default Selector for Windows. + */ + alias SelectSelector Selector; +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/selector/SelectorException.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/selector/SelectorException.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,116 @@ +/******************************************************************************* + copyright: Copyright (c) 2006 Juan Jose Comellas. All rights reserved + license: BSD style: $(LICENSE) + author: Juan Jose Comellas +*******************************************************************************/ + +module tango.io.selector.SelectorException; + +//private import tango.core.Exception; + + +/** + * SelectorException is thrown when the Selector cannot be created because + * of insufficient resources (file descriptors, memory, etc.) + */ +public class SelectorException: Exception +{ + /** + * Construct a selector exception with the provided text string + * + * Params: + * file = name of the source file where the exception was thrown; you + * would normally use __FILE__ for this parameter. + * line = line number of the source file where the exception was + * thrown; you would normally use __LINE__ for this parameter. + */ + public this(char[] msg, char[] file, uint line) + { + super(msg, file, line); + } +} + + +/** + * UnregisteredConduitException is thrown when the selector looks for a + * registered conduit and it cannot find it. + */ +public class UnregisteredConduitException: SelectorException +{ + /** + * Construct a selector exception with the provided text string + * + * Params: + * file = name of the source file where the exception was thrown; you + * would normally use __FILE__ for this parameter. + * line = line number of the source file where the exception was + * thrown; you would normally use __LINE__ for this parameter. + */ + public this(char[] file, uint line) + { + super("The conduit is not registered to the selector", file, line); + } +} + +/** + * RegisteredConduitException is thrown when a selector detects that a conduit + * registration was attempted more than once. + */ +public class RegisteredConduitException: SelectorException +{ + /** + * Construct a selector exception with the provided text string + * + * Params: + * file = name of the source file where the exception was thrown; you + * would normally use __FILE__ for this parameter. + * line = line number of the source file where the exception was + * thrown; you would normally use __LINE__ for this parameter. + */ + public this(char[] file, uint line) + { + super("The conduit is already registered to the selector", file, line); + } +} + +/** + * InterruptedSystemCallException is thrown when a system call is interrupted + * by a signal and the selector was not set to restart it automatically. + */ +public class InterruptedSystemCallException: SelectorException +{ + /** + * Construct a selector exception with the provided text string + * + * Params: + * file = name of the source file where the exception was thrown; you + * would normally use __FILE__ for this parameter. + * line = line number of the source file where the exception was + * thrown; you would normally use __LINE__ for this parameter. + */ + public this(char[] file, uint line) + { + super("A system call was interrupted by a signal", file, line); + } +} + +/** + * OutOfMemoryException is thrown when there is not enough memory. + */ +public class OutOfMemoryException: SelectorException +{ + /** + * Construct a selector exception with the provided text string + * + * Params: + * file = name of the source file where the exception was thrown; you + * would normally use __FILE__ for this parameter. + * line = line number of the source file where the exception was + * thrown; you would normally use __LINE__ for this parameter. + */ + public this(char[] file, uint line) + { + super("Out of memory", file, line); + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/selector/model/ISelector.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/selector/model/ISelector.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,460 @@ +/******************************************************************************* + copyright: Copyright (c) 2006 Juan Jose Comellas. All rights reserved + license: BSD style: $(LICENSE) + author: Juan Jose Comellas +*******************************************************************************/ + +module tango.io.selector.model.ISelector; + +public import tango.time.Time; + +public import tango.io.model.IConduit; + +/** + * Events that are used to register a Conduit to a selector and are returned + * in a SelectionKey after calling ISelector.select(). + */ +enum Event: uint +{ + None = 0, // No event + // IMPORTANT: Do not change the values of the following symbols. They were + // set in this way to map the values returned by the POSIX poll() + // system call. + Read = (1 << 0), // POLLIN + UrgentRead = (1 << 1), // POLLPRI + Write = (1 << 2), // POLLOUT + // The following events should not be used when registering a conduit to a + // selector. They are only used when returning events to the user. + Error = (1 << 3), // POLLERR + Hangup = (1 << 4), // POLLHUP + InvalidHandle = (1 << 5) // POLLNVAL +} + + +/** + * The SelectionKey class holds the information concerning the conduits and + * their association to a selector. Each key keeps a reference to a registered + * conduit and the events that are to be tracked for it. The 'events' member + * of the key can take two meanings, depending on where it's used. If used + * with the registration methods of the selector (register(), reregister()) it + * represents the events we want to track; if used within a foreach cycle + * on an ISelectionSet it represents the events that have been detected for a + * conduit. + * + * The SelectionKey can also hold an optional object via the 'attachment' + * member. This member is very convenient to keep application-specific data + * that will be needed when the tracked events are triggered. + * + * See $(LINK $(CODEURL)tango.io.selector.ISelector), + * $(LINK $(CODEURL)tango.io.selector.ISelectionSet) + */ +class SelectionKey +{ + private ISelectable _conduit; + private Event _events; + private Object _attachment; + + /** + * Constructor + */ + public this() + { + } + + /** + * Constructor + * + * Params: + * conduit = conduit that will be associated to this SelectionKey + * events = events that will be tracked for the conduit + * attachment = optional object with application-specific data that will + * be available when an event is triggered for the conduit + * + * Examples: + * --- + * SocketConduit cond; + * + * auto key = new SelectionKey(cond, Event.Read | Event.Write); + * --- + */ + public this(ISelectable conduit, Event events, Object attachment = null) + { + _conduit = conduit; + _events = events; + _attachment = attachment; + } + + /** + * Return the conduit held by the instance. + */ + public ISelectable conduit() + { + return _conduit; + } + + /** + * Set the conduit held by the instance + */ + public void conduit(ISelectable conduit) + { + _conduit = conduit; + } + + /** + * Return the registered events as a bit mask of different Event values. + */ + public Event events() + { + return _events; + } + + /** + * Set the registered events as a bit mask of different Event values. + */ + public void events(Event events) + { + _events = events; + } + + /** + * Return the attached Object held by the instance. + */ + public Object attachment() + { + return _attachment; + } + + /** + * Set the attached Object held by the instance + */ + public void attachment(Object attachment) + { + _attachment = attachment; + } + + /** + * Check if a Read event has been associated to this SelectionKey. + */ + public bool isReadable() + { + return ((_events & Event.Read) != 0); + } + + /** + * Check if an UrgentRead event has been associated to this SelectionKey. + */ + public bool isUrgentRead() + { + return ((_events & Event.UrgentRead) != 0); + } + + /** + * Check if a Write event has been associated to this SelectionKey. + */ + public bool isWritable() + { + return ((_events & Event.Write) != 0); + } + + /** + * Check if an Error event has been associated to this SelectionKey. + */ + public bool isError() + { + return ((_events & Event.Error) != 0); + } + + /** + * Check if a Hangup event has been associated to this SelectionKey. + */ + public bool isHangup() + { + return ((_events & Event.Hangup) != 0); + } + + /** + * Check if an InvalidHandle event has been associated to this SelectionKey. + */ + public bool isInvalidHandle() + { + return ((_events & Event.InvalidHandle) != 0); + } +} + + +/** + * Container that holds the SelectionKey's for all the conduits that have + * triggered events during a previous invocation to ISelector.select(). + * Instances of this container are normally returned from calls to + * ISelector.selectedSet(). + */ +interface ISelectionSet +{ + /** + * Returns the number of SelectionKey's in the set. + */ + public abstract uint length(); + + /** + * Operator to iterate over a set via a foreach block. + */ + public abstract int opApply(int delegate(inout SelectionKey) dg); +} + + +/** + * A selector is a multiplexor for I/O events associated to a Conduit. + * All selectors must implement this interface. + * + * A selector needs to be initialized by calling the open() method to pass + * it the initial amount of conduits that it will handle and the maximum + * amount of events that will be returned per call to select(). In both cases, + * these values are only hints and may not even be used by the specific + * ISelector implementation you choose to use, so you cannot make any + * assumptions regarding what results from the call to select() (i.e. you + * may receive more or less events per call to select() than what was passed + * in the 'maxEvents' argument. The amount of conduits that the selector can + * manage will be incremented dynamically if necessary. + * + * To add, modify or remove conduit registrations to the selector you use + * the register(), reregister() and unregister() methods respectively. + * + * To wait for events from the conduits you need to call any of the select() + * methods. The selector cannot be modified from another thread while + * blocking on a call to these methods. + * + * Once the selector is no longer used you must call the close() method so + * that the selector can free any resources it may have allocated in the call + * to open(). + * + * Examples: + * --- + * import tango.io.selector.model.ISelector; + * import tango.io.SocketConduit; + * import tango.io.Stdout; + * + * ISelector selector; + * SocketConduit conduit1; + * SocketConduit conduit2; + * MyClass object1; + * MyClass object2; + * int eventCount; + * + * // Initialize the selector assuming that it will deal with 2 conduits and + * // will receive 2 events per invocation to the select() method. + * selector.open(2, 2); + * + * selector.register(conduit, Event.Read, object1); + * selector.register(conduit, Event.Write, object2); + * + * eventCount = selector.select(); + * + * if (eventCount > 0) + * { + * char[16] buffer; + * int count; + * + * foreach (SelectionKey key, selector.selectedSet()) + * { + * if (key.isReadable()) + * { + * count = (cast(SocketConduit) key.conduit).read(buffer); + * if (count != IConduit.Eof) + * { + * Stdout.format("Received '{0}' from peer\n", buffer[0..count]); + * selector.reregister(key.conduit, Event.Write, key.attachment); + * } + * else + * { + * selector.unregister(key.conduit); + * key.conduit.close(); + * } + * } + * + * if (key.isWritable()) + * { + * count = (cast(SocketConduit) key.conduit).write("MESSAGE"); + * if (count != IConduit.Eof) + * { + * Stdout.print("Sent 'MESSAGE' to peer\n"); + * selector.reregister(key.conduit, Event.Read, key.attachment); + * } + * else + * { + * selector.unregister(key.conduit); + * key.conduit.close(); + * } + * } + * + * if (key.isError() || key.isHangup() || key.isInvalidHandle()) + * { + * selector.unregister(key.conduit); + * key.conduit.close(); + * } + * } + * } + * + * selector.close(); + * --- + */ +interface ISelector +{ + /** + * Initialize the selector. + * + * Params: + * size = value that provides a hint for the maximum amount of + * conduits that will be registered + * maxEvents = value that provides a hint for the maximum amount of + * conduit events that will be returned in the selection + * set per call to select. + */ + public abstract void open(uint size, uint maxEvents); + + /** + * Free any operating system resources that may have been allocated in the + * call to open(). + * + * Remarks: + * Not all of the selectors need to free resources other than allocated + * memory, but those that do will normally also add a call to close() in + * their destructors. + */ + public abstract void close(); + + /** + * Associate a conduit to the selector and track specific I/O events. + * + * Params: + * conduit = conduit that will be associated to the selector; + * must be a valid conduit (i.e. not null and open). + * events = bit mask of Event values that represent the events that + * will be tracked for the conduit. + * attachment = optional object with application-specific data that will + * be available when an event is triggered for the conduit + * + * Examples: + * --- + * ISelector selector; + * SocketConduit conduit; + * MyClass object; + * + * selector.register(conduit, Event.Read | Event.Write, object); + * --- + */ + public abstract void register(ISelectable conduit, Event events, + Object attachment = null); + + /** + * Modify the events that are being tracked or the 'attachment' field + * for an already registered conduit. + * + * Params: + * conduit = conduit that will be associated to the selector; + * must be a valid conduit (i.e. not null and open). + * events = bit mask of Event values that represent the events that + * will be tracked for the conduit. + * attachment = optional object with application-specific data that will + * be available when an event is triggered for the conduit + * + * Remarks: + * The 'attachment' member of the SelectionKey will always be overwritten, + * even if it's null. + * + * Examples: + * --- + * ISelector selector; + * SocketConduit conduit; + * MyClass object; + * + * selector.reregister(conduit, Event.Write, object); + * --- + */ + public abstract void reregister(ISelectable conduit, Event events, + Object attachment = null); + /** + * Remove a conduit from the selector. + * + * Params: + * conduit = conduit that had been previously associated to the + * selector; it can be null. + * + * Remarks: + * Unregistering a null conduit is allowed and no exception is thrown + * if this happens. + */ + public abstract void unregister(ISelectable conduit); + + /** + * Wait indefinitely for I/O events from the registered conduits. + * + * Returns: + * The amount of conduits that have received events; 0 if no conduits + * have received events within the specified timeout and -1 if there + * was an error. + */ + public abstract int select(); + + /** + * Wait for I/O events from the registered conduits for a specified + * amount of time. + * + * Params: + * timeout = TimeSpan with the maximum amount of time that the + * selector will wait for events from the conduits; the + * amount of time is relative to the current system time + * (i.e. just the number of milliseconds that the selector + * has to wait for the events). + * + * Returns: + * The amount of conduits that have received events; 0 if no conduits + * have received events within the specified timeout. + */ + public abstract int select(TimeSpan timeout); + + /** + * Wait for I/O events from the registered conduits for a specified + * amount of time. + * + * Note: This representation of timeout is not always accurate, so it is + * possible that the function will return with a timeout before the + * specified period. For more accuracy, use the TimeSpan version. + * + * Note: Implementers should define this method as: + * ------- + * select(TimeSpan.interval(timeout)); + * ------- + * + * Params: + * timeout = the maximum amount of time in seconds that the + * selector will wait for events from the conduits; the + * amount of time is relative to the current system time + * (i.e. just the number of milliseconds that the selector + * has to wait for the events). + * + * Returns: + * The amount of conduits that have received events; 0 if no conduits + * have received events within the specified timeout. + */ + public abstract int select(double timeout); + + /** + * Return the selection set resulting from the call to any of the select() + * methods. + * + * Remarks: + * If the call to select() was unsuccessful or it did not return any + * events, the returned value will be null. + */ + public abstract ISelectionSet selectedSet(); + + /** + * Return the selection key resulting from the registration of a conduit + * to the selector. + * + * Remarks: + * If the conduit is not registered to the selector the returned + * value will be null. No exception will be thrown by this method. + */ + public abstract SelectionKey key(ISelectable conduit); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/stream/BufferStream.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/stream/BufferStream.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,72 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: Oct 2007 + + author: Kris + +*******************************************************************************/ + +module tango.io.stream.BufferStream; + +private import tango.io.Buffer; + +/******************************************************************************* + + Buffers the flow of data from a upstream input. A downstream + neighbour can locate and use this buffer instead of creating + another instance of their own. + + (note that upstream is closer to the source, and downstream is + further away) + +*******************************************************************************/ + +class BufferInput : Buffer +{ + /*********************************************************************** + + Propagate ctor to superclass + + ***********************************************************************/ + + this (InputStream stream, uint size = 16 * 1024) + { + super (size); + super.input = stream; + } +} + + +/******************************************************************************* + + Buffers the flow of data from a upstream output. A downstream + neighbour can locate and use this buffer instead of creating + another instance of their own. + + (note that upstream is closer to the source, and downstream is + further away) + + Don't forget to flush() buffered content before closing. + +*******************************************************************************/ + +class BufferOutput : Buffer +{ + /*********************************************************************** + + Propagate ctor to superclass + + ***********************************************************************/ + + this (OutputStream stream, uint size = 16 * 1024) + { + super (size); + super.output = stream; + } +} + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/stream/DataFileStream.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/stream/DataFileStream.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,121 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: Nov 2007 + + author: Kris + +*******************************************************************************/ + +module tango.io.stream.DataFileStream; + +private import tango.io.FileConduit; + +private import tango.io.stream.DataStream; + +/******************************************************************************* + + Composes a seekable file with buffered binary input. A seek causes + the input buffer to be cleared + +*******************************************************************************/ + +class DataFileInput : DataInput +{ + private FileConduit conduit; + + /*********************************************************************** + + Wrap a FileConduit instance + + ***********************************************************************/ + + this (FileConduit file, uint buffer=uint.max) + { + super (conduit = file, buffer); + } + + /*********************************************************************** + + Set the file seek position to the specified offset, and + clear the input buffer + + ***********************************************************************/ + + final long seek (long offset) + { + host.clear; + return conduit.seek (offset); + } + + /*********************************************************************** + + Return the underlying conduit + + ***********************************************************************/ + + final FileConduit file () + { + return conduit; + } +} + + +/******************************************************************************* + + Composes a seekable file with buffered binary output. A seek causes + the output buffer to be flushed first + +*******************************************************************************/ + +class DataFileOutput : DataOutput +{ + private FileConduit conduit; + + /*********************************************************************** + + Wrap a FileConduit instance + + ***********************************************************************/ + + this (FileConduit file, uint buffer=uint.max) + { + super (conduit = file, buffer); + } + + /*********************************************************************** + + Set the file seek position to the specified offset, after + flushing the output buffer + + ***********************************************************************/ + + final long seek (long offset) + { + host.flush; + return conduit.seek (offset); + } + + /*********************************************************************** + + Return the underlying conduit + + ***********************************************************************/ + + final FileConduit file () + { + return conduit; + } +} + + +/******************************************************************************* + +*******************************************************************************/ + +debug (UnitTest) +{ +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/stream/DataStream.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/stream/DataStream.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,338 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: Oct 2007 + + author: Kris + +*******************************************************************************/ + +module tango.io.stream.DataStream; + +private import tango.io.Buffer; + +private import tango.io.Conduit; + +private import tango.core.ByteSwap; + +/******************************************************************************* + + A simple way to read binary data from an arbitrary InputStream, + such as a file: + --- + auto input = new DataInput (new FileInput("path")); + auto x = input.readInt; + auto y = input.readDouble; + input.read (new char[10]); + input.close; + --- + +*******************************************************************************/ + +class DataInput : InputFilter, Buffered +{ + private bool flip; + private IBuffer input; + + /*********************************************************************** + + Propagate ctor to superclass + + ***********************************************************************/ + + this (InputStream stream, uint buffer=uint.max, bool flip=false) + { + this.flip = flip; + super (input = Buffer.share (stream, buffer)); + } + + /*********************************************************************** + + Buffered interface + + ***********************************************************************/ + + final IBuffer buffer () + { + return input; + } + + /*********************************************************************** + + Override this to give back a useful chaining reference + + ***********************************************************************/ + + final override DataInput clear () + { + host.clear; + return this; + } + + /*********************************************************************** + + Read an array back into a user-provided workspace. The + space must be sufficiently large enough to house all of + the array, and the actual number of bytes is returned. + + Note that the size of the array is written as an integer + prefixing the array content itself. Use read(void[]) to + eschew this prefix. + + ***********************************************************************/ + + final override uint get (void[] dst) + { + auto len = getInt; + if (len > dst.length) + conduit.error ("DataInput.readArray :: dst array is too small"); + input.readExact (dst.ptr, len); + return len; + } + + /*********************************************************************** + + ***********************************************************************/ + + final bool getBool () + { + bool x; + input.readExact (&x, x.sizeof); + return x; + } + + /*********************************************************************** + + ***********************************************************************/ + + final byte getByte () + { + byte x; + input.readExact (&x, x.sizeof); + return x; + } + + /*********************************************************************** + + ***********************************************************************/ + + final short getShort () + { + short x; + input.readExact (&x, x.sizeof); + if (flip) + ByteSwap.swap16(&x, x.sizeof); + return x; + } + + /*********************************************************************** + + ***********************************************************************/ + + final int getInt () + { + int x; + input.readExact (&x, x.sizeof); + if (flip) + ByteSwap.swap32(&x, x.sizeof); + return x; + } + + /*********************************************************************** + + ***********************************************************************/ + + final long getLong () + { + long x; + input.readExact (&x, x.sizeof); + if (flip) + ByteSwap.swap64(&x, x.sizeof); + return x; + } + + /*********************************************************************** + + ***********************************************************************/ + + final float getFloat () + { + float x; + input.readExact (&x, x.sizeof); + if (flip) + ByteSwap.swap32(&x, x.sizeof); + return x; + } + + /*********************************************************************** + + ***********************************************************************/ + + final double getDouble () + { + double x; + input.readExact (&x, x.sizeof); + if (flip) + ByteSwap.swap64(&x, x.sizeof); + return x; + } + +} + + +/******************************************************************************* + + A simple way to write binary data to an arbitrary OutputStream, + such as a file: + --- + auto output = new DataOutput (new FileOutput("path")); + output.writeInt (1024); + output.writeDouble (3.14159); + output.write ("hello world"); + output.flush.close; + --- + +*******************************************************************************/ + +class DataOutput : OutputFilter, Buffered +{ + private bool flip; + private IBuffer output; + + /*********************************************************************** + + Propagate ctor to superclass + + ***********************************************************************/ + + this (OutputStream stream, uint buffer=uint.max, bool flip = false) + { + this.flip = flip; + super (output = Buffer.share (stream, buffer)); + } + + /*********************************************************************** + + Buffered interface + + ***********************************************************************/ + + final IBuffer buffer () + { + return output; + } + + /*********************************************************************** + + Write an array to the target stream. Note that the size + of the array is written as an integer prefixing the array + content itself. Use write(void[]) to eschew this prefix. + + ***********************************************************************/ + + final uint put (void[] src) + { + auto len = src.length; + putInt (len); + output.append (src.ptr, len); + return len; + } + + /*********************************************************************** + + ***********************************************************************/ + + final void putBool (bool x) + { + output.append (&x, x.sizeof); + } + + /*********************************************************************** + + ***********************************************************************/ + + final void putByte (byte x) + { + output.append (&x, x.sizeof); + } + + /*********************************************************************** + + ***********************************************************************/ + + final void putShort (short x) + { + if (flip) + ByteSwap.swap16 (&x, x.sizeof); + output.append (&x, x.sizeof); + } + + /*********************************************************************** + + ***********************************************************************/ + + final void putInt (int x) + { + if (flip) + ByteSwap.swap32 (&x, x.sizeof); + output.append (&x, uint.sizeof); + } + + /*********************************************************************** + + ***********************************************************************/ + + final void putLong (long x) + { + if (flip) + ByteSwap.swap64 (&x, x.sizeof); + output.append (&x, x.sizeof); + } + + /*********************************************************************** + + ***********************************************************************/ + + final void putFloat (float x) + { + if (flip) + ByteSwap.swap32 (&x, x.sizeof); + output.append (&x, x.sizeof); + } + + /*********************************************************************** + + ***********************************************************************/ + + final void putDouble (double x) + { + if (flip) + ByteSwap.swap64 (&x, x.sizeof); + output.append (&x, x.sizeof); + } +} + +/******************************************************************************* + +*******************************************************************************/ + +debug (UnitTest) +{ + import tango.io.Buffer; + + unittest + { + auto buf = new Buffer(32); + + auto output = new DataOutput (buf); + output.put ("blah blah"); + output.putInt (1024); + + auto input = new DataInput (buf); + assert (input.get(new char[9]) is 9); + assert (input.getInt is 1024); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/stream/DigestStream.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/stream/DigestStream.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,154 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: Oct 2007 + + author: Kris + +*******************************************************************************/ + +module tango.io.stream.DigestStream; + +private import tango.io.Conduit; + +private import tango.io.digest.Digest; + +/******************************************************************************* + + Inject a digest filter into an input stream, updating the digest + as information flows through it + +*******************************************************************************/ + +class DigestInput : InputFilter +{ + private Digest filter; + + /*********************************************************************** + + Accepts any input stream, and any digest derivation + + ***********************************************************************/ + + this (InputStream stream, Digest digest) + { + super (stream); + filter = digest; + } + + /*********************************************************************** + + Read from conduit into a target array. The provided dst + will be populated with content from the conduit. + + Returns the number of bytes read, which may be less than + requested in dst (or IOStream.Eof for end-of-flow) + + ***********************************************************************/ + + final override uint read (void[] dst) + { + auto len = host.read (dst); + if (len != Eof) + filter.update (dst [0 .. len]); + return len; + } + + /******************************************************************** + + Return the Digest instance we were created with. Use this + to access the resultant binary or hex digest value + + *********************************************************************/ + + final Digest digest() + { + return filter; + } +} + + +/******************************************************************************* + + Inject a digest filter into an output stream, updating the digest + as information flows through it. Here's an example where we calculate + an MD5 digest as a side-effect of copying a file: + --- + auto output = new DigestOutput(new FileOutput("output"), new Md5); + output.copy (new FileInput("input")); + + Stdout.formatln ("hex digest: {}", output.digest.hexDigest); + --- + +*******************************************************************************/ + +class DigestOutput : OutputFilter +{ + private Digest filter; + + /*********************************************************************** + + Accepts any output stream, and any digest derivation + + ***********************************************************************/ + + this (OutputStream stream, Digest digest) + { + super (stream); + filter = digest; + } + + /*********************************************************************** + + Write to conduit from a source array. The provided src + content will be written to the conduit. + + Returns the number of bytes written from src, which may + be less than the quantity provided + + ***********************************************************************/ + + final override uint write (void[] src) + { + auto len = host.write (src); + if (len != Eof) + filter.update (src[0 .. len]); + return len; + } + + /******************************************************************** + + Return the Digest instance we were created with. Use this + to access the resultant binary or hex digest value + + *********************************************************************/ + + final Digest digest() + { + return filter; + } +} + + +/******************************************************************************* + +*******************************************************************************/ + +debug (DigestStream) +{ + import tango.io.Stdout; + import tango.io.GrowBuffer; + import tango.io.digest.Md5; + import tango.io.stream.FileStream; + + void main() + { + auto output = new DigestOutput(new GrowBuffer, new Md5); + output.copy (new FileInput("digeststream.d")); + + Stdout.formatln ("hex digest:{}", output.digest.hexDigest); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/stream/EndianStream.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/stream/EndianStream.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,176 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: Nov 2007 + + author: Kris + + Streams for swapping endian-order. The stream is treated as a set + of same-sized elements. Note that partial elements are not mutated + +*******************************************************************************/ + +module tango.io.stream.EndianStream; + +private import tango.io.Buffer, + tango.io.Conduit; + +private import tango.core.ByteSwap; + +/******************************************************************************* + + Type T is the element type + +*******************************************************************************/ + +class EndianInput(T) : InputFilter +{ + static if ((T.sizeof != 2) && (T.sizeof != 4) && (T.sizeof != 8)) + pragma (msg, "EndianInput :: type should be of length 2, 4, or 8 bytes"); + + + private IBuffer input; + + /*********************************************************************** + + ***********************************************************************/ + + this (InputStream stream) + { + super (input = Buffer.share (stream)); + } + + /*********************************************************************** + + Buffered interface + + ***********************************************************************/ + + final IBuffer buffer () + { + return input; + } + + /*********************************************************************** + + Read from conduit into a target array. The provided dst + will be populated with content from the conduit. + + Returns the number of bytes read, which may be less than + requested in dst (or IOStream.Eof for end-of-flow). Note + that a trailing partial element will be placed into dst, + but the returned length will effectively ignore it + + ***********************************************************************/ + + final override uint read (void[] dst) + { + uint len = input.fill (dst[0 .. dst.length & ~(T.sizeof-1)]); + if (len != Eof) + { + // the final read may be misaligned ... + len &= ~(T.sizeof - 1); + + static if (T.sizeof == 2) + ByteSwap.swap16 (dst.ptr, len); + + static if (T.sizeof == 4) + ByteSwap.swap32 (dst.ptr, len); + + static if (T.sizeof == 8) + ByteSwap.swap64 (dst.ptr, len); + } + return len; + } +} + + + +/******************************************************************************* + + Type T is the element type + +*******************************************************************************/ + +class EndianOutput (T) : OutputFilter +{ + static if ((T.sizeof != 2) && (T.sizeof != 4) && (T.sizeof != 8)) + pragma (msg, "EndianOutput :: type should be of length 2, 4, or 8 bytes"); + + private IBuffer output; + + /*********************************************************************** + + ***********************************************************************/ + + this (OutputStream stream) + { + super (output = Buffer.share (stream)); + } + + /*********************************************************************** + + Write to output stream from a source array. The provided + src content will be consumed and left intact. + + Returns the number of bytes written from src, which may + be less than the quantity provided. Note that any partial + elements will not be consumed + + ***********************************************************************/ + + final override uint write (void[] src) + { + uint writer (void[] dst) + { + auto len = dst.length; + if (len > src.length) + len = src.length; + + len &= ~(T.sizeof - 1); + dst [0..len] = src [0..len]; + + static if (T.sizeof == 2) + ByteSwap.swap16 (dst.ptr, len); + + static if (T.sizeof == 4) + ByteSwap.swap32 (dst.ptr, len); + + static if (T.sizeof == 8) + ByteSwap.swap64 (dst.ptr, len); + + return len; + } + + uint bytes = src.length; + + // flush if we used all buffer space + if ((bytes -= output.write (&writer)) >= T.sizeof) + if (output.output) + output.drain (output.output); + else + return Eof; + return src.length - bytes; + } +} + + +/******************************************************************************* + +*******************************************************************************/ + +debug (UnitTest) +{ + import tango.io.Stdout; + + unittest + { + auto inp = new EndianInput!(dchar)(new Buffer("hello world"d)); + auto oot = new EndianOutput!(dchar)(new Buffer(64)); + oot.copy (inp); + assert (oot.output.slice == "hello world"d); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/stream/FileStream.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/stream/FileStream.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,57 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: Oct 2007 + + author: Kris + +*******************************************************************************/ + +module tango.io.stream.FileStream; + +public import tango.io.FileConduit; + +/******************************************************************************* + + Trivial wrapper around a FileConduit + +*******************************************************************************/ + +class FileInput : FileConduit +{ + /*********************************************************************** + + Open a file for reading. Don't forget to use close() + + ***********************************************************************/ + + this (char[] path, FileConduit.Style style = FileConduit.ReadExisting) + { + super (path, style); + } +} + + +/******************************************************************************* + + Trivial wrapper around a FileConduit + +*******************************************************************************/ + +class FileOutput : FileConduit +{ + /*********************************************************************** + + Open a file for writing. Don't forget to use close() + + ***********************************************************************/ + + this (char[] path, FileConduit.Style style = FileConduit.WriteCreate) + { + super (path, style); + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/stream/FormatStream.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/stream/FormatStream.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,58 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: Oct 2007 + + author: Kris + +*******************************************************************************/ + +module tango.io.stream.FormatStream; + +private import tango.io.Print; + +private import tango.io.model.IConduit; + +private import tango.text.convert.Format; + +/******************************************************************************* + + Simple way to hook up a utf8 formatter to an arbitrary OutputStream, + such as a file: + --- + auto output = new FormatOutput (new FileOutput("path")); + output.formatln ("{} green bottles", 10); + output.close; + --- + + This is a trivial wrapper around the Print class, and is limited + to emitting utf8 output. Use the Print class directly in order to + generate utf16/32 output instead. + + Note that this class is a true instance of OutputStream, by way of + inheritance via the Print superclass. + +*******************************************************************************/ + +class FormatOutput : Print!(char) +{ + /*********************************************************************** + + Create a Layout instance and bind it to the given stream. + The optional second argument controls implicit flushing of + newline(), where true enables flushing. An explicit flush() + will always flush the output. + + ***********************************************************************/ + + this (OutputStream stream, bool flush=false) + { + super (Format, stream); + super.flush = flush; + } +} + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/stream/GreedyStream.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/stream/GreedyStream.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,162 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: June 2007 + + author: Kris + +*******************************************************************************/ + +module tango.io.stream.GreedyStream; + +private import tango.io.Conduit; + + +/******************************************************************************* + + A conduit filter that ensures its input is read in full. There's + also an optional readExact() for more explicit requests + +*******************************************************************************/ + +class GreedyInput : InputFilter +{ + /*********************************************************************** + + Propagate ctor to superclass + + ***********************************************************************/ + + this (InputStream stream) + { + super (stream); + } + + /*********************************************************************** + + Fill the provided array. Returns the number of bytes + actually read, which will be less that dst.length when + Eof has been reached, and then Eof thereafter + + ***********************************************************************/ + + final override uint read (void[] dst) + { + uint len = 0; + + while (len < dst.length) + { + auto i = host.read (dst [len .. $]); + if (i is Eof) + return (len ? len : i); + len += i; + } + return len; + } + + /*********************************************************************** + + Read from a stream into a target array. The provided dst + will be fully populated with content from the input. + + This differs from read in that it will throw an exception + where an Eof condition is reached before input has completed + + ***********************************************************************/ + + final GreedyInput readExact (void[] dst) + { + while (dst.length) + { + auto i = read (dst); + if (i is Eof) + conduit.error ("unexpected Eof while reading: "~conduit.toString); + dst = dst [i .. $]; + } + return this; + } +} + + + +/******************************************************************************* + + A conduit filter that ensures its output is written in full. There's + also an optional writeExact() for more explicit requests + +*******************************************************************************/ + +class GreedyOutput : OutputFilter +{ + /*********************************************************************** + + Propagate ctor to superclass + + ***********************************************************************/ + + this (OutputStream stream) + { + super (stream); + } + + /*********************************************************************** + + Consume everything we were given. Returns the number of + bytes written which will be less than src.length only + when an Eof condition is reached, and Eof from that point + forward + + ***********************************************************************/ + + final override uint write (void[] src) + { + uint len = 0; + + while (len < src.length) + { + auto i = host.write (src [len .. $]); + if (i is Eof) + return (len ? len : i); + len += i; + } + return len; + } + + /*********************************************************************** + + Write to stream from a source array. The provided src content + will be written in full to the output. + + This differs from write in that it will throw an exception + where an Eof condition is reached before output has completed + + ***********************************************************************/ + + final GreedyOutput writeExact (void[] src) + { + while (src.length) + { + auto i = write (src); + if (i is Eof) + conduit.error ("unexpected Eof while writing: "~conduit.toString); + src = src [i .. $]; + } + return this; + } +} + + +/******************************************************************************* + +*******************************************************************************/ + +debug (GreedyStream) +{ + void main() + { + auto s = new GreedyInput (null); + } +} \ No newline at end of file diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/stream/LineStream.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/stream/LineStream.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,72 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: Oct 2007 + + author: Kris + +*******************************************************************************/ + +module tango.io.stream.LineStream; + +private import tango.io.model.IConduit; + +private import tango.text.stream.LineIterator; + +/******************************************************************************* + + Simple way to hook up a line-tokenizer to an arbitrary InputStream, + such as a file conduit: + --- + auto input = new LineInput (new FileInput("path")); + foreach (line; input) + ... + input.close; + --- + + Note that this is just a simple wrapper around LineIterator, and + supports utf8 lines only. Use LineIterator directly for utf16/32 + support, or use the other tango.text.stream classes directly for + other tokenizing needs. + + Note that this class is a true instance of InputStream, by way of + inheritance via the Iterator superclass. + +*******************************************************************************/ + +class LineInput : LineIterator!(char) +{ + /*********************************************************************** + + Propagate ctor to superclass + + ***********************************************************************/ + + this (InputStream stream) + { + super (stream); + } +} + + +/******************************************************************************* + + +*******************************************************************************/ + +debug (LineStream) +{ + import tango.io.Stdout; + import tango.io.stream.FileStream; + + void main() + { + auto input = new LineInput (new FileInput("LineStream.d")); + foreach (line; input) + Stdout(line).newline; + input.close; + } +} \ No newline at end of file diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/stream/MapStream.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/stream/MapStream.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,201 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: Oct 2007 + + author: Kris + + Simple serialization for text-based name/value pairs + +*******************************************************************************/ + +module tango.io.stream.MapStream; + +private import tango.io.Buffer, + tango.io.Conduit; + +private import Text = tango.text.Util; + +private import tango.text.stream.LineIterator; + +/******************************************************************************* + + Provides load facilities for a properties stream. That is, a file + or other medium containing lines of text with a name=value layout + +*******************************************************************************/ + +class MapInput(T) : LineIterator!(T) +{ + /*********************************************************************** + + Propagate ctor to superclass + + ***********************************************************************/ + + this (InputStream stream) + { + super (stream); + } + + /*********************************************************************** + + Load properties from the provided stream, via a foreach. + + We use an iterator to sweep text lines, and extract lValue + and rValue pairs from each one, The expected file format is + as follows: + + --- + x = y + abc = 123 + x.y.z = this is a single property + + # this is a comment line + --- + + Note that the provided name and value are actually slices + and should be copied if you intend to retain them (using + name.dup and value.dup where appropriate) + + ***********************************************************************/ + + final int opApply (int delegate(ref T[] name, ref T[] value) dg) + { + int ret; + + foreach (line; super) + { + auto text = Text.trim (line); + + // comments require '#' as the first non-whitespace char + if (text.length && (text[0] != '#')) + { + // find the '=' char + auto i = Text.locate (text, '='); + + // ignore if not found ... + if (i < text.length) + { + auto name = Text.trim (text[0 .. i]); + auto value = Text.trim (text[i+1 .. $]); + if ((ret = dg (name, value)) != 0) + break; + } + } + } + return ret; + } + + /*********************************************************************** + + Load the input stream into an AA + + ***********************************************************************/ + + final MapInput load (ref T[][T[]] properties) + { + foreach (name, value; this) + properties[name.dup] = value.dup; + return this; + } +} + + +/******************************************************************************* + + Provides write facilities on a properties stream. That is, a file + or other medium which will contain lines of text with a name=value + layout + +*******************************************************************************/ + +class MapOutput(T) : OutputFilter, Buffered +{ + private IBuffer output; + + private const T[] equals = " = "; + version (Win32) + private const T[] NL = "\r\n"; + version (Posix) + private const T[] NL = "\n"; + + /*********************************************************************** + + Propagate ctor to superclass + + ***********************************************************************/ + + this (OutputStream stream, T[] newline = NL) + { + super (output = Buffer.share (stream)); + } + + /*********************************************************************** + + Buffered interface + + ***********************************************************************/ + + final IBuffer buffer () + { + return output; + } + + /*********************************************************************** + + Write name & value to the provided stream + + ***********************************************************************/ + + final MapOutput append (T[] name, T[] value) + { + output (name) (equals) (value) (NL); + return this; + } + + /*********************************************************************** + + Write AA properties to the provided stream + + ***********************************************************************/ + + final MapOutput append (T[][T[]] properties) + { + foreach (key, value; properties) + append (key, value); + return this; + } +} + + + +/******************************************************************************* + +*******************************************************************************/ + +debug (UnitTest) +{ + import tango.io.Stdout; + import tango.io.GrowBuffer; + + unittest + { + auto buf = new GrowBuffer; + auto input = new MapInput!(char)(buf); + auto output = new MapOutput!(char)(buf); + + char[][char[]] map; + map["foo"] = "bar"; + map["foo2"] = "bar2"; + output.append (map); + + map = map.init; + input.load (map); + assert (map["foo"] == "bar"); + assert (map["foo2"] == "bar2"); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/stream/SnoopStream.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/stream/SnoopStream.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,240 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: Oct 2007 + + author: Kris + +*******************************************************************************/ + +module tango.io.stream.SnoopStream; + +private import tango.io.Console, + tango.io.Conduit; + +private import tango.text.convert.Format; + +private alias void delegate(char[]) Snoop; + +/******************************************************************************* + + Stream to expose call behaviour. By default, activity trace is + sent to Cerr + +*******************************************************************************/ + +class SnoopInput : InputStream +{ + private InputStream host; + private Snoop snoop; + + /*********************************************************************** + + Attach to the provided stream + + ***********************************************************************/ + + this (InputStream host, Snoop snoop = null) + { + assert (host); + this.host = host; + this.snoop = snoop ? snoop : &snooper; + } + + /*********************************************************************** + + Return the hosting conduit + + ***********************************************************************/ + + final IConduit conduit () + { + return host.conduit; + } + + /*********************************************************************** + + Read from conduit into a target array. The provided dst + will be populated with content from the conduit. + + Returns the number of bytes read, which may be less than + requested in dst + + ***********************************************************************/ + + final uint read (void[] dst) + { + auto x = host.read (dst); + trace ("{}: read {} bytes", host.conduit, x is -1 ? 0 : x); + return x; + } + + /*********************************************************************** + + Clear any buffered content + + ***********************************************************************/ + + final InputStream clear () + { + host.clear; + trace ("{}: cleared", host.conduit); + return this; + } + + /*********************************************************************** + + Close the input + + ***********************************************************************/ + + final void close () + { + host.close; + trace ("{}: closed", host.conduit); + } + + /*********************************************************************** + + Internal trace handler + + ***********************************************************************/ + + private void snooper (char[] x) + { + Cerr(x).newline; + } + + /*********************************************************************** + + Internal trace handler + + ***********************************************************************/ + + private void trace (char[] format, ...) + { + char[256] tmp = void; + snoop (Format.vprint (tmp, format, _arguments, _argptr)); + } +} + + +/******************************************************************************* + + Stream to expose call behaviour. By default, activity trace is + sent to Cerr + +*******************************************************************************/ + +class SnoopOutput : OutputStream +{ + private OutputStream host; + private Snoop snoop; + + /*********************************************************************** + + Attach to the provided stream + + ***********************************************************************/ + + this (OutputStream host, Snoop snoop = null) + { + assert (host); + this.host = host; + this.snoop = snoop ? snoop : &snooper; + } + + /*********************************************************************** + + Write to conduit from a source array. The provided src + content will be written to the conduit. + + Returns the number of bytes written from src, which may + be less than the quantity provided + + ***********************************************************************/ + + final uint write (void[] src) + { + auto x = host.write (src); + trace ("{}: wrote {} bytes", host.conduit, x is -1 ? 0 : x); + return x; + } + + /*********************************************************************** + + Return the hosting conduit + + ***********************************************************************/ + + final IConduit conduit () + { + return host.conduit; + } + + /*********************************************************************** + + Emit/purge buffered content + + ***********************************************************************/ + + final OutputStream flush () + { + host.flush; + trace ("{}: flushed", host.conduit); + return this; + } + + /*********************************************************************** + + Close the output + + ***********************************************************************/ + + final void close () + { + host.close; + trace ("{}: closed", host.conduit); + } + + /*********************************************************************** + + Transfer the content of another conduit to this one. Returns + a reference to this class, or throws IOException on failure. + + ***********************************************************************/ + + final OutputStream copy (InputStream src) + { + host.copy (src); + trace("{}: copied from {}", host.conduit, src.conduit); + return this; + } + + /*********************************************************************** + + Internal trace handler + + ***********************************************************************/ + + private void snooper (char[] x) + { + Cerr(x).newline; + } + + /*********************************************************************** + + Internal trace handler + + ***********************************************************************/ + + private void trace (char[] format, ...) + { + char[256] tmp = void; + snoop (Format.vprint (tmp, format, _arguments, _argptr)); + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/stream/TextFileStream.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/stream/TextFileStream.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,69 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: Nov 2007 + + author: Kris + +*******************************************************************************/ + +module tango.io.stream.TextFileStream; + +public import tango.io.FileConduit; + +private import tango.io.stream.FileStream, + tango.io.stream.LineStream, + tango.io.stream.FormatStream; + +/******************************************************************************* + + Composes a file with line-oriented input + +*******************************************************************************/ + +class TextFileInput : LineInput +{ + /*********************************************************************** + + compose a FileStream + + ***********************************************************************/ + + this (char[] path, FileConduit.Style style = FileConduit.ReadExisting) + { + super (new FileInput (path, style)); + } +} + + +/******************************************************************************* + + Composes a file with formatted text output + +*******************************************************************************/ + +class TextFileOutput : FormatOutput +{ + /*********************************************************************** + + compose a FileStream + + ***********************************************************************/ + + this (char[] path, FileConduit.Style style = FileConduit.WriteCreate) + { + super (new FileOutput (path, style)); + } + } + + +/******************************************************************************* + +*******************************************************************************/ + +debug (UnitTest) +{ +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/stream/TypedStream.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/stream/TypedStream.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,162 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: Nov 2007 + + author: Kris + + Streams to expose simple native types as discrete elements. I/O + is buffered and should yield fair performance. + +*******************************************************************************/ + +module tango.io.stream.TypedStream; + +private import tango.io.Buffer, + tango.io.Conduit; + +/******************************************************************************* + + Type T is the target or destination type + +*******************************************************************************/ + +class TypedInput(T) : InputFilter, Buffered +{ + private IBuffer input; + + /*********************************************************************** + + ***********************************************************************/ + + this (InputStream stream) + { + super (input = Buffer.share (stream)); + } + + /*********************************************************************** + + Buffered interface + + ***********************************************************************/ + + final IBuffer buffer () + { + return input; + } + + /*********************************************************************** + + Override this to give back a useful chaining reference + + ***********************************************************************/ + + final override TypedInput clear () + { + host.clear; + return this; + } + + /*********************************************************************** + + Read a value from the stream. Returns false when all + content has been consumed + + ***********************************************************************/ + + final bool read (inout T x) + { + return input.read((&x)[0..1]) is T.sizeof; + } + + /*********************************************************************** + + Iterate over all content + + ***********************************************************************/ + + final int opApply (int delegate(ref T x) dg) + { + T x; + int ret; + + while ((input.read((&x)[0..1]) is T.sizeof)) + if ((ret = dg (x)) != 0) + break; + return ret; + } +} + + + +/******************************************************************************* + + Type T is the target or destination type. + +*******************************************************************************/ + +class TypedOutput (T) : OutputFilter, Buffered +{ + private IBuffer output; + + /*********************************************************************** + + ***********************************************************************/ + + this (OutputStream stream) + { + super (output = Buffer.share (stream)); + } + + /*********************************************************************** + + Buffered interface + + ***********************************************************************/ + + final IBuffer buffer () + { + return output; + } + + /*********************************************************************** + + Append a value to the output stream + + ***********************************************************************/ + + final void write (T x) + { + output.append (&x, T.sizeof); + } +} + + +/******************************************************************************* + +*******************************************************************************/ + +debug (UnitTest) +{ + import tango.io.Stdout; + import tango.io.stream.UtfStream; + + unittest + { + auto inp = new TypedInput!(char)(new Buffer("hello world")); + auto oot = new TypedOutput!(char)(new Buffer(20)); + + foreach (x; inp) + oot.write (x); + assert (oot.buffer.slice == "hello world"); + + auto xx = new TypedInput!(char)(new UtfInput!(char, dchar)(new Buffer("hello world"d))); + char[] yy; + foreach (x; xx) + yy ~= x; + assert (yy == "hello world"); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/stream/UtfStream.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/stream/UtfStream.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,194 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: Nov 2007 + + author: Kris + + UTF conversion streams, supporting cross-translation of char, wchar + and dchar variants. For supporting endian variations, configure the + appropriate EndianStream upstream of this one (closer to the source) + +*******************************************************************************/ + +module tango.io.stream.UtfStream; + +private import tango.io.Buffer, + tango.io.Conduit; + +private import Utf = tango.text.convert.Utf; + +/******************************************************************************* + + Streaming UTF converter. Type T is the target or destination type, + while S is the source type. Both types are either char/wchar/dchar. + +*******************************************************************************/ + +class UtfInput(T, S) : InputFilter +{ + static if (!is (S == char) && !is (S == wchar) && !is (S == dchar)) + pragma (msg, "Source type must be char, wchar, or dchar"); + + static if (!is (T == char) && !is (T == wchar) && !is (T == dchar)) + pragma (msg, "Target type must be char, wchar, or dchar"); + + private IBuffer buffer; + + /*********************************************************************** + + ***********************************************************************/ + + this (InputStream stream) + { + super (buffer = Buffer.share (stream)); + } + + /*********************************************************************** + + ***********************************************************************/ + + final override uint read (void[] dst) + { + static if (is (S == T)) + return super.read (dst); + else + { + // must have some space available for converting + if (dst.length < T.sizeof) + conduit.error ("UtfStream.read :: target array is too small"); + + uint produced, + consumed; + auto output = Buffer.convert!(T)(dst); + auto input = Buffer.convert!(S)(buffer.slice); + + static if (is (T == char)) + produced = Utf.toString(input, output, &consumed).length; + + static if (is (T == wchar)) + produced = Utf.toString16(input, output, &consumed).length; + + static if (is (T == dchar)) + produced = Utf.toString32(input, output, &consumed).length; + + // consume buffer content + buffer.skip (consumed * S.sizeof); + + // fill buffer when nothing produced ... + if (produced is 0) + if (buffer.compress.fill(buffer.input) is Eof) + return Eof; + + return produced * T.sizeof; + } + } +} + + +/******************************************************************************* + + Streaming UTF converter. Type T is the target or destination type, + while S is the source type. Both types are either char/wchar/dchar. + + Note that the arguments are reversed from those of UtfInput + +*******************************************************************************/ + +class UtfOutput (S, T) : OutputFilter +{ + static if (!is (S == char) && !is (S == wchar) && !is (S == dchar)) + pragma (msg, "Source type must be char, wchar, or dchar"); + + static if (!is (T == char) && !is (T == wchar) && !is (T == dchar)) + pragma (msg, "Target type must be char, wchar, or dchar"); + + + private IBuffer buffer; + + /*********************************************************************** + + ***********************************************************************/ + + this (OutputStream stream) + { + super (buffer = Buffer.share (stream)); + assert (buffer.capacity > 3, "UtfOutput :: output buffer is too small"); + } + + /*********************************************************************** + + Write to the output stream from a source array. The provided + src content is converted as necessary. Note that an attached + output buffer must be at least four bytes wide to accommodate + a conversion. + + Returns the number of bytes consumed from src, which may be + less than the quantity provided + + ***********************************************************************/ + + final override uint write (void[] src) + { + static if (is (S == T)) + return super.write (src); + else + { + uint consumed, + produced; + + uint writer (void[] dst) + { + auto input = Buffer.convert!(S)(src); + auto output = Buffer.convert!(T)(dst); + + static if (is (T == char)) + produced = Utf.toString(input, output, &consumed).length; + + static if (is (T == wchar)) + produced = Utf.toString16(input, output, &consumed).length; + + static if (is (T == dchar)) + produced = Utf.toString32(input, output, &consumed).length; + + return produced * T.sizeof; + } + + // write directly into the buffered content. A tad + // tricky to flush the output in an optimal manner. + // We could do this trivially via an internal work + // space conversion, but that would incur an extra + // memory copy + if (buffer.write(&writer) is 0) + // empty a connected buffer + if (buffer.output) + buffer.drain (buffer.output); + else + // buffer must be at least 4 bytes wide + // to contain a generic conversion + if (buffer.writable < 4) + return Eof; + + return consumed * S.sizeof; + } + } +} + + +/******************************************************************************* + +*******************************************************************************/ + +debug (UtfStream) +{ + void main() + { + auto inp = new UtfInput!(dchar, char)(new Buffer("hello world")); + auto oot = new UtfOutput!(dchar, char)(new Buffer(20)); + oot.copy(inp); + assert (oot.buffer.slice == "hello world"); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/vfs/FileFolder.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/vfs/FileFolder.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,808 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Oct 2007: Initial version + + author: Kris + +*******************************************************************************/ + +module tango.io.vfs.FileFolder; + +private import tango.io.FilePath, + tango.io.FileConduit; + +private import tango.util.PathUtil; + +private import tango.core.Exception; + +private import tango.io.vfs.model.Vfs; + +private import tango.io.model.IConduit; + +/******************************************************************************* + + Represents a physical folder in a file system. Use one of these + to address specific paths (sub-trees) within the file system. + +*******************************************************************************/ + +class FileFolder : VfsFolder +{ + private FilePath path; + private VfsStats stats; + + /*********************************************************************** + + Create a file folder with the given name and path. The + name itself should not include '.' or '/' characters, + though the path can point at whatever it pleases. + + Option 'create' will create the folder when set true, + and open an existing folder otherwise + + ***********************************************************************/ + + this (char[] path, bool create=false) + { + this.path = open (FilePath(path), create); + } + + /*********************************************************************** + + create a FileFolder as a Group member + + ***********************************************************************/ + + private this (FilePath path) + { + this.path = path; + } + + /*********************************************************************** + + explicitly create() or open() a named folder + + ***********************************************************************/ + + private this (FileFolder parent, char[] name, bool create=false) + { + assert (parent); + this.path = open (parent.path.dup.append(name), create); + } + + /*********************************************************************** + + Return a short name + + ***********************************************************************/ + + final char[] name () + { + return path.name; + } + + /*********************************************************************** + + Return a long name + + ***********************************************************************/ + + final char[] toString () + { + return path.toString; + } + + /*********************************************************************** + + A folder is being added or removed from the hierarchy. Use + this to test for validity (or whatever) and throw exceptions + as necessary + + Here we test for folder overlap, and bail-out when found. + + ***********************************************************************/ + + final void verify (VfsFolder folder, bool mounting) + { + if (mounting && cast(FileFolder) folder) + { + auto src = FilePath.padded(this.toString); + auto dst = FilePath.padded(folder.toString); + + auto len = src.length; + if (len > dst.length) + len = dst.length; + + if (src[0..len] == dst[0..len]) + error ("folders '"~dst~"' and '"~src~"' overlap"); + } + } + + /*********************************************************************** + + Return a contained file representation + + ***********************************************************************/ + + final VfsFile file (char[] name) + { + return (new FileHost).set (path.toString, name); + } + + /*********************************************************************** + + Return a contained folder representation + + ***********************************************************************/ + + final VfsFolderEntry folder (char[] path) + { + return new FolderHost (this, path); + } + + /*********************************************************************** + + Remove the folder subtree + + ***********************************************************************/ + + final VfsFolder clear () + { + path.remove; + return this; + } + + /*********************************************************************** + + Is folder writable? + + ***********************************************************************/ + + final bool writable () + { + return path.isWritable; + } + + /*********************************************************************** + + Returns content information about this folder + + ***********************************************************************/ + + final VfsFolders self () + { + return new FolderGroup (this, false); + } + + /*********************************************************************** + + Returns a subtree of folders matching the given name + + ***********************************************************************/ + + final VfsFolders tree () + { + return new FolderGroup (this, true); + } + + /*********************************************************************** + + Iterate over the set of immediate child folders. This is + useful for reflecting the hierarchy + + ***********************************************************************/ + + final int opApply (int delegate(inout VfsFolder) dg) + { + int result; + + foreach (folder; folders(true)) + { + VfsFolder x = folder; + if ((result = dg(x)) != 0) + break; + } + return result; + } + + /*********************************************************************** + + Close and/or synchronize changes made to this folder. Each + driver should take advantage of this as appropriate, perhaps + combining multiple files together, or possibly copying to a + remote location + + ***********************************************************************/ + + VfsFolder close (bool commit = true) + { + return this; + } + + /*********************************************************************** + + Sweep owned folders + + ***********************************************************************/ + + private final FileFolder[] folders (bool collect) + { + FileFolder[] folders; + + stats = stats.init; + foreach (info; path) + if (info.folder) + { + if (collect) + folders ~= new FileFolder (FilePath.from (info)); + ++stats.folders; + } + else + { + stats.bytes += info.bytes; + ++stats.files; + } + + return folders; + } + + + /*********************************************************************** + + Sweep owned files + + ***********************************************************************/ + + private final FilePath[] files (ref VfsStats stats, VfsFilter filter = null) + { + FilePath[] files; + + foreach (info; path) + if (info.folder is false) + if (filter is null || filter(cast(VfsInfo) &info)) + { + files ~= FilePath.from (info); + stats.bytes += info.bytes; + ++stats.files; + } + + return files; + } + + /*********************************************************************** + + Throw an exception + + ***********************************************************************/ + + private final char[] error (char[] msg) + { + throw new VfsException (msg); + } + + /*********************************************************************** + + Create or open the given path, and detect path errors + + ***********************************************************************/ + + private final FilePath open (FilePath path, bool create) + { + if (path.exists) + { + if (path.isFolder is false) + error ("FileFolder.open :: path exists but not as a folder: "~path.toString); + } + else + if (create) + path.create; + else + error ("FileFolder.open :: path does not exist: "~path.toString); + return path; + } +} + + +/******************************************************************************* + + Represents a group of files (need this declared here to avoid + a bunch of bizarre compiler warnings) + +*******************************************************************************/ + +class FileGroup : VfsFiles +{ + private FilePath[] group; + private VfsStats stats; + + /*********************************************************************** + + ***********************************************************************/ + + this (FolderGroup host, VfsFilter filter) + { + foreach (folder; host.members) + group ~= folder.files (stats, filter); + } + + /*********************************************************************** + + Iterate over the set of contained VfsFile instances + + ***********************************************************************/ + + final int opApply (int delegate(inout VfsFile) dg) + { + int result; + auto host = new FileHost; + + foreach (file; group) + { + host.path = file; + VfsFile x = host; + if ((result = dg(x)) != 0) + break; + } + return result; + } + + /*********************************************************************** + + Return the total number of entries + + ***********************************************************************/ + + final uint files () + { + return group.length; + } + + /*********************************************************************** + + Return the total size of all files + + ***********************************************************************/ + + final ulong bytes () + { + return stats.bytes; + } +} + + +/******************************************************************************* + + A set of folders representing a selection. This is where file + selection is made, and pattern-matched folder subsets can be + extracted. You need one of these to expose statistics (such as + file or folder count) of a selected folder group + +*******************************************************************************/ + +private class FolderGroup : VfsFolders +{ + private FileFolder[] members; // folders in group + + /*********************************************************************** + + Create a subset group + + ***********************************************************************/ + + private this () {} + + /*********************************************************************** + + Create a folder group including the provided folder and + (optionally) all child folders + + ***********************************************************************/ + + private this (FileFolder root, bool recurse) + { + members = root ~ scan (root, recurse); + } + + /*********************************************************************** + + Iterate over the set of contained VfsFolder instances + + ***********************************************************************/ + + final int opApply (int delegate(inout VfsFolder) dg) + { + int result; + + foreach (folder; members) + { + VfsFolder x = folder; + if ((result = dg(x)) != 0) + break; + } + return result; + } + + /*********************************************************************** + + Return the number of files in this group + + ***********************************************************************/ + + final uint files () + { + uint files; + foreach (folder; members) + files += folder.stats.files; + return files; + } + + /*********************************************************************** + + Return the total size of all files in this group + + ***********************************************************************/ + + final ulong bytes () + { + ulong bytes; + + foreach (folder; members) + bytes += folder.stats.bytes; + return bytes; + } + + /*********************************************************************** + + Return the number of folders in this group + + ***********************************************************************/ + + final uint folders () + { + return members.length; + } + + /*********************************************************************** + + Return the total number of entries in this group + + ***********************************************************************/ + + final uint entries () + { + return files + folders; + } + + /*********************************************************************** + + Return a subset of folders matching the given pattern + + ***********************************************************************/ + + final VfsFolders subset (char[] pattern) + { + auto set = new FolderGroup; + + foreach (folder; members) + if (patternMatch (folder.path.name, pattern)) + set.members ~= folder; + return set; + } + + /*********************************************************************** + + Return a set of files matching the given pattern + + ***********************************************************************/ + + final FileGroup catalog (char[] pattern) + { + bool foo (VfsInfo info) + { + return patternMatch (info.name, pattern); + } + + return catalog (&foo); + } + + /*********************************************************************** + + Returns a set of files conforming to the given filter + + ***********************************************************************/ + + final FileGroup catalog (VfsFilter filter = null) + { + return new FileGroup (this, filter); + } + + /*********************************************************************** + + Internal routine to traverse the folder tree + + ***********************************************************************/ + + private final FileFolder[] scan (FileFolder root, bool recurse) + { + auto folders = root.folders (recurse); + if (recurse) + foreach (child; folders) + folders ~= scan (child, recurse); + return folders; + } +} + + +/******************************************************************************* + + A host for folders, currently used to harbor create() and open() + methods only + +*******************************************************************************/ + +private class FolderHost : VfsFolderEntry +{ + private char[] path; + private FileFolder parent; + + /*********************************************************************** + + ***********************************************************************/ + + private this (FileFolder parent, char[] path) + { + this.path = path; + this.parent = parent; + } + + /*********************************************************************** + + ***********************************************************************/ + + final VfsFolder create () + { + return new FileFolder (parent, path, true); + } + + /*********************************************************************** + + ***********************************************************************/ + + final VfsFolder open () + { + return new FileFolder (parent, path, false); + } + + /*********************************************************************** + + Test to see if a folder exists + + ***********************************************************************/ + + bool exists () + { + try { + open(); + return true; + } catch (IOException x) {} + return false; + } +} + + +/******************************************************************************* + + Represents things you can do with a file + +*******************************************************************************/ + +private class FileHost : VfsFile +{ + private FilePath path; + + /*********************************************************************** + + ***********************************************************************/ + + private this (char[] path = null) + { + this.path = FilePath (path); + } + + /*********************************************************************** + + Return a short name + + ***********************************************************************/ + + final char[] name() + { + return path.file; + } + + /*********************************************************************** + + Return a long name + + ***********************************************************************/ + + final char[] toString () + { + return path.toString; + } + + /*********************************************************************** + + Does this file exist? + + ***********************************************************************/ + + final bool exists() + { + return path.exists; + } + + /*********************************************************************** + + Return the file size + + ***********************************************************************/ + + final ulong size() + { + return path.fileSize; + } + + /*********************************************************************** + + Create a new file instance + + ***********************************************************************/ + + final VfsFile create () + { + path.createFile (); + return this; + } + + /*********************************************************************** + + Create a new file instance and populate with stream + + ***********************************************************************/ + + final VfsFile create (InputStream input) + { + create.output.copy(input).close; + return this; + } + + /*********************************************************************** + + Create and copy the given source + + ***********************************************************************/ + + VfsFile copy (VfsFile source) + { + auto input = source.input; + scope (exit) input.close; + return create (input); + } + + /*********************************************************************** + + Create and copy the given source, and remove the source + + ***********************************************************************/ + + final VfsFile move (VfsFile source) + { + copy (source); + source.remove; + return this; + } + + /*********************************************************************** + + Return the input stream. Don't forget to close it + + ***********************************************************************/ + + final InputStream input () + { + return new FileConduit (path.dup); + } + + /*********************************************************************** + + Return the output stream. Don't forget to close it + + ***********************************************************************/ + + final OutputStream output () + { + return new FileConduit (path.dup, FileConduit.WriteExisting); + } + + /*********************************************************************** + + Remove this file + + ***********************************************************************/ + + final VfsFile remove () + { + path.remove; + return this; + } + + /*********************************************************************** + + Duplicate this entry + + ***********************************************************************/ + + final VfsFile dup() + { + return new FileHost (path.toString); + } + + /*********************************************************************** + + ***********************************************************************/ + + private VfsFile set (char[] folder, char[] name) + { + path.set(folder).append(name); + return this; + } +} + + +debug (FileFolder) +{ + +/******************************************************************************* + +*******************************************************************************/ + +import tango.io.Stdout; +import tango.io.Buffer; + +void main() +{ + auto root = new FileFolder ("d:/d/import/temp", true); + root.folder("test").create; + root.file("test.txt").create(new Buffer("hello")); + Stdout.formatln ("test.txt.length = {}", root.file("test.txt").size); + + root = new FileFolder ("c:/"); + + auto set = root.self; + + Stdout.formatln ("self.files = {}", set.files); + Stdout.formatln ("self.bytes = {}", set.bytes); + Stdout.formatln ("self.folders = {}", set.folders); + Stdout.formatln ("self.entries = {}", set.entries); + + set = root.tree; + Stdout.formatln ("tree.files = {}", set.files); + Stdout.formatln ("tree.bytes = {}", set.bytes); + Stdout.formatln ("tree.folders = {}", set.folders); + Stdout.formatln ("tree.entries = {}", set.entries); + + //foreach (folder; set) + // Stdout.formatln ("tree.folder '{}' has {} files", folder.name, folder.self.files); + + auto cat = set.catalog ("s*"); + Stdout.formatln ("cat.files = {}", cat.files); + Stdout.formatln ("cat.bytes = {}", cat.bytes); + //foreach (file; cat) + // Stdout.formatln ("cat.name '{}' '{}'", file.name, file.toString); +} +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/vfs/LinkedFolder.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/vfs/LinkedFolder.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,165 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Oct 2007: Initial version + + author: Kris + +*******************************************************************************/ + +module tango.io.vfs.LinkedFolder; + +private import tango.io.vfs.model.Vfs; + +private import tango.core.Exception; + +private import tango.io.vfs.VirtualFolder; + +/******************************************************************************* + + LinkedFolder is derived from VirtualFolder, and behaves exactly the + same in all but one aspect: it treats mounted folders as an ordered + list of alternatives to look for a file. This supports the notion of + file 'overrides', whereby "customized" files can be inserted into a + chain of alternatives. + + (overridden folders are not currently supported) + +*******************************************************************************/ + + +class LinkedFolder : VirtualFolder +{ + private Link* head; + + /*********************************************************************** + + Linked-list of folders + + ***********************************************************************/ + + private struct Link + { + Link* next; + VfsFolder folder; + + static Link* opCall(VfsFolder folder) + { + auto p = new Link; + p.folder = folder; + return p; + } + } + + /*********************************************************************** + + All folder must have a name. No '.' or '/' chars are + permitted + + ***********************************************************************/ + + this (char[] name) + { + super (name); + } + + /*********************************************************************** + + Add a child folder. The child cannot 'overlap' with others + in the tree of the same type. Circular references across a + tree of virtual folders are detected and trapped. + + We add the new child at the end of an ordered list, which + we subsequently traverse when looking up a file + + The second argument represents an optional name that the + mount should be known as, instead of the name exposed by + the provided folder (it is not an alias). + + ***********************************************************************/ + + final VfsHost mount (VfsFolder folder, char[] name=null) + { + // traverse to the end of the list + auto link = &head; + while (*link) + link = &(*link).next; + + // hook up the new folder + *link = Link (folder); + + // and let superclass deal with it + return super.mount (folder, name); + } + + /*********************************************************************** + + TODO: unhook a child folder. + + ***********************************************************************/ + + final VfsHost dismount (VfsFolder folder) + { + assert (0, "LinkedFolder.dismount not implemented"); + } + + /*********************************************************************** + + Return a file representation of the given path. If the + path-head does not refer to an immediate child folder, + and does not match a symbolic link, it is considered to + be unknown. + + We scan the set of mounted folders, in the order mounted, + looking for a match. Where one is found, we test to see + that it really exists before returning the reference + + ***********************************************************************/ + + final override VfsFile file (char[] path) + { + auto link = head; + while (link) + { + //Stdout.formatln ("looking in {}", link.folder.toString); + try { + auto file = link.folder.file (path); + if (file.exists) + return file; + } catch (VfsException x) {} + link = link.next; + } + super.error ("file '"~path~"' not found"); + return null; + } +} + + +debug (LinkedFolder) +{ +/******************************************************************************* + +*******************************************************************************/ + +import tango.io.Stdout; +import tango.io.Buffer; +import tango.io.vfs.FileFolder; + +void main() +{ + auto root = new LinkedFolder ("root"); + auto sub = new VirtualFolder ("sub"); + sub.mount (new FileFolder (r"d:/d/import/temp")); + sub.map (sub.file(r"temp/subtree/test.txt"), "wumpus"); + + root.mount (new FileFolder (r"d:/d/import/tango")) + .mount (new FileFolder (r"c:/"), "windows"); + root.mount (sub); + + auto file = root.file (r"wumpus"); + Stdout.formatln ("file = {}", file); +} +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/vfs/VirtualFolder.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/vfs/VirtualFolder.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,633 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Oct 2007: Initial version + + author: Kris + +*******************************************************************************/ + +module tango.io.vfs.VirtualFolder; + +private import tango.io.FileConst; + +private import tango.util.PathUtil; + +private import tango.core.Exception; + +private import tango.io.vfs.model.Vfs; + +private import tango.text.Util : head, locatePrior; + +/******************************************************************************* + + Virtual folders play host to other folder types, including both + concrete folder instances and subordinate virtual folders. You + can build a (singly rooted) tree from a set of virtual and non- + virtual folders, and treat them as though they were a combined + or single entity. For example, listing the contents of such a + tree is no different than listing the contents of a non-virtual + tree - there's just potentially more nodes to traverse. + +*******************************************************************************/ + +class VirtualFolder : VfsHost +{ + private char[] name_; + private VfsFile[char[]] files; + private VfsFolder[char[]] mounts; + private VfsFolderEntry[char[]] folders; + private VirtualFolder parent; + + /*********************************************************************** + + All folder must have a name. No '.' or '/' chars are + permitted + + ***********************************************************************/ + + this (char[] name) + { + validate (this.name_ = name); + } + + /*********************************************************************** + + Return the (short) name of this folder + + ***********************************************************************/ + + final char[] name() + { + return name_; + } + + /*********************************************************************** + + Return the (long) name of this folder. Virtual folders + do not have long names, since they don't relate directly + to a concrete folder instance + + ***********************************************************************/ + + final char[] toString() + { + return name; + } + + /*********************************************************************** + + Add a child folder. The child cannot 'overlap' with others + in the tree of the same type. Circular references across a + tree of virtual folders are detected and trapped. + + The second argument represents an optional name that the + mount should be known as, instead of the name exposed by + the provided folder (it is not an alias). + + ***********************************************************************/ + + VfsHost mount (VfsFolder folder, char[] name = null) + { + assert (folder); + if (name.length is 0) + name = folder.name; + + // link virtual children to us + auto child = cast(VirtualFolder) folder; + if (child) + if (child.parent) + error ("folder '"~name~"' belongs to another host"); + else + child.parent = this; + + // reach up to the root, and initiate tree sweep + auto root = this; + while (root.parent) + if (root is this) + error ("circular reference detected at '"~this.name~"' while mounting '"~name~"'"); + else + root = root.parent; + root.verify (folder, true); + + // all clear, so add the new folder + mounts [name] = folder; + return this; + } + + /*********************************************************************** + + Add a set of child folders. The children cannot 'overlap' + with others in the tree of the same type. Circular references + are detected and trapped. + + ***********************************************************************/ + + VfsHost mount (VfsFolders group) + { + foreach (folder; group) + mount (folder); + return this; + } + + /*********************************************************************** + + Unhook a child folder + + ***********************************************************************/ + + VfsHost dismount (VfsFolder folder) + { + char[] name = null; + + // check this is a child, and locate the mapped name + foreach (key, value; mounts) + if (folder is value) + name = key; + assert (name.ptr); + + // reach up to the root, and initiate tree sweep + auto root = this; + while (root.parent) + root = root.parent; + root.verify (folder, false); + + // all clear, so remove it + mounts.remove (name); + return this; + } + + /*********************************************************************** + + Add a symbolic link to another file. These are referenced + by file() alone, and do not show up in tree traversals + + ***********************************************************************/ + + final VfsHost map (VfsFile file, char[] name) + { + assert (name); + files[name] = file; + return this; + } + + /*********************************************************************** + + Add a symbolic link to another folder. These are referenced + by folder() alone, and do not show up in tree traversals + + ***********************************************************************/ + + final VfsHost map (VfsFolderEntry folder, char[] name) + { + assert (name); + folders[name] = folder; + return this; + } + + /*********************************************************************** + + Iterate over the set of immediate child folders. This is + useful for reflecting the hierarchy + + ***********************************************************************/ + + final int opApply (int delegate(inout VfsFolder) dg) + { + int result; + + foreach (folder; mounts) + { + VfsFolder x = folder; + if ((result = dg(x)) != 0) + break; + } + return result; + } + + /*********************************************************************** + + Return a folder representation of the given path. If the + path-head does not refer to an immediate child, and does + not match a symbolic link, it is considered unknown. + + ***********************************************************************/ + + final VfsFolderEntry folder (char[] path) + { + char[] tail; + auto text = head (path, FileConst.PathSeparatorString, tail); + + auto child = text in mounts; + if (child) + return child.folder (tail); + + auto sym = text in folders; + if (sym is null) + error ("'"~text~"' is not a recognized member of '"~name~"'"); + return *sym; + } + + /*********************************************************************** + + Return a file representation of the given path. If the + path-head does not refer to an immediate child folder, + and does not match a symbolic link, it is considered unknown. + + ***********************************************************************/ + + VfsFile file (char[] path) + { + auto tail = locatePrior (path, FileConst.PathSeparatorChar); + if (tail < path.length) + return folder(path[0..tail]).open.file(path[tail..$]); + + auto sym = path in files; + if (sym is null) + error ("'"~path~"' is not a recognized member of '"~name~"'"); + return *sym; + } + + /*********************************************************************** + + Clear the entire subtree. Use with caution + + ***********************************************************************/ + + final VfsFolder clear () + { + foreach (name, child; mounts) + child.clear; + return this; + } + + /*********************************************************************** + + Returns true if all of the children are writable + + ***********************************************************************/ + + final bool writable () + { + foreach (name, child; mounts) + if (! child.writable) + return false; + return true; + } + + /*********************************************************************** + + Returns a folder set containing only this one. Statistics + are inclusive of entries within this folder only, which + should be zero since symbolic links are not included + + ***********************************************************************/ + + final VfsFolders self () + { + return new VirtualFolders (this, false); + } + + /*********************************************************************** + + Returns a subtree of folders. Statistics are inclusive of + all files and folders throughout the sub-tree + + ***********************************************************************/ + + final VfsFolders tree () + { + return new VirtualFolders (this, true); + } + + /*********************************************************************** + + Sweep the subtree of mountpoints, testing a new folder + against all others. This propogates a folder test down + throughout the tree, where each folder implementation + should take appropriate action + + ***********************************************************************/ + + final void verify (VfsFolder folder, bool mounting) + { + foreach (name, child; mounts) + child.verify (folder, mounting); + } + + /*********************************************************************** + + Close and/or synchronize changes made to this folder. Each + driver should take advantage of this as appropriate, perhaps + combining multiple files together, or possibly copying to a + remote location + + ***********************************************************************/ + + VfsFolder close (bool commit = true) + { + foreach (name, child; mounts) + child.close (commit); + return this; + } + + /*********************************************************************** + + Throw an exception + + ***********************************************************************/ + + package final char[] error (char[] msg) + { + throw new VfsException (msg); + } + + /*********************************************************************** + + Validate path names + + ***********************************************************************/ + + private final void validate (char[] name) + { + assert (name); + if (locatePrior(name, '.') != name.length || + locatePrior(name, FileConst.PathSeparatorChar) != name.length) + error ("'"~name~"' contains invalid characters"); + } +} + + +/******************************************************************************* + + A set of virtual folders. For a sub-tree, we compose the results + of all our subordinates and delegate subsequent request to that + group. + +*******************************************************************************/ + +private class VirtualFolders : VfsFolders +{ + private VfsFolders[] members; // folders in group + + /*********************************************************************** + + Create a subset group + + ***********************************************************************/ + + private this () {} + + /*********************************************************************** + + Create a folder group including the provided folder and + (optionally) all child folders + + ***********************************************************************/ + + private this (VirtualFolder root, bool recurse) + { + if (recurse) + foreach (name, folder; root.mounts) + members ~= folder.tree; + } + + /*********************************************************************** + + Iterate over the set of contained VfsFolder instances + + ***********************************************************************/ + + final int opApply (int delegate(inout VfsFolder) dg) + { + int ret; + + foreach (group; members) + foreach (folder; group) + { + auto x = cast(VfsFolder) folder; + if ((ret = dg(x)) != 0) + break; + } + return ret; + } + + /*********************************************************************** + + Return the number of files in this group + + ***********************************************************************/ + + final uint files () + { + uint files; + foreach (group; members) + files += group.files; + return files; + } + + /*********************************************************************** + + Return the total size of all files in this group + + ***********************************************************************/ + + final ulong bytes () + { + ulong bytes; + foreach (group; members) + bytes += group.bytes; + return bytes; + } + + /*********************************************************************** + + Return the number of folders in this group + + ***********************************************************************/ + + final uint folders () + { + uint count; + foreach (group; members) + count += group.folders; + return count; + } + + /*********************************************************************** + + Return the total number of entries in this group + + ***********************************************************************/ + + final uint entries () + { + uint count; + foreach (group; members) + count += group.entries; + return count; + } + + /*********************************************************************** + + Return a subset of folders matching the given pattern + + ***********************************************************************/ + + final VfsFolders subset (char[] pattern) + { + auto set = new VirtualFolders; + + foreach (group; members) + set.members ~= group.subset (pattern); + return set; + } + + /*********************************************************************** + + Return a set of files matching the given pattern + + ***********************************************************************/ + + final VfsFiles catalog (char[] pattern) + { + return catalog ((VfsInfo info){return patternMatch (info.name, pattern);}); + } + + /*********************************************************************** + + Returns a set of files conforming to the given filter + + ***********************************************************************/ + + final VfsFiles catalog (VfsFilter filter = null) + { + return new VirtualFiles (this, filter); + } +} + + +/******************************************************************************* + + A set of virtual files, represented by composing the results of + the given set of folders. Subsequent calls are delegated to the + results from those folders + +*******************************************************************************/ + +private class VirtualFiles : VfsFiles +{ + private VfsFiles[] members; + + /*********************************************************************** + + ***********************************************************************/ + + private this (VirtualFolders host, VfsFilter filter) + { + foreach (group; host.members) + members ~= group.catalog (filter); + } + + /*********************************************************************** + + Iterate over the set of contained VfsFile instances + + ***********************************************************************/ + + final int opApply (int delegate(inout VfsFile) dg) + { + int ret; + + foreach (group; members) + foreach (file; group) + if ((ret = dg(file)) != 0) + break; + return ret; + } + + /*********************************************************************** + + Return the total number of entries + + ***********************************************************************/ + + final uint files () + { + uint count; + foreach (group; members) + count += group.files; + return count; + } + + /*********************************************************************** + + Return the total size of all files + + ***********************************************************************/ + + final ulong bytes () + { + ulong count; + foreach (group; members) + count += group.bytes; + return count; + } +} + + +debug (VirtualFolder) +{ +/******************************************************************************* + +*******************************************************************************/ + +import tango.io.Stdout; +import tango.io.Buffer; +import tango.io.vfs.FileFolder; + +void main() +{ + auto root = new VirtualFolder ("root"); + auto sub = new VirtualFolder ("sub"); + sub.mount (new FileFolder (r"d:/d/import/tango")); + + root.mount (sub) + .mount (new FileFolder (r"c:/"), "windows") + .mount (new FileFolder (r"d:/d/import/temp")); + + auto folder = root.folder (r"temp/bar"); + Stdout.formatln ("folder = {}", folder); + + root.map (root.folder(r"temp/subtree"), "fsym") + .map (root.file(r"temp/subtree/test.txt"), "wumpus"); + auto file = root.file (r"wumpus"); + Stdout.formatln ("file = {}", file); + Stdout.formatln ("fsym = {}", root.folder(r"fsym").open.file("test.txt")); + + foreach (folder; root.folder(r"temp/subtree").open) + Stdout.formatln ("folder.child '{}'", folder.name); + + auto set = root.self; + Stdout.formatln ("self.files = {}", set.files); + Stdout.formatln ("self.bytes = {}", set.bytes); + Stdout.formatln ("self.folders = {}", set.folders); + + set = root.folder("temp").open.tree; + Stdout.formatln ("tree.files = {}", set.files); + Stdout.formatln ("tree.bytes = {}", set.bytes); + Stdout.formatln ("tree.folders = {}", set.folders); + + foreach (folder; set) + Stdout.formatln ("tree.folder '{}' has {} files", folder.name, folder.self.files); + + auto cat = set.catalog ("*.txt"); + Stdout.formatln ("cat.files = {}", cat.files); + Stdout.formatln ("cat.bytes = {}", cat.bytes); + foreach (file; cat) + Stdout.formatln ("cat.name '{}' '{}'", file.name, file.toString); +} +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/vfs/ZipArchive.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/vfs/ZipArchive.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,2099 @@ +/******************************************************************************* + + copyright: Copyright © 2007 Daniel Keep. All rights reserved. + + license: BSD style: $(LICENSE) + + version: Initial release: December 2007 + + author: Daniel Keep + +*******************************************************************************/ + +module tango.io.vfs.ZipArchive; + +import tango.io.FileConduit : FileConduit; +import tango.io.FilePath : FilePath; +import tango.io.TempFile : TempFile; +import tango.io.archive.Zip : ZipReader, ZipBlockReader, + ZipWriter, ZipBlockWriter, ZipEntry, ZipEntryInfo, Method; +import tango.io.model.IConduit : IConduit, InputStream, OutputStream; +import tango.io.vfs.model.Vfs : VfsFolder, VfsFolderEntry, VfsFile, + VfsFolders, VfsFiles, VfsFilter, VfsStats, VfsFilterInfo, + VfsInfo, VfsSync; +import tango.util.PathUtil : patternMatch; + +debug( ZipArchive ) +{ + import tango.io.Stdout : Stderr; +} + +// This disables code that is causing heap corruption in Tango 0.99.3 +version = Bug_HeapCorruption; + +// ************************************************************************ // +// ************************************************************************ // + +private +{ + enum EntryType { Dir, File } + + /* + * Entries are what make up the internal tree that describes the + * filesystem of the archive. Each Entry is either a directory or a file. + */ + struct Entry + { + EntryType type; + + union + { + DirEntry dir; + FileEntry file; + } + + char[] fullname; + char[] name; + + /+ + invariant + { + assert( (type == EntryType.Dir) + || (type == EntryType.File) ); + + assert( fullname.nz() ); + assert( name.nz() ); + } + +/ + + VfsFilterInfo vfsFilterInfo; + + VfsInfo vfsInfo() + { + return &vfsFilterInfo; + } + + /* + * Updates the VfsInfo structure for this entry. + */ + void makeVfsInfo() + { + with( vfsFilterInfo ) + { + // Cheat horribly here + name = this.name; + path = this.fullname[0..($-name.length+"/".length)]; + + folder = isDir; + bytes = folder ? 0 : fileSize; + } + } + + bool isDir() + { + return (type == EntryType.Dir); + } + + bool isFile() + { + return (type == EntryType.File); + } + + ulong fileSize() + in + { + assert( type == EntryType.File ); + } + body + { + if( file.zipEntry !is null ) + return file.zipEntry.size; + + else if( file.tempFile !is null ) + return file.tempFile.length; + + else + return 0; + } + + /* + * Opens a File Entry for reading. + * + * BUG: Currently, if a user opens a new or unmodified file for input, + * and then opens it for output, the two streams will be working with + * different underlying conduits. This means that the result of + * openInput should probably be wrapped in some kind of switching + * stream that can update when the backing store for the file changes. + */ + InputStream openInput() + in + { + assert( type == EntryType.File ); + } + body + { + if( file.zipEntry !is null ) + { + file.zipEntry.verify; + return file.zipEntry.open; + } + else if( file.tempFile !is null ) + return new WrapSeekInputStream(file.tempFile.input, 0); + + else + return new DummyInputStream; + } + + /* + * Opens a file entry for output. + */ + OutputStream openOutput() + in + { + assert( type == EntryType.File ); + } + body + { + if( file.tempFile !is null ) + return new WrapSeekOutputStream(file.tempFile.output); + + else + { + // Ok; we need to make a temporary file to store output in. + // If we already have a zip entry, we need to dump that into + // the temp. file and remove the zipEntry. + if( file.zipEntry !is null ) + { + { + scope zi = file.zipEntry.open; + scope(exit) zi.close; + + file.tempFile = new TempFile; + file.tempFile.output.copy(zi).close; + + debug( ZipArchive ) + Stderr.formatln("Entry.openOutput: duplicated" + " temp file {} for {}", + file.tempFile, this.fullname); + } + + // TODO: Copy file info if available + + file.zipEntry = null; + } + else + { + // Otherwise, just make a new, blank temp file + file.tempFile = new TempFile; + + debug( ZipArchive ) + Stderr.formatln("Entry.openOutput: created" + " temp file {} for {}", + file.tempFile, this.fullname); + } + + assert( file.tempFile !is null ); + return openOutput; + } + } + + void dispose() + { + fullname = name = null; + + with( vfsFilterInfo ) + { + name = path = null; + } + + dispose_children; + } + + void dispose_children() + { + switch( type ) + { + case EntryType.Dir: + auto keys = dir.children.keys; + scope(exit) delete keys; + foreach( k ; keys ) + { + auto child = dir.children[k]; + child.dispose(); + dir.children.remove(k); + delete child; + } + dir.children = dir.children.init; + break; + + case EntryType.File: + if( file.zipEntry !is null ) + { + // Don't really need to do anything here + file.zipEntry = null; + } + else if( file.tempFile !is null ) + { + // Detatch to destroy the physical file itself + file.tempFile.detach(); + file.tempFile = null; + } + break; + + debug( ZipArchive ) + { + default: + Stderr.formatln( + "Entry.dispose_children: unknown type {}", + type); + assert(false); + } + } + } + } + + struct DirEntry + { + Entry*[char[]] children; + } + + struct FileEntry + { + ZipEntry zipEntry; + TempFile tempFile; + + invariant + { + auto zn = zipEntry is null; + auto tn = tempFile is null; + assert( (zn && tn) + /* zn xor tn */ || (!(zn&&tn)&&(zn||tn)) ); + } + } +} + +// ************************************************************************ // +// ************************************************************************ // + +/** + * ZipArchive serves as the root object for all Zip archives in the VFS. + * Presently, it can only open archives on the local filesystem. + */ +class ZipArchive : ZipFolder +{ + /** + * Opens an archive from the local filesystem. If the readonly argument + * is specified as true, then modification of the archive will be + * explicitly disallowed. + */ + this(char[] path, bool readonly=false) + out { assert( valid ); } + body + { + debug( ZipArchive ) + Stderr.formatln(`ZipArchive("{}", {})`, path, readonly); + this(FilePath(path), readonly); + } + + /// ditto + this(FilePath path, bool readonly=false) + out { assert( valid ); } + body + { + debug( ZipArchive ) + Stderr.formatln(`ZipArchive("{}", {})`, path, readonly); + this.resetArchive(path, readonly); + super(this, root); + } + + /** + * Closes the archive, and releases all internal resources. If the commit + * argument is true (the default), then changes to the archive will be + * flushed out to disk. If false, changes will simply be discarded. + */ + final override VfsFolder close(bool commit = true) + in { assert( valid ); } + body + { + debug( ZipArchive ) + Stderr.formatln("ZipArchive.close({})",commit); + + // MUTATE + if( commit ) sync; + + // Close ZipReader + if( zr !is null ) + { + zr.close(); + delete zr; + } + + // Destroy entries + root.dispose(); + version( Bug_HeapCorruption ) + root = null; + else + delete root; + + return this; + } + + /** + * Flushes all changes to the archive out to disk. + */ + final override VfsFolder sync() + in { assert( valid ); } + out + { + assert( valid ); + assert( !modified ); + } + body + { + debug( ZipArchive ) + Stderr("ZipArchive.sync()").newline; + + if( !modified ) + return this; + +version( ZipArchive_NonMutating ) +{ + mutate_error("ZipArchive.sync"); + assert(false); +} +else +{ + enforce_mutable; + + // First, we need to determine if we have any zip entries. If we + // don't, then we can write directly to the path. If there *are* + // zip entries, then we'll need to write to a temporary path instead. + OutputStream os; + TempFile tempFile; + scope(exit) if( tempFile !is null ) delete tempFile; + + foreach( file ; this.tree.catalog ) + { + if( auto zf = cast(ZipFile) file ) + if( zf.entry.file.zipEntry !is null ) + { + tempFile = new TempFile(path.path, TempFile.Permanent); + os = tempFile.output; + debug( ZipArchive ) + Stderr.formatln(" sync: created temp file {}", + tempFile.path); + break; + } + } + + if( tempFile is null ) + { + // Kill the current zip reader so we can re-open the file it's + // using. + if( zr !is null ) + { + zr.close; + delete zr; + } + + os = new FileConduit(path, FileConduit.WriteCreate); + } + + // Now, we can create the archive. + { + scope zw = new ZipBlockWriter(os); + foreach( file ; this.tree.catalog ) + { + auto zei = ZipEntryInfo(file.toString[1..$]); + // BUG: Passthru doesn't maintain compression for some + // reason... + if( auto zf = cast(ZipFile) file ) + { + if( zf.entry.file.zipEntry !is null ) + zw.putEntry(zei, zf.entry.file.zipEntry); + else + zw.putStream(zei, file.input); + } + else + zw.putStream(zei, file.input); + } + zw.finish; + } + + // With that done, we can free all our handles, etc. + debug( ZipArchive ) + Stderr(" sync: close").newline; + this.close(/*commit*/ false); + os.close; + + // If we wrote the archive into a temporary file, move that over the + // top of the old archive. + if( tempFile !is null ) + { + debug( ZipArchive ) + Stderr(" sync: destroying temp file").newline; + auto tempFilePath = tempFile.path.dup; + delete tempFile; + debug( ZipArchive ) + Stderr.formatln(" sync: renaming {} to {}", + tempFilePath, path); + tempFilePath.rename(path); + } + + // Finally, re-open the archive so that we have all the nicely + // compressed files. + debug( ZipArchive ) + Stderr(" sync: reset archive").newline; + this.resetArchive(path, readonly); + + debug( ZipArchive ) + Stderr(" sync: reset folder").newline; + this.reset(this, root); + + debug( ZipArchive ) + Stderr(" sync: done").newline; + + return this; +} + } + + /** + * Indicates whether the archive was opened for read-only access. Note + * that in addition to the readonly constructor flag, this is also + * influenced by whether the file itself is read-only or not. + */ + final bool readonly() { return _readonly; } + + /** + * Allows you to read and specify the path to the archive. The effect of + * setting this is to change where the archive will be written to when + * flushed to disk. + */ + final FilePath path() { return _path; } + final FilePath path(FilePath v) { return _path = v; } /// ditto + +private: + ZipReader zr; + Entry* root; + FilePath _path; + bool _readonly; + bool modified = false; + + final bool readonly(bool v) { return _readonly = v; } + + final bool closed() + { + debug( ZipArchive ) + Stderr("ZipArchive.closed()").newline; + return (root is null); + } + + final bool valid() + { + debug( ZipArchive ) + Stderr("ZipArchive.valid()").newline; + return !closed; + } + + final OutputStream mutateStream(OutputStream source) + { + return new EventSeekOutputStream(source, + EventSeekOutputStream.Callbacks( + null, + null, + &mutate_write, + null)); + } + + void mutate_write(uint bytes, void[] src) + { + if( !(bytes == 0 || bytes == IConduit.Eof) ) + this.modified = true; + } + + void resetArchive(FilePath path, bool readonly=false) + out { assert( valid ); } + body + { + debug( ZipArchive ) + Stderr.formatln(`ZipArchive.resetArchive("{}", {})`, path, readonly); + + debug( ZipArchive ) + Stderr.formatln(" .. size of Entry: {0}, {0:x} bytes", Entry.sizeof); + + this.path = path; + this.readonly = readonly & !path.isWritable; + + zr = new ZipBlockReader(path.toString); + + // First, create a root entry + root = new Entry; + root.type = EntryType.Dir; + root.fullname = root.name = "/"; + + // Parse the contents of the archive + foreach( zipEntry ; zr ) + { + // Normalise name + auto name = FilePath(zipEntry.info.name).standard.toString; + + // If the last character is '/', treat as a directory and skip + // TODO: is there a better way of detecting this? + if( name[$-1] == '/' ) + continue; + + // Now, we need to locate the right spot to insert this entry. + { + // That's CURrent ENTity, not current OR currant... + Entry* curent = root; + char[] h,t; + headTail(name,h,t); + while( t.nz() ) + { + assert( curent.isDir ); + if( auto nextent = (h in curent.dir.children) ) + curent = *nextent; + + else + { + // Create new directory entry + Entry* dirent = new Entry; + dirent.type = EntryType.Dir; + if( curent.fullname != "/" ) + dirent.fullname = curent.fullname ~ "/" ~ h; + else + dirent.fullname = "/" ~ h; + dirent.name = dirent.fullname[$-h.length..$]; + + // Insert into current entry + curent.dir.children[dirent.name] = dirent; + + // Make it the new current entry + curent = dirent; + } + + headTail(t,h,t); + } + + // Getting here means that t is empty, which means the final + // component of the path--the file name--is in h. The entry + // of the containing directory is in curent. + + // Make sure the file isn't already there (you never know!) + assert( !(h in curent.dir.children) ); + + // Create a new file entry for it. + { + // BUG: Bug_HeapCorruption + // with ZipTest, on the resetArchive operation, on + // the second time through this next line, it erroneously + // allocates filent 16 bytes lower than curent. Entry + // is *way* larger than 16 bytes, and this causes it to + // zero-out the existing root element, which leads to + // segfaults later on at line +12: + // + // // Insert + // curent.dir.children[filent.name] = filent; + + Entry* filent = new Entry; + filent.type = EntryType.File; + if( curent.fullname != "/" ) + filent.fullname = curent.fullname ~ "/" ~ h; + else + filent.fullname = "/" ~ h; + filent.name = filent.fullname[$-h.length..$]; + filent.file.zipEntry = zipEntry.dup; + + filent.makeVfsInfo; + + // Insert + curent.dir.children[filent.name] = filent; + } + } + } + + // Make sure the modified flag is set appropriately + modified = false; + } +} + +// ************************************************************************ // +// ************************************************************************ // + +/** + * This class represents a folder in an archive. In addition to supporting + * the sync operation, you can also use the archive member to get a reference + * to the underlying ZipArchive instance. + */ +class ZipFolder : VfsFolder, VfsSync +{ + /// + final override char[] name() + in { assert( valid ); } + body + { + return entry.name; + } + + /// + final override char[] toString() + in { assert( valid ); } + body + { + return entry.fullname; + } + + /// + final override VfsFile file(char[] path) + in + { + assert( valid ); + assert( !FilePath(path).isAbsolute ); + } + body + { + auto fp = FilePath(path); + auto dir = fp.path; + auto name = fp.file; + + // If the file is in another directory, then we need to look up that + // up first. + if( dir.nz() ) + { + scope dir_ent = this.folder(dir); + scope dir_obj = dir_ent.open; + return dir_obj.file(name); + } + else + { + // Otherwise, we need to check and see whether the file is in our + // entry list. + if( auto file_entry = (name in this.entry.dir.children) ) + { + // It is; create a new object for it. + return new ZipFile(archive, this.entry, *file_entry); + } + else + { + // Oh dear... return a holding object. + return new ZipFile(archive, this.entry, name); + } + } + } + + /// + final override VfsFolderEntry folder(char[] path) + in + { + assert( valid ); + assert( !FilePath(path).isAbsolute ); + } + body + { + // Locate the folder in question. We do this by "walking" the + // path components. If we find a component that doesn't exist, + // then we create a ZipFolderEntry for the remainder. + Entry* curent = this.entry; + + // h is the "head" of the path, t is the remainder. ht is both + // joined together. + char[] h,t,ht; + ht = path; + + do + { + // Split ht at the first path separator. + assert( ht.nz() ); + headTail(ht,h,t); + + // Look for a pre-existing subentry + auto subent = (h in curent.dir.children); + if( t.nz() && !!subent ) + { + // Move to the subentry, and split the tail on the next + // iteration. + curent = *subent; + ht = t; + } + else + // If the next component doesn't exist, return a folder entry. + // If the tail is empty, return a folder entry as well (let + // the ZipFolderEntry do the last lookup.) + return new ZipFolderEntry(archive, curent, ht); + } + while( true ); + } + + /// + final override VfsFolders self() + in { assert( valid ); } + body + { + return new ZipFolderGroup(archive, this, false); + } + + /// + final override VfsFolders tree() + in { assert( valid ); } + body + { + return new ZipFolderGroup(archive, this, true); + } + + /// + final override int opApply(int delegate(ref VfsFolder) dg) + in { assert( valid ); } + body + { + int result = 0; + + foreach( _,childEntry ; this.entry.dir.children ) + { + if( childEntry.isDir ) + { + VfsFolder childFolder = new ZipFolder(archive, childEntry); + if( (result = dg(childFolder)) != 0 ) + break; + } + } + + return result; + } + + /// + final override VfsFolder clear() + in { assert( valid ); } + body + { +version( ZipArchive_NonMutating ) +{ + mutate_error("VfsFolder.clear"); + assert(false); +} +else +{ + // MUTATE + enforce_mutable; + + // Disposing of the underlying entry subtree should do our job for us. + entry.dispose_children; + mutate; + return this; +} + } + + /// + final override bool writable() + in { assert( valid ); } + body + { + return !archive.readonly; + } + + /** + * Closes this folder object. If commit is true, then the folder is + * sync'ed before being closed. + */ + override VfsFolder close(bool commit = true) + in { assert( valid ); } + body + { + // MUTATE + if( commit ) sync; + + // Just clean up our pointers + archive = null; + entry = null; + return this; + } + + /** + * This will flush any changes to the archive to disk. Note that this + * applies to the entire archive, not just this folder and its contents. + */ + override VfsFolder sync() + in { assert( valid ); } + body + { + // MUTATE + archive.sync; + return this; + } + + /// + final override void verify(VfsFolder folder, bool mounting) + in { assert( valid ); } + body + { + auto zipfolder = cast(ZipFolder) folder; + + if( mounting + && zipfolder !is null + && zipfolder.archive is archive ) + { + auto src = this.toString; + auto dst = zipfolder.toString; + + auto len = src.length > dst.length ? dst.length : src.length; + + if( src[0..len] == dst[0..len] ) + error(`folders "`~dst~`" and "`~src~`" in archive "` + ~archive.path.toString~`" overlap`); + } + } + + /** + * Returns a reference to the underlying ZipArchive instance. + */ + final ZipArchive archive() { return _archive; } + +private: + ZipArchive _archive; + Entry* entry; + VfsStats stats; + + final ZipArchive archive(ZipArchive v) { return _archive = v; } + + this(ZipArchive archive, Entry* entry) + { + this.reset(archive, entry); + } + + final void reset(ZipArchive archive, Entry* entry) + in + { + assert( archive !is null ); + assert( entry.isDir ); + } + out { assert( valid ); } + body + { + this.archive = archive; + this.entry = entry; + } + + final bool valid() + { + return( (archive !is null) && !archive.closed ); + } + + final void enforce_mutable() + in { assert( valid ); } + body + { + if( archive.readonly ) + // TODO: exception + throw new Exception("cannot mutate a read-only Zip archive"); + } + + final void mutate() + in { assert( valid ); } + body + { + enforce_mutable; + archive.modified = true; + } + + final ZipFolder[] folders(bool collect) + in { assert( valid ); } + body + { + ZipFolder[] folders; + stats = stats.init; + + foreach( _,childEntry ; entry.dir.children ) + { + if( childEntry.isDir ) + { + if( collect ) folders ~= new ZipFolder(archive, childEntry); + ++ stats.folders; + } + else + { + assert( childEntry.isFile ); + stats.bytes += childEntry.fileSize; + ++ stats.files; + } + } + + return folders; + } + + final Entry*[] files(ref VfsStats stats, VfsFilter filter = null) + in { assert( valid ); } + body + { + Entry*[] files; + + foreach( _,childEntry ; entry.dir.children ) + { + if( childEntry.isFile ) + if( filter is null || filter(childEntry.vfsInfo) ) + { + files ~= childEntry; + stats.bytes += childEntry.fileSize; + ++stats.files; + } + } + + return files; + } +} + +// ************************************************************************ // +// ************************************************************************ // + +/** + * This class represents a file within an archive. + */ +class ZipFile : VfsFile +{ + /// + final override char[] name() + in { assert( valid ); } + body + { + if( entry ) return entry.name; + else return name_; + } + + /// + final override char[] toString() + in { assert( valid ); } + body + { + if( entry ) return entry.fullname; + else return parent.fullname ~ "/" ~ name_; + } + + /// + final override bool exists() + in { assert( valid ); } + body + { + // If we've only got a parent and a name, this means we don't actually + // exist; EXISTENTIAL CRISIS TEIM!!! + return !!entry; + } + + /// + final override ulong size() + in { assert( valid ); } + body + { + if( exists ) + return entry.fileSize; + else + error("ZipFile.size: cannot reliably determine size of a " + "non-existent file"); + } + + /// + final override VfsFile copy(VfsFile source) + in { assert( valid ); } + body + { +version( ZipArchive_NonMutating ) +{ + mutate_error("ZipFile.copy"); + assert(false); +} +else +{ + // MUTATE + enforce_mutable; + + if( !exists ) this.create; + this.output.copy(source.input); + + return this; +} + } + + /// + final override VfsFile move(VfsFile source) + in { assert( valid ); } + body + { +version( ZipArchive_NonMutating ) +{ + mutate_error("ZipFile.move"); + assert(false); +} +else +{ + // MUTATE + enforce_mutable; + + this.copy(source); + source.remove; + + return this; +} + } + + /// + final override VfsFile create() + in { assert( valid ); } + out { assert( valid ); } + body + { +version( ZipArchive_NonMutating ) +{ + mutate_error("ZipFile.create"); + assert(false); +} +else +{ + if( exists ) + error("ZipFile.create: cannot create already existing file: " + "this folder ain't big enough for the both of 'em"); + + // MUTATE + enforce_mutable; + + auto entry = new Entry; + entry.type = EntryType.File; + entry.fullname = parent.fullname.dir_app(name); + entry.name = entry.fullname[$-name.length..$]; + entry.makeVfsInfo; + + assert( !(entry.name in parent.dir.children) ); + parent.dir.children[entry.name] = entry; + this.reset(archive, parent, entry); + mutate; + + // Done + return this; +} + } + + /// + final override VfsFile create(InputStream stream) + in { assert( valid ); } + body + { +version( ZipArchive_NonMutating ) +{ + mutate_error("ZipFile.create"); + assert(false); +} +else +{ + create; + output.copy(stream).close; + return this; +} + } + + /// + final override VfsFile remove() + in{ assert( valid ); } + out { assert( valid ); } + body + { +version( ZipArchive_NonMutating ) +{ + mutate_error("ZipFile.remove"); + assert(false); +} +else +{ + if( !exists ) + error("ZipFile.remove: cannot remove non-existent file; " + "rather redundant, really"); + + // MUTATE + enforce_mutable; + + // Save the old name + auto old_name = name; + + // Do the removal + assert( !!(name in parent.dir.children) ); + parent.dir.children.remove(name); + entry.dispose; + entry = null; + mutate; + + // Swap out our now empty entry for the name, so the file can be + // directly recreated. + this.reset(archive, parent, old_name); + + return this; +} + } + + /// + final override InputStream input() + in { assert( valid ); } + body + { + if( exists ) + return entry.openInput; + + else + error("ZipFile.input: cannot open non-existent file for input; " + "results would not be very useful"); + } + + /// + final override OutputStream output() + in { assert( valid ); } + body + { +version( ZipArchive_NonMutable ) +{ + mutate_error("ZipFile.output"); + assert(false); +} +else +{ + // MUTATE + enforce_mutable; + + // Don't call mutate; defer that until the user actually writes to or + // modifies the underlying stream. + return archive.mutateStream(entry.openOutput); +} + } + + /// + final override VfsFile dup() + in { assert( valid ); } + body + { + if( entry ) + return new ZipFile(archive, parent, entry); + else + return new ZipFile(archive, parent, name); + } + +private: + ZipArchive archive; + Entry* entry; + + Entry* parent; + char[] name_; + + this() + out { assert( !valid ); } + body + { + } + + this(ZipArchive archive, Entry* parent, Entry* entry) + in + { + assert( archive !is null ); + assert( parent ); + assert( parent.isDir ); + assert( entry ); + assert( entry.isFile ); + assert( parent.dir.children[entry.name] is entry ); + } + out { assert( valid ); } + body + { + this.reset(archive, parent, entry); + } + + this(ZipArchive archive, Entry* parent, char[] name) + in + { + assert( archive !is null ); + assert( parent ); + assert( parent.isDir ); + assert( name.nz() ); + assert( !(name in parent.dir.children) ); + } + out { assert( valid ); } + body + { + this.reset(archive, parent, name); + } + + final bool valid() + { + return( (archive !is null) && !archive.closed ); + } + + final void enforce_mutable() + in { assert( valid ); } + body + { + if( archive.readonly ) + // TODO: exception + throw new Exception("cannot mutate a read-only Zip archive"); + } + + final void mutate() + in { assert( valid ); } + body + { + enforce_mutable; + archive.modified = true; + } + + final void reset(ZipArchive archive, Entry* parent, Entry* entry) + in + { + assert( archive !is null ); + assert( parent ); + assert( parent.isDir ); + assert( entry ); + assert( entry.isFile ); + assert( parent.dir.children[entry.name] is entry ); + } + out { assert( valid ); } + body + { + this.parent = parent; + this.archive = archive; + this.entry = entry; + this.name_ = null; + } + + final void reset(ZipArchive archive, Entry* parent, char[] name) + in + { + assert( archive !is null ); + assert( parent ); + assert( parent.isDir ); + assert( name.nz() ); + assert( !(name in parent.dir.children) ); + } + out { assert( valid ); } + body + { + this.archive = archive; + this.parent = parent; + this.entry = null; + this.name_ = name; + } + + final void close() + in { assert( valid ); } + out { assert( !valid ); } + body + { + archive = null; + parent = null; + entry = null; + name_ = null; + } +} + +// ************************************************************************ // +// ************************************************************************ // + +class ZipFolderEntry : VfsFolderEntry +{ + final override VfsFolder open() + in { assert( valid ); } + body + { + auto entry = (name in parent.dir.children); + if( entry ) + return new ZipFolder(archive, *entry); + + else + { + // NOTE: this can be called with a multi-part path. + error("ZipFolderEntry.open: \"" + ~ parent.fullname ~ "/" ~ name + ~ "\" does not exist"); + } + } + + final override VfsFolder create() + in { assert( valid ); } + body + { +version( ZipArchive_NonMutating ) +{ + // TODO: different exception if folder exists (this operation is + // currently invalid either way...) + mutate_error("ZipFolderEntry.create"); + assert(false); +} +else +{ + // MUTATE + enforce_mutable; + + // If the folder exists, we can't really create it, now can we? + if( this.exists ) + error("ZipFolderEntry.create: cannot create folder that already " + "exists, and believe me, I *tried*"); + + // Ok, I suppose I can do this for ya... + auto entry = new Entry; + entry.type = EntryType.Dir; + entry.fullname = parent.fullname.dir_app(name); + entry.name = entry.fullname[$-name.length..$]; + entry.makeVfsInfo; + + assert( !(entry.name in parent.dir.children) ); + parent.dir.children[entry.name] = entry; + mutate; + + // Done + return new ZipFolder(archive, entry); +} + } + + final override bool exists() + in { assert( valid ); } + body + { + return !!(name in parent.dir.children); + } + +private: + ZipArchive archive; + Entry* parent; + char[] name; + + this(ZipArchive archive, Entry* parent, char[] name) + in + { + assert( archive !is null ); + assert( parent.isDir ); + assert( name.nz() ); + assert( name.single_path_part() ); + } + out { assert( valid ); } + body + { + this.archive = archive; + this.parent = parent; + this.name = name; + } + + final bool valid() + { + return (archive !is null) && !archive.closed; + } + + final void enforce_mutable() + in { assert( valid ); } + body + { + if( archive.readonly ) + // TODO: exception + throw new Exception("cannot mutate a read-only Zip archive"); + } + + final void mutate() + in { assert( valid ); } + body + { + enforce_mutable; + archive.modified = true; + } +} + +// ************************************************************************ // +// ************************************************************************ // + +class ZipFolderGroup : VfsFolders +{ + final override int opApply(int delegate(ref VfsFolder) dg) + in { assert( valid ); } + body + { + int result = 0; + + foreach( folder ; members ) + { + VfsFolder x = folder; + if( (result = dg(x)) != 0 ) + break; + } + + return result; + } + + final override uint files() + in { assert( valid ); } + body + { + uint files = 0; + + foreach( folder ; members ) + files += folder.stats.files; + + return files; + } + + final override uint folders() + in { assert( valid ); } + body + { + return members.length; + } + + final override uint entries() + in { assert( valid ); } + body + { + return files + folders; + } + + final override ulong bytes() + in { assert( valid ); } + body + { + ulong bytes = 0; + + foreach( folder ; members ) + bytes += folder.stats.bytes; + + return bytes; + } + + final override VfsFolders subset(char[] pattern) + in { assert( valid ); } + body + { + ZipFolder[] set; + + foreach( folder ; members ) + if( patternMatch(folder.name, pattern) ) + set ~= folder; + + return new ZipFolderGroup(archive, set); + } + + final override VfsFiles catalog(char[] pattern) + in { assert( valid ); } + body + { + return catalog( + (VfsInfo info) + { + return patternMatch(info.name, pattern); + } + ); + } + + final override VfsFiles catalog(VfsFilter filter = null) + in { assert( valid ); } + body + { + return new ZipFileGroup(archive, this, filter); + } + +private: + ZipArchive archive; + ZipFolder[] members; + + this(ZipArchive archive, ZipFolder root, bool recurse) + out { assert( valid ); } + body + { + this.archive = archive; + members = root ~ scan(root, recurse); + } + + this(ZipArchive archive, ZipFolder[] members) + out { assert( valid ); } + body + { + this.archive = archive; + this.members = members; + } + + final bool valid() + { + return (archive !is null) && !archive.closed; + } + + final ZipFolder[] scan(ZipFolder root, bool recurse) + in { assert( valid ); } + body + { + auto folders = root.folders(recurse); + + if( recurse ) + foreach( child ; folders ) + folders ~= scan(child, recurse); + + return folders; + } +} + +// ************************************************************************ // +// ************************************************************************ // + +class ZipFileGroup : VfsFiles +{ + final override int opApply(int delegate(ref VfsFile) dg) + in { assert( valid ); } + body + { + int result = 0; + auto file = new ZipFile; + + foreach( entry ; group ) + { + file.reset(archive,entry.parent,entry.entry); + VfsFile x = file; + if( (result = dg(x)) != 0 ) + break; + } + + return result; + } + + final override uint files() + in { assert( valid ); } + body + { + return group.length; + } + + final override ulong bytes() + in { assert( valid ); } + body + { + return stats.bytes; + } + +private: + ZipArchive archive; + FileEntry[] group; + VfsStats stats; + + struct FileEntry + { + Entry* parent; + Entry* entry; + } + + this(ZipArchive archive, ZipFolderGroup host, VfsFilter filter) + out { assert( valid ); } + body + { + this.archive = archive; + foreach( folder ; host.members ) + foreach( file ; folder.files(stats, filter) ) + group ~= FileEntry(folder.entry, file); + } + + final bool valid() + { + return (archive !is null) && !archive.closed; + } +} + +// ************************************************************************ // +// ************************************************************************ // + +private: + +void error(char[] msg) +{ + throw new Exception(msg); +} + +void mutate_error(char[] method) +{ + error(method ~ ": mutating the contents of a ZipArchive " + "is not supported yet; terribly sorry"); +} + +bool nz(char[] s) +{ + return s.length > 0; +} + +bool zero(char[] s) +{ + return s.length == 0; +} + +bool single_path_part(char[] s) +{ + foreach( c ; s ) + if( c == '/' ) return false; + return true; +} + +char[] dir_app(char[] dir, char[] name) +{ + return dir ~ (dir[$-1]!='/' ? "/" : "") ~ name; +} + +void headTail(ref FilePath fp, out char[] head, out char[] tail) +{ + return headTail(fp.toString, head, tail); +} + +void headTail(char[] path, out char[] head, out char[] tail) +{ + foreach( i,dchar c ; path[1..$] ) + if( c == '/' ) + { + head = path[0..i+1]; + tail = path[i+2..$]; + return; + } + + head = path; + tail = null; +} + +unittest +{ + char[] h,t; + + headTail("/a/b/c", h, t); + assert( h == "/a" ); + assert( t == "b/c" ); + + headTail("a/b/c", h, t); + assert( h == "a" ); + assert( t == "b/c" ); + + headTail("a/", h, t); + assert( h == "a" ); + assert( t == "" ); + + headTail("a", h, t); + assert( h == "a" ); + assert( t == "" ); +} + +// ************************************************************************** // +// ************************************************************************** // +// ************************************************************************** // + +// Dependencies +private: +import tango.io.Conduit : Conduit; + +/******************************************************************************* + + copyright: Copyright © 2007 Daniel Keep. All rights reserved. + + license: BSD style: $(LICENSE) + + version: Prerelease + + author: Daniel Keep + +*******************************************************************************/ + +//module tangox.io.stream.DummyStream; + +//import tango.io.Conduit : Conduit; +//import tango.io.model.IConduit : IConduit, InputStream, OutputStream; + +/** + * The dummy stream classes are used to provide simple, empty stream objects + * where one is required, but none is available. + * + * Note that, currently, these classes return 'null' for the underlying + * conduit, which will likely break code which expects streams to have an + * underlying conduit. + */ +class DummyInputStream : InputStream, IConduit.Seek +{ + alias IConduit.Seek.Anchor Anchor; + + /// + this(){} + override IConduit conduit() { return null; } + override void close() {} + override uint read(void[] dst) { return IConduit.Eof; } + override InputStream clear() { return this; } + override long seek(long offset, Anchor anchor = cast(Anchor)0) { return 0; } +} + +/// ditto +class DummyOutputStream : OutputStream, IConduit.Seek +{ + alias IConduit.Seek.Anchor Anchor; + + /// + this(){} + override IConduit conduit() { return null; } + override void close() {} + override uint write(void[] src) { return IConduit.Eof; } + override OutputStream copy(InputStream src) + { + return Conduit.transfer(src, this); + } + override OutputStream flush() { return this; } + override long seek(long offset, Anchor anchor = cast(Anchor)0) { return 0; } +} + +/******************************************************************************* + + copyright: Copyright © 2007 Daniel Keep. All rights reserved. + + license: BSD style: $(LICENSE) + + version: Prerelease + + author: Daniel Keep + +*******************************************************************************/ + +//module tangox.io.stream.EventStream; + +//import tango.io.Conduit : Conduit; +//import tango.io.model.IConduit : IConduit, InputStream, OutputStream; + +/** + * The event stream classes are designed to allow you to receive feedback on + * how a stream chain is being used. This is done through the use of + * delegate callbacks which are invoked just before the associated method is + * complete. + */ +class EventSeekInputStream : InputStream, IConduit.Seek +{ + /// + struct Callbacks + { + void delegate() close; /// + void delegate() clear; /// + void delegate(uint, void[]) read; /// + void delegate(long, long, Anchor) seek; /// + } + + alias IConduit.Seek.Anchor Anchor; + + /// + this(InputStream source, Callbacks callbacks) + in + { + assert( source !is null ); + assert( (cast(IConduit.Seek) source) !is null ); + } + body + { + this.source = source; + this.seeker = cast(IConduit.Seek) source; + this.callbacks = callbacks; + } + + override IConduit conduit() + { + return source.conduit; + } + + override void close() + { + source.close; + source = null; + seeker = null; + if( callbacks.close ) callbacks.close(); + } + + override uint read(void[] dst) + { + auto result = source.read(dst); + if( callbacks.read ) callbacks.read(result, dst); + return result; + } + + override InputStream clear() + { + source.clear(); + if( callbacks.clear ) callbacks.clear(); + return this; + } + + override long seek(long offset, Anchor anchor = cast(Anchor)0) + { + auto result = seeker.seek(offset, anchor); + if( callbacks.seek ) callbacks.seek(result, offset, anchor); + return result; + } + +private: + InputStream source; + IConduit.Seek seeker; + Callbacks callbacks; + + invariant + { + assert( cast(Object) source is cast(Object) seeker ); + } +} + +/// ditto +class EventSeekOutputStream : OutputStream, IConduit.Seek +{ + /// + struct Callbacks + { + void delegate() close; /// + void delegate() flush; /// + void delegate(uint, void[]) write; /// + void delegate(long, long, Anchor) seek; /// + } + + alias IConduit.Seek.Anchor Anchor; + + /// + this(OutputStream source, Callbacks callbacks) + in + { + assert( source !is null ); + assert( (cast(IConduit.Seek) source) !is null ); + } + body + { + this.source = source; + this.seeker = cast(IConduit.Seek) source; + this.callbacks = callbacks; + } + + override IConduit conduit() + { + return source.conduit; + } + + override void close() + { + source.close; + source = null; + seeker = null; + if( callbacks.close ) callbacks.close(); + } + + override uint write(void[] dst) + { + auto result = source.write(dst); + if( callbacks.write ) callbacks.write(result, dst); + return result; + } + + override OutputStream flush() + { + source.flush(); + if( callbacks.flush ) callbacks.flush(); + return this; + } + + override long seek(long offset, Anchor anchor = cast(Anchor)0) + { + auto result = seeker.seek(offset, anchor); + if( callbacks.seek ) callbacks.seek(result, offset, anchor); + return result; + } + + override OutputStream copy(InputStream src) + { + return Conduit.transfer(src, this); + } + +private: + OutputStream source; + IConduit.Seek seeker; + Callbacks callbacks; + + invariant + { + assert( cast(Object) source is cast(Object) seeker ); + } +} + +/******************************************************************************* + + copyright: Copyright © 2007 Daniel Keep. All rights reserved. + + license: BSD style: $(LICENSE) + + version: Prerelease + + author: Daniel Keep + +*******************************************************************************/ + +//module tangox.io.stream.WrapStream; + +//import tango.io.Conduit : Conduit; +//import tango.io.model.IConduit : IConduit, InputStream, OutputStream; + +/** + * This stream can be used to provide access to another stream. + * Its distinguishing feature is that users cannot close the underlying + * stream. + * + * This stream fully supports seeking, and as such requires that the + * underlying stream also support seeking. + */ +class WrapSeekInputStream : InputStream, IConduit.Seek +{ + alias IConduit.Seek.Anchor Anchor; + + /** + * Create a new wrap stream from the given source. + */ + this(InputStream source) + in + { + assert( source !is null ); + assert( (cast(IConduit.Seek) source) !is null ); + } + body + { + this.source = source; + this.seeker = cast(IConduit.Seek) source; + this._position = seeker.seek(0, Anchor.Current); + } + + /// ditto + this(InputStream source, long position) + in + { + assert( position >= 0 ); + } + body + { + this(source); + this._position = position; + } + + override IConduit conduit() + { + return source.conduit; + } + + override void close() + { + source = null; + seeker = null; + } + + override uint read(void[] dst) + { + if( seeker.seek(0, Anchor.Current) != _position ) + seeker.seek(_position, Anchor.Begin); + + auto read = source.read(dst); + if( read != IConduit.Eof ) + _position += read; + + return read; + } + + override InputStream clear() + { + source.clear(); + return this; + } + + override long seek(long offset, Anchor anchor = cast(Anchor)0) + { + seeker.seek(_position, Anchor.Begin); + return (_position = seeker.seek(offset, anchor)); + } + +private: + InputStream source; + IConduit.Seek seeker; + long _position; + + invariant + { + assert( cast(Object) source is cast(Object) seeker ); + assert( _position >= 0 ); + } +} + +/** + * This stream can be used to provide access to another stream. + * Its distinguishing feature is that the users cannot close the underlying + * stream. + * + * This stream fully supports seeking, and as such requires that the + * underlying stream also support seeking. + */ +class WrapSeekOutputStream : OutputStream, IConduit.Seek +{ + alias IConduit.Seek.Anchor Anchor; + + /** + * Create a new wrap stream from the given source. + */ + this(OutputStream source) + in + { + assert( (cast(IConduit.Seek) source) !is null ); + } + body + { + this.source = source; + this.seeker = cast(IConduit.Seek) source; + this._position = seeker.seek(0, Anchor.Current); + } + + /// ditto + this(OutputStream source, long position) + in + { + assert( position >= 0 ); + } + body + { + this(source); + this._position = position; + } + + override IConduit conduit() + { + return source.conduit; + } + + override void close() + { + source = null; + seeker = null; + } + + uint write(void[] src) + { + if( seeker.seek(0, Anchor.Current) != _position ) + seeker.seek(_position, Anchor.Begin); + + auto wrote = source.write(src); + if( wrote != IConduit.Eof ) + _position += wrote; + return wrote; + } + + override OutputStream copy(InputStream src) + { + return Conduit.transfer(src, this); + } + + override OutputStream flush() + { + source.flush(); + return this; + } + + override long seek(long offset, Anchor anchor = cast(Anchor)0) + { + seeker.seek(_position, Anchor.Begin); + return (_position = seeker.seek(offset, anchor)); + } + +private: + OutputStream source; + IConduit.Seek seeker; + long _position; + + invariant + { + assert( cast(Object) source is cast(Object) seeker ); + assert( _position >= 0 ); + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/io/vfs/model/Vfs.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/io/vfs/model/Vfs.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,570 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Tango. All rights reserved + + license: BSD style: $(LICENSE) + + version: Jul 2007: Initial version + + author: Lars Ivar, Kris + +*******************************************************************************/ + +module tango.io.vfs.model.Vfs; + +private import tango.io.FilePath; + +private import tango.io.model.IConduit; + +/******************************************************************************* + + Passed around during filtering + +*******************************************************************************/ + +struct VfsFilterInfo +{ + char[] path, // full path (sans virtual-path) + name; // name + ext + ulong bytes; // file size, as applicable + bool folder; // is this a folder? +} + +alias VfsFilterInfo* VfsInfo; + +// return false to exclude something +public alias bool delegate(VfsInfo) VfsFilter; + + +/******************************************************************************* + +*******************************************************************************/ + +private struct VfsStats +{ + ulong bytes; // byte count of files + uint files, // number of files + folders; // number of folders +} + +/******************************************************************************* + +******************************************************************************/ + +interface VfsHost : VfsFolder +{ + /********************************************************************** + + Add a child folder. The child cannot 'overlap' with others + in the tree of the same type. Circular references across a + tree of virtual folders are detected and trapped. + + The second argument represents an optional name that the + mount should be known as, instead of the name exposed by + the provided folder (it is not an alias). + + **********************************************************************/ + + VfsHost mount (VfsFolder folder, char[] name=null); + + /*********************************************************************** + + Add a set of child folders. The children cannot 'overlap' + with others in the tree of the same type. Circular references + are detected and trapped. + + ***********************************************************************/ + + VfsHost mount (VfsFolders group); + + /********************************************************************** + + Unhook a child folder + + **********************************************************************/ + + VfsHost dismount (VfsFolder folder); + + /********************************************************************** + + Add a symbolic link to another file. These are referenced + by file() alone, and do not show up in tree traversals + + **********************************************************************/ + + VfsHost map (VfsFile target, char[] name); + + /*********************************************************************** + + Add a symbolic link to another folder. These are referenced + by folder() alone, and do not show up in tree traversals + + ***********************************************************************/ + + VfsHost map (VfsFolderEntry target, char[] name); +} + + +/******************************************************************************* + + Supports a model a bit like CSS selectors, where a selection + of operands is made before applying some operation. For example: + --- + // count of files in this folder + auto count = folder.self.files; + + // accumulated file byte-count + auto bytes = folder.self.bytes; + + // a group of one folder (itself) + auto folders = folder.self; + --- + + The same approach is used to select the subtree descending from + a folder: + --- + // count of files in this tree + auto count = folder.tree.files; + + // accumulated file byte-count + auto bytes = folder.tree.bytes; + + // the group of child folders + auto folders = folder.tree; + --- + + Filtering can be applied to the tree resulting in a sub-group. + Group operations remain applicable. Note that various wildcard + characters may be used in the filtering: + --- + // select a subset of the resultant tree + auto folders = folder.tree.subset("install"); + + // get total file bytes for a tree subset, using wildcards + auto bytes = folder.tree.subset("foo*").bytes; + --- + + Files are selected from a set of folders in a similar manner: + --- + // files called "readme.txt" in this folder + auto count = folder.self.catalog("readme.txt").files; + + // files called "read*.*" in this tree + auto count = folder.tree.catalog("read*.*").files; + + // all txt files belonging to folders starting with "ins" + auto count = folder.tree.subset("ins*").catalog("*.txt").files; + + // custom-filtered files within a subtree + auto count = folder.tree.catalog(&filter).files; + --- + + Sets of folders and files support iteration via foreach: + --- + foreach (folder; root.tree) + Stdout.formatln ("folder name:{}", folder.name); + + foreach (folder; root.tree.subset("ins*")) + Stdout.formatln ("folder name:{}", folder.name); + + foreach (file; root.tree.catalog("*.d")) + Stdout.formatln ("file name:{}", file.name); + --- + + Creating and opening a sub-folder is supported in a similar + manner, where the single instance is 'selected' before the + operation is applied. Open differs from create in that the + folder must exist for the former: + --- + root.folder("myNewFolder").create; + + root.folder("myExistingFolder").open; + --- + + File manipulation is handled in much the same way: + --- + root.file("myNewFile").create; + + auto source = root.file("myExistingFile"); + root.file("myCopiedFile").copy(source); + --- + + The principal benefits of these approaches are twofold: 1) it + turns out to be notably more efficient in terms of traversal, and + 2) there's no casting required, since there is a clean separation + between files and folders. + + See VfsFile for more information on file handling + +*******************************************************************************/ + +interface VfsFolder +{ + /*********************************************************************** + + Return a short name + + ***********************************************************************/ + + char[] name(); + + /*********************************************************************** + + Return a long name + + ***********************************************************************/ + + char[] toString(); + + /*********************************************************************** + + Return a contained file representation + + ***********************************************************************/ + + VfsFile file (char[] path); + + /*********************************************************************** + + Return a contained folder representation + + ***********************************************************************/ + + VfsFolderEntry folder (char[] path); + + /*********************************************************************** + + Returns a folder set containing only this one. Statistics + are inclusive of entries within this folder only + + ***********************************************************************/ + + VfsFolders self (); + + /*********************************************************************** + + Returns a subtree of folders. Statistics are inclusive of + files within this folder and all others within the tree + + ***********************************************************************/ + + VfsFolders tree (); + + /*********************************************************************** + + Iterate over the set of immediate child folders. This is + useful for reflecting the hierarchy + + ***********************************************************************/ + + int opApply (int delegate(inout VfsFolder) dg); + + /*********************************************************************** + + Clear all content from this folder and subordinates + + ***********************************************************************/ + + VfsFolder clear(); + + /*********************************************************************** + + Is folder writable? + + ***********************************************************************/ + + bool writable(); + + /*********************************************************************** + + Close and/or synchronize changes made to this folder. Each + driver should take advantage of this as appropriate, perhaps + combining multiple files together, or possibly copying to a + remote location + + ***********************************************************************/ + + VfsFolder close (bool commit = true); + + /*********************************************************************** + + A folder is being added or removed from the hierarchy. Use + this to test for validity (or whatever) and throw exceptions + as necessary + + ***********************************************************************/ + + void verify (VfsFolder folder, bool mounting); + + //VfsFolder copy(VfsFolder from, char[] to); + //VfsFolder move(Entry from, VfsFolder toFolder, char[] toName); + //char[] absolutePath(char[] path); +} + + +/******************************************************************************* + + Operations upon a set of folders + +*******************************************************************************/ + +interface VfsFolders +{ + /*********************************************************************** + + Iterate over the set of contained VfsFolder instances + + ***********************************************************************/ + + int opApply (int delegate(inout VfsFolder) dg); + + /*********************************************************************** + + Return the number of files + + ***********************************************************************/ + + uint files(); + + /*********************************************************************** + + Return the number of folders + + ***********************************************************************/ + + uint folders(); + + /*********************************************************************** + + Return the total number of entries (files + folders) + + ***********************************************************************/ + + uint entries(); + + /*********************************************************************** + + Return the total size of contained files + + ***********************************************************************/ + + ulong bytes(); + + /*********************************************************************** + + Return a subset of folders matching the given pattern + + ***********************************************************************/ + + VfsFolders subset (char[] pattern); + + /*********************************************************************** + + Return a set of files matching the given pattern + + ***********************************************************************/ + + VfsFiles catalog (char[] pattern); + + /*********************************************************************** + + Return a set of files matching the given filter + + ***********************************************************************/ + + VfsFiles catalog (VfsFilter filter = null); +} + + +/******************************************************************************* + + Operations upon a set of files + +*******************************************************************************/ + +interface VfsFiles +{ + /*********************************************************************** + + Iterate over the set of contained VfsFile instances + + ***********************************************************************/ + + int opApply (int delegate(inout VfsFile) dg); + + /*********************************************************************** + + Return the total number of entries + + ***********************************************************************/ + + uint files(); + + /*********************************************************************** + + Return the total size of all files + + ***********************************************************************/ + + ulong bytes(); +} + + +/******************************************************************************* + + A specific file representation + +*******************************************************************************/ + +interface VfsFile +{ + /*********************************************************************** + + Return a short name + + ***********************************************************************/ + + char[] name(); + + /*********************************************************************** + + Return a long name + + ***********************************************************************/ + + char[] toString(); + + /*********************************************************************** + + Does this file exist? + + ***********************************************************************/ + + bool exists(); + + /*********************************************************************** + + Return the file size + + ***********************************************************************/ + + ulong size (); + + /*********************************************************************** + + Create and copy the given source + + ***********************************************************************/ + + VfsFile copy (VfsFile source); + + /*********************************************************************** + + Create and copy the given source, and remove the source + + ***********************************************************************/ + + VfsFile move (VfsFile source); + + /*********************************************************************** + + Create a new file instance + + ***********************************************************************/ + + VfsFile create (); + + /*********************************************************************** + + Create a new file instance and populate with stream + + ***********************************************************************/ + + VfsFile create (InputStream stream); + + /*********************************************************************** + + Remove this file + + ***********************************************************************/ + + VfsFile remove (); + + /*********************************************************************** + + Return the input stream. Don't forget to close it + + ***********************************************************************/ + + InputStream input (); + + /*********************************************************************** + + Return the output stream. Don't forget to close it + + ***********************************************************************/ + + OutputStream output (); + + /*********************************************************************** + + Duplicate this entry + + ***********************************************************************/ + + VfsFile dup (); +} + + +/******************************************************************************* + + Handler for folder operations. Needs some work ... + +*******************************************************************************/ + +interface VfsFolderEntry +{ + /*********************************************************************** + + Open a folder + + ***********************************************************************/ + + VfsFolder open (); + + /*********************************************************************** + + Create a new folder + + ***********************************************************************/ + + VfsFolder create (); + + /*********************************************************************** + + Test to see if a folder exists + + ***********************************************************************/ + + bool exists (); +} + + +/******************************************************************************* + + Would be used for things like zip files, where the + implementation mantains the contents in memory or on disk, and where + the actual zip file isn't/shouldn't be written until one is finished + filling it up (for zip due to inefficient file format). + +*******************************************************************************/ + +interface VfsSync +{ + /*********************************************************************** + + ***********************************************************************/ + + VfsFolder sync(); +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/math/Bessel.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/math/Bessel.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,723 @@ +/** + * Cylindrical Bessel functions of integral order. + * + * Copyright: Based on the CEPHES math library, which is + * Copyright (C) 1994 Stephen L. Moshier (moshier@world.std.com). + * License: BSD style: $(LICENSE) + * Authors: Stephen L. Moshier (original C code). Conversion to D by Don Clugston + */ + +module tango.math.Bessel; + +import tango.math.Math; +private import tango.math.IEEE; + + +private { // Rational polynomial approximations to j0, y0, j1, y1. + +// sqrt(j0^2(1/x^2) + y0^2(1/x^2)) = z P(z**2)/Q(z**2), z(x) = 1/sqrt(x) +// Peak error = 1.80e-20 +const real j0modulusn[] = [ 0x1.154700ea96e79656p-7, 0x1.72244b6e998cd6fp-4, + 0x1.6ebccf42e9c19fd2p-1, 0x1.6bd844e89cbd639ap+1, 0x1.e812b377c75ebc96p+2, + 0x1.46d69ca24ce76686p+3, 0x1.b756f7234cc67146p+2, 0x1.943a7471eaa50ab2p-2 +]; + +const real j0modulusd[] = [ 0x1.5b84007c37011506p-7, 0x1.cfe76758639bdab4p-4, + 0x1.cbfa09bf71bafc7ep-1, 0x1.c8eafb3836f2eeb4p+1, 0x1.339db78060eb706ep+3, + 0x1.a06530916be8bc7ap+3, 0x1.23bfe7f67a54893p+3, 1.0 +]; + + +// atan(y0(x)/j0(x)) = x - pi/4 + x P(x**2)/Q(x**2) +// Peak error = 2.80e-21. Relative error spread = 5.5e-1 +const real j0phasen[] = [ -0x1.ccbaf3865bb0985ep-22, -0x1.3a6b175e64bdb82ep-14, + -0x1.06124b5310cdca28p-8, -0x1.3cebb7ab09cf1b14p-4, -0x1.00156ed209b43c6p-1, + -0x1.78aa9ba4254ca20cp-1 +]; + +const real j0phased[] = [ 0x1.ccbaf3865bb09918p-19, 0x1.3b5b0e12900d58b8p-11, + 0x1.0897373ff9906f7ep-5, 0x1.450a5b8c552ade4ap-1, 0x1.123e263e7f0e96d2p+2, + 0x1.d82ecca5654be7d2p+2, 1.0 +]; + + +// j1(x) = (x^2-r0^2)(x^2-r1^2)(x^2-r2^2) x P(x**2)/Q(x**2), 0 <= x <= 9 +// Peak error = 2e-21 +const real j1n[] = [ -0x1.2f494fa4e623b1bp+58, 0x1.8289f0a5f1e1a784p+52, + -0x1.9d773ee29a52c6d8p+45, 0x1.e9394ff57a46071cp+37, -0x1.616c7939904a359p+29, + 0x1.424414b9ee5671eap+20, -0x1.6db34a9892d653e6p+10, 0x1.dcd7412d90a0db86p-1, + -0x1.1444a1643199ee5ep-12 +]; + +const real j1d[] = [ 0x1.5a1e0a45eb67bacep+75, 0x1.35ee485d62f0ccbap+68, + 0x1.11ee7aad4e4bcd8p+60, 0x1.3adde5dead800244p+51, 0x1.041c413dfbab693p+42, + 0x1.4066d12193fcc082p+32, 0x1.24309d0dc2c4d42ep+22, 0x1.7115bea028dd75f2p+11, + 1.0 +]; + +// sqrt(j1^2(1/x^2) + y1^2(1/x^2)) = z P(z**2)/Q(z**2), z(x) = 1/sqrt(x) +// Peak error = 1.35e=20, Relative error spread = 9.9e0 +const real [] j1modulusn = [ 0x1.059262020bf7520ap-6, 0x1.012ffc4d1f5cdbc8p-3, + 0x1.03c17ce18cae596p+0, 0x1.6e0414a7114ae3ccp+1, 0x1.cb047410d229cbc4p+2, + 0x1.4385d04bb718faaap+1, 0x1.914074c30c746222p-2, -0x1.42abe77f6b307aa6p+2 +]; + +const real [] j1modulusd = [ 0x1.47d4e6ad98d8246ep-6, 0x1.42562f48058ff904p-3, + 0x1.44985e2af35c6f9cp+0, 0x1.c6f4a03469c4ef6cp+1, 0x1.1829a060e8d604cp+3, + 0x1.44111c892f9cc84p+1, -0x1.d7c36d7f1e5aef6ap-1, -0x1.8eeafb1ac81c4c06p+2, + 1.0 +]; + +// atan(y1(x)/j1(x)) = x - 3pi/4 + z P(z**2)/Q(z**2), z(x) = 1/x +// Peak error = 4.83e-21. Relative error spread = 1.9e0 +const real [] j1phasen = [ 0x1.ca9f612d83aaa818p-20, 0x1.2e82fcfb7d0fee9ep-12, + 0x1.e28858c1e947506p-7, 0x1.12b8f96e5173d20ep-2, 0x1.965e6a013154c0ap+0, + 0x1.0156a25eaa0dd78p+1 +]; + +const real [] j1phased = [ 0x1.31bf961e57c71ae4p-18, 0x1.9464d8f2abf750a6p-11, + 0x1.446a786bac2131fp-5, 0x1.76caa8513919873cp-1, 0x1.2130b56bc1a563e4p+2, + 0x1.b3cc1a865259dfc6p+2, 0x1p+0 +]; + +} + +/*** + * Bessel function of order zero + * + * Returns Bessel function of first kind, order zero of the argument. + */ + + /* The domain is divided into the intervals [0, 9] and + * (9, infinity). In the first interval the rational approximation + * is (x^2 - r^2) (x^2 - s^2) (x^2 - t^2) P7(x^2) / Q8(x^2), + * where r, s, t are the first three zeros of the function. + * In the second interval the expansion is in terms of the + * modulus M0(x) = sqrt(J0(x)^2 + Y0(x)^2) and phase P0(x) + * = atan(Y0(x)/J0(x)). M0 is approximated by sqrt(1/x)P7(1/x)/Q7(1/x). + * The approximation to J0 is M0 * cos(x - pi/4 + 1/x P5(1/x^2)/Q6(1/x^2)). + */ +real cylBessel_j0(real x) +{ + +// j0(x) = (x^2-JZ1)(x^2-JZ2)(x^2-JZ3)P(x**2)/Q(x**2), 0 <= x <= 9 +// Peak error = 8.49e-22. Relative error spread = 2.2e-3 +const real j0n[] = [ -0x1.3e8ff72b890d72d8p+59, 0x1.cc86e3755a4c803p+53, + -0x1.0ea6f5bac6623616p+47, 0x1.532c6d94d36f2874p+39, -0x1.ef25a232f6c00118p+30, + 0x1.aa0690536c11fc2p+21, -0x1.94e67651cc57535p+11, 0x1.4bfe47ac8411eeb2p+0 +]; + +const real j0d[] = [ 0x1.0096dec5f6560158p+73, 0x1.11705db14995fb9cp+66, + 0x1.220a41c3daaa7a58p+58, 0x1.93c6b48d196c1082p+49, 0x1.9814684a10dbfda2p+40, + 0x1.36f20ec527fccda4p+31, 0x1.634596b9247fc34p+21, 0x1.1d3eb73f90657bfcp+11, + 1.0 +]; + real xx, y, z, modulus, phase; + + xx = x * x; + if ( xx < 81.0L ) { + const real [] JZ = [5.783185962946784521176L, + 30.47126234366208639908L, 7.488700679069518344489e1L]; + y = (xx - JZ[0]) * (xx - JZ[1]) * (xx - JZ[2]); + y *= rationalPoly( xx, j0n, j0d); + return y; + } + + y = fabs(x); + xx = 1.0/xx; + phase = rationalPoly( xx, j0phasen, j0phased); + + z = 1.0/y; + modulus = rationalPoly( z, j0modulusn, j0modulusd); + + y = modulus * cos( y - PI_4 + z*phase) / sqrt(y); + return y; +} + +/** + * Bessel function of the second kind, order zero + * Also known as the cylindrical Neumann function, order zero. + * + * Returns Bessel function of the second kind, of order + * zero, of the argument. + */ +real cylBessel_y0(real x) +{ +/* The domain is divided into the intervals [0, 5>, [5,9> and + * [9, infinity). In the first interval a rational approximation + * R(x) is employed to compute y0(x) = R(x) + 2/pi * log(x) * j0(x). + * + * In the second interval, the approximation is + * (x - p)(x - q)(x - r)(x - s)P7(x)/Q7(x) + * where p, q, r, s are zeros of y0(x). + * + * The third interval uses the same approximations to modulus + * and phase as j0(x), whence y0(x) = modulus * sin(phase). + */ + +// y0(x) = 2/pi * log(x) * j0(x) + P(z**2)/Q(z**2), 0 <= x <= 5 +// Peak error = 8.55e-22. Relative error spread = 2.7e-1 +const real y0n[] = [ -0x1.068026b402e2bf7ap+54, 0x1.3a2f7be8c4c8a03ep+55, + -0x1.89928488d6524792p+51, 0x1.3e3ea2846f756432p+46, -0x1.c8be8d9366867c78p+39, + 0x1.43879530964e5fbap+32, -0x1.bee052fef72a5d8p+23, 0x1.e688c8fe417c24d8p+13 +]; + +const real y0d[] = [ 0x1.bc96c5351e564834p+57, 0x1.6821ac3b4c5209a6p+51, + 0x1.27098b571836ce64p+44, 0x1.41870d2a9b90aa76p+36, 0x1.00394fd321f52f48p+28, + 0x1.317ce3b16d65b27p+19, 0x1.0432b36efe4b20aep+10, 1.0 +]; + +// y0(x) = (x-Y0Z1)(x-Y0Z2)(x-Y0Z3)(x-Y0Z4)P(x)/Q(x), 4.5 <= x <= 9 +// Peak error = 2.35e-20. Relative error spread = 7.8e-13 +const real y059n[] = [ -0x1.0fce17d26a21f218p+19, -0x1.c6fc144765fdfaa8p+16, + 0x1.3e20237c53c7180ep+19, 0x1.7d14055ff6a493c4p+17, 0x1.b8b694729689d1f4p+12, + -0x1.1e24596784b6c5cp+12, 0x1.35189cb3ece7ab46p+6, 0x1.9428b3f406b4aa08p+4, + -0x1.791187b68dd4240ep+0, 0x1.8417216d568b325ep-6 +]; + +const real y059d[] = [ 0x1.17af71a3d4167676p+30, 0x1.a36abbb668c79d6cp+31, + -0x1.4ff64a14ed73c4d6p+29, 0x1.9d427af195244ffep+26, -0x1.4e85bbbc8d2fd914p+23, + 0x1.ac59b523ae0bd16cp+19, -0x1.8ebda33eaac74518p+15, 0x1.16194a051cd55a12p+11, + -0x1.f2d714ab48d1bd7ep+5, 1.0 +]; + + + real xx, y, z, modulus, phase; + + if ( x < 0.0 ) return -real.max; + xx = x * x; + if ( xx < 81.0L ) { + if ( xx < 20.25L ) { + y = M_2_PI * log(x) * cylBessel_j0(x); + y += rationalPoly( xx, y0n, y0d); + } else { + const real [] Y0Z = [3.957678419314857868376e0L, 7.086051060301772697624e0L, + 1.022234504349641701900e1L, 1.336109747387276347827e1L]; + y = (x - Y0Z[0])*(x - Y0Z[1])*(x - Y0Z[2])*(x - Y0Z[3]); + y *= rationalPoly( x, y059n, y059d); + } + return y; + } + + y = fabs(x); + xx = 1.0/xx; + phase = rationalPoly( xx, j0phasen, j0phased); + + z = 1.0/y; + modulus = rationalPoly( z, j0modulusn, j0modulusd); + + y = modulus * sin( y - PI_4 + z*phase) / sqrt(y); + return y; +} + +/** + * Bessel function of order one + * + * Returns Bessel function of order one of the argument. + */ +real cylBessel_j1(real x) +{ +/* The domain is divided into the intervals [0, 9] and + * (9, infinity). In the first interval the rational approximation + * is (x^2 - r^2) (x^2 - s^2) (x^2 - t^2) x P8(x^2) / Q8(x^2), + * where r, s, t are the first three zeros of the function. + * In the second interval the expansion is in terms of the + * modulus M1(x) = sqrt(J1(x)^2 + Y1(x)^2) and phase P1(x) + * = atan(Y1(x)/J1(x)). M1 is approximated by sqrt(1/x)P7(1/x)/Q8(1/x). + * The approximation to j1 is M1 * cos(x - 3 pi/4 + 1/x P5(1/x^2)/Q6(1/x^2)). + */ + + real xx, y, z, modulus, phase; + + xx = x * x; + if ( xx < 81.0L ) { + const real [] JZ = [1.46819706421238932572e1L, + 4.92184563216946036703e1L, 1.03499453895136580332e2L]; + y = (xx - JZ[0]) * (xx - JZ[1]) * (xx - JZ[2]); + y *= x * poly( xx, j1n) / poly( xx, j1d); + return y; + } + y = fabs(x); + xx = 1.0/xx; + phase = rationalPoly( xx, j1phasen, j1phased); + z = 1.0/y; + modulus = rationalPoly( z, j1modulusn, j1modulusd); + + const real M_3PI_4 = 3 * PI_4; + + y = modulus * cos( y - M_3PI_4 + z*phase) / sqrt(y); + if( x < 0 ) + y = -y; + return y; +} + +/** + * Bessel function of the second kind, order zero + * + * Returns Bessel function of the second kind, of order + * zero, of the argument. + */ +real cylBessel_y1(real x) +in { + assert(x>=0.0); + // TODO: should it return -infinity for x<0 ? +} +body { +/* The domain is divided into the intervals [0, 4.5>, [4.5,9> and + * [9, infinity). In the first interval a rational approximation + * R(x) is employed to compute y0(x) = R(x) + 2/pi * log(x) * j0(x). + * + * In the second interval, the approximation is + * (x - p)(x - q)(x - r)(x - s)P9(x)/Q10(x) + * where p, q, r, s are zeros of y1(x). + * + * The third interval uses the same approximations to modulus + * and phase as j1(x), whence y1(x) = modulus * sin(phase). + * + * ACCURACY: + * + * Absolute error, when y0(x) < 1; else relative error: + * + * arithmetic domain # trials peak rms + * IEEE 0, 30 36000 2.7e-19 5.3e-20 + * + */ + +// y1(x) = 2/pi * (log(x) * j1(x) - 1/x) + R(x^2) z P(z**2)/Q(z**2) +// 0 <= x <= 4.5, z(x) = x +// Peak error = 7.25e-22. Relative error spread = 4.5e-2 +const real [] y1n = [ -0x1.32cab2601090742p+54, 0x1.432ceb7a8eaeff16p+52, + -0x1.bcebec5a2484d3fap+47, 0x1.cc58f3cb54d6ac66p+41, -0x1.b1255e154d0eec0ep+34, + 0x1.7a337df43298a7c8p+26, -0x1.f77a1afdeff0b62cp+16 +]; + +const real [] y1d = [ 0x1.8733bcfd7236e604p+56, 0x1.5af412c672fd18d4p+50, + 0x1.394ba130685755ep+43, 0x1.7b3321523b24afcp+35, 0x1.52946dac22f61d0cp+27, + 0x1.c9040c6053de5318p+18, 0x1.be5156e6771dba34p+9, 1.0 +]; + + +// y1(x) = (x-YZ1)(x-YZ2)(x-YZ3)(x-YZ4)R(x) P(z)/Q(z) +// z(x) = x, 4.5 <= x <= 9 +// Peak error = 3.27e-22. Relative error spread = 4.5e-2 +const real y159n[] = [ 0x1.2fed87b1e60aa736p+18, -0x1.1a2b18cdb2d1ec5ep+20, + -0x1.b848827f47b47022p+20, -0x1.b2e422305ea19a86p+20, + -0x1.e3f82ac304534676p+16, 0x1.47a2cb5e852d657ep+14, 0x1.81b2fc6e44d7be8p+12, + -0x1.cd861d7b090dd22ep+9, 0x1.588897d683cbfbe2p+5, -0x1.5c7feccf76856bcap-1 +]; + +const real y159d[] = [ 0x1.9b64f2a4d5614462p+26, -0x1.17501e0e38db675ap+30, + 0x1.fe88b567c2911c1cp+31, -0x1.86b1781e04e748d4p+29, 0x1.ccd7d4396f2edbcap+26, + -0x1.694110c682e5cbcap+23, 0x1.c20f7005b88c789ep+19, -0x1.983a5b4275ab7da8p+15, + 0x1.17c60380490fa1fcp+11, -0x1.ee84c254392634d8p+5, 1.0 +]; + + real xx, y, z, modulus, phase; + + z = 1.0/x; + xx = x * x; + if ( xx < 81.0L ) { + if ( xx < 20.25L ) { + y = M_2_PI * (log(x) * cylBessel_j1(x) - z); + y += x * poly( xx, y1n) / poly( xx, y1d); + } else { + const real [] Y1Z = + [ 2.19714132603101703515e0L, 5.42968104079413513277e0L, + 8.59600586833116892643e0L, 1.17491548308398812434e1L]; + y = (x - Y1Z[0])*(x - Y1Z[1])*(x - Y1Z[2])*(x - Y1Z[3]); + y *= rationalPoly( x, y159n, y159d); + } + return y; + } + xx = 1.0/xx; + phase = rationalPoly( xx, j1phasen, j1phased); + modulus = rationalPoly( z, j1modulusn, j1modulusd); + + const real M_3PI_4 = 3 * PI_4; + + z = modulus * sin( x - M_3PI_4 + z*phase) / sqrt(x); + return z; +} + +/** + * Bessel function of integer order + * + * Returns Bessel function of order n, where n is a + * (possibly negative) integer. + * + * The ratio of jn(x) to j0(x) is computed by backward + * recurrence. First the ratio jn/jn-1 is found by a + * continued fraction expansion. Then the recurrence + * relating successive orders is applied until j0 or j1 is + * reached. + * + * If n = 0 or 1 the routine for j0 or j1 is called + * directly. + * + * BUGS: Not suitable for large n or x. + * + */ +real cylBessel_jn(int n, real x ) +{ + real pkm2, pkm1, pk, xk, r, ans; + int k, sign; + + if ( n < 0 ) { + n = -n; + if ( (n & 1) == 0 ) /* -1**n */ + sign = 1; + else + sign = -1; + } else + sign = 1; + + if ( x < 0.0L ) { + if ( n & 1 ) + sign = -sign; + x = -x; + } + + if ( n == 0 ) + return sign * cylBessel_j0(x); + if ( n == 1 ) + return sign * cylBessel_j1(x); + // BUG: This code from Cephes is fast, but it makes the Wronksian test fail. + // (accuracy is 8 bits lower). + // But, the problem might lie in the n = 2 case in cylBessel_yn(). +// if ( n == 2 ) +// return sign * (2.0L * cylBessel_j1(x) / x - cylBessel_j0(x)); + + if ( x < real.epsilon ) + return 0; + + /* continued fraction */ + k = 53; + pk = 2 * (n + k); + ans = pk; + xk = x * x; + + do { + pk -= 2.0L; + ans = pk - (xk/ans); + } while( --k > 0 ); + ans = x/ans; + + /* backward recurrence */ + + pk = 1.0L; + pkm1 = 1.0L/ans; + k = n-1; + r = 2 * k; + + do { + pkm2 = (pkm1 * r - pk * x) / x; + pk = pkm1; + pkm1 = pkm2; + r -= 2.0L; + } while( --k > 0 ); + + if ( fabs(pk) > fabs(pkm1) ) + ans = cylBessel_j1(x)/pk; + else + ans = cylBessel_j0(x)/pkm1; + return sign * ans; +} + +/** + * Bessel function of second kind of integer order + * + * Returns Bessel function of order n, where n is a + * (possibly negative) integer. + * + * The function is evaluated by forward recurrence on + * n, starting with values computed by the routines + * cylBessel_y0() and cylBessel_y1(). + * + * If n = 0 or 1 the routine for cylBessel_y0 or cylBessel_y1 is called + * directly. + */ +real cylBessel_yn(int n, real x) +in { + assert(x>0); // TODO: should it return -infinity for x<=0 ? +} +body { + real an, r; + int k, sign; + + if ( n < 0 ) { + n = -n; + if ( (n & 1) == 0 ) /* -1**n */ + sign = 1; + else + sign = -1; + } else + sign = 1; + + if ( n == 0 ) + return sign * cylBessel_y0(x); + if ( n == 1 ) + return sign * cylBessel_y1(x); + + /* forward recurrence on n */ + real anm2 = cylBessel_y0(x); + real anm1 = cylBessel_y1(x); + k = 1; + r = 2 * k; + do { + an = r * anm1 / x - anm2; + anm2 = anm1; + anm1 = an; + r += 2.0L; + ++k; + } while( k < n ); + return sign * an; +} + +private { +// Evaluate Chebyshev series +double evalCheby(double x, double [] poly) +{ + double b0, b1, b2; + + b0 = poly[$-1]; + b1 = 0.0; + for (int i=poly.length-1; i>=0; --i) { + b2 = b1; + b1 = b0; + b0 = x * b1 - b2 + poly[i]; + } + return 0.5*(b0-b2); +} +} + +/** + * Modified Bessel function of order zero + * + * Returns modified Bessel function of order zero of the + * argument. + * + * The function is defined as i0(x) = j0( ix ). + * + * The range is partitioned into the two intervals [0,8] and + * (8, infinity). Chebyshev polynomial expansions are employed + * in each interval. + */ +double cylBessel_i0(double x) +{ + // Chebyshev coefficients for exp(-x) I0(x) in the interval [0,8]. + // lim(x->0){ exp(-x) I0(x) } = 1. + const double [] A = [ 0x1.5a84e9035a22ap-1, -0x1.37febc057cd8dp-2, + 0x1.5f7ac77ac88c0p-3, -0x1.84b70342d06eap-4, 0x1.93e8acea8a32dp-5, + -0x1.84e9ef121b6f0p-6, 0x1.59961f3dde3ddp-7, -0x1.1b65e201aa849p-8, + 0x1.adc758a12100ep-10, -0x1.2e2fd1f15eb52p-11, 0x1.8b51b74107cabp-13, + -0x1.e2b2659c41d5ap-15, 0x1.13f58be9a2859p-16, -0x1.2866fcba56427p-18, + 0x1.2bf24978cf4acp-20, -0x1.1ec638f227f8dp-22, 0x1.03b769d4d6435p-24, + -0x1.beaf68c0b30abp-27, 0x1.6d903a454cb34p-29, -0x1.1d4fe13ae9556p-31, + 0x1.a98becc743c10p-34, -0x1.2fc957a946abcp-36, 0x1.9fe2fe19bd324p-39, + -0x1.1164c62ee1af0p-41, 0x1.59b464b262627p-44, -0x1.a5022c297fbebp-47, + 0x1.ee6d893f65ebap-50, -0x1.184eb721ebbb4p-52, 0x1.33362977da589p-55, + -0x1.45cb72134d0efp-58 ]; + + // Chebyshev coefficients for exp(-x) sqrt(x) I0(x) + // in the inverted interval [8,infinity]. + // lim(x->inf){ exp(-x) sqrt(x) I0(x) } = 1/sqrt(2pi). + const double [] B = [ 0x1.9be62aca809cbp-1, 0x1.b998ca2e59049p-9, + 0x1.20fa378999e52p-14, 0x1.8412bc101c586p-19, 0x1.b8007d9cd616ep-23, + 0x1.8569280d6d56dp-26, 0x1.d2c64a9225b87p-29, 0x1.0f9ccc0f46f75p-31, + 0x1.a24feabe8004fp-37, -0x1.1511d08397425p-35, -0x1.d0fd7357e7bf2p-37, + -0x1.f904303178d66p-40, 0x1.94347fa268cecp-41, 0x1.b1c8c6b83c073p-42, + 0x1.156ff0d5fc545p-46, -0x1.75d99cf68bb32p-45, -0x1.583fe7e65629ap-47, + 0x1.12a919094e6d7p-48, 0x1.fee7da3eafb1fp-50, -0x1.8aee7d908de38p-52, + -0x1.4600babd21fe4p-52, 0x1.3f3dd076041cdp-55, 0x1.9be1812d98421p-55, + -0x1.646da66119130p-58, -0x1.0adb754ca8b19p-57 ]; + + double y; + + if (x < 0) + x = -x; + if (x <= 8.0) { + y = (x/2.0) - 2.0; + return exp(x) * evalCheby( y, A); + } + return exp(x) * evalCheby( 32.0/x - 2.0, B) / sqrt(x); +} + +/** + * Modified Bessel function of order one + * + * Returns modified Bessel function of order one of the + * argument. + * + * The function is defined as i1(x) = -i j1( ix ). + * + * The range is partitioned into the two intervals [0,8] and + * (8, infinity). Chebyshev polynomial expansions are employed + * in each interval. +*/ +double cylBessel_i1(double x) +{ + const double [] A = [ 0x1.02a63724a7ffap-2, -0x1.694d10469192ep-3, + 0x1.a46dad536f53cp-4, -0x1.b1bbc537c9ebcp-5, 0x1.951e3e7bb2349p-6, + -0x1.5a29f7913a26ap-7, 0x1.1065349d3a1b4p-8, -0x1.8cc620b3cd4a4p-10, + 0x1.0c95db6c6df7dp-11, -0x1.533cad3d694fep-13, 0x1.911b542c70d0bp-15, + -0x1.bd5f9b8debbcfp-17, 0x1.d1c4ed511afc5p-19, -0x1.cc0798363992ap-21, + 0x1.ae344b347d108p-23, -0x1.7dd3e24b8c3e8p-25, 0x1.4258e02395010p-27, + -0x1.0361b28ea67e6p-29, 0x1.8ea34b43fdf6cp-32, -0x1.2510397eb07dep-34, + 0x1.9cee2b21d3154p-37, -0x1.173835fb70366p-39, 0x1.6af784779d955p-42, + -0x1.c628e1c8f0b3bp-45, 0x1.11d7f0615290cp-47, -0x1.3eaaa7e0d1573p-50, + 0x1.663e3e593bfacp-53, -0x1.857d0c38a0576p-56, 0x1.99f2a0c3c4014p-59 + ]; + + // Chebyshev coefficients for exp(-x) sqrt(x) I1(x) + // in the inverted interval [8,infinity]. + // lim(x->inf){ exp(-x) sqrt(x) I1(x) } = 1/sqrt(2pi). + const double [] B = [ 0x1.8ea18b55b1514p-1, -0x1.3fda053fcdb4cp-7, + -0x1.cfd7f804aa9a6p-14, -0x1.048df49ca0373p-18, -0x1.0dbfd2e9e5443p-22, + -0x1.c415394bb46c1p-26, -0x1.0790b9ad53528p-28, -0x1.334ca5423dd80p-31, + -0x1.4dcf9d4504c0cp-36, 0x1.1e1a1f1587865p-35, 0x1.f101f653c457bp-37, + 0x1.1e7d3f6439fa3p-39, -0x1.953e1076ab493p-41, -0x1.cbc458e73e255p-42, + -0x1.7a9482e6d22a0p-46, 0x1.80d3c26b3281ep-45, 0x1.776e1762d31e8p-47, + -0x1.12db5138afbc7p-48, -0x1.0efcd8bc4d22ap-49, 0x1.7d68e5f04a2d1p-52, + 0x1.55915fceb588ap-52, -0x1.2806c9c773320p-55, -0x1.acea3b2532277p-55, + 0x1.45b8aea87b950p-58, 0x1.1556db352e8e6p-57 ]; + + double y, z; + + z = fabs(x); + if( z <= 8.0 ) { + y = (z/2.0) - 2.0; + z = evalCheby( y, A ) * z * exp(z); + } else { + z = exp(z) * evalCheby( 32.0/z - 2.0, B ) / sqrt(z); + } + if (x < 0.0 ) + z = -z; + return z; +} + +debug(UnitTest) { + +unittest { + // argument, result1, result2, derivative. Correct result is result1+result2. +const real [4][] j0_test_points = [ + [8.0L, 1.71646118164062500000E-1L, 4.68897349140609086941E-6L, -2.34636346853914624381E-1L], + [4.54541015625L, -3.09783935546875000000E-1L, 7.07472668157686463367E-6L, 2.42993657373627558460E-1L], + [2.85711669921875L, -2.07901000976562500000E-1L, 1.15237285263902751582E-5L, -3.90402225324501311651E-1L], + [2.0L, 2.23876953125000000000E-1L, 1.38260162356680518275E-5L, -5.76724807756873387202E-1L], + [1.16415321826934814453125e-10L, 9.99984741210937500000E-1L, 1.52587890624999966119E-5L, + 9.99999999999999999997E-1L], + [-2.0L, 2.23876953125000000000E-1L, + 1.38260162356680518275E-5L, 5.76724807756873387202E-1L] +]; + +const real [4][] y0_test_points = [ + [ 8.0L, 2.23510742187500000000E-1L, 1.07472000662205273234E-5L, 1.58060461731247494256E-1L], + [4.54541015625L, -2.08114624023437500000E-1L, 1.45018823856668874574E-5L, -2.88887645307401250876E-1L], + [2.85711669921875L, 4.20303344726562500000E-1L, 1.32781607563122276008E-5L, -2.82488638474982469213E-1], + [2.0L, 5.10360717773437500000E-1L, 1.49548763076195966066E-5L, 1.07032431540937546888E-1L], + [1.16415321826934814453125e-10L, -1.46357574462890625000E1L, 3.54110537011061127637E-6L, + 5.46852220461145271913E9L] +]; + +const real [4][] j1_test_points = [ + [ 8.0L, 2.34634399414062500000E-1L, 1.94743985212438127665E-6L,1.42321263780814578043E-1], + [4.54541015625L, -2.42996215820312500000E-1L, 2.55844668494153980076E-6L, -2.56317734136211337012E-1], + [2.85711669921875L, 3.90396118164062500000E-1L, 6.10716043881165077013E-6L, -3.44531507106757980441E-1L], + [2.0L, 5.76721191406250000000E-1L, 3.61635062338720244824E-6L, -6.44716247372010255494E-2L], + [1.16415321826934814453125e-10L, 5.820677273504770710133016109466552734375e-11L, + 8.881784197001251337312921818461805735896e-16L, 4.99999999999999999997E-1L], + [-2.0L, -5.76721191406250000000E-1L, -3.61635062338720244824E-6L, -6.44716247372010255494E-2L] +]; + +const real [4][] y1_test_points = [ + [8.0L, -1.58065795898437500000E-1L, + 5.33416719000574444473E-6L, 2.43279047103972157309E-1L], + [4.54541015625L, 2.88879394531250000000E-1L, + 8.25077615125087585195E-6L, -2.71656024771791736625E-1L], + [2.85711669921875L, 2.82485961914062500000E-1, + 2.67656091996921314433E-6L, 3.21444694221532719737E-1], + [2.0L, -1.07040405273437500000E-1L, + 7.97373249995311162923E-6L, 5.63891888420213893041E-1], + [1.16415321826934814453125e-10L, -5.46852220500000000000E9L, + 3.88547280871200700671E-1L, 4.69742480525120196168E19L] +]; + + foreach(real [4] t; j0_test_points) { + assert(feqrel(cylBessel_j0(t[0]), t[1]+t[2]) >=real.mant_dig-3); + } + + foreach(real [4] t; y0_test_points) { + assert(feqrel(cylBessel_y0(t[0]), t[1]+t[2]) >=real.mant_dig-4); + } + foreach(real [4] t; j1_test_points) { + assert(feqrel(cylBessel_j1(t[0]), t[1]+t[2]) >=real.mant_dig-3); + } + + foreach(real [4] t; y1_test_points) { + assert(feqrel(cylBessel_y1(t[0]), t[1]+t[2]) >=real.mant_dig-4); + } + + // Values from MS Excel, of doubtful accuracy. + assert(fabs(-0.060_409_940_421_649 - cylBessel_j0(173.5)) < 0.000_000_000_1); + assert(fabs(-0.044_733_447_576_5866 - cylBessel_y0(313.25)) < 0.000_000_000_1); + assert(fabs(0.00391280088318945 - cylBessel_j1(123.25)) < 0.000_000_000_1); + assert(fabs(-0.0648628570878951 - cylBessel_j1(-91)) < 0.000_000_000_1); + assert(fabs(-0.0759578537652805 - cylBessel_y1(107.75)) < 0.000_000_000_1); + + assert(fabs(13.442_456_516_6771-cylBessel_i0(4.2)) < 0.000_001); + assert(fabs(1.6500020842093e+28-cylBessel_i0(-68)) < 0.000_001e+28); + assert(fabs(4.02746515903173e+10-cylBessel_i1(27)) < 0.000_001e+10); + assert(fabs(-2.83613942886386e-02-cylBessel_i1(-0.0567)) < 0.000_000_001e-2); +} +} + +debug(UnitTest) { + +unittest { + + // Wronksian test for Bessel functions + void testWronksian(int n, real x) + { + real Jnp1 = cylBessel_jn(n + 1, x); + real Jmn = cylBessel_jn(-n, x); + real Jn = cylBessel_jn(n, x); + real Jmnp1 = cylBessel_jn(-(n + 1), x); + /* This should be trivially zero. */ + assert( fabs(Jnp1 * Jmn + Jn * Jmnp1) == 0); + if (x < 0.0) { + x = -x; + Jn = cylBessel_jn(n, x); + Jnp1 = cylBessel_jn(n + 1, x); + } + real Yn = cylBessel_yn(n, x); + real Ynp1 = cylBessel_yn(n + 1, x); + /* The Wronksian. */ + real w1 = Jnp1 * Yn - Jn * Ynp1; + /* What the Wronksian should be. */ + real w2 = 2.0 / (PI * x); + + real reldif = feqrel(w1, w2); + assert(reldif >= real.mant_dig-6); + } + + real delta; + int n, i, j; + + delta = 0.6 / PI; + for (n = -30; n <= 30; n++) { + real x = -30.0; + while (x < 30.0) { + testWronksian (n, x); + x += delta; + } + delta += .00123456; + } + assert(cylBessel_jn(20, 1e-80)==0); + + // NaN propagation + assert(isIdentical(cylBessel_i1(NaN(0xDEF)), NaN(0xDEF))); + assert(isIdentical(cylBessel_i0(NaN(0x846)), NaN(0x846))); + +} + +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/math/Elliptic.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/math/Elliptic.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,346 @@ +/** + * Elliptic integrals. + * The functions are named similarly to the names used in Mathematica. + * + * License: BSD style: $(LICENSE) + * Copyright: Based on the CEPHES math library, which is + * Copyright (C) 1994 Stephen L. Moshier (moshier@world.std.com). + * Authors: Stephen L. Moshier (original C code). Conversion to D by Don Clugston + * + * References: + * $(LINK http://en.wikipedia.org/wiki/Elliptic_integral) + * + * Eric W. Weisstein. "Elliptic Integral of the First Kind." From MathWorld--A Wolfram Web Resource. $(LINK http://mathworld.wolfram.com/EllipticIntegraloftheFirstKind.html) + * + * $(LINK http://www.netlib.org/cephes/ldoubdoc.html) + * + * Macros: + * TABLE_SV = + * + * $0
Special Values
+ * SVH = $(TR $(TH $1) $(TH $2)) + * SV = $(TR $(TD $1) $(TD $2)) + * GAMMA = Γ + * INTEGRATE = $(BIG ∫$(SMALL $1)$2) + * POWER = $1$2 + * NAN = $(RED NAN) + */ +/** + * Macros: + * TABLE_SV = + * + * $0
Special Values
+ * SVH = $(TR $(TH $1) $(TH $2)) + * SV = $(TR $(TD $1) $(TD $2)) + * + * NAN = $(RED NAN) + * SUP = $0 + * GAMMA = Γ + * INTEGRAL = ∫ + * INTEGRATE = $(BIG ∫$(SMALL $1)$2) + * POWER = $1$2 + * BIGSUM = $(BIG Σ $2$(SMALL $1)) + * CHOOSE = $(BIG () $(SMALL $1)$(SMALL $2) $(BIG )) + */ + +module tango.math.Elliptic; + +import tango.math.Math; +import tango.math.IEEE; + +/* These functions are based on code from: +Cephes Math Library, Release 2.3: October, 1995 +Copyright 1984, 1987, 1995 by Stephen L. Moshier +*/ + + +/** + * Incomplete elliptic integral of the first kind + * + * Approximates the integral + * F(phi | m) = $(INTEGRATE 0, phi) dt/ (sqrt( 1- m $(POWER sin, 2) t)) + * + * of amplitude phi and modulus m, using the arithmetic - + * geometric mean algorithm. + */ + +real ellipticF(real phi, real m ) +{ + real a, b, c, e, temp, t, K; + int d, mod, sign, npio2; + + if( m == 0.0L ) + return phi; + a = 1.0L - m; + if( a == 0.0L ) { + if ( fabs(phi) >= PI_2 ) return real.infinity; + return log( tan( 0.5L*(PI_2 + phi) ) ); + } + npio2 = cast(int)floor( phi/PI_2 ); + if ( npio2 & 1 ) + npio2 += 1; + if ( npio2 ) { + K = ellipticKComplete( a ); + phi = phi - npio2 * PI_2; + } else + K = 0.0L; + if( phi < 0.0L ){ + phi = -phi; + sign = -1; + } else + sign = 0; + b = sqrt(a); + t = tan( phi ); + if( fabs(t) > 10.0L ) { + /* Transform the amplitude */ + e = 1.0L/(b*t); + /* ... but avoid multiple recursions. */ + if( fabs(e) < 10.0L ){ + e = atan(e); + if( npio2 == 0 ) + K = ellipticKComplete( a ); + temp = K - ellipticF( e, m ); + goto done; + } + } + a = 1.0L; + c = sqrt(m); + d = 1; + mod = 0; + + while( fabs(c/a) > real.epsilon ) { + temp = b/a; + phi = phi + atan(t*temp) + mod * PI; + mod = cast(int)((phi + PI_2)/PI); + t = t * ( 1.0L + temp )/( 1.0L - temp * t * t ); + c = 0.5L * ( a - b ); + temp = sqrt( a * b ); + a = 0.5L * ( a + b ); + b = temp; + d += d; + } + temp = (atan(t) + mod * PI)/(d * a); + +done: + if ( sign < 0 ) + temp = -temp; + temp += npio2 * K; + return temp; +} + + +/** + * Incomplete elliptic integral of the second kind + * + * Approximates the integral + * + * E(phi | m) = $(INTEGRATE 0, phi) sqrt( 1- m $(POWER sin, 2) t) dt + * + * of amplitude phi and modulus m, using the arithmetic - + * geometric mean algorithm. + */ + +real ellipticE(real phi, real m ) +{ + real a, b, c, e, temp, t, E; + int d, mod, npio2, sign; + + if ( m == 0.0L ) return phi; + real lphi = phi; + npio2 = cast(int)floor( lphi/PI_2 ); + if( npio2 & 1 ) + npio2 += 1; + lphi = lphi - npio2 * PI_2; + if( lphi < 0.0L ){ + lphi = -lphi; + sign = -1; + } else { + sign = 1; + } + a = 1.0L - m; + E = ellipticEComplete( a ); + if( a == 0.0L ) { + temp = sin( lphi ); + goto done; + } + t = tan( lphi ); + b = sqrt(a); + if ( fabs(t) > 10.0L ) { + /* Transform the amplitude */ + e = 1.0L/(b*t); + /* ... but avoid multiple recursions. */ + if( fabs(e) < 10.0L ){ + e = atan(e); + temp = E + m * sin( lphi ) * sin( e ) - ellipticE( e, m ); + goto done; + } + } + c = sqrt(m); + a = 1.0L; + d = 1; + e = 0.0L; + mod = 0; + + while( fabs(c/a) > real.epsilon ) { + temp = b/a; + lphi = lphi + atan(t*temp) + mod * PI; + mod = cast(int)((lphi + PI_2)/PI); + t = t * ( 1.0L + temp )/( 1.0L - temp * t * t ); + c = 0.5L*( a - b ); + temp = sqrt( a * b ); + a = 0.5L*( a + b ); + b = temp; + d += d; + e += c * sin(lphi); + } + + temp = E / ellipticKComplete( 1.0L - m ); + temp *= (atan(t) + mod * PI)/(d * a); + temp += e; + +done: + if( sign < 0 ) + temp = -temp; + temp += npio2 * E; + return temp; +} + + +/** + * Complete elliptic integral of the first kind + * + * Approximates the integral + * + * K(m) = $(INTEGRATE 0, &pi/2) dt/ (sqrt( 1- m $(POWER sin, 2) t)) + * + * where m = 1 - x, using the approximation + * + * P(x) - log x Q(x). + * + * The argument x is used rather than m so that the logarithmic + * singularity at x = 1 will be shifted to the origin; this + * preserves maximum accuracy. + * + * x must be in the range + * 0 <= x <= 1 + * + * This is equivalent to ellipticF(PI_2, 1-x). + * + * K(0) = &pi/2. + */ + +real ellipticKComplete(real x) +in { +// assert(x>=0.0L && x<=1.0L); +} +body{ + +const real [] P = [ + 0x1.62e42fefa39ef35ap+0, // 1.3862943611198906189 + 0x1.8b90bfbe8ed811fcp-4, // 0.096573590279993142323 + 0x1.fa05af797624c586p-6, // 0.030885144578720423267 + 0x1.e979cdfac7249746p-7, // 0.01493761594388688915 + 0x1.1f4cc8890cff803cp-7, // 0.0087676982094322259125 + 0x1.7befb3bb1fa978acp-8, // 0.0057973684116620276454 + 0x1.2c2566aa1d5fe6b8p-8, // 0.0045798659940508010431 + 0x1.7333514e7fe57c98p-8, // 0.0056640695097481470287 + 0x1.09292d1c8621348cp-7, // 0.0080920667906392630755 + 0x1.b89ab5fe793a6062p-8, // 0.0067230886765842542487 + 0x1.28e9c44dc5e26e66p-9, // 0.002265267575136470585 + 0x1.c2c43245d445addap-13, // 0.00021494216542320112406 + 0x1.4ee247035a03e13p-20 // 1.2475397291548388385e-06 +]; + +const real [] Q = [ + 0x1p-1, // 0.5 + 0x1.fffffffffff635eap-4, // 0.12499999999999782631 + 0x1.1fffffff8a2bea1p-4, // 0.070312499993302227507 + 0x1.8ffffe6f40ec2078p-5, // 0.04882812208418620146 + 0x1.323f4dbf7f4d0c2ap-5, // 0.037383701182969303058 + 0x1.efe8a028541b50bp-6, // 0.030267864612427881354 + 0x1.9d58c49718d6617cp-6, // 0.025228683455123323041 + 0x1.4d1a8d2292ff6e2ep-6, // 0.020331037356569904872 + 0x1.b637687027d664aap-7, // 0.013373304362459048444 + 0x1.687a640ae5c71332p-8, // 0.0055004591221382442135 + 0x1.0f9c30a94a1dcb4ep-10, // 0.001036110372590318803 + 0x1.d321746708e92d48p-15 // 5.568631677757315399e-05 +]; + + const real LOG4 = 0x1.62e42fefa39ef358p+0; // log(4) + + if( x > real.epsilon ) + return poly(x,P) - log(x) * poly(x,Q); + if ( x == 0.0L ) + return real.infinity; + return LOG4 - 0.5L * log(x); +} + +/** + * Complete elliptic integral of the second kind + * + * Approximates the integral + * + * E(m) = $(INTEGRATE 0, &pi/2) sqrt( 1- m $(POWER sin, 2) t) dt + * + * Where m = 1 - m1, using the approximation + * + * P(x) - x log x Q(x). + * + * Though there are no singularities, the argument m1 is used + * rather than m for compatibility with ellipticKComplete(). + * + * E(1) = 1; E(0) = &pi/2. + * m must be in the range 0 <= m <= 1. + */ + +real ellipticEComplete(real x) +in { + assert(x>=0 && x<=1.0); +} +body { +const real [] P = [ + 0x1.c5c85fdf473f78f2p-2, // 0.44314718055994670505 + 0x1.d1591f9e9a66477p-5, // 0.056805192715569305834 + 0x1.65af6a7a61f587cp-6, // 0.021831373198011179718 + 0x1.7a4d48ed00d5745ap-7, // 0.011544857605264509506 + 0x1.d4f5fe4f93b60688p-8, // 0.0071557756305783152481 + 0x1.4cb71c73bac8656ap-8, // 0.0050768322432573952962 + 0x1.4a9167859a1d0312p-8, // 0.0050440671671840438539 + 0x1.dd296daa7b1f5b7ap-8, // 0.0072809117068399675418 + 0x1.04f2c29224ba99b6p-7, // 0.0079635095646944542686 + 0x1.0f5820e2d80194d8p-8, // 0.0041403847015715420009 + 0x1.95ee634752ca69b6p-11, // 0.00077425232385887751162 + 0x1.0c58aa9ab404f4fp-15 // 3.1989378120323412946e-05 +]; + +const real [] Q = [ + 0x1.ffffffffffffb1cep-3, // 0.24999999999999986434 + 0x1.7ffffffff29eaa0cp-4, // 0.093749999999239422678 + 0x1.dfffffbd51eb098p-5, // 0.058593749514839092674 + 0x1.5dffd791cb834c92p-5, // 0.04272453406734691973 + 0x1.1397b63c2f09a8ep-5, // 0.033641677787700181541 + 0x1.c567cde5931e75bcp-6, // 0.02767367465121309044 + 0x1.75e0cae852be9ddcp-6, // 0.022819708015315777007 + 0x1.12bb968236d4e434p-6, // 0.016768357258894633433 + 0x1.1f6572c1c402d07cp-7, // 0.0087706384979640787504 + 0x1.452c6909f88b8306p-9, // 0.0024808767529843311337 + 0x1.1f7504e72d664054p-12, // 0.00027414045912208516032 + 0x1.ad17054dc46913e2p-18 // 6.3939381343012054851e-06 +]; + if (x==0) + return 1.0L; + return 1.0L + x * poly(x,P) - log(x) * (x * poly(x,Q) ); +} + +unittest { + assert( ellipticF(1, 0)==1); + assert(ellipticEComplete(0)==1); + assert(ellipticEComplete(1)==PI_2); + assert(feqrel(ellipticKComplete(1),PI_2)>= real.mant_dig-1); + assert(ellipticKComplete(0)==real.infinity); +// assert(ellipticKComplete(1)==0); //-real.infinity); + + real x=0.5653L; + assert(ellipticKComplete(1-x) == ellipticF(PI_2, x) ); + assert(ellipticEComplete(1-x) == ellipticE(PI_2, x) ); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/math/ErrorFunction.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/math/ErrorFunction.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,466 @@ +/** + * Error Functions and Normal Distribution. + * + * Copyright: Copyright (C) 1984, 1995, 2000 Stephen L. Moshier + * Code taken from the Cephes Math Library Release 2.3: January, 1995 + * License: BSD style: $(LICENSE) + * Authors: Stephen L. Moshier, ported to D by Don Clugston + */ +/** + * Macros: + * NAN = $(RED NAN) + * SUP = $0 + * GAMMA = Γ + * INTEGRAL = ∫ + * INTEGRATE = $(BIG ∫$(SMALL $1)$2) + * POWER = $1$2 + * BIGSUM = $(BIG Σ $2$(SMALL $1)) + * CHOOSE = $(BIG () $(SMALL $1)$(SMALL $2) $(BIG )) + * TABLE_SV = + * + * $0
Special Values
+ * SVH = $(TR $(TH $1) $(TH $2)) + * SV = $(TR $(TD $1) $(TD $2)) + */ +module tango.math.ErrorFunction; + +import tango.math.Math; +import tango.math.IEEE; // only required for unit tests + +version(Windows) { // Some tests only pass on DMD Windows + version(DigitalMars) { + version = FailsOnLinux; +} +} + +const real SQRT2PI = 0x1.40d931ff62705966p+1L; // 2.5066282746310005024 +const real EXP_2 = 0.13533528323661269189L; /* exp(-2) */ + +private { + +/* erfc(x) = exp(-x^2) P(1/x)/Q(1/x) + 1/8 <= 1/x <= 1 + Peak relative error 5.8e-21 */ +const real [] P = [ -0x1.30dfa809b3cc6676p-17, 0x1.38637cd0913c0288p+18, + 0x1.2f015e047b4476bp+22, 0x1.24726f46aa9ab08p+25, 0x1.64b13c6395dc9c26p+27, + 0x1.294c93046ad55b5p+29, 0x1.5962a82f92576dap+30, 0x1.11a709299faba04ap+31, + 0x1.11028065b087be46p+31, 0x1.0d8ef40735b097ep+30 +]; + +const real [] Q = [ 0x1.14d8e2a72dec49f4p+19, 0x1.0c880ff467626e1p+23, + 0x1.04417ef060b58996p+26, 0x1.404e61ba86df4ebap+28, 0x1.0f81887bc82b873ap+30, + 0x1.4552a5e39fb49322p+31, 0x1.11779a0ceb2a01cep+32, 0x1.3544dd691b5b1d5cp+32, + 0x1.a91781f12251f02ep+31, 0x1.0d8ef3da605a1c86p+30, 1.0 +]; + + +/* erfc(x) = exp(-x^2) 1/x R(1/x^2) / S(1/x^2) + 1/128 <= 1/x < 1/8 + Peak relative error 1.9e-21 */ +const real [] R = [ 0x1.b9f6d8b78e22459ep-6, 0x1.1b84686b0a4ea43ap-1, + 0x1.b8f6aebe96000c2ap+1, 0x1.cb1dbedac27c8ec2p+2, 0x1.cf885f8f572a4c14p+1 +]; + +const real [] S = [ + 0x1.87ae3cae5f65eb5ep-5, 0x1.01616f266f306d08p+0, 0x1.a4abe0411eed6c22p+2, + 0x1.eac9ce3da600abaap+3, 0x1.5752a9ac2faebbccp+3, 1.0 +]; + +/* erf(x) = x P(x^2)/Q(x^2) + 0 <= x <= 1 + Peak relative error 7.6e-23 */ +const real [] T = [ 0x1.0da01654d757888cp+20, 0x1.2eb7497bc8b4f4acp+17, + 0x1.79078c19530f72a8p+15, 0x1.4eaf2126c0b2c23p+11, 0x1.1f2ea81c9d272a2ep+8, + 0x1.59ca6e2d866e625p+2, 0x1.c188e0b67435faf4p-4 +]; + +const real [] U = [ 0x1.dde6025c395ae34ep+19, 0x1.c4bc8b6235df35aap+18, + 0x1.8465900e88b6903ap+16, 0x1.855877093959ffdp+13, 0x1.e5c44395625ee358p+9, + 0x1.6a0fed103f1c68a6p+5, 1.0 +]; + +} + +/** + * Complementary error function + * + * erfc(x) = 1 - erf(x), and has high relative accuracy for + * values of x far from zero. (For values near zero, use erf(x)). + * + * 1 - erf(x) = 2/ $(SQRT)(π) + * $(INTEGRAL x, $(INFINITY)) exp( - $(POWER t, 2)) dt + * + * + * For small x, erfc(x) = 1 - erf(x); otherwise rational + * approximations are computed. + * + * A special function expx2(x) is used to suppress error amplification + * in computing exp(-x^2). + */ +real erfc(real a) +{ + if (a == real.infinity) + return 0.0; + if (a == -real.infinity) + return 2.0; + + real x; + + if (a < 0.0L ) + x = -a; + else + x = a; + if (x < 1.0) + return 1.0 - erf(a); + + real z = -a * a; + + if (z < -MAXLOG){ +// mtherr( "erfcl", UNDERFLOW ); + if (a < 0) return 2.0; + else return 0.0; + } + + /* Compute z = exp(z). */ + z = expx2(a, -1); + real y = 1.0/x; + + real p, q; + + if( x < 8.0 ) y = z * rationalPoly(y, P, Q); + else y = z * y * rationalPoly(y * y, R, S); + + if (a < 0.0L) + y = 2.0L - y; + + if (y == 0.0) { +// mtherr( "erfcl", UNDERFLOW ); + if (a < 0) return 2.0; + else return 0.0; + } + + return y; +} + + +private { +/* Exponentially scaled erfc function + exp(x^2) erfc(x) + valid for x > 1. + Use with normalDistribution and expx2. */ + +real erfce(real x) +{ + real p, q; + + real y = 1.0/x; + + if (x < 8.0) { + return rationalPoly( y, P, Q); + } else { + return y * rationalPoly(y*y, R, S); + } +} + +} + +/** + * Error function + * + * The integral is + * + * erf(x) = 2/ $(SQRT)(π) + * $(INTEGRAL 0, x) exp( - $(POWER t, 2)) dt + * + * The magnitude of x is limited to about 106.56 for IEEE 80-bit + * arithmetic; 1 or -1 is returned outside this range. + * + * For 0 <= |x| < 1, a rational polynomials are used; otherwise + * erf(x) = 1 - erfc(x). + * + * ACCURACY: + * Relative error: + * arithmetic domain # trials peak rms + * IEEE 0,1 50000 2.0e-19 5.7e-20 + */ +real erf(real x) +{ + if (x == 0.0) + return x; // deal with negative zero + if (x == -real.infinity) + return -1.0; + if (x == real.infinity) + return 1.0; + if (abs(x) > 1.0L) + return 1.0L - erfc(x); + + real z = x * x; + return x * rationalPoly(z, T, U); +} + +debug(UnitTest) { +unittest { + // High resolution test points. + const real erfc0_250 = 0.723663330078125 + 1.0279753638067014931732235184287934646022E-5; + const real erfc0_375 = 0.5958709716796875 + 1.2118885490201676174914080878232469565953E-5; + const real erfc0_500 = 0.4794921875 + 7.9346869534623172533461080354712635484242E-6; + const real erfc0_625 = 0.3767547607421875 + 4.3570693945275513594941232097252997287766E-6; + const real erfc0_750 = 0.2888336181640625 + 1.0748182422368401062165408589222625794046E-5; + const real erfc0_875 = 0.215911865234375 + 1.3073705765341685464282101150637224028267E-5; + const real erfc1_000 = 0.15728759765625 + 1.1609394035130658779364917390740703933002E-5; + const real erfc1_125 = 0.111602783203125 + 8.9850951672359304215530728365232161564636E-6; + + const real erf0_875 = (1-0.215911865234375) - 1.3073705765341685464282101150637224028267E-5; + + + assert(feqrel(erfc(0.250L), erfc0_250 )>=real.mant_dig-1); + assert(feqrel(erfc(0.375L), erfc0_375 )>=real.mant_dig-0); + assert(feqrel(erfc(0.500L), erfc0_500 )>=real.mant_dig-1); + assert(feqrel(erfc(0.625L), erfc0_625 )>=real.mant_dig-1); + assert(feqrel(erfc(0.750L), erfc0_750 )>=real.mant_dig-1); + assert(feqrel(erfc(0.875L), erfc0_875 )>=real.mant_dig-4); + version(FailsOnLinux) assert(feqrel(erfc(1.000L), erfc1_000 )>=real.mant_dig-0); + assert(feqrel(erfc(1.125L), erfc1_125 )>=real.mant_dig-2); + assert(feqrel(erf(0.875L), erf0_875 )>=real.mant_dig-1); + // The DMC implementation of erfc() fails this next test (just) + assert(feqrel(erfc(4.1L),0.67000276540848983727e-8L)>=real.mant_dig-4); + + assert(isIdentical(erf(0.0),0.0)); + assert(isIdentical(erf(-0.0),-0.0)); + assert(erf(real.infinity) == 1.0); + assert(erf(-real.infinity) == -1.0); + assert(isIdentical(erf(NaN(0xDEF)),NaN(0xDEF))); + assert(isIdentical(erfc(NaN(0xDEF)),NaN(0xDEF))); + assert(isIdentical(erfc(real.infinity),0.0)); + assert(erfc(-real.infinity) == 2.0); + assert(erfc(0) == 1.0); +} +} + +/* + * Exponential of squared argument + * + * Computes y = exp(x*x) while suppressing error amplification + * that would ordinarily arise from the inexactness of the + * exponential argument x*x. + * + * If sign < 0, the result is inverted; i.e., y = exp(-x*x) . + * + * ACCURACY: + * Relative error: + * arithmetic domain # trials peak rms + * IEEE -106.566, 106.566 10^5 1.6e-19 4.4e-20 + */ + +real expx2(real x, int sign) +{ + /* + Cephes Math Library Release 2.9: June, 2000 + Copyright 2000 by Stephen L. Moshier + */ + const real M = 32768.0; + const real MINV = 3.0517578125e-5L; + + x = abs(x); + if (sign < 0) + x = -x; + + /* Represent x as an exact multiple of M plus a residual. + M is a power of 2 chosen so that exp(m * m) does not overflow + or underflow and so that |x - m| is small. */ + real m = MINV * floor(M * x + 0.5L); + real f = x - m; + + /* x^2 = m^2 + 2mf + f^2 */ + real u = m * m; + real u1 = 2 * m * f + f * f; + + if (sign < 0) { + u = -u; + u1 = -u1; + } + + if ((u+u1) > MAXLOG) + return real.infinity; + + /* u is exact, u1 is small. */ + return exp(u) * exp(u1); +} + + +package { +/* +Computes the normal distribution function. + +The normal (or Gaussian, or bell-shaped) distribution is +defined as: + +normalDist(x) = 1/$(SQRT) π $(INTEGRAL -$(INFINITY), x) exp( - $(POWER t, 2)/2) dt + = 0.5 + 0.5 * erf(x/sqrt(2)) + = 0.5 * erfc(- x/sqrt(2)) + +To maintain accuracy at high values of x, use +normalDistribution(x) = 1 - normalDistribution(-x). + +Accuracy: +Within a few bits of machine resolution over the entire +range. + +References: +$(LINK http://www.netlib.org/cephes/ldoubdoc.html), +G. Marsaglia, "Evaluating the Normal Distribution", +Journal of Statistical Software 11, (July 2004). +*/ +real normalDistributionImpl(real a) +{ + real x = a * SQRT1_2; + real z = abs(x); + + if( z < 1.0 ) + return 0.5L + 0.5L * erf(x); + else { + /* See below for erfce. */ + real y = 0.5L * erfce(z); + /* Multiply by exp(-x^2 / 2) */ + z = expx2(a, -1); + y = y * sqrt(z); + if( x > 0.0L ) + y = 1.0L - y; + return y; + } +} + +} + +debug(UnitTest) { +unittest { +assert(fabs(normalDistributionImpl(1L) - (0.841344746068543))< 0.0000000000000005); +assert(isIdentical(normalDistributionImpl(NaN(0x325)), NaN(0x325))); +} +} + +package { +/* + * Inverse of Normal distribution function + * + * Returns the argument, x, for which the area under the + * Normal probability density function (integrated from + * minus infinity to x) is equal to p. + * + * For small arguments 0 < p < exp(-2), the program computes + * z = sqrt( -2 log(p) ); then the approximation is + * x = z - log(z)/z - (1/z) P(1/z) / Q(1/z) . + * For larger arguments, x/sqrt(2 pi) = w + w^3 R(w^2)/S(w^2)) , + * where w = p - 0.5 . + */ +real normalDistributionInvImpl(real p) +in { + assert(p>=0.0L && p<=1.0L, "Domain error"); +} +body +{ +const real P0[] = [ -0x1.758f4d969484bfdcp-7, 0x1.53cee17a59259dd2p-3, + -0x1.ea01e4400a9427a2p-1, 0x1.61f7504a0105341ap+1, -0x1.09475a594d0399f6p+2, + 0x1.7c59e7a0df99e3e2p+1, -0x1.87a81da52edcdf14p-1, 0x1.1fb149fd3f83600cp-7 +]; + +const real Q0[] = [ -0x1.64b92ae791e64bb2p-7, 0x1.7585c7d597298286p-3, + -0x1.40011be4f7591ce6p+0, 0x1.1fc067d8430a425ep+2, -0x1.21008ffb1e7ccdf2p+3, + 0x1.3d1581cf9bc12fccp+3, -0x1.53723a89fd8f083cp+2, 1.0 +]; + +const real P1[] = [ 0x1.20ceea49ea142f12p-13, 0x1.cbe8a7267aea80bp-7, + 0x1.79fea765aa787c48p-2, 0x1.d1f59faa1f4c4864p+1, 0x1.1c22e426a013bb96p+4, + 0x1.a8675a0c51ef3202p+5, 0x1.75782c4f83614164p+6, 0x1.7a2f3d90948f1666p+6, + 0x1.5cd116ee4c088c3ap+5, 0x1.1361e3eb6e3cc20ap+2 +]; + +const real Q1[] = [ 0x1.3a4ce1406cea98fap-13, 0x1.f45332623335cda2p-7, + 0x1.98f28bbd4b98db1p-2, 0x1.ec3b24f9c698091cp+1, 0x1.1cc56ecda7cf58e4p+4, + 0x1.92c6f7376bf8c058p+5, 0x1.4154c25aa47519b4p+6, 0x1.1b321d3b927849eap+6, + 0x1.403a5f5a4ce7b202p+4, 1.0 +]; + +const real P2[] = [ 0x1.8c124a850116a6d8p-21, 0x1.534abda3c2fb90bap-13, + 0x1.29a055ec93a4718cp-7, 0x1.6468e98aad6dd474p-3, 0x1.3dab2ef4c67a601cp+0, + 0x1.e1fb3a1e70c67464p+1, 0x1.b6cce8035ff57b02p+2, 0x1.9f4c9e749ff35f62p+1 +]; + +const real Q2[] = [ 0x1.af03f4fc0655e006p-21, 0x1.713192048d11fb2p-13, + 0x1.4357e5bbf5fef536p-7, 0x1.7fdac8749985d43cp-3, 0x1.4a080c813a2d8e84p+0, + 0x1.c3a4b423cdb41bdap+1, 0x1.8160694e24b5557ap+2, 1.0 +]; + +const real P3[] = [ -0x1.55da447ae3806168p-34, -0x1.145635641f8778a6p-24, + -0x1.abf46d6b48040128p-17, -0x1.7da550945da790fcp-11, -0x1.aa0b2a31157775fap-8, + 0x1.b11d97522eed26bcp-3, 0x1.1106d22f9ae89238p+1, 0x1.029a358e1e630f64p+1 +]; + +const real Q3[] = [ -0x1.74022dd5523e6f84p-34, -0x1.2cb60d61e29ee836p-24, + -0x1.d19e6ec03a85e556p-17, -0x1.9ea2a7b4422f6502p-11, -0x1.c54b1e852f107162p-8, + 0x1.e05268dd3c07989ep-3, 0x1.239c6aff14afbf82p+1, 1.0 +]; + + if(p<=0.0L || p>=1.0L) { + if (p == 0.0L) { + return -real.infinity; + } + if( p == 1.0L ) { + return real.infinity; + } + return NaN(TANGO_NAN.NORMALDISTRIBUTION_INV_DOMAIN); + } + int code = 1; + real y = p; + if( y > (1.0L - EXP_2) ) { + y = 1.0L - y; + code = 0; + } + + real x, z, y2, x0, x1; + + if ( y > EXP_2 ) { + y = y - 0.5L; + y2 = y * y; + x = y + y * (y2 * rationalPoly( y2, P0, Q0)); + return x * SQRT2PI; + } + + x = sqrt( -2.0L * log(y) ); + x0 = x - log(x)/x; + z = 1.0L/x; + if ( x < 8.0L ) { + x1 = z * rationalPoly( z, P1, Q1); + } else if( x < 32.0L ) { + x1 = z * rationalPoly( z, P2, Q2); + } else { + x1 = z * rationalPoly( z, P3, Q3); + } + x = x0 - x1; + if ( code != 0 ) { + x = -x; + } + return x; +} + +} + + +debug(UnitTest) { +unittest { + // TODO: Use verified test points. + // The values below are from Excel 2003. +assert(fabs(normalDistributionInvImpl(0.001) - (-3.09023230616779))< 0.00000000000005); +assert(fabs(normalDistributionInvImpl(1e-50) - (-14.9333375347885))< 0.00000000000005); +assert(feqrel(normalDistributionInvImpl(0.999), -normalDistributionInvImpl(0.001))>real.mant_dig-6); + +// Excel 2003 gets all the following values wrong! +assert(normalDistributionInvImpl(0.0)==-real.infinity); +assert(normalDistributionInvImpl(1.0)==real.infinity); +assert(normalDistributionInvImpl(0.5)==0); +// (Excel 2003 returns norminv(p) = -30 for all p < 1e-200). +// The value tested here is the one the function returned in Jan 2006. +real unknown1 = normalDistributionInvImpl(1e-250L); +assert( fabs(unknown1 -(-33.79958617269L) ) < 0.00000005); +} +} \ No newline at end of file diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/math/GammaFunction.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/math/GammaFunction.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,1463 @@ +/** + * Implementation of the gamma and beta functions, and their integrals. + * + * License: BSD style: $(LICENSE) + * Copyright: Based on the CEPHES math library, which is + * Copyright (C) 1994 Stephen L. Moshier (moshier@world.std.com). + * Authors: Stephen L. Moshier (original C code). Conversion to D by Don Clugston + * + * +Macros: + * TABLE_SV = + * + * $0
Special Values
+ * SVH = $(TR $(TH $1) $(TH $2)) + * SV = $(TR $(TD $1) $(TD $2)) + * GAMMA = Γ + * INTEGRATE = $(BIG ∫$(SMALL $1)$2) + * POWER = $1$2 + * NAN = $(RED NAN) + */ +module tango.math.GammaFunction; +private import tango.math.Math; +private import tango.math.IEEE; +private import tango.math.ErrorFunction; + +version(Windows) { // Some tests only pass on DMD Windows + version(DigitalMars) { + version = FailsOnLinux; +} +} + +//------------------------------------------------------------------ + +/// The maximum value of x for which gamma(x) < real.infinity. +const real MAXGAMMA = 1755.5483429L; + +private { + +const real SQRT2PI = 2.50662827463100050242E0L; // sqrt(2pi) + +// Polynomial approximations for gamma and loggamma. + +const real GammaNumeratorCoeffs[] = [ 1.0, + 0x1.acf42d903366539ep-1, 0x1.73a991c8475f1aeap-2, 0x1.c7e918751d6b2a92p-4, + 0x1.86d162cca32cfe86p-6, 0x1.0c378e2e6eaf7cd8p-8, 0x1.dc5c66b7d05feb54p-12, + 0x1.616457b47e448694p-15 +]; + +const real GammaDenominatorCoeffs[] = [ 1.0, + 0x1.a8f9faae5d8fc8bp-2, -0x1.cb7895a6756eebdep-3, -0x1.7b9bab006d30652ap-5, + 0x1.c671af78f312082ep-6, -0x1.a11ebbfaf96252dcp-11, -0x1.447b4d2230a77ddap-10, + 0x1.ec1d45bb85e06696p-13,-0x1.d4ce24d05bd0a8e6p-17 +]; + +const real GammaSmallCoeffs[] = [ 1.0, + 0x1.2788cfc6fb618f52p-1, -0x1.4fcf4026afa2f7ecp-1, -0x1.5815e8fa24d7e306p-5, + 0x1.5512320aea2ad71ap-3, -0x1.59af0fb9d82e216p-5, -0x1.3b4b61d3bfdf244ap-7, + 0x1.d9358e9d9d69fd34p-8, -0x1.38fc4bcbada775d6p-10 +]; + +const real GammaSmallNegCoeffs[] = [ -1.0, + 0x1.2788cfc6fb618f54p-1, 0x1.4fcf4026afa2bc4cp-1, -0x1.5815e8fa2468fec8p-5, + -0x1.5512320baedaf4b6p-3, -0x1.59af0fa283baf07ep-5, 0x1.3b4a70de31e05942p-7, + 0x1.d9398be3bad13136p-8, 0x1.291b73ee05bcbba2p-10 +]; + +const real logGammaStirlingCoeffs[] = [ + 0x1.5555555555553f98p-4, -0x1.6c16c16c07509b1p-9, 0x1.a01a012461cbf1e4p-11, + -0x1.3813089d3f9d164p-11, 0x1.b911a92555a277b8p-11, -0x1.ed0a7b4206087b22p-10, + 0x1.402523859811b308p-8 +]; + +const real logGammaNumerator[] = [ + -0x1.0edd25913aaa40a2p+23, -0x1.31c6ce2e58842d1ep+24, -0x1.f015814039477c3p+23, + -0x1.74ffe40c4b184b34p+22, -0x1.0d9c6d08f9eab55p+20, -0x1.54c6b71935f1fc88p+16, + -0x1.0e761b42932b2aaep+11 +]; + +const real logGammaDenominator[] = [ + -0x1.4055572d75d08c56p+24, -0x1.deeb6013998e4d76p+24, -0x1.106f7cded5dcc79ep+24, + -0x1.25e17184848c66d2p+22, -0x1.301303b99a614a0ap+19, -0x1.09e76ab41ae965p+15, + -0x1.00f95ced9e5f54eep+9, 1.0 +]; + +/* + * Helper function: Gamma function computed by Stirling's formula. + * + * Stirling's formula for the gamma function is: + * + * $(GAMMA)(x) = sqrt(2 π) xx-0.5 exp(-x) (1 + 1/x P(1/x)) + * + */ +real gammaStirling(real x) +{ + // CEPHES code Copyright 1994 by Stephen L. Moshier + + const real SmallStirlingCoeffs[] = [ + 0x1.55555555555543aap-4, 0x1.c71c71c720dd8792p-9, -0x1.5f7268f0b5907438p-9, + -0x1.e13cd410e0477de6p-13, 0x1.9b0f31643442616ep-11, 0x1.2527623a3472ae08p-14, + -0x1.37f6bc8ef8b374dep-11,-0x1.8c968886052b872ap-16, 0x1.76baa9c6d3eeddbcp-11 + ]; + + const real LargeStirlingCoeffs[] = [ 1.0L, + 8.33333333333333333333E-2L, 3.47222222222222222222E-3L, + -2.68132716049382716049E-3L, -2.29472093621399176955E-4L, + 7.84039221720066627474E-4L, 6.97281375836585777429E-5L + ]; + + real w = 1.0L/x; + real y = exp(x); + if ( x > 1024.0L ) { + // For large x, use rational coefficients from the analytical expansion. + w = poly(w, LargeStirlingCoeffs); + // Avoid overflow in pow() + real v = pow( x, 0.5L * x - 0.25L ); + y = v * (v / y); + } + else { + w = 1.0L + w * poly( w, SmallStirlingCoeffs); + y = pow( x, x - 0.5L ) / y; + } + y = SQRT2PI * y * w; + return y; +} + +} // private + +/**************** + * The sign of $(GAMMA)(x). + * + * Returns -1 if $(GAMMA)(x) < 0, +1 if $(GAMMA)(x) > 0, + * $(NAN) if sign is indeterminate. + */ +real sgnGamma(real x) +{ + /* Author: Don Clugston. */ + if (isNaN(x)) return x; + if (x > 0) return 1.0; + if (x < -1/real.epsilon) { + // Large negatives lose all precision + return NaN(TANGO_NAN.SGNGAMMA); + } +// if (remquo(x, -1.0, n) == 0) { + long n = rndlong(x); + if (x == n) { + return x == 0 ? copysign(1, x) : NaN(TANGO_NAN.SGNGAMMA); + } + return n & 1 ? 1.0 : -1.0; +} + +debug(UnitTest) { +unittest { + assert(sgnGamma(5.0) == 1.0); + assert(isNaN(sgnGamma(-3.0))); + assert(sgnGamma(-0.1) == -1.0); + assert(sgnGamma(-55.1) == 1.0); + assert(isNaN(sgnGamma(-real.infinity))); + assert(isIdentical(sgnGamma(NaN(0xABC)), NaN(0xABC))); +} +} + +/***************************************************** + * The Gamma function, $(GAMMA)(x) + * + * $(GAMMA)(x) is a generalisation of the factorial function + * to real and complex numbers. + * Like x!, $(GAMMA)(x+1) = x*$(GAMMA)(x). + * + * Mathematically, if z.re > 0 then + * $(GAMMA)(z) = $(INTEGRATE 0, ∞) $(POWER t, z-1)$(POWER e, -t) dt + * + * $(TABLE_SV + * $(SVH x, $(GAMMA)(x) ) + * $(SV $(NAN), $(NAN) ) + * $(SV ±0.0, ±∞) + * $(SV integer > 0, (x-1)! ) + * $(SV integer < 0, $(NAN) ) + * $(SV +∞, +∞ ) + * $(SV -∞, $(NAN) ) + * ) + */ +real gamma(real x) +{ +/* Based on code from the CEPHES library. + * CEPHES code Copyright 1994 by Stephen L. Moshier + * + * Arguments |x| <= 13 are reduced by recurrence and the function + * approximated by a rational function of degree 7/8 in the + * interval (2,3). Large arguments are handled by Stirling's + * formula. Large negative arguments are made positive using + * a reflection formula. + */ + + real q, z; + if (isNaN(x)) return x; + if (x == -x.infinity) return NaN(TANGO_NAN.GAMMA_DOMAIN); + if ( fabs(x) > MAXGAMMA ) return real.infinity; + if (x==0) return 1.0/x; // +- infinity depending on sign of x, create an exception. + + q = fabs(x); + + if ( q > 13.0L ) { + // Large arguments are handled by Stirling's + // formula. Large negative arguments are made positive using + // the reflection formula. + + if ( x < 0.0L ) { + int sgngam = 1; // sign of gamma. + real p = floor(q); + if (p == q) + return NaN(TANGO_NAN.GAMMA_DOMAIN); // poles for all integers <0. + int intpart = cast(int)(p); + if ( (intpart & 1) == 0 ) + sgngam = -1; + z = q - p; + if ( z > 0.5L ) { + p += 1.0L; + z = q - p; + } + z = q * sin( PI * z ); + z = fabs(z) * gammaStirling(q); + if ( z <= PI/real.max ) return sgngam * real.infinity; + return sgngam * PI/z; + } else { + return gammaStirling(x); + } + } + + // Arguments |x| <= 13 are reduced by recurrence and the function + // approximated by a rational function of degree 7/8 in the + // interval (2,3). + + z = 1.0L; + while ( x >= 3.0L ) { + x -= 1.0L; + z *= x; + } + + while ( x < -0.03125L ) { + z /= x; + x += 1.0L; + } + + if ( x <= 0.03125L ) { + if ( x == 0.0L ) + return NaN(TANGO_NAN.GAMMA_POLE); + else { + if ( x < 0.0L ) { + x = -x; + return z / (x * poly( x, GammaSmallNegCoeffs )); + } else { + return z / (x * poly( x, GammaSmallCoeffs )); + } + } + } + + while ( x < 2.0L ) { + z /= x; + x += 1.0L; + } + if ( x == 2.0L ) return z; + + x -= 2.0L; + return z * poly( x, GammaNumeratorCoeffs ) / poly( x, GammaDenominatorCoeffs ); +} + +debug(UnitTest) { +unittest { + // gamma(n) = factorial(n-1) if n is an integer. + real fact = 1.0L; + for (int i=1; fact real.mant_dig-15); + fact *= (i*1.0L); + } + assert(gamma(0.0) == real.infinity); + assert(gamma(-0.0) == -real.infinity); + assert(isNaN(gamma(-1.0))); + assert(isNaN(gamma(-15.0))); + assert(isIdentical(gamma(NaN(0xABC)), NaN(0xABC))); + assert(gamma(real.infinity) == real.infinity); + assert(gamma(real.max) == real.infinity); + assert(isNaN(gamma(-real.infinity))); + assert(gamma(real.min*real.epsilon) == real.infinity); + assert(gamma(MAXGAMMA)< real.infinity); + assert(gamma(MAXGAMMA*2) == real.infinity); + + // Test some high-precision values (50 decimal digits) + const real SQRT_PI = 1.77245385090551602729816748334114518279754945612238L; + + version(FailsOnLinux) assert(feqrel(gamma(0.5L), SQRT_PI) == real.mant_dig); + + assert(feqrel(gamma(1.0/3.L), 2.67893853470774763365569294097467764412868937795730L) >= real.mant_dig-2); + assert(feqrel(gamma(0.25L), + 3.62560990822190831193068515586767200299516768288006) >= real.mant_dig-1); + assert(feqrel(gamma(1.0/5.0L), + 4.59084371199880305320475827592915200343410999829340L) >= real.mant_dig-1); +} +} + +/***************************************************** + * Natural logarithm of gamma function. + * + * Returns the base e (2.718...) logarithm of the absolute + * value of the gamma function of the argument. + * + * For reals, logGamma is equivalent to log(fabs(gamma(x))). + * + * $(TABLE_SV + * $(SVH x, logGamma(x) ) + * $(SV $(NAN), $(NAN) ) + * $(SV integer <= 0, +∞ ) + * $(SV ±∞, +∞ ) + * ) + */ +real logGamma(real x) +{ + /* Author: Don Clugston. Based on code from the CEPHES library. + * CEPHES code Copyright 1994 by Stephen L. Moshier + * + * For arguments greater than 33, the logarithm of the gamma + * function is approximated by the logarithmic version of + * Stirling's formula using a polynomial approximation of + * degree 4. Arguments between -33 and +33 are reduced by + * recurrence to the interval [2,3] of a rational approximation. + * The cosecant reflection formula is employed for arguments + * less than -33. + */ + real q, w, z, f, nx; + + if (isNaN(x)) return x; + if (fabs(x) == x.infinity) return x.infinity; + + if( x < -34.0L ) { + q = -x; + w = logGamma(q); + real p = floor(q); + if ( p == q ) return real.infinity; + int intpart = cast(int)(p); + real sgngam = 1; + if ( (intpart & 1) == 0 ) + sgngam = -1; + z = q - p; + if ( z > 0.5L ) { + p += 1.0L; + z = p - q; + } + z = q * sin( PI * z ); + if ( z == 0.0L ) return sgngam * real.infinity; + /* z = LOGPI - logl( z ) - w; */ + z = log( PI/z ) - w; + return z; + } + + if( x < 13.0L ) { + z = 1.0L; + nx = floor( x + 0.5L ); + f = x - nx; + while ( x >= 3.0L ) { + nx -= 1.0L; + x = nx + f; + z *= x; + } + while ( x < 2.0L ) { + if( fabs(x) <= 0.03125 ) { + if ( x == 0.0L ) return real.infinity; + if ( x < 0.0L ) { + x = -x; + q = z / (x * poly( x, GammaSmallNegCoeffs)); + } else + q = z / (x * poly( x, GammaSmallCoeffs)); + return log( fabs(q) ); + } + z /= nx + f; + nx += 1.0L; + x = nx + f; + } + z = fabs(z); + if ( x == 2.0L ) + return log(z); + x = (nx - 2.0L) + f; + real p = x * rationalPoly( x, logGammaNumerator, logGammaDenominator); + return log(z) + p; + } + + // const real MAXLGM = 1.04848146839019521116e+4928L; + // if( x > MAXLGM ) return sgngaml * real.infinity; + + const real LOGSQRT2PI = 0.91893853320467274178L; // log( sqrt( 2*pi ) ) + + q = ( x - 0.5L ) * log(x) - x + LOGSQRT2PI; + if (x > 1.0e10L) return q; + real p = 1.0L / (x*x); + q += poly( p, logGammaStirlingCoeffs ) / x; + return q ; +} + +debug(UnitTest) { +unittest { + assert(isIdentical(logGamma(NaN(0xDEF)), NaN(0xDEF))); + assert(logGamma(real.infinity) == real.infinity); + assert(logGamma(-1.0) == real.infinity); + assert(logGamma(0.0) == real.infinity); + assert(logGamma(-50.0) == real.infinity); + assert(isIdentical(0.0L, logGamma(1.0L))); + assert(isIdentical(0.0L, logGamma(2.0L))); + assert(logGamma(real.min*real.epsilon) == real.infinity); + assert(logGamma(-real.min*real.epsilon) == real.infinity); + + // x, correct loggamma(x), correct d/dx loggamma(x). + static real[] testpoints = [ + 8.0L, 8.525146484375L + 1.48766904143001655310E-5, 2.01564147795560999654E0L, + 8.99993896484375e-1L, 6.6375732421875e-2L + 5.11505711292524166220E-6L, -7.54938684259372234258E-1, + 7.31597900390625e-1L, 2.2369384765625e-1 + 5.21506341809849792422E-6L, -1.13355566660398608343E0L, + 2.31639862060546875e-1L, 1.3686676025390625L + 1.12609441752996145670E-5L, -4.56670961813812679012E0, + 1.73162841796875L, -8.88214111328125e-2L + 3.36207740803753034508E-6L, 2.33339034686200586920E-1L, + 1.23162841796875L, -9.3902587890625e-2L + 1.28765089229009648104E-5L, -2.49677345775751390414E-1L, + 7.3786976294838206464e19L, 3.301798506038663053312e21L - 1.656137564136932662487046269677E5L, + 4.57477139169563904215E1L, + 1.08420217248550443401E-19L, 4.36682586669921875e1L + 1.37082843669932230418E-5L, + -9.22337203685477580858E18L, + 1.0L, 0.0L, -5.77215664901532860607E-1L, + 2.0L, 0.0L, 4.22784335098467139393E-1L, + -0.5L, 1.2655029296875L + 9.19379714539648894580E-6L, 3.64899739785765205590E-2L, + -1.5L, 8.6004638671875e-1L + 6.28657731014510932682E-7L, 7.03156640645243187226E-1L, + -2.5L, -5.6243896484375E-2L + 1.79986700949327405470E-7, 1.10315664064524318723E0L, + -3.5L, -1.30902099609375L + 1.43111007079536392848E-5L, 1.38887092635952890151E0L + ]; + // TODO: test derivatives as well. + for (int i=0; i real.mant_dig-5); + if (testpoints[i] real.mant_dig-5); + } + } + assert(logGamma(-50.2) == log(fabs(gamma(-50.2)))); + assert(logGamma(-0.008) == log(fabs(gamma(-0.008)))); + assert(feqrel(logGamma(-38.8),log(fabs(gamma(-38.8)))) > real.mant_dig-4); + assert(feqrel(logGamma(1500.0L),log(gamma(1500.0L))) > real.mant_dig-2); +} +} + +private { +const real MAXLOG = 0x1.62e42fefa39ef358p+13L; // log(real.max) +const real MINLOG = -0x1.6436716d5406e6d8p+13L; // log(real.min*real.epsilon) = log(smallest denormal) +const real BETA_BIG = 9.223372036854775808e18L; +const real BETA_BIGINV = 1.084202172485504434007e-19L; +} + +/** Beta function + * + * The beta function is defined as + * + * beta(x, y) = (Γ(x) Γ(y))/Γ(x + y) + */ +real beta(real x, real y) +{ + if ((x+y)> MAXGAMMA) { + return exp(logGamma(x) + logGamma(y) - logGamma(x+y)); + } else return gamma(x)*gamma(y)/gamma(x+y); +} + +debug(UnitTest) { +unittest { + assert(isIdentical(beta(NaN(0xABC), 4), NaN(0xABC))); + assert(isIdentical(beta(2, NaN(0xABC)), NaN(0xABC))); +} +} + +/** Incomplete beta integral + * + * Returns incomplete beta integral of the arguments, evaluated + * from zero to x. The regularized incomplete beta function is defined as + * + * betaIncomplete(a, b, x) = Γ(a+b)/(Γ(a) Γ(b)) * + * $(INTEGRATE 0, x) $(POWER t, a-1)$(POWER (1-t),b-1) dt + * + * and is the same as the the cumulative distribution function. + * + * The domain of definition is 0 <= x <= 1. In this + * implementation a and b are restricted to positive values. + * The integral from x to 1 may be obtained by the symmetry + * relation + * + * betaIncompleteCompl(a, b, x ) = betaIncomplete( b, a, 1-x ) + * + * The integral is evaluated by a continued fraction expansion + * or, when b*x is small, by a power series. + */ +real betaIncomplete(real aa, real bb, real xx ) +{ + if (!(aa>0 && bb>0)) { + if (isNaN(aa)) return aa; + if (isNaN(bb)) return bb; + return NaN(TANGO_NAN.BETA_DOMAIN); // domain error + } + if (!(xx>0 && xx<1.0)) { + if (isNaN(xx)) return xx; + if ( xx == 0.0L ) return 0.0; + if ( xx == 1.0L ) return 1.0; + return NaN(TANGO_NAN.BETA_DOMAIN); // domain error + } + if ( (bb * xx) <= 1.0L && xx <= 0.95L) { + return betaDistPowerSeries(aa, bb, xx); + } + real x; + real xc; // = 1 - x + + real a, b; + int flag = 0; + + /* Reverse a and b if x is greater than the mean. */ + if( xx > (aa/(aa+bb)) ) { + // here x > aa/(aa+bb) and (bb*x>1 or x>0.95) + flag = 1; + a = bb; + b = aa; + xc = xx; + x = 1.0L - xx; + } else { + a = aa; + b = bb; + xc = 1.0L - xx; + x = xx; + } + + if( flag == 1 && (b * x) <= 1.0L && x <= 0.95L) { + // here xx > aa/(aa+bb) and ((bb*xx>1) or xx>0.95) and (aa*(1-xx)<=1) and xx > 0.05 + return 1.0 - betaDistPowerSeries(a, b, x); // note loss of precision + } + + real w; + // Choose expansion for optimal convergence + // One is for x * (a+b+2) < (a+1), + // the other is for x * (a+b+2) > (a+1). + real y = x * (a+b-2.0L) - (a-1.0L); + if( y < 0.0L ) { + w = betaDistExpansion1( a, b, x ); + } else { + w = betaDistExpansion2( a, b, x ) / xc; + } + + /* Multiply w by the factor + a b + x (1-x) Gamma(a+b) / ( a Gamma(a) Gamma(b) ) . */ + + y = a * log(x); + real t = b * log(xc); + if ( (a+b) < MAXGAMMA && fabs(y) < MAXLOG && fabs(t) < MAXLOG ) { + t = pow(xc,b); + t *= pow(x,a); + t /= a; + t *= w; + t *= gamma(a+b) / (gamma(a) * gamma(b)); + } else { + /* Resort to logarithms. */ + y += t + logGamma(a+b) - logGamma(a) - logGamma(b); + y += log(w/a); + + t = exp(y); +/+ + // There seems to be a bug in Cephes at this point. + // Problems occur for y > MAXLOG, not y < MINLOG. + if( y < MINLOG ) { + t = 0.0L; + } else { + t = exp(y); + } ++/ + } + if( flag == 1 ) { +/+ // CEPHES includes this code, but I think it is erroneous. + if( t <= real.epsilon ) { + t = 1.0L - real.epsilon; + } else ++/ + t = 1.0L - t; + } + return t; +} + +/** Inverse of incomplete beta integral + * + * Given y, the function finds x such that + * + * betaIncomplete(a, b, x) == y + * + * Newton iterations or interval halving is used. + */ +real betaIncompleteInv(real aa, real bb, real yy0 ) +{ + real a, b, y0, d, y, x, x0, x1, lgm, yp, di, dithresh, yl, yh, xt; + int i, rflg, dir, nflg; + + if (isNaN(yy0)) return yy0; + if (isNaN(aa)) return aa; + if (isNaN(bb)) return bb; + if( yy0 <= 0.0L ) + return 0.0L; + if( yy0 >= 1.0L ) + return 1.0L; + x0 = 0.0L; + yl = 0.0L; + x1 = 1.0L; + yh = 1.0L; + if( aa <= 1.0L || bb <= 1.0L ) { + dithresh = 1.0e-7L; + rflg = 0; + a = aa; + b = bb; + y0 = yy0; + x = a/(a+b); + y = betaIncomplete( a, b, x ); + nflg = 0; + goto ihalve; + } else { + nflg = 0; + dithresh = 1.0e-4L; + } + + /* approximation to inverse function */ + + yp = -normalDistributionInvImpl( yy0 ); + + if( yy0 > 0.5L ) { + rflg = 1; + a = bb; + b = aa; + y0 = 1.0L - yy0; + yp = -yp; + } else { + rflg = 0; + a = aa; + b = bb; + y0 = yy0; + } + + lgm = (yp * yp - 3.0L)/6.0L; + x = 2.0L/( 1.0L/(2.0L * a-1.0L) + 1.0L/(2.0L * b - 1.0L) ); + d = yp * sqrt( x + lgm ) / x + - ( 1.0L/(2.0L * b - 1.0L) - 1.0L/(2.0L * a - 1.0L) ) + * (lgm + (5.0L/6.0L) - 2.0L/(3.0L * x)); + d = 2.0L * d; + if( d < MINLOG ) { + x = 1.0L; + goto under; + } + x = a/( a + b * exp(d) ); + y = betaIncomplete( a, b, x ); + yp = (y - y0)/y0; + if( fabs(yp) < 0.2 ) + goto newt; + + /* Resort to interval halving if not close enough. */ +ihalve: + + dir = 0; + di = 0.5L; + for( i=0; i<400; i++ ) { + if( i != 0 ) { + x = x0 + di * (x1 - x0); + if( x == 1.0L ) { + x = 1.0L - real.epsilon; + } + if( x == 0.0L ) { + di = 0.5; + x = x0 + di * (x1 - x0); + if( x == 0.0 ) + goto under; + } + y = betaIncomplete( a, b, x ); + yp = (x1 - x0)/(x1 + x0); + if( fabs(yp) < dithresh ) + goto newt; + yp = (y-y0)/y0; + if( fabs(yp) < dithresh ) + goto newt; + } + if( y < y0 ) { + x0 = x; + yl = y; + if( dir < 0 ) { + dir = 0; + di = 0.5L; + } else if( dir > 3 ) + di = 1.0L - (1.0L - di) * (1.0L - di); + else if( dir > 1 ) + di = 0.5L * di + 0.5L; + else + di = (y0 - y)/(yh - yl); + dir += 1; + if( x0 > 0.95L ) { + if( rflg == 1 ) { + rflg = 0; + a = aa; + b = bb; + y0 = yy0; + } else { + rflg = 1; + a = bb; + b = aa; + y0 = 1.0 - yy0; + } + x = 1.0L - x; + y = betaIncomplete( a, b, x ); + x0 = 0.0; + yl = 0.0; + x1 = 1.0; + yh = 1.0; + goto ihalve; + } + } else { + x1 = x; + if( rflg == 1 && x1 < real.epsilon ) { + x = 0.0L; + goto done; + } + yh = y; + if( dir > 0 ) { + dir = 0; + di = 0.5L; + } + else if( dir < -3 ) + di = di * di; + else if( dir < -1 ) + di = 0.5L * di; + else + di = (y - y0)/(yh - yl); + dir -= 1; + } + } + // loss of precision has occurred + + //mtherr( "incbil", PLOSS ); + if( x0 >= 1.0L ) { + x = 1.0L - real.epsilon; + goto done; + } + if( x <= 0.0L ) { +under: + // underflow has occurred + //mtherr( "incbil", UNDERFLOW ); + x = 0.0L; + goto done; + } + +newt: + + if ( nflg ) { + goto done; + } + nflg = 1; + lgm = logGamma(a+b) - logGamma(a) - logGamma(b); + + for( i=0; i<15; i++ ) { + /* Compute the function at this point. */ + if ( i != 0 ) + y = betaIncomplete(a,b,x); + if ( y < yl ) { + x = x0; + y = yl; + } else if( y > yh ) { + x = x1; + y = yh; + } else if( y < y0 ) { + x0 = x; + yl = y; + } else { + x1 = x; + yh = y; + } + if( x == 1.0L || x == 0.0L ) + break; + /* Compute the derivative of the function at this point. */ + d = (a - 1.0L) * log(x) + (b - 1.0L) * log(1.0L - x) + lgm; + if ( d < MINLOG ) { + goto done; + } + if ( d > MAXLOG ) { + break; + } + d = exp(d); + /* Compute the step to the next approximation of x. */ + d = (y - y0)/d; + xt = x - d; + if ( xt <= x0 ) { + y = (x - x0) / (x1 - x0); + xt = x0 + 0.5L * y * (x - x0); + if( xt <= 0.0L ) + break; + } + if ( xt >= x1 ) { + y = (x1 - x) / (x1 - x0); + xt = x1 - 0.5L * y * (x1 - x); + if ( xt >= 1.0L ) + break; + } + x = xt; + if ( fabs(d/x) < (128.0L * real.epsilon) ) + goto done; + } + /* Did not converge. */ + dithresh = 256.0L * real.epsilon; + goto ihalve; + +done: + if ( rflg ) { + if( x <= real.epsilon ) + x = 1.0L - real.epsilon; + else + x = 1.0L - x; + } + return x; +} + +debug(UnitTest) { +unittest { // also tested by the normal distribution + // check NaN propagation + assert(isIdentical(betaIncomplete(NaN(0xABC),2,3), NaN(0xABC))); + assert(isIdentical(betaIncomplete(7,NaN(0xABC),3), NaN(0xABC))); + assert(isIdentical(betaIncomplete(7,15,NaN(0xABC)), NaN(0xABC))); + assert(isIdentical(betaIncompleteInv(NaN(0xABC),1,17), NaN(0xABC))); + assert(isIdentical(betaIncompleteInv(2,NaN(0xABC),8), NaN(0xABC))); + assert(isIdentical(betaIncompleteInv(2,3, NaN(0xABC)), NaN(0xABC))); + + assert(isNaN(betaIncomplete(-1, 2, 3))); + + assert(betaIncomplete(1, 2, 0)==0); + assert(betaIncomplete(1, 2, 1)==1); + assert(isNaN(betaIncomplete(1, 2, 3))); + assert(betaIncompleteInv(1, 1, 0)==0); + assert(betaIncompleteInv(1, 1, 1)==1); + + // Test some values against Microsoft Excel 2003. + + assert(fabs(betaIncomplete(8, 10, 0.2) - 0.010_934_315_236_957_2L) < 0.000_000_000_5); + assert(fabs(betaIncomplete(2, 2.5, 0.9) - 0.989_722_597_604_107L) < 0.000_000_000_000_5); + assert(fabs(betaIncomplete(1000, 800, 0.5) - 1.17914088832798E-06L) < 0.000_000_05e-6); + + assert(fabs(betaIncomplete(0.0001, 10000, 0.0001) - 0.999978059369989L) < 0.000_000_000_05); + + assert(fabs(betaIncompleteInv(5, 10, 0.2) - 0.229121208190918L) < 0.000_000_5L); + assert(fabs(betaIncompleteInv(4, 7, 0.8) - 0.483657360076904L) < 0.000_000_5L); + + // Coverage tests. I don't have correct values for these tests, but + // these values cover most of the code, so they are useful for + // regression testing. + // Extensive testing failed to increase the coverage. It seems likely that about + // half the code in this function is unnecessary; there is potential for + // significant improvement over the original CEPHES code. + +// Excel 2003 gives clearly erroneous results (betadist>1) when a and x are tiny and b is huge. +// The correct results are for these next tests are unknown. + +// real testpoint1 = betaIncomplete(1e-10, 5e20, 8e-21); +// assert(testpoint1 == 0x1.ffff_ffff_c906_404cp-1L); + + assert(betaIncomplete(0.01, 327726.7, 0.545113) == 1.0); + assert(betaIncompleteInv(0.01, 8e-48, 5.45464e-20)==1-real.epsilon); + assert(betaIncompleteInv(0.01, 8e-48, 9e-26)==1-real.epsilon); + + assert(betaIncomplete(0.01, 498.437, 0.0121433) == 0x1.ffff_8f72_19197402p-1); + assert(1- betaIncomplete(0.01, 328222, 4.0375e-5) == 0x1.5f62926b4p-30); + version(FailsOnLinux) assert(betaIncompleteInv(0x1.b3d151fbba0eb18p+1, 1.2265e-19, 2.44859e-18)==0x1.c0110c8531d0952cp-1); + version(FailsOnLinux) assert(betaIncompleteInv(0x1.ff1275ae5b939bcap-41, 4.6713e18, 0.0813601)==0x1.f97749d90c7adba8p-63); + real a1; + a1 = 3.40483; + version(FailsOnLinux) assert(betaIncompleteInv(a1, 4.0640301659679627772e19L, 0.545113)== 0x1.ba8c08108aaf5d14p-109); + real b1; + b1= 2.82847e-25; + version(FailsOnLinux) assert(betaIncompleteInv(0.01, b1, 9e-26) == 0x1.549696104490aa9p-830); + + // --- Problematic cases --- + // This is a situation where the series expansion fails to converge + assert( isNaN(betaIncompleteInv(0.12167, 4.0640301659679627772e19L, 0.0813601))); + // This next result is almost certainly erroneous. + assert(betaIncomplete(1.16251e20, 2.18e39, 5.45e-20)==-real.infinity); +} +} + +private { +// Implementation functions + +// Continued fraction expansion #1 for incomplete beta integral +// Use when x < (a+1)/(a+b+2) +real betaDistExpansion1(real a, real b, real x ) +{ + real xk, pk, pkm1, pkm2, qk, qkm1, qkm2; + real k1, k2, k3, k4, k5, k6, k7, k8; + real r, t, ans; + int n; + + k1 = a; + k2 = a + b; + k3 = a; + k4 = a + 1.0L; + k5 = 1.0L; + k6 = b - 1.0L; + k7 = k4; + k8 = a + 2.0L; + + pkm2 = 0.0L; + qkm2 = 1.0L; + pkm1 = 1.0L; + qkm1 = 1.0L; + ans = 1.0L; + r = 1.0L; + n = 0; + const real thresh = 3.0L * real.epsilon; + do { + xk = -( x * k1 * k2 )/( k3 * k4 ); + pk = pkm1 + pkm2 * xk; + qk = qkm1 + qkm2 * xk; + pkm2 = pkm1; + pkm1 = pk; + qkm2 = qkm1; + qkm1 = qk; + + xk = ( x * k5 * k6 )/( k7 * k8 ); + pk = pkm1 + pkm2 * xk; + qk = qkm1 + qkm2 * xk; + pkm2 = pkm1; + pkm1 = pk; + qkm2 = qkm1; + qkm1 = qk; + + if( qk != 0.0L ) + r = pk/qk; + if( r != 0.0L ) { + t = fabs( (ans - r)/r ); + ans = r; + } else { + t = 1.0L; + } + + if( t < thresh ) + return ans; + + k1 += 1.0L; + k2 += 1.0L; + k3 += 2.0L; + k4 += 2.0L; + k5 += 1.0L; + k6 -= 1.0L; + k7 += 2.0L; + k8 += 2.0L; + + if( (fabs(qk) + fabs(pk)) > BETA_BIG ) { + pkm2 *= BETA_BIGINV; + pkm1 *= BETA_BIGINV; + qkm2 *= BETA_BIGINV; + qkm1 *= BETA_BIGINV; + } + if( (fabs(qk) < BETA_BIGINV) || (fabs(pk) < BETA_BIGINV) ) { + pkm2 *= BETA_BIG; + pkm1 *= BETA_BIG; + qkm2 *= BETA_BIG; + qkm1 *= BETA_BIG; + } + } + while( ++n < 400 ); +// loss of precision has occurred +// mtherr( "incbetl", PLOSS ); + return ans; +} + +// Continued fraction expansion #2 for incomplete beta integral +// Use when x > (a+1)/(a+b+2) +real betaDistExpansion2(real a, real b, real x ) +{ + real xk, pk, pkm1, pkm2, qk, qkm1, qkm2; + real k1, k2, k3, k4, k5, k6, k7, k8; + real r, t, ans, z; + + k1 = a; + k2 = b - 1.0L; + k3 = a; + k4 = a + 1.0L; + k5 = 1.0L; + k6 = a + b; + k7 = a + 1.0L; + k8 = a + 2.0L; + + pkm2 = 0.0L; + qkm2 = 1.0L; + pkm1 = 1.0L; + qkm1 = 1.0L; + z = x / (1.0L-x); + ans = 1.0L; + r = 1.0L; + int n = 0; + const real thresh = 3.0L * real.epsilon; + do { + + xk = -( z * k1 * k2 )/( k3 * k4 ); + pk = pkm1 + pkm2 * xk; + qk = qkm1 + qkm2 * xk; + pkm2 = pkm1; + pkm1 = pk; + qkm2 = qkm1; + qkm1 = qk; + + xk = ( z * k5 * k6 )/( k7 * k8 ); + pk = pkm1 + pkm2 * xk; + qk = qkm1 + qkm2 * xk; + pkm2 = pkm1; + pkm1 = pk; + qkm2 = qkm1; + qkm1 = qk; + + if( qk != 0.0L ) + r = pk/qk; + if( r != 0.0L ) { + t = fabs( (ans - r)/r ); + ans = r; + } else + t = 1.0L; + + if( t < thresh ) + return ans; + k1 += 1.0L; + k2 -= 1.0L; + k3 += 2.0L; + k4 += 2.0L; + k5 += 1.0L; + k6 += 1.0L; + k7 += 2.0L; + k8 += 2.0L; + + if( (fabs(qk) + fabs(pk)) > BETA_BIG ) { + pkm2 *= BETA_BIGINV; + pkm1 *= BETA_BIGINV; + qkm2 *= BETA_BIGINV; + qkm1 *= BETA_BIGINV; + } + if( (fabs(qk) < BETA_BIGINV) || (fabs(pk) < BETA_BIGINV) ) { + pkm2 *= BETA_BIG; + pkm1 *= BETA_BIG; + qkm2 *= BETA_BIG; + qkm1 *= BETA_BIG; + } + } while( ++n < 400 ); +// loss of precision has occurred +//mtherr( "incbetl", PLOSS ); + return ans; +} + +/* Power series for incomplete gamma integral. + Use when b*x is small. */ +real betaDistPowerSeries(real a, real b, real x ) +{ + real ai = 1.0L / a; + real u = (1.0L - b) * x; + real v = u / (a + 1.0L); + real t1 = v; + real t = u; + real n = 2.0L; + real s = 0.0L; + real z = real.epsilon * ai; + while( fabs(v) > z ) { + u = (n - b) * x / n; + t *= u; + v = t / (a + n); + s += v; + n += 1.0L; + } + s += t1; + s += ai; + + u = a * log(x); + if ( (a+b) < MAXGAMMA && fabs(u) < MAXLOG ) { + t = gamma(a+b)/(gamma(a)*gamma(b)); + s = s * t * pow(x,a); + } else { + t = logGamma(a+b) - logGamma(a) - logGamma(b) + u + log(s); + + if( t < MINLOG ) { + s = 0.0L; + } else + s = exp(t); + } + return s; +} + +} + +/*************************************** + * Incomplete gamma integral and its complement + * + * These functions are defined by + * + * gammaIncomplete = ( $(INTEGRATE 0, x) $(POWER e, -t) $(POWER t, a-1) dt )/ $(GAMMA)(a) + * + * gammaIncompleteCompl(a,x) = 1 - gammaIncomplete(a,x) + * = ($(INTEGRATE x, ∞) $(POWER e, -t) $(POWER t, a-1) dt )/ $(GAMMA)(a) + * + * In this implementation both arguments must be positive. + * The integral is evaluated by either a power series or + * continued fraction expansion, depending on the relative + * values of a and x. + */ +real gammaIncomplete(real a, real x ) +in { + assert(x >= 0); + assert(a > 0); +} +body { + /* left tail of incomplete gamma function: + * + * inf. k + * a -x - x + * x e > ---------- + * - - + * k=0 | (a+k+1) + * + */ + if (x==0) + return 0.0L; + + if ( (x > 1.0L) && (x > a ) ) + return 1.0L - gammaIncompleteCompl(a,x); + + real ax = a * log(x) - x - logGamma(a); +/+ + if( ax < MINLOGL ) return 0; // underflow + // { mtherr( "igaml", UNDERFLOW ); return( 0.0L ); } ++/ + ax = exp(ax); + + /* power series */ + real r = a; + real c = 1.0L; + real ans = 1.0L; + + do { + r += 1.0L; + c *= x/r; + ans += c; + } while( c/ans > real.epsilon ); + + return ans * ax/a; +} + +/** ditto */ +real gammaIncompleteCompl(real a, real x ) +in { + assert(x >= 0); + assert(a > 0); +} +body { + if (x==0) + return 1.0L; + if ( (x < 1.0L) || (x < a) ) + return 1.0L - gammaIncomplete(a,x); + + // DAC (Cephes bug fix): This is necessary to avoid + // spurious nans, eg + // log(x)-x = NaN when x = real.infinity + const real MAXLOGL = 1.1356523406294143949492E4L; + if (x > MAXLOGL) return 0; // underflow + + real ax = a * log(x) - x - logGamma(a); +//const real MINLOGL = -1.1355137111933024058873E4L; +// if ( ax < MINLOGL ) return 0; // underflow; + ax = exp(ax); + + + /* continued fraction */ + real y = 1.0L - a; + real z = x + y + 1.0L; + real c = 0.0L; + + real pk, qk, t; + + real pkm2 = 1.0L; + real qkm2 = x; + real pkm1 = x + 1.0L; + real qkm1 = z * x; + real ans = pkm1/qkm1; + + do { + c += 1.0L; + y += 1.0L; + z += 2.0L; + real yc = y * c; + pk = pkm1 * z - pkm2 * yc; + qk = qkm1 * z - qkm2 * yc; + if( qk != 0.0L ) { + real r = pk/qk; + t = fabs( (ans - r)/r ); + ans = r; + } else { + t = 1.0L; + } + pkm2 = pkm1; + pkm1 = pk; + qkm2 = qkm1; + qkm1 = qk; + + const real BIG = 9.223372036854775808e18L; + + if ( fabs(pk) > BIG ) { + pkm2 /= BIG; + pkm1 /= BIG; + qkm2 /= BIG; + qkm1 /= BIG; + } + } while ( t > real.epsilon ); + + return ans * ax; +} + +/** Inverse of complemented incomplete gamma integral + * + * Given a and y, the function finds x such that + * + * gammaIncompleteCompl( a, x ) = p. + * + * Starting with the approximate value x = a $(POWER t, 3), where + * t = 1 - d - normalDistributionInv(p) sqrt(d), + * and d = 1/9a, + * the routine performs up to 10 Newton iterations to find the + * root of incompleteGammaCompl(a,x) - p = 0. + */ +real gammaIncompleteComplInv(real a, real p) +in { + assert(p>=0 && p<= 1); + assert(a>0); +} +body { + if (p==0) return real.infinity; + + real y0 = p; + const real MAXLOGL = 1.1356523406294143949492E4L; + real x0, x1, x, yl, yh, y, d, lgm, dithresh; + int i, dir; + + /* bound the solution */ + x0 = real.max; + yl = 0.0L; + x1 = 0.0L; + yh = 1.0L; + dithresh = 4.0 * real.epsilon; + + /* approximation to inverse function */ + d = 1.0L/(9.0L*a); + y = 1.0L - d - normalDistributionInvImpl(y0) * sqrt(d); + x = a * y * y * y; + + lgm = logGamma(a); + + for( i=0; i<10; i++ ) { + if( x > x0 || x < x1 ) + goto ihalve; + y = gammaIncompleteCompl(a,x); + if ( y < yl || y > yh ) + goto ihalve; + if ( y < y0 ) { + x0 = x; + yl = y; + } else { + x1 = x; + yh = y; + } + /* compute the derivative of the function at this point */ + d = (a - 1.0L) * log(x0) - x0 - lgm; + if ( d < -MAXLOGL ) + goto ihalve; + d = -exp(d); + /* compute the step to the next approximation of x */ + d = (y - y0)/d; + x = x - d; + if ( i < 3 ) continue; + if ( fabs(d/x) < dithresh ) return x; + } + + /* Resort to interval halving if Newton iteration did not converge. */ +ihalve: + d = 0.0625L; + if ( x0 == real.max ) { + if( x <= 0.0L ) + x = 1.0L; + while( x0 == real.max ) { + x = (1.0L + d) * x; + y = gammaIncompleteCompl( a, x ); + if ( y < y0 ) { + x0 = x; + yl = y; + break; + } + d = d + d; + } + } + d = 0.5L; + dir = 0; + + for( i=0; i<400; i++ ) { + x = x1 + d * (x0 - x1); + y = gammaIncompleteCompl( a, x ); + lgm = (x0 - x1)/(x1 + x0); + if ( fabs(lgm) < dithresh ) + break; + lgm = (y - y0)/y0; + if ( fabs(lgm) < dithresh ) + break; + if ( x <= 0.0L ) + break; + if ( y > y0 ) { + x1 = x; + yh = y; + if ( dir < 0 ) { + dir = 0; + d = 0.5L; + } else if ( dir > 1 ) + d = 0.5L * d + 0.5L; + else + d = (y0 - yl)/(yh - yl); + dir += 1; + } else { + x0 = x; + yl = y; + if ( dir > 0 ) { + dir = 0; + d = 0.5L; + } else if ( dir < -1 ) + d = 0.5L * d; + else + d = (y0 - yl)/(yh - yl); + dir -= 1; + } + } + /+ + if( x == 0.0L ) + mtherr( "igamil", UNDERFLOW ); + +/ + return x; +} + +debug(UnitTest) { +unittest { +//Values from Excel's GammaInv(1-p, x, 1) +assert(fabs(gammaIncompleteComplInv(1, 0.5) - 0.693147188044814) < 0.00000005); +assert(fabs(gammaIncompleteComplInv(12, 0.99) - 5.42818075054289) < 0.00000005); +assert(fabs(gammaIncompleteComplInv(100, 0.8) - 91.5013985848288L) < 0.000005); + +assert(gammaIncomplete(1, 0)==0); +assert(gammaIncompleteCompl(1, 0)==1); +assert(gammaIncomplete(4545, real.infinity)==1); + +// Values from Excel's (1-GammaDist(x, alpha, 1, TRUE)) + +assert(fabs(1.0L-gammaIncompleteCompl(0.5, 2) - 0.954499729507309L) < 0.00000005); +assert(fabs(gammaIncomplete(0.5, 2) - 0.954499729507309L) < 0.00000005); +// Fixed Cephes bug: +assert(gammaIncompleteCompl(384, real.infinity)==0); +assert(gammaIncompleteComplInv(3, 0)==real.infinity); +} +} + +/** Digamma function +* +* The digamma function is the logarithmic derivative of the gamma function. +* +* digamma(x) = d/dx logGamma(x) +* +*/ +real digamma(real x) +{ + // Based on CEPHES, Stephen L. Moshier. + + // DAC: These values are Bn / n for n=2,4,6,8,10,12,14. + const real [] Bn_n = [ + 1.0L/(6*2), -1.0L/(30*4), 1.0L/(42*6), -1.0L/(30*8), + 5.0L/(66*10), -691.0L/(2730*12), 7.0L/(6*14) ]; + + real p, q, nz, s, w, y, z; + int i, n, negative; + + negative = 0; + nz = 0.0; + + if ( x <= 0.0 ) { + negative = 1; + q = x; + p = floor(q); + if( p == q ) { + return NaN(TANGO_NAN.GAMMA_POLE); // singularity. + } + /* Remove the zeros of tan(PI x) + * by subtracting the nearest integer from x + */ + nz = q - p; + if ( nz != 0.5 ) { + if ( nz > 0.5 ) { + p += 1.0; + nz = q - p; + } + nz = PI/tan(PI*nz); + } else { + nz = 0.0; + } + x = 1.0 - x; + } + + // check for small positive integer + if ((x <= 13.0) && (x == floor(x)) ) { + y = 0.0; + n = rndint(x); + // DAC: CEPHES bugfix. Cephes did this in reverse order, which + // created a larger roundoff error. + for (i=n-1; i>0; --i) { + y+=1.0L/i; + } + y -= EULERGAMMA; + goto done; + } + + s = x; + w = 0.0; + while ( s < 10.0 ) { + w += 1.0/s; + s += 1.0; + } + + if ( s < 1.0e17 ) { + z = 1.0/(s * s); + y = z * poly(z, Bn_n); + } else + y = 0.0; + + y = log(s) - 0.5L/s - y - w; + +done: + if ( negative ) { + y -= nz; + } + return y; +} + +import tango.stdc.stdio; +debug(UnitTest) { +unittest { + // Exact values + assert(digamma(1)== -EULERGAMMA); + assert(feqrel(digamma(0.25), -PI/2 - 3* LN2 - EULERGAMMA)>=real.mant_dig-6); + assert(feqrel(digamma(1.0L/6), -PI/2 *sqrt(3.0L) - 2* LN2 -1.5*log(3.0L) - EULERGAMMA)>=real.mant_dig-7); + assert(digamma(-5)!<>0); + assert(feqrel(digamma(2.5), -EULERGAMMA - 2*LN2 + 2.0 + 2.0L/3)>=real.mant_dig-9); + assert(isIdentical(digamma(NaN(0xABC)), NaN(0xABC))); + + for (int k=1; k<40; ++k) { + real y=0; + for (int u=k; u>=1; --u) { + y+= 1.0L/u; + } + assert(feqrel(digamma(k+1),-EULERGAMMA + y) >=real.mant_dig-2); + } + +// printf("%d %La %La %d %d\n", k+1, digamma(k+1), -EULERGAMMA + x, feqrel(digamma(k+1),-EULERGAMMA + y), feqrel(digamma(k+1), -EULERGAMMA + x)); +} +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/math/IEEE.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/math/IEEE.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,1704 @@ +/** + * Low-level Mathematical Functions which take advantage of the IEEE754 ABI. + * + * Copyright: Portions Copyright (C) 2001-2005 Digital Mars. + * License: BSD style: $(LICENSE), Digital Mars. + * Authors: Don Clugston, Walter Bright, Sean Kelly + */ +/* Portions of this code were taken from Phobos std.math, which has the following + * copyright notice: + * + * Author: + * Walter Bright + * Copyright: + * Copyright (c) 2001-2005 by Digital Mars, + * All Rights Reserved, + * www.digitalmars.com + * License: + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + *
    + *
  • The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + *
  • + *
  • Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + *
  • + *
  • This notice may not be removed or altered from any source + * distribution. + *
  • + *
+ */ +/** + * Macros: + * + * TABLE_SV = + * + * $0
Special Values
+ * SVH = $(TR $(TH $1) $(TH $2)) + * SV = $(TR $(TD $1) $(TD $2)) + * SVH3 = $(TR $(TH $1) $(TH $2) $(TH $3)) + * SV3 = $(TR $(TD $1) $(TD $2) $(TD $3)) + * NAN = $(RED NAN) + */ +module tango.math.IEEE; + +version(DigitalMars) +{ + version(D_InlineAsm_X86) + { + version = DigitalMars_D_InlineAsm_X86; + } +} + +version (X86){ + version = X86_Any; +} + +version (X86_64){ + version = X86_Any; +} + +version (DigitalMars_D_InlineAsm_X86) { + // Don't include this extra dependency unless we need to. + debug(UnitTest) { + static import tango.stdc.math; + } +} else { + // Needed for cos(), sin(), tan() on GNU. + static import tango.stdc.math; +} + +// Standard Tango NaN payloads. +// NOTE: These values may change in future Tango releases +// The lowest three bits indicate the cause of the NaN: +// 0 = error other than those listed below: +// 1 = domain error +// 2 = singularity +// 3 = range +// 4-7 = reserved. +enum TANGO_NAN { + // General errors + DOMAIN_ERROR = 0x0101, + SINGULARITY = 0x0102, + RANGE_ERROR = 0x0103, + // NaNs created by functions in the basic library + TAN_DOMAIN = 0x1001, + POW_DOMAIN = 0x1021, + GAMMA_DOMAIN = 0x1101, + GAMMA_POLE = 0x1102, + SGNGAMMA = 0x1112, + BETA_DOMAIN = 0x1131, + // NaNs from statistical functions + NORMALDISTRIBUTION_INV_DOMAIN = 0x2001, + STUDENTSDDISTRIBUTION_DOMAIN = 0x2011 +} + +/* Most of the functions depend on the format of the largest IEEE floating-point type. + * These code will differ depending on whether 'real' is 64, 80, or 128 bits, + * and whether it is a big-endian or little-endian architecture. + * Only three 'real' ABIs are currently supported: + * 64 bit Big-endian (eg PowerPC) + * 64 bit Little-endian + * 80 bit Little-endian, with implied bit (eg x87, Itanium). + * There is also an unsupported ABI which does not follow IEEE; several of its functions + * will generate run-time errors if used. + * 128 bit Big-endian (double-double, as used by GDC <= 0.23) + */ + +version(LittleEndian) { + static assert(real.mant_dig == 53 || real.mant_dig==64, + "Only 64-bit and 80-bit reals are supported for LittleEndian CPUs"); +} else { + static assert(real.mant_dig == 53 || real.mant_dig==106, + "Only 64-bit reals are supported for BigEndian CPUs. 106-bit reals have partial support"); +} + +/** IEEE exception status flags + + These flags indicate that an exceptional floating-point condition has occured. + They indicate that a NaN or an infinity has been generated, that a result + is inexact, or that a signalling NaN has been encountered. + The return values of the properties should be treated as booleans, although + each is returned as an int, for speed. + + Example: + ---- + real a=3.5; + // Set all the flags to zero + resetIeeeFlags(); + assert(!ieeeFlags.divByZero); + // Perform a division by zero. + a/=0.0L; + assert(a==real.infinity); + assert(ieeeFlags.divByZero); + // Create a NaN + a*=0.0L; + assert(ieeeFlags.invalid); + assert(isNaN(a)); + + // Check that calling func() has no effect on the + // status flags. + IeeeFlags f = ieeeFlags; + func(); + assert(ieeeFlags == f); + + ---- + */ +struct IeeeFlags +{ +private: + // The x87 FPU status register is 16 bits. + // The Pentium SSE2 status register is 32 bits. + int m_flags; + version (X86_Any) { + // Applies to both x87 status word (16 bits) and SSE2 status word(32 bits). + enum : int { + INEXACT_MASK = 0x20, + UNDERFLOW_MASK = 0x10, + OVERFLOW_MASK = 0x08, + DIVBYZERO_MASK = 0x04, + INVALID_MASK = 0x01 + } + // Don't bother about denormals, they are not supported on all CPUs. + //const int DENORMAL_MASK = 0x02; + } else version (PPC) { + // PowerPC FPSCR is a 32-bit register. + enum : int { + INEXACT_MASK = 0x600, + UNDERFLOW_MASK = 0x010, + OVERFLOW_MASK = 0x008, + DIVBYZERO_MASK = 0x020, + INVALID_MASK = 0xF80 + } + } +private: + static IeeeFlags getIeeeFlags() + { + // This is a highly time-critical operation, and + // should really be an intrinsic. In this case, we + // take advantage of the fact that for DMD + // a struct containing only a int is returned in EAX. + version(D_InlineAsm_X86) { + asm { + fstsw AX; + // NOTE: If compiler supports SSE2, need to OR the result with + // the SSE2 status register. + // Clear all irrelevant bits + and EAX, 0x03D; + } + } else { + assert(0, "Not yet supported"); + } + } + static void resetIeeeFlags() + { + version(D_InlineAsm_X86) { + asm { + fnclex; + } + } else { + assert(0, "Not yet supported"); + } + } +public: + /// The result cannot be represented exactly, so rounding occured. + /// (example: x = sin(0.1); } + int inexact() { return m_flags & INEXACT_MASK; } + /// A zero was generated by underflow (example: x = real.min*real.epsilon/2;) + int underflow() { return m_flags & UNDERFLOW_MASK; } + /// An infinity was generated by overflow (example: x = real.max*2;) + int overflow() { return m_flags & OVERFLOW_MASK; } + /// An infinity was generated by division by zero (example: x = 3/0.0; ) + int divByZero() { return m_flags & DIVBYZERO_MASK; } + /// A machine NaN was generated. (example: x = real.infinity * 0.0; ) + int invalid() { return m_flags & INVALID_MASK; } +} + +/// Return a snapshot of the current state of the floating-point status flags. +IeeeFlags ieeeFlags() { return IeeeFlags.getIeeeFlags(); } + +/// Set all of the floating-point status flags to false. +void resetIeeeFlags() { IeeeFlags.resetIeeeFlags; } + +/** IEEE rounding modes. + * The default mode is ROUNDTONEAREST. + */ +enum RoundingMode : short { + ROUNDTONEAREST = 0x0000, + ROUNDDOWN = 0x0400, + ROUNDUP = 0x0800, + ROUNDTOZERO = 0x0C00 +}; + +/** Change the rounding mode used for all floating-point operations. + * + * Returns the old rounding mode. + * + * When changing the rounding mode, it is almost always necessary to restore it + * at the end of the function. Typical usage: +--- + auto oldrounding = setIeeeRounding(RoundingMode.ROUNDDOWN); + scope (exit) setIeeeRounding(oldrounding); +--- + */ +RoundingMode setIeeeRounding(RoundingMode roundingmode) { + version(D_InlineAsm_X86) { + // TODO: For SSE/SSE2, do we also need to set the SSE rounding mode? + short cont; + asm { + fstcw cont; + mov CX, cont; + mov AX, cont; + and EAX, 0x0C00; // Form the return value + and CX, 0xF3FF; + or CX, roundingmode; + mov cont, CX; + fldcw cont; + } + } else { + assert(0, "Not yet supported"); + } +} + +/** Get the IEEE rounding mode which is in use. + * + */ +RoundingMode getIeeeRounding() { + version(D_InlineAsm_X86) { + // TODO: For SSE/SSE2, do we also need to check the SSE rounding mode? + short cont; + asm { + mov EAX, 0x0C00; + fstcw cont; + and AX, cont; + } + } else { + assert(0, "Not yet supported"); + } +} + +debug(UnitTest) { + version(D_InlineAsm_X86) { // Won't work for anything else yet +unittest { + real a = 3.5; + resetIeeeFlags(); + assert(!ieeeFlags.divByZero); + a /= 0.0L; + assert(ieeeFlags.divByZero); + assert(a == real.infinity); + a *= 0.0L; + assert(ieeeFlags.invalid); + assert(isNaN(a)); + a = real.max; + a *= 2; + assert(ieeeFlags.overflow); + a = real.min * real.epsilon; + a /= 99; + assert(ieeeFlags.underflow); + assert(ieeeFlags.inexact); + + int r = getIeeeRounding; + assert(r == RoundingMode.ROUNDTONEAREST); +} +} +} + +// Note: Itanium supports more precision options than this. SSE/SSE2 does not support any. +enum PrecisionControl : short { + PRECISION80 = 0x300, + PRECISION64 = 0x200, + PRECISION32 = 0x000 +}; + +/** Set the number of bits of precision used by 'real'. + * + * Returns: the old precision. + * This is not supported on all platforms. + */ +PrecisionControl reduceRealPrecision(PrecisionControl prec) { + version(D_InlineAsm_X86) { + short cont; + asm { + fstcw cont; + mov CX, cont; + mov AX, cont; + and EAX, 0x0300; // Form the return value + and CX, 0xFCFF; + or CX, prec; + mov cont, CX; + fldcw cont; + } + } else { + assert(0, "Not yet supported"); + } +} + +/** + * Separate floating point value into significand and exponent. + * + * Returns: + * Calculate and return x and exp such that + * value =x*2$(SUP exp) and + * .5 <= |x| < 1.0
+ * x has same sign as value. + * + * $(TABLE_SV + * value returns exp + * ±0.0 ±0.0 0 + * +∞ +∞ int.max + * -∞ -∞ int.min + * ±$(NAN) ±$(NAN) int.min + * ) + */ +real frexp(real value, out int exp) +{ + ushort* vu = cast(ushort*)&value; + long* vl = cast(long*)&value; + uint ex; + + static if (real.mant_dig==64) const ushort EXPMASK = 0x7FFF; + else const ushort EXPMASK = 0x7FF0; + + version(LittleEndian) { + static if (real.mant_dig==64) const int EXPONENTPOS = 4; + else const int EXPONENTPOS = 3; + } else { // BigEndian + const int EXPONENTPOS = 0; + } + + ex = vu[EXPONENTPOS] & EXPMASK; + static if (real.mant_dig == 64) { + // 80-bit reals + if (ex) { // If exponent is non-zero + if (ex == EXPMASK) { // infinity or NaN + // 80-bit reals + if (*vl & 0x7FFFFFFFFFFFFFFF) { // NaN + *vl |= 0xC000000000000000; // convert $(NAN)S to $(NAN)Q + exp = int.min; + } else if (vu[EXPONENTPOS] & 0x8000) { // negative infinity + exp = int.min; + } else { // positive infinity + exp = int.max; + } + } else { + exp = ex - 0x3FFE; + vu[EXPONENTPOS] = cast(ushort)((0x8000 & vu[EXPONENTPOS]) | 0x3FFE); + } + } else if (!*vl) { + // value is +-0.0 + exp = 0; + } else { + // denormal + int i = -0x3FFD; + do { + i--; + *vl <<= 1; + } while (*vl > 0); + exp = i; + vu[EXPONENTPOS] = cast(ushort)((0x8000 & vu[EXPONENTPOS]) | 0x3FFE); + } + } else static if(real.mant_dig==106) { + // 128-bit reals + assert(0, "Unsupported"); + } else { + // 64-bit reals + if (ex) { // If exponent is non-zero + if (ex == EXPMASK) { // infinity or NaN + if (*vl==0x7FF0_0000_0000_0000) { // positive infinity + exp = int.max; + } else if (*vl==0xFFF0_0000_0000_0000) { // negative infinity + exp = int.min; + } else { // NaN + *vl |= 0x0008_0000_0000_0000; // convert $(NAN)S to $(NAN)Q + exp = int.min; + } + } else { + exp = (ex - 0x3FE0) >>> 4; + ve[EXPONENTPOS] = (0x8000 & ve[EXPONENTPOS]) | 0x3FE0; + } + } else if (!(*vl & 0x7FFF_FFFF_FFFF_FFFF)) { + // value is +-0.0 + exp = 0; + } else { + // denormal + ushort sgn; + sgn = (0x8000 & ve[EXPONENTPOS])| 0x3FE0; + *vl &= 0x7FFF_FFFF_FFFF_FFFF; + + int i = -0x3FD+11; + do { + i--; + *vl <<= 1; + } while (*vl > 0); + exp = i; + ve[EXPONENTPOS] = sgn; + } + } + return value; +} + +debug(UnitTest) { + +unittest +{ + static real vals[][3] = // x,frexp,exp + [ + [0.0, 0.0, 0], + [-0.0, -0.0, 0], + [1.0, .5, 1], + [-1.0, -.5, 1], + [2.0, .5, 2], + [double.min/2.0, .5, -1022], + [real.infinity,real.infinity,int.max], + [-real.infinity,-real.infinity,int.min], + [real.nan,real.nan,int.min], + [-real.nan,-real.nan,int.min], + ]; + + int i; + + for (i = 0; i < vals.length; i++) { + real x = vals[i][0]; + real e = vals[i][1]; + int exp = cast(int)vals[i][2]; + int eptr; + real v = frexp(x, eptr); +// printf("frexp(%La) = %La, should be %La, eptr = %d, should be %d\n", x, v, e, eptr, exp); + assert(isIdentical(e, v)); + assert(exp == eptr); + + } + static if (real.mant_dig == 64) { + static real extendedvals[][3] = [ // x,frexp,exp + [0x1.a5f1c2eb3fe4efp+73, 0x1.A5F1C2EB3FE4EFp-1, 74], // normal + [0x1.fa01712e8f0471ap-1064, 0x1.fa01712e8f0471ap-1, -1063], + [real.min, .5, -16381], + [real.min/2.0L, .5, -16382] // denormal + ]; + + for (i = 0; i < extendedvals.length; i++) { + real x = extendedvals[i][0]; + real e = extendedvals[i][1]; + int exp = cast(int)extendedvals[i][2]; + int eptr; + real v = frexp(x, eptr); + assert(isIdentical(e, v)); + assert(exp == eptr); + + } + } +} +} + +/** + * Compute n * 2$(SUP exp) + * References: frexp + */ +real ldexp(real n, int exp) /* intrinsic */ +{ + version(DigitalMars_D_InlineAsm_X86) + { + asm + { + fild exp; + fld n; + fscale; + fstp st(1), st(0); + } + } + else + { + return tango.stdc.math.ldexpl(n, exp); + } +} + +/** + * Extracts the exponent of x as a signed integral value. + * + * If x is not a special value, the result is the same as + * cast(int)logb(x). + * + * Remarks: This function is consistent with IEEE754R, but it + * differs from the C function of the same name + * in the return value of infinity. (in C, ilogb(real.infinity)== int.max). + * Note that the special return values may all be equal. + * + * $(TABLE_SV + * x ilogb(x) invalid? + * 0 FP_ILOGB0 yes + * ±∞ FP_ILOGBINFINITY yes + * $(NAN) FP_ILOGBNAN yes + * ) + */ +int ilogb(real x) +{ + version(DigitalMars_D_InlineAsm_X86) + { + int y; + asm { + fld x; + fxtract; + fstp ST(0), ST; // drop significand + fistp y, ST(0); // and return the exponent + } + return y; + } else static if (real.mant_dig==64) { // 80-bit reals + short e = (cast(short *)&x)[4] & 0x7FFF; + if (e == 0x7FFF) { + // BUG: should also set the invalid exception + ulong s = *cast(ulong *)&x; + if (s == 0x8000_0000_0000_0000) { + return FP_ILOGBINFINITY; + } + else return FP_ILOGBNAN; + } + if (e==0) { + ulong s = *cast(ulong *)&x; + if (s == 0x0000_0000_0000_0000) { + // BUG: should also set the invalid exception + return FP_ILOGB0; + } + // Denormals + x *= 0x1p+63; + short f = (cast(short *)&x)[4]; + return -0x3FFF - (63-f); + + } + return e - 0x3FFF; + } else { + return tango.stdc.math.ilogbl(x); + } +} + +version (X86) +{ + const int FP_ILOGB0 = -int.max-1; + const int FP_ILOGBNAN = -int.max-1; + const int FP_ILOGBINFINITY = -int.max-1; +} else { + alias tango.stdc.math.FP_ILOGB0 FP_ILOGB0; + alias tango.stdc.math.FP_ILOGBNAN FP_ILOGBNAN; + const int FP_ILOGBINFINITY = int.max; +} + +debug(UnitTest) { +unittest { + assert(ilogb(1.0) == 0); + assert(ilogb(65536) == 16); + assert(ilogb(-65536) == 16); + assert(ilogb(1.0 / 65536) == -16); + assert(ilogb(real.nan) == FP_ILOGBNAN); + assert(ilogb(0.0) == FP_ILOGB0); + assert(ilogb(-0.0) == FP_ILOGB0); + // denormal + assert(ilogb(0.125 * real.min) == real.min_exp - 4); + assert(ilogb(real.infinity) == FP_ILOGBINFINITY); +} +} + +/** + * Extracts the exponent of x as a signed integral value. + * + * If x is subnormal, it is treated as if it were normalized. + * For a positive, finite x: + * + * ----- + * 1 <= $(I x) * FLT_RADIX$(SUP -logb(x)) < FLT_RADIX + * ----- + * + * $(TABLE_SV + * x logb(x) Divide by 0? + * ±∞ +∞ no + * ±0.0 -∞ yes + * ) + */ +real logb(real x) +{ + version(DigitalMars_D_InlineAsm_X86) + { + asm { + fld x; + fxtract; + fstp ST(0), ST; // drop significand + } + } else { + return tango.stdc.math.logbl(x); + } +} + +debug(UnitTest) { +unittest { + assert(logb(real.infinity)== real.infinity); + assert(isIdentical(logb(NaN(0xFCD)), NaN(0xFCD))); + assert(logb(1.0)== 0.0); + assert(logb(-65536) == 16); + assert(logb(0.0)== -real.infinity); + assert(ilogb(0.125*real.min) == real.min_exp-4); +} +} + +/** + * Efficiently calculates x * 2$(SUP n). + * + * scalbn handles underflow and overflow in + * the same fashion as the basic arithmetic operators. + * + * $(TABLE_SV + * x scalb(x) + * ±∞ ±∞ + * ±0.0 ±0.0 + * ) + */ +real scalbn(real x, int n) +{ + version(DigitalMars_D_InlineAsm_X86) + { + asm { + fild n; + fld x; + fscale; + fstp st(1), st; + } + } else { + // BUG: Not implemented in DMD + return tango.stdc.math.scalbnl(x, n); + } +} + +debug(UnitTest) { +unittest { + assert(scalbn(-real.infinity, 5) == -real.infinity); + assert(isIdentical(scalbn(NaN(0xABC),7), NaN(0xABC))); +} +} + +/** + * Returns the positive difference between x and y. + * + * If either of x or y is $(NAN), it will be returned. + * Returns: + * $(TABLE_SV + * $(SVH Arguments, fdim(x, y)) + * $(SV x > y, x - y) + * $(SV x <= y, +0.0) + * ) + */ +real fdim(real x, real y) +{ + return (x !<= y) ? x - y : +0.0; +} + +debug(UnitTest) { +unittest { + assert(isIdentical(fdim(NaN(0xABC), 58.2), NaN(0xABC))); +} +} + +/** + * Returns |x| + * + * $(TABLE_SV + * x fabs(x) + * ±0.0 +0.0 + * ±∞ +∞ + * ) + */ +real fabs(real x) /* intrinsic */ +{ + version(D_InlineAsm_X86) + { + asm + { + fld x; + fabs; + } + } + else + { + return tango.stdc.math.fabsl(x); + } +} + +unittest { + assert(isIdentical(fabs(NaN(0xABC)), NaN(0xABC))); +} + +/** + * Returns (x * y) + z, rounding only once according to the + * current rounding mode. + * + * BUGS: Not currently implemented - rounds twice. + */ +real fma(float x, float y, float z) +{ + return (x * y) + z; +} + +/** + * Calculate cos(y) + i sin(y). + * + * On x86 CPUs, this is a very efficient operation; + * almost twice as fast as calculating sin(y) and cos(y) + * seperately, and is the preferred method when both are required. + */ +creal expi(real y) +{ + version(DigitalMars_D_InlineAsm_X86) + { + asm + { + fld y; + fsincos; + fxch st(1), st(0); + } + } + else + { + return tango.stdc.math.cosl(y) + tango.stdc.math.sinl(y)*1i; + } +} + +debug(UnitTest) { +unittest +{ + assert(expi(1.3e5L) == tango.stdc.math.cosl(1.3e5L) + tango.stdc.math.sinl(1.3e5L) * 1i); + assert(expi(0.0L) == 1L + 0.0Li); +} +} + +/********************************* + * Returns !=0 if e is a NaN. + */ + +int isNaN(real x) +{ + static if (real.mant_dig==double.mant_dig) { + // 64-bit real + ulong* p = cast(ulong *)&x; + return (*p & 0x7FF0_0000 == 0x7FF0_0000) && *p & 0x000F_FFFF; + } else { + // 80-bit real + ushort* pe = cast(ushort *)&x; + ulong* ps = cast(ulong *)&x; + + return (pe[4] & 0x7FFF) == 0x7FFF && + *ps & 0x7FFFFFFFFFFFFFFF; + } +} + + +debug(UnitTest) { +unittest +{ + assert(isNaN(float.nan)); + assert(isNaN(-double.nan)); + assert(isNaN(real.nan)); + + assert(!isNaN(53.6)); + assert(!isNaN(float.infinity)); +} +} + +/** + * Returns !=0 if x is normalized. + * + * (Need one for each format because subnormal + * floats might be converted to normal reals) + */ +int isNormal(float x) +{ + uint *p = cast(uint *)&x; + uint e; + + e = *p & 0x7F800000; + return e && e != 0x7F800000; +} + +/** ditto */ +int isNormal(double d) +{ + uint *p = cast(uint *)&d; + uint e; + + e = p[1] & 0x7FF00000; + return e && e != 0x7FF00000; +} + +/** ditto */ +int isNormal(real x) +{ + static if (real.mant_dig == double.mant_dig) { + return isNormal(cast(double)x); + } else { + ushort* pe = cast(ushort *)&x; + long* ps = cast(long *)&x; + + return (pe[4] & 0x7FFF) != 0x7FFF && *ps < 0; + } +} + +debug(UnitTest) { +unittest +{ + float f = 3; + double d = 500; + real e = 10e+48; + + assert(isNormal(f)); + assert(isNormal(d)); + assert(isNormal(e)); +} +} + +/********************************* + * Is the binary representation of x identical to y? + * + * Same as ==, except that positive and negative zero are not identical, + * and two $(NAN)s are identical if they have the same 'payload'. + */ + +bool isIdentical(real x, real y) +{ + long* pxs = cast(long *)&x; + long* pys = cast(long *)&y; + static if (real.mant_dig == double.mant_dig){ + return pxs[0] == pys[0]; + } else { + ushort* pxe = cast(ushort *)&x; + ushort* pye = cast(ushort *)&y; + return pxe[4] == pye[4] && pxs[0] == pys[0]; + } +} + +/** ditto */ +bool isIdentical(ireal x, ireal y) { + return isIdentical(x.im, y.im); +} + +/** ditto */ +bool isIdentical(creal x, creal y) { + return isIdentical(x.re, y.re) && isIdentical(x.im, y.im); +} + + +debug(UnitTest) { +unittest { + assert(isIdentical(0.0, 0.0)); + assert(!isIdentical(0.0, -0.0)); + assert(isIdentical(NaN(0xABC), NaN(0xABC))); + assert(!isIdentical(NaN(0xABC), NaN(218))); + assert(isIdentical(1.234e56, 1.234e56)); + assert(isNaN(NaN(0x12345))); + assert(isIdentical(3.1 + NaN(0xDEF) * 1i, 3.1 + NaN(0xDEF)*1i)); + assert(!isIdentical(3.1+0.0i, 3.1-0i)); + assert(!isIdentical(0.0i, 2.5e58i)); +} +} + +/********************************* + * Is number subnormal? (Also called "denormal".) + * Subnormals have a 0 exponent and a 0 most significant significand bit. + */ + +/* Need one for each format because subnormal floats might + * be converted to normal reals. + */ + +int isSubnormal(float f) +{ + uint *p = cast(uint *)&f; + + return (*p & 0x7F800000) == 0 && *p & 0x007FFFFF; +} + +debug(UnitTest) { +unittest +{ + float f = 3.0; + + for (f = 1.0; !isSubnormal(f); f /= 2) + assert(f != 0); +} +} + +/// ditto + +int isSubnormal(double d) +{ + uint *p = cast(uint *)&d; + + return (p[1] & 0x7FF00000) == 0 && (p[0] || p[1] & 0x000FFFFF); +} + +debug(UnitTest) { +unittest +{ + double f; + + for (f = 1; !isSubnormal(f); f /= 2) + assert(f != 0); +} +} + +/// ditto + +int isSubnormal(real e) +{ + static if (real.mant_dig == double.mant_dig) { + return isSubnormal(cast(double)e); + } else { + ushort* pe = cast(ushort *)&e; + long* ps = cast(long *)&e; + + return (pe[4] & 0x7FFF) == 0 && *ps > 0; + } +} + +debug(UnitTest) { +unittest +{ + real f; + + for (f = 1; !isSubnormal(f); f /= 2) + assert(f != 0); +} +} + +/********************************* + * Return !=0 if x is ±0. + */ +int isZero(real x) +{ + static if (real.mant_dig == double.mant_dig) { + return ((*cast(ulong *)&x) & 0x7FFF_FFFF_FFFF_FFFF) == 0; + } else { + ushort* pe = cast(ushort *)&x; + ulong* ps = cast(ulong *)&x; + return (pe[4] & 0x7FFF) == 0 && *ps == 0; + } +} + +debug(UnitTest) { +unittest +{ + assert(isZero(0.0)); + assert(isZero(-0.0)); + assert(!isZero(2.5)); + assert(!isZero(real.min / 1000)); +} +} + +/********************************* + * Return !=0 if e is ±∞. + */ + +int isInfinity(real e) +{ + static if (real.mant_dig == double.mant_dig) { + return ((*cast(ulong *)&x)&0x7FFF_FFFF_FFFF_FFFF) == 0x7FF8_0000_0000_0000; + } else { + ushort* pe = cast(ushort *)&e; + ulong* ps = cast(ulong *)&e; + + return (pe[4] & 0x7FFF) == 0x7FFF && + *ps == 0x8000_0000_0000_0000; + } +} + +debug(UnitTest) { +unittest +{ + assert(isInfinity(float.infinity)); + assert(!isInfinity(float.nan)); + assert(isInfinity(double.infinity)); + assert(isInfinity(-real.infinity)); + + assert(isInfinity(-1.0 / 0.0)); +} +} + +/** + * Calculate the next largest floating point value after x. + * + * Return the least number greater than x that is representable as a real; + * thus, it gives the next point on the IEEE number line. + * This function is included in the forthcoming IEEE 754R standard. + * + * $(TABLE_SV + * $(SVH x, nextup(x) ) + * $(SV -∞, -real.max ) + * $(SV ±0.0, real.min*real.epsilon ) + * $(SV real.max, real.infinity ) + * $(SV real.infinity, real.infinity ) + * $(SV $(NAN), $(NAN) ) + * ) + * + * nextDoubleUp and nextFloatUp are the corresponding functions for + * the IEEE double and IEEE float number lines. + */ +real nextUp(real x) +{ + static if (real.mant_dig == double.mant_dig) { + return nextDoubleUp(x); + } else { + // For 80-bit reals, the "implied bit" is a nuisance... + ushort *pe = cast(ushort *)&x; + ulong *ps = cast(ulong *)&x; + + if ((pe[4] & 0x7FFF) == 0x7FFF) { + // First, deal with NANs and infinity + if (x == -real.infinity) return -real.max; + return x; // +INF and NAN are unchanged. + } + if (pe[4] & 0x8000) { // Negative number -- need to decrease the significand + --*ps; + // Need to mask with 0x7FFF... so denormals are treated correctly. + if ((*ps & 0x7FFFFFFFFFFFFFFF) == 0x7FFFFFFFFFFFFFFF) { + if (pe[4] == 0x8000) { // it was negative zero + *ps = 1; pe[4] = 0; // smallest subnormal. + return x; + } + --pe[4]; + if (pe[4] == 0x8000) { + return x; // it's become a denormal, implied bit stays low. + } + *ps = 0xFFFFFFFFFFFFFFFF; // set the implied bit + return x; + } + return x; + } else { + // Positive number -- need to increase the significand. + // Works automatically for positive zero. + ++*ps; + if ((*ps & 0x7FFFFFFFFFFFFFFF) == 0) { + // change in exponent + ++pe[4]; + *ps = 0x8000000000000000; // set the high bit + } + } + return x; + } +} + +/** ditto */ +double nextDoubleUp(double x) +{ + ulong *ps = cast(ulong *)&x; + + if ((*ps & 0x7FF0_0000_0000_0000) == 0x7FF0_0000_0000_0000) { + // First, deal with NANs and infinity + if (x == -x.infinity) return -x.max; + return x; // +INF and NAN are unchanged. + } + if (*ps & 0x8000_0000_0000_0000) { // Negative number + if (*ps == 0x8000_0000_0000_0000) { // it was negative zero + *ps = 0x0000_0000_0000_0001; // change to smallest subnormal + return x; + } + --*ps; + } else { // Positive number + ++*ps; + } + return x; +} + +/** ditto */ +float nextFloatUp(float x) +{ + uint *ps = cast(uint *)&x; + + if ((*ps & 0x7F80_0000) == 0x7F80_0000) { + // First, deal with NANs and infinity + if (x == -x.infinity) return -x.max; + return x; // +INF and NAN are unchanged. + } + if (*ps & 0x8000_0000) { // Negative number + if (*ps == 0x8000_0000) { // it was negative zero + *ps = 0x0000_0001; // change to smallest subnormal + return x; + } + --*ps; + } else { // Positive number + ++*ps; + } + return x; +} + +debug(UnitTest) { +unittest { + static if (real.mant_dig == 64) { + + // Tests for 80-bit reals + + assert(isIdentical(nextUp(NaN(0xABC)), NaN(0xABC))); + // negative numbers + assert( nextUp(-real.infinity) == -real.max ); + assert( nextUp(-1-real.epsilon) == -1.0 ); + assert( nextUp(-2) == -2.0 + real.epsilon); + // denormals and zero + assert( nextUp(-real.min) == -real.min*(1-real.epsilon) ); + assert( nextUp(-real.min*(1-real.epsilon) == -real.min*(1-2*real.epsilon)) ); + assert( isIdentical(-0.0L, nextUp(-real.min*real.epsilon)) ); + assert( nextUp(-0.0) == real.min*real.epsilon ); + assert( nextUp(0.0) == real.min*real.epsilon ); + assert( nextUp(real.min*(1-real.epsilon)) == real.min ); + assert( nextUp(real.min) == real.min*(1+real.epsilon) ); + // positive numbers + assert( nextUp(1) == 1.0 + real.epsilon ); + assert( nextUp(2.0-real.epsilon) == 2.0 ); + assert( nextUp(real.max) == real.infinity ); + assert( nextUp(real.infinity)==real.infinity ); + } + + assert(isIdentical(nextDoubleUp(NaN(0xABC)), NaN(0xABC))); + // negative numbers + assert( nextDoubleUp(-double.infinity) == -double.max ); + assert( nextDoubleUp(-1-double.epsilon) == -1.0 ); + assert( nextDoubleUp(-2) == -2.0 + double.epsilon); + // denormals and zero + + assert( nextDoubleUp(-double.min) == -double.min*(1-double.epsilon) ); + assert( nextDoubleUp(-double.min*(1-double.epsilon) == -double.min*(1-2*double.epsilon)) ); + assert( isIdentical(-0.0, nextDoubleUp(-double.min*double.epsilon)) ); + assert( nextDoubleUp(0.0) == double.min*double.epsilon ); + assert( nextDoubleUp(-0.0) == double.min*double.epsilon ); + assert( nextDoubleUp(double.min*(1-double.epsilon)) == double.min ); + assert( nextDoubleUp(double.min) == double.min*(1+double.epsilon) ); + // positive numbers + assert( nextDoubleUp(1) == 1.0 + double.epsilon ); + assert( nextDoubleUp(2.0-double.epsilon) == 2.0 ); + assert( nextDoubleUp(double.max) == double.infinity ); + + assert(isIdentical(nextFloatUp(NaN(0xABC)), NaN(0xABC))); + assert( nextFloatUp(-float.min) == -float.min*(1-float.epsilon) ); + assert( nextFloatUp(1.0) == 1.0+float.epsilon ); + assert( nextFloatUp(-0.0) == float.min*float.epsilon); + assert( nextFloatUp(float.infinity)==float.infinity ); + + assert(nextDown(1.0+real.epsilon)==1.0); + assert(nextDoubleDown(1.0+double.epsilon)==1.0); + assert(nextFloatDown(1.0+float.epsilon)==1.0); + assert(nextafter(1.0+real.epsilon, -real.infinity)==1.0); +} +} + +package { +/** Reduces the magnitude of x, so the bits in the lower half of its significand + * are all zero. Returns the amount which needs to be added to x to restore its + * initial value; this amount will also have zeros in all bits in the lower half + * of its significand. + */ +X splitSignificand(X)(inout X x) +{ + if (fabs(x) !< X.infinity) return 0; // don't change NaN or infinity + X y = x; // copy the original value + static if (X.mant_dig == float.mant_dig) { + uint *ps = cast(uint *)&x; + (*ps) &= 0xFFFF_FC00; + } else static if (X.mant_dig == double.mant_dig) { + ulong *ps = cast(ulong *)&x; + (*ps) &= 0xFFFF_FFFF_FC00_0000; + } else static if (X.mant_dig == 64){ // 80-bit real + // An x87 real80 has 63 bits, because the 'implied' bit is stored explicitly. + // This is annoying, because it means the significand cannot be + // precisely halved. Instead, we split it into 31+32 bits. + ulong *ps = cast(ulong *)&x; + (*ps) &= 0xFFFF_FFFF_0000_0000; + } //else static assert(0, "Unsupported size"); + + return y - x; +} + + +//import tango.stdc.stdio; +unittest { + double x = -0x1.234_567A_AAAA_AAp+250; + double y = splitSignificand(x); + assert(x == -0x1.234_5678p+250); + assert(y == -0x0.000_000A_AAAA_A8p+248); + assert(x + y == -0x1.234_567A_AAAA_AAp+250); +} +} + +/** + * Calculate the next smallest floating point value after x. + * + * Return the greatest number less than x that is representable as a real; + * thus, it gives the previous point on the IEEE number line. + * Note: This function is included in the forthcoming IEEE 754R standard. + * + * Special values: + * real.infinity real.max + * real.min*real.epsilon 0.0 + * 0.0 -real.min*real.epsilon + * -0.0 -real.min*real.epsilon + * -real.max -real.infinity + * -real.infinity -real.infinity + * NAN NAN + * + * nextDoubleDown and nextFloatDown are the corresponding functions for + * the IEEE double and IEEE float number lines. + */ +real nextDown(real x) +{ + return -nextUp(-x); +} + +/** ditto */ +double nextDoubleDown(double x) +{ + return -nextDoubleUp(-x); +} + +/** ditto */ +float nextFloatDown(float x) +{ + return -nextFloatUp(-x); +} + +debug(UnitTest) { +unittest { + assert( nextDown(1.0 + real.epsilon) == 1.0); +} +} + + +/** + * Calculates the next representable value after x in the direction of y. + * + * If y > x, the result will be the next largest floating-point value; + * if y < x, the result will be the next smallest value. + * If x == y, the result is y. + * + * Remarks: + * This function is not generally very useful; it's almost always better to use + * the faster functions nextup() or nextdown() instead. + * + * IEEE 754 requirements not implemented: + * The FE_INEXACT and FE_OVERFLOW exceptions will be raised if x is finite and + * the function result is infinite. The FE_INEXACT and FE_UNDERFLOW + * exceptions will be raised if the function value is subnormal, and x is + * not equal to y. + */ +real nextafter(real x, real y) +{ + if (x==y) return y; + return (y>x) ? nextUp(x) : nextDown(x); +} + +/************************************** + * To what precision is x equal to y? + * + * Returns: the number of significand bits which are equal in x and y. + * eg, 0x1.F8p+60 and 0x1.F1p+60 are equal to 5 bits of precision. + * + * $(TABLE_SV + * $(SVH3 x, y, feqrel(x, y) ) + * $(SV3 x, x, real.mant_dig ) + * $(SV3 x, >= 2*x, 0 ) + * $(SV3 x, <= x/2, 0 ) + * $(SV3 $(NAN), any, 0 ) + * $(SV3 any, $(NAN), 0 ) + * ) + * + * Remarks: + * This is a very fast operation, suitable for use in speed-critical code. + * + */ + +int feqrel(real x, real y) +{ + /* Public Domain. Author: Don Clugston, 18 Aug 2005. + */ + + if (x == y) return real.mant_dig; // ensure diff!=0, cope with INF. + + real diff = fabs(x - y); + + ushort *pa = cast(ushort *)(&x); + ushort *pb = cast(ushort *)(&y); + ushort *pd = cast(ushort *)(&diff); + + // The difference in abs(exponent) between x or y and abs(x-y) + // is equal to the number of significand bits of x which are + // equal to y. If negative, x and y have different exponents. + // If positive, x and y are equal to 'bitsdiff' bits. + // AND with 0x7FFF to form the absolute value. + // To avoid out-by-1 errors, we subtract 1 so it rounds down + // if the exponents were different. This means 'bitsdiff' is + // always 1 lower than we want, except that if bitsdiff==0, + // they could have 0 or 1 bits in common. + + static if (real.mant_dig==64) + { + + int bitsdiff = ( ((pa[4]&0x7FFF) + (pb[4]&0x7FFF)-1)>>1) - pd[4]; + + if (pd[4] == 0) + { // Difference is denormal + // For denormals, we need to add the number of zeros that + // lie at the start of diff's significand. + // We do this by multiplying by 2^real.mant_dig + diff *= 0x1p+63; + return bitsdiff + real.mant_dig - pd[4]; + } + + if (bitsdiff > 0) + return bitsdiff + 1; // add the 1 we subtracted before + + // Avoid out-by-1 errors when factor is almost 2. + return (bitsdiff == 0) ? (pa[4] == pb[4]) : 0; + } else { + // 64-bit reals + version(LittleEndian) + const int EXPONENTPOS = 3; + else const int EXPONENTPOS = 0; + + int bitsdiff = ( ((pa[EXPONENTPOS]&0x7FF0) + (pb[EXPONENTPOS]&0x7FF0)-0x10)>>5) - (pd[EXPONENTPOS]&0x7FF0>>4); + + if (pd[EXPONENTPOS] == 0) + { // Difference is denormal + // For denormals, we need to add the number of zeros that + // lie at the start of diff's significand. + // We do this by multiplying by 2^real.mant_dig + diff *= 0x1p+53; + return bitsdiff + real.mant_dig - pd[EXPONENTPOS]; + } + + if (bitsdiff > 0) + return bitsdiff + 1; // add the 1 we subtracted before + + // Avoid out-by-1 errors when factor is almost 2. + if (bitsdiff == 0 && (pa[EXPONENTPOS] ^ pb[EXPONENTPOS])&0x7FF0) return 1; + else return 0; + + } + +} + +debug(UnitTest) { +unittest +{ + // Exact equality + assert(feqrel(real.max,real.max)==real.mant_dig); + assert(feqrel(0,0)==real.mant_dig); + assert(feqrel(7.1824,7.1824)==real.mant_dig); + assert(feqrel(real.infinity,real.infinity)==real.mant_dig); + + // a few bits away from exact equality + real w=1; + for (int i=1; i 0), the return value + * is the arithmetic mean (x + y) / 2. + * If x and y are even powers of 2, the return value is the geometric mean, + * ieeeMean(x, y) = sqrt(x * y). + * + */ +T ieeeMean(T)(T x, T y) +in { + // both x and y must have the same sign, and must not be NaN. + assert(signbit(x) == signbit(y) && x<>=0 && y<>=0); +} +body { + // Runtime behaviour for contract violation: + // If signs are opposite, or one is a NaN, return 0. + if (!((x>=0 && y>=0) || (x<=0 && y<=0))) return 0.0; + + // The implementation is simple: cast x and y to integers, + // average them (avoiding overflow), and cast the result back to a floating-point number. + + T u; + static if (T.mant_dig==64) { // x87, 80-bit reals + // There's slight additional complexity because they are actually + // 79-bit reals... + ushort *ue = cast(ushort *)&u; + ulong *ul = cast(ulong *)&u; + ushort *xe = cast(ushort *)&x; + ulong *xl = cast(ulong *)&x; + ushort *ye = cast(ushort *)&y; + ulong *yl = cast(ulong *)&y; + // Ignore the useless implicit bit. + ulong m = ((*xl) & 0x7FFF_FFFF_FFFF_FFFF) + ((*yl) & 0x7FFF_FFFF_FFFF_FFFF); + + ushort e = cast(ushort)((xe[4] & 0x7FFF) + (ye[4] & 0x7FFF)); + if (m & 0x8000_0000_0000_0000) { + ++e; + m &= 0x7FFF_FFFF_FFFF_FFFF; + } + // Now do a multi-byte right shift + uint c = e & 1; // carry + e >>= 1; + m >>>= 1; + if (c) m |= 0x4000_0000_0000_0000; // shift carry into significand + if (e) *ul = m | 0x8000_0000_0000_0000; // set implicit bit... + else *ul = m; // ... unless exponent is 0 (denormal or zero). + // Prevent a ridiculous warning (why does (ushort | ushort) get promoted to int???) + ue[4]= cast(ushort)( e | (xe[4]& 0x8000)); // restore sign bit + } else static if (T.mant_dig == double.mant_dig) { + ulong *ul = cast(ulong *)&u; + ulong *xl = cast(ulong *)&x; + ulong *yl = cast(ulong *)&y; + ulong m = (((*xl) & 0x7FFF_FFFF_FFFF_FFFF) + ((*yl) & 0x7FFF_FFFF_FFFF_FFFF)) >>> 1; + m |= ((*xl) & 0x8000_0000_0000_0000); + *ul = m; + }else static if (T.mant_dig == float.mant_dig) { + uint *ul = cast(uint *)&u; + uint *xl = cast(uint *)&x; + uint *yl = cast(uint *)&y; + uint m = (((*xl) & 0x7FFF_FFFF) + ((*yl) & 0x7FFF_FFFF)) >>> 1; + m |= ((*xl) & 0x8000_0000); + *ul = m; + } + return u; +} + +debug(UnitTest) { +unittest { + assert(ieeeMean(-0.0,-1e-20)<0); + assert(ieeeMean(0.0,1e-20)>0); + + assert(ieeeMean(1.0L,4.0L)==2L); + assert(ieeeMean(2.0*1.013,8.0*1.013)==4*1.013); + assert(ieeeMean(-1.0L,-4.0L)==-2L); + assert(ieeeMean(-1.0,-4.0)==-2); + assert(ieeeMean(-1.0f,-4.0f)==-2f); + assert(ieeeMean(-1.0,-2.0)==-1.5); + assert(ieeeMean(-1*(1+8*real.epsilon),-2*(1+8*real.epsilon))==-1.5*(1+5*real.epsilon)); + assert(ieeeMean(0x1p60,0x1p-10)==0x1p25); + static if (real.mant_dig==64) { // x87, 80-bit reals + assert(ieeeMean(1.0L,real.infinity)==0x1p8192L); + assert(ieeeMean(0.0L,real.infinity)==1.5); + } + assert(ieeeMean(0.5*real.min*(1-4*real.epsilon),0.5*real.min)==0.5*real.min*(1-2*real.epsilon)); +} +} + +// Functions for NaN payloads +/* + * A 'payload' can be stored in the significand of a $(NAN). One bit is required + * to distinguish between a quiet and a signalling $(NAN). This leaves 22 bits + * of payload for a float; 51 bits for a double; 62 bits for an 80-bit real; + * and 111 bits for a 128-bit quad. +*/ +/** + * Create a $(NAN), storing an integer inside the payload. + * + * For 80-bit or 128-bit reals, the largest possible payload is 0x3FFF_FFFF_FFFF_FFFF. + * For doubles, it is 0x3_FFFF_FFFF_FFFF. + * For floats, it is 0x3F_FFFF. + */ +real NaN(ulong payload) +{ + static if (real.mant_dig == double.mant_dig) { + ulong v = 2; // no implied bit. quiet bit = 1 + } else { + ulong v = 3; // implied bit = 1, quiet bit = 1 + } + + ulong a = payload; + + // 22 Float bits + ulong w = a & 0x3F_FFFF; + a -= w; + + v <<=22; + v |= w; + a >>=22; + + // 29 Double bits + v <<=29; + w = a & 0xFFF_FFFF; + v |= w; + a -= w; + a >>=29; + + static if (real.mant_dig == double.mant_dig) { + v |=0x7FF0_0000_0000_0000; + real x; + * cast(ulong *)(&x) = v; + return x; + } else { + // Extended real bits + v <<=11; + a &= 0x7FF; + v |= a; + + real x = real.nan; + * cast(ulong *)(&x) = v; + return x; + } +} + +/** + * Extract an integral payload from a $(NAN). + * + * Returns: + * the integer payload as a ulong. + * + * For 80-bit or 128-bit reals, the largest possible payload is 0x3FFF_FFFF_FFFF_FFFF. + * For doubles, it is 0x3_FFFF_FFFF_FFFF. + * For floats, it is 0x3F_FFFF. + */ +ulong getNaNPayload(real x) +{ + assert(isNaN(x)); + ulong m = *cast(ulong *)(&x); + static if (real.mant_dig == double.mant_dig) { + // Make it look like an 80-bit significand. + // Skip exponent, and quiet bit + m &= 0x0007_FFFF_FFFF_FFFF; + m <<= 10; + } + // ignore implicit bit and quiet bit + ulong f = m & 0x3FFF_FF00_0000_0000L; + ulong w = f >>> 40; + w |= (m & 0x00FF_FFFF_F800L) << (22 - 11); + w |= (m & 0x7FF) << 51; + return w; +} + +debug(UnitTest) { +unittest { + real nan4 = NaN(0x789_ABCD_EF12_3456); + static if (real.mant_dig == 64) { + assert (getNaNPayload(nan4) == 0x789_ABCD_EF12_3456); + } else { + assert (getNaNPayload(nan4) == 0x1_ABCD_EF12_3456); + } + double nan5 = nan4; + assert (getNaNPayload(nan5) == 0x1_ABCD_EF12_3456); + float nan6 = nan4; + assert (getNaNPayload(nan6) == 0x12_3456); + nan4 = NaN(0xFABCD); + assert (getNaNPayload(nan4) == 0xFABCD); + nan6 = nan4; + assert (getNaNPayload(nan6) == 0xFABCD); + nan5 = NaN(0x100_0000_0000_3456); + assert(getNaNPayload(nan5) == 0x0000_0000_3456); +} +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/math/Math.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/math/Math.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,1868 @@ +/** + * Elementary Mathematical Functions + * + * Copyright: Portions Copyright (C) 2001-2005 Digital Mars. + * License: BSD style: $(LICENSE), Digital Mars. + * Authors: Walter Bright, Don Clugston, Sean Kelly + */ +/* Portions of this code were taken from Phobos std.math, which has the following + * copyright notice: + * + * Author: + * Walter Bright + * Copyright: + * Copyright (c) 2001-2005 by Digital Mars, + * All Rights Reserved, + * www.digitalmars.com + * License: + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + *
    + *
  • The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + *
  • + *
  • Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + *
  • + *
  • This notice may not be removed or altered from any source + * distribution. + *
  • + *
+ */ + +/** + * Macros: + * NAN = $(RED NAN) + * TEXTNAN = $(RED NAN:$1 ) + * SUP = $0 + * GAMMA = Γ + * INTEGRAL = ∫ + * INTEGRATE = $(BIG ∫$(SMALL $1)$2) + * POWER = $1$2 + * BIGSUM = $(BIG Σ $2$(SMALL $1)) + * CHOOSE = $(BIG () $(SMALL $1)$(SMALL $2) $(BIG )) + * TABLE_SV = + * + * $0
Special Values
+ * SVH = $(TR $(TH $1) $(TH $2)) + * SV = $(TR $(TD $1) $(TD $2)) + * TABLE_DOMRG = $0
+ * DOMAIN = $(TR $(TD Domain) $(TD $0)) + * RANGE = $(TR $(TD Range) $(TD $0)) + */ + +module tango.math.Math; + +static import tango.stdc.math; +private import tango.math.IEEE; + +version(DigitalMars) +{ + version(D_InlineAsm_X86) + { + version = DigitalMars_D_InlineAsm_X86; + } +} + +/* + * Constants + */ + +const real E = 2.7182818284590452354L; /** e */ +const real LOG2T = 0x1.a934f0979a3715fcp+1; /** log210 */ // 3.32193 fldl2t +const real LOG2E = 0x1.71547652b82fe178p+0; /** log2e */ // 1.4427 fldl2e +const real LOG2 = 0x1.34413509f79fef32p-2; /** log102 */ // 0.30103 fldlg2 +const real LOG10E = 0.43429448190325182765L; /** log10e */ +const real LN2 = 0x1.62e42fefa39ef358p-1; /** ln 2 */ // 0.693147 fldln2 +const real LN10 = 2.30258509299404568402L; /** ln 10 */ +const real PI = 0x1.921fb54442d1846ap+1; /** π */ // 3.14159 fldpi +const real PI_2 = 1.57079632679489661923L; /** π / 2 */ +const real PI_4 = 0.78539816339744830962L; /** π / 4 */ +const real M_1_PI = 0.31830988618379067154L; /** 1 / π */ +const real M_2_PI = 0.63661977236758134308L; /** 2 / π */ +const real M_2_SQRTPI = 1.12837916709551257390L; /** 2 / √π */ +const real SQRT2 = 1.41421356237309504880L; /** √2 */ +const real SQRT1_2 = 0.70710678118654752440L; /** √½ */ + +//const real SQRTPI = 1.77245385090551602729816748334114518279754945612238L; /** √π */ +//const real SQRT2PI = 2.50662827463100050242E0L; /** √(2 π) */ + +const real MAXLOG = 0x1.62e42fefa39ef358p+13; /** log(real.max) */ +const real MINLOG = -0x1.6436716d5406e6d8p+13; /** log(real.min*real.epsilon) */ +const real EULERGAMMA = 0.57721_56649_01532_86060_65120_90082_40243_10421_59335_93992; /** Euler-Mascheroni constant 0.57721566.. */ + +/* + * Primitives + */ + +/** + * Calculates the absolute value + * + * For complex numbers, abs(z) = sqrt( $(POWER z.re, 2) + $(POWER z.im, 2) ) + * = hypot(z.re, z.im). + */ +real abs(real x) +{ + return tango.math.IEEE.fabs(x); +} + +/** ditto */ +long abs(long x) +{ + return x>=0 ? x : -x; +} + +/** ditto */ +int abs(int x) +{ + return x>=0 ? x : -x; +} + +/** ditto */ +real abs(creal z) +{ + return hypot(z.re, z.im); +} + +/** ditto */ +real abs(ireal y) +{ + return tango.math.IEEE.fabs(y.im); +} + +debug(UnitTest) { +unittest +{ + assert(isIdentical(0.0L,abs(-0.0L))); + assert(isNaN(abs(real.nan))); + assert(abs(-real.infinity) == real.infinity); + assert(abs(-3.2Li) == 3.2L); + assert(abs(71.6Li) == 71.6L); + assert(abs(-56) == 56); + assert(abs(2321312L) == 2321312L); + assert(abs(-1.0L+1.0Li) == sqrt(2.0L)); +} +} + +/** + * Complex conjugate + * + * conj(x + iy) = x - iy + * + * Note that z * conj(z) = $(POWER z.re, 2) + $(POWER z.im, 2) + * is always a real number + */ +creal conj(creal z) +{ + return z.re - z.im*1i; +} + +/** ditto */ +ireal conj(ireal y) +{ + return -y; +} + +debug(UnitTest) { +unittest +{ + assert(conj(7 + 3i) == 7-3i); + ireal z = -3.2Li; + assert(conj(z) == -z); +} +} + +private { + // Return the type which would be returned by a max or min operation +template minmaxtype(T...){ + static if(T.length == 1) alias typeof(T[0]) minmaxtype; + else static if(T.length > 2) + alias minmaxtype!(minmaxtype!(T[0..2]), T[2..$]) minmaxtype; + else alias typeof (T[1] > T[0] ? T[1] : T[0]) minmaxtype; +} +} + +/** Return the minimum of the supplied arguments. + * + * Note: If the arguments are floating-point numbers, and at least one is a NaN, + * the result is undefined. + */ +minmaxtype!(T) min(T...)(T arg){ + static if(arg.length == 1) return arg[0]; + else static if(arg.length == 2) return arg[1] < arg[0] ? arg[1] : arg[0]; + static if(arg.length > 2) return min(arg[1] < arg[0] ? arg[1] : arg[0], arg[2..$]); +} + +/** Return the maximum of the supplied arguments. + * + * Note: If the arguments are floating-point numbers, and at least one is a NaN, + * the result is undefined. + */ +minmaxtype!(T) max(T...)(T arg){ + static if(arg.length == 1) return arg[0]; + else static if(arg.length == 2) return arg[1] > arg[0] ? arg[1] : arg[0]; + static if(arg.length > 2) return max(arg[1] > arg[0] ? arg[1] : arg[0], arg[2..$]); +} +debug(UnitTest) { +unittest +{ + assert(max('e', 'f')=='f'); + assert(min(3.5, 3.8)==3.5); + // check implicit conversion to integer. + assert(min(3.5, 18)==3.5); + +} +} + +/** Returns the minimum number of x and y, favouring numbers over NaNs. + * + * If both x and y are numbers, the minimum is returned. + * If both parameters are NaN, either will be returned. + * If one parameter is a NaN and the other is a number, the number is + * returned (this behaviour is mandated by IEEE 754R, and is useful + * for determining the range of a function). + */ +real minNum(real x, real y) { + if (x<=y || isNaN(y)) return x; else return y; +} + +/** Returns the maximum number of x and y, favouring numbers over NaNs. + * + * If both x and y are numbers, the maximum is returned. + * If both parameters are NaN, either will be returned. + * If one parameter is a NaN and the other is a number, the number is + * returned (this behaviour is mandated by IEEE 754R, and is useful + * for determining the range of a function). + */ +real maxNum(real x, real y) { + if (x>=y || isNaN(y)) return x; else return y; +} + +/** Returns the minimum of x and y, favouring NaNs over numbers + * + * If both x and y are numbers, the minimum is returned. + * If both parameters are NaN, either will be returned. + * If one parameter is a NaN and the other is a number, the NaN is returned. + */ +real minNaN(real x, real y) { + return (x<=y || isNaN(x))? x : y; +} + +/** Returns the maximum of x and y, favouring NaNs over numbers + * + * If both x and y are numbers, the maximum is returned. + * If both parameters are NaN, either will be returned. + * If one parameter is a NaN and the other is a number, the NaN is returned. + */ +real maxNaN(real x, real y) { + return (x>=y || isNaN(x))? x : y; +} + +debug(UnitTest) { +unittest +{ + assert(maxNum(NaN(0xABC), 56.1L)== 56.1L); + assert(isIdentical(maxNaN(NaN(1389), 56.1L), NaN(1389))); + assert(maxNum(28.0, NaN(0xABC))== 28.0); + assert(minNum(1e12, NaN(0xABC))== 1e12); + assert(isIdentical(minNaN(1e12, NaN(23454)), NaN(23454))); + assert(isIdentical(minNum(NaN(489), NaN(23)), NaN(489))); +} +} + +/* + * Trig Functions + */ + +/** + * Returns cosine of x. x is in radians. + * + * $(TABLE_SV + * $(TR $(TH x) $(TH cos(x)) $(TH invalid?) ) + * $(TR $(TD $(NAN)) $(TD $(NAN)) $(TD yes) ) + * $(TR $(TD ±∞) $(TD $(NAN)) $(TD yes) ) + * ) + * Bugs: + * Results are undefined if |x| >= $(POWER 2,64). + */ +real cos(real x) /* intrinsic */ +{ + version(D_InlineAsm_X86) + { + asm + { + fld x; + fcos; + } + } + else + { + return tango.stdc.math.cosl(x); + } +} + +debug(UnitTest) { +unittest { + // NaN payloads + assert(isIdentical(cos(NaN(314)), NaN(314))); +} +} + +/** + * Returns sine of x. x is in radians. + * + * $(TABLE_SV + * x sin(x) invalid? + * $(NAN) $(NAN) yes + * ±0.0 ±0.0 no + * ±∞ $(NAN) yes + * ) + * Bugs: + * Results are undefined if |x| >= $(POWER 2,64). + */ +real sin(real x) /* intrinsic */ +{ + version(D_InlineAsm_X86) + { + asm + { + fld x; + fsin; + } + } + else + { + return tango.stdc.math.sinl(x); + } +} + +debug(UnitTest) { +unittest { + // NaN payloads + assert(isIdentical(sin(NaN(314)), NaN(314))); +} +} + +version (GNU) { + extern (C) real tanl(real); +} + +/** + * Returns tangent of x. x is in radians. + * + * $(TABLE_SV + * x tan(x) invalid? + * $(NAN) $(NAN) yes + * ±0.0 ±0.0 no + * ±∞ $(NAN) yes + * ) + */ +real tan(real x) +{ + version (GNU) { + return tanl(x); + } else { + asm + { + fld x[EBP] ; // load theta + fxam ; // test for oddball values + fstsw AX ; + sahf ; + jc trigerr ; // x is NAN, infinity, or empty + // 387's can handle denormals +SC18: fptan ; + fstp ST(0) ; // dump X, which is always 1 + fstsw AX ; + sahf ; + jnp Lret ; // C2 = 1 (x is out of range) + + // Do argument reduction to bring x into range + fldpi ; + fxch ; +SC17: fprem1 ; + fstsw AX ; + sahf ; + jp SC17 ; + fstp ST(1) ; // remove pi from stack + jmp SC18 ; + +trigerr: + jnp Lret ; // if x is NaN, return x. + fstp ST(0) ; // dump x, which will be infinity + } + return NaN(TANGO_NAN.TAN_DOMAIN); +Lret: + ; + } +} + +debug(UnitTest) { +unittest +{ +// Returns true if equal to precision, false if not +// (Used only in unit test for tan()) +bool mfeq(real x, real y, real precision) +{ + if (x == y) + return true; + if (isNaN(x) || isNaN(y)) + return false; + return fabs(x - y) <= precision; +} + + + static real vals[][2] = // angle,tan + [ + [ 0, 0], + [ .5, .5463024898], + [ 1, 1.557407725], + [ 1.5, 14.10141995], + [ 2, -2.185039863], + [ 2.5,-.7470222972], + [ 3, -.1425465431], + [ 3.5, .3745856402], + [ 4, 1.157821282], + [ 4.5, 4.637332055], + [ 5, -3.380515006], + [ 5.5,-.9955840522], + [ 6, -.2910061914], + [ 6.5, .2202772003], + [ 10, .6483608275], + + // special angles + [ PI_4, 1], + //[ PI_2, real.infinity], + [ 3*PI_4, -1], + [ PI, 0], + [ 5*PI_4, 1], + //[ 3*PI_2, -real.infinity], + [ 7*PI_4, -1], + [ 2*PI, 0], + + // overflow + [ real.infinity, real.nan], + [ real.nan, real.nan], + ]; + int i; + + for (i = 0; i < vals.length; i++) + { + real x = vals[i][0]; + real r = vals[i][1]; + real t = tan(x); + + //printf("tan(%Lg) = %Lg, should be %Lg\n", x, t, r); + if (isNaN(r)) assert(isNaN(t)); + else assert(mfeq(r, t, .0000001)); + + x = -x; + r = -r; + t = tan(x); + //printf("tan(%Lg) = %Lg, should be %Lg\n", x, t, r); + if (isNaN(r)) assert(isNaN(t)); + else assert(mfeq(r, t, .0000001)); + } + assert(isIdentical(tan(NaN(735)), NaN(735))); + assert(isNaN(tan(real.infinity))); +} +} + +/***************************************** + * Sine, cosine, and arctangent of multiple of π + * + * Accuracy is preserved for large values of x. + */ +real cosPi(real x) +{ + return cos((x%2.0)*PI); +} + +/** ditto */ +real sinPi(real x) +{ + return sin((x%2.0)*PI); +} + +/** ditto */ +real atanPi(real x) +{ + return PI * atan(x); // BUG: Fix this. +} + +debug(UnitTest) { +unittest { + assert(isIdentical(sinPi(0.0), 0.0)); + assert(isIdentical(sinPi(-0.0), -0.0)); + assert(isIdentical(atanPi(0.0), 0.0)); + assert(isIdentical(atanPi(-0.0), -0.0)); +} +} + +/*********************************** + * sine, complex and imaginary + * + * sin(z) = sin(z.re)*cosh(z.im) + cos(z.re)*sinh(z.im)i + * + * If both sin(θ) and cos(θ) are required, + * it is most efficient to use expi(&theta). + */ +creal sin(creal z) +{ + creal cs = expi(z.re); + return cs.im * cosh(z.im) + cs.re * sinh(z.im) * 1i; +} + +/** ditto */ +ireal sin(ireal y) +{ + return cosh(y.im)*1i; +} + +debug(UnitTest) { +unittest { + assert(sin(0.0+0.0i) == 0.0); + assert(sin(2.0+0.0i) == sin(2.0L) ); +} +} + +/*********************************** + * cosine, complex and imaginary + * + * cos(z) = cos(z.re)*cosh(z.im) + sin(z.re)*sinh(z.im)i + */ +creal cos(creal z) +{ + creal cs = expi(z.re); + return cs.re * cosh(z.im) + cs.im * sinh(z.im) * 1i; +} + +/** ditto */ +real cos(ireal y) +{ + return cosh(y.im); +} + +debug(UnitTest) { +unittest{ + assert(cos(0.0+0.0i)==1.0); + assert(cos(1.3L+0.0i)==cos(1.3L)); + assert(cos(5.2Li)== cosh(5.2L)); +} +} + +/** + * Calculates the arc cosine of x, + * returning a value ranging from -π/2 to π/2. + * + * $(TABLE_SV + * x acos(x) invalid? + * >1.0 $(NAN) yes + * <-1.0 $(NAN) yes + * $(NAN) $(NAN) yes + * ) + */ +real acos(real x) +{ + return tango.stdc.math.acosl(x); +} + +debug(UnitTest) { +unittest { + // NaN payloads + assert(isIdentical(acos(NaN(254)), NaN(254))); +} +} + +/** + * Calculates the arc sine of x, + * returning a value ranging from -π/2 to π/2. + * + * $(TABLE_SV + * x asin(x) invalid? + * ±0.0 ±0.0 no + * >1.0 $(NAN) yes + * <-1.0 $(NAN) yes + * ) + */ +real asin(real x) +{ + return tango.stdc.math.asinl(x); +} + +debug(UnitTest) { +unittest { + // NaN payloads + assert(isIdentical(asin(NaN(7249)), NaN(7249))); +} +} + +/** + * Calculates the arc tangent of x, + * returning a value ranging from -π/2 to π/2. + * + * $(TABLE_SV + * x atan(x) invalid? + * ±0.0 ±0.0 no + * ±∞ $(NAN) yes + * ) + */ +real atan(real x) +{ + return tango.stdc.math.atanl(x); +} + +debug(UnitTest) { +unittest { + // NaN payloads + assert(isIdentical(atan(NaN(9876)), NaN(9876))); +} +} + +/** + * Calculates the arc tangent of y / x, + * returning a value ranging from -π/2 to π/2. + * + * Remarks: + * The Complex Argument of a complex number z is given by + * Arg(z) = atan2(z.re, z.im) + * + * $(TABLE_SV + * y x atan(y, x) + * $(NAN) anything $(NAN) + * anything $(NAN) $(NAN) + * ±0.0 > 0.0 ±0.0 + * ±0.0 ±0.0 ±0.0 + * ±0.0 < 0.0 ±π + * ±0.0 -0.0 ±π + * > 0.0 ±0.0 π/2 + * < 0.0 ±0.0 π/2 + * > 0.0 ∞ ±0.0 + * ±∞ anything ±π/2 + * > 0.0 -∞ ±π + * ±∞ ∞ ±π/4 + * ±∞ -∞ ±3π/4 + * ) + */ +real atan2(real y, real x) +{ + return tango.stdc.math.atan2l(y,x); +} + +debug(UnitTest) { +unittest { + // NaN payloads + assert(isIdentical(atan2(5.3, NaN(9876)), NaN(9876))); + assert(isIdentical(atan2(NaN(9876), 2.18), NaN(9876))); +} +} + +/*********************************** + * Complex inverse sine + * + * asin(z) = -i log( sqrt(1-$(POWER z, 2)) + iz) + * where both log and sqrt are complex. + */ +creal asin(creal z) +{ + return -log(sqrt(1-z*z) + z*1i)*1i; +} + +debug(UnitTest) { +unittest { + assert(asin(sin(0+0i)) == 0 + 0i); +} +} + +/*********************************** + * Complex inverse cosine + * + * acos(z) = &pi/2 - asin(z) + */ +creal acos(creal z) +{ + return PI_2 - asin(z); +} + + +/** + * Calculates the hyperbolic cosine of x. + * + * $(TABLE_SV + * x cosh(x) invalid? + * ±∞ ±0.0 no + * ) + */ +real cosh(real x) +{ + return tango.stdc.math.coshl(x); +} + +debug(UnitTest) { +unittest { + // NaN payloads + assert(isIdentical(cosh(NaN(432)), NaN(432))); +} +} + +/** + * Calculates the hyperbolic sine of x. + * + * $(TABLE_SV + * x sinh(x) invalid? + * ±0.0 ±0.0 no + * ±∞ ±∞ no + * ) + */ +real sinh(real x) +{ + return tango.stdc.math.sinhl(x); +} + +debug(UnitTest) { +unittest { + // NaN payloads + assert(isIdentical(sinh(NaN(0xABC)), NaN(0xABC))); +} +} + +/** + * Calculates the hyperbolic tangent of x. + * + * $(TABLE_SV + * x tanh(x) invalid? + * ±0.0 ±0.0 no + * ±∞ ±1.0 no + * ) + */ +real tanh(real x) +{ + return tango.stdc.math.tanhl(x); +} + +debug(UnitTest) { +unittest { + // NaN payloads + assert(isIdentical(tanh(NaN(0xABC)), NaN(0xABC))); +} +} + +/*********************************** + * hyperbolic sine, complex and imaginary + * + * sinh(z) = cos(z.im)*sinh(z.re) + sin(z.im)*cosh(z.re)i + */ +creal sinh(creal z) +{ + creal cs = expi(z.im); + return cs.re * sinh(z.re) + cs.im * cosh(z.re) * 1i; +} + +/** ditto */ +ireal sinh(ireal y) +{ + return sin(y.im)*1i; +} + +debug(UnitTest) { +unittest { + assert(sinh(4.2L + 0i)==sinh(4.2L)); +} +} + +/*********************************** + * hyperbolic cosine, complex and imaginary + * + * cosh(z) = cos(z.im)*cosh(z.re) + sin(z.im)*sinh(z.re)i + */ +creal cosh(creal z) +{ + creal cs = expi(z.im); + return cs.re * cosh(z.re) + cs.im * sinh(z.re) * 1i; +} + +/** ditto */ +real cosh(ireal y) +{ + return cos(y.im); +} + +debug(UnitTest) { +unittest { + assert(cosh(8.3L + 0i)==cosh(8.3L)); +} +} + + +/** + * Calculates the inverse hyperbolic cosine of x. + * + * Mathematically, acosh(x) = log(x + sqrt( x*x - 1)) + * + * $(TABLE_DOMRG + * $(DOMAIN 1..∞) + * $(RANGE 1..log(real.max), ∞ ) + * ) + * $(TABLE_SV + * $(SVH x, acosh(x) ) + * $(SV $(NAN), $(NAN) ) + * $(SV <1, $(NAN) ) + * $(SV 1, 0 ) + * $(SV +∞,+∞) + * ) + */ +real acosh(real x) +{ + if (x > 1/real.epsilon) + return LN2 + log(x); + else + return log(x + sqrt(x*x - 1)); +} + +debug(UnitTest) { +unittest +{ + assert(isNaN(acosh(0.9))); + assert(isNaN(acosh(real.nan))); + assert(acosh(1)==0.0); + assert(acosh(real.infinity) == real.infinity); + // NaN payloads + assert(isIdentical(acosh(NaN(0xABC)), NaN(0xABC))); +} +} + +/** + * Calculates the inverse hyperbolic sine of x. + * + * Mathematically, + * --------------- + * asinh(x) = log( x + sqrt( x*x + 1 )) // if x >= +0 + * asinh(x) = -log(-x + sqrt( x*x + 1 )) // if x <= -0 + * ------------- + * + * $(TABLE_SV + * $(SVH x, asinh(x) ) + * $(SV $(NAN), $(NAN) ) + * $(SV ±0, ±0 ) + * $(SV ±∞,±∞) + * ) + */ +real asinh(real x) +{ + if (tango.math.IEEE.fabs(x) > 1 / real.epsilon) // beyond this point, x*x + 1 == x*x + return tango.math.IEEE.copysign(LN2 + log(tango.math.IEEE.fabs(x)), x); + else + { + // sqrt(x*x + 1) == 1 + x * x / ( 1 + sqrt(x*x + 1) ) + return tango.math.IEEE.copysign(log1p(tango.math.IEEE.fabs(x) + x*x / (1 + sqrt(x*x + 1)) ), x); + } +} + +debug(UnitTest) { +unittest +{ + assert(isIdentical(0.0L,asinh(0.0))); + assert(isIdentical(-0.0L,asinh(-0.0))); + assert(asinh(real.infinity) == real.infinity); + assert(asinh(-real.infinity) == -real.infinity); + assert(isNaN(asinh(real.nan))); + // NaN payloads + assert(isIdentical(asinh(NaN(0xABC)), NaN(0xABC))); +} +} + +/** + * Calculates the inverse hyperbolic tangent of x, + * returning a value from ranging from -1 to 1. + * + * Mathematically, atanh(x) = log( (1+x)/(1-x) ) / 2 + * + * + * $(TABLE_DOMRG + * $(DOMAIN -∞..∞) + * $(RANGE -1..1) ) + * $(TABLE_SV + * $(SVH x, atanh(x) ) + * $(SV $(NAN), $(NAN) ) + * $(SV ±0, ±0) + * $(SV ±1, ±∞) + * ) + */ +real atanh(real x) +{ + // log( (1+x)/(1-x) ) == log ( 1 + (2*x)/(1-x) ) + return 0.5 * log1p( 2 * x / (1 - x) ); +} + +debug(UnitTest) { +unittest +{ + assert(isIdentical(0.0L, atanh(0.0))); + assert(isIdentical(-0.0L,atanh(-0.0))); + assert(isIdentical(atanh(-1),-real.infinity)); + assert(isIdentical(atanh(1),real.infinity)); + assert(isNaN(atanh(-real.infinity))); + // NaN payloads + assert(isIdentical(atanh(NaN(0xABC)), NaN(0xABC))); +} +} + +/** ditto */ +creal atanh(ireal y) +{ + // Not optimised for accuracy or speed + return 0.5*(log(1+y) - log(1-y)); +} + +/** ditto */ +creal atanh(creal z) +{ + // Not optimised for accuracy or speed + return 0.5 * (log(1 + z) - log(1-z)); +} + +/* + * Powers and Roots + */ + +/** + * Compute square root of x. + * + * $(TABLE_SV + * x sqrt(x) invalid? + * -0.0 -0.0 no + * <0.0 $(NAN) yes + * +∞ +∞ no + * ) + */ +float sqrt(float x) /* intrinsic */ +{ + version(D_InlineAsm_X86) + { + asm + { + fld x; + fsqrt; + } + } + else + { + return tango.stdc.math.sqrtf(x); + } +} + +double sqrt(double x) /* intrinsic */ /// ditto +{ + version(D_InlineAsm_X86) + { + asm + { + fld x; + fsqrt; + } + } + else + { + return tango.stdc.math.sqrt(x); + } +} + +real sqrt(real x) /* intrinsic */ /// ditto +{ + version(D_InlineAsm_X86) + { + asm + { + fld x; + fsqrt; + } + } + else + { + return tango.stdc.math.sqrtl(x); + } +} + +/** ditto */ +creal sqrt(creal z) +{ + + if (z == 0.0) return z; + real x,y,w,r; + creal c; + + x = tango.math.IEEE.fabs(z.re); + y = tango.math.IEEE.fabs(z.im); + if (x >= y) { + r = y / x; + w = sqrt(x) * sqrt(0.5 * (1 + sqrt(1 + r * r))); + } else { + r = x / y; + w = sqrt(y) * sqrt(0.5 * (r + sqrt(1 + r * r))); + } + + if (z.re >= 0) { + c = w + (z.im / (w + w)) * 1.0i; + } else { + if (z.im < 0) w = -w; + c = z.im / (w + w) + w * 1.0i; + } + return c; +} + +import tango.stdc.stdio; +debug(UnitTest) { +unittest { + // NaN payloads + assert(isIdentical(sqrt(NaN(0xABC)), NaN(0xABC))); + assert(sqrt(-1+0i) == 1i); + assert(isIdentical(sqrt(0-0i), 0-0i)); + assert(cfeqrel(sqrt(4+16i)*sqrt(4+16i), 4+16i)>=real.mant_dig-2); +} +} + +/** + * Calculates the cube root of x. + * + * $(TABLE_SV + * x cbrt(x) invalid? + * ±0.0 ±0.0 no + * $(NAN) $(NAN) yes + * ±∞ ±∞ no + * ) + */ +real cbrt(real x) +{ + return tango.stdc.math.cbrtl(x); +} + + +debug(UnitTest) { +unittest { + // NaN payloads + assert(isIdentical(cbrt(NaN(0xABC)), NaN(0xABC))); +} +} + +/** + * Calculates e$(SUP x). + * + * $(TABLE_SV + * x exp(x) + * +∞ +∞ + * -∞ +0.0 + * ) + */ +real exp(real x) +{ + return tango.stdc.math.expl(x); +} + +debug(UnitTest) { +unittest { + // NaN payloads + assert(isIdentical(exp(NaN(0xABC)), NaN(0xABC))); +} +} + +/** + * Calculates the value of the natural logarithm base (e) + * raised to the power of x, minus 1. + * + * For very small x, expm1(x) is more accurate + * than exp(x)-1. + * + * $(TABLE_SV + * x e$(SUP x)-1 + * ±0.0 ±0.0 + * +∞ +∞ + * -∞ -1.0 + * ) + */ +real expm1(real x) +{ + return tango.stdc.math.expm1l(x); +} + +debug(UnitTest) { +unittest { + // NaN payloads + assert(isIdentical(expm1(NaN(0xABC)), NaN(0xABC))); +} +} + + +/** + * Calculates 2$(SUP x). + * + * $(TABLE_SV + * x exp2(x) + * +∞ +∞ + * -∞ +0.0 + * ) + */ +real exp2(real x) +{ + return tango.stdc.math.exp2l(x); +} + +debug(UnitTest) { +unittest { + // NaN payloads + assert(isIdentical(exp2(NaN(0xABC)), NaN(0xABC))); +} +} + +/* + * Powers and Roots + */ + +/** + * Calculate the natural logarithm of x. + * + * $(TABLE_SV + * x log(x) divide by 0? invalid? + * ±0.0 -∞ yes no + * < 0.0 $(NAN) no yes + * +∞ +∞ no no + * ) + */ +real log(real x) +{ + return tango.stdc.math.logl(x); +} + +debug(UnitTest) { +unittest { + // NaN payloads + assert(isIdentical(log(NaN(0xABC)), NaN(0xABC))); +} +} + +/** + * Calculates the natural logarithm of 1 + x. + * + * For very small x, log1p(x) will be more accurate than + * log(1 + x). + * + * $(TABLE_SV + * x log1p(x) divide by 0? invalid? + * ±0.0 ±0.0 no no + * -1.0 -∞ yes no + * <-1.0 $(NAN) no yes + * +∞ -∞ no no + * ) + */ +real log1p(real x) +{ + return tango.stdc.math.log1pl(x); +} + +debug(UnitTest) { +unittest { + // NaN payloads + assert(isIdentical(log1p(NaN(0xABC)), NaN(0xABC))); +} +} + +/** + * Calculates the base-2 logarithm of x: + * log2x + * + * $(TABLE_SV + * x log2(x) divide by 0? invalid? + * ±0.0 -∞ yes no + * < 0.0 $(NAN) no yes + * +∞ +∞ no no + * ) + */ +real log2(real x) +{ + return tango.stdc.math.log2l(x); +} + +debug(UnitTest) { +unittest { + // NaN payloads + assert(isIdentical(log2(NaN(0xABC)), NaN(0xABC))); +} +} + +/** + * Calculate the base-10 logarithm of x. + * + * $(TABLE_SV + * x log10(x) divide by 0? invalid? + * ±0.0 -∞ yes no + * < 0.0 $(NAN) no yes + * +∞ +∞ no no + * ) + */ +real log10(real x) +{ + return tango.stdc.math.log10l(x); +} + +debug(UnitTest) { +unittest { + // NaN payloads + assert(isIdentical(log10(NaN(0xABC)), NaN(0xABC))); +} +} + +/*********************************** + * Exponential, complex and imaginary + * + * For complex numbers, the exponential function is defined as + * + * exp(z) = exp(z.re)cos(z.im) + exp(z.re)sin(z.im)i. + * + * For a pure imaginary argument, + * exp(θi) = cos(θ) + sin(θ)i. + * + */ +creal exp(ireal y) +{ + return expi(y.im); +} + +/** ditto */ +creal exp(creal z) +{ + return expi(z.im) * exp(z.re); +} + +debug(UnitTest) { +unittest { + assert(exp(1.3e5Li)==cos(1.3e5L)+sin(1.3e5L)*1i); + assert(exp(0.0Li)==1L+0.0Li); + assert(exp(7.2 + 0.0i) == exp(7.2L)); + creal c = exp(ireal.nan); + assert(isNaN(c.re) && isNaN(c.im)); + c = exp(ireal.infinity); + assert(isNaN(c.re) && isNaN(c.im)); +} +} + +/*********************************** + * Natural logarithm, complex + * + * Returns complex logarithm to the base e (2.718...) of + * the complex argument x. + * + * If z = x + iy, then + * log(z) = log(abs(z)) + i arctan(y/x). + * + * The arctangent ranges from -PI to +PI. + * There are branch cuts along both the negative real and negative + * imaginary axes. For pure imaginary arguments, use one of the + * following forms, depending on which branch is required. + * ------------ + * log( 0.0 + yi) = log(-y) + PI_2i // y<=-0.0 + * log(-0.0 + yi) = log(-y) - PI_2i // y<=-0.0 + * ------------ + */ +creal log(creal z) +{ + return log(abs(z)) + atan2(z.im, z.re)*1i; +} + +debug(UnitTest) { +private { +/* + * feqrel for complex numbers. Returns the worst relative + * equality of the two components. + */ +int cfeqrel(creal a, creal b) +{ + int intmin(int a, int b) { return a= real.mant_dig-10); + assert(cfeqrel(log(0.0L+2i),( log(2.0L)+PI_2*1i)) >= real.mant_dig-10); +} +} + +/** + * Fast integral powers. + */ +real pow(real x, uint n) +{ + real p; + + switch (n) + { + case 0: + p = 1.0; + break; + + case 1: + p = x; + break; + + case 2: + p = x * x; + break; + + default: + p = 1.0; + while (1){ + if (n & 1) + p *= x; + n >>= 1; + if (!n) + break; + x *= x; + } + break; + } + return p; +} + +/** ditto */ +real pow(real x, int n) +{ + if (n < 0) return pow(x, cast(real)n); + else return pow(x, cast(uint)n); +} + +/** + * Calculates x$(SUP y). + * + * $(TABLE_SV + * + * x y pow(x, y) div 0 invalid? + * + * anything ±0.0 1.0 no no + * + * |x| > 1 +∞ +∞ no no + * + * |x| < 1 +∞ +0.0 no no + * + * |x| > 1 -∞ +0.0 no no + * + * |x| < 1 -∞ +∞ no no + * + * +∞ > 0.0 +∞ no no + * + * +∞ < 0.0 +0.0 no no + * + * -∞ odd integer > 0.0 -∞ no no + * + * -∞ > 0.0, not odd integer +∞ no no + * + * -∞ odd integer < 0.0 -0.0 no no + * + * -∞ < 0.0, not odd integer +0.0 no no + * + * ±1.0 ±∞ $(NAN) no yes + * + * < 0.0 finite, nonintegral $(NAN) no yes + * + * ±0.0 odd integer < 0.0 ±∞ yes no + * + * ±0.0 < 0.0, not odd integer +∞ yes no + * + * ±0.0 odd integer > 0.0 ±0.0 no no + * + * ±0.0 > 0.0, not odd integer +0.0 no no + * ) + */ +real pow(real x, real y) +{ + version (linux) // C pow() often does not handle special values correctly + { + if (isNaN(y)) + return y; + + if (y == 0) + return 1; // even if x is $(NAN) + if (isNaN(x) && y != 0) + return x; + if (isInfinity(y)) + { + if (tango.math.IEEE.fabs(x) > 1) + { + if (signbit(y)) + return +0.0; + else + return real.infinity; + } + else if (tango.math.IEEE.fabs(x) == 1) + { + return NaN(TANGO_NAN.POW_DOMAIN); + } + else // < 1 + { + if (signbit(y)) + return real.infinity; + else + return +0.0; + } + } + if (isInfinity(x)) + { + if (signbit(x)) + { + long i; + i = cast(long)y; + if (y > 0) + { + if (i == y && i & 1) + return -real.infinity; + else + return real.infinity; + } + else if (y < 0) + { + if (i == y && i & 1) + return -0.0; + else + return +0.0; + } + } + else + { + if (y > 0) + return real.infinity; + else if (y < 0) + return +0.0; + } + } + + if (x == 0.0) + { + if (signbit(x)) + { + long i; + + i = cast(long)y; + if (y > 0) + { + if (i == y && i & 1) + return -0.0; + else + return +0.0; + } + else if (y < 0) + { + if (i == y && i & 1) + return -real.infinity; + else + return real.infinity; + } + } + else + { + if (y > 0) + return +0.0; + else if (y < 0) + return real.infinity; + } + } + } + return tango.stdc.math.powl(x, y); +} + +debug(UnitTest) { +unittest +{ + real x = 46; + + assert(pow(x,0) == 1.0); + assert(pow(x,1) == x); + assert(pow(x,2) == x * x); + assert(pow(x,3) == x * x * x); + assert(pow(x,8) == (x * x) * (x * x) * (x * x) * (x * x)); + // NaN payloads + assert(isIdentical(pow(NaN(0xABC), 19), NaN(0xABC))); +} +} + +/** + * Calculates the length of the + * hypotenuse of a right-angled triangle with sides of length x and y. + * The hypotenuse is the value of the square root of + * the sums of the squares of x and y: + * + * sqrt(x² + y²) + * + * Note that hypot(x, y), hypot(y, x) and + * hypot(x, -y) are equivalent. + * + * $(TABLE_SV + * x y hypot(x, y) invalid? + * x ±0.0 |x| no + * ±∞ y +∞ no + * ±∞ $(NAN) +∞ no + * ) + */ +real hypot(real x, real y) +{ + /* + * This is based on code from: + * Cephes Math Library Release 2.1: January, 1989 + * Copyright 1984, 1987, 1989 by Stephen L. Moshier + * Direct inquiries to 30 Frost Street, Cambridge, MA 02140 + */ + + const int PRECL = real.mant_dig/2; // = 32 + + real xx, yy, b, re, im; + int ex, ey, e; + + // Note, hypot(INFINITY, NAN) = INFINITY. + if (tango.math.IEEE.isInfinity(x) || tango.math.IEEE.isInfinity(y)) + return real.infinity; + + if (tango.math.IEEE.isNaN(x)) + return x; + if (tango.math.IEEE.isNaN(y)) + return y; + + re = tango.math.IEEE.fabs(x); + im = tango.math.IEEE.fabs(y); + + if (re == 0.0) + return im; + if (im == 0.0) + return re; + + // Get the exponents of the numbers + xx = tango.math.IEEE.frexp(re, ex); + yy = tango.math.IEEE.frexp(im, ey); + + // Check if one number is tiny compared to the other + e = ex - ey; + if (e > PRECL) + return re; + if (e < -PRECL) + return im; + + // Find approximate exponent e of the geometric mean. + e = (ex + ey) >> 1; + + // Rescale so mean is about 1 + xx = tango.math.IEEE.ldexp(re, -e); + yy = tango.math.IEEE.ldexp(im, -e); + + // Hypotenuse of the right triangle + b = sqrt(xx * xx + yy * yy); + + // Compute the exponent of the answer. + yy = tango.math.IEEE.frexp(b, ey); + ey = e + ey; + + // Check it for overflow and underflow. + if (ey > real.max_exp + 2) { + return real.infinity; + } + if (ey < real.min_exp - 2) + return 0.0; + + // Undo the scaling + b = tango.math.IEEE.ldexp(b, e); + return b; +} + +debug(UnitTest) { +unittest +{ + static real vals[][3] = // x,y,hypot + [ + [ 0, 0, 0], + [ 0, -0, 0], + [ 3, 4, 5], + [ -300, -400, 500], + [ real.min, real.min, 0x1.6a09e667f3bcc908p-16382L], + [ real.max/2, real.max/2, 0x1.6a09e667f3bcc908p+16383L /*8.41267e+4931L*/], + [ real.max, 1, real.max], + [ real.infinity, real.nan, real.infinity], + [ real.nan, real.nan, real.nan], + ]; + + for (int i = 0; i < vals.length; i++) + { + real x = vals[i][0]; + real y = vals[i][1]; + real z = vals[i][2]; + real h = hypot(x, y); + +// printf("hypot(%La, %La) = %La, should be %La\n", x, y, h, z); + assert(isIdentical(z, h)); + } + // NaN payloads + assert(isIdentical(hypot(NaN(0xABC), 3.14), NaN(0xABC))); + assert(isIdentical(hypot(7.6e39, NaN(0xABC)), NaN(0xABC))); +} +} + +/** + * Evaluate polynomial A(x) = a0 + a1x + a2x² + a3x³ ... + * + * Uses Horner's rule A(x) = a0 + x(a1 + x(a2 + x(a3 + ...))) + * Params: + * A = array of coefficients a0, a1, etc. + */ +T poly(T)(T x, T[] A) +in +{ + assert(A.length > 0); +} +body +{ + version (DigitalMars_D_InlineAsm_X86) { + const bool Use_D_InlineAsm_X86 = true; + } else const bool Use_D_InlineAsm_X86 = false; + + // BUG (Inherited from Phobos): This code assumes a frame pointer in EBP. + // This is not in the spec. + static if (Use_D_InlineAsm_X86 && is(T==real) && T.sizeof == 10) { + asm // assembler by W. Bright + { + // EDX = (A.length - 1) * real.sizeof + mov ECX,A[EBP] ; // ECX = A.length + dec ECX ; + lea EDX,[ECX][ECX*8] ; + add EDX,ECX ; + add EDX,A+4[EBP] ; + fld real ptr [EDX] ; // ST0 = coeff[ECX] + jecxz return_ST ; + fld x[EBP] ; // ST0 = x + fxch ST(1) ; // ST1 = x, ST0 = r + align 4 ; + L2: fmul ST,ST(1) ; // r *= x + fld real ptr -10[EDX] ; + sub EDX,10 ; // deg-- + faddp ST(1),ST ; + dec ECX ; + jne L2 ; + fxch ST(1) ; // ST1 = r, ST0 = x + fstp ST(0) ; // dump x + align 4 ; + return_ST: ; + ; + } + } else static if ( Use_D_InlineAsm_X86 && is(T==real) && T.sizeof==12){ + asm // assembler by W. Bright + { + // EDX = (A.length - 1) * real.sizeof + mov ECX,A[EBP] ; // ECX = A.length + dec ECX ; + lea EDX,[ECX*8] ; + lea EDX,[EDX][ECX*4] ; + add EDX,A+4[EBP] ; + fld real ptr [EDX] ; // ST0 = coeff[ECX] + jecxz return_ST ; + fld x ; // ST0 = x + fxch ST(1) ; // ST1 = x, ST0 = r + align 4 ; + L2: fmul ST,ST(1) ; // r *= x + fld real ptr -12[EDX] ; + sub EDX,12 ; // deg-- + faddp ST(1),ST ; + dec ECX ; + jne L2 ; + fxch ST(1) ; // ST1 = r, ST0 = x + fstp ST(0) ; // dump x + align 4 ; + return_ST: ; + ; + } + } else { + ptrdiff_t i = A.length - 1; + real r = A[i]; + while (--i >= 0) + { + r *= x; + r += A[i]; + } + return r; + } +} + +debug(UnitTest) { +unittest +{ + debug (math) printf("math.poly.unittest\n"); + real x = 3.1; + const real pp[] = [56.1L, 32.7L, 6L]; + + assert( poly(x, pp) == (56.1L + (32.7L + 6L * x) * x) ); + + assert(isIdentical(poly(NaN(0xABC), pp), NaN(0xABC))); +} +} + +package { +T rationalPoly(T)(T x, T [] numerator, T [] denominator) +{ + return poly(x, numerator)/poly(x, denominator); +} +} + +private enum : int { MANTDIG_2 = real.mant_dig/2 } // Compiler workaround + +/** Floating point "approximate equality". + * + * Return true if x is equal to y, to within the specified precision + * If roundoffbits is not specified, a reasonable default is used. + */ +bool feq(int precision = MANTDIG_2, XReal=real, YReal=real)(XReal x, YReal y) +{ + static assert(is( XReal: real) && is(YReal : real)); + return tango.math.IEEE.feqrel(x, y) >= precision; +} + +unittest{ + assert(!feq(1.0,2.0)); + real y = 58.0000000001; + assert(feq!(20)(58, y)); +} + +/* + * Rounding (returning real) + */ + +/** + * Returns the value of x rounded downward to the next integer + * (toward negative infinity). + */ +real floor(real x) +{ + return tango.stdc.math.floorl(x); +} + +debug(UnitTest) { +unittest { + assert(isIdentical(floor(NaN(0xABC)), NaN(0xABC))); +} +} + +/** + * Returns the value of x rounded upward to the next integer + * (toward positive infinity). + */ +real ceil(real x) +{ + return tango.stdc.math.ceill(x); +} + +unittest { + assert(isIdentical(ceil(NaN(0xABC)), NaN(0xABC))); +} + +/** + * Return the value of x rounded to the nearest integer. + * If the fractional part of x is exactly 0.5, the return value is rounded to + * the even integer. + */ +real round(real x) +{ + return tango.stdc.math.roundl(x); +} + +debug(UnitTest) { +unittest { + assert(isIdentical(round(NaN(0xABC)), NaN(0xABC))); +} +} + +/** + * Returns the integer portion of x, dropping the fractional portion. + * + * This is also known as "chop" rounding. + */ +real trunc(real x) +{ + return tango.stdc.math.truncl(x); +} + +debug(UnitTest) { +unittest { + assert(isIdentical(trunc(NaN(0xABC)), NaN(0xABC))); +} +} + +/** +* Rounds x to the nearest int or long. +* +* This is generally the fastest method to convert a floating-point number +* to an integer. Note that the results from this function +* depend on the rounding mode, if the fractional part of x is exactly 0.5. +* If using the default rounding mode (ties round to even integers) +* rndint(4.5) == 4, rndint(5.5)==6. +*/ +int rndint(real x) +{ + version(DigitalMars_D_InlineAsm_X86) + { + int n; + asm + { + fld x; + fistp n; + } + return n; + } + else + { + return tango.stdc.math.lrintl(x); + } +} + +/** ditto */ +long rndlong(real x) +{ + version(DigitalMars_D_InlineAsm_X86) + { + long n; + asm + { + fld x; + fistp n; + } + return n; + } + else + { + return tango.stdc.math.llrintl(x); + } +} + +debug(UnitTest) { +version(D_InlineAsm_X86) { // Won't work for anything else yet + +unittest { + + int r = getIeeeRounding; + assert(r==RoundingMode.ROUNDTONEAREST); + real b = 5.5; + int cnear = tango.math.Math.rndint(b); + assert(cnear == 6); + auto oldrounding = setIeeeRounding(RoundingMode.ROUNDDOWN); + scope (exit) setIeeeRounding(oldrounding); + + assert(getIeeeRounding==RoundingMode.ROUNDDOWN); + + int cdown = tango.math.Math.rndint(b); + assert(cdown==5); +} + +unittest { + // Check that the previous test correctly restored the rounding mode + assert(getIeeeRounding==RoundingMode.ROUNDTONEAREST); +} +} +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/math/Probability.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/math/Probability.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,769 @@ +/** + * Cumulative Probability Distribution Functions + * + * Copyright: Based on the CEPHES math library, which is + * Copyright (C) 1994 Stephen L. Moshier (moshier@world.std.com). + * License: BSD style: $(LICENSE) + * Authors: Stephen L. Moshier (original C code), Don Clugston + */ + +/** + * Macros: + * NAN = $(RED NAN) + * SUP = $0 + * GAMMA = Γ + * INTEGRAL = ∫ + * INTEGRATE = $(BIG ∫$(SMALL $1)$2) + * POWER = $1$2 + * BIGSUM = $(BIG Σ $2$(SMALL $1)) + * CHOOSE = $(BIG () $(SMALL $1)$(SMALL $2) $(BIG )) + * TABLE_SV = + * + * $0
Special Values
+ * SVH = $(TR $(TH $1) $(TH $2)) + * SV = $(TR $(TD $1) $(TD $2)) + */ + +module tango.math.Probability; +static import tango.math.ErrorFunction; +private import tango.math.GammaFunction; +private import tango.math.Math; +private import tango.math.IEEE; + + +/*** +Cumulative distribution function for the Normal distribution, and its complement. + +The normal (or Gaussian, or bell-shaped) distribution is +defined as: + +normalDist(x) = 1/$(SQRT) π $(INTEGRAL -$(INFINITY), x) exp( - $(POWER t, 2)/2) dt + = 0.5 + 0.5 * erf(x/sqrt(2)) + = 0.5 * erfc(- x/sqrt(2)) + +Note that +normalDistribution(x) = 1 - normalDistribution(-x). + +Accuracy: +Within a few bits of machine resolution over the entire +range. + +References: +$(LINK http://www.netlib.org/cephes/ldoubdoc.html), +G. Marsaglia, "Evaluating the Normal Distribution", +Journal of Statistical Software 11, (July 2004). +*/ +real normalDistribution(real a) +{ + return tango.math.ErrorFunction.normalDistributionImpl(a); +} + +/** ditto */ +real normalDistributionCompl(real a) +{ + return -tango.math.ErrorFunction.normalDistributionImpl(-a); +} + +/****************************** + * Inverse of Normal distribution function + * + * Returns the argument, x, for which the area under the + * Normal probability density function (integrated from + * minus infinity to x) is equal to p. + * + * For small arguments 0 < p < exp(-2), the program computes + * z = sqrt( -2 log(p) ); then the approximation is + * x = z - log(z)/z - (1/z) P(1/z) / Q(1/z) . + * For larger arguments, x/sqrt(2 pi) = w + w^3 R(w^2)/S(w^2)) , + * where w = p - 0.5 . + */ +real normalDistributionInv(real p) +{ + return tango.math.ErrorFunction.normalDistributionInvImpl(p); +} + +/** ditto */ +real normalDistributionComplInv(real p) +{ + return -tango.math.ErrorFunction.normalDistributionInvImpl(-p); +} + +debug(UnitTest) { +unittest { + assert(feqrel(normalDistributionInv(normalDistribution(0.1)),0.1)>=real.mant_dig-4); + assert(feqrel(normalDistributionComplInv(normalDistributionCompl(0.1)),0.1)>=real.mant_dig-4); +} +} + +/** Student's t cumulative distribution function + * + * Computes the integral from minus infinity to t of the Student + * t distribution with integer nu > 0 degrees of freedom: + * + * $(GAMMA)( (nu+1)/2) / ( sqrt(nu π) $(GAMMA)(nu/2) ) * + * $(INTEGRATE -∞, t) $(POWER (1+$(POWER x, 2)/nu), -(nu+1)/2) dx + * + * Can be used to test whether the means of two normally distributed populations + * are equal. + * + * It is related to the incomplete beta integral: + * 1 - studentsDistribution(nu,t) = 0.5 * betaDistribution( nu/2, 1/2, z ) + * where + * z = nu/(nu + t2). + * + * For t < -1.6, this is the method of computation. For higher t, + * a direct method is derived from integration by parts. + * Since the function is symmetric about t=0, the area under the + * right tail of the density is found by calling the function + * with -t instead of t. + */ +real studentsTDistribution(int nu, real t) +in{ + assert(nu>0); +} +body{ + /* Based on code from Cephes Math Library Release 2.3: January, 1995 + Copyright 1984, 1995 by Stephen L. Moshier + */ + + if ( nu <= 0 ) return NaN(TANGO_NAN.STUDENTSDDISTRIBUTION_DOMAIN); // domain error -- or should it return 0? + if ( t == 0.0 ) return 0.5; + + real rk, z, p; + + if ( t < -1.6 ) { + rk = nu; + z = rk / (rk + t * t); + return 0.5L * betaIncomplete( 0.5L*rk, 0.5L, z ); + } + + /* compute integral from -t to + t */ + + rk = nu; /* degrees of freedom */ + + real x; + if (t < 0) x = -t; else x = t; + z = 1.0L + ( x * x )/rk; + + real f, tz; + int j; + + if ( nu & 1) { + /* computation for odd nu */ + real xsqk = x/sqrt(rk); + p = atan( xsqk ); + if ( nu > 1 ) { + f = 1.0L; + tz = 1.0L; + j = 3; + while( (j<=(nu-2)) && ( (tz/f) > real.epsilon ) ) { + tz *= (j-1)/( z * j ); + f += tz; + j += 2; + } + p += f * xsqk/z; + } + p *= 2.0L/PI; + } else { + /* computation for even nu */ + f = 1.0L; + tz = 1.0L; + j = 2; + + while ( ( j <= (nu-2) ) && ( (tz/f) > real.epsilon ) ) { + tz *= (j - 1)/( z * j ); + f += tz; + j += 2; + } + p = f * x/sqrt(z*rk); + } + if ( t < 0.0L ) + p = -p; /* note destruction of relative accuracy */ + + p = 0.5L + 0.5L * p; + return p; +} + +/** Inverse of Student's t distribution + * + * Given probability p and degrees of freedom nu, + * finds the argument t such that the one-sided + * studentsDistribution(nu,t) is equal to p. + * + * Params: + * nu = degrees of freedom. Must be >1 + * p = probability. 0 < p < 1 + */ +real studentsTDistributionInv(int nu, real p ) +in { + assert(nu>0); + assert(p>=0.0L && p<=1.0L); +} +body +{ + if (p==0) return -real.infinity; + if (p==1) return real.infinity; + + real rk, z; + rk = nu; + + if ( p > 0.25L && p < 0.75L ) { + if ( p == 0.5L ) return 0; + z = 1.0L - 2.0L * p; + z = betaIncompleteInv( 0.5L, 0.5L*rk, fabs(z) ); + real t = sqrt( rk*z/(1.0L-z) ); + if( p < 0.5L ) + t = -t; + return t; + } + int rflg = -1; // sign of the result + if (p >= 0.5L) { + p = 1.0L - p; + rflg = 1; + } + z = betaIncompleteInv( 0.5L*rk, 0.5L, 2.0L*p ); + + if (z<0) return rflg * real.infinity; + return rflg * sqrt( rk/z - rk ); +} + +debug(UnitTest) { +unittest { + +// There are simple forms for nu = 1 and nu = 2. + +// if (nu == 1), tDistribution(x) = 0.5 + atan(x)/PI +// so tDistributionInv(p) = tan( PI * (p-0.5) ); +// nu==2: tDistribution(x) = 0.5 * (1 + x/ sqrt(2+x*x) ) + +assert(studentsTDistribution(1, -0.4)== 0.5 + atan(-0.4)/PI); +assert(studentsTDistribution(2, 0.9) == 0.5L * (1 + 0.9L/sqrt(2.0L + 0.9*0.9)) ); +assert(studentsTDistribution(2, -5.4) == 0.5L * (1 - 5.4L/sqrt(2.0L + 5.4*5.4)) ); + +// return true if a==b to given number of places. +bool isfeqabs(real a, real b, real diff) +{ + return fabs(a-b) < diff; +} + +// Check a few spot values with statsoft.com (Mathworld values are wrong!!) +// According to statsoft.com, studentsDistributionInv(10, 0.995)= 3.16927. + +// The remaining values listed here are from Excel, and are unlikely to be accurate +// in the last decimal places. However, they are helpful as a sanity check. + +// Microsoft Excel 2003 gives TINV(2*(1-0.995), 10) == 3.16927267160917 +assert(isfeqabs(studentsTDistributionInv(10, 0.995), 3.169_272_67L, 0.000_000_005L)); + + +assert(isfeqabs(studentsTDistributionInv(8, 0.6), 0.261_921_096_769_043L,0.000_000_000_05L)); +// -TINV(2*0.4, 18) == -0.257123042655869 + +assert(isfeqabs(studentsTDistributionInv(18, 0.4), -0.257_123_042_655_869L, 0.000_000_000_05L)); +assert( feqrel(studentsTDistribution(18, studentsTDistributionInv(18, 0.4L)),0.4L) + > real.mant_dig-2 ); +assert( feqrel(studentsTDistribution(11, studentsTDistributionInv(11, 0.9L)),0.9L) + > real.mant_dig-2); +} +} + +/** The F distribution, its complement, and inverse. + * + * The F density function (also known as Snedcor's density or the + * variance ratio density) is the density + * of x = (u1/df1)/(u2/df2), where u1 and u2 are random + * variables having $(POWER χ,2) distributions with df1 + * and df2 degrees of freedom, respectively. + * + * fDistribution returns the area from zero to x under the F density + * function. The complementary function, + * fDistributionCompl, returns the area from x to ∞ under the F density function. + * + * The inverse of the complemented F distribution, + * fDistributionComplInv, finds the argument x such that the integral + * from x to infinity of the F density is equal to the given probability y. + * + * Can be used to test whether the means of multiple normally distributed + * populations, all with the same standard deviation, are equal; + * or to test that the standard deviations of two normally distributed + * populations are equal. + * + * Params: + * df1 = Degrees of freedom of the first variable. Must be >= 1 + * df2 = Degrees of freedom of the second variable. Must be >= 1 + * x = Must be >= 0 + */ +real fDistribution(int df1, int df2, real x) +in { + assert(df1>=1 && df2>=1); + assert(x>=0); +} +body{ + real a = cast(real)(df1); + real b = cast(real)(df2); + real w = a * x; + w = w/(b + w); + return betaIncomplete(0.5L*a, 0.5L*b, w); +} + +/** ditto */ +real fDistributionCompl(int df1, int df2, real x) +in { + assert(df1>=1 && df2>=1); + assert(x>=0); +} +body{ + real a = cast(real)(df1); + real b = cast(real)(df2); + real w = b / (b + a * x); + return betaIncomplete( 0.5L*b, 0.5L*a, w ); +} + +/* + * Inverse of complemented F distribution + * + * Finds the F density argument x such that the integral + * from x to infinity of the F density is equal to the + * given probability p. + * + * This is accomplished using the inverse beta integral + * function and the relations + * + * z = betaIncompleteInv( df2/2, df1/2, p ), + * x = df2 (1-z) / (df1 z). + * + * Note that the following relations hold for the inverse of + * the uncomplemented F distribution: + * + * z = betaIncompleteInv( df1/2, df2/2, p ), + * x = df2 z / (df1 (1-z)). +*/ + +/** ditto */ +real fDistributionComplInv(int df1, int df2, real p ) +in { + assert(df1>=1 && df2>=1); + assert(p>=0 && p<=1.0); +} +body{ + real a = df1; + real b = df2; + /* Compute probability for x = 0.5. */ + real w = betaIncomplete( 0.5L*b, 0.5L*a, 0.5L ); + /* If that is greater than p, then the solution w < .5. + Otherwise, solve at 1-p to remove cancellation in (b - b*w). */ + if ( w > p || p < 0.001L) { + w = betaIncompleteInv( 0.5L*b, 0.5L*a, p ); + return (b - b*w)/(a*w); + } else { + w = betaIncompleteInv( 0.5L*a, 0.5L*b, 1.0L - p ); + return b*w/(a*(1.0L-w)); + } +} + +debug(UnitTest) { +unittest { +// fDistCompl(df1, df2, x) = Excel's FDIST(x, df1, df2) + assert(fabs(fDistributionCompl(6, 4, 16.5) - 0.00858719177897249L)< 0.0000000000005L); + assert(fabs((1-fDistribution(12, 23, 0.1)) - 0.99990562845505L)< 0.0000000000005L); + assert(fabs(fDistributionComplInv(8, 34, 0.2) - 1.48267037661408L)< 0.0000000005L); + assert(fabs(fDistributionComplInv(4, 16, 0.008) - 5.043_537_593_48596L)< 0.0000000005L); + // Regression test: This one used to fail because of a bug in the definition of MINLOG. + assert(feqrel(fDistributionCompl(4, 16, fDistributionComplInv(4,16, 0.008)), 0.008)>=real.mant_dig-3); +} +} + +/** $(POWER χ,2) cumulative distribution function and its complement. + * + * Returns the area under the left hand tail (from 0 to x) + * of the Chi square probability density function with + * v degrees of freedom. The complement returns the area under + * the right hand tail (from x to ∞). + * + * chiSqrDistribution(x | v) = ($(INTEGRATE 0, x) + * $(POWER t, v/2-1) $(POWER e, -t/2) dt ) + * / $(POWER 2, v/2) $(GAMMA)(v/2) + * + * chiSqrDistributionCompl(x | v) = ($(INTEGRATE x, ∞) + * $(POWER t, v/2-1) $(POWER e, -t/2) dt ) + * / $(POWER 2, v/2) $(GAMMA)(v/2) + * + * Params: + * v = degrees of freedom. Must be positive. + * x = the $(POWER χ,2) variable. Must be positive. + * + */ +real chiSqrDistribution(real v, real x) +in { + assert(x>=0); + assert(v>=1.0); +} +body{ + return gammaIncomplete( 0.5*v, 0.5*x); +} + +/** ditto */ +real chiSqrDistributionCompl(real v, real x) +in { + assert(x>=0); + assert(v>=1.0); +} +body{ + return gammaIncompleteCompl( 0.5L*v, 0.5L*x ); +} + +/** + * Inverse of complemented $(POWER χ, 2) distribution + * + * Finds the $(POWER χ, 2) argument x such that the integral + * from x to ∞ of the $(POWER χ, 2) density is equal + * to the given cumulative probability p. + * + * Params: + * p = Cumulative probability. 0<= p <=1. + * v = Degrees of freedom. Must be positive. + * + */ +real chiSqrDistributionComplInv(real v, real p) +in { + assert(p>=0 && p<=1.0L); + assert(v>=1.0L); +} +body +{ + return 2.0 * gammaIncompleteComplInv( 0.5*v, p); +} + +debug(UnitTest) { +unittest { + assert(feqrel(chiSqrDistributionCompl(3.5L, chiSqrDistributionComplInv(3.5L, 0.1L)), 0.1L)>=real.mant_dig-3); + assert(chiSqrDistribution(19.02L, 0.4L) + chiSqrDistributionCompl(19.02L, 0.4L) ==1.0L); +} +} + +/** + * The Γ distribution and its complement + * + * The Γ distribution is defined as the integral from 0 to x of the + * gamma probability density function. The complementary function returns the + * integral from x to ∞ + * + * gammaDistribution = ($(INTEGRATE 0, x) $(POWER t, b-1)$(POWER e, -at) dt) $(POWER a, b)/Γ(b) + * + * x must be greater than 0. + */ +real gammaDistribution(real a, real b, real x) +in { + assert(x>=0); +} +body { + return gammaIncomplete(b, a*x); +} + +/** ditto */ +real gammaDistributionCompl(real a, real b, real x ) +in { + assert(x>=0); +} +body { + return gammaIncompleteCompl( b, a * x ); +} + +debug(UnitTest) { +unittest { + assert(gammaDistribution(7,3,0.18)+gammaDistributionCompl(7,3,0.18)==1); +} +} + +/********************** + * Beta distribution and its inverse + * + * Returns the incomplete beta integral of the arguments, evaluated + * from zero to x. The function is defined as + * + * betaDistribution = Γ(a+b)/(Γ(a) Γ(b)) * + * $(INTEGRATE 0, x) $(POWER t, a-1)$(POWER (1-t),b-1) dt + * + * The domain of definition is 0 <= x <= 1. In this + * implementation a and b are restricted to positive values. + * The integral from x to 1 may be obtained by the symmetry + * relation + * + * betaDistributionCompl(a, b, x ) = betaDistribution( b, a, 1-x ) + * + * The integral is evaluated by a continued fraction expansion + * or, when b*x is small, by a power series. + * + * The inverse finds the value of x for which betaDistribution(a,b,x) - y = 0 + */ +real betaDistribution(real a, real b, real x ) +{ + return betaIncomplete(a, b, x ); +} + +/** ditto */ +real betaDistributionCompl(real a, real b, real x) +{ + return betaIncomplete(b, a, 1-x); +} + +/** ditto */ +real betaDistributionInv(real a, real b, real y) +{ + return betaIncompleteInv(a, b, y); +} + +/** ditto */ +real betaDistributionComplInv(real a, real b, real y) +{ + return 1-betaIncompleteInv(b, a, y); +} + +debug(UnitTest) { +unittest { + assert(feqrel(betaDistributionInv(2, 6, betaDistribution(2,6, 0.7L)),0.7L)>=real.mant_dig-3); + assert(feqrel(betaDistributionComplInv(1.3, 8, betaDistributionCompl(1.3,8, 0.01L)),0.01L)>=real.mant_dig-4); +} +} + +/** + * The Poisson distribution, its complement, and inverse + * + * k is the number of events. m is the mean. + * The Poisson distribution is defined as the sum of the first k terms of + * the Poisson density function. + * The complement returns the sum of the terms k+1 to ∞. + * + * poissonDistribution = $(BIGSUM j=0, k) $(POWER e, -m) $(POWER m, j)/j! + * + * poissonDistributionCompl = $(BIGSUM j=k+1, ∞) $(POWER e, -m) $(POWER m, j)/j! + * + * The terms are not summed directly; instead the incomplete + * gamma integral is employed, according to the relation + * + * y = poissonDistribution( k, m ) = gammaIncompleteCompl( k+1, m ). + * + * The arguments must both be positive. + */ +real poissonDistribution(int k, real m ) +in { + assert(k>=0); + assert(m>0); +} +body { + return gammaIncompleteCompl( k+1.0, m ); +} + +/** ditto */ +real poissonDistributionCompl(int k, real m ) +in { + assert(k>=0); + assert(m>0); +} +body { + return gammaIncomplete( k+1.0, m ); +} + +/** ditto */ +real poissonDistributionInv( int k, real p ) +in { + assert(k>=0); + assert(p>=0.0 && p<=1.0); +} +body { + return gammaIncompleteComplInv(k+1, p); +} + +debug(UnitTest) { +unittest { +// = Excel's POISSON(k, m, TRUE) + assert( fabs(poissonDistribution(5, 6.3) + - 0.398771730072867L) < 0.000000000000005L); + assert( feqrel(poissonDistributionInv(8, poissonDistribution(8, 2.7e3L)), 2.7e3L)>=real.mant_dig-2); + assert( poissonDistribution(2, 8.4e-5) + poissonDistributionCompl(2, 8.4e-5) == 1.0L); +} +} + +/*********************************** + * Binomial distribution and complemented binomial distribution + * + * The binomial distribution is defined as the sum of the terms 0 through k + * of the Binomial probability density. + * The complement returns the sum of the terms k+1 through n. + * + binomialDistribution = $(BIGSUM j=0, k) $(CHOOSE n, j) $(POWER p, j) $(POWER (1-p), n-j) + + binomialDistributionCompl = $(BIGSUM j=k+1, n) $(CHOOSE n, j) $(POWER p, j) $(POWER (1-p), n-j) + * + * The terms are not summed directly; instead the incomplete + * beta integral is employed, according to the formula + * + * y = binomialDistribution( k, n, p ) = betaDistribution( n-k, k+1, 1-p ). + * + * The arguments must be positive, with p ranging from 0 to 1, and k<=n. + */ +real binomialDistribution(int k, int n, real p ) +in { + assert(p>=0 && p<=1.0); // domain error + assert(k>=0 && k<=n); +} +body{ + real dk, dn, q; + if( k == n ) + return 1.0L; + + q = 1.0L - p; + dn = n - k; + if ( k == 0 ) { + return pow( q, dn ); + } else { + return betaIncomplete( dn, k + 1, q ); + } +} + +debug(UnitTest) { +unittest { + // = Excel's BINOMDIST(k, n, p, TRUE) + assert( fabs(binomialDistribution(8, 12, 0.5) + - 0.927001953125L) < 0.0000000000005L); + assert( fabs(binomialDistribution(0, 3, 0.008L) + - 0.976191488L) < 0.00000000005L); + assert(binomialDistribution(7,7, 0.3)==1.0); +} +} + + /** ditto */ +real binomialDistributionCompl(int k, int n, real p ) +in { + assert(p>=0 && p<=1.0); // domain error + assert(k>=0 && k<=n); +} +body{ + if ( k == n ) { + return 0; + } + real dn = n - k; + if ( k == 0 ) { + if ( p < .01L ) + return -expm1( dn * log1p(-p) ); + else + return 1.0L - pow( 1.0L-p, dn ); + } else { + return betaIncomplete( k+1, dn, p ); + } +} + +debug(UnitTest){ +unittest { + // = Excel's (1 - BINOMDIST(k, n, p, TRUE)) + assert( fabs(1.0L-binomialDistributionCompl(0, 15, 0.003) + - 0.955932824838906L) < 0.0000000000000005L); + assert( fabs(1.0L-binomialDistributionCompl(0, 25, 0.2) + - 0.00377789318629572L) < 0.000000000000000005L); + assert( fabs(1.0L-binomialDistributionCompl(8, 12, 0.5) + - 0.927001953125L) < 0.00000000000005L); + assert(binomialDistributionCompl(7,7, 0.3)==0.0); +} +} + +/** Inverse binomial distribution + * + * Finds the event probability p such that the sum of the + * terms 0 through k of the Binomial probability density + * is equal to the given cumulative probability y. + * + * This is accomplished using the inverse beta integral + * function and the relation + * + * 1 - p = betaDistributionInv( n-k, k+1, y ). + * + * The arguments must be positive, with 0 <= y <= 1, and k <= n. + */ +real binomialDistributionInv( int k, int n, real y ) +in { + assert(y>=0 && y<=1.0); // domain error + assert(k>=0 && k<=n); +} +body{ + real dk, p; + real dn = n - k; + if ( k == 0 ) { + if( y > 0.8L ) + p = -expm1( log1p(y-1.0L) / dn ); + else + p = 1.0L - pow( y, 1.0L/dn ); + } else { + dk = k + 1; + p = betaIncomplete( dn, dk, y ); + if( p > 0.5 ) + p = betaIncompleteInv( dk, dn, 1.0L-y ); + else + p = 1.0 - betaIncompleteInv( dn, dk, y ); + } + return p; +} + +debug(UnitTest){ +unittest { + real w = binomialDistribution(9, 15, 0.318L); + assert(feqrel(binomialDistributionInv(9, 15, w), 0.318L)>=real.mant_dig-3); + w = binomialDistribution(5, 35, 0.718L); + assert(feqrel(binomialDistributionInv(5, 35, w), 0.718L)>=real.mant_dig-3); + w = binomialDistribution(0, 24, 0.637L); + assert(feqrel(binomialDistributionInv(0, 24, w), 0.637L)>=real.mant_dig-3); + w = binomialDistributionInv(0, 59, 0.962L); + assert(feqrel(binomialDistribution(0, 59, w), 0.962L)>=real.mant_dig-5); +} +} + +/** Negative binomial distribution and its inverse + * + * Returns the sum of the terms 0 through k of the negative + * binomial distribution: + * + * $(BIGSUM j=0, k) $(CHOOSE n+j-1, j-1) $(POWER p, n) $(POWER (1-p), j) + * + * In a sequence of Bernoulli trials, this is the probability + * that k or fewer failures precede the n-th success. + * + * The arguments must be positive, with 0 < p < 1 and r>0. + * + * The inverse finds the argument y such + * that negativeBinomialDistribution(k,n,y) is equal to p. + * + * The Geometric Distribution is a special case of the negative binomial + * distribution. + * ----------------------- + * geometricDistribution(k, p) = negativeBinomialDistribution(k, 1, p); + * ----------------------- + * References: + * $(LINK http://mathworld.wolfram.com/NegativeBinomialDistribution.html) + */ + +real negativeBinomialDistribution(int k, int n, real p ) +in { + assert(p>=0 && p<=1.0); // domain error + assert(k>=0); +} +body{ + if ( k == 0 ) return pow( p, n ); + return betaIncomplete( n, k + 1, p ); +} + +/** ditto */ +real negativeBinomialDistributionInv(int k, int n, real p ) +in { + assert(p>=0 && p<=1.0); // domain error + assert(k>=0); +} +body{ + return betaIncompleteInv(n, k + 1, p); +} + +debug(UnitTest) { +unittest { + // Value obtained by sum of terms of MS Excel 2003's NEGBINOMDIST. + assert( fabs(negativeBinomialDistribution(10, 20, 0.2) - 3.830_52E-08)< 0.000_005e-08); + assert(feqrel(negativeBinomialDistributionInv(14, 208, negativeBinomialDistribution(14, 208, 1e-4L)), 1e-4L)>=real.mant_dig-3); +} +} \ No newline at end of file diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/math/Random.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/math/Random.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,178 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: April 2004 + + author: Various + +*******************************************************************************/ + +module tango.math.Random; + + +version (Win32) + private extern(Windows) int QueryPerformanceCounter (ulong *); + +version (Posix) + { + private import tango.stdc.posix.sys.time; + } + + +/****************************************************************************** + + KISS (via George Marsaglia & Paul Hsieh) + + the idea is to use simple, fast, individually promising + generators to get a composite that will be fast, easy to code + have a very long period and pass all the tests put to it. + The three components of KISS are + + x(n)=a*x(n-1)+1 mod 2^32 + y(n)=y(n-1)(I+L^13)(I+R^17)(I+L^5), + z(n)=2*z(n-1)+z(n-2) +carry mod 2^32 + + The y's are a shift register sequence on 32bit binary vectors + period 2^32-1; The z's are a simple multiply-with-carry sequence + with period 2^63+2^32-1. + + The period of KISS is thus 2^32*(2^32-1)*(2^63+2^32-1) > 2^127 + +******************************************************************************/ + +class Random +{ + /********************************************************************** + + Shared instance: + --- + auto random = Random.shared.next; + --- + + **********************************************************************/ + public static Random shared; + + private uint kiss_k; + private uint kiss_m; + private uint kiss_x = 1; + private uint kiss_y = 2; + private uint kiss_z = 4; + private uint kiss_w = 8; + private uint kiss_carry = 0; + + /********************************************************************** + + Create a static and shared instance: + --- + auto random = Random.shared.next; + --- + + **********************************************************************/ + + static this () + { + shared = new Random; + } + + /********************************************************************** + + Creates and seeds a new generator with the current time + + **********************************************************************/ + + this () + { + this.seed; + } + + /********************************************************************** + + Seed the generator with current time + + **********************************************************************/ + + final Random seed () + { + ulong s; + + version (Posix) + { + timeval tv; + + gettimeofday (&tv, null); + s = tv.tv_usec; + } + version (Win32) + QueryPerformanceCounter (&s); + + return seed (cast(uint) s); + } + + /********************************************************************** + + Seed the generator with a provided value + + **********************************************************************/ + + final Random seed (uint seed) + { + kiss_x = seed | 1; + kiss_y = seed | 2; + kiss_z = seed | 4; + kiss_w = seed | 8; + kiss_carry = 0; + return this; + } + + /********************************************************************** + + Returns X such that 0 <= X <= uint.max + + **********************************************************************/ + + final uint next () + { + kiss_x = kiss_x * 69069 + 1; + kiss_y ^= kiss_y << 13; + kiss_y ^= kiss_y >> 17; + kiss_y ^= kiss_y << 5; + kiss_k = (kiss_z >> 2) + (kiss_w >> 3) + (kiss_carry >> 2); + kiss_m = kiss_w + kiss_w + kiss_z + kiss_carry; + kiss_z = kiss_w; + kiss_w = kiss_m; + kiss_carry = kiss_k >> 30; + return kiss_x + kiss_y + kiss_w; + } + + /********************************************************************** + + Returns X such that 0 <= X < max + + Note that max is exclusive, making it compatible with + array indexing + + **********************************************************************/ + + final uint next (uint max) + { + return next() % max; + } + + /********************************************************************** + + Returns X such that min <= X < max + + Note that max is exclusive, making it compatible with + array indexing + + **********************************************************************/ + + final uint next (uint min, uint max) + { + return next(max-min) + min; + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/DatagramConduit.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/DatagramConduit.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,173 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Mar 2004 : Initial release + version: Dec 2006 : South Pacific release + + author: Kris + +*******************************************************************************/ + +module tango.net.DatagramConduit; + +public import tango.io.Conduit; + +package import tango.net.Socket, + tango.net.SocketConduit; + +/******************************************************************************* + + Datagrams provide a low-overhead, non-reliable data transmission + mechanism. + + Datagrams are not 'connected' in the same manner as a TCP socket; you + don't need to listen() or accept() to receive a datagram, and data + may arrive from multiple sources. A datagram socket may, however, + still use the connect() method like a TCP socket. When connected, + the read() and write() methods will be restricted to a single address + rather than being open instead. That is, applying connect() will make + the address argument to both read() and write() irrelevant. Without + connect(), method write() must be supplied with an address and method + read() should be supplied with one to identify where data originated. + + Note that when used as a listener, you must first bind the socket + to a local adapter. This can be achieved by binding the socket to + an InternetAddress constructed with a port only (ADDR_ANY), thus + requesting the OS to assign the address of a local network adapter + +*******************************************************************************/ + +class DatagramConduit : SocketConduit +{ + private Address to, + from; + + /*********************************************************************** + + Create a read/write datagram socket + + ***********************************************************************/ + + this () + { + super (SocketType.DGRAM, ProtocolType.IP); + } + + /*********************************************************************** + + Read bytes from an available datagram into the given array. + When provided, the 'from' address will be populated with the + origin of the incoming data. Note that we employ the timeout + mechanics exposed via our SocketConduit superclass. + + Returns the number of bytes read from the input, or Eof if + the socket cannot read + + ***********************************************************************/ + + uint read (void[] dst, Address from=null) + { + this.from = from; + return input.read (dst); + } + + /*********************************************************************** + + Write an array to the specified address. If address 'to' is + null, it is assumed the socket has been connected instead. + + Returns the number of bytes sent to the output, or Eof if + the socket cannot write + + ***********************************************************************/ + + uint write (void[] src, Address to=null) + { + this.to = to; + return output.write (src); + } + + /*********************************************************************** + + SocketConduit override: + + Read available datagram bytes into a provided array. Returns + the number of bytes read from the input, or Eof if the socket + cannot read. + + Note that we're taking advantage of timout support within the + superclass + + ***********************************************************************/ + + protected override uint socketReader (void[] dst) + { + int count; + + if (dst.length) + count = (from) ? socket.receiveFrom (dst, from) : socket.receiveFrom (dst); + + return count; + } + + /*********************************************************************** + + SocketConduit override: + + Write the provided content to the socket. This will stall + until the socket responds in some manner. If there is no + target address held by this class, we assume the datagram + has been connected instead. + + Returns the number of bytes sent to the output, or Eof if + the socket cannot write + + ***********************************************************************/ + + protected override uint write (void[] src) + { + int count; + + if (src.length) + { + count = (to) ? socket.sendTo (src, to) : socket.sendTo (src); + if (count <= 0) + count = Eof; + } + return count; + } +} + + + +/****************************************************************************** + +*******************************************************************************/ + +debug (Datagram) +{ + import tango.io.Console; + + import tango.net.InternetAddress; + + void main() + { + auto addr = new InternetAddress ("127.0.0.1", 8080); + + // listen for datagrams on the local address + auto gram = new DatagramConduit; + gram.bind (addr); + + // write to the local address + gram.write ("hello", addr); + + // we are listening also ... + char[8] tmp; + auto x = new InternetAddress; + auto bytes = gram.read (tmp, x); + Cout (x) (tmp[0..bytes]).newline; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/InternetAddress.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/InternetAddress.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,86 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: Aug 2006 + + author: Kris + +*******************************************************************************/ + +module tango.net.InternetAddress; + +private import tango.net.Socket; + +/******************************************************************************* + + +*******************************************************************************/ + +class InternetAddress : IPv4Address +{ + /*********************************************************************** + + useful for Datagrams + + ***********************************************************************/ + + this(){} + + /*********************************************************************** + + -port- can be PORT_ANY + -addr- is an IP address or host name + + ***********************************************************************/ + + this (char[] addr, int port = PORT_ANY) + { + foreach (int i, char c; addr) + if (c is ':') + { + port = parse (addr [i+1 .. $]); + addr = addr [0 .. i]; + break; + } + + super (addr, cast(ushort) port); + } + + /*********************************************************************** + + + ***********************************************************************/ + + this (uint addr, ushort port) + { + super (addr, port); + } + + + /*********************************************************************** + + + ***********************************************************************/ + + this (ushort port) + { + super (port); + } + + /********************************************************************** + + **********************************************************************/ + + private static int parse (char[] s) + { + int number; + + foreach (c; s) + number = number * 10 + (c - '0'); + + return number; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/MulticastConduit.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/MulticastConduit.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,186 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Jun 2004 : Initial release + version: Dec 2006 : South pacific version + + author: Kris + +*******************************************************************************/ + +module tango.net.MulticastConduit; + +public import tango.io.Conduit; + +private import tango.net.DatagramConduit, + tango.net.InternetAddress; + +/****************************************************************************** + + MulticastConduit sends and receives data on a multicast group, as + described by a class-D address. To send data, the recipient group + should be handed to the write() method. To receive, the socket is + bound to an available local adapter/port as a listener and must + join() the group before it becomes eligible for input from there. + + While MulticastConduit is a flavour of datagram, it doesn't support + being connected to a specific endpoint. + + Sending and receiving via a multicast group: + --- + auto group = new InternetAddress ("225.0.0.10", 8080); + + // listen for datagrams on the group address (via port 8080) + auto multi = new MulticastConduit (group); + + // join and broadcast to the group + multi.join.write ("hello", group); + + // we are listening also ... + char[8] tmp; + auto bytes = multi.read (tmp); + --- + + Note that this example is expecting to receive its own broadcast; + thus it may be necessary to enable loopback operation (see below) + for successful receipt of the broadcast. + + Note that class D addresses range from 225.0.0.0 to 239.255.255.255 + + see: http://www.kohala.com/start/mcast.api.txt + +*******************************************************************************/ + +class MulticastConduit : DatagramConduit +{ + private IPv4Address group; + + enum {Host=0, Subnet=1, Site=32, Region=64, Continent=128, Unrestricted=255} + + /*********************************************************************** + + Create a writable multicast socket + + ***********************************************************************/ + + this () + { + super (); + } + + /*********************************************************************** + + Create a read/write multicast socket + + This flavour is necessary only for a multicast receiver + (e.g. use this ctor in conjunction with SocketListener). + + You should specify both a group address and a port to + listen upon. The resultant socket will be bound to the + specified port (locally), and listening on the class-D + address. Expect this to fail without a network adapter + present, as bind() will not find anything to work with. + + The reuse parameter dictates how to behave when the port + is already in use. Default behaviour is to throw an IO + exception, and the alternate is to force usage. + + To become eligible for incoming group datagrams, you must + also invoke the join() method + + ***********************************************************************/ + + this (InternetAddress group, bool reuse = false) + { + super (); + + this.group = group; + socket.setAddressReuse(reuse).bind(new InternetAddress(group.port)); + } + + /*********************************************************************** + + Enable/disable the receipt of multicast packets sent + from the same adapter. The default state is OS specific + + ***********************************************************************/ + + MulticastConduit loopback (bool yes = true) + { + uint[1] onoff = yes; + socket.setOption (SocketOptionLevel.IP, SocketOption.IP_MULTICAST_LOOP, onoff); + return this; + } + + /*********************************************************************** + + Set the number of hops (time to live) of this socket. + Convenient values are + --- + Host: packets are restricted to the same host + Subnet: packets are restricted to the same subnet + Site: packets are restricted to the same site + Region: packets are restricted to the same region + Continent: packets are restricted to the same continent + Unrestricted: packets are unrestricted in scope + --- + + ***********************************************************************/ + + MulticastConduit ttl (uint value=Subnet) + { + uint[1] options = value; + socket.setOption (SocketOptionLevel.IP, SocketOption.IP_MULTICAST_TTL, options); + return this; + } + + /*********************************************************************** + + Add this socket to the listening group + + ***********************************************************************/ + + MulticastConduit join () + { + socket.joinGroup (group, true); + return this; + } + + /*********************************************************************** + + Remove this socket from the listening group + + ***********************************************************************/ + + MulticastConduit leave () + { + socket.joinGroup (group, false); + return this; + } +} + + +/****************************************************************************** + +*******************************************************************************/ + +debug (Multicast) +{ + void main() + { + auto group = new InternetAddress ("225.0.0.10", 8080); + + // listen for datagrams on the group address + auto multi = new MulticastConduit (group); + + // join and broadcast to the group + multi.join.write ("hello", group); + + // we are listening also ... + char[8] tmp; + auto bytes = multi.read (tmp); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/ServerSocket.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/ServerSocket.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,124 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: March 2004 + Outback release: December 2006 + + author: Kris + +*******************************************************************************/ + +module tango.net.ServerSocket; + +private import tango.net.Socket, + tango.net.SocketConduit; + +private import tango.io.model.IConduit; + +public import tango.net.InternetAddress; + +/******************************************************************************* + + ServerSocket is a wrapper upon the basic socket functionality to + simplify the API somewhat. You use a ServerSocket to listen for + inbound connection requests, and get back a SocketConduit when a + connection is made. + + Accepted SocketConduit instances are held in a free-list to help + avoid heap activity. These instances are recycled upon invoking + the close() method, and one should ensure that occurs + +*******************************************************************************/ + +class ServerSocket : ISelectable +{ + private Socket socket_; + private int linger = -1; + + /*********************************************************************** + + Construct a ServerSocket on the given address, with the + specified number of backlog connections supported. The + socket is bound to the given address, and set to listen + for incoming connections. Note that the socket address + can be setup for reuse, so that a halted server may be + restarted immediately. + + ***********************************************************************/ + + this (InternetAddress addr, int backlog=32, bool reuse=false) + { + socket_ = new Socket (AddressFamily.INET, SocketType.STREAM, ProtocolType.IP); + socket_.setAddressReuse(reuse).bind(addr).listen(backlog); + } + + /*********************************************************************** + + Models a handle-oriented device. + + TODO: figure out how to avoid exposing this in the general + case + + ***********************************************************************/ + + Handle fileHandle () + { + return cast(Handle) socket_.fileHandle; + } + + /*********************************************************************** + + Set the period in which dead sockets are left lying around + by the O/S + + ***********************************************************************/ + + void setLingerPeriod (int period) + { + linger = period; + } + + /*********************************************************************** + + Return the wrapped socket + + ***********************************************************************/ + + Socket socket () + { + return socket_; + } + + /*********************************************************************** + + Is this server still alive? + + ***********************************************************************/ + + bool isAlive () + { + return socket_.isAlive; + } + + /*********************************************************************** + + Wait for a client to connect to us, and return a connected + SocketConduit. + + ***********************************************************************/ + + SocketConduit accept () + { + auto wrapper = SocketConduit.allocate(); + auto accepted = socket_.accept (wrapper.socket); + + // force abortive closure to avoid prolonged OS scavenging? + if (linger >= 0) + accepted.setLingerPeriod (linger); + + return wrapper; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/Socket.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/Socket.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,2160 @@ +/* + Copyright (C) 2004 Christopher E. Miller + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source distribution. + +*/ + +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: March 2004 + + author: Christopher Miller + Kris Bell + Anders F Bjorklund (Darwin patches) + + + The original code has been modified in several ways: + + 1) It has been altered to fit within the Tango environment, meaning + that certain original classes have been reorganized, and/or have + subclassed Tango base-classes. For example, the original Socket + class has been wrapped with three distinct subclasses, and now + derives from class tango.io.Resource. + + 2) All exception instances now subclass the Tango IOException. + + 3) Construction of new Socket instances via accept() is now + overloadable. + + 4) Constants and enums have been moved within a class boundary to + ensure explicit namespace usage. + + 5) changed Socket.select() to loop if it was interrupted. + + + All changes within the main body of code all marked with "Tango:" + + For a good tutorial on socket-programming I highly recommend going + here: http://www.ecst.csuchico.edu/~beej/guide/net/ + +*******************************************************************************/ + +module tango.net.Socket; + +private import tango.time.Time; + +private import tango.sys.Common; + +private import tango.core.Exception; + + +/******************************************************************************* + + +*******************************************************************************/ + +version=Tango; +version (Tango) +{ + private char[] toString (char[] tmp, int i) + { + int j = tmp.length; + do { + tmp[--j] = i % 10 + '0'; + } while (i /= 10); + + return tmp [j .. $]; + } +} + +version (linux) + version = BsdSockets; + +version (darwin) + version = BsdSockets; + +version (Posix) + version = BsdSockets; + + +/******************************************************************************* + + +*******************************************************************************/ + +version (Win32) + { + pragma(lib, "ws2_32.lib"); + + private typedef int socket_t = ~0; + + private const int IOCPARM_MASK = 0x7f; + private const int IOC_IN = cast(int)0x80000000; + private const int FIONBIO = cast(int) (IOC_IN | ((int.sizeof & IOCPARM_MASK) << 16) | (102 << 8) | 126); + + private const int WSADESCRIPTION_LEN = 256; + private const int WSASYS_STATUS_LEN = 128; + private const int WSAEWOULDBLOCK = 10035; + private const int WSAEINTR = 10004; + + + struct WSADATA + { + WORD wVersion; + WORD wHighVersion; + char szDescription[WSADESCRIPTION_LEN+1]; + char szSystemStatus[WSASYS_STATUS_LEN+1]; + ushort iMaxSockets; + ushort iMaxUdpDg; + char* lpVendorInfo; + } + alias WSADATA* LPWSADATA; + + extern (Windows) + { + int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData); + int WSACleanup(); + socket_t socket(int af, int type, int protocol); + int ioctlsocket(socket_t s, int cmd, uint* argp); + uint inet_addr(char* cp); + int bind(socket_t s, sockaddr* name, int namelen); + int connect(socket_t s, sockaddr* name, int namelen); + int listen(socket_t s, int backlog); + socket_t accept(socket_t s, sockaddr* addr, int* addrlen); + int closesocket(socket_t s); + int shutdown(socket_t s, int how); + int getpeername(socket_t s, sockaddr* name, int* namelen); + int getsockname(socket_t s, sockaddr* name, int* namelen); + int send(socket_t s, void* buf, int len, int flags); + int sendto(socket_t s, void* buf, int len, int flags, sockaddr* to, int tolen); + int recv(socket_t s, void* buf, int len, int flags); + int recvfrom(socket_t s, void* buf, int len, int flags, sockaddr* from, int* fromlen); + int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* errorfds, timeval* timeout); + //int __WSAFDIsSet(socket_t s, fd_set* fds); + int getsockopt(socket_t s, int level, int optname, void* optval, int* optlen); + int setsockopt(socket_t s, int level, int optname, void* optval, int optlen); + int gethostname(void* namebuffer, int buflen); + char* inet_ntoa(uint ina); + hostent* gethostbyname(char* name); + hostent* gethostbyaddr(void* addr, int len, int type); + int WSAGetLastError(); + } + + static this() + { + WSADATA wd; + if (WSAStartup (0x0101, &wd)) + throw new SocketException("Unable to initialize socket library"); + } + + + static ~this() + { + WSACleanup(); + } + + } + +version (BsdSockets) + { + private import tango.stdc.errno; + + private typedef int socket_t = -1; + + private const int F_GETFL = 3; + private const int F_SETFL = 4; + version (darwin) + private const int O_NONBLOCK = 0x0004; + else + private const int O_NONBLOCK = 04000; // OCTAL! Thx to volcore + + extern (C) + { + socket_t socket(int af, int type, int protocol); + int fcntl(socket_t s, int f, ...); + uint inet_addr(char* cp); + int bind(socket_t s, sockaddr* name, int namelen); + int connect(socket_t s, sockaddr* name, int namelen); + int listen(socket_t s, int backlog); + socket_t accept(socket_t s, sockaddr* addr, int* addrlen); + int close(socket_t s); + int shutdown(socket_t s, int how); + int getpeername(socket_t s, sockaddr* name, int* namelen); + int getsockname(socket_t s, sockaddr* name, int* namelen); + int send(socket_t s, void* buf, int len, int flags); + int sendto(socket_t s, void* buf, int len, int flags, sockaddr* to, int tolen); + int recv(socket_t s, void* buf, int len, int flags); + int recvfrom(socket_t s, void* buf, int len, int flags, sockaddr* from, int* fromlen); + int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* errorfds, timeval* timeout); + int getsockopt(socket_t s, int level, int optname, void* optval, int* optlen); + int setsockopt(socket_t s, int level, int optname, void* optval, int optlen); + int gethostname(void* namebuffer, int buflen); + char* inet_ntoa(uint ina); + hostent* gethostbyname(char* name); + hostent* gethostbyaddr(void* addr, int len, int type); + } + } + + +/******************************************************************************* + + +*******************************************************************************/ + +private const socket_t INVALID_SOCKET = socket_t.init; +private const int SOCKET_ERROR = -1; + + + +/******************************************************************************* + + Internal structs: + +*******************************************************************************/ + +struct timeval +{ + int tv_sec; //seconds + int tv_usec; //microseconds +} + + +//transparent +struct fd_set +{ +} + + +struct sockaddr +{ + ushort sa_family; + char[14] sa_data = [0]; +} + + +struct hostent +{ + char* h_name; + char** h_aliases; + version(Win32) + { + short h_addrtype; + short h_length; + } + else version(BsdSockets) + { + int h_addrtype; + int h_length; + } + char** h_addr_list; + + + char* h_addr() + { + return h_addr_list[0]; + } +} + + +/******************************************************************************* + + conversions for network byte-order + +*******************************************************************************/ + +version(BigEndian) +{ + ushort htons(ushort x) + { + return x; + } + + + uint htonl(uint x) + { + return x; + } +} +else version(LittleEndian) +{ + import tango.core.BitManip; + + + ushort htons(ushort x) + { + return cast(ushort) ((x >> 8) | (x << 8)); + } + + + uint htonl(uint x) + { + return bswap(x); + } +} +else +{ + static assert(0); +} + + +ushort ntohs(ushort x) +{ + return htons(x); +} + + +uint ntohl(uint x) +{ + return htonl(x); +} + + +/******************************************************************************* + + +*******************************************************************************/ + +private extern (C) int strlen(char*); + +private static char[] toString(char* s) +{ + return s ? s[0 .. strlen(s)] : cast(char[])null; +} + +private static char* convert2C (char[] input, char[] output) +{ + output [0 .. input.length] = input; + output [input.length] = 0; + return output.ptr; +} + + +/******************************************************************************* + + Public interface ... + +*******************************************************************************/ + +public: + + +/******************************************************************************* + + +*******************************************************************************/ + +static int lastError () +{ + version (Win32) + { + return WSAGetLastError(); + } + version (Posix) + { + return errno; + } +} + + +/*********************************************************************** + + +***********************************************************************/ + +version (Win32) +{ + /*************************************************************** + + + ***************************************************************/ + + enum SocketOption: int + { + //consistent + SO_DEBUG = 0x1, + + //possibly Winsock-only values + SO_BROADCAST = 0x20, + SO_REUSEADDR = 0x4, + SO_LINGER = 0x80, + SO_DONTLINGER = ~(SO_LINGER), + SO_OOBINLINE = 0x100, + SO_SNDBUF = 0x1001, + SO_RCVBUF = 0x1002, + SO_ERROR = 0x1007, + + SO_ACCEPTCONN = 0x2, // ? + SO_KEEPALIVE = 0x8, // ? + SO_DONTROUTE = 0x10, // ? + SO_TYPE = 0x1008, // ? + + // OptionLevel.IP settings + IP_MULTICAST_TTL = 10, + IP_MULTICAST_LOOP = 11, + IP_ADD_MEMBERSHIP = 12, + IP_DROP_MEMBERSHIP = 13, + + // OptionLevel.TCP settings + TCP_NODELAY = 0x0001, + } + + /*************************************************************** + + + ***************************************************************/ + + union linger + { + struct { + ushort l_onoff; // option on/off + ushort l_linger; // linger time + }; + ushort[2] array; // combined + } + + /*************************************************************** + + + ***************************************************************/ + + enum SocketOptionLevel + { + SOCKET = 0xFFFF, + IP = 0, + TCP = 6, + UDP = 17, + } +} +else version (darwin) +{ + enum SocketOption: int + { + SO_DEBUG = 0x0001, /* turn on debugging info recording */ + SO_BROADCAST = 0x0020, /* permit sending of broadcast msgs */ + SO_REUSEADDR = 0x0004, /* allow local address reuse */ + SO_LINGER = 0x0080, /* linger on close if data present */ + SO_DONTLINGER = ~(SO_LINGER), + SO_OOBINLINE = 0x0100, /* leave received OOB data in line */ + SO_ACCEPTCONN = 0x0002, /* socket has had listen() */ + SO_KEEPALIVE = 0x0008, /* keep connections alive */ + SO_DONTROUTE = 0x0010, /* just use interface addresses */ + SO_TYPE = 0x1008, /* get socket type */ + + /* + * Additional options, not kept in so_options. + */ + SO_SNDBUF = 0x1001, /* send buffer size */ + SO_RCVBUF = 0x1002, /* receive buffer size */ + SO_ERROR = 0x1007, /* get error status and clear */ + + // OptionLevel.IP settings + IP_MULTICAST_TTL = 10, + IP_MULTICAST_LOOP = 11, + IP_ADD_MEMBERSHIP = 12, + IP_DROP_MEMBERSHIP = 13, + + // OptionLevel.TCP settings + TCP_NODELAY = 0x0001, + } + + /*************************************************************** + + + ***************************************************************/ + + union linger + { + struct { + int l_onoff; // option on/off + int l_linger; // linger time + }; + int[2] array; // combined + } + + /*************************************************************** + + Question: are these correct for Darwin? + + ***************************************************************/ + + enum SocketOptionLevel + { + SOCKET = 1, // correct for linux on x86 + IP = 0, // appears to be correct + TCP = 6, // appears to be correct + UDP = 17, // appears to be correct + } +} +else version (linux) +{ + /*************************************************************** + + these appear to be compatible with x86 platforms, + but not others! + + ***************************************************************/ + + enum SocketOption: int + { + //consistent + SO_DEBUG = 1, + SO_BROADCAST = 6, + SO_REUSEADDR = 2, + SO_LINGER = 13, + SO_DONTLINGER = ~(SO_LINGER), + SO_OOBINLINE = 10, + SO_SNDBUF = 7, + SO_RCVBUF = 8, + SO_ERROR = 4, + + SO_ACCEPTCONN = 30, + SO_KEEPALIVE = 9, + SO_DONTROUTE = 5, + SO_TYPE = 3, + + // OptionLevel.IP settings + IP_MULTICAST_TTL = 33, + IP_MULTICAST_LOOP = 34, + IP_ADD_MEMBERSHIP = 35, + IP_DROP_MEMBERSHIP = 36, + + // OptionLevel.TCP settings + TCP_NODELAY = 0x0001, + } + + /*************************************************************** + + + ***************************************************************/ + + union linger + { + struct { + int l_onoff; // option on/off + int l_linger; // linger time + }; + int[2] array; // combined + } + + /*************************************************************** + + + ***************************************************************/ + + enum SocketOptionLevel + { + SOCKET = 1, // correct for linux on x86 + IP = 0, // appears to be correct + TCP = 6, // appears to be correct + UDP = 17, // appears to be correct + } +} // end versioning + +/*********************************************************************** + + +***********************************************************************/ + +enum SocketShutdown: int +{ + RECEIVE = 0, + SEND = 1, + BOTH = 2, +} + +/*********************************************************************** + + +***********************************************************************/ + +enum SocketFlags: int +{ + NONE = 0, + OOB = 0x1, //out of band + PEEK = 0x02, //only for receiving + DONTROUTE = 0x04, //only for sending +} + +/*********************************************************************** + + Communication semantics + +***********************************************************************/ + +enum SocketType: int +{ + STREAM = 1, /// sequenced, reliable, two-way communication-based byte streams + DGRAM = 2, /// connectionless, unreliable datagrams with a fixed maximum length; data may be lost or arrive out of order + RAW = 3, /// raw protocol access + RDM = 4, /// reliably-delivered message datagrams + SEQPACKET = 5, /// sequenced, reliable, two-way connection-based datagrams with a fixed maximum length +} + + +/*********************************************************************** + + Protocol + +***********************************************************************/ + +enum ProtocolType: int +{ + IP = 0, /// internet protocol version 4 + ICMP = 1, /// internet control message protocol + IGMP = 2, /// internet group management protocol + GGP = 3, /// gateway to gateway protocol + TCP = 6, /// transmission control protocol + PUP = 12, /// PARC universal packet protocol + UDP = 17, /// user datagram protocol + IDP = 22, /// Xerox NS protocol +} + + +/*********************************************************************** + + +***********************************************************************/ + +version(Win32) +{ + enum AddressFamily: int + { + UNSPEC = 0, + UNIX = 1, + INET = 2, + IPX = 6, + APPLETALK = 16, + //INET6 = ? // Need Windows XP ? + } +} +else version(BsdSockets) +{ + version (darwin) + { + enum AddressFamily: int + { + UNSPEC = 0, + UNIX = 1, + INET = 2, + IPX = 23, + APPLETALK = 16, + //INET6 = 10, + } + } + else version (linux) + { + enum AddressFamily: int + { + UNSPEC = 0, + UNIX = 1, + INET = 2, + IPX = 4, + APPLETALK = 5, + //INET6 = 10, + } + } // end version +} + + + +/******************************************************************************* + +*******************************************************************************/ + +class Socket +{ + socket_t sock; + SocketType type; + AddressFamily family; + ProtocolType protocol; + + version(Win32) + private bool _blocking = false; + + // For use with accept(). + package this() + { + } + + + /** + * Describe a socket flavor. If a single protocol type exists to support + * this socket type within the address family, the ProtocolType may be + * omitted. + */ + this(AddressFamily family, SocketType type, ProtocolType protocol, bool create=true) + { + this.type = type; + this.family = family; + this.protocol = protocol; + if (create) + initialize (); + } + + + /** + * Create or assign a socket + */ + private void initialize (socket_t sock = sock.init) + { + if (this.sock) + this.detach; + + if (sock is sock.init) + { + sock = cast(socket_t) socket(family, type, protocol); + if (sock is sock.init) + exception ("Unable to create socket: "); + } + + this.sock = sock; + } + + /*********************************************************************** + + Return the underlying OS handle of this Conduit + + ***********************************************************************/ + + socket_t fileHandle () + { + return sock; + } + + /*********************************************************************** + + Is this socket still alive? A closed socket is considered to + be dead, but a shutdown socket is still alive. + + ***********************************************************************/ + + bool isAlive() + { + int type, typesize = type.sizeof; + return getsockopt (sock, SocketOptionLevel.SOCKET, + SocketOption.SO_TYPE, cast(char*) &type, + &typesize) != SOCKET_ERROR; + } + + + /*********************************************************************** + + + ***********************************************************************/ + + override char[] toString() + { + return "Socket"; + } + + + /*********************************************************************** + + getter + + ***********************************************************************/ + + bool blocking() + { + version(Win32) + { + return _blocking; + } + else version(BsdSockets) + { + return !(fcntl(sock, F_GETFL, 0) & O_NONBLOCK); + } + } + + + /*********************************************************************** + + setter + + ***********************************************************************/ + + void blocking(bool byes) + { + version(Win32) + { + uint num = !byes; + if(SOCKET_ERROR == ioctlsocket(sock, FIONBIO, &num)) + goto err; + _blocking = byes; + } + else version(BsdSockets) + { + int x = fcntl(sock, F_GETFL, 0); + if(byes) + x &= ~O_NONBLOCK; + else + x |= O_NONBLOCK; + if(SOCKET_ERROR == fcntl(sock, F_SETFL, x)) + goto err; + } + return; //success + + err: + exception("Unable to set socket blocking: "); + } + + + /*********************************************************************** + + + ***********************************************************************/ + + AddressFamily addressFamily() + { + return family; + } + + + /*********************************************************************** + + + ***********************************************************************/ + + Socket bind(Address addr) + { + if(SOCKET_ERROR == .bind (sock, addr.name(), addr.nameLen())) + exception ("Unable to bind socket: "); + return this; + } + + + /*********************************************************************** + + + ***********************************************************************/ + + Socket connect(Address to) + { + if(SOCKET_ERROR == .connect (sock, to.name(), to.nameLen())) + { + if(!blocking) + { + version(Win32) + { + if(WSAEWOULDBLOCK == WSAGetLastError()) + return this; + } + else version (Posix) + { + if(EINPROGRESS == errno) + return this; + } + else + { + static assert(0); + } + } + exception ("Unable to connect socket: "); + } + return this; + } + + + /*********************************************************************** + + need to bind() first + + ***********************************************************************/ + + Socket listen(int backlog) + { + if(SOCKET_ERROR == .listen (sock, backlog)) + exception ("Unable to listen on socket: "); + return this; + } + + /** + * Accept an incoming connection. If the socket is blocking, accept + * waits for a connection request. Throws SocketAcceptException if unable + * to accept. See accepting for use with derived classes. + */ + Socket accept () + { + return accept (new Socket); + } + + Socket accept (Socket target) + { + auto newsock = cast(socket_t).accept(sock, null, null); // DMD 0.101 error: found '(' when expecting ';' following 'statement + if (socket_t.init == newsock) + throw new SocketAcceptException("Unable to accept socket connection: " ~ SysError.lookup(lastError)); + + target.initialize (newsock); + version(Win32) + target._blocking = _blocking; //inherits blocking mode + + target.protocol = protocol; //same protocol + target.family = family; //same family + target.type = type; //same type + + return target; //return configured target + } + + /*********************************************************************** + + The shutdown function shuts down the connection of the socket. + Depending on the argument value, it will: + + - stop receiving data for this socket. If further data + arrives, it is rejected. + + - stop trying to transmit data from this socket. Also + discards any data waiting to be sent. Stop looking for + acknowledgement of data already sent; don't retransmit + if any data is lost. + + ***********************************************************************/ + + Socket shutdown(SocketShutdown how) + { + .shutdown (sock, how); + return this; + } + + + /*********************************************************************** + + Tango: added + + ***********************************************************************/ + + Socket setLingerPeriod (int period) + { + linger l; + + l.l_onoff = 1; //option on/off + l.l_linger = cast(ushort) period; //linger time + + return setOption (SocketOptionLevel.SOCKET, SocketOption.SO_LINGER, l.array); + } + + + /*********************************************************************** + + + Tango: added + + ***********************************************************************/ + + Socket setAddressReuse (bool enabled) + { + int[1] x = enabled; + return setOption (SocketOptionLevel.SOCKET, SocketOption.SO_REUSEADDR, x); + } + + + /*********************************************************************** + + + Tango: added + + ***********************************************************************/ + + Socket setNoDelay (bool enabled) + { + int[1] x = enabled; + return setOption (SocketOptionLevel.TCP, SocketOption.TCP_NODELAY, x); + } + + + /*********************************************************************** + + Helper function to handle the adding and dropping of group + membership. + + Tango: Added + + ***********************************************************************/ + + void joinGroup (IPv4Address address, bool onOff) + { + assert (address, "Socket.joinGroup :: invalid null address"); + + struct ip_mreq + { + uint imr_multiaddr; /* IP multicast address of group */ + uint imr_interface; /* local IP address of interface */ + }; + + ip_mreq mrq; + + auto option = (onOff) ? SocketOption.IP_ADD_MEMBERSHIP : SocketOption.IP_DROP_MEMBERSHIP; + mrq.imr_interface = 0; + mrq.imr_multiaddr = address.sin.sin_addr; + + if (.setsockopt(sock, SocketOptionLevel.IP, option, &mrq, mrq.sizeof) == SOCKET_ERROR) + exception ("Unable to perform multicast join: "); + } + + + /*********************************************************************** + + calling shutdown() before this is recommended for connection- + oriented sockets + + ***********************************************************************/ + + void detach () + { + if (sock != sock.init) + { + version (TraceLinux) + printf ("closing socket handle ...\n"); + + version(Win32) + .closesocket (sock); + else + version(BsdSockets) + .close (sock); + + version (TraceLinux) + printf ("socket handle closed\n"); + + sock = sock.init; + } + } + + /*********************************************************************** + + + ***********************************************************************/ + + Address newFamilyObject () + { + Address result; + switch(family) + { + case AddressFamily.INET: + result = new IPv4Address; + break; + + default: + result = new UnknownAddress; + } + return result; + } + + + /*********************************************************************** + + Tango: added this to return the hostname + + ***********************************************************************/ + + static char[] hostName () + { + char[64] name; + + if(SOCKET_ERROR == .gethostname (name.ptr, name.length)) + exception ("Unable to obtain host name: "); + return name [0 .. strlen(name.ptr)].dup; + } + + + /*********************************************************************** + + Tango: added this to return the default host address (IPv4) + + ***********************************************************************/ + + static uint hostAddress () + { + NetHost ih = new NetHost; + + char[] hostname = hostName(); + ih.getHostByName (hostname); + assert (ih.addrList.length); + return ih.addrList[0]; + } + + + /*********************************************************************** + + + ***********************************************************************/ + + Address remoteAddress () + { + Address addr = newFamilyObject (); + int nameLen = addr.nameLen (); + if(SOCKET_ERROR == .getpeername (sock, addr.name(), &nameLen)) + exception ("Unable to obtain remote socket address: "); + assert (addr.addressFamily() == family); + return addr; + } + + + /*********************************************************************** + + + ***********************************************************************/ + + Address localAddress () + { + Address addr = newFamilyObject (); + int nameLen = addr.nameLen(); + if(SOCKET_ERROR == .getsockname (sock, addr.name(), &nameLen)) + exception ("Unable to obtain local socket address: "); + assert (addr.addressFamily() == family); + return addr; + } + + /// Send or receive error code. + const int ERROR = SOCKET_ERROR; + + + /** + * Send data on the connection. Returns the number of bytes actually + * sent, or ERROR on failure. If the socket is blocking and there is no + * buffer space left, send waits. + */ + //returns number of bytes actually sent, or -1 on error + int send(void[] buf, SocketFlags flags=SocketFlags.NONE) + { + return .send(sock, buf.ptr, buf.length, cast(int)flags); + } + + /** + * Send data to a specific destination Address. If the destination address is not specified, a connection must have been made and that address is used. If the socket is blocking and there is no buffer space left, sendTo waits. + */ + int sendTo(void[] buf, SocketFlags flags, Address to) + { + return .sendto(sock, buf.ptr, buf.length, cast(int)flags, to.name(), to.nameLen()); + } + + /// ditto + int sendTo(void[] buf, Address to) + { + return sendTo(buf, SocketFlags.NONE, to); + } + + + //assumes you connect()ed + /// ditto + int sendTo(void[] buf, SocketFlags flags=SocketFlags.NONE) + { + return .sendto(sock, buf.ptr, buf.length, cast(int)flags, null, 0); + } + + + /** + * Receive data on the connection. Returns the number of bytes actually + * received, 0 if the remote side has closed the connection, or ERROR on + * failure. If the socket is blocking, receive waits until there is data + * to be received. + */ + //returns number of bytes actually received, 0 on connection closure, or -1 on error + int receive(void[] buf, SocketFlags flags=SocketFlags.NONE) + { + if (!buf.length) + badArg ("Socket.receive :: target buffer has 0 length"); + + return .recv(sock, buf.ptr, buf.length, cast(int)flags); + } + + /** + * Receive data and get the remote endpoint Address. Returns the number of bytes actually received, 0 if the remote side has closed the connection, or ERROR on failure. If the socket is blocking, receiveFrom waits until there is data to be received. + */ + int receiveFrom(void[] buf, SocketFlags flags, Address from) + { + if (!buf.length) + badArg ("Socket.receiveFrom :: target buffer has 0 length"); + + assert(from.addressFamily() == family); + int nameLen = from.nameLen(); + return .recvfrom(sock, buf.ptr, buf.length, cast(int)flags, from.name(), &nameLen); + } + + + /// ditto + int receiveFrom(void[] buf, Address from) + { + return receiveFrom(buf, SocketFlags.NONE, from); + } + + + //assumes you connect()ed + /// ditto + int receiveFrom(void[] buf, SocketFlags flags = SocketFlags.NONE) + { + if (!buf.length) + badArg ("Socket.receiveFrom :: target buffer has 0 length"); + + return .recvfrom(sock, buf.ptr, buf.length, cast(int)flags, null, null); + } + + + /*********************************************************************** + + returns the length, in bytes, of the actual result - very + different from getsockopt() + + ***********************************************************************/ + + int getOption (SocketOptionLevel level, SocketOption option, void[] result) + { + int len = result.length; + if(SOCKET_ERROR == .getsockopt (sock, cast(int)level, cast(int)option, result.ptr, &len)) + exception ("Unable to get socket option: "); + return len; + } + + + /*********************************************************************** + + + ***********************************************************************/ + + Socket setOption (SocketOptionLevel level, SocketOption option, void[] value) + { + if(SOCKET_ERROR == .setsockopt (sock, cast(int)level, cast(int)option, value.ptr, value.length)) + exception ("Unable to set socket option: "); + return this; + } + + + /*********************************************************************** + + Tango: added this common function + + ***********************************************************************/ + + protected static void exception (char[] msg) + { + throw new SocketException (msg ~ SysError.lookup(lastError)); + } + + + /*********************************************************************** + + Tango: added this common function + + ***********************************************************************/ + + protected static void badArg (char[] msg) + { + throw new IllegalArgumentException (msg); + } + + + /*********************************************************************** + + SocketSet's are updated to include only those sockets which an + event occured. + + Returns the number of events, 0 on timeout, or -1 on error + + for a connect()ing socket, writeability means connected + for a listen()ing socket, readability means listening + + Winsock: possibly internally limited to 64 sockets per set + + ***********************************************************************/ + + static int select (SocketSet checkRead, SocketSet checkWrite, SocketSet checkError, timeval* tv) + in + { + //make sure none of the SocketSet's are the same object + if(checkRead) + { + assert(checkRead !is checkWrite); + assert(checkRead !is checkError); + } + if(checkWrite) + { + assert(checkWrite !is checkError); + } + } + body + { + fd_set* fr, fw, fe; + + version(Win32) + { + //Windows has a problem with empty fd_set's that aren't null + fr = (checkRead && checkRead.count()) ? checkRead.toFd_set() : null; + fw = (checkWrite && checkWrite.count()) ? checkWrite.toFd_set() : null; + fe = (checkError && checkError.count()) ? checkError.toFd_set() : null; + } + else + { + fr = checkRead ? checkRead.toFd_set() : null; + fw = checkWrite ? checkWrite.toFd_set() : null; + fe = checkError ? checkError.toFd_set() : null; + } + + int result; + + // Tango: if select() was interrupted, we now try again + version(Win32) + { + while ((result = .select (socket_t.max - 1, fr, fw, fe, tv)) == -1) + { + if(WSAGetLastError() != WSAEINTR) + break; + } + } + else version (Posix) + { + socket_t maxfd = 0; + + if (checkRead) + maxfd = checkRead.maxfd; + + if (checkWrite && checkWrite.maxfd > maxfd) + maxfd = checkWrite.maxfd; + + if (checkError && checkError.maxfd > maxfd) + maxfd = checkError.maxfd; + + while ((result = .select (maxfd + 1, fr, fw, fe, tv)) == -1) + { + if(errno() != EINTR) + break; + } + } + else + { + static assert(0); + } + // Tango: don't throw an exception here ... wait until we get + // a bit further back along the control path + //if(SOCKET_ERROR == result) + // throw new SocketException("Socket select error."); + + return result; + } + + /*********************************************************************** + + select with specified timeout + + ***********************************************************************/ + + static int select (SocketSet checkRead, SocketSet checkWrite, SocketSet checkError, TimeSpan time) + { + auto tv = toTimeval (time); + return select (checkRead, checkWrite, checkError, &tv); + } + + /*********************************************************************** + + select with maximum timeout + + ***********************************************************************/ + + static int select (SocketSet checkRead, SocketSet checkWrite, SocketSet checkError) + { + return select (checkRead, checkWrite, checkError, null); + } + + /*********************************************************************** + + Handy utility for converting TimeSpan into timeval + + ***********************************************************************/ + + static timeval toTimeval (TimeSpan time) + { + timeval tv; + tv.tv_sec = cast(uint) time.seconds; + tv.tv_usec = cast(uint) time.micros % 1_000_000; + return tv; + } +} + + + +/******************************************************************************* + + +*******************************************************************************/ + +abstract class Address +{ + protected sockaddr* name(); + protected int nameLen(); + AddressFamily addressFamily(); + char[] toString(); + + /*********************************************************************** + + Tango: added this common function + + ***********************************************************************/ + + static void exception (char[] msg) + { + throw new AddressException (msg); + } + +} + + +/******************************************************************************* + + +*******************************************************************************/ + +class UnknownAddress: Address +{ + protected: + sockaddr sa; + + + /*********************************************************************** + + + ***********************************************************************/ + + sockaddr* name() + { + return &sa; + } + + + /*********************************************************************** + + + ***********************************************************************/ + + int nameLen() + { + return sa.sizeof; + } + + + public: + /*********************************************************************** + + + ***********************************************************************/ + + AddressFamily addressFamily() + { + return cast(AddressFamily) sa.sa_family; + } + + + /*********************************************************************** + + + ***********************************************************************/ + + char[] toString() + { + return "Unknown"; + } +} + + +/******************************************************************************* + + +*******************************************************************************/ + +class NetHost +{ + char[] name; + char[][] aliases; + uint[] addrList; + + + /*********************************************************************** + + + ***********************************************************************/ + + protected void validHostent(hostent* he) + { + if(he.h_addrtype != cast(int)AddressFamily.INET || he.h_length != 4) + throw new HostException("Address family mismatch."); + } + + + /*********************************************************************** + + + ***********************************************************************/ + + void populate(hostent* he) + { + int i; + char* p; + + name = .toString(he.h_name); + + for(i = 0;; i++) + { + p = he.h_aliases[i]; + if(!p) + break; + } + + if(i) + { + aliases = new char[][i]; + for(i = 0; i != aliases.length; i++) + { + aliases[i] = .toString(he.h_aliases[i]); + } + } + else + { + aliases = null; + } + + for(i = 0;; i++) + { + p = he.h_addr_list[i]; + if(!p) + break; + } + + if(i) + { + addrList = new uint[i]; + for(i = 0; i != addrList.length; i++) + { + addrList[i] = ntohl(*(cast(uint*)he.h_addr_list[i])); + } + } + else + { + addrList = null; + } + } + + + /*********************************************************************** + + + ***********************************************************************/ + + synchronized bool getHostByName(char[] name) + { + char[1024] tmp; + + hostent* he = gethostbyname(convert2C (name, tmp)); + if(!he) + return false; + validHostent(he); + populate(he); + return true; + } + + + /*********************************************************************** + + + ***********************************************************************/ + + synchronized bool getHostByAddr(uint addr) + { + uint x = htonl(addr); + hostent* he = gethostbyaddr(&x, 4, cast(int)AddressFamily.INET); + if(!he) + return false; + validHostent(he); + populate(he); + return true; + } + + + /*********************************************************************** + + + ***********************************************************************/ + + //shortcut + synchronized bool getHostByAddr(char[] addr) + { + char[64] tmp; + + uint x = inet_addr(convert2C (addr, tmp)); + hostent* he = gethostbyaddr(&x, 4, cast(int)AddressFamily.INET); + if(!he) + return false; + validHostent(he); + populate(he); + return true; + } +} + + +debug (UnitText) +{ +extern (C) int printf(char*, ...); +unittest +{ + try + { + NetHost ih = new NetHost; + ih.getHostByName(Socket.hostName()); + assert(ih.addrList.length > 0); + IPv4Address ia = new IPv4Address(ih.addrList[0], IPv4Address.PORT_ANY); + printf("IP address = %.*s\nname = %.*s\n", ia.toAddrString(), ih.name); + foreach(int i, char[] s; ih.aliases) + { + printf("aliases[%d] = %.*s\n", i, s); + } + + printf("---\n"); + + assert(ih.getHostByAddr(ih.addrList[0])); + printf("name = %.*s\n", ih.name); + foreach(int i, char[] s; ih.aliases) + { + printf("aliases[%d] = %.*s\n", i, s); + } + } + catch( Object o ) + { + assert( false ); + } +} +} + + +/******************************************************************************* + + +*******************************************************************************/ + +class IPv4Address: Address +{ + protected: + char[8] _port; + + /*********************************************************************** + + + ***********************************************************************/ + + struct sockaddr_in + { + ushort sinfamily = AddressFamily.INET; + ushort sin_port; + uint sin_addr; //in_addr + char[8] sin_zero = [0]; + } + + sockaddr_in sin; + + + /*********************************************************************** + + + ***********************************************************************/ + + sockaddr* name() + { + return cast(sockaddr*)&sin; + } + + + /*********************************************************************** + + + ***********************************************************************/ + + int nameLen() + { + return sin.sizeof; + } + + + public: + + /*********************************************************************** + + + ***********************************************************************/ + + this() + { + } + + + const uint ADDR_ANY = 0; + const uint ADDR_NONE = cast(uint)-1; + const ushort PORT_ANY = 0; + + + /*********************************************************************** + + + ***********************************************************************/ + + AddressFamily addressFamily() + { + return AddressFamily.INET; + } + + + /*********************************************************************** + + + ***********************************************************************/ + + ushort port() + { + return ntohs(sin.sin_port); + } + + + /*********************************************************************** + + + ***********************************************************************/ + + uint addr() + { + return ntohl(sin.sin_addr); + } + + + /*********************************************************************** + + -port- can be PORT_ANY + -addr- is an IP address or host name + + ***********************************************************************/ + + this(char[] addr, int port = PORT_ANY) + { + uint uiaddr = parse(addr); + if(ADDR_NONE == uiaddr) + { + NetHost ih = new NetHost; + if(!ih.getHostByName(addr)) + exception ("Unable to resolve '"~addr~"': "); + uiaddr = ih.addrList[0]; + } + sin.sin_addr = htonl(uiaddr); + sin.sin_port = htons(cast(ushort) port); + } + + + /*********************************************************************** + + + ***********************************************************************/ + + this(uint addr, ushort port) + { + sin.sin_addr = htonl(addr); + sin.sin_port = htons(port); + } + + + /*********************************************************************** + + + ***********************************************************************/ + + this(ushort port) + { + sin.sin_addr = 0; //any, "0.0.0.0" + sin.sin_port = htons(port); + } + + /*********************************************************************** + + + ***********************************************************************/ + + synchronized char[] toAddrString() + { + return .toString(inet_ntoa(sin.sin_addr)).dup; + } + + + /*********************************************************************** + + + ***********************************************************************/ + + char[] toPortString() + { + return .toString (_port, port()); + } + + + /*********************************************************************** + + + ***********************************************************************/ + + char[] toString() + { + return toAddrString() ~ ":" ~ toPortString(); + } + + + /*********************************************************************** + + -addr- is an IP address in the format "a.b.c.d" + returns ADDR_NONE on failure + + ***********************************************************************/ + + static uint parse(char[] addr) + { + char[64] tmp; + + return ntohl(inet_addr(convert2C (addr, tmp))); + } +} + +debug(Unittest) +{ +unittest +{ + IPv4Address ia = new IPv4Address("63.105.9.61", 80); + assert(ia.toString() == "63.105.9.61:80"); +} +} + +/******************************************************************************* + + +*******************************************************************************/ + +//a set of sockets for Socket.select() +class SocketSet +{ +// private: + private uint nbytes; //Win32: excludes uint.size "count" + private byte* buf; + + + version(Win32) + { + uint count() + { + return *(cast(uint*)buf); + } + + + void count(int setter) + { + *(cast(uint*)buf) = setter; + } + + + socket_t* first() + { + return cast(socket_t*)(buf + uint.sizeof); + } + } + else version (Posix) + { + import tango.core.BitManip; + + + uint nfdbits; + socket_t _maxfd = 0; + + uint fdelt(socket_t s) + { + return cast(uint)s / nfdbits; + } + + + uint fdmask(socket_t s) + { + return 1 << cast(uint)s % nfdbits; + } + + + uint* first() + { + return cast(uint*)buf; + } + + public socket_t maxfd() + { + return _maxfd; + } + } + + + public: + /*********************************************************************** + + + ***********************************************************************/ + + this(uint max) + { + version(Win32) + { + nbytes = max * socket_t.sizeof; + buf = (new byte[nbytes + uint.sizeof]).ptr; + count = 0; + } + else version (Posix) + { + if(max <= 32) + nbytes = 32 * uint.sizeof; + else + nbytes = max * uint.sizeof; + buf = (new byte[nbytes]).ptr; + nfdbits = nbytes * 8; + //clear(); //new initializes to 0 + } + else + { + static assert(0); + } + } + + + /*********************************************************************** + + + ***********************************************************************/ + + this() + { + version(Win32) + { + this(64); + } + else version (Posix) + { + this(32); + } + else + { + static assert(0); + } + } + + + /*********************************************************************** + + + ***********************************************************************/ + + void reset() + { + version(Win32) + { + count = 0; + } + else version (Posix) + { + buf[0 .. nbytes] = 0; + _maxfd = 0; + } + else + { + static assert(0); + } + } + + + /*********************************************************************** + + + ***********************************************************************/ + + void add(socket_t s) + in + { + version(Win32) + { + assert(count < max); //added too many sockets; specify a higher max in the constructor + } + } + body + { + version(Win32) + { + uint c = count; + first[c] = s; + count = c + 1; + } + else version (Posix) + { + if (s > _maxfd) + _maxfd = s; + + bts(cast(uint*)&first[fdelt(s)], cast(uint)s % nfdbits); + } + else + { + static assert(0); + } + } + + + /*********************************************************************** + + + ***********************************************************************/ + + void add(Socket s) + { + add(s.sock); + } + + + /*********************************************************************** + + + ***********************************************************************/ + + void remove(socket_t s) + { + version(Win32) + { + uint c = count; + socket_t* start = first; + socket_t* stop = start + c; + + for(; start != stop; start++) + { + if(*start == s) + goto found; + } + return; //not found + + found: + for(++start; start != stop; start++) + { + *(start - 1) = *start; + } + + count = c - 1; + } + else version (Posix) + { + btr(cast(uint*)&first[fdelt(s)], cast(uint)s % nfdbits); + + // If we're removing the biggest file descriptor we've + // entered so far we need to recalculate this value + // for the socket set. + if (s == _maxfd) + { + while (--_maxfd >= 0) + { + if (isSet(_maxfd)) + { + break; + } + } + } + } + else + { + static assert(0); + } + } + + + /*********************************************************************** + + + ***********************************************************************/ + + void remove(Socket s) + { + remove(s.sock); + } + + + /*********************************************************************** + + + ***********************************************************************/ + + int isSet(socket_t s) + { + version(Win32) + { + socket_t* start = first; + socket_t* stop = start + count; + + for(; start != stop; start++) + { + if(*start == s) + return true; + } + return false; + } + else version (Posix) + { + //return bt(cast(uint*)&first[fdelt(s)], cast(uint)s % nfdbits); + int index = cast(uint)s % nfdbits; + return (cast(uint*)&first[fdelt(s)])[index / (uint.sizeof*8)] & (1 << (index & ((uint.sizeof*8) - 1))); + } + else + { + static assert(0); + } + } + + + /*********************************************************************** + + + ***********************************************************************/ + + int isSet(Socket s) + { + return isSet(s.sock); + } + + + /*********************************************************************** + + max sockets that can be added, like FD_SETSIZE + + ***********************************************************************/ + + uint max() + { + return nbytes / socket_t.sizeof; + } + + + /*********************************************************************** + + + ***********************************************************************/ + + fd_set* toFd_set() + { + return cast(fd_set*)buf; + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/SocketConduit.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/SocketConduit.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,346 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Mar 2004 : Initial release + version: Jan 2005 : RedShodan patch for timeout query + version: Dec 2006 : Outback release + + author: Kris + +*******************************************************************************/ + +module tango.net.SocketConduit; + +private import tango.time.Time; + +public import tango.io.Conduit; + +private import tango.net.Socket; + +/******************************************************************************* + + A wrapper around the bare Socket to implement the IConduit abstraction + and add socket-specific functionality. + + SocketConduit data-transfer is typically performed in conjunction with + an IBuffer, but can happily be handled directly using void array where + preferred + +*******************************************************************************/ + +class SocketConduit : Conduit +{ + private timeval tv; + private SocketSet ss; + package Socket socket_; + private bool timeout; + + // freelist support + private SocketConduit next; + private bool fromList; + private static SocketConduit freelist; + + /*********************************************************************** + + Create a streaming Internet Socket + + ***********************************************************************/ + + this () + { + this (SocketType.STREAM, ProtocolType.TCP); + } + + /*********************************************************************** + + Create an Internet Socket. Used by subclasses and by + ServerSocket; the latter via method allocate() below + + ***********************************************************************/ + + protected this (SocketType type, ProtocolType protocol, bool create=true) + { + socket_ = new Socket (AddressFamily.INET, type, protocol, create); + } + + /*********************************************************************** + + Return the name of this device + + ***********************************************************************/ + + override char[] toString() + { + return socket.toString; + } + + /*********************************************************************** + + Return the socket wrapper + + ***********************************************************************/ + + Socket socket () + { + return socket_; + } + + /*********************************************************************** + + Return a preferred size for buffering conduit I/O + + ***********************************************************************/ + + override uint bufferSize () + { + return 1024 * 8; + } + + /*********************************************************************** + + Models a handle-oriented device. + + TODO: figure out how to avoid exposing this in the general + case + + ***********************************************************************/ + + override Handle fileHandle () + { + return cast(Handle) socket_.fileHandle; + } + + /*********************************************************************** + + Set the read timeout to the specified interval. Set a + value of zero to disable timeout support. + + ***********************************************************************/ + + SocketConduit setTimeout (TimeSpan interval) + { + tv = Socket.toTimeval (interval); + return this; + } + + /*********************************************************************** + + Did the last operation result in a timeout? + + ***********************************************************************/ + + bool hadTimeout () + { + return timeout; + } + + /*********************************************************************** + + Is this socket still alive? + + ***********************************************************************/ + + override bool isAlive () + { + return socket_.isAlive; + } + + /*********************************************************************** + + Connect to the provided endpoint + + ***********************************************************************/ + + SocketConduit connect (Address addr) + { + socket_.connect (addr); + return this; + } + + /*********************************************************************** + + Bind the socket. This is typically used to configure a + listening socket (such as a server or multicast socket). + The address given should describe a local adapter, or + specify the port alone (ADDR_ANY) to have the OS assign + a local adapter address. + + ***********************************************************************/ + + SocketConduit bind (Address address) + { + socket_.bind (address); + return this; + } + + /*********************************************************************** + + Inform other end of a connected socket that we're no longer + available. In general, this should be invoked before close() + is invoked + + The shutdown function shuts down the connection of the socket: + + - stops receiving data for this socket. If further data + arrives, it is rejected. + + - stops trying to transmit data from this socket. Also + discards any data waiting to be sent. Stop looking for + acknowledgement of data already sent; don't retransmit + if any data is lost. + + ***********************************************************************/ + + SocketConduit shutdown () + { + socket_.shutdown (SocketShutdown.BOTH); + return this; + } + + /*********************************************************************** + + Read content from socket. This is implemented as a callback + from the reader() method so we can expose the timout support + to subclasses + + ***********************************************************************/ + + protected uint socketReader (void[] dst) + { + return socket_.receive (dst); + } + + /*********************************************************************** + + Release this SocketConduit + + Note that one should always disconnect a SocketConduit + under normal conditions, and generally invoke shutdown + on all connected sockets beforehand + + ***********************************************************************/ + + override void detach () + { + socket_.detach; + + // deallocate if this came from the free-list, + // otherwise just wait for the GC to handle it + if (fromList) + deallocate (this); + } + + /*********************************************************************** + + Callback routine to read content from the socket. Note + that the operation may timeout if method setTimeout() + has been invoked with a non-zero value. + + Returns the number of bytes read from the socket, or + IConduit.Eof where there's no more content available + + Note that a timeout is equivalent to Eof. Isolating + a timeout condition can be achieved via hadTimeout() + + Note also that a zero return value is not legitimate; + such a value indicates Eof + + ***********************************************************************/ + + override uint read (void[] dst) + { + // ensure just one read at a time + synchronized (this) + { + // reset timeout; we assume there's no thread contention + timeout = false; + + // did user disable timeout checks? + if (tv.tv_usec | tv.tv_sec) + { + // nope: ensure we have a SocketSet + if (ss is null) + ss = new SocketSet (1); + + ss.reset (); + ss.add (socket_); + + // wait until data is available, or a timeout occurs + auto copy = tv; + int i = socket_.select (ss, null, null, ©); + + if (i <= 0) + { + if (i is 0) + timeout = true; + return Eof; + } + } + + // invoke the actual read op + int count = socketReader (dst); + if (count <= 0) + count = Eof; + return count; + } + } + + /*********************************************************************** + + Callback routine to write the provided content to the + socket. This will stall until the socket responds in + some manner. Returns the number of bytes sent to the + output, or IConduit.Eof if the socket cannot write. + + ***********************************************************************/ + + override uint write (void[] src) + { + int count = socket_.send (src); + if (count <= 0) + count = Eof; + return count; + } + + /*********************************************************************** + + Allocate a SocketConduit from a list rather than creating + a new one. Note that the socket itself is not opened; only + the wrappers. This is because the socket is often assigned + directly via accept() + + ***********************************************************************/ + + package static synchronized SocketConduit allocate () + { + SocketConduit s; + + if (freelist) + { + s = freelist; + freelist = s.next; + } + else + { + s = new SocketConduit (SocketType.STREAM, ProtocolType.TCP, false); + s.fromList = true; + } + return s; + } + + /*********************************************************************** + + Return this SocketConduit to the free-list + + ***********************************************************************/ + + private static synchronized void deallocate (SocketConduit s) + { + s.next = freelist; + freelist = s; + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/SocketListener.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/SocketListener.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,181 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: June 2004 + + author: Kris + +*******************************************************************************/ + +module tango.net.SocketListener; + +private import tango.core.Thread; + +private import tango.io.model.IBuffer, + tango.io.model.IConduit, + tango.io.model.IListener; + +/****************************************************************************** + + Abstract class to asynchronously listen for incoming data on a + socket. This can be used with DatagramSocket & MulticastSocket, + and might possibly be useful with a basic SocketConduit also. + Note that DatagramSocket must first be bound to a local network + address via bind(), and MulticastSocket should first be made a + member of a multicast group via its join() method. Note also + that the underlying thread is not started by the constructor; + you should do that manually via the start() method. + +******************************************************************************/ + +class SocketListener : IListener +{ + private bool quit; + private Thread thread; + private IBuffer buffer; + private IConduit conduit; + private int limit = 3; + + /********************************************************************** + + Construct a listener with the requisite arguments. The + specified buffer is populated via the provided instance + of ISocketReader before being passed to the notify() + method. All arguments are required. + + **********************************************************************/ + + this (IBuffer buffer) + { + assert (buffer); + this (buffer.input, buffer); + } + + /********************************************************************** + + Construct a listener with the requisite arguments. The + specified buffer is populated via the provided instance + of ISocketReader before being passed to the notify() + method. All arguments are required. + + **********************************************************************/ + + this (InputStream stream, IBuffer buffer) + { + assert (stream); + this.buffer = buffer; + this.conduit = stream.conduit; + thread = new Thread (&run); + thread.isDaemon = true; + } + + /*********************************************************************** + + Notification callback invoked whenever the listener has + anything to report. The buffer will have whatever content + was available from the read() operation + + ***********************************************************************/ + + abstract void notify (IBuffer buffer); + + /*********************************************************************** + + Handle error conditions from the listener thread. + + ***********************************************************************/ + + abstract void exception (char[] msg); + + /********************************************************************** + + Start this listener + + **********************************************************************/ + + void execute () + { + thread.start; + } + + /********************************************************************** + + Cancel this listener. The thread will quit only after the + current read() request responds, or is interrrupted. + + **********************************************************************/ + + void cancel () + { + quit = true; + } + + /********************************************************************** + + Set the maximum contiguous number of exceptions this + listener will survive. Setting a limit of zero will + not survive any errors at all, whereas a limit of two + will survive as long as two consecutive errors don't + arrive back to back. + + **********************************************************************/ + + void setErrorLimit (ushort limit) + { + this.limit = limit + 1; + } + + /********************************************************************** + + Execution of this thread is typically stalled on the + read() method belonging to the conduit specified + during construction. You can invoke cancel() to indicate + execution should not proceed further, but that will not + actually interrupt a blocked read() operation. + + Note that exceptions are all directed towards the handler + implemented by the class instance. + + **********************************************************************/ + + private void run () + { + int lives = limit; + + while (lives > 0) + try { + // start with a clean slate + buffer.compress; + + // wait for incoming content + auto result = buffer.write (&conduit.input.read); + + // time to quit? Note that a v0.95 compiler bug + // prohibits 'break' from exiting the try{} block + if (quit || + (result is conduit.Eof && !conduit.isAlive)) + lives = 0; + else + { + // invoke callback + notify (buffer); + lives = limit; + } + } catch (Object x) + // time to quit? + if (quit || !conduit.isAlive) + break; + else + { + exception (x.toString); + if (--lives is 0) + exception ("listener thread aborting"); + } + } +} + + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/Uri.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/Uri.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,930 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: April 2004 + + author: Kris + +*******************************************************************************/ + +module tango.net.Uri; + +public import tango.net.model.UriView; + +private import tango.core.Exception; + +private import Integer = tango.text.convert.Integer; + +/******************************************************************************* + + external links + +*******************************************************************************/ + +extern (C) char* memchr (char *, char, uint); + + +/******************************************************************************* + + Implements an RFC 2396 compliant URI specification. See + this page + for more information. + + The implementation fails the spec on two counts: it doesn't insist + on a scheme being present in the Uri, and it doesn't implement the + "Relative References" support noted in section 5.2. The latter can + be found in tango.util.PathUtil instead. + + Note that IRI support can be implied by assuming each of userinfo, + path, query, and fragment are UTF-8 encoded + (see + this page for further details). + + Use the UriView subset where you need a readonly perspective. + +*******************************************************************************/ + +class Uri : UriView +{ + // simplistic string appender + private alias void delegate (void[]) Consumer; + + private int port; + private char[] host, + path, + query, + scheme, + userinfo, + fragment; + private HeapSlice decoded; + + private static ubyte map[256]; + + private static short[char[]] genericSchemes; + + private static const char[] hexDigits = "0123456789abcdef"; + + private static const SchemePort[] schemePorts = + [ + {"coffee", 80}, + {"file", InvalidPort}, + {"ftp", 21}, + {"gopher", 70}, + {"hnews", 80}, + {"http", 80}, + {"http-ng", 80}, + {"https", 443}, + {"imap", 143}, + {"irc", 194}, + {"ldap", 389}, + {"news", 119}, + {"nfs", 2049}, + {"nntp", 119}, + {"pop", 110}, + {"prospero", 1525}, + {"rwhois", 4321}, + {"sip", InvalidPort}, + {"sips", InvalidPort}, + {"sipt", InvalidPort}, + {"sipu", InvalidPort}, + {"shttp", 80}, + {"smtp", 25}, + {"snews", 563}, + {"telnet", 23}, + {"vemmi", 575}, + {"videotex", 516}, + {"wais", 210}, + {"whois", 43}, + {"whois++", 43}, + ]; + + public enum + { + ExcScheme = 0x01, + ExcAuthority = 0x02, + ExcPath = 0x04, + IncUser = 0x80, // encode spec for User + IncPath = 0x10, // encode spec for Path + IncQuery = 0x20, // encode spec for Query + IncQueryAll = 0x40, + IncScheme = 0x80, // encode spec for Scheme + IncGeneric = IncScheme | + IncUser | + IncPath | + IncQuery | + IncQueryAll + } + + // scheme and port pairs + private struct SchemePort + { + char[] name; + short port; + } + + /*********************************************************************** + + Initialize the Uri character maps and so on + + ***********************************************************************/ + + static this () + { + // Map known generic schemes to their default port. Specify + // InvalidPort for those schemes that don't use ports. Note + // that a port value of zero is not supported ... + foreach (SchemePort sp; schemePorts) + genericSchemes[sp.name] = sp.port; + genericSchemes.rehash; + + // load the character map with valid symbols + for (int i='a'; i <= 'z'; ++i) + map[i] = IncGeneric; + + for (int i='A'; i <= 'Z'; ++i) + map[i] = IncGeneric; + + for (int i='0'; i<='9'; ++i) + map[i] = IncGeneric; + + // exclude these from parsing elements + map[':'] |= ExcScheme; + map['/'] |= ExcScheme | ExcAuthority; + map['?'] |= ExcScheme | ExcAuthority | ExcPath; + map['#'] |= ExcScheme | ExcAuthority | ExcPath; + + // include these as common symbols + map['-'] |= IncUser | IncQuery | IncQueryAll; + map['_'] |= IncUser | IncQuery | IncQueryAll; + map['.'] |= IncUser | IncQuery | IncQueryAll; + map['!'] |= IncUser | IncQuery | IncQueryAll; + map['~'] |= IncUser | IncQuery | IncQueryAll; + map['*'] |= IncUser | IncQuery | IncQueryAll; + map['\''] |= IncUser | IncQuery | IncQueryAll; + map['('] |= IncUser | IncQuery | IncQueryAll; + map[')'] |= IncUser | IncQuery | IncQueryAll; + + // include these as scheme symbols + map['+'] |= IncScheme; + map['-'] |= IncScheme; + map['.'] |= IncScheme; + + // include these as userinfo symbols + map[';'] |= IncUser; + map[':'] |= IncUser; + map['&'] |= IncUser; + map['='] |= IncUser; + map['+'] |= IncUser; + map['$'] |= IncUser; + map[','] |= IncUser; + + // include these as path symbols + map['/'] |= IncPath; + map[';'] |= IncPath; + map[':'] |= IncPath; + map['@'] |= IncPath; + map['&'] |= IncPath; + map['='] |= IncPath; + map['+'] |= IncPath; + map['$'] |= IncPath; + map[','] |= IncPath; + + // include these as query symbols + map[';'] |= IncQuery | IncQueryAll; + map['/'] |= IncQuery | IncQueryAll; + map['?'] |= IncQueryAll; + map[':'] |= IncQuery | IncQueryAll; + map['@'] |= IncQuery | IncQueryAll; + map['&'] |= IncQueryAll; + map['='] |= IncQuery | IncQueryAll; + map['+'] |= IncQuery | IncQueryAll; + map['$'] |= IncQuery | IncQueryAll; + map[','] |= IncQuery | IncQueryAll; + + // '%' are permitted inside queries when constructing output + map['%'] |= IncQueryAll; + } + + /*********************************************************************** + + Create an empty Uri + + ***********************************************************************/ + + this () + { + port = InvalidPort; + decoded = new HeapSlice (256); + } + + /*********************************************************************** + + Construct a Uri from the provided character string + + ***********************************************************************/ + + this (char[] uri) + { + this (); + parse (uri); + } + + /*********************************************************************** + + Construct a Uri from the given components. The query is + optional. + + ***********************************************************************/ + + this (char[] scheme, char[] host, char[] path, char[] query = null) + { + this (); + + this.scheme = scheme; + this.query = query; + this.host = host; + this.path = path; + } + + /*********************************************************************** + + Clone another Uri. This can be used to make a mutable Uri + from an immutable UriView. + + ***********************************************************************/ + + this (UriView other) + { + with (other) + { + this (getScheme, getHost, getPath, getQuery); + this.userinfo = getUserInfo; + this.fragment = getFragment; + this.port = getPort; + } + } + + /*********************************************************************** + + Return the default port for the given scheme. InvalidPort + is returned if the scheme is unknown, or does not accept + a port. + + ***********************************************************************/ + + final int getDefaultPort (char[] scheme) + { + short* port = scheme in genericSchemes; + if (port is null) + return InvalidPort; + return *port; + } + + /*********************************************************************** + + Return the parsed scheme, or null if the scheme was not + specified + + ***********************************************************************/ + + final char[] getScheme() + { + return scheme; + } + + /*********************************************************************** + + Return the parsed host, or null if the host was not + specified + + ***********************************************************************/ + + final char[] getHost() + { + return host; + } + + /*********************************************************************** + + Return the parsed port number, or InvalidPort if the port + was not provided. + + ***********************************************************************/ + + final int getPort() + { + return port; + } + + /*********************************************************************** + + Return a valid port number by performing a lookup on the + known schemes if the port was not explicitly specified. + + ***********************************************************************/ + + final int getValidPort() + { + if (port is InvalidPort) + return getDefaultPort (scheme); + return port; + } + + /*********************************************************************** + + Return the parsed userinfo, or null if userinfo was not + provided. + + ***********************************************************************/ + + final char[] getUserInfo() + { + return userinfo; + } + + /*********************************************************************** + + Return the parsed path, or null if the path was not + provided. + + ***********************************************************************/ + + final char[] getPath() + { + return path; + } + + /*********************************************************************** + + Return the parsed query, or null if a query was not + provided. + + ***********************************************************************/ + + final char[] getQuery() + { + return query; + } + + /*********************************************************************** + + Return the parsed fragment, or null if a fragment was not + provided. + + ***********************************************************************/ + + final char[] getFragment() + { + return fragment; + } + + /*********************************************************************** + + Return whether or not the Uri scheme is considered generic. + + ***********************************************************************/ + + final bool isGeneric () + { + return (scheme in genericSchemes) !is null; + } + + /*********************************************************************** + + Emit the content of this Uri via the provided Consumer. The + output is constructed per RFC 2396. + + ***********************************************************************/ + + final Consumer produce (Consumer consume) + { + if (scheme.length) + consume (scheme), consume (":"); + + + if (userinfo.length || host.length || port != InvalidPort) + { + consume ("//"); + + if (userinfo.length) + encode (consume, userinfo, IncUser) ("@"); + + if (host.length) + consume (host); + + if (port != InvalidPort && port != getDefaultPort(scheme)) + { + char[8] tmp; + consume (":"), consume (Integer.itoa (tmp, cast(uint) port)); + } + } + + if (path.length) + encode (consume, path, IncPath); + + if (query.length) + { + consume ("?"); + encode (consume, query, IncQueryAll); + } + + if (fragment.length) + { + consume ("#"); + encode (consume, fragment, IncQuery); + } + + return consume; + } + + /*********************************************************************** + + Emit the content of this Uri via the provided Consumer. The + output is constructed per RFC 2396. + + ***********************************************************************/ + + final char[] toString () + { + void[] s; + + s.length = 256, s.length = 0; + produce ((void[] v) {s ~= v;}); + return cast(char[]) s; + } + + /*********************************************************************** + + Encode uri characters into a Consumer, such that + reserved chars are converted into their %hex version. + + ***********************************************************************/ + + static Consumer encode (Consumer consume, char[] s, int flags) + { + char[3] hex; + int mark; + + hex[0] = '%'; + foreach (int i, char c; s) + { + if (! (map[c] & flags)) + { + consume (s[mark..i]); + mark = i+1; + + hex[1] = hexDigits [(c >> 4) & 0x0f]; + hex[2] = hexDigits [c & 0x0f]; + consume (hex); + } + } + + // add trailing section + if (mark < s.length) + consume (s[mark..s.length]); + + return consume; + } + + /*********************************************************************** + + Encode uri characters into a string, such that reserved + chars are converted into their %hex version. + + Returns a dup'd string + + ***********************************************************************/ + + final char[] encode (char[] text, int flags) + { + void[] s; + encode ((void[] v) {s ~= v;}, text, flags); + return cast(char[]) s; + } + + /*********************************************************************** + + Decode a character string with potential %hex values in it. + The decoded strings are placed into a thread-safe expanding + buffer, and a slice of it is returned to the caller. + + ***********************************************************************/ + + private char[] decoder (char[] s, char ignore=0) + { + static int toInt (char c) + { + if (c >= '0' && c <= '9') + c -= '0'; + else + if (c >= 'a' && c <= 'f') + c -= ('a' - 10); + else + if (c >= 'A' && c <= 'F') + c -= ('A' - 10); + return c; + } + + int length = s.length; + + // take a peek first, to see if there's work to do + if (length && memchr (s.ptr, '%', length)) + { + char* p; + int j; + + // ensure we have enough decoding space available + p = cast(char*) decoded.expand (length); + + // scan string, stripping % encodings as we go + for (int i; i < length; ++i, ++j, ++p) + { + int c = s[i]; + + if (c is '%' && (i+2) < length) + { + c = toInt(s[i+1]) * 16 + toInt(s[i+2]); + + // leave ignored escapes in the stream, + // permitting escaped '&' to remain in + // the query string + if (c && (c is ignore)) + c = '%'; + else + i += 2; + } + + *p = c; + } + + // return a slice from the decoded input + return cast(char[]) decoded.slice (j); + } + + // return original content + return s; + } + + /*********************************************************************** + + Decode a duplicated string with potential %hex values in it + + ***********************************************************************/ + + final char[] decode (char[] s) + { + return decoder(s).dup; + } + + /*********************************************************************** + + Parsing is performed according to RFC 2396 + + --- + ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))? + 12 3 4 5 6 7 8 9 + + 2 isolates scheme + 4 isolates authority + 5 isolates path + 7 isolates query + 9 isolates fragment + --- + + This was originally a state-machine; it turned out to be a + lot faster (~40%) when unwound like this instead. + + ***********************************************************************/ + + final Uri parse (char[] uri, bool relative = false) + { + char c; + int i, + mark, + len = uri.length; + + reset; + + // isolate scheme (note that it's OK to not specify a scheme) + for (i=0; i < len && !(map[c = uri[i]] & ExcScheme); ++i) {} + if (c is ':') + { + scheme = uri [mark .. i]; + toLower (scheme); + mark = i + 1; + } + + // isolate authority + if (mark < len-1 && uri[mark] is '/' && uri[mark+1] is '/') + { + for (mark+=2, i=mark; i < len && !(map[uri[i]] & ExcAuthority); ++i) {} + parseAuthority (uri[mark .. i]); + mark = i; + } + else + if (relative && uri[0] != '/') + { + uri = toLastSlash(path) ~ uri; + query = fragment = null; + len = uri.length; + } + + // isolate path + for (i=mark; i < len && !(map[uri[i]] & ExcPath); ++i) {} + path = decoder (uri[mark .. i]); + mark = i; + + // isolate query + if (mark < len && uri[mark] is '?') + { + for (++mark, i=mark; i < len && uri[i] != '#'; ++i) {} + query = decoder (uri[mark .. i], '&'); + mark = i; + } + + // isolate fragment + if (mark < len && uri[mark] is '#') + fragment = decoder (uri[mark+1 .. len]); + + return this; + } + + /*********************************************************************** + + Clear everything to null. + + ***********************************************************************/ + + final void reset() + { + decoded.reset; + port = InvalidPort; + host = path = query = scheme = userinfo = fragment = null; + } + + /*********************************************************************** + + Parse the given uri, with support for relative URLs + + ***********************************************************************/ + + final Uri relParse (char[] uri) + { + return parse (uri, true); + } + + /*********************************************************************** + + Set the Uri scheme + + ***********************************************************************/ + + final Uri setScheme (char[] scheme) + { + this.scheme = scheme; + return this; + } + + /*********************************************************************** + + Set the Uri host + + ***********************************************************************/ + + final Uri setHost (char[] host) + { + this.host = host; + return this; + } + + /*********************************************************************** + + Set the Uri port + + ***********************************************************************/ + + final Uri setPort (int port) + { + this.port = port; + return this; + } + + /*********************************************************************** + + Set the Uri userinfo + + ***********************************************************************/ + + final Uri setUserInfo (char[] userinfo) + { + this.userinfo = userinfo; + return this; + } + + /*********************************************************************** + + Set the Uri query + + ***********************************************************************/ + + final Uri setQuery (char[] query) + { + this.query = query; + return this; + } + + /*********************************************************************** + + Extend the Uri query + + ***********************************************************************/ + + final char[] extendQuery (char[] tail) + { + if (tail.length) + if (query.length) + query = query ~ "&" ~ tail; + else + query = tail; + return query; + } + + /*********************************************************************** + + Set the Uri path + + ***********************************************************************/ + + final Uri setPath (char[] path) + { + this.path = path; + return this; + } + + /*********************************************************************** + + Set the Uri fragment + + ***********************************************************************/ + + final Uri setFragment (char[] fragment) + { + this.fragment = fragment; + return this; + } + + /*********************************************************************** + + Authority is the section after the scheme, but before the + path, query or fragment; it typically represents a host. + + --- + ^(([^@]*)@?)([^:]*)?(:(.*))? + 12 3 4 5 + + 2 isolates userinfo + 3 isolates host + 5 isolates port + --- + + ***********************************************************************/ + + private void parseAuthority (char[] auth) + { + int mark, + len = auth.length; + + // get userinfo: (([^@]*)@?) + foreach (int i, char c; auth) + if (c is '@') + { + userinfo = decoder (auth[0 .. i]); + mark = i + 1; + break; + } + + // get port: (:(.*))? + for (int i=mark; i < len; ++i) + if (auth [i] is ':') + { + port = Integer.atoi (auth [i+1 .. len]); + len = i; + break; + } + + // get host: ([^:]*)? + host = auth [mark..len]; + } + + /********************************************************************** + + **********************************************************************/ + + private final char[] toLastSlash (char[] path) + { + for (char*p = path.ptr+path.length; --p >= path.ptr;) + if (*p is '/') + return path [0 .. (p-path.ptr)+1]; + return path; + } + + /********************************************************************** + + in-place conversion to lowercase + + **********************************************************************/ + + private final static char[] toLower (inout char[] src) + { + foreach (inout char c; src) + if (c >= 'A' && c <= 'Z') + c = c + ('a' - 'A'); + return src; + } +} + + +/******************************************************************************* + +*******************************************************************************/ + +private class HeapSlice +{ + private uint used; + private void[] buffer; + + /*********************************************************************** + + Create with the specified starting size + + ***********************************************************************/ + + this (uint size) + { + buffer = new void[size]; + } + + /*********************************************************************** + + Reset content length to zero + + ***********************************************************************/ + + final void reset () + { + used = 0; + } + + /*********************************************************************** + + Potentially expand the content space, and return a pointer + to the start of the empty section. + + ***********************************************************************/ + + final void* expand (uint size) + { + if ((used + size) > buffer.length) + buffer.length = (used + size) * 2; + return &buffer [used]; + } + + /*********************************************************************** + + Return a slice of the content from the current position + with the specified size. Adjusts the current position to + point at an empty zone. + + ***********************************************************************/ + + final void[] slice (int size) + { + uint i = used; + used += size; + return buffer [i..used]; + } +} + + + +/******************************************************************************* + +*******************************************************************************/ + +debug (Uri) +{ + import tango.io.Console; + + void main() + { + auto uri = new Uri ("http://foo.bar?a=1&b=2&c=3&d=%26%26&e=5"); + + Cout (uri.getQuery).newline; + Cout (uri).newline; + + Cout (uri.encode ("&#$%", uri.IncQuery)).newline; + } +} \ No newline at end of file diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/CacheInvalidatee.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/CacheInvalidatee.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,99 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: July 2004: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.CacheInvalidatee; + +private import tango.net.cluster.model.ICache; + +private import tango.net.cluster.NetworkClient, + tango.net.cluster.CacheInvalidator; + +/******************************************************************************* + + Wrapper around an ICache instance that attaches it to the network, + and ensures the former complies with cache invalidation requests. + Use this in conjunction with CacheInvalidator or NetworkCombo. The + ICache provided should typically be synchronized against thread + contention since it will potentially have entries removed from a + listener thread (you won't need synchronization if you're using + the concurrent hash-map ICache implementation). + +*******************************************************************************/ + +class CacheInvalidatee : NetworkClient +{ + alias ICache!(char[], IMessage) Cache; + + private Cache cache_; + private IConsumer consumer; + + /*********************************************************************** + + Construct a CacheInvalidatee upon the given cache, using + the named channel. This channel should be a name that is + common to both the receiver and the sender. + + ***********************************************************************/ + + this (ICluster cluster, char[] name, Cache cache) + { + super (cluster, name); + + assert (cache); + cache_ = cache; + + // start listening for invalidation requests + consumer = channel.createBulletinConsumer (¬ify); + } + + /*********************************************************************** + + Detach from the network. The CacheInvalidatee is disabled + from this point forward. + + ***********************************************************************/ + + void cancel () + { + consumer.cancel; + } + + /*********************************************************************** + + Return the ICache instance provided during construction + + ***********************************************************************/ + + Cache cache () + { + return cache_; + } + + /*********************************************************************** + + Notification callback from the listener. We remove the + indicated entry from our cache + + ***********************************************************************/ + + private void notify (IEvent event) + { + scope p = new InvalidatorPayload; + event.get (p); + + // remove entry from our cache + if (cache_.remove (p.key, p.time)) + event.log.trace ("removed cache entry '"~p.key~ + "' on channel '"~event.channel.name~"'"); + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/CacheInvalidator.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/CacheInvalidator.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,134 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: July 2004: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.CacheInvalidator; + +package import tango.net.cluster.NetworkClient; + +private import tango.net.cluster.NetworkMessage; + +/******************************************************************************* + + Utility class to invalidate specific cache entries across a + network. Any active CacheInvalidatee objects listening upon + the channel specified for this class will "wake up" whenever + the invalidate() method is invoked. + +*******************************************************************************/ + +class CacheInvalidator : NetworkClient +{ + private InvalidatorPayload filter; + + /*********************************************************************** + + Construct an invalidator on the specified channel. Only + those CacheInvalidatee instances configured for the same + channel will be listening to this invalidator. + + ***********************************************************************/ + + this (ICluster cluster, char[] channel) + { + assert (channel.length); + super (cluster, channel); + + // this is what we'll send as an invalidation notification ... + this.filter = new InvalidatorPayload; + } + + /*********************************************************************** + + Invalidate all network cache instances on this channel + using the specified key. When 'timeLimit' is specified, + only those cache entries with a time lesser or equal to + that specified will be removed. This is often useful if + you wish to avoid invalidating a cache (local or remote) + that has just been updated; simply pass the time value + of the 'old' IMessage as the argument. + + Note that this is asynchronous! An invalidation is just + a request to remove the item within a short time period. + If you need the entry removed synchronously, you should + use the NetworkCache extract() method instead. + + ***********************************************************************/ + + void invalidate (char[] key, Time timeLimit = Time.max) + { + assert (key.length); + filter.key (key); + filter.time (timeLimit); + + // broadcast a message across the cluster + channel.broadcast (filter); + } +} + + +/******************************************************************************* + +*******************************************************************************/ + +private class InvalidatorPayload : NetworkMessage +{ + private char[] key_; + + /*********************************************************************** + + ***********************************************************************/ + + char[] key () + { + return key_; + } + + /*********************************************************************** + + ***********************************************************************/ + + void key (char[] key) + { + assert (key.length); + key_ = key; + } + + /*********************************************************************** + + Read our attributes, after telling our superclass to do + likewise. The order of this is important with respect to + inheritance, such that a subclass and superclass may be + populated in isolation where appropriate. + + Note that we slice our text attribute, rather than copying + it. Since this class is temporal we can forego allocation + of memory, and just map it directly from the input buffer. + + ***********************************************************************/ + + override void read (IReader input) + { + super.read (input); + input (key_); + } + + /*********************************************************************** + + ***********************************************************************/ + + override void write (IWriter output) + { + super.write (output); + output (key_); + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/NetworkAlert.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/NetworkAlert.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,54 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: July 2004: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.NetworkAlert; + +private import tango.net.cluster.NetworkClient; + +/******************************************************************************* + +*******************************************************************************/ + +class NetworkAlert : NetworkClient +{ + /*********************************************************************** + + Construct a NetworkAlert gateway on the provided QOS cluster + for the specified channel. Each subsequent alert will take + place over the given channel. + + ***********************************************************************/ + + this (ICluster cluster, char[] channel) + { + super (cluster, channel); + } + + /*********************************************************************** + + ***********************************************************************/ + + IConsumer createConsumer (ChannelListener listener) + { + return channel.createBulletinConsumer (listener); + } + + /*********************************************************************** + + ***********************************************************************/ + + void broadcast (IMessage payload = null) + { + channel.broadcast (payload); + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/NetworkCache.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/NetworkCache.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,246 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: July 2004: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.NetworkCache; + +private import tango.core.Thread; + +private import tango.net.cluster.model.IMessage; + +private import tango.net.cluster.QueuedCache, + tango.net.cluster.CacheInvalidator, + tango.net.cluster.CacheInvalidatee; + +/******************************************************************************* + + A gateway to the network cache. From here you can easily place + IMessage objects into the network cluster, copy them and remove + them. A cluster cache is spread out across many servers within + the network. Each cache entry is associated with a 'channel', + which is effectively the name of a cache instance within the + cluster. See ComboCache also. The basic procedure is so: + --- + import tango.net.cluster.NetworkCache; + import tango.net.cluster.tina.Cluster; + + auto cluster = new Cluster (...); + auto cache = new NetworkCache (cluster, ...); + + cache.put (...); + cache.get (); + cache.invalidate (...); + --- + + Note that any content placed into the cache must implement the + IMessage interface, and must be enrolled with the Registry, as + it may be frozen and thawed as it travels around the network. + +*******************************************************************************/ + +class NetworkCache : CacheInvalidator +{ + /*********************************************************************** + + Construct a NetworkCache using the QOS (cluster) provided, + and hook it onto the specified channel. Each subsequent + operation is tied to this channel. + + ***********************************************************************/ + + this (ICluster cluster, char[] channel) + { + super (cluster, channel); + } + + /*********************************************************************** + + Returns a copy of the cluster cache entry corresponding to + the provided key. Returns null if there is no such entry. + + ***********************************************************************/ + + IMessage get (char[] key) + { + assert (key.length); + return channel.getCache (key, false); + } + + /*********************************************************************** + + Remove and return the cache entry corresponding to the + provided key. + + ***********************************************************************/ + + IMessage extract (char[] key) + { + assert (key.length); + return channel.getCache (key, true); + } + + /*********************************************************************** + + Set a cluster cache entry. + + Place an entry into the network cache, replacing the + entry with the identical key. Where message.time is + set, it will be used to test for newer cache entries + than the one being sent i.e. if someone else placed + a newer entry into the cache, that one will remain. + + The msg will be placed into one or more cluster hosts + (depending upon QOS) + + Returns true if the cache entry was inserted, false if + the cache server already has an exiting key with a more + recent timestamp (where message.time is set). + + ***********************************************************************/ + + bool put (char[] key, IMessage message) + { + assert (message); + assert (key.length); + + return channel.putCache (key, message); + } +} + + +/******************************************************************************* + + A combination of a local cache, cluster cache, and CacheInvalidatee. + The two cache instances are combined such that they represent a + classic level1/level2 cache. The CacheInvalidatee ensures that the + level1 cache maintains coherency with the cluster. + +*******************************************************************************/ + +class NetworkCombo : NetworkCache +{ + private QueuedCache!(char[], IMessage) cache; + private CacheInvalidatee invalidatee; + + /*********************************************************************** + + Construct a ComboCache for the specified local cache, and + on the given cluster channel. + + ***********************************************************************/ + + this (ICluster cluster, char[] channel, uint capacity) + { + super (cluster, channel); + + cache = new QueuedCache!(char[], IMessage) (capacity); + invalidatee = new CacheInvalidatee (cluster, channel, cache); + } + + /*********************************************************************** + + Get an IMessage from the local cache, and revert to the + cluster cache if it's not found. + + Cluster lookups will *not* place new content into the + local cache without confirmation: the supplied delegate + must perform the appropriate cloning of cluster entries + before they will be placed into the local cache. This + delegate would typically invoke the clone() method on + the provided network message; behaviour is undefined + where a delegate simply returns a message without the + appropriate cloning steps. + + Returns null if the entry does not exist in either the + local or remote cache, or if the delegate returned null. + Returns the cache entry otherwise. + + ***********************************************************************/ + + IMessage get (char[] key, IMessage delegate(IMessage) dg) + { + auto cached = cache.get (key); + if (cached is null) + { + cached = super.get (key); + + // if delegate cloned the entry, + // place said clone into the cache + if (cached && (cached = dg(cached)) !is null) + cache.put (key, cached, cached.time); + } + return cached; + } + + /*********************************************************************** + + Place a new entry into the cache. This will also place + the entry into the cluster, and optionally invalidate + all other local cache instances across the network. If + a cache entry exists with the same key, it is replaced. + + Where message.time is set, it will be used to test for + newer cache entries than the one being sent i.e. if a + newer entry exists in the cache, that one will remain. + + Note that when using the coherency option you should + ensure your IMessage has a valid time stamp, since that + is used to invalidate appropriate cache listeners in the + cluster. You can use the getTime() method to retrieve a + current millisecond count. + + Returns true if the cache entry was inserted, false if + the cache server already has an exiting key with a more + recent timestamp (where message.time is set). + + ***********************************************************************/ + + bool put (char[] key, IMessage message, bool coherent = false) + { + // this will throw an exception if there's a problem + if (super.put (key, message)) + { + // place into local cache also + cache.put (key, message, message.time); + + // invalidate all other cache instances except this new one, + // such that no other listening cache has the same key + if (coherent) + invalidate (key, message.time); + + return true; + } + return false; + } + + /*********************************************************************** + + Remove and return the cache entry corresponding to the + provided key. + + Synchronously extracts the entry from the cluster, and + returns the entry from the local cache if there is one + there; null otherwise + + ***********************************************************************/ + + IMessage extract (char[] key) + { + // do this first, since its return value may have to be cloned + super.extract (key); + + // return the local entry if there is one + return cache.remove (key); + } +} + + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/NetworkCall.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/NetworkCall.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,230 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Tango. All rights reserved + + license: BSD style: $(LICENSE) + + version: April 2007: Initial release + + author: h3r3tic, Kris + +*******************************************************************************/ + +module tango.net.cluster.NetworkCall; + +private import tango.core.Traits; +private import tango.core.Thread; + +private import tango.net.cluster.NetworkMessage; + +protected import tango.io.protocol.model.IReader, + tango.io.protocol.model.IWriter; + +protected import tango.net.cluster.model.IChannel; + + +/******************************************************************************* + + task harness, for initiating the send + +*******************************************************************************/ + +class NetworkCall : NetworkMessage +{ + /*********************************************************************** + + ***********************************************************************/ + + void send (IChannel channel = null) + { + if (channel) + channel.execute (this); + else + { + auto x = cast(IChannel) Thread.getLocal(0); + if (x) + x.execute (this); + else + execute; + } + } +} + + +/******************************************************************************* + + Template for RPC glue + +*******************************************************************************/ + +class NetCall(alias realFunc) : NetworkCall +{ + alias ParameterTupleOf!(realFunc) Params; + alias ReturnTypeOf!(realFunc) RetType; + + static if (!is(RetType == void)) { + RetType result; + } + Params params; + + + override char[] toString() { + return signatureOfFunc!(realFunc); + } + + RetType opCall(Params params, IChannel channel = null) { + foreach (i, _dummy; this.params) { + this.params[i] = params[i]; + } + send (channel); + + static if (!is(RetType == void)) { + return result; + } + } + + override void execute() { + static if (!is(RetType == void)) { + result = realFunc(params); + } else { + realFunc(params); + } + } + + override void read(IReader input) { + static if (!is(RetType == void)) { + input(result); + } + foreach (i, _dummy; params) input(params[i]); + } + + override void write(IWriter output) { + static if (!is(RetType == void)) { + output(result); + } + foreach (i, _dummy; params) output(params[i]); + } +} + + +/******************************************************************************* + + Magic to get a clean function signature + +*******************************************************************************/ + +private { + struct Wrapper(alias fn) {} + const char[] WrapperPrefix = `__T7Wrapper`; + + + uint parseUint(char[] str) { + int res = 0; + foreach (c; str) { + res *= 10; + res += c - '0'; + } + return res; + } + + + char[] sliceOffSegment(inout char[] str) { + assert (str.length > 0 && str[0] >= '0' && str[0] <= '9'); + + int lenEnd = 0; + for (; str[lenEnd] >= '0' && str[lenEnd] <= '9'; ++lenEnd) {} + + char[] lenStr = str[0..lenEnd]; + uint segLen = parseUint(lenStr); + str = str[lenEnd .. $]; + + char[] res = str[0..segLen]; + str = str[segLen .. $]; + return res; + } + + + char[] digOutWrapper(char[] wrapped) { + wrapped = wrapped[1..$]; // skip the 'S' + char[] seg; + + do { + seg = sliceOffSegment(wrapped); + } while (seg.length < WrapperPrefix.length || seg[0..WrapperPrefix.length] != WrapperPrefix); + + return seg[WrapperPrefix.length .. $]; + } + + + char[] demangleDFunc(char[] mangled) { + char[] res = sliceOffSegment(mangled); + + while (mangled.length > 0 && mangled[0] >= '0' && mangled[0] <= '9') { + res ~= '.' ~ sliceOffSegment(mangled); + } + return res; + } + + + char[] nameOf_impl(char[] wrapped) { + char[] wrapper = digOutWrapper(wrapped)[1..$]; // skip the 'S' + char[] mangled = sliceOffSegment(wrapper); + + if (mangled.length > 2 && mangled[0..2] == `_D`) { + // D func + return demangleDFunc(mangled[2..$]); + } else { + return mangled; // C func + } + } + + + int match_param_(char[] str) { + if (str.length < `_param_0`.length) return 0; + + int numDigits = 0; + while (str[$-1-numDigits] >= '0' && str[$-1-numDigits] <= '9') { + ++numDigits; + } + + if (0 == numDigits) return 0; + + if (str.length >= `_param_`.length + numDigits && str[$-`_param_`.length-numDigits .. $-numDigits] == `_param_`) { + return `_param_`.length + numDigits; + } else { + return 0; + } + } + + + // sometimes the param lists have ugly _param_[0-9]+ names in them... + char[] tidyTupleStringof(char[] str) { + char[] res; + for (int i = 0; i < str.length; ++i) { + char c = str[i]; + + if (c == ')' || c == ',') { + if (auto len = match_param_(str[0..i])) { + // len is the length of the _param_[0-9]+ thing + int start = i-1-len; + str = str[0..start] ~ str[i..$]; + i -= len; + } + } + } + + return str; + } + + + template nameOfFunc(alias fn) { + static assert (is(typeof(fn) == function)); + const char[] nameOfFunc = nameOf_impl((Wrapper!(fn)).mangleof); + } + + + template signatureOfFunc(alias fn) { + static assert (is(typeof(fn) == function)); + const char[] signatureOfFunc = ReturnTypeOf!(fn).stringof ~ ' ' ~ nameOfFunc!(fn) ~ tidyTupleStringof(ParameterTupleOf!(fn).stringof); + } +} \ No newline at end of file diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/NetworkClient.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/NetworkClient.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,162 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: July 2004: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.NetworkClient; + +private import tango.time.Clock; + +private import tango.core.Exception; + +public import tango.net.cluster.model.ICluster; + +public import tango.net.cluster.NetworkMessage, + tango.net.cluster.NetworkRegistry; + +/******************************************************************************* + + The base class for all cluster clients (such as CacheInvalidator) + which acts simply as a container for the operating IChannel and + the configured ICluster. The former specifies something akin to + a 'topic' in the pub/sub world, while the latter provides access + to the underlying functional substrate (the QOS implementation). + +*******************************************************************************/ + +class NetworkClient +{ + private IChannel channel_; + private ICluster cluster_; + + public static NetworkMessage EmptyMessage; + + static this () + { + NetworkRegistry.shared.enroll (EmptyMessage = new NetworkMessage); + } + + /*********************************************************************** + + Construct this client with the specified channel and cluster. + The former specifies something akin to a 'topic', whilst the + latter provides access to the underlying functional substrate + (the QOS implementation). A good way to think about channels + is to map them directly to a class name. That is, since you + send and recieve classes on a channel, you might utilize the + class name as the channel name (this.classinfo.name). + + ***********************************************************************/ + + this (ICluster cluster, char[] channel) + { + assert (cluster); + assert (channel.length); + + cluster_ = cluster; + channel_ = cluster.createChannel (channel); + } + + /*********************************************************************** + + Return the channel we're tuned to + + ***********************************************************************/ + + IChannel channel () + { + return channel_; + } + + /*********************************************************************** + + Return the cluster specified during construction + + ***********************************************************************/ + + ICluster cluster () + { + return cluster_; + } + + /*********************************************************************** + + Return the current time + + ***********************************************************************/ + + Time time () + { + return Clock.now; + } + + /*********************************************************************** + + Return the Log instance + + ***********************************************************************/ + + Logger log () + { + return cluster_.log; + } + + /*********************************************************************** + + Create a channel with the specified name. A channel + represents something akin to a publush/subscribe topic, + or a radio station. These are used to segregate cluster + operations into a set of groups, where each group is + represented by a channel. Channel names are whatever you + want then to be; use of dot notation has proved useful + in the past. In fact, a good way to think about channels + is to map them directly to a class name. That is, since you + typically send and recieve classes on a channel, you might + utilize the class name as the channel (this.classinfo.name). + + ***********************************************************************/ + + IChannel createChannel (char[] name) + { + return cluster_.createChannel (name); + } +} + +/******************************************************************************* + + This exception is thrown by the cluster subsystem when an attempt + is made to place additional content into a full queue + +*******************************************************************************/ + +class ClusterFullException : ClusterException +{ + this (char[] msg) + { + super (msg); + } +} + +/******************************************************************************* + + This exception is thrown by the cluster subsystem when an attempt + is made to converse with a non-existant cluster, or one where all + cluster-servers have died. + +*******************************************************************************/ + +class ClusterEmptyException : ClusterException +{ + this (char[] msg) + { + super (msg); + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/NetworkMessage.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/NetworkMessage.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,197 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: July 2004: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.NetworkMessage; + +private import tango.core.Exception; + +public import tango.net.cluster.model.ICluster; + +/******************************************************************************* + + A cluster-based messaging class. You should override both read() and + write() methods to transport non-transient content along with the msg. + + Note that when using read() and write(), invoke the superclass first + so that your Message can potentially be deserialized as a superclass + instance. That is, read() and write() might look something like this: + --- + void read (IReader input) + { + super.read (input); + input (myAttribute) (myOtherAttribute); + } + + void write (IWriter output) + { + super.write (output); + output (myAttribute) (myOtherAttribute2); + } + --- + +*******************************************************************************/ + +class NetworkMessage : IMessage +{ + private uint id_; + private long time_; // converted to Time as necessary + private char[] reply_; + + /*********************************************************************** + + Have to proxy this to satisfy interface requirements. It's + both annoying and fragile to be forced into this kind of + call-brokering, but then interfaces also don't expose the + methods from Object either. Interfaces in D are still a + bit too immature + + ***********************************************************************/ + + char[] toString () + { + return super.toString; + } + + /*********************************************************************** + + Set the optional reply-channel + + ***********************************************************************/ + + void reply (char[] channel) + { + reply_ = channel; + } + + /*********************************************************************** + + Return the optional reply-channel + + ***********************************************************************/ + + char[] reply () + { + return reply_; + } + + /*********************************************************************** + + Set the waterline of the cache-entries that should not be + touched by an invalidation. This is typically the time of + an entry in a local cache on the machine originating the + invalidation. Without the ability to guard against local + invalidation, the cache entry just added locally would be + removed along with others across the cluster. + + An alternative would be to invalidate before adding, though + that can become complicated by network race conditions. + + ***********************************************************************/ + + void time (Time time) + { + time_ = time.ticks; + } + + /*********************************************************************** + + Return our time value + + ***********************************************************************/ + + Time time () + { + return Time(time_); + } + + /*********************************************************************** + + ***********************************************************************/ + + void id (uint value) + { + id_ = value; + } + + /*********************************************************************** + + ***********************************************************************/ + + uint id () + { + return id_; + } + + /********************************************************************** + + Recover the reply-channel from the provided reader + + **********************************************************************/ + + void read (IReader input) + { + input (id_) (time_) (reply_); + } + + /********************************************************************** + + Emit our reply-channel to the provided writer + + **********************************************************************/ + + void write (IWriter output) + { + output (id_) (time_) (reply_); + } + + /*********************************************************************** + + Creates a shallow object copy. This is used internally + for setting up templates/hosts of registered objects and + should be overridden where deep(er) copying is desired. + Specifically: it makes a bit-copy only. Dynamic arrays or + pointer/reference oriented attributes are not duplicated. + + In general, there should be zero heap activity ocurring + during cluster requests. Thus, specific cluster services + utilize this method to construct message hosts, up-front, + helping to ensure the heap remains untouched during normal + operation. + + ***********************************************************************/ + + IMessage clone () + { + auto ci = this.classinfo; + auto end = ci.init.length; + auto start = Object.classinfo.init.length; + + auto clone = ci.create; + if (! clone) + throw new ClusterException ("cannot clone msg with no default ctor: "~ci.name); + + (cast(void*)clone)[start .. end] = (cast(void*)this)[start .. end]; + return cast(IMessage) clone; + } + + /********************************************************************** + + Interface issues mean that we'd have to reimplement all + the above methods again to support the ITask derivative. + Just hack this in here instead :[ + + **********************************************************************/ + + void execute () + { + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/NetworkQueue.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/NetworkQueue.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,112 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: July 2004: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.NetworkQueue; + +private import tango.net.cluster.NetworkClient; + +/******************************************************************************* + + Exposes a gateway to the cluster queues, which collect ICached + objects until they are removed. Because there is a finite limit + to the quantity of entries stored, the put() method may throw a + ClusterFullException if it cannot add a new entry. + +*******************************************************************************/ + +class NetworkQueue : NetworkClient, IConsumer +{ + private IChannel reply; + private IConsumer consumer; + + /*********************************************************************** + + Construct a NetworkMessage gateway on the provided QOS cluster + for the specified channel. Each subsequent queue operation + will take place over the given channel. + + You can listen for cluster replies by providing an optional + ChannelListener. Outgoing messages will be tagged appropriately + such that a consumer can respond using IEvent.reply + + ***********************************************************************/ + + this (ICluster cluster, char[] channel, ChannelListener listener = null) + { + super (cluster, channel); + + if (listener) + { + reply = cluster.createChannel (channel ~ ".reply"); + consumer = reply.createConsumer (listener); + } + } + + /*********************************************************************** + + Add an IMessage entry to the corresponding queue. This + will throw a ClusterFullException if there is no space + left in the clustered queue. + + ***********************************************************************/ + + void put (IMessage message) + { + assert (message); + + if (reply) + message.reply = reply.name; + + channel.putQueue (message); + } + + /*********************************************************************** + + Query the cluster for queued entries on our corresponding + channel. Returns, and removes, a matching entry from the + cluster. This is the synchronous (polling) approach; you + should use createConsumer() instead for asynchronous style + notification instead. + + ***********************************************************************/ + + IMessage get () + { + return channel.getQueue; + } + + /*********************************************************************** + + Cancel the listener. No more events will be dispatched to + the reply ChannelListener. + + ***********************************************************************/ + + void cancel() + { + if (consumer) + consumer.cancel; + consumer = null; + } + + /*********************************************************************** + + Create a listener for this channel. Listeners are invoked + when new content is placed into a corresponding queue. + + ***********************************************************************/ + + IConsumer createConsumer (ChannelListener listener) + { + return channel.createConsumer (listener); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/NetworkRegistry.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/NetworkRegistry.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,170 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Apr 2004: Initial release + Dec 2006: Outback version + Apr 2007: Delegate revision + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.NetworkRegistry; + +private import tango.core.Exception; + +private import tango.net.cluster.model.IMessage; + + +/******************************************************************************* + + Bare framework for registering and creating serializable objects. + Such objects are intended to be transported across a local network + and re-instantiated at some destination node. + + Each IMessage exposes the means to write, or freeze, its content. An + IPickleFactory provides the means to create a new instance of itself + populated with thawed data. Frozen objects are uniquely identified + by a guid exposed via the interface. Responsibility of maintaining + uniqueness across said identifiers lies in the hands of the developer. + +*******************************************************************************/ + +class NetworkRegistry +{ + private IMessage[char[]] registry; + + public static NetworkRegistry shared; + + /*********************************************************************** + + + ***********************************************************************/ + + static this () + { + shared = new NetworkRegistry; + } + + /*********************************************************************** + + + ***********************************************************************/ + + this (typeof(registry) registry = null) + { + this.registry = registry; + } + + /*********************************************************************** + + Synchronized Factory lookup of the guid + + ***********************************************************************/ + + final synchronized IMessage lookup (char[] guid) + { + auto p = guid in registry; + if (p is null) + error ("Registry.thaw :: attempt to reify via unregistered guid: ", guid); + + return *p; + } + + /*********************************************************************** + + Add the provided Factory to the registry. Note that one + cannot change a registration once it is placed. Neither + can one remove registered item. This is done to avoid + issues when trying to synchronize servers across + a farm, which may still have live instances of "old" + objects waiting to be passed around the cluster. New + versions of an object should be given a distinct guid + from the prior version; appending an incremental number + may well be sufficient for your needs. + + ***********************************************************************/ + + final synchronized void enroll (IMessage target) + { + auto guid = target.toString; + + if (guid in registry) + error ("Registry.enroll :: attempt to re-register guid: ", guid); + + registry[guid] = target; + } + + /*********************************************************************** + + Serialize an Object. Objects are written in Network-order, + and are prefixed by the guid exposed via the IMessage + interface. This guid is used to identify the appropriate + factory when reconstructing the instance. + + ***********************************************************************/ + + final void freeze (IWriter output, IMessage target) + { + output (target.toString); + target.write (output); + } + + /*********************************************************************** + + Create a new instance of a registered class from the content + made available via the given reader. The factory is located + using the provided guid, which must match an enrolled factory. + + Note that only the factory lookup is synchronized, and not + the instance construction itself. This is intentional, and + limits how long the calling thread is stalled + + ***********************************************************************/ + + final IMessage thaw (IReader input, IMessage host = null) + { + char[] guid; + + input (guid); + + if (host is null) + host = lookup (guid); + else + if (guid != host.toString) + error ("Registry.thaw :: attempt to reify into a mismatched host: ", guid); + + host.read (input); + return host; + } + + /*********************************************************************** + + Duplicate the registry + + ***********************************************************************/ + + final NetworkRegistry dup () + { + typeof(registry) u; + + foreach (k, v; registry) + u[k] = v.clone; + return new NetworkRegistry (u); + } + + /*********************************************************************** + + ***********************************************************************/ + + private static void error (char[] msg, char[] guid) + { + throw new RegistryException (msg ~ guid); + } +} + + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/NetworkTask.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/NetworkTask.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,49 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: July 2004: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.NetworkTask; + +private import tango.net.cluster.NetworkClient; + +/******************************************************************************* + +*******************************************************************************/ + +class NetworkTask : NetworkClient +{ + /*********************************************************************** + + Construct a NetworkTask gateway on the provided QOS cluster + for the specified channel. Each subsequent task operation + will take place over the given channel. + + ***********************************************************************/ + + this (ICluster cluster, char[] channel) + { + super (cluster, channel); + } + + /*********************************************************************** + + Add an ITask entry to the corresponding queue. This + will throw a ClusterFullException if there is no space + left in the clustered queue. + + ***********************************************************************/ + + void execute (IMessage task) + { + channel.execute (task); + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/QueuedCache.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/QueuedCache.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,397 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: April 2004: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.QueuedCache; + +private import tango.time.Time; + +private import tango.net.cluster.model.ICache; + +/****************************************************************************** + + QueuedCache extends the basic cache type by adding a limit to + the number of items contained at any given time. In addition, + QueuedCache sorts the cache entries such that those entries + frequently accessed are at the head of the queue, and those + least frequently accessed are at the tail. When the queue + becomes full, old entries are dropped from the tail and are + reused to house new cache entries. + + This is great for keeping commonly accessed items around, while + limiting the amount of memory used. Typically, the queue size + would be set in the hundreds (perhaps thousands). + + Note that key.init cannot be used as a valid key + +******************************************************************************/ + +class QueuedCache (K, V) : ICache!(K, V) +{ + private QueuedEntry*[K] map; + + // head and tail of queue + private QueuedEntry* head, + tail; + + /********************************************************************** + + Construct a cache with the specified maximum number of + entries. Additions to the cache beyond this number will + reuse the slot of the least-recently-referenced cache + entry. The concurrency level indicates approximately how + many threads will content for write access at one time. + + **********************************************************************/ + + this (uint capacity) + { + auto set = new QueuedEntry [capacity]; + + foreach (inout entry; set) + { + if (tail) + tail.next = &entry; + entry.prev = tail; + tail = &entry; + } + head = set.ptr; + } + + /********************************************************************** + + Get the cache entry identified by the given key + + **********************************************************************/ + + synchronized bool get (K key, inout V value) + { + // if we find 'key' then move it to the list head + auto e = lookup (key); + if (e) + { + value = reReference(e).value; + return true; + } + return false; + } + + /********************************************************************** + + Get the cache entry identified by the given key + + **********************************************************************/ + + synchronized V get (K key) + { + // if we find 'key' then move it to the list head + auto e = lookup (key); + if (e) + return reReference(e).value; + return V.init; + } + + /********************************************************************** + + Place an entry into the cache and associate it with the + provided key. Note that there can be only one entry for + any particular key. If two entries are added with the + same key, the second effectively overwrites the first. + + An optional time value allows for testing whether an + existing entry is newer than our provided one. Where + the provided time value is lesser, the put() operation + will be abandoned and false is returned. + + Returns true if the cache was updated. + + **********************************************************************/ + + synchronized bool put (K key, V value, Time time = Time.init) + { + assert (key !is key.init); + + auto e = lookup (key); + if (e is null) + map[key] = e = addEntry(); + else + if (time < e.time) + return false; + + reReference(e).set (key, value, time); + return true; + } + + /********************************************************************** + + Same as above, but being careful to avoid heap activity + where the provided key and value are potentially aliased + + **********************************************************************/ + + synchronized bool put (K peek, K delegate() key, V delegate() value, Time time = Time.init) + { + assert (peek !is peek.init); + + auto e = lookup (peek); + if (e is null) + map[peek = key()] = e = addEntry(); + else + if (time < e.time) + return false; + else + peek = e.key; + + reReference(e).set (peek, value(), time); + return true; + } + + /********************************************************************** + + Remove (and return) the cache entry associated with the + provided key. Returns null if there is no such entry. + + **********************************************************************/ + + synchronized V remove (K key, Time time = Time.max) + { + auto e = lookup (key); + if (e && (e.time < time)) + { + auto value = e.value; + + // don't actually kill the list entry -- just place + // it at the list 'tail' ready for subsequent reuse + deReference(e).set (K.init, V.init, Time.min); + + map.remove (key); + return value; + } + + return V.init; + } + + /********************************************************************** + + Iterate over elements + + Note that this needs to be synchronized, and can therefore + be very costly in terms of blocking other threads. Use with + caution + + **********************************************************************/ + + synchronized int opApply (int delegate(inout K key, inout V value) dg) + { + int ret; + foreach (k, v; map) + if ((ret = dg(k, v.value)) != 0) + break; + return ret; + } + + /********************************************************************** + + + **********************************************************************/ + + private final QueuedEntry* lookup (K key) + { + auto p = key in map; + return (p ? *p : null); + } + + /********************************************************************** + + Place a cache entry at the tail of the queue. This makes + it the least-recently referenced. + + **********************************************************************/ + + private final QueuedEntry* deReference (QueuedEntry* entry) + { + if (entry !is tail) + { + // adjust head + if (entry is head) + head = entry.next; + + // move to tail + entry.extract; + tail = entry.append (tail); + } + return entry; + } + + /********************************************************************** + + Move a cache entry to the head of the queue. This makes + it the most-recently referenced. + + **********************************************************************/ + + private final QueuedEntry* reReference (QueuedEntry* entry) + { + if (entry !is head) + { + // adjust tail + if (entry is tail) + tail = entry.prev; + + // move to head + entry.extract; + head = entry.prepend (head); + } + return entry; + } + + /********************************************************************** + + Add an entry into the queue. If the queue is full, the + least-recently-referenced entry is reused for the new + addition. + + **********************************************************************/ + + private final QueuedEntry* addEntry () + { + // steal from tail ... + auto entry = tail; + + // we're re-using an old QueuedEntry, so remove + // the old name from the hash-table first + if (entry.key !is entry.key.init) + map.remove (entry.key); + + // place at head of list + return reReference (entry); + } + + /********************************************************************** + + A doubly-linked list entry, used as a wrapper for queued + cache entries. + + **********************************************************************/ + + private static struct QueuedEntry + { + K key; + QueuedEntry* prev, + next; + Time time; + V value; + + /************************************************************** + + Set this entry with the given arguments. + + **************************************************************/ + + QueuedEntry* set (K key, V value, Time time) + { + this.value = value; + this.time = time; + this.key = key; + return this; + } + + /************************************************************** + + Insert this entry into the linked-list just in front + of the given entry. + + **************************************************************/ + + QueuedEntry* prepend (QueuedEntry* before) + { + assert (before); + + prev = before.prev; + + // patch 'prev' to point at me + if (prev) + prev.next = this; + + //patch 'before' to point at me + next = before; + return before.prev = this; + } + + /************************************************************** + + Add this entry into the linked-list just after the + given entry. + + **************************************************************/ + + QueuedEntry* append (QueuedEntry* after) + { + assert (after); + + next = after.next; + + // patch 'next' to point at me + if (next) + next.prev = this; + + //patch 'after' to point at me + prev = after; + return after.next = this; + } + + /************************************************************** + + Remove this entry from the linked-list. The previous + and next entries are patched together appropriately. + + **************************************************************/ + + QueuedEntry* extract () + { + // make 'prev' and 'next' entries see each other + if (prev) + prev.next = next; + + if (next) + next.prev = prev; + + // Murphy's law + next = prev = null; + return this; + } + } +} + + + +version (QueuedCache) +{ + import tango.io.Stdout; + + void main() + { + new QueuedCache!(int, char[])(100); + auto map = new QueuedCache!(char[], int)(2); + + map.put ("one", 1); + map.put ("two", 2); + int v; + map.get ("one", v); + map.put ("three", 3); + + foreach (k, v; map) + Stdout.formatln ("{}:{}", k, v); + + foreach (k, v; map.map) + Stdout.formatln ("{}:{}", k, v.value); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/model/ICache.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/model/ICache.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,54 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: April 2004: Initial release + +*******************************************************************************/ + +module tango.net.cluster.model.ICache; + +private import tango.time.Time; + +/****************************************************************************** + +******************************************************************************/ + +interface ICache (K, V) +{ + /********************************************************************** + + Get the cache entry identified by the given key + + **********************************************************************/ + + V get (K key); + + /********************************************************************** + + Place an entry into the cache and associate it with the + provided key. Note that there can be only one entry for + any particular key. If two keys entries are added with + the same key, the second effectively overwrites the first. + + Returns what it was given + + **********************************************************************/ + + bool put (K key, V entry, Time time = Time.init); + + /********************************************************************** + + Remove (and return) the cache entry associated with the + provided key. The entry will not be removed if it's time + attribute is newer than the (optional) specified 'timelimit'. + + Returns null if there is no such entry. + + **********************************************************************/ + + V remove (K key, Time time = Time.max); +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/model/IChannel.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/model/IChannel.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,206 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: July 2004: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.model.IChannel; + +private import tango.util.log.Logger; + +private import tango.net.cluster.model.IMessage, + tango.net.cluster.model.IConsumer; + +/******************************************************************************* + + A channel represents something akin to a publish/subscribe topic, + or a radio station. These are used to segregate cluster operations + into a set of groups, where each group is represented by a channel. + Channel names are whatever you want then to be: use of dot notation + has proved useful in the past. See Client.createChannel + +*******************************************************************************/ + +interface IChannel +{ + /*********************************************************************** + + Return the Logger associated with this cluster + + ***********************************************************************/ + + Logger log (); + + /*********************************************************************** + + Return the name of this channel. This is the name provided + when the channel was constructed. + + ***********************************************************************/ + + char[] name (); + + /*********************************************************************** + + Create a message listener on the given + channel. The ChannelListener should be called whenever + a corresponding cluster event happens. Note that the + notification is expected to be on a seperate thread. + + ***********************************************************************/ + + IConsumer createConsumer (ChannelListener notify); + + /*********************************************************************** + + Create a bulletin listener on the given + channel. The ChannelListener should be called whenever + a corresponding cluster event happens. Note that the + notification is expected to be on a seperate thread. + + ***********************************************************************/ + + IConsumer createBulletinConsumer (ChannelListener notify); + + /*********************************************************************** + + Place a cache entry into the cluster. If there is already + a matching entry, it is replaced. + + ***********************************************************************/ + + bool putCache (char[] key, IMessage message); + + /*********************************************************************** + + Return a cluster cache entry, and optionally remove it + from the cluster. + + ***********************************************************************/ + + IMessage getCache (char[] key, bool remove, IMessage host=null); + + /*********************************************************************** + + Ask the cache host to load an entry, via the provided + message. Note that the message itself should contain all + pertinent information to load the entry (such as whatever + key values are required). + + The host executes the message in a manner akin to RPC, thus + the message also needs to be registered with the host server + + ***********************************************************************/ + + bool loadCache (char[] key, IMessage message); + + /*********************************************************************** + + Place a new entry into the cluster queue. This may throw + a ClusterFullException when there is no space left within + the cluster queues. + + ***********************************************************************/ + + IMessage putQueue (IMessage message); + + /*********************************************************************** + + Query the cluster for queued entries on our corresponding + channel. Removes, and returns, the first matching entry + from the cluster. + + ***********************************************************************/ + + IMessage getQueue (IMessage host = null); + + /*********************************************************************** + + Scatter a message to all registered listeners. This is + akin to multicast. + + ***********************************************************************/ + + void broadcast (IMessage message = null); + + /*********************************************************************** + + Execute the provided message on the cluster, and return the + results internally + + ***********************************************************************/ + + bool execute (IMessage message); +} + + +/******************************************************************************* + + An IEvent is passed as the argument to each ChannelListener callback + +*******************************************************************************/ + +interface IEvent +{ + /*********************************************************************** + + Return the channel used to initiate the listener + + ***********************************************************************/ + + IChannel channel (); + + /*********************************************************************** + + Return one or more messages associated with this event, or + null if there is nothing available + + ***********************************************************************/ + + IMessage get (IMessage host = null); + + /*********************************************************************** + + Send a message back to the producer. This should support all + the various event styles. + + ***********************************************************************/ + + void reply (IChannel channel, IMessage message); + + /*********************************************************************** + + Return an appropriate reply channel for the given message, + or return null if no reply is expected + + ***********************************************************************/ + + IChannel replyChannel (IMessage message); + + /*********************************************************************** + + Return the Logger associated with this cluster + + ***********************************************************************/ + + Logger log (); +} + +/******************************************************************************* + + Declares the contract for listeners within the cluster package. + When creating a listener, you provide a callback delegate matching + this signature. The delegate is invoked, on a seperate thread, each + time a relevant event occurs. + +*******************************************************************************/ + +alias void delegate (IEvent event) ChannelListener; + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/model/ICluster.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/model/ICluster.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,48 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: July 2004: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.model.ICluster; + +public import tango.util.log.Logger; + +public import tango.net.cluster.model.IChannel, + tango.net.cluster.model.IMessage, + tango.net.cluster.model.IConsumer; + +/******************************************************************************* + + The contract exposed by each QOS implementation. This is the heart + of the cluster package, designed with multiple implementations in + mind. It should be reasonably straightforward to construct specific + implementations upon a database, pub/sub system, or other substrates. + +*******************************************************************************/ + +interface ICluster +{ + /*********************************************************************** + + Create a channel instance. Every cluster operation has + a channel provided as an argument + + ***********************************************************************/ + + IChannel createChannel (char[] channel); + + /*********************************************************************** + + Return the Logger associated with this cluster + + ***********************************************************************/ + + Logger log (); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/model/IConsumer.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/model/IConsumer.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,34 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: July 2004: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.model.IConsumer; + +/******************************************************************************* + + Contract exposed by each cluster listener. This is what you are + handed back upon successful construction of a listener. + +*******************************************************************************/ + +interface IConsumer +{ + /*********************************************************************** + + Cancel the listener. No more events will be dispatched to + the associated ChannelListener. + + ***********************************************************************/ + + void cancel(); +} + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/model/IMessage.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/model/IMessage.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,109 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: July 2004: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.model.IMessage; + +public import tango.time.Time; + +public import tango.io.protocol.model.IReader, + tango.io.protocol.model.IWriter; + +/******************************************************************************* + +*******************************************************************************/ + +interface IMessage : IReadable, IWritable +{ + /*********************************************************************** + + ***********************************************************************/ + + char[] toString (); + + /*********************************************************************** + + ***********************************************************************/ + + IMessage clone (); + + /*********************************************************************** + + ***********************************************************************/ + + void reply (char[] channel); + + /*********************************************************************** + + ***********************************************************************/ + + char[] reply (); + + /*********************************************************************** + + ***********************************************************************/ + + void time (Time value); + + /*********************************************************************** + + ***********************************************************************/ + + Time time (); + + /*********************************************************************** + + ***********************************************************************/ + + void id (uint value); + + /*********************************************************************** + + ***********************************************************************/ + + uint id (); + + /*********************************************************************** + + ***********************************************************************/ + + void execute (); +} + + +/****************************************************************************** + + Manages the lifespan of an ICache entry. These loaders effectively + isolate the cache from whence the content is derived. It's a good + idea to employ this abstraction where appropriate, since it allows + the cache source to change with minimal (if any) impact on client + code. + +******************************************************************************/ + +interface IMessageLoader +{ + /********************************************************************** + + Load a cache entry from wherever the content is persisted. + The 'time' argument represents that belonging to a stale + entry, which can be used to optimize the loader operation + (no need to perform a full load where there's already a + newer version in an L2 cache). This 'time' value will be + long.min where was no such stale entry. + + **********************************************************************/ + + IMessage load (); +} + + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/tina/CacheServer.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/tina/CacheServer.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,94 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: July 2004: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.tina.CacheServer; + +private import tango.net.cluster.tina.RollCall, + tango.net.cluster.tina.CacheThread, + tango.net.cluster.tina.ClusterCache, + tango.net.cluster.tina.ClusterServer; + +/****************************************************************************** + + Extends the ClusterServer to glue cluster-cache support together + +******************************************************************************/ + +class CacheServer : ClusterServer +{ + private ClusterCache cache; + + /********************************************************************** + + Construct this server with the requisite attributes. The + 'bind' address is the local address we'll be listening on + + **********************************************************************/ + + this (InternetAddress bind, Logger logger, uint size) + { + super ("cache", bind, logger); + + // create a cache instance + cache = new ClusterCache (cluster, size); + } + + /********************************************************************** + + Start the server + + **********************************************************************/ + + void start (bool reuse=false) + { + super.start (new RollCall(RollCall.Cache), reuse); + } + + /********************************************************************** + + Factory method for servicing a request. We just create + a new CacheThread to handle requests from the client. + The thread does not exit until the socket connection is + broken by the client, or some other exception occurs. + + **********************************************************************/ + + override void service (IConduit conduit) + { + (new CacheThread (this, conduit, cluster, cache)).execute; + } +} + + + +version (CacheServer) +{ + import tango.io.Console; + + import tango.net.cluster.tina.CmdParser; + + void main (char[][] args) + { + auto arg = new CmdParser ("cache.server"); + + // default number of cache entries (per channel) + arg.size = 1024; + + if (args.length > 1) + arg.parse (args[1..$]); + + if (arg.help) + Cout ("usage: cacheserver -port=number -size=cachesize -log[=trace, info, warn, error, fatal, none]").newline; + else + (new CacheServer(new InternetAddress(arg.port), arg.log, arg.size)).start; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/tina/CacheThread.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/tina/CacheThread.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,162 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: July 2004: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.tina.CacheThread; + +private import tango.core.Exception; + +private import tango.net.cluster.NetworkRegistry; + +private import tango.net.cluster.tina.ClusterCache, + tango.net.cluster.tina.ClusterTypes, + tango.net.cluster.tina.ClusterThread; + +/****************************************************************************** + + Thread for handling cache requests + +******************************************************************************/ + +class CacheThread : ClusterThread +{ + private ClusterCache cache; + private NetworkRegistry registry; + + /********************************************************************** + + Note that the conduit stays open until the client kills it + + **********************************************************************/ + + this (AbstractServer server, IConduit conduit, Cluster cluster, ClusterCache cache) + { + super (server, conduit, cluster); + + // clone the registry so that we have our own set of + // message templates to act as hosts. This eliminates + // allocating hosts on the fly for load() requests + registry = NetworkRegistry.shared.dup; + + // retain the cache instance + this.cache = cache; + } + + /********************************************************************** + + process client requests + + **********************************************************************/ + + void dispatch () + { + ProtocolWriter.Command cmd; + long time; + char[] channel; + char[] element; + + // wait for request to arrive + auto content = reader.getPacket (cmd, channel, element, time); + + switch (cmd) + { + case ProtocolWriter.Command.Add: + logger.trace (sprint ("{} add cache entry '{}' on channel '{}'", client, element, channel)); + + // return the content if we can't put it in the cache + if (cache.put (channel, element, content, Time(time))) + writer.success ("success"); + else + writer.reply (content); + break; + + case ProtocolWriter.Command.Copy: + logger.trace (sprint ("{} copy cache entry '{}' on channel '{}'", client, element, channel)); + + writer.reply (cache.get (channel, element)); + break; + + case ProtocolWriter.Command.Remove: + logger.trace (sprint ("{} remove cache entry '{}' on channel '{}'", client, element, channel)); + + writer.reply (cache.extract (channel, element)); + break; + + case ProtocolWriter.Command.Load: + logger.trace (sprint ("{} loading cache entry '{}' on channel '{}'", client, element, channel)); + + load (cmd, channel, element); + break; + + default: + throw new IllegalArgumentException ("invalid command"); + } + } + + + /********************************************************************** + + Manages the loading of cache entries remotely, upon + the host that actually contains the cache entry. + + The benefit of this approach lies in the ability to + 'gate' access to specific resources across the entire + network. That is; where particular cache entries are + prohibitively costly to construct, it is worthwhile + ensuring that cost is reduced to a bare minimum. These + remote loaders allow the cache host to block multiple + network clients until there's a new entry available. + Without this mechanism, it would become possible for + multiple network clients to request the same entry + simultaneously, therefore increasing the overall cost. + The end result is similar to that of a distributed + transaction. + + **********************************************************************/ + + void load (ProtocolWriter.Command cmd, char[] channel, char[] element) + { + // convert to a message instance. Note that we use a private + // set of msg templates, so we don't collide with other threads + auto msg = reader.thaw (registry); + + // check to see if it has already been updated or is + // currently locked; go home if so, otherwise lock it + if (cache.lock (channel, element, msg.time)) + try { + // ensure this is the right object + auto loader = cast(IMessageLoader) msg; + if (loader) + { + // acknowledge the request. Do NOT wait for completion! + writer.success.flush; + + // get the new cache entry. The 'time' attribute should + // be set appropriately before return + if (auto e = loader.load) + { + long time; + // serialize new entry and stuff it into cache + writer.put (writer.Command.OK, channel, element, e); + cache.put (channel, element, reader.getPacket (cmd, channel, element, time), e.time); + } + } + else + writer.exception (sprint ("invalid remote cache-loader '{}'", msg.toString)).flush; + + } finally + // ensure we unlock this one! + cache.unlock (channel, element); + else + writer.success.flush; + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/tina/Cluster.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/tina/Cluster.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,1705 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: July 2004: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.tina.Cluster; + +private import tango.math.Random; + +private import tango.core.Thread, + tango.core.Runtime, + tango.core.Exception; + +private import tango.util.log.Log, + tango.util.log.Logger; + +private import tango.time.Clock; + +private import tango.io.Buffer, + tango.io.GrowBuffer; + +private import tango.io.model.IConduit; + +private import tango.net.Socket, + tango.net.SocketConduit, + tango.net.SocketListener, + tango.net.InternetAddress, + tango.net.MulticastConduit; + +private import tango.net.cluster.NetworkClient; + +public import tango.net.cluster.model.ICluster; + +private import tango.net.cluster.tina.RollCall, + tango.net.cluster.tina.ProtocolReader, + tango.net.cluster.tina.ProtocolWriter; + +private import Integer = tango.text.convert.Integer; + +/******************************************************************************* + + QOS implementation for sockets. All cluster-client activity is + gated through here by the higher level classes; NetworkQueue & + NetworkCache for example. You gain access to the cluster by + creating an instance of the QOS (quality of service) you desire + and either mapping client classes onto it, or usign it directly. + For example: + --- + import tango.net.cluster.tina.Cluster; + + auto cluster = new Cluster; + cluster.join; + + auto channel = cluster.createChannel (...); + channel.putQueue (...); + channel.getQueue (); + --- + + Please see the cluster clients for additional details. Currently + these include CacheInvalidator, CacheInvalidatee, NetworkMessage, + NetworkTask, NetworkQueue, NetworkCache, NetworkCombo, plus the + Client base-class. + +*******************************************************************************/ + +class Cluster : Broadcaster, ICluster +{ + private FlexNodeSet task, + queue; + private FixedNodeSet cache; + private Logger logger; + + /*********************************************************************** + + Create a cluster instance with a default logger and Nagle + caching disabled + + ***********************************************************************/ + + this () + { + this (Log.getLogger ("cluster.generic"), true); + } + + /*********************************************************************** + + Create a cluster instance with the provided logger. Option + noDelay controls the settting of the Nagle algorithm on an + active connection to a server, which should be disabled by + default (noDelay == true) + + ***********************************************************************/ + + this (Logger log, bool noDelay = true) + { + assert (log); + logger = log; + + task = new FlexNodeSet (log, noDelay); + queue = new FlexNodeSet (log, noDelay); + cache = new FixedNodeSet (log, noDelay); + } + + /*********************************************************************** + + Join the cluster as a client, discovering servers. Client + applications should invoke this before making requests so + that there are some servers to address. + + If cache facilities will be used, then the join(cacheHosts) + variation should be used instead + + ***********************************************************************/ + + final Cluster join () + { + // listen for cluster servers + auto channel = createChannel ("cluster.server.advertise"); + channel.createBulletinConsumer (¬ify); + + // ask who's currently running + channel.broadcast (new RollCall); + logger.trace ("discovering cluster nodes"); + + // wait for enabled servers to respond ... + Thread.sleep (0.250); + return this; + } + + /*********************************************************************** + + Join the cluster as a client, discovering servers. Client + applications should invoke this before making requests so + that there are some servers to address. + + If cache facilities will be used, use this method to set + the group of valid cache hosts. Each cache host should be + described as an array of machine-name and port pairs e.g. + --- + ["lucy:1234", "daisy:3343", "daisy:3344"] + --- + + This sets up a fixed set of cache hosts, which should be + identical for all cache clients. Cache hosts not included + in this list will be ignored when they come online. + + ***********************************************************************/ + + final Cluster join (char[][] cacheHosts) + { + foreach (addr; cacheHosts) + cache.addNode (new Node (log, addr, "cache")); + return join; + } + + /*********************************************************************** + + Return the logger instance provided during construction. + + ***********************************************************************/ + + final Logger log () + { + return logger; + } + + /*********************************************************************** + + Create a channel instance. Our channel implementation + includes a number of cached IO helpers (ProtocolWriter + and so on) which simplifies and speeds up execution. + + ***********************************************************************/ + + final IChannel createChannel (char[] channel) + { + return new Channel (this, channel); + } + + /*********************************************************************** + + ChannelListener method for listening to RollCall responses. + These are sent out by cluster servers both when they get a + RollCall request, and when they heartbeat. + + ***********************************************************************/ + + private void notify (IEvent event) + { + scope rollcall = new RollCall; + event.get (rollcall); + + switch (rollcall.type) + { + default: + break; + + case RollCall.Task: + task.enable (rollcall.addr, "task"); + break; + + case RollCall.Cache: + cache.enable (rollcall.addr); + break; + + case RollCall.Queue: + queue.enable (rollcall.addr, "queue"); + break; + } + } +} + + +/******************************************************************************* + + Basic multicast support across the cluster. Multicast is used + for broadcasting messages to all nodes in the cluster. We use + it for cache-invalidation, heartbeat, rollcall and notification + of queue activity + +*******************************************************************************/ + +private class Broadcaster +{ + private static InternetAddress[char[]] groups; + private Buffer mBuffer; + private ProtocolWriter mWriter; + private MulticastConduit mSocket; + + private int groupPort = 3333; + private int groupPrefix = 225; + + /*********************************************************************** + + Setup a Cluster instance. Currently the buffer & writer + are shared for all bulletin serialization; this should + probably change at some point such that we can support + multiple threads broadcasting concurrently to different + output ports. + + ***********************************************************************/ + + this () + { + mBuffer = new Buffer (1024 * 4); + mSocket = new MulticastConduit; + mWriter = new ProtocolWriter (mBuffer); + } + + /*********************************************************************** + + Setup the multicast options. Port is used as the sole + address port for multicast usage, prefix is prepended + to each fabricated multicast address (should be a valid + class-D prefix), and ttl is the number of hops + + ***********************************************************************/ + + final MulticastConduit conduit () + { + return mSocket; + } + + /*********************************************************************** + + Setup the multicast options. Port is used as the sole + address port for multicast usage & prefix is prepended + to each fabricated multicast address (should be a valid + class-D prefix: 225 through 239 inclusive) + + ***********************************************************************/ + + final void multicast (int port, int prefix=225) + { + groupPort = port; + groupPrefix = prefix; + } + + /*********************************************************************** + + Broadcast a message on the specified channel. This uses + IP/Multicast to scatter the payload to all registered + listeners (on the same multicast group). Note that the + maximum message size is limited to that of an Ethernet + data frame, minus the IP/UDP header size (1472 bytes). + + Also note that we are synchronized to avoid contention + on the otherwise shared output buffer. + + ***********************************************************************/ + + final synchronized void broadcast (char[] channel, IMessage message=null) + { + // clear buffer and serialize content + mWriter.put (ProtocolWriter.Command.OK, channel, null, message); + + // Ethernet data-frame size minus the 28 byte UDP/IP header: + if (mBuffer.position > 1472) + throw new ClusterException ("message is too large to broadcast"); + + // send it to the appropriate multicast group + mSocket.write (mBuffer.slice, getGroup (channel)); + } + + /*********************************************************************** + + Return an internet address representing the multicast + group for the specified channel. We use three of the + four address segments to represent the channel itself + (via a hash on the channel name), and set the primary + segment to be that of the broadcast prefix (above). + + ***********************************************************************/ + + final synchronized InternetAddress getGroup (char[] channel) + { + auto p = channel in groups; + if (p) + return *p; + + // construct a group address from the prefix & channel-hash, + // where the hash is folded down to 24 bits + uint hash = jhash (channel.ptr, channel.length); + hash = (hash >> 24) ^ (hash & 0x00ffffff); + + auto address = Integer.toString (groupPrefix) ~ "." ~ + Integer.toString ((hash >> 16) & 0xff) ~ "." ~ + Integer.toString ((hash >> 8) & 0xff) ~ "." ~ + Integer.toString (hash & 0xff); + + // insert InternetAddress into hashmap + auto group = new InternetAddress (address, groupPort); + groups [channel] = group; + return group; + } +} + + +/******************************************************************************* + + A channel represents something akin to a publish/subscribe topic, + or a radio station. These are used to segregate cluster operations + into a set of groups, where each group is represented by a channel. + Channel names are whatever you want then to be: use of dot notation + has proved useful in the past. + + Channel maintain internal state in order to avoid heap activity. So + they should not be shared across threads without appropriate synchs + in place. One remedy is create another channel instance + +*******************************************************************************/ + +private class Channel : IChannel +{ + private char[] name_; + private Buffer buffer; + private ProtocolReader reader; + private ProtocolWriter writer; + private Cluster cluster_; + + /*********************************************************************** + + Construct a channel with the specified name. We cache + a number of session-related constructs here also, in + order to eliminate runtime overhead + + ***********************************************************************/ + + this (Cluster cluster, char[] name) + in { + assert (cluster); + assert (name.length); + } + body + { + name_ = name; + cluster_ = cluster; + + // this buffer will grow as required to house larger messages + buffer = new GrowBuffer (1024 * 2); + writer = new ProtocolWriter (buffer); + + // make the reader slice directly from the buffer content + reader = new ProtocolReader (buffer); + } + + /*********************************************************************** + + Return the name of this channel. This is the name provided + when the channel was constructed. + + ***********************************************************************/ + + final char[] name () + { + return name_; + } + + /*********************************************************************** + + Return the assigned cluster + + ***********************************************************************/ + + final Cluster cluster () + { + return cluster_; + } + + /*********************************************************************** + + Return the assigned logger + + ***********************************************************************/ + + final Logger log () + { + return cluster_.log; + } + + /*********************************************************************** + + Output this channel via the provided IWriter + + ***********************************************************************/ + + final void write (IWriter writer) + { + writer.put (name_); + } + + /*********************************************************************** + + Input this channel via the provided IReader + + ***********************************************************************/ + + final void read (IReader reader) + { + reader.get (name_); + } + + /*********************************************************************** + + deserialize a message into a provided host, or via + the registered instance of the incoming message + + ***********************************************************************/ + + final IMessage thaw (IMessage host = null) + { + return reader.thaw (host); + } + + /*********************************************************************** + + Create a listener of the specified type. Listeners are + run within their own thread, since they spend the vast + majority of their time blocked on a Socket read. Would + be good to support multiplexed reading instead, such + that a thread pool could be applied instead. + + ***********************************************************************/ + + final IConsumer createConsumer (ChannelListener notify) + { + cluster_.log.trace ("creating message consumer for '" ~ name_ ~ "'"); + return new MessageConsumer (this, notify); + } + + /*********************************************************************** + + Create a listener of the specified type. Listeners are + run within their own thread, since they spend the vast + majority of their time blocked on a Socket read. Would + be good to support multiplexed reading instead, such + that a thread pool could be applied instead. + + ***********************************************************************/ + + final IConsumer createBulletinConsumer (ChannelListener notify) + { + cluster_.log.trace ("creating bulletin consumer for '" ~ name_ ~ "'"); + return new BulletinConsumer (this, notify); + } + + /*********************************************************************** + + Return a entry from the network cache, and optionally + remove it. This is a synchronous operation as opposed + to the asynchronous nature of an invalidate broadcast. + + ***********************************************************************/ + + final IMessage getCache (char[] key, bool remove, IMessage host = null) + { + void send (IConduit conduit) + { + buffer.setConduit (conduit); + writer.put (remove ? ProtocolWriter.Command.Remove : + ProtocolWriter.Command.Copy, name_, key).flush; + } + + if (cluster_.cache.request (&send, reader, key)) + return reader.thaw (host); + return null; + } + + /*********************************************************************** + + Place an entry into the network cache, replacing the + entry with the identical key. Where message.time is + set, it will be used to test for newer cache entries + than the one being sent i.e. if someone else placed + a newer entry into the cache, that one will remain. + + Note that this may cause the oldest entry in the cache + to be displaced if the cache is already full. + + ***********************************************************************/ + + final bool putCache (char[] key, IMessage message) + { + void send (IConduit conduit) + { + buffer.setConduit (conduit); + writer.put (ProtocolWriter.Command.Add, name_, key, message).flush; + } + + // return false if the cache server said there's + // already something newer + if (cluster_.cache.request (&send, reader, key)) + return false; + return true; + } + + /*********************************************************************** + + Load a network cache entry remotely. This sends the given + IMessage over a network to the cache host, where it will + be executed locally. The benefit of doing so it that the + host may deny access to the cache entry for the duration + of the load operation. This, in turn, provides a mechanism + for gating/synchronizing multiple network clients over a + given cache entry; quite handy for those entries that are + relatively expensive to construct or access. + + ***********************************************************************/ + + final bool loadCache (char[] key, IMessage message) + { + void send (IConduit conduit) + { + buffer.setConduit (conduit); + writer.put (ProtocolWriter.Command.Load, name_, key, message).flush; + } + + return cluster_.cache.request (&send, reader, key); + } + + /*********************************************************************** + + Query the cluster for queued entries on the corresponding + channel. Returns, and removes, the first matching entry + from the cluster. Note that this sweeps the cluster for + matching entries, and is synchronous in nature. The more + common approach is to setup a queue listener, which will + grab and dispatch queue entries asynchronously. + + ***********************************************************************/ + + final IMessage getQueue (IMessage host = null) + { + if (scanQueue) + return reader.thaw (host); + return null; + } + + /*********************************************************************** + + Query the cluster for queued entries on the corresponding + channel. Returns, and removes, the first matching entry + from the cluster. Note that this sweeps the cluster for + matching entries, and is synchronous in nature. The more + common approach is to setup a queue listener, which will + grab and dispatch queue entries asynchronously. + + ***********************************************************************/ + + private bool scanQueue () + { + void send (IConduit conduit) + { + buffer.setConduit (conduit); + writer.put (ProtocolWriter.Command.RemoveQueue, name_).flush; + } + + bool scan (Node node) + { + bool message; + node.request (&send, reader, message); + return message; + } + + // make a pass over each Node, looking for channel entries + return cluster_.queue.scan (&scan); + } + + /*********************************************************************** + + Add an entry to the specified network queue. May throw a + QueueFullException if there's no room available. + + ***********************************************************************/ + + final IMessage putQueue (IMessage message) + { + void send (IConduit conduit) + { + buffer.setConduit (conduit); + writer.put (ProtocolWriter.Command.AddQueue, name_, null, message).flush; + } + + cluster_.queue.request (&send, reader); + return message; + } + + /*********************************************************************** + + Send a remote call request to a server, and place the result + back into the provided message + + ***********************************************************************/ + + final bool execute (IMessage message) + { + void send (IConduit conduit) + { + buffer.setConduit (conduit); + writer.put (ProtocolWriter.Command.Call, name_, null, message).flush; + } + + if (cluster_.task.request (&send, reader)) + { + // place result back into the provided message + reader.thaw (message); + return true; + } + return false; + } + + /*********************************************************************** + + Broadcast a message on the specified channel. This uses + IP/Multicast to scatter the message to all registered + listeners (on the same multicast group). Note that the + maximum message size is limited to that of an Ethernet + data frame, minus the IP/UDP header size (1472 bytes). + + ***********************************************************************/ + + final void broadcast (IMessage message = null) + { + cluster_.broadcast (name_, message); + } +} + + +/******************************************************************************* + + A listener for multicast channel traffic. These are currently used + for cache coherency, queue publishing, and node discovery activity; + though could be used for direct messaging also. + + Be careful when using the retained channel, since it is shared with + the calling thread. Thus a race condition could arise between the + client and this thread, were both to use the channel for transfers + at the same instant. Note that MessageConsumer makes a copy of the + channel for this purpose + +*******************************************************************************/ + +private class BulletinConsumer : SocketListener, IConsumer, IEvent +{ + private bool hasMore; // incoming message? + private Buffer buffer; // input buffer + private ProtocolReader reader; // input decoder + private Channel channel_; // associated channel + private Cluster cluster; // associated cluster + private MulticastConduit consumer; // broadcast listener + private ChannelListener listener; // user-level callback + + /*********************************************************************** + + Construct a multicast consumer for the specified event. The + event handler will be invoked whenever a message arrives for + the associated channel. + + ***********************************************************************/ + + this (Channel channel, ChannelListener listener) + { + this.channel_ = channel; + this.listener = listener; + this.cluster = channel.cluster; + + // buffer doesn't need to be larger than Ethernet data-frame + buffer = new Buffer (1500); + + // make the reader slice directly from the buffer content + reader = new ProtocolReader (buffer); + + // configure a listener socket + consumer = new MulticastConduit (cluster.getGroup (channel_.name), true); + consumer.join; + + super (consumer, buffer); + + // fire up this listener + super.execute; + } + + /*********************************************************************** + + Notification callback invoked when we receive a multicast + packet. Note that we check the packet channel-name against + the one we're consuming, to check for cases where the group + address had a hash collision. + + ***********************************************************************/ + + override void notify (IBuffer buffer) + { + ProtocolWriter.Command cmd; + char[] channel; + char[] element; + + // read the incoming header, along with the object guid + // where available + hasMore = reader.getHeader (cmd, channel, element); + + // check it's really for us first (might be a hash collision) + if (channel == this.channel_.name) + invoke (this); + } + + /*********************************************************************** + + ***********************************************************************/ + + IMessage get (IMessage host = null) + { + if (hasMore) + return reader.thaw (host); + + throw new ClusterException ("attempting to thaw a non-existant message"); + } + + /*********************************************************************** + + Return the assigned logger + + ***********************************************************************/ + + final Logger log () + { + return cluster.log; + } + + /*********************************************************************** + + Handle error conditions from the listener thread. + + ***********************************************************************/ + + override void exception (char [] msg) + { + cluster.log.error ("BulletinConsumer: "~msg); + } + + /*********************************************************************** + + Overridable mean of notifying the client code. + + ***********************************************************************/ + + protected void invoke (IEvent event) + { + listener (event); + } + + /*********************************************************************** + + Return the cluster instance we're associated with. + + ***********************************************************************/ + + final Channel channel () + { + return channel_; + } + + /*********************************************************************** + + Temporarily halt listening. This can be used to ignore + multicast messages while, for example, the consumer is + busy doing other things. + + ***********************************************************************/ + + final void pauseGroup () + { + consumer.leave; + } + + /*********************************************************************** + + Resume listening, post-pause. + + ***********************************************************************/ + + final void resumeGroup () + { + consumer.join; + } + + /*********************************************************************** + + Cancel this consumer. The listener is effectively disabled + from this point forward. The listener thread does not halt + at this point, but waits until the socket-read returns. + Note that the D Interface implementation requires us to + "reimplement and dispatch" trivial things like this ~ it's + a pain in the neck to maintain. + + ***********************************************************************/ + + final void cancel () + { + super.cancel; + } + + /*********************************************************************** + + Send a message back to the producer + + ***********************************************************************/ + + void reply (IChannel channel, IMessage message) + { + assert (channel); + assert (message); + + channel.broadcast (message); + } + + + /*********************************************************************** + + Return an appropriate reply channel for the given message, + or return null if no reply is expected + + ***********************************************************************/ + + IChannel replyChannel (IMessage message) + { + if (message.reply.length) + return cluster.createChannel (message.reply); + return null; + } +} + + +/******************************************************************************* + + A listener for queue events. These events are produced by the + queue host on a periodic bases when it has available entries. + We listen for them (rather than constantly scanning) and then + begin a sweep to process as many as we can. Note that we will + be in competition with other nodes to process these entries. + + Also note that we create a copy of the channel in use, so that + race-conditions with the requesting client are avoided. + +*******************************************************************************/ + +private class MessageConsumer : BulletinConsumer +{ + /*********************************************************************** + + Construct a multicast consumer for the specified event + + ***********************************************************************/ + + this (Channel channel, ChannelListener listener) + { + super (channel, listener); + + // create private channel instance to use in our thread + this.channel_ = new Channel (channel.cluster, channel.name); + } + + /*********************************************************************** + + Handle error conditions from the listener thread. + + ***********************************************************************/ + + override void exception (char [] msg) + { + cluster.log.error ("MessageConsumer: "~msg); + } + + /*********************************************************************** + + Overrides the default processing to sweep the cluster for + queued entries. Each server node is queried until one is + found that contains a message. Note that it is possible + to set things up where we are told exactly which node to + go to; however given that we won't be listening whilst + scanning, and that there's likely to be a group of new + entries in the cluster, it's just as effective to scan. + This will be far from ideal for all environments, so we + should make the strategy pluggable instead. + + Note also that the content is retrieved via a duplicate + channel to avoid potential race-conditions on the original + + ***********************************************************************/ + + override IMessage get (IMessage host = null) + { + if (channel.scanQueue) + return channel.thaw (host); + return null; + } + + /*********************************************************************** + + Send a message back to the producer + + ***********************************************************************/ + + override void reply (IChannel channel, IMessage message) + { + assert (channel); + assert (message); + + channel.putQueue (message); + } + + /*********************************************************************** + + Override the default notification handler in order to + disable multicast reciepts while the application does + what it needs to + + ***********************************************************************/ + + override protected void invoke (IEvent event) + { + // temporarily pause listening while processing + pauseGroup; + try { + listener (event); + } finally resumeGroup; + } +} + + +/******************************************************************************* + + An abstraction of a socket connection. Used internally by the + socket-based Cluster. + +*******************************************************************************/ + +private class Connection +{ + abstract bool reset(); + + abstract void done (Time time); + + abstract SocketConduit conduit (); +} + + +/******************************************************************************* + + A pool of socket connections for accessing cluster nodes. Note + that the entries will timeout after a period of inactivity, and + will subsequently cause a connected host to drop the supporting + session. + +*******************************************************************************/ + +private class ConnectionPool +{ + private Logger log; + private int count; + private bool noDelay; + private InternetAddress address; + private PoolConnection freelist; + private TimeSpan timeout = TimeSpan.seconds(60); + + /*********************************************************************** + + Utility class to provide the basic connection facilities + provided by the connection pool. + + ***********************************************************************/ + + static class PoolConnection : Connection + { + Time time; + PoolConnection next; + ConnectionPool parent; + SocketConduit conduit_; + + /*************************************************************** + + Construct a new connection and set its parent + + ***************************************************************/ + + this (ConnectionPool pool) + { + parent = pool; + reset; + } + + /*************************************************************** + + Create a new socket and connect it to the specified + server. This will cause a dedicated thread to start + on the server. Said thread will quit when an error + occurs. + + ***************************************************************/ + + final bool reset () + { + try { + conduit_ = new SocketConduit; + + // apply Nagle settings + conduit.socket.setNoDelay (parent.noDelay); + + // set a 500ms timeout for read operations + conduit_.setTimeout (TimeSpan.millis(500)); + + // open a connection to this server + // parent.log.trace ("connecting to server"); + conduit_.connect (parent.address); + return true; + + } catch (Object o) + { + if (! Runtime.isHalting) + parent.log.warn ("server is unavailable :: "~o.toString); + } + return false; + } + + /*************************************************************** + + Return the socket belonging to this connection + + ***************************************************************/ + + final SocketConduit conduit () + { + return conduit_; + } + + /*************************************************************** + + Close the socket. This will cause any host session + to be terminated. + + ***************************************************************/ + + final void close () + { + conduit_.detach; + } + + /*************************************************************** + + Return this connection to the free-list. Note that + we have to synchronize on the parent-pool itself. + + ***************************************************************/ + + final void done (Time time) + { + synchronized (parent) + { + next = parent.freelist; + parent.freelist = this; + this.time = time; + } + } + } + + + /*********************************************************************** + + Create a connection-pool for the specified address. + + ***********************************************************************/ + + this (InternetAddress address, Logger log, bool noDelay) + { + this.log = log; + this.address = address; + this.noDelay = noDelay; + } + + /*********************************************************************** + + Allocate a Connection from a list rather than creating a + new one. Reap old entries as we go. + + ***********************************************************************/ + + final synchronized Connection borrow (Time time) + { + if (freelist) + do { + auto c = freelist; + + freelist = c.next; + if (freelist && (time - c.time > timeout)) + c.close; + else + return c; + } while (true); + + return new PoolConnection (this); + } + + /*********************************************************************** + + Close this pool and drop all existing connections. + + ***********************************************************************/ + + final synchronized void close () + { + auto c = freelist; + freelist = null; + while (c) + { + c.close; + c = c.next; + } + } +} + + +/******************************************************************************* + + Class to represent a cluster node. Each node supports both cache + and queue functionality. Note that the set of available nodes is + configured at startup, simplifying the discovery process in some + significant ways, and causing less thrashing of cache-keys. + +*******************************************************************************/ + +private class Node +{ + private Logger log; + private char[] name, + addr; + private ConnectionPool pool; + private bool enabled; + + alias void delegate (IConduit conduit) Requestor; + + /*********************************************************************** + + Construct a node with the provided name. This name should + be the network name of the hosting device. + + ***********************************************************************/ + + this (Logger log, char[] addr, char[] name) + { + this.log = log; + this.addr = addr; + this.name = name ~ ':' ~ addr; + } + + /*********************************************************************** + + Add a cache/queue reference for the remote node + + ***********************************************************************/ + + final void setPool (InternetAddress address, bool noDelay) + { + this.pool = new ConnectionPool (address, log, noDelay); + } + + /*********************************************************************** + + Return the name of this node + + ***********************************************************************/ + + override char[] toString () + { + return name; + } + + /*********************************************************************** + + Return the network address of this node + + ***********************************************************************/ + + final char[] address () + { + return addr; + } + + /*********************************************************************** + + Remove this Node from the cluster. The node is disabled + until it is seen to recover. + + ***********************************************************************/ + + final void fail () + { + setEnabled (false); + pool.close; + } + + /*********************************************************************** + + Get the current state of this node + + ***********************************************************************/ + + final bool isEnabled () + { + volatile + return enabled; + } + + /*********************************************************************** + + Set the enabled state of this node + + ***********************************************************************/ + + final void setEnabled (bool enabled) + { + if (enabled) + log.trace ("enabling "~name); + else + log.trace ("disabling "~name); + + volatile + this.enabled = enabled; + } + + /*********************************************************************** + + request data; fail this Node if we can't connect. Note + that we make several attempts to connect before writing + the node off as a failure. We use a delegate to perform + the request output since it may be invoked on more than + one iteration, where the current attempt fails. + + We return true if the cluster node responds, and false + otherwise. Exceptions are thrown if they occured on the + server. Parameter 'message' is set true if a message is + available from the server response + + ***********************************************************************/ + + final bool request (Requestor dg, ProtocolReader reader, out bool message) + { + ProtocolWriter.Command cmd; + Time time; + char[] channel; + char[] element; + + // it's possible that the pool may have failed between + // the point of selecting it, and the invocation itself + if (pool is null) + return false; + + // get a connection to the server + auto connect = pool.borrow (time = Clock.now); + + // talk to the server (try a few times if necessary) + for (int attempts=3; attempts--;) + try { + // attach connection to writer and send request + dg (connect.conduit); + + // attach connection to reader + reader.buffer.setConduit (connect.conduit); + + // load the returned object. Don't retry on + // failed reads, since the server is either + // really really busy, or near death. We must + // assume it is offline until it tells us + // otherwise (via a heartbeat) + attempts = 0; + message = reader.getHeader (cmd, channel, element); + + // return borrowed connection + connect.done (time); + + } catch (RegistryException x) + { + connect.done (time); + throw x; + } + catch (IOException x) + { + log.trace ("IOException on server request :: "~x.toString); + + // attempt to reconnect? + if (attempts is 0 || !connect.reset) + { + // that server is offline + fail; + + // state that we failed + return false; + } + } + + // is message an exception? + if (cmd !is ProtocolWriter.Command.OK) + { + // is node full? + if (cmd is ProtocolWriter.Command.Full) + throw new ClusterFullException (channel); + + // did node barf? + if (cmd is ProtocolWriter.Command.Exception) + throw new ClusterException (channel); + + // bogus response + throw new ClusterException ("invalid response from cluster server"); + } + + // ok, our server responded + return true; + } +} + + +/******************************************************************************* + + Models a generic set of cluster nodes. This is intended to be + thread-safe, with no locking on a lookup operation + +*******************************************************************************/ + +private class NodeSet +{ + private Node[char[]] map; + private Logger log; + private Set set; + private bool noDelay; + + /*********************************************************************** + + ***********************************************************************/ + + this (Logger log, bool noDelay) + { + this.log = log; + this.set = new Set; + this.noDelay = noDelay; + } + + /*********************************************************************** + + ***********************************************************************/ + + final Logger logger () + { + return log; + } + + /*********************************************************************** + + Add a node to the list of servers + + ***********************************************************************/ + + synchronized final Node addNode (Node node) + { + auto addr = node.address; + if (addr in map) + throw new ClusterException ("Attempt to add cluster node '"~addr~"' more than once"); + + map[addr] = node; + + // note that this creates a new Set instance. We do this + // so that selectNode() can avoid synchronization + set = set.add (node); + return node; + } + + /*********************************************************************** + + Select a cluster server based on a starting index. If the + selected server is not currently enabled, we just try the + next one. This behaviour should be consistent across each + cluster client. + + ***********************************************************************/ + + final Node selectNode (uint index) + { + auto hosts = set.nodes; + uint count = hosts.length; + + if (count) + { + index %= count; + + while (count--) + { + auto node = hosts [index]; + if (node.isEnabled) + return node; + + if (++index >= hosts.length) + index = 0; + } + } + throw new ClusterEmptyException ("No appropriate cluster nodes are available"); + } + + /*********************************************************************** + + Host class for the set of nodes. We utilize this to enable + atomic read/write where it would not be otherwise possible + -- D arrays are organized as ptr+length pairs and are thus + inherently non-atomic for assignment purposes + + ***********************************************************************/ + + private static class Set + { + Node[] nodes, + random; + + final Set add (Node node) + { + auto s = new Set; + s.nodes = nodes ~ node; + s.randomize; + return s; + } + + private final void randomize () + { + // copy the node list + random = nodes.dup; + + // muddle up the duplicate list. This randomized list + // is used when scanning the cluster for queued entries + foreach (i, n; random) + { + auto j = Random.shared.next (random.length); + auto tmp = random[i]; + random[i] = random[j]; + random[j] = tmp; + } + } + } +} + + +/******************************************************************************* + + Models a fixed set of cluster nodes. Used for Cache + +*******************************************************************************/ + +private class FixedNodeSet : NodeSet +{ + /*********************************************************************** + + ***********************************************************************/ + + this (Logger log, bool noDelay) + { + super (log, noDelay); + } + + /*********************************************************************** + + ***********************************************************************/ + + final synchronized void enable (char[] addr) + { + auto p = addr in map; + if (p) + { + auto node = *p; + if (! node.isEnabled) + { + node.setPool (new InternetAddress(addr), noDelay); + node.setEnabled (true); + } + } + else + // don't throw when no cache hosts have been configured at all + if (set.nodes.length) + throw new ClusterException ("Attempt to enable unregistered cache node '"~addr~"'"); + } + + /*********************************************************************** + + Select a cluster server based on the specified key. If the + selected server is not currently enabled, we just try the + next one. This behaviour should be consistent across each + cluster client. + + ***********************************************************************/ + + final bool request (Node.Requestor dg, ProtocolReader reader, char[] key) + { + Node node; + bool message; + + do { + node = selectNode (jhash (key.ptr, key.length)); + } while (! node.request (dg, reader, message)); + + return message; + } +} + + +/******************************************************************************* + + Models a flexible set of cluster nodes. Used for queue and task + +*******************************************************************************/ + +private class FlexNodeSet : NodeSet +{ + private uint rollover; + + /*********************************************************************** + + ***********************************************************************/ + + this (Logger log, bool noDelay) + { + super (log, noDelay); + } + + /*********************************************************************** + + ***********************************************************************/ + + final synchronized void enable (char[] addr, char[] name) + { + auto p = addr in map; + auto node = p ? *p : addNode (new Node (log, addr, name)); + + if (! node.isEnabled) + { + node.setPool (new InternetAddress(addr), noDelay); + node.setEnabled (true); + } + } + + /*********************************************************************** + + Select a cluster server based on the specified key. If the + selected server is not currently enabled, we just try the + next one. This behaviour should be consistent across each + cluster client. + + ***********************************************************************/ + + final bool request (Node.Requestor dg, ProtocolReader reader) + { + Node node; + bool message; + + do { + node = selectNode (++rollover); + } while (! node.request (dg, reader, message)); + + return message; + } + + /*********************************************************************** + + Sweep the cluster servers. Returns true if the delegate + returns true, false otherwise. The sweep is halted when + the delegate returns true. Note that this scans nodes in + a randomized pattern, which should tend to avoid 'bursty' + activity by a set of clients upon any one cluster server. + + ***********************************************************************/ + + final bool scan (bool delegate(Node) dg) + { + auto hosts = set.random; + auto index = hosts.length; + + while (index) + { + // lookup the randomized set of server nodes + auto node = hosts [--index]; + + // callback on each enabled node + if (node.isEnabled) + if (dg (node)) + return true; + } + return false; + } +} + + +/****************************************************************************** + + The Bob Jenkins lookup2 algorithm. This should be relocated + to somewhere common + +******************************************************************************/ + +private static uint jhash (void* k, uint len, uint init = 0) +{ + uint a = 0x9e3779b9, + b = 0x9e3779b9, + c = init, + i = len; + + // handle most of the key + while (i >= 12) + { + a += *cast(uint*)(k+0); + b += *cast(uint*)(k+4); + c += *cast(uint*)(k+8); + + a -= b; a -= c; a ^= (c>>13); + b -= c; b -= a; b ^= (a<<8); + c -= a; c -= b; c ^= (b>>13); + a -= b; a -= c; a ^= (c>>12); + b -= c; b -= a; b ^= (a<<16); + c -= a; c -= b; c ^= (b>>5); + a -= b; a -= c; a ^= (c>>3); + b -= c; b -= a; b ^= (a<<10); + c -= a; c -= b; c ^= (b>>15); + k += 12; i -= 12; + } + + // handle the last 11 bytes + c += len; + switch (i) + { + case 11: c+=(cast(uint)(cast(ubyte*)k)[10]<<24); + case 10: c+=(cast(uint)(cast(ubyte*)k)[9]<<16); + case 9 : c+=(cast(uint)(cast(ubyte*)k)[8]<<8); + case 8 : b+=(cast(uint)(cast(ubyte*)k)[7]<<24); + case 7 : b+=(cast(uint)(cast(ubyte*)k)[6]<<16); + case 6 : b+=(cast(uint)(cast(ubyte*)k)[5]<<8); + case 5 : b+=(cast(uint)(cast(ubyte*)k)[4]); + case 4 : a+=(cast(uint)(cast(ubyte*)k)[3]<<24); + case 3 : a+=(cast(uint)(cast(ubyte*)k)[2]<<16); + case 2 : a+=(cast(uint)(cast(ubyte*)k)[1]<<8); + case 1 : a+=(cast(uint)(cast(ubyte*)k)[0]); + default: + } + + a -= b; a -= c; a ^= (c>>13); + b -= c; b -= a; b ^= (a<<8); + c -= a; c -= b; c ^= (b>>13); + a -= b; a -= c; a ^= (c>>12); + b -= c; b -= a; b ^= (a<<16); + c -= a; c -= b; c ^= (b>>5); + a -= b; a -= c; a ^= (c>>3); + b -= c; b -= a; b ^= (a<<10); + c -= a; c -= b; c ^= (b>>15); + + return c; +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/tina/ClusterCache.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/tina/ClusterCache.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,134 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: July 2004: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.tina.ClusterCache; + +private import tango.core.Exception; + +private import tango.net.cluster.QueuedCache; + +private import tango.net.cluster.tina.Cluster, + tango.net.cluster.tina.ClusterTypes; + +/****************************************************************************** + + The cache containers. These are initiated by ClusterServer and + maintained via ClusterThread. + +******************************************************************************/ + +class ClusterCache +{ + alias QueuedCache!(char[], ClusterContent) Cache; + + private Cache[char[]] set; + private uint size; + private Cluster cluster; + + /********************************************************************** + + Construct a host for multi-channel cache instances. + + TODO: all cache instances are currently the same size, + and it would be more practical to support some scheme + of specifying distinct sizes. Also, this could likely + benefit from a dedicated slab allocator instead of a + QueuedCache. + + **********************************************************************/ + + this (Cluster cluster, uint size) + { + this.size = size; + if (size < 1 || size > 32 * 1024) + throw new IllegalArgumentException ("cache size should be between 1 and 32K entries"); + } + + /********************************************************************** + + Stuff an entry into cache for the channel:element pair. If + the time value is provided, it will be used to guard against + updating an existing "newer" cache entry. + + Note that the args are aliased, so we copy them as necessary + + **********************************************************************/ + + bool put (char[] channel, char[] element, ClusterContent content, Time time) + { + return lookup(channel).put (element, {return element.dup;}, + {return cast(ClusterContent) content.dup;}, time); + } + + /********************************************************************** + + Remove an entry from the cache + + **********************************************************************/ + + ClusterContent extract (char[] channel, char[] element) + { + return lookup(channel).remove (element); + } + + /********************************************************************** + + Return an entry from the cache + + **********************************************************************/ + + ClusterContent get (char[] channel, char[] element) + { + return lookup(channel).get (element); + } + + /********************************************************************** + + Add a cache lock where the entry is invalid or unlocked. + Returns true if locked by this call, false otherwise. Note + that this will return false if the entry is already locked. + + TODO: implement + + **********************************************************************/ + + bool lock (char[] channel, char[] element, Time time) + { + return true; + } + + /********************************************************************** + + TODO: implement + + **********************************************************************/ + + void unlock (char[] channel, char[] element) + { + } + + /********************************************************************** + + Return a channel-specific cache. Could benefit from a + lock-free hashmap, instread of synching on AA access + + **********************************************************************/ + + private synchronized Cache lookup (char[] channel) + { + if (auto p = channel in set) + return *p; + + return set[channel.dup] = new Cache (size); + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/tina/ClusterQueue.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/tina/ClusterQueue.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,442 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: July 2004: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.tina.ClusterQueue; + +private import tango.core.Thread; + +private import tango.stdc.stdlib : alloca; + +private import tango.net.cluster.tina.Cluster, + tango.net.cluster.tina.QueueFile, + tango.net.cluster.tina.ClusterTypes; + +/****************************************************************************** + +******************************************************************************/ + +class ClusterQueue +{ + private Logger log; + private uint used, + limit; + private double sleep; + private Thread thread; + private Cluster cluster; + + /********************************************************************** + + **********************************************************************/ + + abstract void watchdog (); + + /********************************************************************** + + **********************************************************************/ + + abstract ClusterContent get (char[] name); + + /********************************************************************** + + **********************************************************************/ + + abstract bool put (char[] name, ClusterContent content); + + /********************************************************************** + + **********************************************************************/ + + this (Cluster cluster, uint limit, double sleep) + { + thread = new Thread (&run); + + log = cluster.log; + this.limit = limit; + this.sleep = sleep; + this.cluster = cluster; + + thread.start; + } + + /********************************************************************** + + **********************************************************************/ + + final void publish (IChannel channel) + { + log.info ("publishing queue channel '" ~ channel.name ~ "'"); + channel.broadcast; + } + + /********************************************************************** + + **********************************************************************/ + + private void run () + { + while (true) + { + Thread.sleep (sleep); + + try { + watchdog; + } catch (Object x) + log.error ("queue-publisher: "~x.toString); + } + } +} + + + +/****************************************************************************** + + +******************************************************************************/ + +class PersistQueue : ClusterQueue +{ + private QueueFile[char[]] queueSet; + private QueueFile[] queueList; + + /********************************************************************** + + **********************************************************************/ + + this (Cluster cluster, uint limit, double sleep) + { + super (cluster, limit, sleep); + } + + /********************************************************************** + + **********************************************************************/ + + final synchronized QueueFile lookup (char[] name) + { + auto p = name in queueSet; + if (p is null) + { + // name is currently a reference only; copy it + name = name.dup; + + log.trace ("creating new queue for channel '" ~ name ~ "'"); + + // place new ChannelQueue into the list + auto queue = new QueueFile (log, cluster.createChannel(name), limit); + queueSet[name] = queue; + queueList ~= queue; + return queue; + } + + return *p; + } + + /********************************************************************** + + **********************************************************************/ + + final bool put (char[] name, ClusterContent content) + { + // stuff content into the appropriate queue + auto queue = lookup (name); + auto ret = queue.push (content); + + // notify immediately if we just transitioned from 0 + if (ret && queue.size is 1) + publish (queue.channel); + + return ret; + } + + /********************************************************************** + + **********************************************************************/ + + final ClusterContent get (char[] name) + { + return cast(ClusterContent) lookup(name).pop; + } + + /********************************************************************** + + Workaround for a compiler bug in 0.018 + + **********************************************************************/ + + private final synchronized void copy (QueueFile[] dst, QueueFile[] src) + { + dst[] = src; + } + + /********************************************************************** + + **********************************************************************/ + + final void watchdog () + { + auto len = queueList.length; + auto list = (cast(QueueFile*) alloca(len * QueueFile.sizeof))[0..len]; + + // clone the list of queues to avoid stalling everything + copy (list, queueList); + + // synchronized (this) + // list[] = queueList; + + foreach (q; list) + { + if (q.size) + publish (q.channel); + + if (q.isDirty) + { + q.flush; + log.info ("flushed "~q.channel.name~" to disk"); + } + } + } +} + + +/+ + +/****************************************************************************** + +******************************************************************************/ + +class MemoryQueue : ClusterQueue +{ + private HashMap queueSet; + + /********************************************************************** + + **********************************************************************/ + + this (Cluster cluster, uint limit, Interval sleep) + { + queueSet = new HashMap (256); + super (cluster, limit, sleep); + } + + /********************************************************************** + + **********************************************************************/ + + final ChannelQueue lookup (char[] channel) + { + return cast(ChannelQueue) queueSet.get (channel); + } + + /********************************************************************** + + **********************************************************************/ + + bool put (char[] name, ClusterContent content) + { + if ((used + content.length) < limit) + { + // select the appropriate queue + auto queue = lookup (name); + if (queue is null) + { + // name is currently a reference only; copy it + name = name.dup; + + log.trace ("creating new queue for channel '" ~ name ~ "'"); + + // place new ChannelQueue into the list + queueSet.put (name, queue = new ChannelQueue (cluster.createChannel (name))); + } + + queue.put (cast (ClusterContent) content.dup); + used += content.length; + return true; + } + return false; + } + + /********************************************************************** + + **********************************************************************/ + + synchronized ClusterContent get (char[] name) + { + ClusterContent ret = null; + auto queue = lookup (name); + + if (queue) + { + ret = queue.get; + used -= ret.length; + } + return ret; + } + + /********************************************************************** + + **********************************************************************/ + + void watchdog () + { + foreach (char[] k, Object o; queueSet) + { + auto q = cast(ChannelQueue) o; + if (q.count) + publish (q.channel); + } + } +} + + +/****************************************************************************** + +******************************************************************************/ + +private class ChannelQueue +{ + private Link head, // head of the Queue + tail; // tail of the Queue + private int count; // number of items present + IChannel channel; // Queue channel + + /********************************************************************** + + **********************************************************************/ + + private static class Link + { + Link prev, + next; + ClusterContent data; + + static Link freeList; + + /************************************************************** + + **************************************************************/ + + Link append (Link after) + { + if (after) + { + next = after.next; + + // patch 'next' to point at me + if (next) + next.prev = this; + + //patch 'after' to point at me + prev = after; + after.next = this; + } + return this; + } + + /************************************************************** + + **************************************************************/ + + Link unlink () + { + // make 'prev' and 'next' entries see each other + if (prev) + prev.next = next; + + if (next) + next.prev = prev; + + // Murphy's law + next = prev = null; + return this; + } + + /************************************************************** + + **************************************************************/ + + Link create () + { + Link l; + + if (freeList) + { + l = freeList; + freeList = l.next; + } + else + l = new Link; + return l; + } + + /************************************************************** + + **************************************************************/ + + void destroy () + { + next = freeList; + freeList = this; + this.data = null; + } + } + + + /********************************************************************** + + **********************************************************************/ + + this (IChannel channel) + { + head = tail = new Link; + this.channel = channel; + } + + /********************************************************************** + + Add the specified content to the queue at the current + tail position, and bump tail to the next Link + + **********************************************************************/ + + void put (ClusterContent content) + { + tail.data = content; + tail = tail.create.append (tail); + ++count; + } + + /********************************************************************** + + Extract from the head, which is the oldest item in the + queue. The removed Link is then appended to the tail, + ready for another put. Head is adjusted to point at the + next valid queue entry. + + **********************************************************************/ + + ClusterContent get () + { + if (head !is tail) + { + auto l = head; + head = head.next; + auto ret = l.data; + l.unlink; + l.destroy; + --count; + return ret; + } + return null; + } +} + ++/ diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/tina/ClusterServer.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/tina/ClusterServer.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,189 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: July 2004: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.tina.ClusterServer; + +private import tango.core.Thread; + +private import tango.util.ArgParser; + +private import tango.net.Socket, + tango.net.InternetAddress; + +private import tango.net.cluster.tina.Cluster, + tango.net.cluster.tina.RollCall; + +private import tango.net.cluster.NetworkRegistry; + +private import tango.net.cluster.tina.util.ServerThread; + +package import tango.net.cluster.tina.util.AbstractServer; + +/****************************************************************************** + + Extends the AbstractServer to glue cluster support together. + +******************************************************************************/ + +abstract class ClusterServer : AbstractServer +{ + package char[] name; + package Cluster cluster; + package IChannel channel; + package RollCall rollcall; + + /********************************************************************** + + Concrete server must expose a service handler + + **********************************************************************/ + + abstract void service (IConduit conduit); + + /********************************************************************** + + Construct this server with the requisite attributes. The + 'bind' address is the local address we'll be listening on, + 'threads' represents the number of socket-accept threads, + and backlog is the number of "simultaneous" connection + requests that a socket layer will buffer on our behalf. + + We also set up a listener for client discovery-requests, + and lastly, we tell active clients that we're available + for work. Clients should be listening on the appropriate + channel for an instance of the RollCall payload. + + **********************************************************************/ + + this (char[] name, InternetAddress bind, Logger logger) + { + this.name = name; + + super (bind, 1, 50, logger); + + // hook into the cluster as a server + cluster = new Cluster (logger); + } + + /********************************************************************** + + **********************************************************************/ + + void enroll (IMessage task) + { + NetworkRegistry.shared.enroll (task); + } + + /********************************************************************** + + Start the server + + Note that we hijack the calling thread, and use it to + generate a hearbeat. The hearbeat has two functions: it + tells all clients when this server starts, and it tells + them we're still alive. The latter is important if, for + example, a client request to this server had timed-out + due to the server being too busy. In such a case, the + client will mark the server as being unavailable, and + the heartbeat will presumably revert that. + + It would also be useful to monitor the GC from here. + + **********************************************************************/ + + void start (RollCall id, bool reuse=false) + { + super.start (reuse); + + // configure an identity for ourselves + id.addr = Socket.hostName ~ ':' ~ localAddress.toPortString; + this.rollcall = id; + + // clients are listening on this channel ... + channel = cluster.createChannel ("cluster.server.advertise"); + + // ... and listen for subsequent server.advertise requests + channel.createBulletinConsumer (¬ify); + + while (true) + { + getLogger.trace ("heartbeat"); + channel.broadcast (rollcall); + Thread.sleep (30.0); + } + } + + /********************************************************************** + + Return a text string identifying this server + + **********************************************************************/ + + char[] getProtocol () + { + return name; + } + + /********************************************************************** + + Return a text string identifying this server + + **********************************************************************/ + + override char[] toString () + { + return "cluster::" ~ name; + } + + /********************************************************************** + + Create a ServerSocket instance. + + **********************************************************************/ + + override ServerSocket createSocket (InternetAddress bind, int backlog, bool reuse=false) + { + return new ServerSocket (bind, backlog, reuse); + } + + /********************************************************************** + + Create a ServerThread instance. This can be overridden to + create other thread-types, perhaps with additional thread- + level data attached. + + **********************************************************************/ + + override void createThread (ServerSocket socket) + { + new ServerThread (this, socket); + } + + /********************************************************************** + + Interface method that's invoked when a client is making + discovery requests. We just send back our identity in a + reply + + **********************************************************************/ + + private void notify (IEvent event) + { + scope input = new RollCall; + event.get (input); + + // if this is a request, reply with our identity + if (input.type is input.Request) + channel.broadcast (rollcall); + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/tina/ClusterTask.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/tina/ClusterTask.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,35 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: July 2004: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.tina.ClusterTask; + +/******************************************************************************* + + +*******************************************************************************/ + +private import tango.core.Thread; + +private import tango.net.cluster.tina.Cluster; + +/******************************************************************************* + + Quick bootstrap for cluster connectivity + +*******************************************************************************/ + +static this () +{ + auto cluster = (new Cluster).join; + Thread.setLocal (0, cast(void*) cluster.createChannel("task")); +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/tina/ClusterThread.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/tina/ClusterThread.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,149 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: July 2004: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.tina.ClusterThread; + +private import tango.core.Thread, + tango.core.Runtime, + tango.core.Exception; + +private import tango.io.Buffer, + tango.io.GrowBuffer, + tango.net.ServerSocket; + +package import tango.io.model.IBuffer, + tango.io.model.IConduit; + +private import tango.text.convert.Sprint; + +package import tango.net.cluster.tina.Cluster, + tango.net.cluster.tina.ProtocolReader, + tango.net.cluster.tina.ProtocolWriter; + +package import tango.net.cluster.tina.util.AbstractServer; + +/****************************************************************************** + + Thread for handling client requests. Note that this remains alive + until the client kills the socket + +******************************************************************************/ + +class ClusterThread +{ + protected IBuffer buffer; + protected ProtocolReader reader; + protected ProtocolWriter writer; + protected Logger logger; + protected char[] client; + protected Thread thread; + protected Sprint!(char) sprint; + protected Cluster cluster; + protected IConduit conduit; + + /********************************************************************** + + request handler + + **********************************************************************/ + + abstract void dispatch (); + + /********************************************************************** + + Note that the conduit stays open until the client kills it. + Also note that we use a GrowableBuffer here, which expands + as necessary to contain larger payloads. + + **********************************************************************/ + + this (AbstractServer server, IConduit conduit, Cluster cluster) + { + buffer = new GrowBuffer (1024 * 8); + buffer.setConduit (conduit); + + // get client infomation + client = server.remoteAddress(conduit).toString; + + // setup cluster protocol-transcoders + writer = new ProtocolWriter (buffer); + reader = new ProtocolReader (buffer); + + // grab a thread to execute within + thread = new Thread (&run); + + // make a formatter for this thread + sprint = new Sprint!(char); + + // save state + logger = server.getLogger; + this.conduit = conduit; + this.cluster = cluster; + } + + /********************************************************************** + + IRunnable method + + **********************************************************************/ + + void execute () + { + thread.start; + } + + /********************************************************************** + + process client requests + + **********************************************************************/ + + private void run () + { + logger.info (sprint ("{} starting service handler", client)); + + try { + while (true) + { + // start with a clear conscience + buffer.clear; + + // wait for something to arrive before we try/catch + buffer.slice (1, false); + + try { + dispatch; + } catch (Object x) + { + logger.error (sprint ("{} cluster request error '{}'", client, x)); + writer.exception (sprint ("cluster request error '{}'", x.toString)); + } + + // send response back to client + buffer.flush; + } + + } catch (IOException x) + if (! Runtime.isHalting) + logger.trace (sprint ("{} cluster socket exception '{}'", client, x)); + + catch (Object x) + logger.fatal (sprint ("{} cluster runtime exception '{}'", client, x)); + + // log our halt status + logger.info (sprint ("{} halting service handler", client)); + + // make sure we close the conduit + conduit.detach; + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/tina/ClusterTypes.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/tina/ClusterTypes.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,24 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: July 2004: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.tina.ClusterTypes; + + +/******************************************************************************* + + typedef for opaque, serialized data. This is stashed away by + some of the servers + +*******************************************************************************/ + +package typedef ubyte[] ClusterContent; + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/tina/CmdParser.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/tina/CmdParser.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,78 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: July 2004: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.tina.CmdParser; + +private import tango.util.ArgParser; + +private import tango.text.convert.Integer; + +private import tango.util.log.Log, + tango.util.log.Configurator; + +/****************************************************************************** + + Extends the ArgParser to support/extract common arguments + +******************************************************************************/ + +class CmdParser : ArgParser +{ + Logger log; + ushort port; + uint size; + bool help; + + /********************************************************************** + + **********************************************************************/ + + this (char[] name) + { + log = Log.getLogger (name); + + // default logging is info, not trace + log.setLevel (log.Level.Info); + } + + /********************************************************************** + + **********************************************************************/ + + void parse (char[][] args) + { + static char[] strip (char[] value) + { + if (value.length && (value[0] is '=' || value [0] is ':')) + value = value[1..$]; + return value; + } + + static int toInt (char[] value) + { + return atoi (strip(value)); + } + + bind ("-", "h", {help = true;}); + + bind ("-", "log", delegate (char[] value) + {log.setLevel(Log.level(strip(value)));}); + + bind ("-", "port", delegate (char[] value) + {port = cast(ushort) toInt (value);}); + + bind ("-", "size", delegate (char[] value) + {size = toInt (value);}); + + super.parse (args); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/tina/ProtocolReader.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/tina/ProtocolReader.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,157 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: July 2004: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.tina.ProtocolReader; + +private import tango.io.protocol.Reader, + tango.io.protocol.Allocator, + tango.io.protocol.PickleProtocol; + +private import tango.net.cluster.model.IMessage; + +private import tango.net.cluster.NetworkRegistry; + +private import tango.net.cluster.tina.ClusterTypes; + +/******************************************************************************* + + Objects passed around a cluster are prefixed with a header, so the + receiver can pick them apart correctly. This header consists of: + --- + * the packet size, including the header (16 bits) + * a command code (8 bits) + * a version id (8 bits) + * a timestamp (64 bits) + * length of the channel name (32 bits) + * the channel name + * length of the key (32 bits) + * the key + * an optional payload (an IMessage instance) + --- + + Everything is written in Network order (big endian). + +*******************************************************************************/ + +class ProtocolReader : Reader +{ + /*********************************************************************** + + Construct a ProtocolReader upon the given buffer. As + Objects are serialized their content is written to this + buffer. The buffer content is then typically flushed to + some external conduit, such as a file or socket. + + Note that arrays (such as text) are *always* sliced from + the buffer -- there's no heap activity involved. Thus it + may be necessary to .dup content where appropriate + + ***********************************************************************/ + + this (IBuffer buffer) + { + super (new BufferSlice (new PickleProtocol (buffer))); + } + + /*********************************************************************** + + deserialize a payload into a provided host, or via + the registered instance of the incoming payload + + ***********************************************************************/ + + IMessage thaw (IMessage host = null) + { + return thaw (NetworkRegistry.shared, host); + } + + /*********************************************************************** + + deserialize a payload into a provided host, or via + the registered instance of the incoming payload + + ***********************************************************************/ + + IMessage thaw (NetworkRegistry registry, IMessage host = null) + { + return registry.thaw (this, host); + } + + /*********************************************************************** + + Read the protocol header and return true if there's a + payload available + + ***********************************************************************/ + + bool getHeader (inout ubyte cmd, inout char[] channel, inout char[] element) + { + auto position = buffer.position; + + long time; + ushort size; + ubyte versn; + + get (size) (cmd) (versn) (time); + + // avoid allocation for these two strings + get (channel) (element); + + // is there a payload attached? + if (size > (buffer.position - position)) + return true; + + return false; + } + + /*********************************************************************** + + Return an aliased slice of the buffer representing the + recieved payload. This is a bit of a hack, but eliminates + a reasonable amount of overhead. Note that the channel/key + text is retained right at the start of the returned content, + enabling the host to toss the whole thing back without any + further munging. + + ***********************************************************************/ + + ClusterContent getPacket (inout ubyte cmd, inout char[] channel, inout char[] element, inout long time) + { + ushort size; + ubyte versn; + + // load up the header + get (size) (cmd) (versn) (time); + + //printf ("size: %d\n", cast(int) size); + + // subtract header size + size -= buffer.position; + + // may throw an exception if the payload is too large to fit + // completely inside the buffer! + buffer.slice (size, false); + + // slice the remaining packet (with channel/key text) + auto content = cast(ClusterContent) buffer.slice; + + // get a slice upon the channel name + get (channel); + + // get a slice upon the element name + get (element); + + // return the aliased payload (including channel/key text) + return content; + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/tina/ProtocolWriter.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/tina/ProtocolWriter.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,199 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: July 2004: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.tina.ProtocolWriter; + +private import tango.io.protocol.Writer, + tango.io.protocol.PickleProtocol; + +private import tango.net.cluster.model.IMessage; + +private import tango.net.cluster.NetworkRegistry; + +private import tango.net.cluster.tina.ClusterTypes; + +/******************************************************************************* + + Objects passed around a cluster are prefixed with a header, so the + receiver can pick them apart correctly. This header consists of: + --- + * the packet size, including the header (16 bits) + * a command code (8 bits) + * a version id (8 bits) + * a timestamp (64 bits) + * length of the channel name (32 bits) + * the channel name + * length of the key (32 bits) + * the key + * an optional payload (an IMessage instance) + --- + + Everything is written in Network order (big endian) + +*******************************************************************************/ + +class ProtocolWriter +{ + private Writer emit; + package IBuffer buffer; + + const ubyte Version = 0x01; + + /*********************************************************************** + + protocol commands + + ***********************************************************************/ + + enum Command : ubyte + { + OK, + Exception, + Full, + Locked, + Add, + Copy, + Remove, + Load, + AddQueue, + RemoveQueue, + Call + } + + /*********************************************************************** + + Construct a ProtocolWriter upon the given buffer. As + Objects are serialized, their content is written to this + buffer. The buffer content is then typically flushed to + some external conduit, such as a file or socket. + + Note that serialized data is always in Network order. + + ***********************************************************************/ + + this (IBuffer buffer) + { + assert (buffer); + emit = new Writer (new PickleProtocol(this.buffer = buffer)); + } + + /*********************************************************************** + + Stuff the request into our output buffer. Note that this + protocol is prefixed by a 'size' value, requiring that + all messages can be contained within the buffer. This is + not considered a serious limitation, as the messages are + not intended to be "large" given that they're traversing + the network. + + ***********************************************************************/ + + ProtocolWriter put (Command cmd, char[] channel, char[] element = null, IMessage msg = null) + { + auto time = (msg ? msg.time : Time.init); + + // reset the buffer first! + buffer.clear; + + auto content = cast(ubyte[]) buffer.getContent; + emit (cast(ushort) 0) + (cast(ubyte) cmd) + (cast(ubyte) Version) + (cast(ulong) time.ticks) + (channel) + (element); + + // is there a payload? + if (msg) + NetworkRegistry.shared.freeze (emit, msg); + + // go back and write the total number of bytes + auto size = buffer.limit; + content[0] = cast(ubyte) (size >> 8); + content[1] = cast(ubyte) (size & 0xff); + return this; + } + + /*********************************************************************** + + Emit a ClusterContent constructed by ProtocolReader.getPacket + + ***********************************************************************/ + + ProtocolWriter reply (ClusterContent content) + { + uint empty = 0; + + // reset the buffer first + buffer.clear; + + // write the length, the ack, version, and timestamp + emit (cast(ushort) (content.length + ushort.sizeof + ubyte.sizeof + ubyte.sizeof + ulong.sizeof)) + (cast(ubyte) ProtocolWriter.Command.OK) + (cast(ubyte) Version) + (cast(ulong) ulong.init); + + // and the payload (which includes both channel & element) + if (content.length) + buffer.append (content); + else + // or filler for an empty channel & element ... + emit (empty) (empty); + + return this; + } + + /*********************************************************************** + + Write an exception message + + ***********************************************************************/ + + ProtocolWriter exception (char[] message) + { + return put (ProtocolWriter.Command.Exception, message); + } + + /*********************************************************************** + + Write an "OK" confirmation + + ***********************************************************************/ + + ProtocolWriter success (char[] message = null) + { + return put (ProtocolWriter.Command.OK, message); + } + + /*********************************************************************** + + Indicate something has filled up + + ***********************************************************************/ + + ProtocolWriter full (char[] message) + { + return put (ProtocolWriter.Command.Full, message); + } + + /*********************************************************************** + + Flush the output + + ***********************************************************************/ + + void flush () + { + emit.flush; + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/tina/QueueFile.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/tina/QueueFile.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,389 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: July 2004: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.tina.QueueFile; + +private import tango.io.FilePath, + tango.io.FileConduit; + +private import tango.util.log.Logger; + +private import tango.text.convert.Sprint; + +private import tango.net.cluster.model.IChannel; + +version (Posix) + private import tango.stdc.posix.fcntl; + +/****************************************************************************** + + +******************************************************************************/ + +class QueueFile +{ + struct Header // 16 bytes + { + uint size, // size of the current chunk + prior; // size of the prior chunk + ushort check; // simpe header checksum + ubyte pad; // how much padding applied? + byte[5] unused; // future use + } + + private Logger log; // logging target + private bool dirty; // is queue dirty? + private uint limit, // max file size + depth, // stack depth + insert; // file insert position + private void[] buffer; // read buffer + private Sprint!(char) sprint; // formatting buffer + private Header current; // top-of-stack info + private FileConduit conduit; // the file itself + private IChannel channel_; // the channel we're using + + /********************************************************************** + + **********************************************************************/ + + this (Logger log, IChannel channel, uint max, uint min=1024*1024) + { + this (log, channel.name~".queue", max, min); + channel_ = channel; + } + + /********************************************************************** + + **********************************************************************/ + + this (Logger log, char[] name, uint max, uint min=1024*1024) + { + Header tmp; + + this.log = log; + limit = max; + sprint = new Sprint!(char); + buffer = new void [1024 * 8]; + conduit = new FileConduit (name, FileConduit.ReadWriteOpen); + + // lock the file on Posix, since it has no O/S file locks + version (Posix) + { + flock f; + f.l_type = F_WRLCK; + f.l_start = f.l_len = f.l_whence = 0; + if (fcntl (conduit.fileHandle, F_SETLK, &f) is -1) + { + log.error (sprint("failed to lock queue file '{}'; it may already be in use", name)); + conduit.error; + } + } + + auto length = conduit.path.fileSize; + if (length is 0) + { + // make some space in the file + min = (min + buffer.length - 1) / buffer.length; + log.trace (sprint("initializing queue '{}' to {} KB", name, (min * buffer.length)/1024)); + + while (min-- > 0) + write (buffer.ptr, buffer.length); + conduit.seek (0); + } + else + { + // sweep the file and truncate on inconsistencies + while (insert < length) + { + // get a header + read (&tmp, tmp.sizeof); + + // end of queue? + if (tmp.size) + { + // a corrupted header? + if (checksum(tmp) != tmp.check) + { + log.warn (sprint("invalid header located in queue '{}'; truncating", name)); + break; + } + + // corrupted content? + auto content = read (tmp); + + ++depth; + current = tmp; + insert = insert + tmp.size + tmp.sizeof; + conduit.seek (insert); + + debug + log.trace (sprint("open: depth {}, prior {}, size {}, insert {}", + depth, tmp.prior, tmp.size, insert)); + } + else + break; + } + + // leave file position at insert point + conduit.seek (insert); + } + } + + /********************************************************************** + + **********************************************************************/ + + final void close () + { + if (conduit) + conduit.detach; + conduit = null; + } + + /********************************************************************** + + **********************************************************************/ + + final uint size () + { + return depth; + } + + /********************************************************************** + + **********************************************************************/ + + final IChannel channel () + { + return channel_; + } + + /********************************************************************** + + **********************************************************************/ + + final bool isDirty () + { + return dirty; + } + + /********************************************************************** + + **********************************************************************/ + + final synchronized void flush () + { + //conduit.commit; + dirty = false; + } + + /********************************************************************** + + **********************************************************************/ + + final synchronized bool push (void[] data) + { + //assert (insert is conduit.position); + + if (data.length is 0) + conduit.error ("invalid zero length content"); + + // check for overflow + if (insert > limit) + return false; + + Header chunk = void; + + // pad the output to 4 byte boundary, so + // that each header is aligned + chunk.prior = current.size; + chunk.size = ((data.length + 3) / 4) * 4; + chunk.pad = cast(ubyte) (chunk.size - data.length); + chunk.check = checksum (chunk); + + debug + log.trace (sprint("push: data {}, prior {}, size {}, insert {}, filepos {}", + data.length, chunk.prior, chunk.size, insert, conduit.position)); + + // write msg header and content + write (&chunk, chunk.sizeof); + write (data.ptr, chunk.size); + + // update refs + insert = insert + chunk.sizeof + chunk.size; + current = chunk; + ++depth; + + return dirty = true; + } + + /********************************************************************** + + **********************************************************************/ + + final synchronized void[] pop () + { + //assert (insert is conduit.position); + + Header tmp = void; + + if (depth) + { + // locate the current header + auto point = insert - (current.size + tmp.sizeof); + conduit.seek (point); + + // write a zero header to indicate eof + Header zero; + write (&zero, zero.sizeof); + + // read the current record + auto content = read (current, current.pad); + + // content before us? + if (depth > 1) + { + auto prior = point - (current.prior + tmp.sizeof); + conduit.seek (prior); + read (¤t, current.sizeof); + } + else + if (current.prior) + conduit.error ("queue file is corrupt"); + else + current = zero; + + // leave file position at insert-point + conduit.seek (point); + insert = point; + if (--depth is 0 && insert > 0) + conduit.error ("queue file is corrupt"); + return content; + } + return null; + } + + /********************************************************************** + + **********************************************************************/ + + private final void[] read (inout Header hdr, uint pad=0) + { + auto len = hdr.size - pad; + + // make buffer big enough + if (buffer.length < len) + buffer.length = len; + + read (buffer.ptr, len); + return buffer [0 .. len]; + } + + /********************************************************************** + + **********************************************************************/ + + private final void read (void* data, uint len) + { + auto input = conduit.input; + + for (uint i; len > 0; len -= i, data += i) + if ((i = input.read (data[0..len])) is conduit.Eof) + conduit.error ("QueueFile.read :: Eof while reading"); + } + + /********************************************************************** + + **********************************************************************/ + + private final void write (void* data, uint len) + { + auto output = conduit.output; + + for (uint i; len > 0; len -= i, data += i) + if ((i = output.write (data[0..len])) is conduit.Eof) + conduit.error ("QueueFile.write :: Eof while writing"); + } + + /********************************************************************** + + **********************************************************************/ + + private static ushort checksum (inout Header hdr) + { + uint i = hdr.pad; + i = i ^ hdr.size ^ (hdr.size >> 16); + i = i ^ hdr.prior ^ (hdr.prior >> 16); + return cast(ushort) i; + } +} + + +/****************************************************************************** + + +******************************************************************************/ + +version (QueueFile) +{ + import tango.time.StopWatch; + + import tango.util.log.Log, + tango.util.log.Configurator; + + void main (char[][] args) + { + auto log = Log.getLogger("queue.persist").setLevel(Logger.Level.Info); + + auto z = new QueueFile (log, "foo.bar", 30 * 1024 * 1024); + pushTimer (z); + z.close; + } + + void pushTimer (QueueFile z) + { + StopWatch w; + char[200] test; + + popAll(z); + w.start; + for (int i=10_000; i--;) + z.push(test); + z.log.info (z.sprint("{} push/s", 10_000/w.stop)); + popAll(z); + } + + void push (QueueFile z) + { + z.push ("one"); + z.push ("two"); + z.push ("three"); + z.push ("four"); + z.push ("five"); + z.push ("six"); + z.push ("seven"); + z.push ("eight"); + z.push ("nine"); + z.push ("ten"); + z.push ("eleven"); + } + + void popAll(QueueFile z) + { + uint i; + StopWatch w; + + w.start; + while (z.pop !is null) ++i; + z.log.info (z.sprint("{}, {} pop/s",i, i/w.stop)); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/tina/QueueServer.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/tina/QueueServer.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,93 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: July 2004: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.tina.QueueServer; + +private import tango.net.cluster.tina.RollCall, + tango.net.cluster.tina.QueueThread, + tango.net.cluster.tina.ClusterQueue, + tango.net.cluster.tina.ClusterServer; + +/****************************************************************************** + + Extends the ClusterServer to glue cluster-cache support together. + +******************************************************************************/ + +class QueueServer : ClusterServer +{ + private ClusterQueue queue; + + /********************************************************************** + + Construct this server with the requisite attributes. The + 'bind' address is the local address we'll be listening on + + **********************************************************************/ + + this (InternetAddress bind, Logger logger) + { + super ("queue", bind, logger); + + // create a queue instance + // queue = new MemoryQueue (cluster, 64 * 1024 * 1024, 1.0); + queue = new PersistQueue (cluster, 64 * 1024 * 1024, 3.0); + + } + + /********************************************************************** + + Start the server + + **********************************************************************/ + + void start (bool reuse=false) + { + super.start (new RollCall(RollCall.Queue), reuse); + } + + /********************************************************************** + + Factory method for servicing a request. We just create + a new QueueThread to handle requests from the client. + The thread does not exit until the socket connection is + broken by the client, or some other exception occurs. + + **********************************************************************/ + + override void service (IConduit conduit) + { + (new QueueThread (this, conduit, cluster, queue)).execute; + } +} + + + +version (QueueServer) +{ + import tango.io.Console; + + import tango.net.cluster.tina.CmdParser; + + void main (char[][] args) + { + auto arg = new CmdParser ("queue.server"); + + if (args.length > 1) + arg.parse (args[1..$]); + + if (arg.help) + Cout ("usage: queueserver -port=number -log[=trace, info, warn, error, fatal, none]").newline; + else + (new QueueServer(new InternetAddress(arg.port), arg.log)).start; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/tina/QueueThread.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/tina/QueueThread.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,80 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: July 2004: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.tina.QueueThread; + +private import tango.core.Exception; + +private import tango.net.cluster.tina.ClusterQueue, + tango.net.cluster.tina.ClusterTypes, + tango.net.cluster.tina.ClusterThread; + +/****************************************************************************** + + Thread for handling queue requests. + +******************************************************************************/ + +class QueueThread : ClusterThread +{ + private ClusterQueue queue; + + /********************************************************************** + + Note that the conduit stays open until the client kills it + + **********************************************************************/ + + this (AbstractServer server, IConduit conduit, Cluster cluster, ClusterQueue queue) + { + super (server, conduit, cluster); + this.queue = queue; + } + + /********************************************************************** + + process client requests + + **********************************************************************/ + + void dispatch () + { + ProtocolWriter.Command cmd; + long time; + char[] channel; + char[] element; + + // wait for request to arrive + auto content = reader.getPacket (cmd, channel, element, time); + + switch (cmd) + { + case ProtocolWriter.Command.AddQueue: + logger.trace (sprint ("{} add queue entry on channel '{}'", client, channel)); + + if (queue.put (channel, content)) + writer.success; + else + writer.full ("cluster queue is full"); + break; + + case ProtocolWriter.Command.RemoveQueue: + logger.trace (sprint ("{} remove queue entry on channel '{}'", client, channel)); + + writer.reply (queue.get (channel)); + break; + + default: + throw new IllegalArgumentException ("invalid command"); + } + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/tina/RollCall.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/tina/RollCall.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,85 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: July 2004: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.tina.RollCall; + +private import tango.net.cluster.NetworkMessage; + +/****************************************************************************** + + An IMessage used by the cluster client and server during discovery + lookup and liveness broadcasts. The client broadcasts one of these + at startup to see which servers are alive. The server responds with + a reply RollCall stating its name and port. The server will also + broadcast one of these when it first starts, such that any running + clients can tell the server has 'recovered'. + + Requests and responses are distinguished by the content of the msg: + a type value of Request indicates a request from a client and other + values are considered to be responses from servers. + +******************************************************************************/ + +class RollCall : NetworkMessage +{ + enum {Request, Cache, Queue, Task} + + char[] addr; // server name & port pair + uint type; // request, cache, queue, or task server? + + /********************************************************************** + + A request from a client + + **********************************************************************/ + + this () + { + } + + /********************************************************************** + + Response from a server + + **********************************************************************/ + + this (int type) + { + this.type = type; + } + + /********************************************************************** + + Freeze the content + + **********************************************************************/ + + void read (IReader input) + { + super.read (input); + input (addr) (type); + } + + /********************************************************************** + + Defrost the content + + **********************************************************************/ + + void write (IWriter output) + { + super.write (output); + output (addr) (type); + } +} + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/tina/TaskServer.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/tina/TaskServer.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,85 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: July 2004: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.tina.TaskServer; + +private import tango.net.cluster.tina.RollCall, + tango.net.cluster.tina.TaskThread, + tango.net.cluster.tina.ClusterServer; + +/****************************************************************************** + + Extends the ClusterServer to glue cluster-rpc support together + +******************************************************************************/ + +class TaskServer : ClusterServer +{ + /********************************************************************** + + Construct this server with the requisite attributes. The + 'bind' address is the local address we'll be listening on + + **********************************************************************/ + + this (InternetAddress bind, Logger logger) + { + super ("task", bind, logger); + } + + /********************************************************************** + + Start the server + + **********************************************************************/ + + override void start (bool reuse=false) + { + super.start (new RollCall(RollCall.Task), reuse); + } + + /********************************************************************** + + Factory method for servicing a request. We just create + a new TaskThread to handle requests from the client. + The thread does not exit until the socket connection is + broken by the client, or some other exception occurs. + + **********************************************************************/ + + override void service (IConduit conduit) + { + (new TaskThread (this, conduit, cluster)).execute; + } +} + + + +version (TaskServer) +{ + import tango.io.Console; + + import tango.net.cluster.tina.CmdParser; + + void main (char[][] args) + { + auto arg = new CmdParser ("task.server"); + + if (args.length > 1) + arg.parse (args[1..$]); + + if (arg.help) + Cout ("usage: taskserver -port=number -log[=trace, info, warn, error, fatal, none]").newline; + else + (new TaskServer(new InternetAddress(arg.port), arg.log)).start; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/tina/TaskThread.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/tina/TaskThread.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,84 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: July 2004: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.tina.TaskThread; + +private import tango.core.Exception; + +private import tango.net.cluster.NetworkRegistry; + +private import tango.net.cluster.tina.ClusterThread; + +/****************************************************************************** + + Thread for handling remote-call requests. + +******************************************************************************/ + +class TaskThread : ClusterThread +{ + private NetworkRegistry registry; + + /********************************************************************** + + Note that the conduit stays open until the client kills it + + **********************************************************************/ + + this (AbstractServer server, IConduit conduit, Cluster cluster) + { + super (server, conduit, cluster); + + // clone the registry so that we have our own set of + // message templates to act as hosts. This eliminates + // allocating hosts on the fly + registry = NetworkRegistry.shared.dup; + } + + /********************************************************************** + + process client requests + + **********************************************************************/ + + void dispatch () + { + ProtocolWriter.Command cmd; + char[] channel; + char[] element; + + // wait for request to arrive + if (reader.getHeader (cmd, channel, element)) + { + // convert to a task. Note that we use a private set of + // msg templates, so we don't collide with other threads + auto task = reader.thaw (registry); + + if (task is null) + throw new IllegalArgumentException ("Remote-call instance is not executable"); + + switch (cmd) + { + case ProtocolWriter.Command.Call: + logger.trace (sprint ("{} executing remote call '{}'", client, task.toString)); + task.execute; + + writer.put (ProtocolWriter.Command.OK, channel, element, task); + break; + + default: + throw new IllegalArgumentException ("invalid command"); + } + } + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/tina/util/AbstractServer.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/tina/util/AbstractServer.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,210 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: April 2004 + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.tina.util.AbstractServer; + +private import tango.net.Socket; + +protected import tango.util.log.Log; + +protected import tango.net.ServerSocket, + tango.net.SocketConduit; + +protected import tango.io.model.IConduit; + +protected import tango.text.convert.Sprint; + +protected import tango.net.cluster.tina.util.model.IServer; + +/****************************************************************************** + + Exposes the foundation of a multi-threaded Socket server. This is + subclassed by mango.net.http.server.HttpServer, which itself would + likely be subclassed by a SecureHttpServer. + +******************************************************************************/ + +class AbstractServer : IServer +{ + private InternetAddress bind; + private ServerSocket server; + private Logger logger; + private Sprint!(char) sprint; + private uint threads; + private uint backlog; + + /********************************************************************** + + Setup this server with the requisite attributes. The number + of threads specified dictate exactly that. You might have + anything between 1 thread and several hundred, dependent + upon the underlying O/S and hardware. + + Parameter 'backlog' specifies the max number of"simultaneous" + connection requests to be handled by an underlying socket + implementation. + + **********************************************************************/ + + this (InternetAddress bind, int threads, int backlog, Logger logger) + in { + assert (bind); + assert (logger); + assert (backlog >= 0); + assert (threads > 0 && threads < 256); + } + body + { + this.bind = bind; + this.logger = logger; + this.threads = threads; + this.backlog = backlog; + this.sprint = new Sprint!(char); + } + + /********************************************************************** + + Concrete server must expose a name + + **********************************************************************/ + + protected abstract char[] toString(); + + /********************************************************************** + + Concrete server must expose a ServerSocket factory + + **********************************************************************/ + + protected abstract ServerSocket createSocket (InternetAddress bind, int backlog, bool reuse=false); + + /********************************************************************** + + Concrete server must expose a thread factory + + **********************************************************************/ + + protected abstract void createThread (ServerSocket socket); + + /********************************************************************** + + Concrete server must expose a service handler + + **********************************************************************/ + + abstract void service (IConduit conduit); + + /********************************************************************** + + Provide support for figuring out the remote address + + **********************************************************************/ + + IPv4Address remoteAddress (IConduit conduit) + { + auto tmp = cast(SocketConduit) conduit; + if (tmp) + return cast(IPv4Address) tmp.socket.remoteAddress; + return null; + } + + /********************************************************************** + + Provide support for figuring out the remote address + + **********************************************************************/ + + IPv4Address localAddress () + { + return cast(IPv4Address) server.socket.localAddress; + } + + /********************************************************************** + + Provide support for figuring out the remote address + + **********************************************************************/ + + char[] getRemoteAddress (IConduit conduit) + { + auto addr = remoteAddress (conduit); + + if (addr) + return addr.toAddrString; + return "127.0.0.1"; + } + + /********************************************************************** + + Provide support for figuring out the remote host. Not + currently implemented. + + **********************************************************************/ + + char[] getRemoteHost (IConduit conduit) + { + return null; + } + + /********************************************************************** + + Return the local port we're attached to + + **********************************************************************/ + + int getPort () + { + return localAddress.port; + } + + /********************************************************************** + + Return the local address we're attached to + + **********************************************************************/ + + char[] getHost () + { + return localAddress.toAddrString; + } + + /********************************************************************** + + Return the logger associated with this server + + **********************************************************************/ + + Logger getLogger () + { + return logger; + } + + /********************************************************************** + + Start this server + + **********************************************************************/ + + void start (bool reuse = false) + { + // have the subclass create a ServerSocket for us + server = createSocket (bind, backlog, reuse); + + // instantiate and start all threads + for (auto i=threads; i-- > 0;) + createThread (server); + + // indicate what's going on + logger.info (sprint ("Server {} started on {} with {} accept threads and {} backlogs", + this, localAddress, threads, backlog)); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/tina/util/ServerThread.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/tina/util/ServerThread.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,84 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: April 2004 + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.tina.util.ServerThread; + +private import tango.core.Thread, + tango.core.Runtime, + tango.core.Exception; + +private import tango.net.ServerSocket; + +private import tango.net.cluster.tina.util.AbstractServer; + +/****************************************************************************** + + Subclasses Thread to provide the basic server-thread loop. This + functionality could also be implemented as a delegate, however, + we also wish to subclass in order to add thread-local data (see + HttpThread). + +******************************************************************************/ + +class ServerThread +{ + private AbstractServer server; + private ServerSocket socket; + + /********************************************************************** + + Construct a ServerThread for the given Server, upon the + specified socket + + **********************************************************************/ + + this (AbstractServer server, ServerSocket socket) + { + this.server = server; + this.socket = socket; + (new Thread (&run)).start; + } + + /********************************************************************** + + Execute this thread until the Server says to halt. Each + thread waits in the socket.accept() state, waiting for + a connection request to arrive. Upon selection, a thread + dispatches the request via the request service-handler + and, upon completion, enters the socket.accept() state + once more. + + **********************************************************************/ + + private void run () + { + while (Runtime.isHalting is false) + try { + // wait for a socket connection + auto sc = socket.accept; + + // did we get a valid response? + if (sc) + // yep - process this request + server.service (sc); + else + // server may be halting ... + if (socket.isAlive) + server.getLogger.error ("Socket.accept failed"); + + } catch (IOException x) + server.getLogger.error ("IOException: "~x.toString); + + catch (Object x) + server.getLogger.fatal ("Exception: "~x.toString); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/cluster/tina/util/model/IServer.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/tina/util/model/IServer.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,64 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: April 2004 + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.tina.util.model.IServer; + +private import tango.io.model.IConduit; + +/****************************************************************************** + + Contract to be fulfilled by all Mango servers. + +******************************************************************************/ + +interface IServer +{ + /********************************************************************** + + Provide support for figuring out the remote address + + **********************************************************************/ + + char[] getRemoteAddress (IConduit conduit); + + /********************************************************************** + + Provide support for figuring out the remote host. + + **********************************************************************/ + + char[] getRemoteHost (IConduit conduit); + + /********************************************************************** + + Return the protocol in use. + + **********************************************************************/ + + char[] getProtocol(); + + /********************************************************************** + + Return the local port we're attached to + + **********************************************************************/ + + int getPort(); + + /********************************************************************** + + Return the local address we're attached to + + **********************************************************************/ + + char[] getHost(); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/ftp/FtpClient.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/ftp/FtpClient.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,1922 @@ +/******************************************************************************* + + copyright: Copyright (c) 2006 UWB. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: June 2006 + + author: UWB + +*******************************************************************************/ + +module tango.net.ftp.FtpClient; + +private import tango.net.Socket; + +private import tango.net.ftp.Telnet; + +private import tango.time.Clock; + +private import tango.io.Conduit, + tango.io.GrowBuffer, + tango.io.FileConduit; + +private import tango.time.chrono.Gregorian; + +private import Text = tango.text.Util; + +private import Ascii = tango.text.Ascii; + +private import Regex = tango.text.Regex; + +private import Integer = tango.text.convert.Integer; + +private import Timestamp = tango.text.convert.TimeStamp; + + +/// An FTP progress delegate. +/// +/// You may need to add the restart position to this, and use SIZE to determine +/// percentage completion. This only represents the number of bytes +/// transferred. +/// +/// Params: +/// pos = the current offset into the stream +alias void delegate(in size_t pos) FtpProgress; + +/// The format of data transfer. +enum FtpFormat +{ + /// Indicates ASCII NON PRINT format (line ending conversion to CRLF.) + ascii, + /// Indicates IMAGE format (8 bit binary octets.) + image, +} + +/// A server response, consisting of a code and a potentially multi-line message. +struct FtpResponse +{ + /// The response code. + /// + /// The digits in the response code can be used to determine status + /// programatically. + /// + /// First Digit (status): + /// 1xx = a positive, but preliminary, reply + /// 2xx = a positive reply indicating completion + /// 3xx = a positive reply indicating incomplete status + /// 4xx = a temporary negative reply + /// 5xx = a permanent negative reply + /// + /// Second Digit (subject): + /// x0x = condition based on syntax + /// x1x = informational + /// x2x = connection + /// x3x = authentication/process + /// x5x = file system + char[3] code = "000"; + + /// The message from the server. + /// + /// With some responses, the message may contain parseable information. + /// For example, this is true of the 257 response. + char[] message = null; +} + +/// Active or passive connection mode. +enum FtpConnectionType +{ + /// Active - server connects to client on open port. + active, + /// Passive - server listens for a connection from the client. + passive, +} + +/// Detail about the data connection. +/// +/// This is used to properly send PORT and PASV commands. +struct FtpConnectionDetail +{ + /// The type to be used. + FtpConnectionType type = FtpConnectionType.passive; + + /// The address to give the server. + Address address = null; + + /// The address to actually listen on. + Address listen = null; +} + +/// A supported feature of an FTP server. +struct FtpFeature +{ + /// The command which is supported, e.g. SIZE. + char[] command = null; + /// Parameters for this command; e.g. facts for MLST. + char[] params = null; +} + +/// The type of a file in an FTP listing. +enum FtpFileType +{ + /// An unknown file or type (no type fact.) + unknown, + /// A regular file, or similar. + file, + /// The current directory (e.g. ., but not necessarily.) + cdir, + /// A parent directory (usually "..".) + pdir, + /// Any other type of directory. + dir, + /// Another type of file. Consult the "type" fact. + other, +} + +/// Information about a file in an FTP listing. +struct FtpFileInfo +{ + /// The filename. + char[] name = null; + /// Its type. + FtpFileType type = FtpFileType.unknown; + /// Size in bytes (8 bit octets), or -1 if not available. + long size = -1; + /// Modification time, if available. + Time modify = Time.max; + /// Creation time, if available (not often.) + Time create = Time.max; + /// The file's mime type, if known. + char[] mime = null; + /// An associative array of all facts returned by the server, lowercased. + char[][char[]] facts; +} + +/// A connection to an FTP server. +/// +/// Example: +/// ---------- +/// auto ftp = new FTPConnection("hostname", "user", "pass",21); +/// +/// ftp.mkdir("test"); +/// ftp.close(); +/// ---------- +/// +/// Standards: RFC 959, RFC 2228, RFC 2389, RFC 2428 +/// +/// Bugs: +/// Does not support several uncommon FTP commands and responses. + + +class FTPConnection : Telnet +{ + /// Supported features (if known.) + /// + /// This will be empty if not known, or else contain at least FEAT. + public FtpFeature[] supported_features = null; + + /// Data connection information. + protected FtpConnectionDetail data_info; + + /// The last-set restart position. + /// + /// This is only used when a local file is used for a RETR or STOR. + protected size_t restart_pos = 0; + + /// error handler + protected void exception (char[] msg) + { + throw new FTPException ("Exception: " ~ msg); + } + + /// ditto + protected void exception (FtpResponse r) + { + throw new FTPException (r); + } + + /// Construct an FTPConnection without connecting immediately. + public this() + { + } + + /// Connect to an FTP server with a username and password. + /// + /// Params: + /// hostname = the hostname or IP address to connect to + /// port = the port number to connect to + /// username = username to be sent + /// password = password to be sent, if requested + public this(char[] hostname, char[] username, char[] password, int port = 21) + { + this.connect(hostname, username, password,port); + } + + /// Connect to an FTP server with a username and password. + /// + /// Params: + /// hostname = the hostname or IP address to connect to + /// port = the port number to connect to + /// username = username to be sent + /// password = password to be sent, if requested + public void connect(char[] hostname, char[] username, char[] password, int port = 21) + in + { + // We definitely need a hostname and port. + assert (hostname.length > 0); + assert (port > 0); + } + body + { + // Close any active connection. + + if (this.socket !is null) + this.close(); + + + // Connect to whichever FTP server responds first. + this.findAvailableServer(hostname, port); + + this.socket.blocking = false; + + scope (failure) + { + this.close(); + } + + // The welcome message should always be a 220. 120 and 421 are considered errors. + this.readResponse("220"); + + if (username.length == 0) + return; + + // Send the username. Anything but 230, 331, or 332 is basically an error. + this.sendCommand("USER", username); + auto response = this.readResponse(); + + // 331 means username okay, please proceed with password. + if (response.code == "331") + { + this.sendCommand("PASS", password); + response = this.readResponse(); + } + + // We don't support ACCT (332) so we should get a 230 here. + if (response.code != "230" && response.code != "202") + { + + exception (response); + } + + } + + /// Close the connection to the server. + public void close() + { + assert (this.socket !is null); + + // Don't even try to close it if it's not open. + if (this.socket !is null) + { + try + { + this.sendCommand("QUIT"); + this.readResponse("221"); + } + // Ignore if the above could not be completed. + catch (FTPException) + { + } + + // Shutdown the socket... + this.socket.shutdown(SocketShutdown.BOTH); + this.socket.detach(); + + // Clear out everything. + delete this.supported_features; + delete this.socket; + } + } + + /// Set the connection to use passive mode for data tranfers. + /// + /// This is the default. + public void setPassive() + { + this.data_info.type = FtpConnectionType.passive; + + delete this.data_info.address; + delete this.data_info.listen; + } + + /// Set the connection to use active mode for data transfers. + /// + /// This may not work behind firewalls. + /// + /// Params: + /// ip = the ip address to use + /// port = the port to use + /// listen_ip = the ip to listen on, or null for any + /// listen_port = the port to listen on, or 0 for the same port + public void setActive(char[] ip, ushort port, char[] listen_ip = null, ushort listen_port = 0) + in + { + assert (ip.length > 0); + assert (port > 0); + } + body + { + this.data_info.type = FtpConnectionType.active; + this.data_info.address = new IPv4Address(ip, port); + + // A local-side port? + if (listen_port == 0) + listen_port = port; + + // Any specific IP to listen on? + if (listen_ip == null) + this.data_info.listen = new IPv4Address(IPv4Address.ADDR_ANY, listen_port); + else + this.data_info.listen = new IPv4Address(listen_ip, listen_port); + } + + + /// Change to the specified directory. + public void cd(char[] dir) + in + { + assert (dir.length > 0); + } + body + { + this.sendCommand("CWD", dir); + this.readResponse("250"); + } + + /// Change to the parent of this directory. + public void cdup() + { + this.sendCommand("CDUP"); + this.readResponse("200"); + } + + /// Determine the current directory. + /// + /// Returns: the current working directory + public char[] cwd() + { + this.sendCommand("PWD"); + auto response = this.readResponse("257"); + + return this.parse257(response); + } + + /// Change the permissions of a file. + /// + /// This is a popular feature of most FTP servers, but not explicitly outlined + /// in the spec. It does not work on, for example, Windows servers. + /// + /// Params: + /// path = the path to the file to chmod + /// mode = the desired mode; expected in octal (0777, 0644, etc.) + public void chmod(char[] path, int mode) + in + { + assert (path.length > 0); + assert (mode >= 0 && (mode >> 16) == 0); + } + body + { + char[] tmp = "000"; + // Convert our octal parameter to a string. + Integer.format(tmp, cast(long) mode, Integer.Style.Octal); + this.sendCommand("SITE CHMOD", tmp, path); + this.readResponse("200"); + } + + /// Remove a file or directory. + /// + /// Params: + /// path = the path to the file or directory to delete + public void del(char[] path) + in + { + assert (path.length > 0); + } + body + { + this.sendCommand("DELE", path); + auto response = this.readResponse(); + + // Try it as a directory, then...? + if (response.code != "250") + this.rm(path); + } + + /// Remove a directory. + /// + /// Params: + /// path = the directory to delete + public void rm(char[] path) + in + { + assert (path.length > 0); + } + body + { + this.sendCommand("RMD", path); + this.readResponse("250"); + } + + /// Rename/move a file or directory. + /// + /// Params: + /// old_path = the current path to the file + /// new_path = the new desired path + public void rename(char[] old_path, char[] new_path) + in + { + assert (old_path.length > 0); + assert (new_path.length > 0); + } + body + { + // Rename from... rename to. Pretty simple. + this.sendCommand("RNFR", old_path); + this.readResponse("350"); + + this.sendCommand("RNTO", new_path); + this.readResponse("250"); + } + + /// Determine the size in bytes of a file. + /// + /// This size is dependent on the current type (ASCII or IMAGE.) + /// + /// Params: + /// path = the file to retrieve the size of + /// format = what format the size is desired in + public size_t size(char[] path, FtpFormat format = FtpFormat.image) + in + { + assert (path.length > 0); + } + body + { + this.type(format); + + this.sendCommand("SIZE", path); + auto response = this.readResponse("213"); + + // Only try to parse the numeric bytes of the response. + size_t end_pos = 0; + while (end_pos < response.message.length) + { + if (response.message[end_pos] < '0' || response.message[end_pos] > '9') + break; + end_pos++; + } + + return toInt(response.message[0 .. end_pos]); + } + + /// Send a command and process the data socket. + /// + /// This opens the data connection and checks for the appropriate response. + /// + /// Params: + /// command = the command to send (e.g. STOR) + /// parameters = any arguments to send + /// + /// Returns: the data socket + public Socket processDataCommand(char[] command, char[][] parameters ...) + { + // Create a connection. + Socket data = this.getDataSocket(); + scope (failure) + { + // Close the socket, whether we were listening or not. + data.shutdown(SocketShutdown.BOTH); + data.detach(); + } + + // Tell the server about it. + this.sendCommand(command, parameters); + + // We should always get a 150/125 response. + auto response = this.readResponse(); + if (response.code != "150" && response.code != "125") + exception (response); + + // We might need to do this for active connections. + this.prepareDataSocket(data); + + return data; + } + + /// Clean up after the data socket and process the response. + /// + /// This closes the socket and reads the 226 response. + /// + /// Params: + /// data = the data socket + public void finishDataCommand(Socket data) + { + // Close the socket. This tells the server we're done (EOF.) + data.shutdown(SocketShutdown.BOTH); + data.detach(); + + // We shouldn't get a 250 in STREAM mode. + this.readResponse("226"); + } + + /// Get a data socket from the server. + /// + /// This sends PASV/PORT as necessary. + /// + /// Returns: the data socket or a listener + protected Socket getDataSocket() + { + // What type are we using? + switch (this.data_info.type) + { + default: + exception ("unknown connection type"); + + // Passive is complicated. Handle it in another member. + case FtpConnectionType.passive: + return this.connectPassive(); + + // Active is simpler, but not as fool-proof. + case FtpConnectionType.active: + IPv4Address data_addr = cast(IPv4Address) this.data_info.address; + + // Start listening. + Socket listener = new Socket(AddressFamily.INET, SocketType.STREAM, ProtocolType.TCP); + listener.bind(this.data_info.listen); + listener.listen(32); + + // Use EPRT if we know it's supported. + if (this.is_supported("EPRT")) + { + char[64] tmp = void; + + this.sendCommand("EPRT", Text.layout(tmp, "|1|%0|%1|", data_addr.toAddrString, data_addr.toPortString)); + // this.sendCommand("EPRT", format("|1|%s|%s|", data_addr.toAddrString(), data_addr.toPortString())); + this.readResponse("200"); + } + else + { + int h1, h2, h3, h4, p1, p2; + h1 = (data_addr.addr() >> 24) % 256; + h2 = (data_addr.addr() >> 16) % 256; + h3 = (data_addr.addr() >> 8_) % 256; + h4 = (data_addr.addr() >> 0_) % 256; + p1 = (data_addr.port() >> 8_) % 256; + p2 = (data_addr.port() >> 0_) % 256; + + // low overhead method to format a numerical string + char[64] tmp = void; + char[20] foo = void; + auto str = Text.layout (tmp, "%0,%1,%2,%3,%4,%5", + Integer.format(foo[0..3], h1), + Integer.format(foo[3..6], h2), + Integer.format(foo[6..9], h3), + Integer.format(foo[9..12], h4), + Integer.format(foo[12..15], p1), + Integer.format(foo[15..18], p2)); + + // This formatting is weird. + // this.sendCommand("PORT", format("%d,%d,%d,%d,%d,%d", h1, h2, h3, h4, p1, p2)); + + this.sendCommand("PORT", str); + this.readResponse("200"); + } + + return listener; + } + assert (false); + } + + /// Prepare a data socket for use. + /// + /// This modifies the socket in some cases. + /// + /// Params: + /// data = the data listener socket + protected void prepareDataSocket(inout Socket data) + { + switch (this.data_info.type) + { + default: + exception ("unknown connection type"); + + case FtpConnectionType.active: + Socket new_data = null; + + SocketSet set = new SocketSet(); + scope (exit) + delete set; + + // At end_time, we bail. + Time end_time = Clock.now + this.timeout; + + while (Clock.now < end_time) + { + set.reset(); + set.add(data); + + // Can we accept yet? + int code = Socket.select(set, null, null, this.timeout); + if (code == -1 || code == 0) + break; + + new_data = data.accept(); + break; + } + + if (new_data is null) + throw new FTPException("CLIENT: No connection from server", "420"); + + // We don't need the listener anymore. + data.shutdown(SocketShutdown.BOTH); + data.detach(); + + // This is the actual socket. + data = new_data; + break; + + case FtpConnectionType.passive: + break; + } + } + + /// Send a PASV and initiate a connection. + /// + /// Returns: a connected socket + public Socket connectPassive() + { + Address connect_to = null; + + // SPSV, which is just a port number. + if (this.is_supported("SPSV")) + { + this.sendCommand("SPSV"); + auto response = this.readResponse("227"); + + // Connecting to the same host. + IPv4Address remote = cast(IPv4Address) this.socket.remoteAddress(); + assert (remote !is null); + + uint address = remote.addr(); + uint port = toInt(response.message); + + connect_to = new IPv4Address(address, cast(ushort) port); + } + // Extended passive mode (IP v6, etc.) + else if (this.is_supported("EPSV")) + { + this.sendCommand("EPSV"); + auto response = this.readResponse("229"); + + // Try to pull out the (possibly not parenthesized) address. + auto r = Regex.search(response.message, `\([^0-9][^0-9][^0-9](\d+)[^0-9]\)`); + if (r is null) + throw new FTPException("CLIENT: Unable to parse address", "501"); + + IPv4Address remote = cast(IPv4Address) this.socket.remoteAddress(); + assert (remote !is null); + + uint address = remote.addr(); + uint port = toInt(r.match(1)); + + connect_to = new IPv4Address(address, cast(ushort) port); + } + else + { + this.sendCommand("PASV"); + auto response = this.readResponse("227"); + + // Try to pull out the (possibly not parenthesized) address. + auto r = Regex.search(response.message, `(\d+),\s*(\d+),\s*(\d+),\s*(\d+),\s*(\d+)(,\s*(\d+))?`); + if (r is null) + throw new FTPException("CLIENT: Unable to parse address", "501"); + + // Now put it into something std.socket will understand. + char[] address = r.match(1)~"."~r.match(2)~"."~r.match(3)~"."~r.match(4); + uint port = (toInt(r.match(5)) << 8) + (r.match(7).length > 0 ? toInt(r.match(7)) : 0); + + // Okay, we've got it! + connect_to = new IPv4Address(address, port); + } + + scope (exit) + delete connect_to; + + // This will throw an exception if it cannot connect. + auto sock = new Socket(AddressFamily.INET, SocketType.STREAM, ProtocolType.TCP); + sock.connect (connect_to); + return sock; + } + + /// Change the type of data transfer. + /// + /// ASCII mode implies that line ending conversion should be made. + /// Only NON PRINT is supported. + /// + /// Params: + /// type = FtpFormat.ascii or FtpFormat.image + public void type(FtpFormat format) + { + if (format == FtpFormat.ascii) + this.sendCommand("TYPE", "A"); + else + this.sendCommand("TYPE", "I"); + + this.readResponse("200"); + } + + /// Store a local file on the server. + /// + /// Calling this function will change the current data transfer format. + /// + /// Params: + /// path = the path to the remote file + /// local_file = the path to the local file + /// progress = a delegate to call with progress information + /// format = what format to send the data in + + public void put(char[] path, char[] local_file, FtpProgress progress = null, FtpFormat format = FtpFormat.image) + in + { + assert (path.length > 0); + assert (local_file.length > 0); + } + body + { + // Open the file for reading... + auto file = new FileConduit(local_file); + scope (exit) + { + file.detach(); + delete file; + } + + // Seek to the correct place, if specified. + if (this.restart_pos > 0) + { + file.seek(this.restart_pos); + this.restart_pos = 0; + } + else + { + // Allocate space for the file, if we need to. + this.allocate(file.length); + } + + // Now that it's open, we do what we always do. + this.put(path, file, progress, format); + } + + /// Store data from a stream on the server. + /// + /// Calling this function will change the current data transfer format. + /// + /// Params: + /// path = the path to the remote file + /// stream = data to store, or null for a blank file + /// progress = a delegate to call with progress information + /// format = what format to send the data in + public void put(char[] path, InputStream stream = null, FtpProgress progress = null, FtpFormat format = FtpFormat.image) + in + { + assert (path.length > 0); + } + body + { + // Change to the specified format. + this.type(format); + + // Okay server, we want to store something... + Socket data = this.processDataCommand("STOR", path); + + // Send the stream over the socket! + if (stream !is null) + this.sendStream(data, stream, progress); + + this.finishDataCommand(data); + } + + /// Append data to a file on the server. + /// + /// Calling this function will change the current data transfer format. + /// + /// Params: + /// path = the path to the remote file + /// stream = data to append to the file + /// progress = a delegate to call with progress information + /// format = what format to send the data in + public void append(char[] path, InputStream stream, FtpProgress progress = null, FtpFormat format = FtpFormat.image) + in + { + assert (path.length > 0); + assert (stream !is null); + } + body + { + // Change to the specified format. + this.type(format); + + // Okay server, we want to store something... + Socket data = this.processDataCommand("APPE", path); + + // Send the stream over the socket! + this.sendStream(data, stream, progress); + + this.finishDataCommand(data); + } + + /// Seek to a byte offset for the next transfer. + /// + /// Params: + /// offset = the number of bytes to seek forward + public void restartSeek(size_t offset) + { + char[16] tmp; + this.sendCommand("REST", Integer.format (tmp, cast(long) offset)); + this.readResponse("350"); + + // Set this for later use. + this.restart_pos = offset; + } + + /// Allocate space for a file. + /// + /// After calling this, append() or put() should be the next command. + /// + /// Params: + /// bytes = the number of bytes to allocate + public void allocate(long bytes) + in + { + assert (bytes > 0); + } + body + { + char[16] tmp; + this.sendCommand("ALLO", Integer.format(tmp, bytes)); + auto response = this.readResponse(); + + // For our purposes 200 and 202 are both fine. + if (response.code != "200" && response.code != "202") + exception (response); + } + + /// Retrieve a remote file's contents into a local file. + /// + /// Calling this function will change the current data transfer format. + /// + /// Params: + /// path = the path to the remote file + /// local_file = the path to the local file + /// progress = a delegate to call with progress information + /// format = what format to read the data in + public void get(char[] path, char[] local_file, FtpProgress progress = null, FtpFormat format = FtpFormat.image) + in + { + assert (path.length > 0); + assert (local_file.length > 0); + } + body + { + FileConduit file = null; + + // We may either create a new file... + if (this.restart_pos == 0) + file = new FileConduit (local_file, FileConduit.ReadWriteCreate); + // Or open an existing file, and seek to the specified position (read: not end, necessarily.) + else + { + file = new FileConduit (local_file, FileConduit.ReadWriteExisting); + file.seek(this.restart_pos); + + this.restart_pos = 0; + } + + scope (exit) + { + file.detach(); + delete file; + } + + // Now that it's open, we do what we always do. + this.get(path, file, progress, format); + } + + /// Retrieve a remote file's contents into a local file. + /// + /// Calling this function will change the current data transfer format. + /// + /// Params: + /// path = the path to the remote file + /// stream = stream to write the data to + /// progress = a delegate to call with progress information + /// format = what format to read the data in + public void get(char[] path, OutputStream stream, FtpProgress progress = null, FtpFormat format = FtpFormat.image) + in + { + assert (path.length > 0); + assert (stream !is null); + } + body + { + // Change to the specified format. + this.type(format); + + // Okay server, we want to get this file... + Socket data = this.processDataCommand("RETR", path); + + // Read the stream in from the socket! + this.readStream(data, stream, progress); + + this.finishDataCommand(data); + } + + /// Get information about a single file. + /// + /// Return an FtpFileInfo struct about the specified path. + /// This may not work consistently on directories (but should.) + /// + /// Params: + /// path = the file or directory to get information about + /// + /// Returns: the file information + public FtpFileInfo getFileInfo(char[] path) + in + { + assert (path.length > 0); + } + body + { + // Start assuming the MLST didn't work. + bool mlst_success = false; + FtpResponse response; + + // Check if MLST might be supported... + if (this.isSupported("MLST")) + { + this.sendCommand("MLST", path); + response = this.readResponse(); + + // If we know it was supported for sure, this is an error. + if (this.is_supported("MLST")) + exception (response); + // Otherwise, it probably means we need to try a LIST. + else + mlst_success = response.code == "250"; + } + + // Okay, we got the MLST response... parse it. + if (mlst_success) + { + char[][] lines = Text.splitLines (response.message); + + // We need at least 3 lines - first and last and header/footer lines. + // Note that more than 3 could be returned; e.g. multiple lines about the one file. + if (lines.length <= 2) + throw new FTPException("CLIENT: Bad MLST response from server", "501"); + + // Return the first line's information. + return parseMlstLine(lines[1]); + } + else + { + // Send a list command. This may list the contents of a directory, even. + FtpFileInfo[] temp = this.sendListCommand(path); + + // If there wasn't at least one line, the file didn't exist? + // We should have already handled that. + if (temp.length < 1) + throw new FTPException("CLIENT: Bad LIST response from server", "501"); + + // If there are multiple lines, try to return the correct one. + if (temp.length != 1) + foreach (FtpFileInfo info; temp) + { + if (info.type == FtpFileType.cdir) + return info; + } + + // Okay then, the first line. Best we can do? + return temp[0]; + } + } + + /// Get a listing of a directory's contents. + /// + /// Don't end path in a /. Blank means the current directory. + /// + /// Params: + /// path = the directory to list + /// + /// Returns: an array of the contents + public FtpFileInfo[] ls(char[] path = "") // default to current dir + in + { + assert (path.length == 0 || path[path.length - 1] != '/'); + } + body + { + FtpFileInfo[] dir; + + // We'll try MLSD (which is so much better) first... but it may fail. + bool mlsd_success = false; + Socket data = null; + + // Try it if it could/might/maybe is supported. + if (this.isSupported("MLST")) + { + mlsd_success = true; + + // Since this is a data command, processDataCommand handles + // checking the response... just catch its Exception. + try + { + if (path.length > 0) + data = this.processDataCommand("MLSD", path); + else + data = this.processDataCommand("MLSD"); + } + catch (FTPException) + mlsd_success = false; + } + + // If it passed, parse away! + if (mlsd_success) + { + auto listing = new GrowBuffer; + this.readStream(data, listing); + this.finishDataCommand(data); + + // Each line is something in that directory. + char[][] lines = Text.splitLines (cast(char[]) listing.slice()); + scope (exit) + delete lines; + + foreach (char[] line; lines) + { + // Parse each line exactly like MLST does. + FtpFileInfo info = this.parseMlstLine(line); + if (info.name.length > 0) + dir ~= info; + } + + return dir; + } + // Fall back to LIST. + else + return this.sendListCommand(path); + } + + /// Send a LIST command to determine a directory's content. + /// + /// The format of a LIST response is not guaranteed. If available, + /// MLSD should be used instead. + /// + /// Params: + /// path = the file or directory to list + /// + /// Returns: an array of the contents + protected FtpFileInfo[] sendListCommand(char[] path) + { + FtpFileInfo[] dir; + Socket data = null; + + if (path.length > 0) + data = this.processDataCommand("LIST", path); + else + data = this.processDataCommand("LIST"); + + // Read in the stupid non-standardized response. + auto listing = new GrowBuffer; + this.readStream(data, listing); + this.finishDataCommand(data); + + // Split out the lines. Most of the time, it's one-to-one. + char[][] lines = Text.splitLines (cast(char[]) listing.slice()); + scope (exit) + delete lines; + + foreach (char[] line; lines) + { + // If there are no spaces, or if there's only one... skip the line. + // This is probably like a "total 8" line. + if (Text.locate(line, ' ') == Text.locatePrior(line, ' ')) + continue; + + // Now parse the line, or try to. + FtpFileInfo info = this.parseListLine(line); + if (info.name.length > 0) + dir ~= info; + } + + return dir; + } + + /// Parse a LIST response line. + /// + /// The format here isn't even specified, so we have to try to detect + /// commmon ones. + /// + /// Params: + /// line = the line to parse + /// + /// Returns: information about the file + protected FtpFileInfo parseListLine(char[] line) + { + FtpFileInfo info; + size_t pos = 0; + + // Convenience function to parse a word from the line. + char[] parse_word() + { + size_t start = 0, end = 0; + + // Skip whitespace before. + while (pos < line.length && line[pos] == ' ') + pos++; + + start = pos; + while (pos < line.length && line[pos] != ' ') + pos++; + end = pos; + + // Skip whitespace after. + while (pos < line.length && line[pos] == ' ') + pos++; + + return line[start .. end]; + } + + // We have to sniff this... :/. + switch (! Text.contains ("0123456789", line[0])) + { + // Not a number; this is UNIX format. + case true: + // The line must be at least 20 characters long. + if (line.length < 20) + return info; + + // The first character tells us what it is. + if (line[0] == 'd') + info.type = FtpFileType.dir; + else if (line[0] == '-') + info.type = FtpFileType.file; + else + info.type = FtpFileType.unknown; + + // Parse out the mode... rwxrwxrwx = 777. + char[] unix_mode = "0000".dup; + void read_mode(int digit) + { + for (pos = 1 + digit * 3; pos <= 3 + digit * 3; pos++) + { + if (line[pos] == 'r') + unix_mode[digit + 1] |= 4; + else if (line[pos] == 'w') + unix_mode[digit + 1] |= 2; + else if (line[pos] == 'x') + unix_mode[digit + 1] |= 1; + } + } + + // This makes it easier, huh? + read_mode(0); + read_mode(1); + read_mode(2); + + info.facts["UNIX.mode"] = unix_mode; + + // Links, owner, group. These are hard to translate to MLST facts. + parse_word(); + parse_word(); + parse_word(); + + // Size in bytes, this one is good. + info.size = toLong(parse_word()); + + // Make sure we still have enough space. + if (pos + 13 >= line.length) + return info; + + // Not parsing date for now. It's too weird (last 12 months, etc.) + pos += 13; + + info.name = line[pos .. line.length]; + break; + + // A number; this is DOS format. + case false: + // We need some data here, to parse. + if (line.length < 18) + return info; + + // The order is 1 MM, 2 DD, 3 YY, 4 HH, 5 MM, 6 P + auto r = Regex.search(line, `(\d\d)-(\d\d)-(\d\d)\s+(\d\d):(\d\d)(A|P)M`); + if (r is null) + return info; + + if (Timestamp.dostime (r.match(0), info.modify) is 0) + info.modify = Time.max; + + pos = r.match(0).length; + delete r; + + // This will either be , or a number. + char[] dir_or_size = parse_word(); + + if (dir_or_size.length < 0) + return info; + else if (dir_or_size[0] == '<') + info.type = FtpFileType.dir; + else + info.size = toLong(dir_or_size); + + info.name = line[pos .. line.length]; + break; + + // Something else, not supported. + default: + throw new FTPException("CLIENT: Unsupported LIST format", "501"); + } + + // Try to fix the type? + if (info.name == ".") + info.type = FtpFileType.cdir; + else if (info.name == "..") + info.type = FtpFileType.pdir; + + return info; + } + + /// Parse an MLST/MLSD response line. + /// + /// The format here is very rigid, and has facts followed by a filename. + /// + /// Params: + /// line = the line to parse + /// + /// Returns: information about the file + protected FtpFileInfo parseMlstLine(char[] line) + { + FtpFileInfo info; + + // After this loop, filename_pos will be location of space + 1. + size_t filename_pos = 0; + while (filename_pos < line.length && line[filename_pos++] != ' ') + continue; + + if (filename_pos == line.length) + throw new FTPException("CLIENT: Bad syntax in MLSx response", "501"); + + info.name = line[filename_pos .. line.length]; + + // Everything else is frosting on top. + if (filename_pos > 1) + { + char[][] temp_facts = Text.delimit(line[0 .. filename_pos - 1], ";"); + + // Go through each fact and parse them into the array. + foreach (char[] fact; temp_facts) + { + int pos = Text.locate(fact, '='); + if (pos == fact.length) + continue; + + info.facts[Ascii.toLower(fact[0 .. pos])] = fact[pos + 1 .. fact.length]; + } + + // Do we have a type? + if ("type" in info.facts) + { + // Some reflection might be nice here. + switch (Ascii.toLower(info.facts["type"])) + { + case "file": + info.type = FtpFileType.file; + break; + + case "cdir": + info.type = FtpFileType.cdir; + break; + + case "pdir": + info.type = FtpFileType.pdir; + break; + + case "dir": + info.type = FtpFileType.dir; + break; + + default: + info.type = FtpFileType.other; + } + } + + // Size, mime, etc... + if ("size" in info.facts) + info.size = toLong(info.facts["size"]); + if ("media-type" in info.facts) + info.mime = info.facts["media-type"]; + + // And the two dates. + if ("modify" in info.facts) + info.modify = this.parseTimeval(info.facts["modify"]); + if ("create" in info.facts) + info.create = this.parseTimeval(info.facts["create"]); + } + + return info; + } + + /// Parse a timeval from an FTP response. + /// + /// This is basically an ISO 8601 date, but even more rigid. + /// + /// Params: + /// timeval = the YYYYMMDDHHMMSS date + /// + /// Returns: a d_time representing the same date + + protected Time parseTimeval(char[] timeval) + { + if (timeval.length < 14) + throw new FTPException("CLIENT: Unable to parse timeval", "501"); + + return Gregorian.generic.toTime (Integer.atoi (timeval[0..4]), + Integer.atoi (timeval[4..6]), + Integer.atoi (timeval[6..8]), + Integer.atoi (timeval[8..10]), + Integer.atoi (timeval[10..12]), + Integer.atoi (timeval[12..14])); + } + + /// Get the modification time of a file. + /// + /// Not supported by a lot of servers. + /// + /// Params: + /// path = the file or directory in question + /// + /// Returns: a d_time representing the mtime + public Time filemtime(char[] path) + in + { + assert (path.length > 0); + } + body + { + this.sendCommand("MDTM", path); + auto response = this.readResponse("213"); + + // The whole response should be a timeval. + return this.parseTimeval(response.message); + } + + /// Create a directory. + /// + /// Depending on server model, a cwd with the same path may not work. + /// Use the return value instead to escape this problem. + /// + /// Params: + /// path = the directory to create + /// + /// Returns: the path to the directory created + public char[] mkdir(char[] path) + in + { + assert (path.length > 0); + } + body + { + this.sendCommand("MKD", path); + auto response = this.readResponse("257"); + + return this.parse257(response); + } + + /// Get supported features from the server. + /// + /// This may not be supported, in which case the list will remain empty. + /// Otherwise, it will contain at least FEAT. + public void getFeatures() + { + this.sendCommand("FEAT"); + auto response = this.readResponse(); + + // 221 means FEAT is supported, and a list follows. Otherwise we don't know... + if (response.code != "211") + delete this.supported_features; + else + { + char[][] lines = Text.splitLines (response.message); + + // There are two more lines than features, but we also have FEAT. + this.supported_features = new FtpFeature[lines.length - 1]; + this.supported_features[0].command = "FEAT"; + + for (size_t i = 1; i < lines.length - 1; i++) + { + size_t pos = Text.locate(lines[i], ' '); + + this.supported_features[i].command = lines[i][0 .. pos]; + if (pos < lines[i].length - 1) + this.supported_features[i].params = lines[i][pos + 1 .. lines[i].length]; + } + + delete lines; + } + } + + /// Check if a specific feature might be supported. + /// + /// Example: + /// ---------- + /// if (ftp.isSupported("SIZE")) + /// size = ftp.size("example.txt"); + /// ---------- + /// + /// Params: + /// command = the command in question + public bool isSupported(char[] command) + in + { + assert (command.length > 0); + } + body + { + if (this.supported_features.length == 0) + return true; + + // Search through the list for the feature. + foreach (FtpFeature feat; this.supported_features) + { + if (Ascii.icompare(feat.command, command) == 0) + return true; + } + + return false; + } + + /// Check if a specific feature is known to be supported. + /// + /// Example: + /// ---------- + /// if (ftp.is_supported("SIZE")) + /// size = ftp.size("example.txt"); + /// ---------- + /// + /// Params: + /// command = the command in question + public bool is_supported(char[] command) + { + if (this.supported_features.length == 0) + return false; + + return this.isSupported(command); + } + + /// Send a site-specific command. + /// + /// The command might be WHO, for example, returning a list of users online. + /// These are typically heavily server-specific. + /// + /// Params: + /// command = the command to send (after SITE) + /// parameters = any additional parameters to send + /// (each will be prefixed by a space) + public FtpResponse siteCommand(char[] command, char[][] parameters ...) + in + { + assert (command.length > 0); + } + body + { + // Because of the way sendCommand() works, we have to tweak this a bit. + char[][] temp_params = new char[][parameters.length + 1]; + temp_params[0] = command; + temp_params[1 .. temp_params.length][] = parameters; + + this.sendCommand("SITE", temp_params); + auto response = this.readResponse(); + + // Check to make sure it didn't fail. + if (response.code[0] != '2') + exception (response); + + return response; + } + + /// Send a NOOP, typically used to keep the connection alive. + public void noop() + { + this.sendCommand("NOOP"); + this.readResponse("200"); + } + + /// Send the stream to the server. + /// + /// Params: + /// data = the socket to write to + /// stream = the stream to read from + /// progress = a delegate to call with progress information + + protected void sendStream(Socket data, InputStream stream, FtpProgress progress = null) + in + { + assert (data !is null); + assert (stream !is null); + } + body + { + // Set up a SocketSet so we can use select() - it's pretty efficient. + SocketSet set = new SocketSet(); + scope (exit) + delete set; + + // At end_time, we bail. + Time end_time = Clock.now + this.timeout; + + // This is the buffer the stream data is stored in. + ubyte[8 * 1024] buf; + size_t buf_size = 0, buf_pos = 0; + int delta = 0; + + size_t pos = 0; + bool completed = false; + while (!completed && Clock.now < end_time) + { + set.reset(); + set.add(data); + + // Can we write yet, can we write yet? + int code = Socket.select(null, set, null, this.timeout); + if (code == -1 || code == 0) + break; + + if (buf_size - buf_pos <= 0) + { + if ((buf_size = stream.read(buf)) is stream.Eof) + buf_size = 0, completed = true; + buf_pos = 0; + } + + // Send the chunk (or as much of it as possible!) + delta = data.send(buf[buf_pos .. buf_size]); + if (delta == data.ERROR) + break; + + buf_pos += delta; + + pos += delta; + if (progress !is null) + progress(pos); + + // Give it more time as long as data is going through. + if (delta != 0) + end_time = Clock.now + this.timeout; + } + + // Did all the data get sent? + if (!completed) + throw new FTPException("CLIENT: Timeout when sending data", "420"); + } + + /// Reads from the server to a stream until EOF. + /// + /// Params: + /// data = the socket to read from + /// stream = the stream to write to + /// progress = a delegate to call with progress information + protected void readStream(Socket data, OutputStream stream, FtpProgress progress = null) + in + { + assert (data !is null); + assert (stream !is null); + } + body + { + // Set up a SocketSet so we can use select() - it's pretty efficient. + SocketSet set = new SocketSet(); + scope (exit) + delete set; + + // At end_time, we bail. + Time end_time = Clock.now + this.timeout; + + // This is the buffer the stream data is stored in. + ubyte[8 * 1024] buf; + int buf_size = 0; + + bool completed = false; + size_t pos; + while (Clock.now < end_time) + { + set.reset(); + set.add(data); + + // Can we read yet, can we read yet? + int code = Socket.select(set, null, null, this.timeout); + if (code == -1 || code == 0) + break; + + buf_size = data.receive(buf); + if (buf_size == data.ERROR) + break; + + if (buf_size == 0) + { + completed = true; + break; + } + + stream.write(buf[0 .. buf_size]); + + pos += buf_size; + if (progress !is null) + progress(pos); + + // Give it more time as long as data is going through. + end_time = Clock.now + this.timeout; + } + + // Did all the data get received? + if (!completed) + throw new FTPException("CLIENT: Timeout when reading data", "420"); + } + + /// Parse a 257 response (which begins with a quoted path.) + /// + /// Params: + /// response = the response to parse + /// + /// Returns: the path in the response + + protected char[] parse257(FtpResponse response) + { + char[] path = new char[response.message.length]; + size_t pos = 1, len = 0; + + // Since it should be quoted, it has to be at least 3 characters in length. + if (response.message.length <= 2) + exception (response); + + assert (response.message[0] == '"'); + + // Trapse through the response... + while (pos < response.message.length) + { + if (response.message[pos] == '"') + { + // An escaped quote, keep going. False alarm. + if (response.message[++pos] == '"') + path[len++] = response.message[pos]; + else + break; + } + else + path[len++] = response.message[pos]; + + pos++; + } + + // Okay, done! That wasn't too hard. + path.length = len; + return path; + } + + /// Send a command to the FTP server. + /// + /// Does not get/wait for the response. + /// + /// Params: + /// command = the command to send + /// ... = additional parameters to send (a space will be prepended to each) + public void sendCommand(char[] command, char[][] parameters ...) + { + assert (this.socket !is null); + + + char [] socketCommand = command ; + + // Send the command, parameters, and then a CRLF. + + foreach (char[] param; parameters) + { + socketCommand ~= " " ~ param; + + } + + socketCommand ~= "\r\n"; + + debug(FtpDebug) + { + Stdout.formatln("[sendCommand] Sending command '{0}'",socketCommand ); + } + this.sendData(socketCommand); + } + + /// Read in response lines from the server, expecting a certain code. + /// + /// Params: + /// expected_code = the code expected from the server + /// + /// Returns: the response from the server + /// + /// Throws: FTPException if code does not match + public FtpResponse readResponse(char[] expected_code) + { + debug (FtpDebug ) { Stdout.formatln("[readResponse] Expected Response {0}",expected_code )(); } + auto response = this.readResponse(); + debug (FtpDebug ) { Stdout.formatln("[readResponse] Actual Response {0}",response.code)(); } + + if (response.code != expected_code) + exception (response); + + + + return response; + } + + /// Read in the response line(s) from the server. + /// + /// Returns: the response from the server + public FtpResponse readResponse() + { + assert (this.socket !is null); + + // Pick a time at which we stop reading. It can't take too long, but it could take a bit for the whole response. + Time end_time = Clock.now + this.timeout * 10; + + FtpResponse response; + char[] single_line = null; + + // Danger, Will Robinson, don't fall into an endless loop from a malicious server. + while (Clock.now < end_time) + { + single_line = this.readLine(); + + + // This is the first line. + if (response.message.length == 0) + { + // The first line must have a code and then a space or hyphen. + if (single_line.length <= 4) + { + response.code[] = "500"; + break; + } + + // The code is the first three characters. + response.code[] = single_line[0 .. 3]; + response.message = single_line[4 .. single_line.length]; + } + // This is either an extra line, or the last line. + else + { + response.message ~= "\n"; + + // If the line starts like "123-", that is not part of the response message. + if (single_line.length > 4 && single_line[0 .. 3] == response.code) + response.message ~= single_line[4 .. single_line.length]; + // If it starts with a space, that isn't either. + else if (single_line.length > 2 && single_line[0] == ' ') + response.message ~= single_line[1 .. single_line.length]; + else + response.message ~= single_line; + } + + // We're done if the line starts like "123 ". Otherwise we're not. + if (single_line.length > 4 && single_line[0 .. 3] == response.code && single_line[3] == ' ') + break; + } + + return response; + } + + /// convert text to integer + private int toInt (char[] s) + { + return cast(int) toLong (s); + } + + /// convert text to integer + private long toLong (char[] s) + { + return Integer.parse (s); + } +} + + + +/// An exception caused by an unexpected FTP response. +/// +/// Even after such an exception, the connection may be in a usable state. +/// Use the response code to determine more information about the error. +/// +/// Standards: RFC 959, RFC 2228, RFC 2389, RFC 2428 +class FTPException: Exception +{ + /// The three byte response code. + char[3] response_code = "000"; + + /// Construct an FTPException based on a message and code. + /// + /// Params: + /// message = the exception message + /// code = the code (5xx for fatal errors) + this (char[] message, char[3] code = "420") + { + this.response_code[] = code; + super(message); + } + + /// Construct an FTPException based on a response. + /// + /// Params: + /// r = the server response + this (FtpResponse r) + { + this.response_code[] = r.code; + super(r.message); + } + + /// A string representation of the error. + char[] toString() + { + char[] buffer = new char[this.msg.length + 4]; + + buffer[0 .. 3] = this.response_code; + buffer[3] = ' '; + buffer[4 .. buffer.length] = this.msg; + + return buffer; + } +} + + +debug (UnitTest ) +{ + import tango.io.Stdout; + + unittest + { + + try + { + /+ + + TODO: Fix this + + + auto ftp = new FTPConnection("ftp.gnu.org","anonymous","anonymous"); + auto dirList = ftp.ls(); // get list for current dir + + foreach ( entry;dirList ) + { + + Stdout("File :")(entry.name)("\tSize :")(entry.size).newline; + + } + + ftp.cd("gnu/windows/emacs"); + + + dirList = ftp.ls(); + + foreach ( entry;dirList ) + { + + Stdout("File :")(entry.name)("\tSize :")(entry.size).newline; + + } + + + size_t size = ftp.size("emacs-21.3-barebin-i386.tar.gz"); + + void progress( size_t pos ) + { + + Stdout.formatln("Byte {0} of {1}",pos,size); + + } + + + ftp.get("emacs-21.3-barebin-i386.tar.gz","emacs.tgz", &progress); + +/ + } + catch( Object o ) + { + assert( false ); + } + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/ftp/Telnet.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/ftp/Telnet.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,247 @@ +/******************************************************************************* + + copyright: Copyright (c) 2006 UWB. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: June 2006 + + author: UWB + +*******************************************************************************/ + +module tango.net.ftp.Telnet; + +private import tango.time.Clock; + +private import tango.net.Socket; + +private import tango.core.Exception; + +private import Integer = tango.text.convert.Integer; + + +/// Utilities for telnet-based connections. +/// +/// Params: +/// TelnetException = the type for exceptions thrown +/// socket = the connected socket +/// timeout = the timeout for socket communication +class Telnet +{ + /// The control connection socket. + protected Socket socket; + + /// The number of milliseconds to wait for socket communication or connection. + protected TimeSpan timeout = TimeSpan.millis(5000); + + /// provided by host + abstract void exception (char[] msg); + + /// Send a line over the socket. + /// + /// Params: + /// buf = the bytes to send + + void sendLine(void[] buf) + { + this.sendData(buf); + this.sendData("\r\n"); + } + + /// Send data over the socket. + /// + /// Params: + /// buf = the bytes to send + void sendData(void[] buf) + in + { + assert (buf.length > 0); + } + body + { + // At end_time, we bail. + Time end_time = Clock.now + this.timeout; + + // Set up a SocketSet so we can use select() - it's pretty efficient. + SocketSet set = new SocketSet(); + scope (exit) + delete set; + + size_t pos = 0; + while (Clock.now < end_time) + { + set.reset(); + set.add(this.socket); + + // Can we write yet, can we write yet? + int code = Socket.select(null, set, null, this.timeout); + if (code == -1 || code == 0) + break; + + // Send it (or as much as possible!) + int delta = this.socket.send(buf[pos .. buf.length]); + if (delta == -1) + break; + + pos += delta; + if (pos >= buf.length) + break; + } + + // If we didn't send everything, we're dead in the water. + if (pos != buf.length) + exception ("CLIENT: Timeout when sending command"); + } + + /// Read a CRLF terminated line from the socket. + /// + /// Returns: the line read + char[] readLine() + { + // Figure, first, how long we're allowed to take. + Time end_time = Clock.now + this.timeout; + + // An overall buffer and a one-char buffer. + char[] buffer; + char[1] buf; + size_t buffer_pos = 0; + + // Push a byte onto the buffer. + void push_byte() + { + // Lines aren't usually that long. Allocate in blocks of 16 bytes. + if (buffer.length <= buffer_pos) + buffer.length = buffer.length + 16; + + buffer[buffer_pos++] = buf[0]; + } + + // Get the resultant buffer. + char[] get_buffer() + { + return buffer[0 .. buffer_pos]; + } + + // Now the socket set for selecting purposes. + SocketSet set = new SocketSet(); + scope (exit) + delete set; + + while (Clock.now < end_time) + { + set.reset(); + set.add(this.socket); + + // Try to read from the socket. + int code = Socket.select(set, null, null, this.timeout); + if (code == -1 || code == 0) + break; + + // Okay, now we're ready. Read in the measly byte. + int delta = this.socket.receive(buf); + if (delta != 1) + break; + + if (buf == "\r") + continue; + else if (buf == "\n") + break; + + push_byte(); + } + + return get_buffer(); + } + + /// Find a server which is listening on the specified port. + /// + /// Params: + /// hostname = the hostname to lookup and connect to + /// port = the port to connect on + Socket findAvailableServer(char[] hostname, int port) + { + // First we need to get a list of IP addresses. + auto host = new NetHost(); + scope (exit) + delete host; + + // Try to resolve the actual address for this hostname. + host.getHostByName(hostname); + scope (exit) + delete host.addrList; + + // None were found... darn. + if (host.addrList.length == 0) + throw new AddressException("Unable to resolve host '" ~ hostname ~ "'"); + + // Get all the sockets ready (or just one if there's just one address.) + Socket[] sockets = new Socket[host.addrList.length]; + scope (exit) + delete sockets; + + // And now just connect to all of them. + for (int i = 0; i < host.addrList.length; i++) + { + sockets[i] = new Socket(AddressFamily.INET, SocketType.STREAM, ProtocolType.TCP); + sockets[i].blocking = false; + + Address addr = new IPv4Address(host.addrList[i], cast(ushort) port); + scope (exit) + delete addr; + + // Start trying to connect as soon as possible. + sockets[i].connect(addr); + } + + // Set up some stuff so we can select through the hosts. + SocketSet set = new SocketSet(); + this.socket = null; + + scope (exit) + delete set; + + // Wait until we find a good socket... + while (this.socket is null) + { + set.reset(); + foreach (Socket s; sockets) + set.add(s); + + // Anyone available? + int code = Socket.select(null, set, null, this.timeout); + if (code == -1 || code == 0) + break; + + // Now we have to check to find a good socket, and break out if we find one. + foreach (Socket s; sockets) + if (set.isSet(s)) + { + this.socket = s; + break; + } + } + + // Close the other sockets (or all on error.) + foreach (Socket s; sockets) + if (s !is this.socket) + { + s.shutdown(SocketShutdown.BOTH); + s.detach(); + + delete s; + } + + // No socket, no data. Can't do anything about that. + if (this.socket is null) + { + char[10] tmp; + exception ("CLIENT: Unable to connect within the specified time limit (" ~ Integer.itoa(tmp, cast(uint) this.timeout.millis) ~ " ms.)"); + } + + // Make it blocking again, because that's the norm. + this.socket.blocking = true; + + return this.socket; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/http/ChunkStream.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/http/ChunkStream.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,166 @@ +/******************************************************************************* + + copyright: Copyright (c) Nov 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Nov 2007: Initial release + + author: Kris + + Support for HTTP chunked I/O. + + See http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html + +*******************************************************************************/ + +module tango.net.http.ChunkStream; + +private import tango.io.Buffer, + tango.io.Conduit; + +private import tango.text.stream.LineIterator; + +private import Integer = tango.text.convert.Integer; + +/******************************************************************************* + + Prefix each block of data with its length (in hex digits) and add + appropriate \r\n sequences. To write trailing headers you'll need + to step around this stream (otherwise those headers will be chunk + stamped also: use this.host or this.buffer to obtain the upstream + sibling) + +*******************************************************************************/ + +class ChunkOutput : OutputFilter, Buffered +{ + private IBuffer output; + + /*********************************************************************** + + Use a buffer belonging to our sibling, if one is available + + ***********************************************************************/ + + this (OutputStream stream) + { + super (output = Buffer.share(stream)); + } + + /*********************************************************************** + + Buffered interface + + ***********************************************************************/ + + IBuffer buffer () + { + return output; + } + + /*********************************************************************** + + Write a chunk to the output, prefixed and postfixed in a + manner consistent with the HTTP chunked transfer coding + + ***********************************************************************/ + + final override uint write (void[] src) + { + char[8] tmp = void; + + output.append (Integer.format (tmp, src.length, Integer.Style.Hex)) + .append ("\r\n") + .append (src) + .append ("\r\n"); + return src.length; + } +} + + +/******************************************************************************* + + Parse hex digits, and use the resultant size to modulate requests + for incoming data. A chunk size of 0 terminates the stream, so to + read any trailing headers you'll need to reach into the upstream + sibling instead (this.host or this.buffer, for example). + +*******************************************************************************/ + +class ChunkInput : LineIterator!(char) +{ + private uint available; + + /*********************************************************************** + + Prime the available chunk size by reading and parsing the + first available line + + ***********************************************************************/ + + this (InputStream stream) + { + super (stream); + available = nextChunk; + } + + /*********************************************************************** + + Read and parse another chunk size + + ***********************************************************************/ + + private final uint nextChunk () + { + char[] tmp; + + if ((tmp = super.next).ptr) + return cast(uint) Integer.parse (tmp, 16); + return 0; + } + + /*********************************************************************** + + Read content based on a previously parsed chunk size + + ***********************************************************************/ + + final override uint read (void[] dst) + { + if (available is 0) + return IConduit.Eof; + + auto size = dst.length > available ? available : dst.length; + auto read = super.read (dst [0 .. size]); + + // check for next chunk header + if (read != IConduit.Eof && (available -= read) is 0) + { + // consume trailing \r\n + super.buffer.skip (2); + available = nextChunk (); + } + + return read; + } +} + + +/******************************************************************************* + +*******************************************************************************/ + +debug (ChunkStream) +{ + import tango.io.Console; + + void main() + { + auto buf = new Buffer(20); + auto chunk = new ChunkOutput (buf); + chunk.write ("hello world"); + auto input = new ChunkInput (buf); + Cout.stream.copy (input); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/http/HttpClient.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/http/HttpClient.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,663 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: April 2004 + Outback release: December 2006 + + author: Kris - original module + author: h3r3tic - fixed a number of Post issues and + bugs in the 'params' construction + + Redirection handling guided via + http://ppewww.ph.gla.ac.uk/~flavell/www/post-redirect.html + +*******************************************************************************/ + +module tango.net.http.HttpClient; + +private import tango.time.Time; + +private import tango.io.Buffer; + +private import tango.net.Uri, + tango.net.SocketConduit, + tango.net.InternetAddress; + +private import tango.net.http.HttpConst, + tango.net.http.HttpParams, + tango.net.http.HttpHeaders, + tango.net.http.HttpTriplet, + tango.net.http.HttpCookies; + +private import tango.text.stream.LineIterator; + +private import Integer = tango.text.convert.Integer; + + +/******************************************************************************* + + Supports the basic needs of a client making requests of an HTTP + server. The following is an example of how this might be used: + + --- + // callback for client reader + void sink (char[] content) + { + Stdout.put (content); + } + + // create client for a GET request + auto client = new HttpClient (HttpClient.Get, "http://www.yahoo.com"); + + // make request + client.open (); + + // check return status for validity + if (client.isResponseOK) + { + // extract content length + auto length = client.getResponseHeaders.getInt (HttpHeader.ContentLength, uint.max); + + // display all returned headers + Stdout.put (client.getResponseHeaders); + + // display remaining content + client.read (&sink, length); + } + else + Stderr.put (client.getResponse); + + client.close (); + --- + + See modules HttpGet and HttpPost for simple wrappers instead. + +*******************************************************************************/ + +class HttpClient +{ + // callback for sending PUT content + alias void delegate (IBuffer) Pump; + + // this is struct rather than typedef to avoid compiler bugs + private struct RequestMethod + { + final char[] name; + } + + // class members; there's a surprising amount of stuff here! + private Uri uri; + private IBuffer tmp, + input, + output; + private SocketConduit socket; + private RequestMethod method; + private InternetAddress address; + private HttpParams paramsOut; + private HttpHeadersView headersIn; + private HttpHeaders headersOut; + private HttpCookies cookiesOut; + private ResponseLine responseLine; + + // default to three second timeout on read operations ... + private TimeSpan timeout = TimeSpan.seconds(3); + + // should we perform internal redirection? + private bool doRedirect = true; + + // use HTTP v1.0? + private static const char[] DefaultHttpVersion = "HTTP/1.0"; + + // standard set of request methods ... + static const RequestMethod Get = {"GET"}, + Put = {"PUT"}, + Head = {"HEAD"}, + Post = {"POST"}, + Trace = {"TRACE"}, + Delete = {"DELETE"}, + Options = {"OPTIONS"}, + Connect = {"CONNECT"}; + + /*********************************************************************** + + Create a client for the given URL. The argument should be + fully qualified with an "http:" or "https:" scheme, or an + explicit port should be provided. + + ***********************************************************************/ + + this (RequestMethod method, char[] url) + { + this (method, new Uri(url)); + } + + /*********************************************************************** + + Create a client with the provided Uri instance. The Uri should + be fully qualified with an "http:" or "https:" scheme, or an + explicit port should be provided. + + ***********************************************************************/ + + this (RequestMethod method, Uri uri) + { + this.uri = uri; + this.method = method; + + responseLine = new ResponseLine; + headersIn = new HttpHeadersView; + + tmp = new Buffer (1024 * 4); + paramsOut = new HttpParams (new Buffer (1024 * 4)); + headersOut = new HttpHeaders (new Buffer (1024 * 4)); + cookiesOut = new HttpCookies (headersOut); + + // decode the host name (may take a second or two) + auto host = uri.getHost (); + if (host) + address = new InternetAddress (host, uri.getValidPort); + else + responseLine.error ("invalid url provided to HttpClient ctor"); + } + + /*********************************************************************** + + Get the current input headers, as returned by the host request. + + ***********************************************************************/ + + HttpHeadersView getResponseHeaders() + { + return headersIn; + } + + /*********************************************************************** + + Gain access to the request headers. Use this to add whatever + headers are required for a request. + + ***********************************************************************/ + + HttpHeaders getRequestHeaders() + { + return headersOut; + } + + /*********************************************************************** + + Gain access to the request parameters. Use this to add x=y + style parameters to the request. These will be appended to + the request assuming the original Uri does not contain any + of its own. + + ***********************************************************************/ + + HttpParams getRequestParams() + { + return paramsOut; + } + + /*********************************************************************** + + Return the Uri associated with this client + + ***********************************************************************/ + + UriView getUri() + { + return uri; + } + + /*********************************************************************** + + Return the response-line for the latest request. This takes + the form of "version status reason" as defined in the HTTP + RFC. + + ***********************************************************************/ + + ResponseLine getResponse() + { + return responseLine; + } + + /*********************************************************************** + + Return the HTTP status code set by the remote server + + ***********************************************************************/ + + int getStatus() + { + return responseLine.getStatus; + } + + /*********************************************************************** + + Return whether the response was OK or not + + ***********************************************************************/ + + bool isResponseOK() + { + return getStatus is HttpResponseCode.OK; + } + + /*********************************************************************** + + Add a cookie to the outgoing headers + + ***********************************************************************/ + + void addCookie (Cookie cookie) + { + cookiesOut.add (cookie); + } + + /*********************************************************************** + + Close all resources used by a request. You must invoke this + between successive open() calls. + + ***********************************************************************/ + + void close () + { + if (socket) + { + socket.shutdown; + socket.detach; + socket = null; + } + } + + /*********************************************************************** + + Reset the client such that it is ready for a new request. + + ***********************************************************************/ + + void reset () + { + headersIn.reset; + headersOut.reset; + paramsOut.reset; + } + + /*********************************************************************** + + enable/disable the internal redirection suppport + + ***********************************************************************/ + + void enableRedirect (bool yes) + { + doRedirect = yes; + } + + /*********************************************************************** + + set timeout period for read operation + + ***********************************************************************/ + + void setTimeout (TimeSpan interval) + { + timeout = interval; + } + + /** + * Deprecated: use setTimeout(TimeSpan) instead + */ + deprecated void setTimeout(double interval) + { + setTimeout(TimeSpan.interval(interval)); + } + + /*********************************************************************** + + Overridable method to create a Socket. You may find a need + to override this for some purpose; perhaps to add input or + output filters. + + ***********************************************************************/ + + protected SocketConduit createSocket () + { + return new SocketConduit; + } + + /*********************************************************************** + + Make a request for the resource specified via the constructor, + using the specified timeout period (in milli-seconds).The + return value represents the input buffer, from which all + returned headers and content may be accessed. + + ***********************************************************************/ + + IBuffer open (IBuffer buffer = null) + { + return open (method, null, buffer); + } + + /*********************************************************************** + + Make a request for the resource specified via the constructor, + using a callback for pumping additional data to the host. This + defaults to a three-second timeout period. The return value + represents the input buffer, from which all returned headers + and content may be accessed. + + ***********************************************************************/ + + IBuffer open (Pump pump, IBuffer buffer = null) + { + return open (method, pump, buffer); + } + + /*********************************************************************** + + Make a request for the resource specified via the constructor + using the specified timeout period (in micro-seconds), and a + user-defined callback for pumping additional data to the host. + The callback would be used when uploading data during a 'put' + operation (or equivalent). The return value represents the + input buffer, from which all returned headers and content may + be accessed. + + Note that certain request-headers may generated automatically + if they are not present. These include a Host header and, in + the case of Post, both ContentType & ContentLength for a query + type of request. The latter two are *not* produced for Post + requests with 'pump' specified ~ when using 'pump' to output + additional content, you must explicitly set your own headers. + + Note also that IOException instances may be thrown. These + should be caught by the client to ensure a close() operation + is always performed + + ***********************************************************************/ + + private IBuffer open (RequestMethod method, Pump pump, IBuffer input) + { + // create socket, and connect it + socket = createSocket; + socket.setTimeout (timeout); + socket.connect (address); + + // create buffers for input and output + if (input) + input.clear, input.setConduit (socket); + else + input = new Buffer (socket); + output = new Buffer (socket); + + // save for read() method + this.input = input; + + // setup a Host header + if (headersOut.get (HttpHeader.Host, null) is null) + headersOut.add (HttpHeader.Host, uri.getHost); + + // http/1.0 needs connection:close + headersOut.add (HttpHeader.Connection, "close"); + + // attach/extend query parameters if user has added some + tmp.clear; + auto query = uri.extendQuery (paramsOut.formatTokens(tmp, "&")); + + // patch request path? + auto path = uri.getPath; + if (path.length is 0) + path = "/"; + + // format encoded request + output (method.name) (" "), uri.encode (&output.consume, path, uri.IncPath); + + // should we emit query as part of request line? + if (query.length) + if (method is Get) + output ("?"), uri.encode (&output.consume, query, uri.IncQueryAll); + else + if (method is Post && pump.funcptr is null) + { + // we're POSTing query text - add default info + if (headersOut.get (HttpHeader.ContentType, null) is null) + headersOut.add (HttpHeader.ContentType, "application/x-www-form-urlencoded"); + + if (headersOut.get (HttpHeader.ContentLength, null) is null) + headersOut.addInt (HttpHeader.ContentLength, query.length); + } + + // complete the request line, and emit headers too + output (" ") (DefaultHttpVersion) (HttpConst.Eol); + + headersOut.produce (&output.consume, HttpConst.Eol); + output (HttpConst.Eol); + + // user has additional data to send? + if (pump.funcptr) + pump (output); + else + // send encoded POST query instead? + if (method is Post && query.length) + uri.encode (&output.consume, query, uri.IncQueryAll); + + // send entire request + output.flush; + + // Token for initial parsing of input header lines + auto line = new LineIterator!(char) (input); + + // skip any blank lines + while (line.next && line.get.length is 0) + {} + + // throw if we experienced a timeout + if (socket.hadTimeout) + responseLine.error ("response timeout"); + + // is this a bogus request? + if (line.get.length is 0) + responseLine.error ("truncated response"); + + // read response line + responseLine.parse (line.get); + + // parse incoming headers + headersIn.reset.parse (input); + + // check for redirection + if (doRedirect) + switch (responseLine.getStatus) + { + case HttpResponseCode.SeeOther: + case HttpResponseCode.MovedPermanently: + case HttpResponseCode.MovedTemporarily: + case HttpResponseCode.TemporaryRedirect: + // drop this connection + close; + + // remove any existing Host header + headersOut.remove (HttpHeader.Host); + + // parse redirected uri + auto redirect = headersIn.get (HttpHeader.Location, "[missing url]"); + uri.relParse (redirect); + + // decode the host name (may take a second or two) + auto host = uri.getHost(); + if (host) + address = new InternetAddress (uri.getHost, uri.getValidPort); + else + responseLine.error ("redirect has invalid url: "~redirect); + + // figure out what to do + if (method is Get || method is Head) + return open (method, pump, input); + else + if (method is Post) + return redirectPost (pump, input, responseLine.getStatus); + else + responseLine.error ("unexpected redirect for method "~method.name); + default: + break; + } + + // return the input buffer + return input; + } + + /*********************************************************************** + + Read the content from the returning input stream, up to a + maximum length, and pass content to the given sink delegate + as it arrives. + + Exits when length bytes have been processed, or an Eof is + seen on the stream. + + ***********************************************************************/ + + void read (void delegate (void[]) sink, long len = long.max) + { + while (len > 0) + { + auto content = input.slice; + if ((len -= content.length) < 0) + { + content = content [0 .. $ + cast(size_t) len]; + sink (content); + input.skip (content.length); + } + else + { + sink (content); + input.clear; + if (input.fill(input.input) is socket.Eof) + break; + } + } + } + + /*********************************************************************** + + Handle redirection of Post + + Guidance for the default behaviour came from this page: + http://ppewww.ph.gla.ac.uk/~flavell/www/post-redirect.html + + ***********************************************************************/ + + IBuffer redirectPost (Pump pump, IBuffer input, int status) + { + switch (status) + { + // use Get method to complete the Post + case HttpResponseCode.SeeOther: + case HttpResponseCode.MovedTemporarily: + + // remove POST headers first! + headersOut.remove (HttpHeader.ContentLength); + headersOut.remove (HttpHeader.ContentType); + paramsOut.reset; + return open (Get, null, input); + + // try entire Post again, if user say OK + case HttpResponseCode.MovedPermanently: + case HttpResponseCode.TemporaryRedirect: + if (canRepost (status)) + return open (this.method, pump, input); + // fall through! + + default: + responseLine.error ("Illegal redirection of Post"); + } + return null; + } + + /*********************************************************************** + + Handle user-notification of Post redirection. This should + be overridden appropriately. + + Guidance for the default behaviour came from this page: + http://ppewww.ph.gla.ac.uk/~flavell/www/post-redirect.html + + ***********************************************************************/ + + bool canRepost (uint status) + { + return false; + } +} + + +/****************************************************************************** + + Class to represent an HTTP response-line + +******************************************************************************/ + +private class ResponseLine : HttpTriplet +{ + private char[] vers, + reason; + private int status; + + /********************************************************************** + + test the validity of these tokens + + **********************************************************************/ + + void test () + { + vers = tokens[0]; + reason = tokens[2]; + status = cast(int) Integer.convert (tokens[1]); + if (status is 0) + { + status = cast(int) Integer.convert (tokens[2]); + if (status is 0) + error ("Invalid HTTP response: '"~tokens[0]~"' '"~tokens[1]~"' '" ~tokens[2] ~"'"); + } + } + + /********************************************************************** + + Return HTTP version + + **********************************************************************/ + + char[] getVersion () + { + return vers; + } + + /********************************************************************** + + Return reason text + + **********************************************************************/ + + char[] getReason () + { + return reason; + } + + /********************************************************************** + + Return status integer + + **********************************************************************/ + + int getStatus () + { + return status; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/http/HttpConst.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/http/HttpConst.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,218 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: April 2004 + + author: Kris + +*******************************************************************************/ + +module tango.net.http.HttpConst; + +/******************************************************************************* + + Constants + +*******************************************************************************/ + +struct HttpConst +{ + const char[] Eol = "\r\n"; +} + +/******************************************************************************* + + Headers are distinct types in their own right. This is because they + are somewhat optimized via a trailing ':' character. + +*******************************************************************************/ + +struct HttpHeaderName +{ + final char[] value; +} + +/******************************************************************************* + + Define the traditional set of HTTP header names + +*******************************************************************************/ + +struct HttpHeader +{ + // size of both the request & response buffer (per thread) + const int IOBufferSize = 16 * 1024; + + // maximum length for POST parameters (to avoid DOS ...) + const int MaxPostParamSize = 4 * 1024; + + const HttpHeaderName Version = {"HTTP/1.0"}; + const HttpHeaderName TextHtml = {"text/html"}; + + const HttpHeaderName Accept = {"Accept:"}; + const HttpHeaderName AcceptCharset = {"Accept-Charset:"}; + const HttpHeaderName AcceptEncoding = {"Accept-Encoding:"}; + const HttpHeaderName AcceptLanguage = {"Accept-Language:"}; + const HttpHeaderName AcceptRanges = {"Accept-Ranges:"}; + const HttpHeaderName Age = {"Age:"}; + const HttpHeaderName Allow = {"Allow:"}; + const HttpHeaderName Authorization = {"Authorization:"}; + const HttpHeaderName CacheControl = {"Cache-Control:"}; + const HttpHeaderName Connection = {"Connection:"}; + const HttpHeaderName ContentEncoding = {"Content-Encoding:"}; + const HttpHeaderName ContentLanguage = {"Content-Language:"}; + const HttpHeaderName ContentLength = {"Content-Length:"}; + const HttpHeaderName ContentLocation = {"Content-Location:"}; + const HttpHeaderName ContentRange = {"Content-Range:"}; + const HttpHeaderName ContentType = {"Content-Type:"}; + const HttpHeaderName Cookie = {"Cookie:"}; + const HttpHeaderName Date = {"Date:"}; + const HttpHeaderName ETag = {"ETag:"}; + const HttpHeaderName Expect = {"Expect:"}; + const HttpHeaderName Expires = {"Expires:"}; + const HttpHeaderName From = {"From:"}; + const HttpHeaderName Host = {"Host:"}; + const HttpHeaderName Identity = {"Identity:"}; + const HttpHeaderName IfMatch = {"If-Match:"}; + const HttpHeaderName IfModifiedSince = {"If-Modified-Since:"}; + const HttpHeaderName IfNoneMatch = {"If-None-Match:"}; + const HttpHeaderName IfRange = {"If-Range:"}; + const HttpHeaderName IfUnmodifiedSince = {"If-Unmodified-Since:"}; + const HttpHeaderName LastModified = {"Last-Modified:"}; + const HttpHeaderName Location = {"Location:"}; + const HttpHeaderName MaxForwards = {"Max-Forwards:"}; + const HttpHeaderName MimeVersion = {"MIME-Version:"}; + const HttpHeaderName Pragma = {"Pragma:"}; + const HttpHeaderName ProxyAuthenticate = {"Proxy-Authenticate:"}; + const HttpHeaderName ProxyConnection = {"Proxy-Connection:"}; + const HttpHeaderName Range = {"Range:"}; + const HttpHeaderName Referrer = {"Referer:"}; + const HttpHeaderName RetryAfter = {"Retry-After:"}; + const HttpHeaderName Server = {"Server:"}; + const HttpHeaderName ServletEngine = {"Servlet-Engine:"}; + const HttpHeaderName SetCookie = {"Set-Cookie:"}; + const HttpHeaderName SetCookie2 = {"Set-Cookie2:"}; + const HttpHeaderName TE = {"TE:"}; + const HttpHeaderName Trailer = {"Trailer:"}; + const HttpHeaderName TransferEncoding = {"Transfer-Encoding:"}; + const HttpHeaderName Upgrade = {"Upgrade:"}; + const HttpHeaderName UserAgent = {"User-Agent:"}; + const HttpHeaderName Vary = {"Vary:"}; + const HttpHeaderName Warning = {"Warning:"}; + const HttpHeaderName WwwAuthenticate = {"WWW-Authenticate:"}; +} + + +/******************************************************************************* + + Declare the traditional set of HTTP response codes + +*******************************************************************************/ + +enum HttpResponseCode +{ + Continue = 100, + SwitchingProtocols = 101, + OK = 200, + Created = 201, + Accepted = 202, + NonAuthoritativeInformation = 203, + NoContent = 204, + ResetContent = 205, + PartialContent = 206, + MultipleChoices = 300, + MovedPermanently = 301, + MovedTemporarily = 302, + SeeOther = 303, + NotModified = 304, + UseProxy = 305, + TemporaryRedirect = 307, + BadRequest = 400, + Unauthorized = 401, + PaymentRequired = 402, + Forbidden = 403, + NotFound = 404, + MethodNotAllowed = 405, + NotAcceptable = 406, + ProxyAuthenticationRequired = 407, + RequestTimeout = 408, + Conflict = 409, + Gone = 410, + LengthRequired = 411, + PreconditionFailed = 412, + RequestEntityTooLarge = 413, + RequestURITooLarge = 414, + UnsupportedMediaType = 415, + RequestedRangeNotSatisfiable = 416, + ExpectationFailed = 417, + InternalServerError = 500, + NotImplemented = 501, + BadGateway = 502, + ServiceUnavailable = 503, + GatewayTimeout = 504, + VersionNotSupported = 505, +}; + +/******************************************************************************* + + Status is a compound type, with a name and a code. + +*******************************************************************************/ + +struct HttpStatus +{ + final int code; + final char[] name; +} + +/******************************************************************************* + + Declare the traditional set of HTTP responses + +*******************************************************************************/ + +struct HttpResponses +{ + static HttpStatus Continue = {HttpResponseCode.Continue, "Continue"}; + static HttpStatus SwitchingProtocols = {HttpResponseCode.SwitchingProtocols, "SwitchingProtocols"}; + static HttpStatus OK = {HttpResponseCode.OK, "OK"}; + static HttpStatus Created = {HttpResponseCode.Created, "Created"}; + static HttpStatus Accepted = {HttpResponseCode.Accepted, "Accepted"}; + static HttpStatus NonAuthoritativeInformation = {HttpResponseCode.NonAuthoritativeInformation, "NonAuthoritativeInformation"}; + static HttpStatus NoContent = {HttpResponseCode.NoContent, "NoContent"}; + static HttpStatus ResetContent = {HttpResponseCode.ResetContent, "ResetContent"}; + static HttpStatus PartialContent = {HttpResponseCode.PartialContent, "PartialContent"}; + static HttpStatus MultipleChoices = {HttpResponseCode.MultipleChoices, "MultipleChoices"}; + static HttpStatus MovedPermanently = {HttpResponseCode.MovedPermanently, "MovedPermanently"}; + static HttpStatus MovedTemporarily = {HttpResponseCode.MovedTemporarily, "MovedTemporarily"}; + static HttpStatus SeeOther = {HttpResponseCode.SeeOther, "SeeOther"}; + static HttpStatus NotModified = {HttpResponseCode.NotModified, "NotModified"}; + static HttpStatus UseProxy = {HttpResponseCode.UseProxy, "UseProxy"}; + static HttpStatus BadRequest = {HttpResponseCode.BadRequest, "BadRequest"}; + static HttpStatus Unauthorized = {HttpResponseCode.Unauthorized, "Unauthorized"}; + static HttpStatus PaymentRequired = {HttpResponseCode.PaymentRequired, "PaymentRequired"}; + static HttpStatus Forbidden = {HttpResponseCode.Forbidden, "Forbidden"}; + static HttpStatus NotFound = {HttpResponseCode.NotFound, "NotFound"}; + static HttpStatus MethodNotAllowed = {HttpResponseCode.MethodNotAllowed, "MethodNotAllowed"}; + static HttpStatus NotAcceptable = {HttpResponseCode.NotAcceptable, "NotAcceptable"}; + static HttpStatus ProxyAuthenticationRequired = {HttpResponseCode.ProxyAuthenticationRequired, "ProxyAuthenticationRequired"}; + static HttpStatus RequestTimeout = {HttpResponseCode.RequestTimeout, "RequestTimeout"}; + static HttpStatus Conflict = {HttpResponseCode.Conflict, "Conflict"}; + static HttpStatus Gone = {HttpResponseCode.Gone, "Gone"}; + static HttpStatus LengthRequired = {HttpResponseCode.LengthRequired, "LengthRequired"}; + static HttpStatus PreconditionFailed = {HttpResponseCode.PreconditionFailed, "PreconditionFailed"}; + static HttpStatus RequestEntityTooLarge = {HttpResponseCode.RequestEntityTooLarge, "RequestEntityTooLarge"}; + static HttpStatus RequestURITooLarge = {HttpResponseCode.RequestURITooLarge, "RequestURITooLarge"}; + static HttpStatus UnsupportedMediaType = {HttpResponseCode.UnsupportedMediaType, "UnsupportedMediaType"}; + static HttpStatus RequestedRangeNotSatisfiable = {HttpResponseCode.RequestedRangeNotSatisfiable, "RequestedRangeNotSatisfiable"}; + static HttpStatus ExpectationFailed = {HttpResponseCode.ExpectationFailed, "ExpectationFailed"}; + static HttpStatus InternalServerError = {HttpResponseCode.InternalServerError, "InternalServerError"}; + static HttpStatus NotImplemented = {HttpResponseCode.NotImplemented, "NotImplemented"}; + static HttpStatus BadGateway = {HttpResponseCode.BadGateway, "BadGateway"}; + static HttpStatus ServiceUnavailable = {HttpResponseCode.ServiceUnavailable, "ServiceUnavailable"}; + static HttpStatus GatewayTimeout = {HttpResponseCode.GatewayTimeout, "GatewayTimeout"}; + static HttpStatus VersionNotSupported = {HttpResponseCode.VersionNotSupported, "VersionNotSupported"}; +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/http/HttpCookies.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/http/HttpCookies.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,649 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: April 2004 + + author: Kris + +*******************************************************************************/ + +module tango.net.http.HttpCookies; + +private import tango.io.Buffer; + +private import tango.stdc.ctype; + +private import tango.net.http.HttpHeaders; + +private import tango.io.protocol.model.IWriter; + +private import tango.text.stream.StreamIterator; + +private import Integer = tango.text.convert.Integer; + +/******************************************************************************* + + Defines the Cookie class, and the means for reading & writing them. + Cookie implementation conforms with RFC 2109, but supports parsing + of server-side cookies only. Client-side cookies are supported in + terms of output, but response parsing is not yet implemented ... + + See over here + for the RFC document. + +*******************************************************************************/ + +class Cookie : IWritable +{ + private char[] name, + path, + value, + domain, + comment; + private uint vrsn=1; // 'version' is a reserved word + private long maxAge; + private bool secure; + + /*********************************************************************** + + Construct an empty client-side cookie. You add these + to an output request using HttpClient.addCookie(), or + the equivalent. + + ***********************************************************************/ + + this () {} + + /*********************************************************************** + + Construct a cookie with the provided attributes. You add + these to an output request using HttpClient.addCookie(), + or the equivalent. + + ***********************************************************************/ + + this (char[] name, char[] value) + { + setName (name); + setValue (value); + } + + /*********************************************************************** + + Set the name of this cookie + + ***********************************************************************/ + + void setName (char[] name) + { + this.name = name; + } + + /*********************************************************************** + + Set the value of this cookie + + ***********************************************************************/ + + void setValue (char[] value) + { + this.value = value; + } + + /*********************************************************************** + + Set the version of this cookie + + ***********************************************************************/ + + void setVersion (uint vrsn) + { + this.vrsn = vrsn; + } + + /*********************************************************************** + + Set the path of this cookie + + ***********************************************************************/ + + void setPath (char[] path) + { + this.path = path; + } + + /*********************************************************************** + + Set the domain of this cookie + + ***********************************************************************/ + + void setDomain (char[] domain) + { + this.domain = domain; + } + + /*********************************************************************** + + Set the comment associated with this cookie + + ***********************************************************************/ + + void setComment (char[] comment) + { + this.comment = comment; + } + + /*********************************************************************** + + Set the maximum duration of this cookie + + ***********************************************************************/ + + void setMaxAge (long maxAge) + { + this.maxAge = maxAge; + } + + /*********************************************************************** + + Indicate wether this cookie should be considered secure or not + + ***********************************************************************/ + + void setSecure (bool secure) + { + this.secure = secure; + } + + /*********************************************************************** + + Output the cookie as a text stream, via the provided IWriter + + ***********************************************************************/ + + void write (IWriter writer) + { + produce (&writer.buffer.consume); + } + + /*********************************************************************** + + Output the cookie as a text stream, via the provided consumer + + ***********************************************************************/ + + void produce (void delegate(void[]) consume) + { + consume (name); + + if (value.length) + consume ("="), consume (value); + + if (path.length) + consume (";Path="), consume (path); + + if (domain.length) + consume (";Domain="), consume (domain); + + if (vrsn) + { + char[16] tmp = void; + + consume (";Version="); + consume (Integer.format (tmp, vrsn)); + + if (comment.length) + consume (";Comment=\""), consume(comment), consume("\""); + + if (secure) + consume (";Secure"); + + if (maxAge >= 0) + consume (";Max-Age="c), consume (Integer.format (tmp, maxAge)); + } + } + + /*********************************************************************** + + Reset this cookie + + ***********************************************************************/ + + void clear () + { + vrsn = 1; + maxAge = 0; + secure = false; + name = path = domain = comment = null; + } +} + + + +/******************************************************************************* + + Implements a stack of cookies. Each cookie is pushed onto the + stack by a parser, which takes its input from HttpHeaders. The + stack can be populated for both client and server side cookies. + +*******************************************************************************/ + +class CookieStack +{ + private int depth; + private Cookie[] cookies; + + /********************************************************************** + + Construct a cookie stack with the specified initial extent. + The stack will grow as necessary over time. + + **********************************************************************/ + + this (int size) + { + cookies = new Cookie[0]; + resize (cookies, size); + } + + /********************************************************************** + + Pop the stack all the way to zero + + **********************************************************************/ + + final void reset () + { + depth = 0; + } + + /********************************************************************** + + Return a fresh cookie from the stack + + **********************************************************************/ + + final Cookie push () + { + if (depth == cookies.length) + resize (cookies, depth * 2); + return cookies [depth++]; + } + + /********************************************************************** + + Resize the stack such that it has more room. + + **********************************************************************/ + + private final static void resize (inout Cookie[] cookies, int size) + { + int i = cookies.length; + + for (cookies.length=size; i < cookies.length; ++i) + cookies[i] = new Cookie(); + } + + /********************************************************************** + + Iterate over all cookies in stack + + **********************************************************************/ + + int opApply (int delegate(inout Cookie) dg) + { + int result = 0; + + for (int i=0; i < depth; ++i) + if ((result = dg (cookies[i])) != 0) + break; + return result; + } +} + + + +/******************************************************************************* + + This is the support point for server-side cookies. It wraps a + CookieStack together with a set of HttpHeaders, along with the + appropriate cookie parser. One would do something very similar + for client side cookie parsing also. + +*******************************************************************************/ + +class HttpCookiesView : IWritable +{ + private bool parsed; + private CookieStack stack; + private CookieParser parser; + private HttpHeadersView headers; + + /********************************************************************** + + Construct cookie wrapper with the provided headers. + + **********************************************************************/ + + this (HttpHeadersView headers) + { + this.headers = headers; + + // create a stack for parsed cookies + stack = new CookieStack (10); + + // create a parser + parser = new CookieParser (stack); + } + + /********************************************************************** + + Output each of the cookies parsed to the provided IWriter. + + **********************************************************************/ + + void write (IWriter writer) + { + produce (&writer.buffer.consume, HttpConst.Eol); + } + + /********************************************************************** + + Output the token list to the provided consumer + + **********************************************************************/ + + void produce (void delegate (void[]) consume, char[] eol = HttpConst.Eol) + { + foreach (cookie; parse) + cookie.produce (consume), consume (eol); + } + + /********************************************************************** + + Reset these cookies for another parse + + **********************************************************************/ + + void reset () + { + stack.reset; + parsed = false; + } + + /********************************************************************** + + Parse all cookies from our HttpHeaders, pushing each onto + the CookieStack as we go. + + **********************************************************************/ + + CookieStack parse () + { + if (! parsed) + { + parsed = true; + + foreach (HeaderElement header; headers) + if (header.name.value == HttpHeader.Cookie.value) + parser.parse (header.value); + } + return stack; + } +} + + + +/******************************************************************************* + + Handles a set of output cookies by writing them into the list of + output headers. + +*******************************************************************************/ + +class HttpCookies +{ + private HttpHeaders headers; + + /********************************************************************** + + Construct an output cookie wrapper upon the provided + output headers. Each cookie added is converted to an + addition to those headers. + + **********************************************************************/ + + this (HttpHeaders headers) + { + this.headers = headers; + } + + /********************************************************************** + + Add a cookie to our output headers. + + **********************************************************************/ + + void add (Cookie cookie) + { + // add the cookie header via our callback + headers.add (HttpHeader.SetCookie, (IBuffer buf){cookie.produce (&buf.consume);}); + } +} + + + +/******************************************************************************* + + Server-side cookie parser. See RFC 2109 for details. + +*******************************************************************************/ + +class CookieParser : StreamIterator!(char) +{ + private enum State {Begin, LValue, Equals, RValue, Token, SQuote, DQuote}; + + private CookieStack stack; + private Buffer buffer; + + /*********************************************************************** + + ***********************************************************************/ + + this (CookieStack stack) + { + super(); + this.stack = stack; + buffer = new Buffer; + } + + /*********************************************************************** + + Callback for iterator.next(). We scan for name-value + pairs, populating Cookie instances along the way. + + ***********************************************************************/ + + protected uint scan (void[] data) + { + char c; + int mark, + vrsn; + char[] name, + token; + Cookie cookie; + + State state = State.Begin; + char[] content = cast(char[]) data; + + /*************************************************************** + + Found a value; set that also + + ***************************************************************/ + + void setValue (int i) + { + token = content [mark..i]; + //Print ("::name '%.*s'\n", name); + //Print ("::value '%.*s'\n", token); + + if (name[0] != '$') + { + cookie = stack.push(); + cookie.setName (name); + cookie.setValue (token); + cookie.setVersion (vrsn); + } + else + switch (toLower (name)) + { + case "$path": + if (cookie) + cookie.setPath (token); + break; + + case "$domain": + if (cookie) + cookie.setDomain (token); + break; + + case "$version": + vrsn = cast(int) Integer.parse (token); + break; + + default: + break; + } + state = State.Begin; + } + + /*************************************************************** + + Scan content looking for cookie fields + + ***************************************************************/ + + for (int i; i < content.length; ++i) + { + c = content [i]; + switch (state) + { + // look for an lValue + case State.Begin: + mark = i; + if (isalpha (c) || c is '$') + state = State.LValue; + continue; + + // scan until we have all lValue chars + case State.LValue: + if (! isalnum (c)) + { + state = State.Equals; + name = content [mark..i]; + --i; + } + continue; + + // should now have either a '=', ';', or ',' + case State.Equals: + if (c is '=') + state = State.RValue; + else + if (c is ',' || c is ';') + // get next NVPair + state = State.Begin; + continue; + + // look for a quoted token, or a plain one + case State.RValue: + mark = i; + if (c is '\'') + state = State.SQuote; + else + if (c is '"') + state = State.DQuote; + else + if (isalpha (c)) + state = State.Token; + continue; + + // scan for all plain token chars + case State.Token: + if (! isalnum (c)) + { + setValue (i); + --i; + } + continue; + + // scan until the next ' + case State.SQuote: + if (c is '\'') + ++mark, setValue (i); + continue; + + // scan until the next " + case State.DQuote: + if (c is '"') + ++mark, setValue (i); + continue; + + default: + continue; + } + } + + // we ran out of content; patch partial cookie values + if (state is State.Token) + setValue (content.length); + + // go home + return IConduit.Eof; + } + + /*********************************************************************** + + Locate the next token from the provided buffer, and map a + buffer reference into token. Returns true if a token was + located, false otherwise. + + Note that the buffer content is not duplicated. Instead, a + slice of the buffer is referenced by the token. You can use + Token.clone() or Token.toString().dup() to copy content per + your application needs. + + Note also that there may still be one token left in a buffer + that was not terminated correctly (as in eof conditions). In + such cases, tokens are mapped onto remaining content and the + buffer will have no more readable content. + + ***********************************************************************/ + + bool parse (char[] header) + { + super.set (buffer.setContent (header)); + return next.ptr > null; + } + + /********************************************************************** + + in-place conversion to lowercase + + **********************************************************************/ + + final static char[] toLower (inout char[] src) + { + foreach (int i, char c; src) + if (c >= 'A' && c <= 'Z') + src[i] = c + ('a' - 'A'); + return src; + } +} + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/http/HttpGet.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/http/HttpGet.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,82 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: January 2006 + + author: Kris + +*******************************************************************************/ + +module tango.net.http.HttpGet; + +public import tango.net.Uri; + +private import tango.io.GrowBuffer; + +private import tango.net.http.HttpClient, + tango.net.http.HttpHeaders; + +/******************************************************************************* + + Supports the basic needs of a client making requests of an HTTP + server. The following is a usage example: + --- + // open a web-page for reading (see HttpPost for writing) + auto page = new HttpGet ("http://www.digitalmars.com/d/intro.html"); + + // retrieve and flush display content + Cout (cast(char[]) page.read) (); + --- + +*******************************************************************************/ + +class HttpGet : HttpClient +{ + private GrowBuffer buffer; + + /*********************************************************************** + + Create a client for the given URL. The argument should be + fully qualified with an "http:" or "https:" scheme, or an + explicit port should be provided. + + ***********************************************************************/ + + this (char[] url, uint pageChunk = 16 * 1024) + { + this (new Uri(url), pageChunk); + } + + /*********************************************************************** + + Create a client with the provided Uri instance. The Uri should + be fully qualified with an "http:" or "https:" scheme, or an + explicit port should be provided. + + ***********************************************************************/ + + this (Uri uri, uint pageChunk = 16 * 1024) + { + super (HttpClient.Get, uri); + buffer = new GrowBuffer (pageChunk, pageChunk); + } + + /*********************************************************************** + + ***********************************************************************/ + + void[] read () + { + try { + buffer.clear; + open (buffer); + if (isResponseOK) + buffer.fill (getResponseHeaders.getInt(HttpHeader.ContentLength, uint.max)); + } finally {close;} + return buffer.slice; + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/http/HttpHeaders.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/http/HttpHeaders.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,340 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: April 2004 + + author: Kris + +*******************************************************************************/ + +module tango.net.http.HttpHeaders; + +private import tango.time.Time; + +private import tango.io.model.IBuffer; + +public import tango.net.http.HttpConst; + +private import tango.net.http.HttpTokens; + +private import tango.text.stream.LineIterator; + +/****************************************************************************** + + Exposes freachable HttpHeader instances + +******************************************************************************/ + +struct HeaderElement +{ + HttpHeaderName name; + char[] value; +} + +/****************************************************************************** + + Maintains a set of input headers. These are placed into an input + buffer and indexed via a HttpStack. + +******************************************************************************/ + +class HttpHeadersView : HttpTokens +{ + // tell compiler to used super.parse() also + alias HttpTokens.parse parse; + + private LineIterator!(char) line; + + /********************************************************************** + + Construct this set of headers, using a HttpStack based + upon a ':' delimiter + + **********************************************************************/ + + this () + { + // separator is a ':', and specify we want it included as + // part of the name whilst iterating + super (':', true); + + // construct a line tokenizer for later usage + line = new LineIterator!(char); + } + + /********************************************************************** + + Clone a source set of HttpHeaders + + **********************************************************************/ + + this (HttpHeadersView source) + { + super (source); + } + + /********************************************************************** + + Clone this set of HttpHeadersView + + **********************************************************************/ + + HttpHeadersView clone () + { + return new HttpHeadersView (this); + } + + /********************************************************************** + + Read all header lines. Everything is mapped rather + than being allocated & copied + + **********************************************************************/ + + void parse (IBuffer input) + { + setParsed (true); + line.set (input); + + while (line.next && line.get.length) + stack.push (line.get); + } + + /********************************************************************** + + Return the value of the provided header, or null if the + header does not exist + + **********************************************************************/ + + char[] get (HttpHeaderName name, char[] def = null) + { + return super.get (name.value, def); + } + + /********************************************************************** + + Return the integer value of the provided header, or -1 + if the header does not exist + + **********************************************************************/ + + int getInt (HttpHeaderName name, int def = -1) + { + return super.getInt (name.value, def); + } + + /********************************************************************** + + Return the date value of the provided header, or Time.epoch + if the header does not exist + + **********************************************************************/ + + Time getDate (HttpHeaderName name, Time def = Time.epoch) + { + return super.getDate (name.value, def); + } + + /********************************************************************** + + Iterate over the set of headers. This is a shell around + the superclass, where we can convert the HttpToken into + a HeaderElement instead. + + **********************************************************************/ + + int opApply (int delegate(inout HeaderElement) dg) + { + HeaderElement element; + int result = 0; + + foreach (HttpToken token; super) + { + element.name.value = token.name; + element.value = token.value; + result = dg (element); + if (result) + break; + } + return result; + } + + /********************************************************************** + + Create a filter for iterating of a set of named headers. + We have to create a filter since we can't pass additional + arguments directly to an opApply() method. + + **********************************************************************/ + + FilteredHeaders createFilter (HttpHeaderName header) + { + return new FilteredHeaders (this, header); + } + + /********************************************************************** + + Filter class for isolating a set of named headers. + + **********************************************************************/ + + private static class FilteredHeaders : FilteredTokens + { + /************************************************************** + + Construct a filter upon the specified headers, for + the given header name. + + **************************************************************/ + + this (HttpHeadersView headers, HttpHeaderName header) + { + super (headers, header.value); + } + + /************************************************************** + + Iterate over all headers matching the given name. + This wraps the HttpToken iterator to convert the + output into a HeaderElement instead. + + **************************************************************/ + + int opApply (int delegate(inout HeaderElement) dg) + { + HeaderElement element; + int result = 0; + + foreach (HttpToken token; super) + { + element.name.value = token.name; + element.value = token.value; + result = dg (element); + if (result) + break; + } + return result; + } + + } +} + + +/****************************************************************************** + + Maintains a set of output headers. These are held in an output + buffer, and indexed via a HttpStack. Deleting a header could be + supported by setting the HttpStack entry to null, and ignoring + such values when it's time to write the headers. + +******************************************************************************/ + +class HttpHeaders : HttpHeadersView +{ + /********************************************************************** + + Construct output headers, using the provided buffer as + a place to stash the header content. + + **********************************************************************/ + + this (IBuffer output) + { + super (); + super.setOutputBuffer (output); + } + + /********************************************************************** + + Clone a source set of HttpHeaders + + **********************************************************************/ + + this (HttpHeaders source) + { + super (source); + } + + /********************************************************************** + + Clone this set of HttpHeaders + + **********************************************************************/ + + HttpHeaders clone () + { + return new HttpHeaders (this); + } + + /********************************************************************** + + Add the specified header, and use a callback to provide + the content. + + **********************************************************************/ + + void add (HttpHeaderName name, void delegate (IBuffer) dg) + { + super.add (name.value, dg); + } + + /********************************************************************** + + Add the specified header and text + + **********************************************************************/ + + void add (HttpHeaderName name, char[] value) + { + super.add (name.value, value); + } + + /********************************************************************** + + Add the specified header and integer value + + **********************************************************************/ + + void addInt (HttpHeaderName name, int value) + { + super.addInt (name.value, value); + } + + /********************************************************************** + + Add the specified header and long/date value + + **********************************************************************/ + + void addDate (HttpHeaderName name, Time value) + { + super.addDate (name.value, value); + } + + /********************************************************************** + + Remove the specified header header. Returns false if not + found. + + **********************************************************************/ + + bool remove (HttpHeaderName name) + { + return super.remove (name.value); + } + + /********************************************************************** + + Return the output buffer provided during construction. + + **********************************************************************/ + + IBuffer getOutputBuffer () + { + return super.getOutputBuffer (); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/http/HttpParams.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/http/HttpParams.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,181 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: April 2004 + + author: Kris + +*******************************************************************************/ + +module tango.net.http.HttpParams; + +private import tango.time.Time; + +private import tango.io.model.IBuffer; + +private import tango.net.http.HttpTokens; + +private import tango.io.protocol.model.IWriter; + +private import tango.text.stream.SimpleIterator; + +public import tango.net.http.model.HttpParamsView; + +/****************************************************************************** + + Maintains a set of query parameters, parsed from an HTTP request. + Use HttpParams instead for output parameters. + + Note that these input params may have been encoded by the user- + agent. Unfortunately there has been little consensus on what that + encoding should be (especially regarding GET query-params). With + luck, that will change to a consistent usage of UTF-8 within the + near future. + +******************************************************************************/ + +class HttpParams : HttpTokens, HttpParamsView +{ + // tell compiler to expose super.parse() also + alias HttpTokens.parse parse; + + private SimpleIterator!(char) amp; + + /********************************************************************** + + Construct parameters by telling the HttpStack that + name/value pairs are seperated by a '=' character. + + **********************************************************************/ + + this () + { + super ('='); + + // construct a line tokenizer for later usage + amp = new SimpleIterator!(char) ("&"); + } + + /********************************************************************** + + Construct output params upon the provided IBuffer + + **********************************************************************/ + + this (IBuffer output) + { + this(); + setOutputBuffer (output); + } + + /********************************************************************** + + Read all query parameters. Everything is mapped rather + than being allocated & copied + + **********************************************************************/ + + void parse (IBuffer input) + { + setParsed (true); + amp.set (input); + + while (amp.next || amp.get.length) + stack.push (amp.get); + } + + /********************************************************************** + + Add a name/value pair to the query list + + **********************************************************************/ + + void add (char[] name, char[] value) + { + super.add (name, value); + } + + /********************************************************************** + + Add a name/integer pair to the query list + + **********************************************************************/ + + void addInt (char[] name, int value) + { + super.addInt (name, value); + } + + + /********************************************************************** + + Add a name/date(long) pair to the query list + + **********************************************************************/ + + void addDate (char[] name, Time value) + { + super.addDate (name, value); + } + + /********************************************************************** + + Return the value of the provided header, or null if the + header does not exist + + **********************************************************************/ + + char[] get (char[] name, char[] ret = null) + { + return super.get (name, ret); + } + + /********************************************************************** + + Return the integer value of the provided header, or the + provided default-value if the header does not exist + + **********************************************************************/ + + int getInt (char[] name, int ret = -1) + { + return super.getInt (name, ret); + } + + /********************************************************************** + + Return the date value of the provided header, or the + provided default-value if the header does not exist + + **********************************************************************/ + + Time getDate (char[] name, Time ret = Time.epoch) + { + return super.getDate (name, ret); + } + + /********************************************************************** + + Output the token list to the provided writer + + **********************************************************************/ + + void write (IWriter writer) + { + super.write (writer); + } + + /********************************************************************** + + Output the param list to the provided consumer + + **********************************************************************/ + + void produce (void delegate (void[]) consume, char[] eol) + { + super.produce (consume, eol); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/http/HttpPost.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/http/HttpPost.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,122 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: January 2006 + + author: Kris + +*******************************************************************************/ + +module tango.net.http.HttpPost; + +public import tango.net.Uri; + +private import tango.io.GrowBuffer; + +private import tango.net.http.HttpClient, + tango.net.http.HttpHeaders; + +/******************************************************************************* + + Supports the basic needs of a client sending POST requests to a + HTTP server. The following is a usage example: + + --- + // open a web-page for posting (see HttpGet for simple reading) + auto post = new HttpPost ("http://yourhost/yourpath"); + + // send, retrieve and display response + Cout (cast(char[]) post.write("posted data", "text/plain")); + --- + +*******************************************************************************/ + +class HttpPost : HttpClient +{ + private GrowBuffer buffer; + + /*********************************************************************** + + Create a client for the given URL. The argument should be + fully qualified with an "http:" or "https:" scheme, or an + explicit port should be provided. + + ***********************************************************************/ + + this (char[] url, uint pageChunk = 16 * 1024) + { + this (new Uri(url), pageChunk); + } + + /*********************************************************************** + + Create a client with the provided Uri instance. The Uri should + be fully qualified with an "http:" or "https:" scheme, or an + explicit port should be provided. + + ***********************************************************************/ + + this (Uri uri, uint pageChunk = 16 * 1024) + { + super (HttpClient.Post, uri); + buffer = new GrowBuffer (pageChunk, pageChunk); + } + + /*********************************************************************** + + Send query params only + + ***********************************************************************/ + + void[] write () + { + return write (null); + } + + /*********************************************************************** + + Send content and no query params. The contentLength header + will be set to match the provided content, and contentType + set to the given type. + + ***********************************************************************/ + + void[] write (void[] content, char[] type) + { + auto headers = getRequestHeaders(); + + headers.add (HttpHeader.ContentType, type); + headers.addInt (HttpHeader.ContentLength, content.length); + + return write (delegate void (IBuffer b){b.append(content);}); + } + + /*********************************************************************** + + Send raw data via the provided pump, and no query + params. You have full control over headers and so + on via this method. + + ***********************************************************************/ + + void[] write (Pump pump) + { + try { + buffer.clear; + open (pump, buffer); + + // check return status for validity + auto status = getStatus(); + if (status is HttpResponseCode.OK || + status is HttpResponseCode.Created || + status is HttpResponseCode.Accepted) + buffer.fill (getResponseHeaders.getInt (HttpHeader.ContentLength, uint.max)); + } finally {close;} + + return buffer.slice; + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/http/HttpStack.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/http/HttpStack.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,278 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: April 2004 + + author: Kris, John Reimer + +*******************************************************************************/ + +module tango.net.http.HttpStack; + +private import tango.core.Exception; + +/****************************************************************************** + + Unix doesn't appear to have a memicmp() ... JJR notes that the + strncasecmp() is available instead. + +******************************************************************************/ + +version (Win32) + { + extern (C) int memicmp (char *, char *, uint); + } + +version (Posix) + { + extern (C) int strncasecmp (char *, char*, uint); + } + +extern (C) void* memmove (void* dst, void* src, int n); + + +/****************************************************************************** + + Internal representation of a token + +******************************************************************************/ + +class Token +{ + private char[] value; + + Token set (char[] value) + { + this.value = value; + return this; + } + + char[] toString () + { + return value; + } +} + +/****************************************************************************** + + A stack of Tokens, used for capturing http headers. The tokens + themselves are typically mapped onto the content of a Buffer, + or some other external content, so there's minimal allocation + involved (typically zero). + +******************************************************************************/ + +class HttpStack +{ + private int depth; + private Token[] tokens; + + private static const int MaxHttpStackSize = 256; + + /********************************************************************** + + Construct a HttpStack with the specified initial size. + The stack will later be resized as necessary. + + **********************************************************************/ + + this (int size = 10) + { + tokens = new Token[0]; + resize (tokens, size); + } + + /********************************************************************** + + Clone this stack of tokens + + **********************************************************************/ + + HttpStack clone () + { + // setup a new HttpStack of the same depth + HttpStack clone = new HttpStack(depth); + + clone.depth = depth; + + // duplicate the content of each original token + for (int i=0; i < depth; ++i) + clone.tokens[i].set (tokens[i].toString().dup); + + return clone; + } + + /********************************************************************** + + Iterate over all tokens in stack + + **********************************************************************/ + + int opApply (int delegate(inout Token) dg) + { + int result = 0; + + for (int i=0; i < depth; ++i) + if ((result = dg (tokens[i])) != 0) + break; + return result; + } + + /********************************************************************** + + Pop the stack all the way back to zero + + **********************************************************************/ + + final void reset () + { + depth = 0; + } + + /********************************************************************** + + Scan the tokens looking for the first one with a matching + name. Returns the matching Token, or null if there is no + such match. + + **********************************************************************/ + + final Token findToken (char[] match) + { + Token tok; + + for (int i=0; i < depth; ++i) + { + tok = tokens[i]; + if (isMatch (tok, match)) + return tok; + } + return null; + } + + /********************************************************************** + + Scan the tokens looking for the first one with a matching + name, and remove it. Returns true if a match was found, or + false if not. + + **********************************************************************/ + + final bool removeToken (char[] match) + { + for (int i=0; i < depth; ++i) + if (isMatch (tokens[i], match)) + { + tokens[i].value = null; + return true; + } + return false; + } + + /********************************************************************** + + Return the current stack depth + + **********************************************************************/ + + final int size () + { + return depth; + } + + /********************************************************************** + + Push a new token onto the stack, and set it content to + that provided. Returns the new Token. + + **********************************************************************/ + + final Token push (char[] content) + { + return push().set (content); + } + + /********************************************************************** + + Push a new token onto the stack, and set it content to + be that of the specified token. Returns the new Token. + + **********************************************************************/ + + final Token push (inout Token token) + { + return push (token.toString()); + } + + /********************************************************************** + + Push a new token onto the stack, and return it. + + **********************************************************************/ + + final Token push () + { + if (depth == tokens.length) + resize (tokens, depth * 2); + return tokens[depth++]; + } + + /********************************************************************** + + Pop the stack by one. + + **********************************************************************/ + + final void pop () + { + if (depth) + --depth; + else + throw new IOException ("illegal attempt to pop Token stack"); + } + + /********************************************************************** + + See if the given token matches the specified text. The + two must match the minimal extent exactly. + + **********************************************************************/ + + final static bool isMatch (inout Token token, char[] match) + { + char[] target = token.toString(); + + int length = target.length; + if (length > match.length) + length = match.length; + + if (length is 0) + return false; + + version (Win32) + return memicmp (target.ptr, match.ptr, length) is 0; + version (Posix) + return strncasecmp (target.ptr, match.ptr, length) is 0; + } + + /********************************************************************** + + Resize this stack by extending the array. + + **********************************************************************/ + + final static void resize (inout Token[] tokens, int size) + { + int i = tokens.length; + + // this should *never* realistically happen + if (size > MaxHttpStackSize) + throw new IOException ("Token stack exceeds maximum depth"); + + for (tokens.length=size; i < tokens.length; ++i) + tokens[i] = new Token(); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/http/HttpTokens.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/http/HttpTokens.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,554 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: April 2004 + + author: Kris + +*******************************************************************************/ + +module tango.net.http.HttpTokens; + +private import tango.time.Time; + +private import tango.io.Buffer; + +private import tango.io.model.IBuffer; + +private import tango.net.http.HttpStack, + tango.net.http.HttpConst; + +private import Text = tango.text.Util; + +private import tango.io.protocol.model.IWriter; + +private import Integer = tango.text.convert.Integer; + +private import TimeStamp = tango.text.convert.TimeStamp; + +/****************************************************************************** + + Struct used to expose freachable HttpToken instances. + +******************************************************************************/ + +struct HttpToken +{ + char[] name, + value; +} + +/****************************************************************************** + + Maintains a set of HTTP tokens. These tokens include headers, query- + parameters, and anything else vaguely related. Both input and output + are supported, though a subclass may choose to expose as read-only. + + All tokens are mapped directly onto a buffer, so there is no memory + allocation or copying involved. + + Note that this class does not support deleting tokens, per se. Instead + it marks tokens as being 'unused' by setting content to null, avoiding + unwarranted reshaping of the token stack. The token stack is reused as + time goes on, so there's only minor runtime overhead. + +******************************************************************************/ + +class HttpTokens : IWritable +{ + protected HttpStack stack; + + private IBuffer input, + output; + private bool parsed; + private bool inclusive; + private char separator; + private char[1] sepString; + + /********************************************************************** + + Construct a set of tokens based upon the given delimiter, + and an indication of whether said delimiter should be + considered part of the left side (effectively the name). + + The latter is useful with headers, since the seperating + ':' character should really be considered part of the + name for purposes of subsequent token matching. + + **********************************************************************/ + + this (char separator, bool inclusive = false) + { + stack = new HttpStack; + + this.inclusive = inclusive; + this.separator = separator; + + // convert separator into a string, for later use + sepString[0] = separator; + + // pre-construct an empty buffer for wrapping char[] parsing + input = new Buffer; + } + + /********************************************************************** + + Clone a source set of HttpTokens + + **********************************************************************/ + + this (HttpTokens source) + { + stack = source.stack.clone; + input = null; + output = source.output; + parsed = true; + inclusive = source.inclusive; + separator = source.separator; + sepString[0] = source.sepString[0]; + } + + /********************************************************************** + + Read all tokens. Everything is mapped rather than being + allocated & copied + + **********************************************************************/ + + abstract void parse (IBuffer input); + + /********************************************************************** + + Parse an input string. + + **********************************************************************/ + + void parse (char[] content) + { + input.setContent (content); + parse (input); + } + + /********************************************************************** + + Reset this set of tokens. + + **********************************************************************/ + + HttpTokens reset () + { + stack.reset; + parsed = false; + + // reset output buffer, if it was configured + if (output) + output.clear; + + return this; + } + + /********************************************************************** + + Have tokens been parsed yet? + + **********************************************************************/ + + bool isParsed () + { + return parsed; + } + + /********************************************************************** + + Indicate whether tokens have been parsed or not. + + **********************************************************************/ + + void setParsed (bool parsed) + { + this.parsed = parsed; + } + + /********************************************************************** + + Return the value of the provided header, or null if the + header does not exist + + **********************************************************************/ + + char[] get (char[] name, char[] ret = null) + { + Token token = stack.findToken (name); + if (token) + { + HttpToken element; + + if (split (token, element)) + ret = trim (element.value); + } + return ret; + } + + /********************************************************************** + + Return the integer value of the provided header, or the + provided default-vaule if the header does not exist + + **********************************************************************/ + + int getInt (char[] name, int ret = -1) + { + char[] value = get (name); + + if (value.length) + ret = cast(int) Integer.parse (value); + + return ret; + } + + /********************************************************************** + + Return the date value of the provided header, or the + provided default-value if the header does not exist + + **********************************************************************/ + + Time getDate (char[] name, Time date = Time.epoch) + { + char[] value = get (name); + + if (value.length) + date = TimeStamp.parse (value); + + return date; + } + + /********************************************************************** + + Iterate over the set of tokens + + **********************************************************************/ + + int opApply (int delegate(inout HttpToken) dg) + { + HttpToken element; + int result = 0; + + foreach (Token t; stack) + if (split (t, element)) + { + result = dg (element); + if (result) + break; + } + return result; + } + + /********************************************************************** + + Output the token list to the provided writer + + **********************************************************************/ + + void write (IWriter writer) + { + produce (&writer.buffer.consume, HttpConst.Eol); + } + + /********************************************************************** + + Output the token list to the provided consumer + + **********************************************************************/ + + void produce (void delegate (void[]) consume, char[] eol) + { + foreach (Token token; stack) + { + auto content = token.toString(); + if (content.length) + consume (content), consume (eol); + } + } + + /********************************************************************** + + overridable method to handle the case where a token does + not have a separator. Apparently, this can happen in HTTP + usage + + **********************************************************************/ + + protected bool handleMissingSeparator (char[] s, inout HttpToken element) + { + return false; + } + + /********************************************************************** + + split basic token into an HttpToken + + **********************************************************************/ + + final private bool split (Token t, inout HttpToken element) + { + auto s = t.toString(); + + if (s.length) + { + auto i = Text.locate (s, separator); + + // we should always find the separator + if (i < s.length) + { + auto j = (inclusive) ? i+1 : i; + element.name = s[0 .. j]; + element.value = (++i < s.length) ? s[i .. $] : null; + return true; + } + else + // allow override to specialize this case + return handleMissingSeparator (s, element); + } + return false; + } + + /********************************************************************** + + Create a filter for iterating over the tokens matching + a particular name. + + **********************************************************************/ + + FilteredTokens createFilter (char[] match) + { + return new FilteredTokens (this, match); + } + + /********************************************************************** + + Implements a filter for iterating over tokens matching + a particular name. We do it like this because there's no + means of passing additional information to an opApply() + method. + + **********************************************************************/ + + private static class FilteredTokens + { + private char[] match; + private HttpTokens tokens; + + /************************************************************** + + Construct this filter upon the given tokens, and + set the pattern to match against. + + **************************************************************/ + + this (HttpTokens tokens, char[] match) + { + this.match = match; + this.tokens = tokens; + } + + /************************************************************** + + Iterate over all tokens matching the given name + + **************************************************************/ + + int opApply (int delegate(inout HttpToken) dg) + { + HttpToken element; + int result = 0; + + foreach (Token token; tokens.stack) + if (tokens.stack.isMatch (token, match)) + if (tokens.split (token, element)) + { + result = dg (element); + if (result) + break; + } + return result; + } + + } + + /********************************************************************** + + Is the argument a whitespace character? + + **********************************************************************/ + + private bool isSpace (char c) + { + return cast(bool) (c is ' ' || c is '\t' || c is '\r' || c is '\n'); + } + + /********************************************************************** + + Trim the provided string by stripping whitespace from + both ends. Returns a slice of the original content. + + **********************************************************************/ + + private char[] trim (char[] source) + { + int front, + back = source.length; + + if (back) + { + while (front < back && isSpace(source[front])) + ++front; + + while (back > front && isSpace(source[back-1])) + --back; + } + return source [front .. back]; + } + + + /********************************************************************** + ****************** these should be exposed carefully ****************** + **********************************************************************/ + + + /********************************************************************** + + Set the output buffer for adding tokens to. This is used + by the various mutating classes. + + **********************************************************************/ + + protected void setOutputBuffer (IBuffer output) + { + this.output = output; + } + + /********************************************************************** + + Return the buffer used for output. + + **********************************************************************/ + + protected IBuffer getOutputBuffer () + { + return output; + } + + /********************************************************************** + + Return a char[] representing the output. An empty array + is returned if output was not configured. This perhaps + could just return our 'output' buffer content, but that + would not reflect deletes, or seperators. Better to do + it like this instead, for a small cost. + + **********************************************************************/ + + char[] formatTokens (IBuffer dst, char[] delim) + { + int adjust = 0; + + foreach (Token token; stack) + { + char[] content = token.toString; + if (content.length) + { + dst.append(content).append(delim); + adjust = delim.length; + } + } + + dst.truncate (dst.limit - adjust); + return cast(char[]) dst.slice; + } + + /********************************************************************** + + Add a token with the given name. The content is provided + via the specified delegate. We stuff this name & content + into the output buffer, and map a new Token onto the + appropriate buffer slice. + + **********************************************************************/ + + protected void add (char[] name, void delegate (IBuffer) dg) + { + // save the buffer write-position + int prior = output.limit; + + // add the name + output.append (name); + + // don't append separator if it's already part of the name + if (! inclusive) + output.append (sepString); + + // add the value + dg (output); + + // map new token onto buffer slice + stack.push (cast(char[]) output.slice [prior .. $]); + } + + /********************************************************************** + + Add a simple name/value pair to the output + + **********************************************************************/ + + protected void add (char[] name, char[] value) + { + void addValue (IBuffer buffer) + { + buffer.append (value); + } + + add (name, &addValue); + } + + /********************************************************************** + + Add a name/integer pair to the output + + **********************************************************************/ + + protected void addInt (char[] name, int value) + { + char[16] tmp = void; + + add (name, Integer.format (tmp, cast(long) value)); + } + + /********************************************************************** + + Add a name/date(long) pair to the output + + **********************************************************************/ + + protected void addDate (char[] name, Time value) + { + char[40] tmp = void; + + add (name, TimeStamp.format (tmp, value)); + } + + /********************************************************************** + + remove a token from our list. Returns false if the named + token is not found. + + **********************************************************************/ + + protected bool remove (char[] name) + { + return stack.removeToken (name); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/http/HttpTriplet.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/http/HttpTriplet.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,100 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: December 2005 + + author: Kris + +*******************************************************************************/ + +module tango.net.http.HttpTriplet; + +private import tango.core.Exception; + +private import tango.io.protocol.model.IWriter; + +/****************************************************************************** + + Class to represent an HTTP response- or request-line + +******************************************************************************/ + +class HttpTriplet : IWritable +{ + protected char[] line; + protected char[][3] tokens; + + /********************************************************************** + + test the validity of these tokens + + **********************************************************************/ + + abstract void test (); + + /********************************************************************** + + Parse the the given line into its constituent components. + + **********************************************************************/ + + void parse (char[] line) + { + int i; + int mark; + + this.line = line; + foreach (int index, char c; line) + if (c is ' ') + if (i < 2) + { + tokens[i] = line[mark .. index]; + mark = index+1; + ++i; + } + else + break; + + tokens[2] = line [mark .. line.length]; + + test (); + } + + /********************************************************************** + + return a reference to the original string + + **********************************************************************/ + + override char[] toString () + { + return line; + } + + /********************************************************************** + + Output the string via the given writer + + **********************************************************************/ + + void write (IWriter writer) + { + writer(toString).newline(); + } + + /********************************************************************** + + throw an exception + + **********************************************************************/ + + final void error (char[] msg) + { + throw new IOException (msg); + } +} + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/http/model/HttpParamsView.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/http/model/HttpParamsView.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,70 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: April 2004 + + author: Kris + +*******************************************************************************/ + +module tango.net.http.model.HttpParamsView; + +private import tango.time.Time; + +private import tango.io.model.IBuffer; + +private import tango.io.protocol.model.IWriter; + +/****************************************************************************** + + Maintains a set of query parameters, parsed from an HTTP request. + Use HttpParams instead for output parameters. + + Note that these input params may have been encoded by the user- + agent. Unfortunately there has been little consensus on what that + encoding should be (especially regarding GET query-params). With + luck, that will change to a consistent usage of UTF-8 within the + near future. + +******************************************************************************/ + +interface HttpParamsView : IWritable +{ + /********************************************************************** + + Return the value of the provided header, or null if the + header does not exist + + **********************************************************************/ + + char[] get (char[] name, char[] ret = null); + + /********************************************************************** + + Return the integer value of the provided header, or the + provided default-value if the header does not exist + + **********************************************************************/ + + int getInt (char[] name, int ret = -1); + + /********************************************************************** + + Return the date value of the provided header, or the + provided default-value if the header does not exist + + **********************************************************************/ + + Time getDate (char[] name, Time ret = Time.epoch); + + /********************************************************************** + + Output the param list to the provided consumer + + **********************************************************************/ + + void produce (void delegate (void[]) consume, char[] eol); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/net/model/UriView.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/model/UriView.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,137 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: April 2004 + + author: Kris + +*******************************************************************************/ + +module tango.net.model.UriView; + +/******************************************************************************* + + Implements an RFC 2396 compliant URI specification. See + this page + for more information. + + The implementation fails the spec on two counts: it doesn't insist + on a scheme being present in the UriView, and it doesn't implement the + "Relative References" support noted in section 5.2. + + Note that IRI support can be implied by assuming each of userinfo, path, + query, and fragment are UTF-8 encoded + (see + this page for further details). + + Use a Uri instead where you need to alter specific uri attributes. + +*******************************************************************************/ + +abstract class UriView +{ + public enum {InvalidPort = -1} + + /*********************************************************************** + + Return the default port for the given scheme. InvalidPort + is returned if the scheme is unknown, or does not accept + a port. + + ***********************************************************************/ + + abstract int getDefaultPort (char[] scheme); + + /*********************************************************************** + + Return the parsed scheme, or null if the scheme was not + specified + + ***********************************************************************/ + + abstract char[] getScheme(); + + /*********************************************************************** + + Return the parsed host, or null if the host was not + specified + + ***********************************************************************/ + + abstract char[] getHost(); + + /*********************************************************************** + + Return the parsed port number, or InvalidPort if the port + was not provided. + + ***********************************************************************/ + + abstract int getPort(); + + /*********************************************************************** + + Return a valid port number by performing a lookup on the + known schemes if the port was not explicitly specified. + + ***********************************************************************/ + + abstract int getValidPort(); + + /*********************************************************************** + + Return the parsed userinfo, or null if userinfo was not + provided. + + ***********************************************************************/ + + abstract char[] getUserInfo(); + + /*********************************************************************** + + Return the parsed path, or null if the path was not + provided. + + ***********************************************************************/ + + abstract char[] getPath(); + + /*********************************************************************** + + Return the parsed query, or null if a query was not + provided. + + ***********************************************************************/ + + abstract char[] getQuery(); + + /*********************************************************************** + + Return the parsed fragment, or null if a fragment was not + provided. + + ***********************************************************************/ + + abstract char[] getFragment(); + + /*********************************************************************** + + Return whether or not the UriView scheme is considered generic. + + ***********************************************************************/ + + abstract bool isGeneric (); + + /*********************************************************************** + + Emit the content of this UriView. Output is constructed per + RFC 2396. + + ***********************************************************************/ + + abstract char[] toString (); +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/complex.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/complex.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,99 @@ +/** + * D header file for C99. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: ISO/IEC 9899:1999 (E) + */ +module tango.stdc.complex; + +extern (C): + +cdouble cacos(cdouble z); +cfloat cacosf(cfloat z); +creal cacosl(creal z); + +cdouble casin(cdouble z); +cfloat casinf(cfloat z); +creal casinl(creal z); + +cdouble catan(cdouble z); +cfloat catanf(cfloat z); +creal catanl(creal z); + +cdouble ccos(cdouble z); +cfloat ccosf(cfloat z); +creal ccosl(creal z); + +cdouble csin(cdouble z); +cfloat csinf(cfloat z); +creal csinl(creal z); + +cdouble ctan(cdouble z); +cfloat ctanf(cfloat z); +creal ctanl(creal z); + +cdouble cacosh(cdouble z); +cfloat cacoshf(cfloat z); +creal cacoshl(creal z); + +cdouble casinh(cdouble z); +cfloat casinhf(cfloat z); +creal casinhl(creal z); + +cdouble catanh(cdouble z); +cfloat catanhf(cfloat z); +creal catanhl(creal z); + +cdouble ccosh(cdouble z); +cfloat ccoshf(cfloat z); +creal ccoshl(creal z); + +cdouble csinh(cdouble z); +cfloat csinhf(cfloat z); +creal csinhl(creal z); + +cdouble ctanh(cdouble z); +cfloat ctanhf(cfloat z); +creal ctanhl(creal z); + +cdouble cexp(cdouble z); +cfloat cexpf(cfloat z); +creal cexpl(creal z); + +cdouble clog(cdouble z); +cfloat clogf(cfloat z); +creal clogl(creal z); + + double cabs(cdouble z); + float cabsf(cfloat z); + real cabsl(creal z); + +cdouble cpow(cdouble x, cdouble y); +cfloat cpowf(cfloat x, cfloat y); +creal cpowl(creal x, creal y); + +cdouble csqrt(cdouble z); +cfloat csqrtf(cfloat z); +creal csqrtl(creal z); + + double carg(cdouble z); + float cargf(cfloat z); + real cargl(creal z); + + double cimag(cdouble z); + float cimagf(cfloat z); + real cimagl(creal z); + +cdouble conj(cdouble z); +cfloat conjf(cfloat z); +creal conjl(creal z); + +cdouble cproj(cdouble z); +cfloat cprojf(cfloat z); +creal cprojl(creal z); + +// double creal(cdouble z); + float crealf(cfloat z); + real creall(creal z); diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/config.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/config.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,30 @@ +/** + * D header file for C99. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: ISO/IEC 9899:1999 (E) + */ +module tango.stdc.config; + +extern (C): + +version( Windows ) +{ + alias int c_long; + alias uint c_ulong; +} +else +{ + static if( (void*).sizeof > int.sizeof ) + { + alias long c_long; + alias ulong c_ulong; + } + else + { + alias int c_long; + alias uint c_ulong; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/ctype.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/ctype.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,26 @@ +/** + * D header file for C99. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: ISO/IEC 9899:1999 (E) + */ +module tango.stdc.ctype; + +extern (C): + +int isalnum(int c); +int isalpha(int c); +int isblank(int c); +int iscntrl(int c); +int isdigit(int c); +int isgraph(int c); +int islower(int c); +int isprint(int c); +int ispunct(int c); +int isspace(int c); +int isupper(int c); +int isxdigit(int c); +int tolower(int c); +int toupper(int c); diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/errno.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/errno.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,280 @@ +/** + * D header file for C99. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: ISO/IEC 9899:1999 (E) + */ +module tango.stdc.errno; + +private +{ + extern (C) int getErrno(); + extern (C) int setErrno(int); +} + +int errno() { return getErrno(); } +int errno( int val ) { return setErrno( val ); } + +extern (C): + +version( Win32 ) +{ + const EPERM = 1; // Operation not permitted + const ENOENT = 2; // No such file or directory + const ESRCH = 3; // No such process + const EINTR = 4; // Interrupted system call + const EIO = 5; // I/O error + const ENXIO = 6; // No such device or address + const E2BIG = 7; // Argument list too long + const ENOEXEC = 8; // Exec format error + const EBADF = 9; // Bad file number + const ECHILD = 10; // No child processes + const EAGAIN = 11; // Try again + const ENOMEM = 12; // Out of memory + const EACCES = 13; // Permission denied + const EFAULT = 14; // Bad address + const EBUSY = 16; // Device or resource busy + const EEXIST = 17; // File exists + const EXDEV = 18; // Cross-device link + const ENODEV = 19; // No such device + const ENOTDIR = 20; // Not a directory + const EISDIR = 21; // Is a directory + const EINVAL = 22; // Invalid argument + const ENFILE = 23; // File table overflow + const EMFILE = 24; // Too many open files + const ENOTTY = 25; // Not a typewriter + const EFBIG = 27; // File too large + const ENOSPC = 28; // No space left on device + const ESPIPE = 29; // Illegal seek + const EROFS = 30; // Read-only file system + const EMLINK = 31; // Too many links + const EPIPE = 32; // Broken pipe + const EDOM = 33; // Math argument out of domain of func + const ERANGE = 34; // Math result not representable + const EDEADLK = 36; // Resource deadlock would occur + const ENAMETOOLONG = 38; // File name too long + const ENOLCK = 39; // No record locks available + const ENOSYS = 40; // Function not implemented + const ENOTEMPTY = 41; // Directory not empty + const EILSEQ = 42; // Illegal byte sequence + const EDEADLOCK = EDEADLK; +} +else version( linux ) +{ + const EPERM = 1; // Operation not permitted + const ENOENT = 2; // No such file or directory + const ESRCH = 3; // No such process + const EINTR = 4; // Interrupted system call + const EIO = 5; // I/O error + const ENXIO = 6; // No such device or address + const E2BIG = 7; // Argument list too long + const ENOEXEC = 8; // Exec format error + const EBADF = 9; // Bad file number + const ECHILD = 10; // No child processes + const EAGAIN = 11; // Try again + const ENOMEM = 12; // Out of memory + const EACCES = 13; // Permission denied + const EFAULT = 14; // Bad address + const ENOTBLK = 15; // Block device required + const EBUSY = 16; // Device or resource busy + const EEXIST = 17; // File exists + const EXDEV = 18; // Cross-device link + const ENODEV = 19; // No such device + const ENOTDIR = 20; // Not a directory + const EISDIR = 21; // Is a directory + const EINVAL = 22; // Invalid argument + const ENFILE = 23; // File table overflow + const EMFILE = 24; // Too many open files + const ENOTTY = 25; // Not a typewriter + const ETXTBSY = 26; // Text file busy + const EFBIG = 27; // File too large + const ENOSPC = 28; // No space left on device + const ESPIPE = 29; // Illegal seek + const EROFS = 30; // Read-only file system + const EMLINK = 31; // Too many links + const EPIPE = 32; // Broken pipe + const EDOM = 33; // Math argument out of domain of func + const ERANGE = 34; // Math result not representable + const EDEADLK = 35; // Resource deadlock would occur + const ENAMETOOLONG = 36; // File name too long + const ENOLCK = 37; // No record locks available + const ENOSYS = 38; // Function not implemented + const ENOTEMPTY = 39; // Directory not empty + const ELOOP = 40; // Too many symbolic links encountered + const EWOULDBLOCK = EAGAIN; // Operation would block + const ENOMSG = 42; // No message of desired type + const EIDRM = 43; // Identifier removed + const ECHRNG = 44; // Channel number out of range + const EL2NSYNC = 45; // Level 2 not synchronized + const EL3HLT = 46; // Level 3 halted + const EL3RST = 47; // Level 3 reset + const ELNRNG = 48; // Link number out of range + const EUNATCH = 49; // Protocol driver not attached + const ENOCSI = 50; // No CSI structure available + const EL2HLT = 51; // Level 2 halted + const EBADE = 52; // Invalid exchange + const EBADR = 53; // Invalid request descriptor + const EXFULL = 54; // Exchange full + const ENOANO = 55; // No anode + const EBADRQC = 56; // Invalid request code + const EBADSLT = 57; // Invalid slot + const EDEADLOCK = EDEADLK; + const EBFONT = 59; // Bad font file format + const ENOSTR = 60; // Device not a stream + const ENODATA = 61; // No data available + const ETIME = 62; // Timer expired + const ENOSR = 63; // Out of streams resources + const ENONET = 64; // Machine is not on the network + const ENOPKG = 65; // Package not installed + const EREMOTE = 66; // Object is remote + const ENOLINK = 67; // Link has been severed + const EADV = 68; // Advertise error + const ESRMNT = 69; // Srmount error + const ECOMM = 70; // Communication error on send + const EPROTO = 71; // Protocol error + const EMULTIHOP = 72; // Multihop attempted + const EDOTDOT = 73; // RFS specific error + const EBADMSG = 74; // Not a data message + const EOVERFLOW = 75; // Value too large for defined data type + const ENOTUNIQ = 76; // Name not unique on network + const EBADFD = 77; // File descriptor in bad state + const EREMCHG = 78; // Remote address changed + const ELIBACC = 79; // Can not access a needed shared library + const ELIBBAD = 80; // Accessing a corrupted shared library + const ELIBSCN = 81; // .lib section in a.out corrupted + const ELIBMAX = 82; // Attempting to link in too many shared libraries + const ELIBEXEC = 83; // Cannot exec a shared library directly + const EILSEQ = 84; // Illegal byte sequence + const ERESTART = 85; // Interrupted system call should be restarted + const ESTRPIPE = 86; // Streams pipe error + const EUSERS = 87; // Too many users + const ENOTSOCK = 88; // Socket operation on non-socket + const EDESTADDRREQ = 89; // Destination address required + const EMSGSIZE = 90; // Message too long + const EPROTOTYPE = 91; // Protocol wrong type for socket + const ENOPROTOOPT = 92; // Protocol not available + const EPROTONOSUPPORT = 93; // Protocol not supported + const ESOCKTNOSUPPORT = 94; // Socket type not supported + const EOPNOTSUPP = 95; // Operation not supported on transport endpoint + const EPFNOSUPPORT = 96; // Protocol family not supported + const EAFNOSUPPORT = 97; // Address family not supported by protocol + const EADDRINUSE = 98; // Address already in use + const EADDRNOTAVAIL = 99; // Cannot assign requested address + const ENETDOWN = 100; // Network is down + const ENETUNREACH = 101; // Network is unreachable + const ENETRESET = 102; // Network dropped connection because of reset + const ECONNABORTED = 103; // Software caused connection abort + const ECONNRESET = 104; // Connection reset by peer + const ENOBUFS = 105; // No buffer space available + const EISCONN = 106; // Transport endpoint is already connected + const ENOTCONN = 107; // Transport endpoint is not connected + const ESHUTDOWN = 108; // Cannot send after transport endpoint shutdown + const ETOOMANYREFS = 109; // Too many references: cannot splice + const ETIMEDOUT = 110; // Connection timed out + const ECONNREFUSED = 111; // Connection refused + const EHOSTDOWN = 112; // Host is down + const EHOSTUNREACH = 113; // No route to host + const EALREADY = 114; // Operation already in progress + const EINPROGRESS = 115; // Operation now in progress + const ESTALE = 116; // Stale NFS file handle + const EUCLEAN = 117; // Structure needs cleaning + const ENOTNAM = 118; // Not a XENIX named type file + const ENAVAIL = 119; // No XENIX semaphores available + const EISNAM = 120; // Is a named type file + const EREMOTEIO = 121; // Remote I/O error + const EDQUOT = 122; // Quota exceeded + const ENOMEDIUM = 123; // No medium found + const EMEDIUMTYPE = 124; // Wrong medium type + const ECANCELED = 125; // Operation Canceled + const ENOKEY = 126; // Required key not available + const EKEYEXPIRED = 127; // Key has expired + const EKEYREVOKED = 128; // Key has been revoked + const EKEYREJECTED = 129; // Key was rejected by service + const EOWNERDEAD = 130; // Owner died + const ENOTRECOVERABLE = 131; // State not recoverable +} +else version( darwin ) +{ + const EPERM = 1; // Operation not permitted + const ENOENT = 2; // No such file or directory + const ESRCH = 3; // No such process + const EINTR = 4; // Interrupted system call + const EIO = 5; // Input/output error + const ENXIO = 6; // Device not configured + const E2BIG = 7; // Argument list too long + const ENOEXEC = 8; // Exec format error + const EBADF = 9; // Bad file descriptor + const ECHILD = 10; // No child processes + const EDEADLK = 11; // Resource deadlock avoided + const ENOMEM = 12; // Cannot allocate memory + const EACCES = 13; // Permission denied + const EFAULT = 14; // Bad address + const EBUSY = 16; // Device busy + const EEXIST = 17; // File exists + const EXDEV = 18; // Cross-device link + const ENODEV = 19; // Operation not supported by device + const ENOTDIR = 20; // Not a directory + const EISDIR = 21; // Is a directory + const EINVAL = 22; // Invalid argument + const ENFILE = 23; // Too many open files in system + const EMFILE = 24; // Too many open files + const ENOTTY = 25; // Inappropriate ioctl for device + const ETXTBSY = 26; // Text file busy + const EFBIG = 27; // File too large + const ENOSPC = 28; // No space left on device + const ESPIPE = 29; // Illegal seek + const EROFS = 30; // Read-only file system + const EMLINK = 31; // Too many links + const EPIPE = 32; // Broken pipe + const EDOM = 33; // Numerical argument out of domain + const ERANGE = 34; // Result too large + const EAGAIN = 35; // Resource temporarily unavailable + const EWOULDBLOCK = EAGAIN; // Operation would block + const EINPROGRESS = 36; // Operation now in progress + const EALREADY = 37; // Operation already in progress + const ENOTSOCK = 38; // Socket operation on non-socket + const EDESTADDRREQ = 39; // Destination address required + const EMSGSIZE = 40; // Message too long + const EPROTOTYPE = 41; // Protocol wrong type for socket + const ENOPROTOOPT = 42; // Protocol not available + const EPROTONOSUPPORT = 43; // Protocol not supported + const ENOTSUP = 45; // Operation not supported + const EOPNOTSUPP = ENOTSUP; // Operation not supported on socket + const EAFNOSUPPORT = 47; // Address family not supported by protocol family + const EADDRINUSE = 48; // Address already in use + const EADDRNOTAVAIL = 49; // Can't assign requested address + const ENETDOWN = 50; // Network is down + const ENETUNREACH = 51; // Network is unreachable + const ENETRESET = 52; // Network dropped connection on reset + const ECONNABORTED = 53; // Software caused connection abort + const ECONNRESET = 54; // Connection reset by peer + const ENOBUFS = 55; // No buffer space available + const EISCONN = 56; // Socket is already connected + const ENOTCONN = 57; // Socket is not connected + const ETIMEDOUT = 60; // Operation timed out + const ECONNREFUSED = 61; // Connection refused + const ELOOP = 62; // Too many levels of symbolic links + const ENAMETOOLONG = 63; // File name too long + const EHOSTUNREACH = 65; // No route to host + const ENOTEMPTY = 66; // Directory not empty + const EDQUOT = 69; // Disc quota exceeded + const ESTALE = 70; // Stale NFS file handle + const ENOLCK = 77; // No locks available + const ENOSYS = 78; // Function not implemented + const EOVERFLOW = 84; // Value too large to be stored in data type + const ECANCELED = 89; // Operation canceled + const EIDRM = 90; // Identifier removed + const ENOMSG = 91; // No message of desired type + const EILSEQ = 92; // Illegal byte sequence + const EBADMSG = 94; // Bad message + const EMULTIHOP = 95; // Reserved + const ENODATA = 96; // No message available on STREAM + const ENOLINK = 97; // Reserved + const ENOSR = 98; // No STREAM resources + const ENOSTR = 99; // Not a STREAM + const EPROTO = 100; // Protocol error + const ETIME = 101; // STREAM ioctl timeout + const ELAST = 101; // Must be equal largest errno +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/fenv.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/fenv.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,118 @@ +/** + * D header file for C99. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly, Walter Bright + * Standards: ISO/IEC 9899:1999 (E) + */ +module tango.stdc.fenv; + +extern (C): + +version( Win32 ) +{ + struct fenv_t + { + ushort status; + ushort control; + ushort round; + ushort[2] reserved; + } + + alias int fexcept_t; +} +else version( linux ) +{ + struct fenv_t + { + ushort __control_word; + ushort __unused1; + ushort __status_word; + ushort __unused2; + ushort __tags; + ushort __unused3; + uint __eip; + ushort __cs_selector; + ushort __opcode; + uint __data_offset; + ushort __data_selector; + ushort __unused5; + } + + alias int fexcept_t; +} +else version ( darwin ) +{ + version ( BigEndian ) + { + alias uint fenv_t; + alias uint fexcept_t; + } + version ( LittleEndian ) + { + struct fenv_t + { + ushort __control; + ushort __status; + uint __mxcsr; + byte[8] __reserved; + } + + alias ushort fexcept_t; + } +} +else +{ + static assert( false ); +} + +enum +{ + FE_INVALID = 1, + FE_DENORMAL = 2, // non-standard + FE_DIVBYZERO = 4, + FE_OVERFLOW = 8, + FE_UNDERFLOW = 0x10, + FE_INEXACT = 0x20, + FE_ALL_EXCEPT = 0x3F, + FE_TONEAREST = 0, + FE_UPWARD = 0x800, + FE_DOWNWARD = 0x400, + FE_TOWARDZERO = 0xC00, +} + +version( Win32 ) +{ + private extern fenv_t _FE_DFL_ENV; + fenv_t* FE_DFL_ENV = &_FE_DFL_ENV; +} +else version( linux ) +{ + fenv_t* FE_DFL_ENV = cast(fenv_t*)(-1); +} +else version( darwin ) +{ + private extern fenv_t _FE_DFL_ENV; + fenv_t* FE_DFL_ENV = &_FE_DFL_ENV; +} +else +{ + static assert( false ); +} + +void feraiseexcept(int excepts); +void feclearexcept(int excepts); + +int fetestexcept(int excepts); +int feholdexcept(fenv_t* envp); + +void fegetexceptflag(fexcept_t* flagp, int excepts); +void fesetexceptflag(fexcept_t* flagp, int excepts); + +int fegetround(); +int fesetround(int round); + +void fegetenv(fenv_t* envp); +void fesetenv(fenv_t* envp); +void feupdateenv(fenv_t* envp); diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/inttypes.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/inttypes.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,252 @@ +/** + * D header file for C99. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: ISO/IEC 9899:1999 (E) + */ +module tango.stdc.inttypes; + +public import tango.stdc.stddef; +public import tango.stdc.stdint; + +extern (C): + +struct imaxdiv_t +{ + intmax_t quot, + rem; +} + +version( VerboseC ) +{ + const char* PRId8 = "hhd"; + const char* PRId16 = "hd"; + const char* PRId32 = "ld"; + const char* PRId64 = "lld"; + + const char* PRIdLEAST8 = "hhd"; + const char* PRIdLEAST16 = "hd"; + const char* PRIdLEAST32 = "ld"; + const char* PRIdLEAST64 = "lld"; + + const char* PRIdFAST8 = "hhd"; + const char* PRIdFAST16 = "d"; + const char* PRIdFAST32 = "ld"; + const char* PRIdFAST64 = "lld"; + + const char* PRIi8 = "hhi"; + const char* PRIi16 = "hi"; + const char* PRIi32 = "li"; + const char* PRIi64 = "lli"; + + const char* PRIiLEAST8 = "hhi"; + const char* PRIiLEAST16 = "hi"; + const char* PRIiLEAST32 = "li"; + const char* PRIiLEAST64 = "lli"; + + const char* PRIiFAST8 = "hhi"; + const char* PRIiFAST16 = "i"; + const char* PRIiFAST32 = "li"; + const char* PRIiFAST64 = "lli"; + + const char* PRIo8 = "hho"; + const char* PRIo16 = "ho"; + const char* PRIo32 = "lo"; + const char* PRIo64 = "llo"; + + const char* PRIoLEAST8 = "hho"; + const char* PRIoLEAST16 = "ho"; + const char* PRIoLEAST32 = "lo"; + const char* PRIoLEAST64 = "llo"; + + const char* PRIoFAST8 = "hho"; + const char* PRIoFAST16 = "o"; + const char* PRIoFAST32 = "lo"; + const char* PRIoFAST64 = "llo"; + + const char* PRIu8 = "hhu"; + const char* PRIu16 = "hu"; + const char* PRIu32 = "lu"; + const char* PRIu64 = "llu"; + + const char* PRIuLEAST8 = "hhu"; + const char* PRIuLEAST16 = "hu"; + const char* PRIuLEAST32 = "lu"; + const char* PRIuLEAST64 = "llu"; + + const char* PRIuFAST8 = "hhu"; + const char* PRIuFAST16 = "u"; + const char* PRIuFAST32 = "lu"; + const char* PRIuFAST64 = "llu"; + + const char* PRIx8 = "hhx"; + const char* PRIx16 = "hx"; + const char* PRIx32 = "lx"; + const char* PRIx64 = "llx"; + + const char* PRIxLEAST8 = "hhx"; + const char* PRIxLEAST16 = "hx"; + const char* PRIxLEAST32 = "lx"; + const char* PRIxLEAST64 = "llx"; + + const char* PRIxFAST8 = "hhx"; + const char* PRIxFAST16 = "x"; + const char* PRIxFAST32 = "lx"; + const char* PRIxFAST64 = "llx"; + + const char* PRIX8 = "hhX"; + const char* PRIX16 = "hX"; + const char* PRIX32 = "lX"; + const char* PRIX64 = "llX"; + + const char* PRIXLEAST8 = "hhX"; + const char* PRIXLEAST16 = "hX"; + const char* PRIXLEAST32 = "lX"; + const char* PRIXLEAST64 = "llX"; + + const char* PRIXFAST8 = "hhX"; + const char* PRIXFAST16 = "X"; + const char* PRIXFAST32 = "lX"; + const char* PRIXFAST64 = "llX"; + + const char* SCNd8 = "hhd"; + const char* SCNd16 = "hd"; + const char* SCNd32 = "ld"; + const char* SCNd64 = "lld"; + + const char* SCNdLEAST8 = "hhd"; + const char* SCNdLEAST16 = "hd"; + const char* SCNdLEAST32 = "ld"; + const char* SCNdLEAST64 = "lld"; + + const char* SCNdFAST8 = "hhd"; + const char* SCNdFAST16 = "d"; + const char* SCNdFAST32 = "ld"; + const char* SCNdFAST64 = "lld"; + + const char* SCNi8 = "hhd"; + const char* SCNi16 = "hi"; + const char* SCNi32 = "li"; + const char* SCNi64 = "lli"; + + const char* SCNiLEAST8 = "hhd"; + const char* SCNiLEAST16 = "hi"; + const char* SCNiLEAST32 = "li"; + const char* SCNiLEAST64 = "lli"; + + const char* SCNiFAST8 = "hhd"; + const char* SCNiFAST16 = "i"; + const char* SCNiFAST32 = "li"; + const char* SCNiFAST64 = "lli"; + + const char* SCNo8 = "hhd"; + const char* SCNo16 = "ho"; + const char* SCNo32 = "lo"; + const char* SCNo64 = "llo"; + + const char* SCNoLEAST8 = "hhd"; + const char* SCNoLEAST16 = "ho"; + const char* SCNoLEAST32 = "lo"; + const char* SCNoLEAST64 = "llo"; + + const char* SCNoFAST8 = "hhd"; + const char* SCNoFAST16 = "o"; + const char* SCNoFAST32 = "lo"; + const char* SCNoFAST64 = "llo"; + + const char* SCNu8 = "hhd"; + const char* SCNu16 = "hu"; + const char* SCNu32 = "lu"; + const char* SCNu64 = "llu"; + + const char* SCNuLEAST8 = "hhd"; + const char* SCNuLEAST16 = "hu"; + const char* SCNuLEAST32 = "lu"; + const char* SCNuLEAST64 = "llu"; + + const char* SCNuFAST8 = "hhd"; + const char* SCNuFAST16 = "u"; + const char* SCNuFAST32 = "lu"; + const char* SCNuFAST64 = "llu"; + + const char* SCNx8 = "hhd"; + const char* SCNx16 = "hx"; + const char* SCNx32 = "lx"; + const char* SCNx64 = "llx"; + + const char* SCNxLEAST8 = "hhd"; + const char* SCNxLEAST16 = "hx"; + const char* SCNxLEAST32 = "lx"; + const char* SCNxLEAST64 = "llx"; + + const char* SCNxFAST8 = "hhd"; + const char* SCNxFAST16 = "x"; + const char* SCNxFAST32 = "lx"; + const char* SCNxFAST64 = "llx"; + + version( X86_64 ) + { + const char* PRIdMAX = PRId64; + const char* PRIiMAX = PRIi64; + const char* PRIoMAX = PRIo64; + const char* PRIuMAX = PRIu64; + const char* PRIxMAX = PRIx64; + const char* PRIXMAX = PRIX64; + + const char* SCNdMAX = SCNd64; + const char* SCNiMAX = SCNi64; + const char* SCNoMAX = SCNo64; + const char* SCNuMAX = SCNu64; + const char* SCNxMAX = SCNx64; + + const char* PRIdPTR = PRId64; + const char* PRIiPTR = PRIi64; + const char* PRIoPTR = PRIo64; + const char* PRIuPTR = PRIu64; + const char* PRIxPTR = PRIx64; + const char* PRIXPTR = PRIX64; + + const char* SCNdPTR = SCNd64; + const char* SCNiPTR = SCNi64; + const char* SCNoPTR = SCNo64; + const char* SCNuPTR = SCNu64; + const char* SCNxPTR = SCNx64; + } + else + { + const char* PRIdMAX = PRId32; + const char* PRIiMAX = PRIi32; + const char* PRIoMAX = PRIo32; + const char* PRIuMAX = PRIu32; + const char* PRIxMAX = PRIx32; + const char* PRIXMAX = PRIX32; + + const char* SCNdMAX = SCNd32; + const char* SCNiMAX = SCNi32; + const char* SCNoMAX = SCNo32; + const char* SCNuMAX = SCNu32; + const char* SCNxMAX = SCNx32; + + const char* PRIdPTR = PRId32; + const char* PRIiPTR = PRIi32; + const char* PRIoPTR = PRIo32; + const char* PRIuPTR = PRIu32; + const char* PRIxPTR = PRIx32; + const char* PRIXPTR = PRIX32; + + const char* SCNdPTR = SCNd32; + const char* SCNiPTR = SCNi32; + const char* SCNoPTR = SCNo32; + const char* SCNuPTR = SCNu32; + const char* SCNxPTR = SCNx32; + } +} + +intmax_t imaxabs(intmax_t j); +imaxdiv_t imaxdiv(intmax_t numer, intmax_t denom); +intmax_t strtoimax(char* nptr, char** endptr, int base); +uintmax_t strtoumax(char* nptr, char** endptr, int base); +intmax_t wcstoimax(wchar_t* nptr, wchar_t** endptr, int base); +uintmax_t wcstoumax(wchar_t* nptr, wchar_t** endptr, int base); diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/limits.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/limits.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,33 @@ +/** + * D header file for C99. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: ISO/IEC 9899:1999 (E) + */ +module tango.stdc.limits; + +private import tango.stdc.config; + +extern (C): + +const CHAR_BIT = 8; +const SCHAR_MIN = byte.min; +const SCHAR_MAX = byte.max; +const UCHAR_MAX = ubyte.min; +const CHAR_MIN = char.max; +const CHAR_MAX = char.max; +const MB_LEN_MAX = 2; +const SHRT_MIN = short.min; +const SHRT_MAX = short.max; +const USHRT_MAX = ushort.max; +const INT_MIN = int.min; +const INT_MAX = int.max; +const UINT_MAX = uint.max; +const LONG_MIN = c_long.min; +const LONG_MAX = c_long.max; +const ULONG_MAX = c_ulong.max; +const LLONG_MIN = long.min; +const LLONG_MAX = long.max; +const ULLONG_MAX = ulong.max; diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/locale.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/locale.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,55 @@ +/** + * D header file for C99. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: ISO/IEC 9899:1999 (E) + */ +module tango.stdc.locale; + +extern (C): + +struct lconv +{ + char* decimal_point; + char* thousands_sep; + char* grouping; + char* int_curr_symbol; + char* currency_symbol; + char* mon_decimal_point; + char* mon_thousands_sep; + char* mon_grouping; + char* positive_sign; + char* negative_sign; + byte int_frac_digits; + byte frac_digits; + byte p_cs_precedes; + byte p_sep_by_space; + byte n_cs_precedes; + byte n_sep_by_space; + byte p_sign_posn; + byte n_sign_posn; + byte int_p_cs_precedes; + byte int_p_sep_by_space; + byte int_n_cs_precedes; + byte int_n_sep_by_space; + byte int_p_sign_posn; + byte int_n_sign_posn; +} + +const LC_CTYPE = 0; +const LC_NUMERIC = 1; +const LC_TIME = 2; +const LC_COLLATE = 3; +const LC_MONETARY = 4; +const LC_ALL = 6; +const LC_PAPER = 7; +const LC_NAME = 8; +const LC_ADDRESS = 9; +const LC_TELEPHONE = 10; +const LC_MEASUREMENT = 11; +const LC_IDENTIFICATION = 12; + +char* setlocale( int category, char* locale ); +lconv* localeconv(); diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/math.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/math.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,624 @@ +/** + * D header file for C99. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly, Walter Bright + * Standards: ISO/IEC 9899:1999 (E) + */ +module tango.stdc.math; + +private import tango.stdc.config; + +extern (C): + +alias float float_t; +alias double double_t; + +const double HUGE_VAL = double.infinity; +const double HUGE_VALF = float.infinity; +const double HUGE_VALL = real.infinity; + +const float INFINITY = float.infinity; +const float NAN = float.nan; + +const int FP_ILOGB0 = int.min; +const int FP_ILOGBNAN = int.min; + +const int MATH_ERRNO = 1; +const int MATH_ERREXCEPT = 2; +const int math_errhandling = MATH_ERRNO | MATH_ERREXCEPT; + +version( none ) +{ + // + // these functions are all macros in C + // + + //int fpclassify(real-floating x); + int fpclassify(float x); + int fpclassify(double x); + int fpclassify(real x); + + //int isfinite(real-floating x); + int isfinite(float x); + int isfinite(double x); + int isfinite(real x); + + //int isinf(real-floating x); + int isinf(float x); + int isinf(double x); + int isinf(real x); + + //int isnan(real-floating x); + int isnan(float x); + int isnan(double x); + int isnan(real x); + + //int isnormal(real-floating x); + int isnormal(float x); + int isnormal(double x); + int isnormal(real x); + + //int signbit(real-floating x); + int signbit(float x); + int signbit(double x); + int signbit(real x); + + //int isgreater(real-floating x, real-floating y); + int isgreater(float x, float y); + int isgreater(double x, double y); + int isgreater(real x, real y); + + //int isgreaterequal(real-floating x, real-floating y); + int isgreaterequal(float x, float y); + int isgreaterequal(double x, double y); + int isgreaterequal(real x, real y); + + //int isless(real-floating x, real-floating y); + int isless(float x, float y); + int isless(double x, double y); + int isless(real x, real y); + + //int islessequal(real-floating x, real-floating y); + int islessequal(float x, float y); + int islessequal(double x, double y); + int islessequal(real x, real y); + + //int islessgreater(real-floating x, real-floating y); + int islessgreater(float x, float y); + int islessgreater(double x, double y); + int islessgreater(real x, real y); + + //int isunordered(real-floating x, real-floating y); + int isunordered(float x, float y); + int isunordered(double x, double y); + int isunordered(real x, real y); +} + +version( DigitalMars ) version( Win32 ) + version = DigitalMarsWin32; + +version( DigitalMarsWin32 ) +{ + enum + { + FP_NANS = 0, + FP_NANQ = 1, + FP_INFINITE = 2, + FP_NORMAL = 3, + FP_SUBNORMAL = 4, + FP_ZERO = 5, + FP_NAN = FP_NANQ, + FP_EMPTY = 6, + FP_UNSUPPORTED = 7, + } + + enum + { + FP_FAST_FMA = 0, + FP_FAST_FMAF = 0, + FP_FAST_FMAL = 0, + } + + uint __fpclassify_f(float x); + uint __fpclassify_d(double x); + uint __fpclassify_ld(real x); + + extern (D) + { + //int fpclassify(real-floating x); + int fpclassify(float x) { return __fpclassify_f(x); } + int fpclassify(double x) { return __fpclassify_d(x); } + int fpclassify(real x) + { + return (real.sizeof == double.sizeof) + ? __fpclassify_d(x) + : __fpclassify_ld(x); + } + + //int isfinite(real-floating x); + int isfinite(float x) { return fpclassify(x) >= FP_NORMAL; } + int isfinite(double x) { return fpclassify(x) >= FP_NORMAL; } + int isfinite(real x) { return fpclassify(x) >= FP_NORMAL; } + + //int isinf(real-floating x); + int isinf(float x) { return fpclassify(x) == FP_INFINITE; } + int isinf(double x) { return fpclassify(x) == FP_INFINITE; } + int isinf(real x) { return fpclassify(x) == FP_INFINITE; } + + //int isnan(real-floating x); + int isnan(float x) { return fpclassify(x) <= FP_NANQ; } + int isnan(double x) { return fpclassify(x) <= FP_NANQ; } + int isnan(real x) { return fpclassify(x) <= FP_NANQ; } + + //int isnormal(real-floating x); + int isnormal(float x) { return fpclassify(x) == FP_NORMAL; } + int isnormal(double x) { return fpclassify(x) == FP_NORMAL; } + int isnormal(real x) { return fpclassify(x) == FP_NORMAL; } + + //int signbit(real-floating x); + int signbit(float x) { return (cast(short*)&(x))[1] & 0x8000; } + int signbit(double x) { return (cast(short*)&(x))[3] & 0x8000; } + int signbit(real x) + { + return (real.sizeof == double.sizeof) + ? (cast(short*)&(x))[3] & 0x8000 + : (cast(short*)&(x))[4] & 0x8000; + } + } +} +else version( linux ) +{ + enum + { + FP_NAN, + FP_INFINITE, + FP_ZERO, + FP_SUBNORMAL, + FP_NORMAL, + } + + enum + { + FP_FAST_FMA = 0, + FP_FAST_FMAF = 0, + FP_FAST_FMAL = 0, + } + + int __fpclassifyf(float x); + int __fpclassify(double x); + int __fpclassifyl(real x); + + int __finitef(float x); + int __finite(double x); + int __finitel(real x); + + int __isinff(float x); + int __isinf(double x); + int __isinfl(real x); + + int __isnanf(float x); + int __isnan(double x); + int __isnanl(real x); + + int __signbitf(float x); + int __signbit(double x); + int __signbitl(real x); + + extern (D) + { + //int fpclassify(real-floating x); + int fpclassify(float x) { return __fpclassifyf(x); } + int fpclassify(double x) { return __fpclassify(x); } + int fpclassify(real x) + { + return (real.sizeof == double.sizeof) + ? __fpclassify(x) + : __fpclassifyl(x); + } + + //int isfinite(real-floating x); + int isfinite(float x) { return __finitef(x); } + int isfinite(double x) { return __finite(x); } + int isfinite(real x) + { + return (real.sizeof == double.sizeof) + ? __finite(x) + : __finitel(x); + } + + //int isinf(real-floating x); + int isinf(float x) { return __isinff(x); } + int isinf(double x) { return __isinf(x); } + int isinf(real x) + { + return (real.sizeof == double.sizeof) + ? __isinf(x) + : __isinfl(x); + } + + //int isnan(real-floating x); + int isnan(float x) { return __isnanf(x); } + int isnan(double x) { return __isnan(x); } + int isnan(real x) + { + return (real.sizeof == double.sizeof) + ? __isnan(x) + : __isnanl(x); + } + + //int isnormal(real-floating x); + int isnormal(float x) { return fpclassify(x) == FP_NORMAL; } + int isnormal(double x) { return fpclassify(x) == FP_NORMAL; } + int isnormal(real x) { return fpclassify(x) == FP_NORMAL; } + + //int signbit(real-floating x); + int signbit(float x) { return __signbitf(x); } + int signbit(double x) { return __signbit(x); } + int signbit(real x) + { + return (real.sizeof == double.sizeof) + ? __signbit(x) + : __signbitl(x); + } + } +} +else version( darwin ) +{ + enum + { + FP_NAN = 1, + FP_INFINITE = 2, + FP_ZERO = 3, + FP_NORMAL = 4, + FP_SUBNORMAL = 5, + FP_SUPERNORMAL = 6 + } + + enum + { + FP_FAST_FMA = 0, + FP_FAST_FMAF = 0, + FP_FAST_FMAL = 0, + } + + int __fpclassifyf(float x); + int __fpclassifyd(double x); + int __fpclassify(real x); + + int __isfinitef(float x); + int __isfinited(double x); + int __isfinite(real x); + + int __isinff(float x); + int __isinfd(double x); + int __isinf(real x); + + int __isnanf(float x); + int __isnand(double x); + int __isnan(real x); + + int __signbitf(float x); + int __signbitd(double x); + int __signbitl(real x); + + extern (D) + { + //int fpclassify(real-floating x); + int fpclassify(float x) { return __fpclassifyf(x); } + int fpclassify(double x) { return __fpclassifyd(x); } + int fpclassify(real x) + { + return (real.sizeof == double.sizeof) + ? __fpclassifyd(x) + : __fpclassify(x); + } + + //int isfinite(real-floating x); + int isfinite(float x) { return __isfinitef(x); } + int isfinite(double x) { return __isfinited(x); } + int isfinite(real x) + { + return (real.sizeof == double.sizeof) + ? __isfinited(x) + : __isfinite(x); + } + + //int isinf(real-floating x); + int isinf(float x) { return __isinff(x); } + int isinf(double x) { return __isinfd(x); } + int isinf(real x) + { + return (real.sizeof == double.sizeof) + ? __isinfd(x) + : __isinf(x); + } + + //int isnan(real-floating x); + int isnan(float x) { return __isnanf(x); } + int isnan(double x) { return __isnand(x); } + int isnan(real x) + { + return (real.sizeof == double.sizeof) + ? __isnand(x) + : __isnan(x); + } + + //int isnormal(real-floating x); + int isnormal(float x) { return fpclassify(x) == FP_NORMAL; } + int isnormal(double x) { return fpclassify(x) == FP_NORMAL; } + int isnormal(real x) { return fpclassify(x) == FP_NORMAL; } + + //int signbit(real-floating x); + int signbit(float x) { return __signbitf(x); } + int signbit(double x) { return __signbitd(x); } + int signbit(real x) + { + return (real.sizeof == double.sizeof) + ? __signbitd(x) + : __signbitl(x); + } + } +} + +extern (D) +{ + //int isgreater(real-floating x, real-floating y); + int isgreater(float x, float y) { return !(x !> y); } + int isgreater(double x, double y) { return !(x !> y); } + int isgreater(real x, real y) { return !(x !> y); } + + //int isgreaterequal(real-floating x, real-floating y); + int isgreaterequal(float x, float y) { return !(x !>= y); } + int isgreaterequal(double x, double y) { return !(x !>= y); } + int isgreaterequal(real x, real y) { return !(x !>= y); } + + //int isless(real-floating x, real-floating y); + int isless(float x, float y) { return !(x !< y); } + int isless(double x, double y) { return !(x !< y); } + int isless(real x, real y) { return !(x !< y); } + + //int islessequal(real-floating x, real-floating y); + int islessequal(float x, float y) { return !(x !<= y); } + int islessequal(double x, double y) { return !(x !<= y); } + int islessequal(real x, real y) { return !(x !<= y); } + + //int islessgreater(real-floating x, real-floating y); + int islessgreater(float x, float y) { return !(x !<> y); } + int islessgreater(double x, double y) { return !(x !<> y); } + int islessgreater(real x, real y) { return !(x !<> y); } + + //int isunordered(real-floating x, real-floating y); + int isunordered(float x, float y) { return (x !<>= y); } + int isunordered(double x, double y) { return (x !<>= y); } + int isunordered(real x, real y) { return (x !<>= y); } +} + +double acos(double x); +float acosf(float x); +real acosl(real x); + +double asin(double x); +float asinf(float x); +real asinl(real x); + +double atan(double x); +float atanf(float x); +real atanl(real x); + +double atan2(double y, double x); +float atan2f(float y, float x); +real atan2l(real y, real x); + +double cos(double x); +float cosf(float x); +real cosl(real x); + +double sin(double x); +float sinf(float x); +real sinl(real x); + +double tan(double x); +float tanf(float x); +real tanl(real x); + +double acosh(double x); +float acoshf(float x); +real acoshl(real x); + +double asinh(double x); +float asinhf(float x); +real asinhl(real x); + +double atanh(double x); +float atanhf(float x); +real atanhl(real x); + +double cosh(double x); +float coshf(float x); +real coshl(real x); + +double sinh(double x); +float sinhf(float x); +real sinhl(real x); + +double tanh(double x); +float tanhf(float x); +real tanhl(real x); + +double exp(double x); +float expf(float x); +real expl(real x); + +double exp2(double x); +float exp2f(float x); +real exp2l(real x); + +double expm1(double x); +float expm1f(float x); +real expm1l(real x); + +double frexp(double value, int* exp); +float frexpf(float value, int* exp); +real frexpl(real value, int* exp); + +int ilogb(double x); +int ilogbf(float x); +int ilogbl(real x); + +double ldexp(double x, int exp); +float ldexpf(float x, int exp); +real ldexpl(real x, int exp); + +double log(double x); +float logf(float x); +real logl(real x); + +double log10(double x); +float log10f(float x); +real log10l(real x); + +double log1p(double x); +float log1pf(float x); +real log1pl(real x); + +double log2(double x); +float log2f(float x); +real log2l(real x); + +double logb(double x); +float logbf(float x); +real logbl(real x); + +double modf(double value, double* iptr); +float modff(float value, float* iptr); +real modfl(real value, real *iptr); + +double scalbn(double x, int n); +float scalbnf(float x, int n); +real scalbnl(real x, int n); + +double scalbln(double x, c_long n); +float scalblnf(float x, c_long n); +real scalblnl(real x, c_long n); + +double cbrt(double x); +float cbrtf(float x); +real cbrtl(real x); + +double fabs(double x); +float fabsf(float x); +real fabsl(real x); + +double hypot(double x, double y); +float hypotf(float x, float y); +real hypotl(real x, real y); + +double pow(double x, double y); +float powf(float x, float y); +real powl(real x, real y); + +double sqrt(double x); +float sqrtf(float x); +real sqrtl(real x); + +double erf(double x); +float erff(float x); +real erfl(real x); + +double erfc(double x); +float erfcf(float x); +real erfcl(real x); + +double lgamma(double x); +float lgammaf(float x); +real lgammal(real x); + +double tgamma(double x); +float tgammaf(float x); +real tgammal(real x); + +double ceil(double x); +float ceilf(float x); +real ceill(real x); + +double floor(double x); +float floorf(float x); +real floorl(real x); + +double nearbyint(double x); +float nearbyintf(float x); +real nearbyintl(real x); + +double rint(double x); +float rintf(float x); +real rintl(real x); + +c_long lrint(double x); +c_long lrintf(float x); +c_long lrintl(real x); + +long llrint(double x); +long llrintf(float x); +long llrintl(real x); + +double round(double x); +float roundf(float x); +real roundl(real x); + +c_long lround(double x); +c_long lroundf(float x); +c_long lroundl(real x); + +long llround(double x); +long llroundf(float x); +long llroundl(real x); + +double trunc(double x); +float truncf(float x); +real truncl(real x); + +double fmod(double x, double y); +float fmodf(float x, float y); +real fmodl(real x, real y); + +double remainder(double x, double y); +float remainderf(float x, float y); +real remainderl(real x, real y); + +double remquo(double x, double y, int* quo); +float remquof(float x, float y, int* quo); +real remquol(real x, real y, int* quo); + +double copysign(double x, double y); +float copysignf(float x, float y); +real copysignl(real x, real y); + +double nan(char* tagp); +float nanf(char* tagp); +real nanl(char* tagp); + +double nextafter(double x, double y); +float nextafterf(float x, float y); +real nextafterl(real x, real y); + +double nexttoward(double x, real y); +float nexttowardf(float x, real y); +real nexttowardl(real x, real y); + +double fdim(double x, double y); +float fdimf(float x, float y); +real fdiml(real x, real y); + +double fmax(double x, double y); +float fmaxf(float x, float y); +real fmaxl(real x, real y); + +double fmin(double x, double y); +float fminf(float x, float y); +real fminl(real x, real y); + +double fma(double x, double y, double z); +float fmaf(float x, float y, float z); +real fmal(real x, real y, real z); diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/posix/arpa/inet.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/posix/arpa/inet.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,83 @@ +/** + * D header file for POSIX. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition + */ +module tango.stdc.posix.arpa.inet; + +private import tango.stdc.posix.config; +public import tango.stdc.inttypes : uint32_t, uint16_t; +public import tango.stdc.posix.sys.socket : socklen_t; + +extern (C): + +// +// Required +// +/* +in_port_t // from tango.stdc.posix.netinet.in_ +in_addr_t // from tango.stdc.posix.netinet.in_ + +struct in_addr // from tango.stdc.posix.netinet.in_ +INET_ADDRSTRLEN // from tango.stdc.posix.netinet.in_ + +uint32_t // from tango.stdc.inttypes +uint16_t // from tango.stdc.inttypes + +uint32_t htonl(uint32_t); +uint16_t htons(uint16_t); +uint32_t ntohl(uint32_t); +uint16_t ntohs(uint16_t); + +in_addr_t inet_addr(char*); +char* inet_ntoa(in_addr); +char* inet_ntop(int, void*, char*, socklen_t); +int inet_pton(int, char*, void*); +*/ + +version( linux ) +{ + alias uint16_t in_port_t; + alias uint32_t in_addr_t; + + struct in_addr + { + in_addr_t s_addr;; + } + + const INET_ADDRSTRLEN = 16; + + uint32_t htonl(uint32_t); + uint16_t htons(uint16_t); + uint32_t ntohl(uint32_t); + uint16_t ntohs(uint16_t); + + in_addr_t inet_addr(char*); + char* inet_ntoa(in_addr); + char* inet_ntop(int, void*, char*, socklen_t); + int inet_pton(int, char*, void*); +} +else version( darwin ) +{ + +} + + +// +// IPV6 (IP6) +// +/* +INET6_ADDRSTRLEN // from tango.stdc.posix.netinet.in_ +*/ + +version( linux ) +{ + const INET6_ADDRSTRLEN = 46; +} +else version( darwin ) +{ + +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/posix/config.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/posix/config.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,20 @@ +/** + * D header file for POSIX. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition + */ +module tango.stdc.posix.config; + +public import tango.stdc.config; + +extern (C): + +version( linux ) +{ + const bool __USE_FILE_OFFSET64 = false; + const bool __USE_LARGEFILE64 = false; + const bool __REDIRECT = false; +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/posix/dirent.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/posix/dirent.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,129 @@ +/** + * D header file for POSIX. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition + */ +module tango.stdc.posix.dirent; + +private import tango.stdc.posix.config; +public import tango.stdc.posix.sys.types; // for ino_t + +extern (C): + +// +// Required +// +/* +DIR + +struct dirent +{ + char[] d_name; +} + +int closedir(DIR*); +DIR* opendir(char*); +dirent* readdir(DIR*); +void rewinddir(DIR*); +*/ + +version( linux ) +{ + // NOTE: The following constants are non-standard Linux definitions + // for dirent.d_type. + enum + { + DT_UNKNOWN = 0, + DT_FIFO = 1, + DT_CHR = 2, + DT_DIR = 4, + DT_BLK = 6, + DT_REG = 8, + DT_LNK = 10, + DT_SOCK = 12, + DT_WHT = 14 + } + + struct dirent + { + ino_t d_ino; + off_t d_off; + ushort d_reclen; + ubyte d_type; + char[256] d_name; + } + + struct DIR + { + // Managed by OS + } + + dirent* readdir(DIR*); +} +else version( darwin ) +{ + enum + { + DT_UNKNOWN = 0, + DT_FIFO = 1, + DT_CHR = 2, + DT_DIR = 4, + DT_BLK = 6, + DT_REG = 8, + DT_LNK = 10, + DT_SOCK = 12, + DT_WHT = 14 + } + + align(4) + struct dirent + { + ino_t d_ino; + ushort d_reclen; + ubyte d_type; + ubyte d_namlen; + char[256] d_name; + } + + struct DIR + { + // Managed by OS + } + + dirent* readdir(DIR*); +} +else +{ + dirent* readdir(DIR*); +} + +int closedir(DIR*); +DIR* opendir(char*); +//dirent* readdir(DIR*); +void rewinddir(DIR*); + +// +// Thread-Safe Functions (TSF) +// +/* +int readdir_r(DIR*, dirent*, dirent**); +*/ + +int readdir_r(DIR*, dirent*, dirent**); + +// +// XOpen (XSI) +// +/* +void seekdir(DIR*, c_long); +c_long telldir(DIR*); +*/ + +version( linux ) +{ + void seekdir(DIR*, c_long); + c_long telldir(DIR*); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/posix/dlfcn.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/posix/dlfcn.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,53 @@ +/** + * D header file for POSIX. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition + */ +module tango.stdc.posix.dlfcn; + +private import tango.stdc.posix.config; + +extern (C): + +// +// XOpen (XSI) +// +/* +RTLD_LAZY +RTLD_NOW +RTLD_GLOBAL +RTLD_LOCAL + +int dlclose(void*); +char* dlerror(); +void* dlopen(char*, int); +void* dlsym(void*, char*); +*/ + +version( linux ) +{ + const RTLD_LAZY = 0x00001; + const RTLD_NOW = 0x00002; + const RTLD_GLOBAL = 0x00100; + const RTLD_LOCAL = 0x00000; + + int dlclose(void*); + char* dlerror(); + void* dlopen(char*, int); + void* dlsym(void*, char*); +} +else version( darwin ) +{ + const RTLD_LAZY = 0x00001; + const RTLD_NOW = 0x00002; + const RTLD_GLOBAL = 0x00100; + const RTLD_LOCAL = 0x00000; + + int dlclose(void*); + char* dlerror(); + void* dlopen(char*, int); + void* dlsym(void*, char*); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/posix/fcntl.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/posix/fcntl.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,184 @@ +/** + * D header file for POSIX. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition + */ +module tango.stdc.posix.fcntl; + +private import tango.stdc.posix.config; +private import tango.stdc.stdint; +public import tango.stdc.stddef; // for size_t +public import tango.stdc.posix.sys.types; // for off_t, mode_t +public import tango.stdc.posix.sys.stat; // for S_IFMT, etc. + +extern (C): + +// +// Required +// +/* +F_DUPFD +F_GETFD +F_SETFD +F_GETFL +F_SETFL +F_GETLK +F_SETLK +F_SETLKW +F_GETOWN +F_SETOWN + +FD_CLOEXEC + +F_RDLCK +F_UNLCK +F_WRLCK + +O_CREAT +O_EXCL +O_NOCTTY +O_TRUNC + +O_APPEND +O_DSYNC +O_NONBLOCK +O_RSYNC +O_SYNC + +O_ACCMODE +O_RDONLY +O_RDWR +O_WRONLY + +struct flock +{ + short l_type; + short l_whence; + off_t l_start; + off_t l_len; + pid_t l_pid; +} + +int creat(char*, mode_t); +int fcntl(int, int, ...); +int open(char*, int, ...); +*/ +version( linux ) +{ + const F_DUPFD = 0; + const F_GETFD = 1; + const F_SETFD = 2; + const F_GETFL = 3; + const F_SETFL = 4; + static if( __USE_FILE_OFFSET64 ) + { + const F_GETLK = 12; + const F_SETLK = 13; + const F_SETLKW = 14; + } + else + { + const F_GETLK = 5; + const F_SETLK = 6; + const F_SETLKW = 7; + } + const F_GETOWN = 9; + const F_SETOWN = 8; + + const FD_CLOEXEC = 1; + + const F_RDLCK = 0; + const F_UNLCK = 2; + const F_WRLCK = 1; + + const O_CREAT = 0100; + const O_EXCL = 0200; + const O_NOCTTY = 0400; + const O_TRUNC = 01000; + + const O_APPEND = 02000; + const O_NONBLOCK = 04000; + const O_SYNC = 010000; + const O_DSYNC = O_SYNC; + const O_RSYNC = O_SYNC; + + const O_ACCMODE = 0003; + const O_RDONLY = 00; + const O_WRONLY = 01; + const O_RDWR = 02; + + struct flock + { + short l_type; + short l_whence; + off_t l_start; + off_t l_len; + pid_t l_pid; + } +} +else version( darwin ) +{ + const F_DUPFD = 0; + const F_GETFD = 1; + const F_SETFD = 2; + const F_GETFL = 3; + const F_SETFL = 4; + const F_GETOWN = 5; + const F_SETOWN = 6; + const F_GETLK = 7; + const F_SETLK = 8; + const F_SETLKW = 9; + + const FD_CLOEXEC = 1; + + const F_RDLCK = 1; + const F_UNLCK = 2; + const F_WRLCK = 3; + + const O_CREAT = 0x0200; + const O_EXCL = 0x0800; + const O_NOCTTY = 0; + const O_TRUNC = 0x0400; + + const O_RDONLY = 0x0000; + const O_WRONLY = 0x0001; + const O_RDWR = 0x0002; + const O_ACCMODE = 0x0003; + + const O_NONBLOCK = 0x0004; + const O_APPEND = 0x0008; + const O_SYNC = 0x0080; + //const O_DSYNC + //const O_RSYNC + + struct flock + { + off_t l_start; + off_t l_len; + pid_t l_pid; + short l_type; + short l_whence; + } +} + +int creat(char*, mode_t); +int fcntl(int, int, ...); +int open(char*, int, ...); + +// +// Advisory Information (ADV) +// +/* +POSIX_FADV_NORMAL +POSIX_FADV_SEQUENTIAL +POSIX_FADV_RANDOM +POSIX_FADV_WILLNEED +POSIX_FADV_DONTNEED +POSIX_FADV_NOREUSE + +int posix_fadvise(int, off_t, off_t, int); +int posix_fallocate(int, off_t, off_t); +*/ diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/posix/inttypes.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/posix/inttypes.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,11 @@ +/** + * D header file for POSIX. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition + */ +module tango.stdc.posix.inttypes; + +public import tango.stdc.inttypes; diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/posix/net/if_.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/posix/net/if_.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,51 @@ +/** + * D header file for POSIX. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition + */ +module tango.stdc.posix.net.if_; + +private import tango.stdc.posix.config; + +extern (C): + +// +// Required +// +/* +struct if_nameindex // renamed to if_nameindex_t +{ + uint if_index; + char* if_name; +} + +IF_NAMESIZE + +uint if_nametoindex(char*); +char* if_indextoname(uint, char*); +if_nameindex_t* if_nameindex(); +void if_freenameindex(if_nameindex_t*); +*/ + +version( linux ) +{ + struct if_nameindex_t + { + uint if_index; + char* if_name; + } + + const IF_NAMESIZE = 16; + + uint if_nametoindex(char*); + char* if_indextoname(uint, char*); + if_nameindex_t* if_nameindex(); + void if_freenameindex(if_nameindex_t*); +} +else version( darwin ) +{ + +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/posix/netinet/in_.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/posix/netinet/in_.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,153 @@ +/** + * D header file for POSIX. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition + */ +module tango.stdc.posix.netinet.in_; + +private import tango.stdc.posix.config; +public import tango.stdc.inttypes : uint32_t, uint16_t; +public import tango.stdc.posix.arpa.inet; + +extern (C): + +// +// Required +// +/* +NOTE: The following must must be defined in tango.stdc.posix.arpa.inet to break + a circular import: in_port_t, in_addr_t, struct in_addr, INET_ADDRSTRLEN. + +in_port_t +in_addr_t + +sa_family_t +uint8_t // from tango.stdc.inttypes +uint32_t // from tango.stdc.inttypes + +struct in_addr +{ + in_addr_t s_addr; +} + +struct sockaddr_in +{ + sa_family_t sin_family; + in_port_t sin_port; + in_addr sin_addr; +} + +IPPROTO_IP +IPPROTO_ICMP +IPPROTO_TCP +IPPROTO_UDP + +INADDR_ANY +INADDR_BROADCAST + +INET_ADDRSTRLEN + +htonl() // from tango.stdc.posix.arpa.inet +htons() // from tango.stdc.posix.arpa.inet +ntohl() // from tango.stdc.posix.arpa.inet +ntohs() // from tango.stdc.posix.arpa.inet +*/ + +version( linux ) +{ + alias ushort sa_family_t; + + private const __SOCK_SIZE__ = 16; + + struct sockaddr_in + { + sa_family_t sin_family; + in_port_t sin_port; + in_addr sin_addr; + + /* Pad to size of `struct sockaddr'. */ + ubyte[__SOCK_SIZE__ - sa_family_t.sizeof - + in_port_t.sizeof - in_addr.sizeof] __pad; + } + + enum + { + IPPROTO_IP = 0, + IPPROTO_ICMP = 1, + IPPROTO_TCP = 6, + IPPROTO_UDP = 17 + } + + const c_ulong INADDR_ANY = 0x00000000; + const c_ulong INADDR_BROADCAST = 0xffffffff; +} +else version( darwin ) +{ + +} + + +// +// IPV6 (IP6) +// +/* +NOTE: The following must must be defined in tango.stdc.posix.arpa.inet to break + a circular import: INET6_ADDRSTRLEN. + +uint8_t[16] s6_addr; + +struct sockaddr_in6 +{ + sa_family_t sin6_family; + in_port_t sin6_port; + uint32_t sin6_flowinfo; + in6_addr sin6_addr; + uint32_t sin6_scope_id; +} + +extern in6_addr in6addr_any; +extern in6_addr in6addr_loopback; + +struct ipv6_mreq +{ + in6_addr ipv6mr_multiaddr; + uint ipv6mr_interface; +} + +IPPROTO_IPV6 + +INET6_ADDRSTRLEN + +IPV6_JOIN_GROUP +IPV6_LEAVE_GROUP +IPV6_MULTICAST_HOPS +IPV6_MULTICAST_IF +IPV6_MULTICAST_LOOP +IPV6_UNICAST_HOPS +IPV6_V6ONLY + +// macros +int IN6_IS_ADDR_UNSPECIFIED(in6_addr*) +int IN6_IS_ADDR_LOOPBACK(in6_addr*) +int IN6_IS_ADDR_MULTICAST(in6_addr*) +int IN6_IS_ADDR_LINKLOCAL(in6_addr*) +int IN6_IS_ADDR_SITELOCAL(in6_addr*) +int IN6_IS_ADDR_V4MAPPED(in6_addr*) +int IN6_IS_ADDR_V4COMPAT(in6_addr*) +int IN6_IS_ADDR_MC_NODELOCAL(in6_addr*) +int IN6_IS_ADDR_MC_LINKLOCAL(in6_addr*) +int IN6_IS_ADDR_MC_SITELOCAL(in6_addr*) +int IN6_IS_ADDR_MC_ORGLOCAL(in6_addr*) +int IN6_IS_ADDR_MC_GLOBAL(in6_adddr*) +*/ + + +// +// Raw Sockets (RS) +// +/* +IPPROTO_RAW +*/ diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/posix/netinet/tcp.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/posix/netinet/tcp.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,29 @@ +/** + * D header file for POSIX. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition + */ +module tango.stdc.posix.netinet.tcp; + +private import tango.stdc.posix.config; + +extern (C): + +// +// Required +// +/* +TCP_NODELAY +*/ + +version( linux ) +{ + const TCP_NODELAY = 1; +} +else version( darwin ) +{ + +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/posix/poll.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/posix/poll.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,99 @@ +/** + * D header file for POSIX. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition + */ +module tango.stdc.posix.poll; + +private import tango.stdc.posix.config; + +extern (C): + +// +// XOpen (XSI) +// +/* +struct pollfd +{ + int fd; + short events; + short revents; +} + +nfds_t + +POLLIN +POLLRDNORM +POLLRDBAND +POLLPRI +POLLOUT +POLLWRNORM +POLLWRBAND +POLLERR +POLLHUP +POLLNVAL + +int poll(pollfd[], nfds_t, int); +*/ + +version( linux ) +{ + struct pollfd + { + int fd; + short events; + short revents; + } + + alias c_ulong nfds_t; + + const POLLIN = 0x001; + const POLLRDNORM = 0x040; + const POLLRDBAND = 0x080; + const POLLPRI = 0x002; + const POLLOUT = 0x004; + const POLLWRNORM = 0x100; + const POLLWRBAND = 0x200; + const POLLERR = 0x008; + const POLLHUP = 0x010; + const POLLNVAL = 0x020; + + int poll(pollfd*, nfds_t, int); +} +else version( darwin ) +{ + struct pollfd + { + int fd; + short events; + short revents; + }; + + alias uint nfds_t; + + enum + { + POLLIN = 0x0001, + POLLPRI = 0x0002, + POLLOUT = 0x0004, + POLLRDNORM = 0x0040, + POLLWRNORM = POLLOUT, + POLLRDBAND = 0x0080, + POLLWRBAND = 0x0100, + POLLEXTEND = 0x0200, + POLLATTRIB = 0x0400, + POLLNLINK = 0x0800, + POLLWRITE = 0x1000, + POLLERR = 0x0008, + POLLHUP = 0x0010, + POLLNVAL = 0x0020, + + POLLSTANDARD = (POLLIN|POLLPRI|POLLOUT|POLLRDNORM|POLLRDBAND| + POLLWRBAND|POLLERR|POLLHUP|POLLNVAL) + } + + int poll(pollfd*, nfds_t, int); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/posix/pthread.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/posix/pthread.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,506 @@ +/** + * D header file for POSIX. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition + */ +module tango.stdc.posix.pthread; + +public import tango.stdc.posix.sys.types; +public import tango.stdc.posix.sched; +public import tango.stdc.posix.time; + +extern (C): + +// +// Required +// +/* +PTHREAD_CANCEL_ASYNCHRONOUS +PTHREAD_CANCEL_ENABLE +PTHREAD_CANCEL_DEFERRED +PTHREAD_CANCEL_DISABLE +PTHREAD_CANCELED +PTHREAD_COND_INITIALIZER +PTHREAD_CREATE_DETACHED +PTHREAD_CREATE_JOINABLE +PTHREAD_EXPLICIT_SCHED +PTHREAD_INHERIT_SCHED +PTHREAD_MUTEX_INITIALIZER +PTHREAD_ONCE_INIT +PTHREAD_PROCESS_SHARED +PTHREAD_PROCESS_PRIVATE + +int pthread_atfork(void function(), void function(), void function()); +int pthread_attr_destroy(pthread_attr_t*); +int pthread_attr_getdetachstate(pthread_attr_t*, int*); +int pthread_attr_getschedparam(pthread_attr_t*, sched_param*); +int pthread_attr_init(pthread_attr_t*); +int pthread_attr_setdetachstate(pthread_attr_t*, int); +int pthread_attr_setschedparam(pthread_attr_t*, sched_param*); +int pthread_cancel(pthread_t); +void pthread_cleanup_push(void function(void*), void*); +void pthread_cleanup_pop(int); +int pthread_cond_broadcast(pthread_cond_t*); +int pthread_cond_destroy(pthread_cond_t*); +int pthread_cond_init(pthread_cond_t*, pthread_condattr_t*); +int pthread_cond_signal(pthread_cond_t*); +int pthread_cond_timedwait(pthread_cond_t*, pthread_mutex_t*, timespec*); +int pthread_cond_wait(pthread_cond_t*, pthread_mutex_t*); +int pthread_condattr_destroy(pthread_condattr_t*); +int pthread_condattr_init(pthread_condattr_t*); +int pthread_create(pthread_t*, pthread_attr_t*, void* function(void*), void*); +int pthread_detach(pthread_t); +int pthread_equal(pthread_t, pthread_t); +void pthread_exit(void*); +void* pthread_getspecific(pthread_key_t); +int pthread_join(pthread_t, void**); +int pthread_key_create(pthread_key_t*, void function(void*)); +int pthread_key_delete(pthread_key_t); +int pthread_mutex_destroy(pthread_mutex_t*); +int pthread_mutex_init(pthread_mutex_t*, pthread_mutexattr_t*); +int pthread_mutex_lock(pthread_mutex_t*); +int pthread_mutex_trylock(pthread_mutex_t*); +int pthread_mutex_unlock(pthread_mutex_t*); +int pthread_mutexattr_destroy(pthread_mutexattr_t*); +int pthread_mutexattr_init(pthread_mutexattr_t*); +int pthread_once(pthread_once_t*, void function()); +int pthread_rwlock_destroy(pthread_rwlock_t*); +int pthread_rwlock_init(pthread_rwlock_t*, pthread_rwlockattr_t*); +int pthread_rwlock_rdlock(pthread_rwlock_t*); +int pthread_rwlock_tryrdlock(pthread_rwlock_t*); +int pthread_rwlock_trywrlock(pthread_rwlock_t*); +int pthread_rwlock_unlock(pthread_rwlock_t*); +int pthread_rwlock_wrlock(pthread_rwlock_t*); +int pthread_rwlockattr_destroy(pthread_rwlockattr_t*); +int pthread_rwlockattr_init(pthread_rwlockattr_t*); +pthread_t pthread_self(); +int pthread_setcancelstate(int, int*); +int pthread_setcanceltype(int, int*); +int pthread_setspecific(pthread_key_t, void*); +void pthread_testcancel(); +*/ + +enum +{ + PTHREAD_CANCEL_ENABLE, + PTHREAD_CANCEL_DISABLE +} + +enum +{ + PTHREAD_CANCEL_DEFERRED, + PTHREAD_CANCEL_ASYNCHRONOUS +} + +const PTHREAD_CANCELED = cast(void*) -1; + +//const pthread_mutex_t PTHREAD_COND_INITIALIZER = { __LOCK_ALT_INITIALIZER, 0, "", 0 }; + +enum +{ + PTHREAD_CREATE_JOINABLE, + PTHREAD_CREATE_DETACHED +} + +enum +{ + PTHREAD_INHERIT_SCHED, + PTHREAD_EXPLICIT_SCHED +} + +//const pthread_mutex_t PTHREAD_MUTEX_INITIALIZER = { 0, 0, null, PTHREAD_MUTEX_NORMAL, { 0, 0 } }; + +const PTHREAD_ONCE_INIT = 0; + +enum +{ + PTHREAD_PROCESS_PRIVATE, + PTHREAD_PROCESS_SHARED +} + +int pthread_atfork(void function(), void function(), void function()); +int pthread_attr_destroy(pthread_attr_t*); +int pthread_attr_getdetachstate(pthread_attr_t*, int*); +int pthread_attr_getschedparam(pthread_attr_t*, sched_param*); +int pthread_attr_init(pthread_attr_t*); +int pthread_attr_setdetachstate(pthread_attr_t*, int); +int pthread_attr_setschedparam(pthread_attr_t*, sched_param*); +int pthread_cancel(pthread_t); + +version( linux ) +{ + alias void function(void*) _pthread_cleanup_routine; + + struct _pthread_cleanup_buffer + { + _pthread_cleanup_routine __routine; + void* __arg; + int __canceltype; + _pthread_cleanup_buffer* __prev; + } + + void _pthread_cleanup_push(_pthread_cleanup_buffer*, _pthread_cleanup_routine, void*); + void _pthread_cleanup_pop(_pthread_cleanup_buffer*, int); + + struct pthread_cleanup + { + _pthread_cleanup_buffer buffer = void; + + void push()( _pthread_cleanup_routine routine, void* arg ) + { + _pthread_cleanup_push( &buffer, routine, arg ); + } + + void pop()( int execute ) + { + _pthread_cleanup_pop( &buffer, execute ); + } + } +} +else version( darwin ) +{ + alias void function(void*) _pthread_cleanup_routine; + + struct _pthread_cleanup_buffer + { + _pthread_cleanup_routine __routine; + void* __arg; + _pthread_cleanup_buffer* __next; + } + + struct pthread_cleanup + { + _pthread_cleanup_buffer buffer = void; + + void push()( _pthread_cleanup_routine routine, void* arg ) + { + pthread_t self = pthread_self(); + buffer.__routine = routine; + buffer.__arg = arg; + buffer.__next = cast(_pthread_cleanup_buffer*) self.__cleanup_stack; + self.__cleanup_stack = cast(pthread_handler_rec*) &buffer; + } + + void pop()( int execute ) + { + pthread_t self = pthread_self(); + self.__cleanup_stack = cast(pthread_handler_rec*) buffer.__next; + if( execute ) + { + buffer.__routine( buffer.__arg ); + } + } + } +} +else +{ + void pthread_cleanup_push(void function(void*), void*); + void pthread_cleanup_pop(int); +} + +int pthread_cond_broadcast(pthread_cond_t*); +int pthread_cond_destroy(pthread_cond_t*); +int pthread_cond_init(pthread_cond_t*, pthread_condattr_t*); +int pthread_cond_signal(pthread_cond_t*); +int pthread_cond_timedwait(pthread_cond_t*, pthread_mutex_t*, timespec*); +int pthread_cond_wait(pthread_cond_t*, pthread_mutex_t*); +int pthread_condattr_destroy(pthread_condattr_t*); +int pthread_condattr_init(pthread_condattr_t*); +int pthread_create(pthread_t*, pthread_attr_t*, void* function(void*), void*); +int pthread_detach(pthread_t); +int pthread_equal(pthread_t, pthread_t); +void pthread_exit(void*); +void* pthread_getspecific(pthread_key_t); +int pthread_join(pthread_t, void**); +int pthread_key_create(pthread_key_t*, void function(void*)); +int pthread_key_delete(pthread_key_t); +int pthread_mutex_destroy(pthread_mutex_t*); +int pthread_mutex_init(pthread_mutex_t*, pthread_mutexattr_t*); +int pthread_mutex_lock(pthread_mutex_t*); +int pthread_mutex_trylock(pthread_mutex_t*); +int pthread_mutex_unlock(pthread_mutex_t*); +int pthread_mutexattr_destroy(pthread_mutexattr_t*); +int pthread_mutexattr_init(pthread_mutexattr_t*); +int pthread_once(pthread_once_t*, void function()); +int pthread_rwlock_destroy(pthread_rwlock_t*); +int pthread_rwlock_init(pthread_rwlock_t*, pthread_rwlockattr_t*); +int pthread_rwlock_rdlock(pthread_rwlock_t*); +int pthread_rwlock_tryrdlock(pthread_rwlock_t*); +int pthread_rwlock_trywrlock(pthread_rwlock_t*); +int pthread_rwlock_unlock(pthread_rwlock_t*); +int pthread_rwlock_wrlock(pthread_rwlock_t*); +int pthread_rwlockattr_destroy(pthread_rwlockattr_t*); +int pthread_rwlockattr_init(pthread_rwlockattr_t*); +pthread_t pthread_self(); +int pthread_setcancelstate(int, int*); +int pthread_setcanceltype(int, int*); +int pthread_setspecific(pthread_key_t, void*); +void pthread_testcancel(); + +// +// Barrier (BAR) +// +/* +PTHREAD_BARRIER_SERIAL_THREAD + +int pthread_barrier_destroy(pthread_barrier_t*); +int pthread_barrier_init(pthread_barrier_t*, pthread_barrierattr_t*, uint); +int pthread_barrier_wait(pthread_barrier_t*); +int pthread_barrierattr_destroy(pthread_barrierattr_t*); +int pthread_barrierattr_getpshared(pthread_barrierattr_t*, int*); (BAR|TSH) +int pthread_barrierattr_init(pthread_barrierattr_t*); +int pthread_barrierattr_setpshared(pthread_barrierattr_t*, int); (BAR|TSH) +*/ + +version( linux ) +{ + const PTHREAD_BARRIER_SERIAL_THREAD = -1; + + int pthread_barrier_destroy(pthread_barrier_t*); + int pthread_barrier_init(pthread_barrier_t*, pthread_barrierattr_t*, uint); + int pthread_barrier_wait(pthread_barrier_t*); + int pthread_barrierattr_destroy(pthread_barrierattr_t*); + int pthread_barrierattr_getpshared(pthread_barrierattr_t*, int*); + int pthread_barrierattr_init(pthread_barrierattr_t*); + int pthread_barrierattr_setpshared(pthread_barrierattr_t*, int); +} +else version( darwin ) +{ + // NOTE: The following definitions are Tango-specific because darwin does + // not support them directly. + + const PTHREAD_BARRIER_SERIAL_THREAD = -1; + + int pthread_barrier_destroy(pthread_barrier_t*); + int pthread_barrier_init(pthread_barrier_t*, pthread_barrierattr_t*, uint); + int pthread_barrier_wait(pthread_barrier_t*); + int pthread_barrierattr_destroy(pthread_barrierattr_t*); + int pthread_barrierattr_getpshared(pthread_barrierattr_t*, int*); + int pthread_barrierattr_init(pthread_barrierattr_t*); + int pthread_barrierattr_setpshared(pthread_barrierattr_t*, int); +} + +// +// Clock (CS) +// +/* +int pthread_condattr_getclock(pthread_condattr_t*, clockid_t*); +int pthread_condattr_setclock(pthread_condattr_t*, clockid_t); +*/ + +// +// Spinlock (SPI) +// +/* +int pthread_spin_destroy(pthread_spinlock_t*); +int pthread_spin_init(pthread_spinlock_t*, int); +int pthread_spin_lock(pthread_spinlock_t*); +int pthread_spin_trylock(pthread_spinlock_t*); +int pthread_spin_unlock(pthread_spinlock_t*); +*/ + +version( linux ) +{ + int pthread_spin_destroy(pthread_spinlock_t*); + int pthread_spin_init(pthread_spinlock_t*, int); + int pthread_spin_lock(pthread_spinlock_t*); + int pthread_spin_trylock(pthread_spinlock_t*); + int pthread_spin_unlock(pthread_spinlock_t*); +} + +// +// XOpen (XSI) +// +/* +PTHREAD_MUTEX_DEFAULT +PTHREAD_MUTEX_ERRORCHECK +PTHREAD_MUTEX_NORMAL +PTHREAD_MUTEX_RECURSIVE + +int pthread_attr_getguardsize(pthread_attr_t*, size_t*); +int pthread_attr_setguardsize(pthread_attr_t*, size_t); +int pthread_getconcurrency(); +int pthread_mutexattr_gettype(pthread_mutexattr_t*, int*); +int pthread_mutexattr_settype(pthread_mutexattr_t*, int); +int pthread_setconcurrency(int); +*/ + +version( linux ) +{ + const PTHREAD_MUTEX_NORMAL = 0; + const PTHREAD_MUTEX_RECURSIVE = 1; + const PTHREAD_MUTEX_ERRORCHECK = 2; + const PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL; + + int pthread_attr_getguardsize(pthread_attr_t*, size_t*); + int pthread_attr_setguardsize(pthread_attr_t*, size_t); + int pthread_getconcurrency(); + int pthread_mutexattr_gettype(pthread_mutexattr_t*, int*); + int pthread_mutexattr_settype(pthread_mutexattr_t*, int); + int pthread_setconcurrency(int); +} +else version( darwin ) +{ + const PTHREAD_MUTEX_NORMAL = 0; + const PTHREAD_MUTEX_ERRORCHECK = 1; + const PTHREAD_MUTEX_RECURSIVE = 2; + const PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL; + + int pthread_attr_getguardsize(pthread_attr_t*, size_t*); + int pthread_attr_setguardsize(pthread_attr_t*, size_t); + int pthread_getconcurrency(); + int pthread_mutexattr_gettype(pthread_mutexattr_t*, int*); + int pthread_mutexattr_settype(pthread_mutexattr_t*, int); + int pthread_setconcurrency(int); +} + +// +// CPU Time (TCT) +// +/* +int pthread_getcpuclockid(pthread_t, clockid_t*); +*/ + +version( linux ) +{ + int pthread_getcpuclockid(pthread_t, clockid_t*); +} + +// +// Timeouts (TMO) +// +/* +int pthread_mutex_timedlock(pthread_mutex_t*, timespec*); +int pthread_rwlock_timedrdlock(pthread_rwlock_t*, timespec*); +int pthread_rwlock_timedwrlock(pthread_rwlock_t*, timespec*); +*/ + +version( linux ) +{ + int pthread_mutex_timedlock(pthread_mutex_t*, timespec*); + int pthread_rwlock_timedrdlock(pthread_rwlock_t*, timespec*); + int pthread_rwlock_timedwrlock(pthread_rwlock_t*, timespec*); +} +else version( darwin ) +{ + int pthread_mutex_timedlock(pthread_mutex_t*, timespec*); + int pthread_rwlock_timedrdlock(pthread_rwlock_t*, timespec*); + int pthread_rwlock_timedwrlock(pthread_rwlock_t*, timespec*); +} + +// +// Priority (TPI|TPP) +// +/* +PTHREAD_PRIO_INHERIT (TPI) +PTHREAD_PRIO_NONE (TPP|TPI) +PTHREAD_PRIO_PROTECT (TPI) + +int pthread_mutex_getprioceiling(pthread_mutex_t*, int*); (TPP) +int pthread_mutex_setprioceiling(pthread_mutex_t*, int, int*); (TPP) +int pthread_mutexattr_getprioceiling(pthread_mutexattr_t*, int*); (TPP) +int pthread_mutexattr_getprotocol(pthread_mutexattr_t*, int*); (TPI|TPP) +int pthread_mutexattr_setprioceiling(pthread_mutexattr_t*, int); (TPP) +int pthread_mutexattr_setprotocol(pthread_mutexattr_t*, int); (TPI|TPP) +*/ + +// +// Scheduling (TPS) +// +/* +PTHREAD_SCOPE_PROCESS +PTHREAD_SCOPE_SYSTEM + +int pthread_attr_getinheritsched(pthread_attr_t*, int*); +int pthread_attr_getschedpolicy(pthread_attr_t*, int*); +int pthread_attr_getscope(pthread_attr_t*, int*); +int pthread_attr_setinheritsched(pthread_attr_t*, int); +int pthread_attr_setschedpolicy(pthread_attr_t*, int); +int pthread_attr_setscope(pthread_attr_t*, int); +int pthread_getschedparam(pthread_t, int*, sched_param*); +int pthread_setschedparam(pthread_t, int, sched_param*); +int pthread_setschedprio(pthread_t, int); +*/ + +version( linux ) +{ + enum + { + PTHREAD_SCOPE_SYSTEM, + PTHREAD_SCOPE_PROCESS + } + + int pthread_attr_getinheritsched(pthread_attr_t*, int*); + int pthread_attr_getschedpolicy(pthread_attr_t*, int*); + int pthread_attr_getscope(pthread_attr_t*, int*); + int pthread_attr_setinheritsched(pthread_attr_t*, int); + int pthread_attr_setschedpolicy(pthread_attr_t*, int); + int pthread_attr_setscope(pthread_attr_t*, int); + int pthread_getschedparam(pthread_t, int*, sched_param*); + int pthread_setschedparam(pthread_t, int, sched_param*); + //int pthread_setschedprio(pthread_t, int); +} +else version( darwin ) +{ + enum + { + PTHREAD_SCOPE_SYSTEM = 1, + PTHREAD_SCOPE_PROCESS = 2 + } + + int pthread_attr_getinheritsched(pthread_attr_t*, int*); + int pthread_attr_getschedpolicy(pthread_attr_t*, int*); + int pthread_attr_getscope(pthread_attr_t*, int*); + int pthread_attr_setinheritsched(pthread_attr_t*, int); + int pthread_attr_setschedpolicy(pthread_attr_t*, int); + int pthread_attr_setscope(pthread_attr_t*, int); + int pthread_getschedparam(pthread_t, int*, sched_param*); + int pthread_setschedparam(pthread_t, int, sched_param*); + //int pthread_setschedprio(pthread_t, int); +} + +// +// Stack (TSA|TSS) +// +/* +int pthread_attr_getstack(pthread_attr_t*, void**, size_t*); (TSA|TSS) +int pthread_attr_getstackaddr(pthread_attr_t*, void**); (TSA) +int pthread_attr_getstacksize(pthread_attr_t*, size_t*); (TSS) +int pthread_attr_setstack(pthread_attr_t*, void*, size_t); (TSA|TSS) +int pthread_attr_setstackaddr(pthread_attr_t*, void*); (TSA) +int pthread_attr_setstacksize(pthread_attr_t*, size_t); (TSS) +*/ + +version( linux ) +{ + int pthread_attr_getstack(pthread_attr_t*, void**, size_t*); + int pthread_attr_getstackaddr(pthread_attr_t*, void**); + int pthread_attr_getstacksize(pthread_attr_t*, size_t*); + int pthread_attr_setstack(pthread_attr_t*, void*, size_t); + int pthread_attr_setstackaddr(pthread_attr_t*, void*); + int pthread_attr_setstacksize(pthread_attr_t*, size_t); +} +else version( darwin ) +{ + int pthread_attr_getstack(pthread_attr_t*, void**, size_t*); + int pthread_attr_getstackaddr(pthread_attr_t*, void**); + int pthread_attr_getstacksize(pthread_attr_t*, size_t*); + int pthread_attr_setstack(pthread_attr_t*, void*, size_t); + int pthread_attr_setstackaddr(pthread_attr_t*, void*); + int pthread_attr_setstacksize(pthread_attr_t*, size_t); +} + +// +// Shared Synchronization (TSH) +// +/* +int pthread_condattr_getpshared(pthread_condattr_t*, int*); +int pthread_condattr_setpshared(pthread_condattr_t*, int); +int pthread_mutexattr_getpshared(pthread_mutexattr_t*, int*); +int pthread_mutexattr_setpshared(pthread_mutexattr_t*, int); +int pthread_rwlockattr_getpshared(pthread_rwlockattr_t*, int*); +int pthread_rwlockattr_setpshared(pthread_rwlockattr_t*, int); +*/ diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/posix/pwd.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/posix/pwd.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,104 @@ +/** + * D header file for POSIX. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition + */ +module tango.stdc.posix.pwd; + +private import tango.stdc.posix.config; +public import tango.stdc.posix.sys.types; // for gid_t, uid_t + +extern (C): + +// +// Required +// +/* +struct passwd +{ + char* pw_name; + uid_t pw_uid; + gid_t pw_gid; + char* pw_dir; + char* pw_shell; +} + +passwd* getpwnam(char*); +passwd* getpwuid(uid_t); +*/ + +version( linux ) +{ + struct passwd + { + char* pw_name; + char* pw_passwd; + uid_t pw_uid; + gid_t pw_gid; + char* pw_gecos; + char* pw_dir; + char* pw_shell; + } +} +else version( darwin ) +{ + struct passwd + { + char* pw_name; + char* pw_passwd; + uid_t pw_uid; + gid_t pw_gid; + time_t pw_change; + char* pw_class; + char* pw_gecos; + char* pw_dir; + char* pw_shell; + time_t pw_expire; + } +} + +passwd* getpwnam(char*); +passwd* getpwuid(uid_t); + +// +// Thread-Safe Functions (TSF) +// +/* +int getpwnam_r(char*, passwd*, char*, size_t, passwd**); +int getpwuid_r(uid_t, passwd*, char*, size_t, passwd**); +*/ + +version( linux ) +{ + int getpwnam_r(char*, passwd*, char*, size_t, passwd**); + int getpwuid_r(uid_t, passwd*, char*, size_t, passwd**); +} +else version( darwin ) +{ + int getpwnam_r(char*, passwd*, char*, size_t, passwd**); + int getpwuid_r(uid_t, passwd*, char*, size_t, passwd**); +} +// +// XOpen (XSI) +// +/* +void endpwent(); +passwd* getpwent(); +void setpwent(); +*/ + +version( linux ) +{ + void endpwent(); + passwd* getpwent(); + void setpwent(); +} +else version ( darwin ) +{ + void endpwent(); + passwd* getpwent(); + void setpwent(); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/posix/sched.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/posix/sched.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,109 @@ +/** + * D header file for POSIX. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition + */ +module tango.stdc.posix.sched; + +public import tango.stdc.posix.time; +public import tango.stdc.posix.sys.types; + +extern (C): + +// +// Required +// +/* +struct sched_param +{ + int sched_priority (THR) + int sched_ss_low_priority (SS|TSP) + struct timespec sched_ss_repl_period (SS|TSP) + struct timespec sched_ss_init_budget (SS|TSP) + int sched_ss_max_repl (SS|TSP) +} + +SCHED_FIFO +SCHED_RR +SCHED_SPORADIC (SS|TSP) +SCHED_OTHER + +int sched_getparam(pid_t, sched_param*); +int sched_getscheduler(pid_t); +int sched_setparam(pid_t, sched_param*); +int sched_setscheduler(pid_t, int, sched_param*); +*/ + +version( linux ) +{ + struct sched_param + { + int sched_priority; + } + + const SCHED_OTHER = 0; + const SCHED_FIFO = 1; + const SCHED_RR = 2; + //SCHED_SPORADIC (SS|TSP) +} +else version( darwin ) +{ + const SCHED_OTHER = 1; + const SCHED_FIFO = 4; + const SCHED_RR = 2; + // SCHED_SPORADIC seems to be unavailable + + private const __SCHED_PARAM_SIZE__ = 4; + + struct sched_param + { + int sched_priority; + byte[__SCHED_PARAM_SIZE__] opaque; + } +} + +int sched_getparam(pid_t, sched_param*); +int sched_getscheduler(pid_t); +int sched_setparam(pid_t, sched_param*); +int sched_setscheduler(pid_t, int, sched_param*); + +// +// Thread (THR) +// +/* +int sched_yield(); +*/ + +version( linux ) +{ + int sched_yield(); +} +else version( darwin ) +{ + int sched_yield(); +} + +// +// Scheduling (TPS) +// +/* +int sched_get_priority_max(int); +int sched_get_priority_min(int); +int sched_rr_get_interval(pid_t, timespec*); +*/ + +version( linux ) +{ + int sched_get_priority_max(int); + int sched_get_priority_min(int); + int sched_rr_get_interval(pid_t, timespec*); +} +else version( darwin ) +{ + int sched_get_priority_min(int); + int sched_get_priority_max(int); + //int sched_rr_get_interval(pid_t, timespec*); // FIXME: unavailable? +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/posix/semaphore.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/posix/semaphore.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,84 @@ +/** + * D header file for POSIX. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition + */ +module tango.stdc.posix.semaphore; + +private import tango.stdc.posix.config; +private import tango.stdc.posix.time; + +extern (C): + +// +// Required +// +/* +sem_t +SEM_FAILED + +int sem_close(sem_t*); +int sem_destroy(sem_t*); +int sem_getvalue(sem_t*, int*); +int sem_init(sem_t*, int, uint); +sem_t* sem_open(char*, int, ...); +int sem_post(sem_t*); +int sem_trywait(sem_t*); +int sem_unlink(char*); +int sem_wait(sem_t*); +*/ + +version( linux ) +{ + private alias int __atomic_lock_t; + + private struct _pthread_fastlock + { + c_long __status; + __atomic_lock_t __spinlock; + } + + struct sem_t + { + _pthread_fastlock __sem_lock; + int __sem_value; + void* __sem_waiting; + } + + const SEM_FAILED = cast(sem_t*) null; +} +else version( darwin ) +{ + alias int sem_t; + + const SEM_FAILED = cast(sem_t*) null; +} + +int sem_close(sem_t*); +int sem_destroy(sem_t*); +int sem_getvalue(sem_t*, int*); +int sem_init(sem_t*, int, uint); +sem_t* sem_open(char*, int, ...); +int sem_post(sem_t*); +int sem_trywait(sem_t*); +int sem_unlink(char*); +int sem_wait(sem_t*); + +// +// Timeouts (TMO) +// +/* +int sem_timedwait(sem_t*, timespec*); +*/ + +version( linux ) +{ + int sem_timedwait(sem_t*, timespec*); +} +else version( darwin ) +{ + int sem_timedwait(sem_t*, timespec*); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/posix/setjmp.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/posix/setjmp.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,99 @@ +/** + * D header file for POSIX. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition + */ +module tango.stdc.posix.setjmp; + +private import tango.stdc.posix.config; +private import tango.stdc.posix.signal; // for sigset_t + +extern (C): + +// +// Required +// +/* +jmp_buf + +int setjmp(jmp_buf); +void longjmp(jmp_buf, int); +*/ + +version( linux ) +{ + version( X86_64 ) + { + //const JB_BX = 0; + //const JB_BP = 1; + //const JB_12 = 2; + //const JB_13 = 3; + //const JB_14 = 4; + //const JB_15 = 5; + //const JB_SP = 6; + //const JB_PC = 7; + //const JB_SIZE = 64; + + alias long[8] __jmp_buf; + } + else version( X86 ) + { + //const JB_BX = 0; + //const JB_SI = 1; + //const JB_DI = 2; + //const JB_BP = 3; + //const JB_SP = 4; + //const JB_PC = 5; + //const JB_SIZE = 24; + + alias int[6] __jmp_buf; + } + + struct __jmp_buf_tag + { + __jmp_buf __jmpbuf; + int __mask_was_saved; + sigset_t __saved_mask; + } + + alias __jmp_buf_tag[1] jmp_buf; + + alias _setjmp setjmp; // see XOpen block + void longjmp(jmp_buf, int); +} + +// +// C Extension (CX) +// +/* +sigjmp_buf + +int sigsetjmp(sigjmp_buf, int); +void siglongjmp(sigjmp_buf, int); +*/ + +version( linux ) +{ + alias jmp_buf sigjmp_buf; + + int __sigsetjmp(sigjmp_buf, int); + alias __sigsetjmp sigsetjmp; + void siglongjmp(sigjmp_buf, int); +} + +// +// XOpen (XSI) +// +/* +int _setjmp(jmp_buf); +void _longjmp(jmp_buf, int); +*/ + +version( linux ) +{ + int _setjmp(jmp_buf); + void _longjmp(jmp_buf, int); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/posix/signal.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/posix/signal.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,716 @@ +/** + * D header file for POSIX. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition + */ +module tango.stdc.posix.signal; + +private import tango.stdc.posix.config; +public import tango.stdc.signal; +public import tango.stdc.stddef; // for size_t +public import tango.stdc.posix.sys.types; // for pid_t +//public import tango.stdc.posix.time; // for timespec, now defined here + +extern (C): + +private alias void function(int) sigfn_t; +private alias void function(int, siginfo_t*, void*) sigactfn_t; + +// +// Required +// +/* +SIG_DFL (defined in tango.stdc.signal) +SIG_ERR (defined in tango.stdc.signal) +SIG_IGN (defined in tango.stdc.signal) + +sig_atomic_t (defined in tango.stdc.signal) + +SIGEV_NONE +SIGEV_SIGNAL +SIGEV_THREAD + +union sigval +{ + int sival_int; + void* sival_ptr; +} + +SIGRTMIN +SIGRTMAX + +SIGABRT (defined in tango.stdc.signal) +SIGALRM +SIGBUS +SIGCHLD +SIGCONT +SIGFPE (defined in tango.stdc.signal) +SIGHUP +SIGILL (defined in tango.stdc.signal) +SIGINT (defined in tango.stdc.signal) +SIGKILL +SIGPIPE +SIGQUIT +SIGSEGV (defined in tango.stdc.signal) +SIGSTOP +SIGTERM (defined in tango.stdc.signal) +SIGTSTP +SIGTTIN +SIGTTOU +SIGUSR1 +SIGUSR2 +SIGURG + +struct sigaction_t +{ + sigfn_t sa_handler; + sigset_t sa_mask; + sigactfn_t sa_sigaction; +} + +sigfn_t signal(int sig, sigfn_t func); (defined in tango.stdc.signal) +int raise(int sig); (defined in tango.stdc.signal) +*/ + +//SIG_DFL (defined in tango.stdc.signal) +//SIG_ERR (defined in tango.stdc.signal) +//SIG_IGN (defined in tango.stdc.signal) + +//sig_atomic_t (defined in tango.stdc.signal) + +enum +{ + SIGEV_SIGNAL, + SIGEV_NONE, + SIGEV_THREAD +} + +union sigval +{ + int sival_int; + void* sival_ptr; +} + +private extern (C) int __libc_current_sigrtmin(); +private extern (C) int __libc_current_sigrtmax(); + +alias __libc_current_sigrtmin SIGRTMIN; +alias __libc_current_sigrtmax SIGRTMAX; + +version( linux ) +{ + //SIGABRT (defined in tango.stdc.signal) + const SIGALRM = 14; + const SIGBUS = 7; + const SIGCHLD = 17; + const SIGCONT = 18; + //SIGFPE (defined in tango.stdc.signal) + const SIGHUP = 1; + //SIGILL (defined in tango.stdc.signal) + //SIGINT (defined in tango.stdc.signal) + const SIGKILL = 9; + const SIGPIPE = 13; + const SIGQUIT = 3; + //SIGSEGV (defined in tango.stdc.signal) + const SIGSTOP = 19; + //SIGTERM (defined in tango.stdc.signal) + const SIGTSTP = 20; + const SIGTTIN = 21; + const SIGTTOU = 22; + const SIGUSR1 = 10; + const SIGUSR2 = 12; + const SIGURG = 23; +} +else version( darwin ) +{ + //SIGABRT (defined in tango.stdc.signal) + const SIGALRM = 14; + const SIGBUS = 10; + const SIGCHLD = 20; + const SIGCONT = 19; + //SIGFPE (defined in tango.stdc.signal) + const SIGHUP = 1; + //SIGILL (defined in tango.stdc.signal) + //SIGINT (defined in tango.stdc.signal) + const SIGKILL = 9; + const SIGPIPE = 13; + const SIGQUIT = 3; + //SIGSEGV (defined in tango.stdc.signal) + const SIGSTOP = 17; + //SIGTERM (defined in tango.stdc.signal) + const SIGTSTP = 18; + const SIGTTIN = 21; + const SIGTTOU = 22; + const SIGUSR1 = 30; + const SIGUSR2 = 31; + const SIGURG = 16; +} + +struct sigaction_t +{ + static if( true /* __USE_POSIX199309 */ ) + { + union + { + sigfn_t sa_handler; + sigactfn_t sa_sigaction; + } + } + else + { + sigfn_t sa_handler; + } + sigset_t sa_mask; + int sa_flags; + + version( darwin ) {} else { + void function() sa_restorer; + } +} + +// +// C Extension (CX) +// +/* +SIG_HOLD + +sigset_t +pid_t (defined in sys.types) + +SIGABRT (defined in tango.stdc.signal) +SIGFPE (defined in tango.stdc.signal) +SIGILL (defined in tango.stdc.signal) +SIGINT (defined in tango.stdc.signal) +SIGSEGV (defined in tango.stdc.signal) +SIGTERM (defined in tango.stdc.signal) + +SA_NOCLDSTOP (CX|XSI) +SIG_BLOCK +SIG_UNBLOCK +SIG_SETMASK + +struct siginfo_t +{ + int si_signo; + int si_code; + + version( XSI ) + { + int si_errno; + pid_t si_pid; + uid_t si_uid; + void* si_addr; + int si_status; + c_long si_band; + } + version( RTS ) + { + sigval si_value; + } +} + +SI_USER +SI_QUEUE +SI_TIMER +SI_ASYNCIO +SI_MESGQ + +int kill(pid_t, int); +int sigaction(int, sigaction_t*, sigaction_t*); +int sigaddset(sigset_t*, int); +int sigdelset(sigset_t*, int); +int sigemptyset(sigset_t*); +int sigfillset(sigset_t*); +int sigismember( sigset_t*, int); +int sigpending(sigset_t*); +int sigprocmask(int, sigset_t*, sigset_t*); +int sigsuspend(sigset_t*); +int sigwait(sigset_t*, int*); +*/ + +version( linux ) +{ + const SIG_HOLD = cast(sigfn_t) 1; + + private const _SIGSET_NWORDS = 1024 / (8 * c_ulong.sizeof); + + struct sigset_t + { + c_ulong[_SIGSET_NWORDS] __val; + } + + // pid_t (defined in sys.types) + + //SIGABRT (defined in tango.stdc.signal) + //SIGFPE (defined in tango.stdc.signal) + //SIGILL (defined in tango.stdc.signal) + //SIGINT (defined in tango.stdc.signal) + //SIGSEGV (defined in tango.stdc.signal) + //SIGTERM (defined in tango.stdc.signal) + + const SA_NOCLDSTOP = 1; // (CX|XSI) + + const SIG_BLOCK = 0; + const SIG_UNBLOCK = 1; + const SIG_SETMASK = 2; + + private const __SI_MAX_SIZE = 128; + + static if( false /* __WORDSIZE == 64 */ ) + { + private const __SI_PAD_SIZE = ((__SI_MAX_SIZE / int.sizeof) - 4); + } + else + { + private const __SI_PAD_SIZE = ((__SI_MAX_SIZE / int.sizeof) - 3); + } + + struct siginfo_t + { + int si_signo; // Signal number + int si_errno; // If non-zero, an errno value associated with + // this signal, as defined in + int si_code; // Signal code + + union _sifields_t + { + int _pad[__SI_PAD_SIZE]; + + // kill() + struct _kill_t + { + pid_t si_pid; // Sending process ID + uid_t si_uid; // Real user ID of sending process + } _kill_t _kill; + + // POSIX.1b timers. + struct _timer_t + { + int si_tid; // Timer ID + int si_overrun; // Overrun count + sigval si_sigval; // Signal value + } _timer_t _timer; + + // POSIX.1b signals + struct _rt_t + { + pid_t si_pid; // Sending process ID + uid_t si_uid; // Real user ID of sending process + sigval si_sigval; // Signal value + } _rt_t _rt; + + // SIGCHLD + struct _sigchild_t + { + pid_t si_pid; // Which child + uid_t si_uid; // Real user ID of sending process + int si_status; // Exit value or signal + clock_t si_utime; + clock_t si_stime; + } _sigchild_t _sigchld; + + // SIGILL, SIGFPE, SIGSEGV, SIGBUS + struct _sigfault_t + { + void* si_addr; // Faulting insn/memory ref + } _sigfault_t _sigfault; + + // SIGPOLL + struct _sigpoll_t + { + c_long si_band; // Band event for SIGPOLL + int si_fd; + } _sigpoll_t _sigpoll; + } _sifields_t _sifields; + } + + enum + { + SI_ASYNCNL = -60, + SI_TKILL = -6, + SI_SIGIO, + SI_ASYNCIO, + SI_MESGQ, + SI_TIMER, + SI_QUEUE, + SI_USER, + SI_KERNEL = 0x80 + } + + int kill(pid_t, int); + int sigaction(int, sigaction_t*, sigaction_t*); + int sigaddset(sigset_t*, int); + int sigdelset(sigset_t*, int); + int sigemptyset(sigset_t*); + int sigfillset(sigset_t*); + int sigismember( sigset_t*, int); + int sigpending(sigset_t*); + int sigprocmask(int, sigset_t*, sigset_t*); + int sigsuspend(sigset_t*); + int sigwait(sigset_t*, int*); +} +else version( darwin ) +{ + //SIG_HOLD + + alias uint sigset_t; + // pid_t (defined in sys.types) + + //SIGABRT (defined in tango.stdc.signal) + //SIGFPE (defined in tango.stdc.signal) + //SIGILL (defined in tango.stdc.signal) + //SIGINT (defined in tango.stdc.signal) + //SIGSEGV (defined in tango.stdc.signal) + //SIGTERM (defined in tango.stdc.signal) + + //SA_NOCLDSTOP (CX|XSI) + + //SIG_BLOCK + //SIG_UNBLOCK + //SIG_SETMASK + + struct siginfo_t + { + int si_signo; + int si_errno; + int si_code; + pid_t si_pid; + uid_t si_uid; + int si_status; + void* si_addr; + sigval si_value; + int si_band; + uint pad[7]; + } + + //SI_USER + //SI_QUEUE + //SI_TIMER + //SI_ASYNCIO + //SI_MESGQ + + int kill(pid_t, int); + int sigaction(int, sigaction_t*, sigaction_t*); + int sigaddset(sigset_t*, int); + int sigdelset(sigset_t*, int); + int sigemptyset(sigset_t*); + int sigfillset(sigset_t*); + int sigismember( sigset_t*, int); + int sigpending(sigset_t*); + int sigprocmask(int, sigset_t*, sigset_t*); + int sigsuspend(sigset_t*); + int sigwait(sigset_t*, int*); +} + +// +// XOpen (XSI) +// +/* +SIGPOLL +SIGPROF +SIGSYS +SIGTRAP +SIGVTALRM +SIGXCPU +SIGXFSZ + +SA_ONSTACK +SA_RESETHAND +SA_RESTART +SA_SIGINFO +SA_NOCLDWAIT +SA_NODEFER +SS_ONSTACK +SS_DISABLE +MINSIGSTKSZ +SIGSTKSZ + +ucontext_t // from ucontext +mcontext_t // from ucontext + +struct stack_t +{ + void* ss_sp; + size_t ss_size; + int ss_flags; +} + +struct sigstack +{ + int ss_onstack; + void* ss_sp; +} + +ILL_ILLOPC +ILL_ILLOPN +ILL_ILLADR +ILL_ILLTRP +ILL_PRVOPC +ILL_PRVREG +ILL_COPROC +ILL_BADSTK + +FPE_INTDIV +FPE_INTOVF +FPE_FLTDIV +FPE_FLTOVF +FPE_FLTUND +FPE_FLTRES +FPE_FLTINV +FPE_FLTSUB + +SEGV_MAPERR +SEGV_ACCERR + +BUS_ADRALN +BUS_ADRERR +BUS_OBJERR + +TRAP_BRKPT +TRAP_TRACE + +CLD_EXITED +CLD_KILLED +CLD_DUMPED +CLD_TRAPPED +CLD_STOPPED +CLD_CONTINUED + +POLL_IN +POLL_OUT +POLL_MSG +POLL_ERR +POLL_PRI +POLL_HUP + +sigfn_t bsd_signal(int sig, sigfn_t func); +sigfn_t sigset(int sig, sigfn_t func); + +int killpg(pid_t, int); +int sigaltstack(stack_t*, stack_t*); +int sighold(int); +int sigignore(int); +int siginterrupt(int, int); +int sigpause(int); +int sigrelse(int); +*/ + +version( linux ) +{ + const SIGPOLL = 29; + const SIGPROF = 27; + const SIGSYS = 31; + const SIGTRAP = 5; + const SIGVTALRM = 26; + const SIGXCPU = 24; + const SIGXFSZ = 25; + + const SA_ONSTACK = 0x08000000; + const SA_RESETHAND = 0x80000000; + const SA_RESTART = 0x10000000; + const SA_SIGINFO = 4; + const SA_NOCLDWAIT = 2; + const SA_NODEFER = 0x40000000; + const SS_ONSTACK = 1; + const SS_DISABLE = 2; + const MINSIGSTKSZ = 2048; + const SIGSTKSZ = 8192; + + //ucontext_t (defined in tango.stdc.posix.ucontext) + //mcontext_t (defined in tango.stdc.posix.ucontext) + + struct stack_t + { + void* ss_sp; + int ss_flags; + size_t ss_size; + } + + struct sigstack + { + void* ss_sp; + int ss_onstack; + } + + enum + { + ILL_ILLOPC = 1, + ILL_ILLOPN, + ILL_ILLADR, + ILL_ILLTRP, + ILL_PRVOPC, + ILL_PRVREG, + ILL_COPROC, + ILL_BADSTK + } + + enum + { + FPE_INTDIV = 1, + FPE_INTOVF, + FPE_FLTDIV, + FPE_FLTOVF, + FPE_FLTUND, + FPE_FLTRES, + FPE_FLTINV, + FPE_FLTSUB + } + + enum + { + SEGV_MAPERR = 1, + SEGV_ACCERR + } + + enum + { + BUS_ADRALN = 1, + BUS_ADRERR, + BUS_OBJERR + } + + enum + { + TRAP_BRKPT = 1, + TRAP_TRACE + } + + enum + { + CLD_EXITED = 1, + CLD_KILLED, + CLD_DUMPED, + CLD_TRAPPED, + CLD_STOPPED, + CLD_CONTINUED + } + + enum + { + POLL_IN = 1, + POLL_OUT, + POLL_MSG, + POLL_ERR, + POLL_PRI, + POLL_HUP + } + + sigfn_t bsd_signal(int sig, sigfn_t func); + sigfn_t sigset(int sig, sigfn_t func); + + int killpg(pid_t, int); + int sigaltstack(stack_t*, stack_t*); + int sighold(int); + int sigignore(int); + int siginterrupt(int, int); + int sigpause(int); + int sigrelse(int); +} + +// +// Timer (TMR) +// +/* +NOTE: This should actually be defined in tango.stdc.posix.time. + It is defined here instead to break a circular import. + +struct timespec +{ + time_t tv_sec; + int tv_nsec; +} +*/ + +version( linux ) +{ + struct timespec + { + time_t tv_sec; + c_long tv_nsec; + } +} +else version( darwin ) +{ + struct timespec + { + time_t tv_sec; + c_long tv_nsec; + } +} + +// +// Realtime Signals (RTS) +// +/* +struct sigevent +{ + int sigev_notify; + int sigev_signo; + sigval sigev_value; + void(*)(sigval) sigev_notify_function; + pthread_attr_t* sigev_notify_attributes; +} + +int sigqueue(pid_t, int, sigval); +int sigtimedwait( sigset_t*, siginfo_t*, timespec*); +int sigwaitinfo( sigset_t*, siginfo_t*); +*/ + +version( linux ) +{ + private const __SIGEV_MAX_SIZE = 64; + + static if( false /* __WORDSIZE == 64 */ ) + { + private const __SIGEV_PAD_SIZE = ((__SIGEV_MAX_SIZE / int.sizeof) - 4); + } + else + { + private const __SIGEV_PAD_SIZE = ((__SIGEV_MAX_SIZE / int.sizeof) - 3); + } + + struct sigevent + { + sigval sigev_value; + int sigev_signo; + int sigev_notify; + + union _sigev_un_t + { + int[__SIGEV_PAD_SIZE] _pad; + pid_t _tid; + + struct _sigev_thread_t + { + void function(sigval) _function; + void* _attribute; + } _sigev_thread_t _sigev_thread; + } _sigev_un_t _sigev_un; + } + + int sigqueue(pid_t, int, sigval); + int sigtimedwait( sigset_t*, siginfo_t*, timespec*); + int sigwaitinfo( sigset_t*, siginfo_t*); +} + +// +// Threads (THR) +// +/* +int pthread_kill(pthread_t, int); +int pthread_sigmask(int, sigset_t*, sigset_t*); +*/ + +version( linux ) +{ + int pthread_kill(pthread_t, int); + int pthread_sigmask(int, sigset_t*, sigset_t*); +} +else version( darwin ) +{ + int pthread_kill(pthread_t, int); + int pthread_sigmask(int, sigset_t*, sigset_t*); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/posix/stdio.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/posix/stdio.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,156 @@ +/** + * D header file for POSIX. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition + */ +module tango.stdc.posix.stdio; + +private import tango.stdc.posix.config; +public import tango.stdc.stdio; +public import tango.stdc.posix.sys.types; // for off_t + +extern (C): + +// +// Required (defined in tango.stdc.stdio) +// +/* +BUFSIZ +_IOFBF +_IOLBF +_IONBF +L_tmpnam +SEEK_CUR +SEEK_END +SEEK_SET +FILENAME_MAX +FOPEN_MAX +TMP_MAX +EOF +NULL +stderr +stdin +stdout +FILE +fpos_t +size_t + +void clearerr(FILE*); +int fclose(FILE*); +int feof(FILE*); +int ferror(FILE*); +int fflush(FILE*); +int fgetc(FILE*); +int fgetpos(FILE*, fpos_t *); +char* fgets(char*, int, FILE*); +FILE* fopen(char*, char*); +int fprintf(FILE*, char*, ...); +int fputc(int, FILE*); +int fputs(char*, FILE*); +size_t fread(void *, size_t, size_t, FILE*); +FILE* freopen(char*, char*, FILE*); +int fscanf(FILE*, char*, ...); +int fseek(FILE*, c_long, int); +int fsetpos(FILE*, fpos_t *); +c_long ftell(FILE*); +size_t fwrite(void *, size_t, size_t, FILE*); +int getc(FILE*); +int getchar(); +char* gets(char*); +void perror(char*); +int printf(char*, ...); +int putc(int, FILE*); +int putchar(int); +int puts(char*); +int remove(char*); +int rename(char*, char*); +void rewind(FILE*); +int scanf(char*, ...); +void setbuf(FILE*, char*); +int setvbuf(FILE*, char*, int, size_t); +int snprintf(char*, size_t, char*, ...); +int sprintf(char*, char*, ...); +int sscanf(char*, char*, int ...); +FILE* tmpfile(); +char* tmpnam(char*); +int ungetc(int, FILE*); +int vfprintf(FILE*, char*, va_list); +int vfscanf(FILE*, char*, va_list); +int vprintf(char*, va_list); +int vscanf(char*, va_list); +int vsnprintf(char*, size_t, char*, va_list); +int vsprintf(char*, char*, va_list); +int vsscanf(char*, char*, va_list arg); +*/ + +// +// C Extension (CX) +// +/* +L_ctermid + +char* ctermid(char*); +FILE* fdopen(int, char*); +int fileno(FILE*); +int fseeko(FILE*, off_t, int); +off_t ftello(FILE*); +char* gets(char*); +FILE* popen(char*, char*); +*/ + +version( linux ) +{ + const L_ctermid = 9; +} + +char* ctermid(char*); +FILE* fdopen(int, char*); +int fileno(FILE*); +int fseeko(FILE*, off_t, int); +off_t ftello(FILE*); +char* gets(char*); +FILE* popen(char*, char*); + +// +// Thread-Safe Functions (TSF) +// +/* +void flockfile(FILE*); +int ftrylockfile(FILE*); +void funlockfile(FILE*); +int getc_unlocked(FILE*); +int getchar_unlocked(); +int putc_unlocked(int, FILE*); +int putchar_unlocked(int); +*/ + +version( linux ) +{ + void flockfile(FILE*); + int ftrylockfile(FILE*); + void funlockfile(FILE*); + int getc_unlocked(FILE*); + int getchar_unlocked(); + int putc_unlocked(int, FILE*); + int putchar_unlocked(int); +} + +// +// XOpen (XSI) +// +/* +P_tmpdir +va_list (defined in tango.stdc.stdarg) + +char* tempnam(char*, char*); +*/ + +version( linux ) +{ + const P_tmpdir = "/tmp"; + + char* tempnam(char*, char*); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/posix/stdlib.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/posix/stdlib.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,243 @@ +/** + * D header file for POSIX. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition + */ +module tango.stdc.posix.stdlib; + +private import tango.stdc.posix.config; +public import tango.stdc.stdlib; +public import tango.stdc.posix.sys.wait; + +extern (C): + +// +// Required (defined in tango.stdc.stdlib) +// +/* +EXIT_FAILURE +EXIT_SUCCESS +NULL +RAND_MAX +MB_CUR_MAX +div_t +ldiv_t +lldiv_t +size_t +wchar_t + +void _Exit(int); +void abort(); +int abs(int); +int atexit(void function()); +double atof(char*); +int atoi(char*); +c_long atol(char*); +long atoll(char*); +void* bsearch(void*, void*, size_t, size_t, int function(void*, void*)); +void* calloc(size_t, size_t); +div_t div(int, int); +void exit(int); +void free(void*); +char* getenv(char*); +c_long labs(c_long); +ldiv_t ldiv(c_long, c_long); +long llabs(long); +lldiv_t lldiv(long, long); +void* malloc(size_t); +int mblen(char*, size_t); +size_t mbstowcs(wchar_t*, char*, size_t); +int mbtowc(wchar_t*, char*, size_t); +void qsort(void*, size_t, size_t, int function(void*, void*)); +int rand(); +void* realloc(void*, size_t); +void srand(uint); +double strtod(char*, char**); +float strtof(char*, char**); +c_long strtol(char*, char**, int); +real strtold(char*, char**); +long strtoll(char*, char**, int); +c_ulong strtoul(char*, char**, int); +ulong strtoull(char*, char**, int); +int system(char*); +size_t wcstombs(char*, wchar_t*, size_t); +int wctomb(char*, wchar_t); +*/ + +// +// Advisory Information (ADV) +// +/* +int posix_memalign(void**, size_t, size_t); +*/ + +version( linux ) +{ + int posix_memalign(void**, size_t, size_t); +} + +// +// C Extension (CX) +// +/* +int setenv(char*, char*, int); +int unsetenv(char*); +*/ + +version( linux ) +{ + int setenv(char*, char*, int); + int unsetenv(char*); + + void* valloc(size_t); // LEGACY non-standard +} +else version( darwin ) +{ + int setenv(char*, char*, int); + int unsetenv(char*); + + void* valloc(size_t); // LEGACY non-standard +} + +// +// Thread-Safe Functions (TSF) +// +/* +int rand_r(uint*); +*/ + +version( linux ) +{ + int rand_r(uint*); +} +else version( darwin ) +{ + int rand_r(uint*); +} + +// +// XOpen (XSI) +// +/* +WNOHANG (defined in tango.stdc.posix.sys.wait) +WUNTRACED (defined in tango.stdc.posix.sys.wait) +WEXITSTATUS (defined in tango.stdc.posix.sys.wait) +WIFEXITED (defined in tango.stdc.posix.sys.wait) +WIFSIGNALED (defined in tango.stdc.posix.sys.wait) +WIFSTOPPED (defined in tango.stdc.posix.sys.wait) +WSTOPSIG (defined in tango.stdc.posix.sys.wait) +WTERMSIG (defined in tango.stdc.posix.sys.wait) + +c_long a64l(char*); +double drand48(); +char* ecvt(double, int, int *, int *); // LEGACY +double erand48(ushort[3]); +char* fcvt(double, int, int *, int *); // LEGACY +char* gcvt(double, int, char*); // LEGACY +int getsubopt(char**, char**, char**); +int grantpt(int); +char* initstate(uint, char*, size_t); +c_long jrand48(ushort[3]); +char* l64a(c_long); +void lcong48(ushort[7]); +c_long lrand48(); +char* mktemp(char*); // LEGACY +int mkstemp(char*); +c_long mrand48(); +c_long nrand48(ushort[3]); +int posix_openpt(int); +char* ptsname(int); +int putenv(char*); +c_long random(); +char* realpath(char*, char*); +ushort seed48(ushort[3]); +void setkey(char*); +char* setstate(char*); +void srand48(c_long); +void srandom(uint); +int unlockpt(int); +*/ + +version( linux ) +{ + //WNOHANG (defined in tango.stdc.posix.sys.wait) + //WUNTRACED (defined in tango.stdc.posix.sys.wait) + //WEXITSTATUS (defined in tango.stdc.posix.sys.wait) + //WIFEXITED (defined in tango.stdc.posix.sys.wait) + //WIFSIGNALED (defined in tango.stdc.posix.sys.wait) + //WIFSTOPPED (defined in tango.stdc.posix.sys.wait) + //WSTOPSIG (defined in tango.stdc.posix.sys.wait) + //WTERMSIG (defined in tango.stdc.posix.sys.wait) + + c_long a64l(char*); + double drand48(); + char* ecvt(double, int, int *, int *); // LEGACY + double erand48(ushort[3]); + char* fcvt(double, int, int *, int *); // LEGACY + char* gcvt(double, int, char*); // LEGACY + int getsubopt(char**, char**, char**); + int grantpt(int); + char* initstate(uint, char*, size_t); + c_long jrand48(ushort[3]); + char* l64a(c_long); + void lcong48(ushort[7]); + c_long lrand48(); + char* mktemp(char*); // LEGACY + int mkstemp(char*); + c_long mrand48(); + c_long nrand48(ushort[3]); + int posix_openpt(int); + char* ptsname(int); + int putenv(char*); + c_long random(); + char* realpath(char*, char*); + ushort seed48(ushort[3]); + void setkey(char*); + char* setstate(char*); + void srand48(c_long); + void srandom(uint); + int unlockpt(int); +} +else version( darwin ) +{ + //WNOHANG (defined in tango.stdc.posix.sys.wait) + //WUNTRACED (defined in tango.stdc.posix.sys.wait) + //WEXITSTATUS (defined in tango.stdc.posix.sys.wait) + //WIFEXITED (defined in tango.stdc.posix.sys.wait) + //WIFSIGNALED (defined in tango.stdc.posix.sys.wait) + //WIFSTOPPED (defined in tango.stdc.posix.sys.wait) + //WSTOPSIG (defined in tango.stdc.posix.sys.wait) + //WTERMSIG (defined in tango.stdc.posix.sys.wait) + + c_long a64l(char*); + double drand48(); + char* ecvt(double, int, int *, int *); // LEGACY + double erand48(ushort[3]); + char* fcvt(double, int, int *, int *); // LEGACY + char* gcvt(double, int, char*); // LEGACY + int getsubopt(char**, char**, char**); + int grantpt(int); + char* initstate(uint, char*, size_t); + c_long jrand48(ushort[3]); + char* l64a(c_long); + void lcong48(ushort[7]); + c_long lrand48(); + char* mktemp(char*); // LEGACY + int mkstemp(char*); + c_long mrand48(); + c_long nrand48(ushort[3]); + int posix_openpt(int); + char* ptsname(int); + int putenv(char*); + c_long random(); + char* realpath(char*, char*); + ushort seed48(ushort[3]); + void setkey(char*); + char* setstate(char*); + void srand48(c_long); + void srandom(uint); + int unlockpt(int); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/posix/sys/ipc.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/posix/sys/ipc.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,74 @@ +/** + * D header file for POSIX. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition + */ +module tango.stdc.posix.sys.ipc; + +private import tango.stdc.posix.config; +public import tango.stdc.posix.sys.types; // for uid_t, gid_t, mode_t, key_t + +extern (C): + +// +// XOpen (XSI) +// +/* +struct ipc_perm +{ + uid_t uid; + gid_t gid; + uid_t cuid; + gid_t cgid; + mode_t mode; +} + +IPC_CREAT +IPC_EXCL +IPC_NOWAIT + +IPC_PRIVATE + +IPC_RMID +IPC_SET +IPC_STAT + +key_t ftok(char*, int); +*/ + +version( linux ) +{ + struct ipc_perm + { + key_t __key; + uid_t uid; + gid_t gid; + uid_t cuid; + gid_t cgid; + ushort mode; + ushort __pad1; + ushort __seq; + ushort __pad2; + c_ulong __unused1; + c_ulong __unused2; + } + + const IPC_CREAT = 01000; + const IPC_EXCL = 02000; + const IPC_NOWAIT = 04000; + + const key_t IPC_PRIVATE = 0; + + const IPC_RMID = 0; + const IPC_SET = 1; + const IPC_STAT = 2; + + key_t ftok(char*, int); +} +else version( darwin ) +{ + +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/posix/sys/mman.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/posix/sys/mman.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,232 @@ +/** + * D header file for POSIX. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition + */ +module tango.stdc.posix.sys.mman; + +public import tango.stdc.stddef; // for size_t +public import tango.stdc.posix.sys.types; // for off_t, mode_t + +extern (C): + +// +// Advisory Information (ADV) +// +/* +int posix_madvise(void*, size_t, int); +*/ + +// +// Advisory Information and either Memory Mapped Files or Shared Memory Objects (MC1) +// +/* +POSIX_MADV_NORMAL +POSIX_MADV_SEQUENTIAL +POSIX_MADV_RANDOM +POSIX_MADV_WILLNEED +POSIX_MADV_DONTNEED +*/ + +version( darwin ) +{ + const POSIX_MADV_NORMAL = 0; + const POSIX_MADV_RANDOM = 1; + const POSIX_MADV_SEQUENTIAL = 2; + const POSIX_MADV_WILLNEED = 3; + const POSIX_MADV_DONTNEED = 4; +} + +// +// Memory Mapped Files, Shared Memory Objects, or Memory Protection (MC2) +// +/* +PROT_READ +PROT_WRITE +PROT_EXEC +PROT_NONE +*/ + +version( linux ) +{ + const PROT_NONE = 0x0; + const PROT_READ = 0x1; + const PROT_WRITE = 0x2; + const PROT_EXEC = 0x4; +} +else version( darwin ) +{ + const PROT_NONE = 0x00; + const PROT_READ = 0x01; + const PROT_WRITE = 0x02; + const PROT_EXEC = 0x04; +} + +// +// Memory Mapped Files, Shared Memory Objects, or Typed Memory Objects (MC3) +// +/* +void* mmap(void*, size_t, int, int, int, off_t); +int munmap(void*, size_t); +*/ + +version( linux ) +{ + void* mmap(void*, size_t, int, int, int, off_t); + int munmap(void*, size_t); +} +else version( darwin ) +{ + void* mmap(void*, size_t, int, int, int, off_t); + int munmap(void*, size_t); +} + +// +// Memory Mapped Files (MF) +// +/* +MAP_SHARED (MF|SHM) +MAP_PRIVATE (MF|SHM) +MAP_FIXED (MF|SHM) +MAP_FAILED (MF|SHM) + +MS_ASYNC (MF|SIO) +MS_SYNC (MF|SIO) +MS_INVALIDATE (MF|SIO) + +int msync(void*, size_t, int); (MF|SIO) +*/ + +version( linux ) +{ + const MAP_SHARED = 0x01; + const MAP_PRIVATE = 0x02; + const MAP_FIXED = 0x10; + const MAP_ANON = 0x20; // non-standard + + const MAP_FAILED = cast(void*) -1; + + enum + { + MS_ASYNC = 1, + MS_SYNC = 4, + MS_INVALIDATE = 2 + } + + int msync(void*, size_t, int); +} +else version( darwin ) +{ + const MAP_SHARED = 0x0001; + const MAP_PRIVATE = 0x0002; + const MAP_FIXED = 0x0010; + const MAP_ANON = 0x1000; // non-standard + + const MAP_FAILED = cast(void*)-1; + + const MS_ASYNC = 0x0001; + const MS_INVALIDATE = 0x0002; + const MS_SYNC = 0x0010; + + int msync(void*, size_t, int); +} + +// +// Process Memory Locking (ML) +// +/* +MCL_CURRENT +MCL_FUTURE + +int mlockall(int); +int munlockall(); +*/ + +version( linux ) +{ + const MCL_CURRENT = 1; + const MCL_FUTURE = 2; + + int mlockall(int); + int munlockall(); + +} +else version( darwin ) +{ + const MCL_CURRENT = 0x0001; + const MCL_FUTURE = 0x0002; + + int mlockall(int); + int munlockall(); +} + +// +// Range Memory Locking (MLR) +// +/* +int mlock(void*, size_t); +int munlock(void*, size_t); +*/ + +version( linux ) +{ + int mlock(void*, size_t); + int munlock(void*, size_t); +} +else version( darwin ) +{ + int mlock(void*, size_t); + int munlock(void*, size_t); +} + +// +// Memory Protection (MPR) +// +/* +int mprotect(void*, size_t, int); +*/ + +version( darwin ) +{ + int mprotect(void*, size_t, int); +} + +// +// Shared Memory Objects (SHM) +// +/* +int shm_open(char*, int, mode_t); +int shm_unlink(char*); +*/ + +version( linux ) +{ + int shm_open(char*, int, mode_t); + int shm_unlink(char*); +} +else version( darwin ) +{ + int shm_open(char*, int, mode_t); + int shm_unlink(char*); +} + +// +// Typed Memory Objects (TYM) +// +/* +POSIX_TYPED_MEM_ALLOCATE +POSIX_TYPED_MEM_ALLOCATE_CONTIG +POSIX_TYPED_MEM_MAP_ALLOCATABLE + +struct posix_typed_mem_info +{ + size_t posix_tmi_length; +} + +int posix_mem_offset(void*, size_t, off_t *, size_t *, int *); +int posix_typed_mem_get_info(int, struct posix_typed_mem_info *); +int posix_typed_mem_open(char*, int, int); +*/ diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/posix/sys/select.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/posix/sys/select.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,138 @@ +/** + * D header file for POSIX. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition + */ +module tango.stdc.posix.sys.select; + +private import tango.stdc.posix.config; +public import tango.stdc.time; // for timespec +public import tango.stdc.posix.sys.time; // for timeval +public import tango.stdc.posix.sys.types; // for time_t +public import tango.stdc.posix.signal; // for sigset_t + +extern (C): + +// +// Required +// +/* +NOTE: This module requires timeval from tango.stdc.posix.sys.time, but timeval + is supposedly an XOpen extension. As a result, this header will not + compile on platforms that are not XSI-compliant. This must be resolved + on a per-platform basis. + +fd_set + +void FD_CLR(int fd, fd_set* fdset); +int FD_ISSET(int fd, fd_set* fdset); +void FD_SET(int fd, fd_set* fdset); +void FD_ZERO(fd_set* fdset); + +FD_SETSIZE + +int pselect(int, fd_set*, fd_set*, fd_set*, timespec*, sigset_t*); +int select(int, fd_set*, fd_set*, fd_set*, timeval*); +*/ + +version( linux ) +{ + private + { + alias c_long __fd_mask; + const __NFDBITS = 8 * __fd_mask.sizeof; + + extern (D) int __FDELT( int d ) + { + return d / __NFDBITS; + } + + extern (D) int __FDMASK( int d ) + { + return cast(__fd_mask) 1 << ( d % __NFDBITS ); + } + } + + const FD_SETSIZE = 1024; + + struct fd_set + { + __fd_mask[FD_SETSIZE / __NFDBITS] fds_bits; + } + + extern (D) void FD_CLR( int fd, fd_set* fdset ) + { + fdset.fds_bits[__FDELT( fd )] &= ~__FDMASK( fd ); + } + + extern (D) int FD_ISSET( int fd, fd_set* fdset ) + { + return fdset.fds_bits[__FDELT( fd )] & __FDMASK( fd ); + } + + extern (D) void FD_SET( int fd, fd_set* fdset ) + { + fdset.fds_bits[__FDELT( fd )] |= __FDMASK( fd ); + } + + extern (D) void FD_ZERO( fd_set* fdset ) + { + fdset.fds_bits[0 .. $] = 0; + } + + /+ + + GNU ASM Implementation + + + # define __FD_ZERO(fdsp) \ + do { \ + int __d0, __d1; \ + __asm__ __volatile__ ("cld; rep; stosl" \ + : "=c" (__d0), "=D" (__d1) \ + : "a" (0), "0" (sizeof (fd_set) \ + / sizeof (__fd_mask)), \ + "1" (&__FDS_BITS (fdsp)[0]) \ + : "memory"); \ + } while (0) + + # define __FD_SET(fd, fdsp) \ + __asm__ __volatile__ ("btsl %1,%0" \ + : "=m" (__FDS_BITS (fdsp)[__FDELT (fd)]) \ + : "r" (((int) (fd)) % __NFDBITS) \ + : "cc","memory") + # define __FD_CLR(fd, fdsp) \ + __asm__ __volatile__ ("btrl %1,%0" \ + : "=m" (__FDS_BITS (fdsp)[__FDELT (fd)]) \ + : "r" (((int) (fd)) % __NFDBITS) \ + : "cc","memory") + # define __FD_ISSET(fd, fdsp) \ + (__extension__ \ + ({register char __result; \ + __asm__ __volatile__ ("btl %1,%2 ; setcb %b0" \ + : "=q" (__result) \ + : "r" (((int) (fd)) % __NFDBITS), \ + "m" (__FDS_BITS (fdsp)[__FDELT (fd)]) \ + : "cc"); \ + __result; })) + +/ + + int pselect(int, fd_set*, fd_set*, fd_set*, timespec*, sigset_t*); + int select(int, fd_set*, fd_set*, fd_set*, timeval*); +} +else version( darwin ) +{ + private + { + const uint __DARWIN_NBBY = 8; /* bits in a byte */ + const uint __DARWIN_NFDBITS = (int.sizeof * __DARWIN_NBBY); /* bits per mask */ + } + + const FD_SETSIZE = 1024; + + struct fd_set + { + int fds_bits[(((FD_SETSIZE) + ((__DARWIN_NFDBITS) - 1)) / (__DARWIN_NFDBITS))]; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/posix/sys/shm.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/posix/sys/shm.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,81 @@ +/** + * D header file for POSIX. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition + */ +module tango.stdc.posix.sys.shm; + +private import tango.stdc.posix.config; +public import tango.stdc.posix.sys.types; // for pid_t, time_t, key_t, size_t +public import tango.stdc.posix.sys.ipc; + +extern (C): + +// +// XOpen (XSI) +// +/* +SHM_RDONLY +SHM_RND + +SHMLBA + +shmatt_t + +struct shmid_ds +{ + ipc_perm shm_perm; + size_t shm_segsz; + pid_t shm_lpid; + pid_t shm_cpid; + shmatt_t shm_nattch; + time_t shm_atime; + time_t shm_dtime; + time_t shm_ctime; +} + +void* shmat(int, void*, int); +int shmctl(int, int, shmid_ds*); +int shmdt(void*); +int shmget(key_t, size_t, int); +*/ + +version( linux ) +{ + const SHM_RDONLY = 010000; + const SHM_RND = 020000; + + int __getpagesize(); + alias __getpagesize SHMLBA; + + alias c_ulong shmatt_t; + + struct shmid_ds + { + ipc_perm shm_perm; + size_t shm_segsz; + time_t shm_atime; + c_ulong __unused1; + time_t shm_dtime; + c_ulong __unused2; + time_t shm_ctime; + c_ulong __unused3; + pid_t shm_cpid; + pid_t shm_lpid; + shmatt_t shm_nattch; + c_ulong __unused4; + c_ulong __unused5; + } + + void* shmat(int, void*, int); + int shmctl(int, int, shmid_ds*); + int shmdt(void*); + int shmget(key_t, size_t, int); +} +else version( darwin ) +{ + +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/posix/sys/socket.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/posix/sys/socket.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,318 @@ +/** + * D header file for POSIX. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition + */ +module tango.stdc.posix.sys.socket; + +private import tango.stdc.posix.config; +public import tango.stdc.posix.sys.types; // for ssize_t, size_t +public import tango.stdc.posix.sys.uio; // for iovec + +extern (C): + +// +// Required +// +/* +socklen_t +sa_family_t + +struct sockaddr +{ + sa_family_t sa_family; + char sa_data[]; +} + +struct sockaddr_storage +{ + sa_family_t ss_family; +} + +struct msghdr +{ + void* msg_name; + socklen_t msg_namelen; + struct iovec* msg_iov; + int msg_iovlen; + void* msg_control; + socklen_t msg_controllen; + int msg_flags; +} + +struct iovec {} // from tango.stdc.posix.sys.uio + +struct cmsghdr +{ + socklen_t cmsg_len; + int cmsg_level; + int cmsg_type; +} + +SCM_RIGHTS + +CMSG_DATA(cmsg) +CMSG_NXTHDR(mhdr,cmsg) +CMSG_FIRSTHDR(mhdr) + +struct linger +{ + int l_onoff; + int l_linger; +} + +SOCK_DGRAM +SOCK_SEQPACKET +SOCK_STREAM + +SOL_SOCKET + +SO_ACCEPTCONN +SO_BROADCAST +SO_DEBUG +SO_DONTROUTE +SO_ERROR +SO_KEEPALIVE +SO_LINGER +SO_OOBINLINE +SO_RCVBUF +SO_RCVLOWAT +SO_RCVTIMEO +SO_REUSEADDR +SO_SNDBUF +SO_SNDLOWAT +SO_SNDTIMEO +SO_TYPE + +SOMAXCONN + +MSG_CTRUNC +MSG_DONTROUTE +MSG_EOR +MSG_OOB +MSG_PEEK +MSG_TRUNC +MSG_WAITALL + +AF_INET +AF_UNIX +AF_UNSPEC + +SHUT_RD +SHUT_RDWR +SHUT_WR + +int accept(int, sockaddr*, socklen_t*); +int bind(int, sockaddr*, socklen_t); +int connect(int, sockaddr*, socklen_t); +int getpeername(int, sockaddr*, socklen_t*); +int getsockname(int, sockaddr*, socklen_t*); +int getsockopt(int, int, int, void*, socklen_t*); +int listen(int, int); +ssize_t recv(int, void*, size_t, int); +ssize_t recvfrom(int, void*, size_t, int, sockaddr*, socklen_t*); +ssize_t recvmsg(int, msghdr*, int); +ssize_t send(int, void*, size_t, int); +ssize_t sendmsg(int, msghdr*, int); +ssize_t sendto(int, void*, size_t, int, sockaddr*, socklen_t); +int setsockopt(int, int, int, void*, socklen_t); +int shutdown(int, int); +int socket(int, int, int); +int sockatmark(int); +int socketpair(int, int, int, int[2]); +*/ + +version( linux ) +{ + alias uint socklen_t; + alias ushort sa_family_t; + + struct sockaddr + { + sa_family_t sa_family; + byte[14] sa_data; + } + + private enum : size_t + { + _SS_SIZE = 128, + _SS_PADSIZE = _SS_SIZE - (c_ulong.sizeof * 2) + } + + struct sockaddr_storage + { + sa_family_t ss_family; + c_ulong __ss_align; + byte[_SS_PADSIZE] __ss_padding; + } + + struct msghdr + { + void* msg_name; + socklen_t msg_namelen; + iovec* msg_iov; + size_t msg_iovlen; + void* msg_control; + size_t msg_controllen; + int msg_flags; + } + + struct cmsghdr + { + size_t cmsg_len; + int cmsg_level; + int cmsg_type; + static if( false /* (!is( __STRICT_ANSI__ ) && __GNUC__ >= 2) || __STDC_VERSION__ >= 199901L */ ) + { + ubyte[1] __cmsg_data; + } + } + + enum : uint + { + SCM_RIGHTS = 0x01 + } + + static if( false /* (!is( __STRICT_ANSI__ ) && __GNUC__ >= 2) || __STDC_VERSION__ >= 199901L */ ) + { + extern (D) ubyte[1] CMSG_DATA( cmsghdr* cmsg ) { return cmsg.__cmsg_data; } + } + else + { + extern (D) ubyte* CMSG_DATA( cmsghdr* cmsg ) { return cast(ubyte*)( cmsg + 1 ); } + } + + private cmsghdr* __cmsg_nxthdr(msghdr*, cmsghdr*); + alias __cmsg_nxthdr CMSG_NXTHDR; + + extern (D) size_t CMSG_FIRSTHDR( msghdr* mhdr ) + { + return cast(size_t)( mhdr.msg_controllen >= cmsghdr.sizeof + ? cast(cmsghdr*) mhdr.msg_control + : cast(cmsghdr*) null ); + } + + struct linger + { + int l_onoff; + int l_linger; + } + + enum + { + SOCK_DGRAM = 2, + SOCK_SEQPACKET = 5, + SOCK_STREAM = 1 + } + + enum + { + SOL_SOCKET = 1 + } + + enum + { + SO_ACCEPTCONN = 30, + SO_BROADCAST = 6, + SO_DEBUG = 1, + SO_DONTROUTE = 5, + SO_ERROR = 4, + SO_KEEPALIVE = 9, + SO_LINGER = 13, + SO_OOBINLINE = 10, + SO_RCVBUF = 8, + SO_RCVLOWAT = 18, + SO_RCVTIMEO = 20, + SO_REUSEADDR = 2, + SO_SNDBUF = 7, + SO_SNDLOWAT = 19, + SO_SNDTIMEO = 21, + SO_TYPE = 3 + } + + enum + { + SOMAXCONN = 128 + } + + enum : uint + { + MSG_CTRUNC = 0x08, + MSG_DONTROUTE = 0x04, + MSG_EOR = 0x80, + MSG_OOB = 0x01, + MSG_PEEK = 0x02, + MSG_TRUNC = 0x20, + MSG_WAITALL = 0x100 + } + + enum + { + AF_INET = 2, + AF_UNIX = 1, + AF_UNSPEC = 0 + } + + enum + { + SHUT_RD, + SHUT_WR, + SHUT_RDWR + } + + int accept(int, sockaddr*, socklen_t*); + int bind(int, sockaddr*, socklen_t); + int connect(int, sockaddr*, socklen_t); + int getpeername(int, sockaddr*, socklen_t*); + int getsockname(int, sockaddr*, socklen_t*); + int getsockopt(int, int, int, void*, socklen_t*); + int listen(int, int); + ssize_t recv(int, void*, size_t, int); + ssize_t recvfrom(int, void*, size_t, int, sockaddr*, socklen_t*); + ssize_t recvmsg(int, msghdr*, int); + ssize_t send(int, void*, size_t, int); + ssize_t sendmsg(int, msghdr*, int); + ssize_t sendto(int, void*, size_t, int, sockaddr*, socklen_t); + int setsockopt(int, int, int, void*, socklen_t); + int shutdown(int, int); + int socket(int, int, int); + int sockatmark(int); + int socketpair(int, int, int, int[2]); +} +else version( darwin ) +{ + alias uint socklen_t; +} + +// +// IPV6 (IP6) +// +/* +AF_INET6 +*/ + +version( linux ) +{ + enum + { + AF_INET6 = 10 + } +} + +// +// Raw Sockets (RS) +// +/* +SOCK_RAW +*/ + +version( linux ) +{ + enum + { + SOCK_RAW = 3 + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/posix/sys/stat.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/posix/sys/stat.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,294 @@ +/** + * D header file for POSIX. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition + */ +module tango.stdc.posix.sys.stat; + +private import tango.stdc.posix.config; +private import tango.stdc.stdint; +private import tango.stdc.posix.time; // for timespec +public import tango.stdc.stddef; // for size_t +public import tango.stdc.posix.sys.types; // for off_t, mode_t + +extern (C): + +// +// Required +// +/* +struct stat +{ + dev_t st_dev; + ino_t st_ino; + mode_t st_mode; + nlink_t st_nlink; + uid_t st_uid; + gid_t st_gid; + off_t st_size; + time_t st_atime; + time_t st_mtime; + time_t st_ctime; +} + +S_IRWXU + S_IRUSR + S_IWUSR + S_IXUSR +S_IRWXG + S_IRGRP + S_IWGRP + S_IXGRP +S_IRWXO + S_IROTH + S_IWOTH + S_IXOTH +S_ISUID +S_ISGID +S_ISVTX + +S_ISBLK(m) +S_ISCHR(m) +S_ISDIR(m) +S_ISFIFO(m) +S_ISREG(m) +S_ISLNK(m) +S_ISSOCK(m) + +S_TYPEISMQ(buf) +S_TYPEISSEM(buf) +S_TYPEISSHM(buf) + +int chmod(char*, mode_t); +int fchmod(int, mode_t); +int fstat(int, stat*); +int lstat(char*, stat*); +int mkdir(char*, mode_t); +int mkfifo(char*, mode_t); +int stat(char*, stat*); +mode_t umask(mode_t); +*/ + +version( linux ) +{ + struct stat_t + { + dev_t st_dev; + ushort __pad1; + static if( __USE_FILE_OFFSET64 ) + { + ino_t __st_ino; + } + else + { + ino_t st_ino; + } + mode_t st_mode; + nlink_t st_nlink; + uid_t st_uid; + gid_t st_gid; + dev_t st_rdev; + ushort __pad2; + off_t st_size; + blksize_t st_blksize; + blkcnt_t st_blocks; + static if( false /*__USE_MISC*/ ) // true if _BSD_SOURCE || _SVID_SOURCE + { + /* Nanosecond resolution timestamps are stored in a format + equivalent to 'struct timespec'. This is the type used + whenever possible but the Unix namespace rules do not allow the + identifier 'timespec' to appear in the header. + Therefore we have to handle the use of this header in strictly + standard-compliant sources special. */ + timespec st_atim; + timespec st_mtim; + timespec st_ctim; + alias st_atim.tv_sec st_atime; + alias st_mtim.tv_sec st_mtime; + alias st_ctim.tv_sec st_ctime; + } + else + { + time_t st_atime; + c_ulong st_atimensec; + time_t st_mtime; + c_ulong st_mtimensec; + time_t st_ctime; + c_ulong st_ctimensec; + } + static if( __USE_FILE_OFFSET64 ) + { + ino_t st_ino; + } + else + { + c_ulong __unused4; + c_ulong __unused5; + } + } + + const S_IRUSR = 0400; + const S_IWUSR = 0200; + const S_IXUSR = 0100; + const S_IRWXU = S_IRUSR | S_IWUSR | S_IXUSR; + + const S_IRGRP = S_IRUSR >> 3; + const S_IWGRP = S_IWUSR >> 3; + const S_IXGRP = S_IXUSR >> 3; + const S_IRWXG = S_IRWXU >> 3; + + const S_IROTH = S_IRGRP >> 3; + const S_IWOTH = S_IWGRP >> 3; + const S_IXOTH = S_IXGRP >> 3; + const S_IRWXO = S_IRWXG >> 3; + + const S_ISUID = 04000; + const S_ISGID = 02000; + const S_ISVTX = 01000; + + private + { + extern (D) bool S_ISTYPE( mode_t mode, uint mask ) + { + return ( mode & S_IFMT ) == mask; + } + } + + extern (D) bool S_ISBLK( mode_t mode ) { return S_ISTYPE( mode, S_IFBLK ); } + extern (D) bool S_ISCHR( mode_t mode ) { return S_ISTYPE( mode, S_IFCHR ); } + extern (D) bool S_ISDIR( mode_t mode ) { return S_ISTYPE( mode, S_IFDIR ); } + extern (D) bool S_ISFIFO( mode_t mode ) { return S_ISTYPE( mode, S_IFIFO ); } + extern (D) bool S_ISREG( mode_t mode ) { return S_ISTYPE( mode, S_IFREG ); } + extern (D) bool S_ISLNK( mode_t mode ) { return S_ISTYPE( mode, S_IFLNK ); } + extern (D) bool S_ISSOCK( mode_t mode ) { return S_ISTYPE( mode, S_IFSOCK ); } + + static if( true /*__USE_POSIX199309*/ ) + { + extern bool S_TYPEISMQ( stat_t* buf ) { return false; } + extern bool S_TYPEISSEM( stat_t* buf ) { return false; } + extern bool S_TYPEISSHM( stat_t* buf ) { return false; } + } +} +else version( darwin ) +{ + struct stat_t + { + dev_t st_dev; + ino_t st_ino; + mode_t st_mode; + nlink_t st_nlink; + uid_t st_uid; + gid_t st_gid; + dev_t st_rdev; + time_t st_atime; + c_ulong st_atimensec; + time_t st_mtime; + c_ulong st_mtimensec; + time_t st_ctime; + c_ulong st_ctimensec; + off_t st_size; + blkcnt_t st_blocks; + blksize_t st_blksize; + uint st_flags; + uint st_gen; + int st_lspare; + long st_qspare[2]; + } + + const S_IRUSR = 0400; + const S_IWUSR = 0200; + const S_IXUSR = 0100; + const S_IRWXU = S_IRUSR | S_IWUSR | S_IXUSR; + + const S_IRGRP = S_IRUSR >> 3; + const S_IWGRP = S_IWUSR >> 3; + const S_IXGRP = S_IXUSR >> 3; + const S_IRWXG = S_IRWXU >> 3; + + const S_IROTH = S_IRGRP >> 3; + const S_IWOTH = S_IWGRP >> 3; + const S_IXOTH = S_IXGRP >> 3; + const S_IRWXO = S_IRWXG >> 3; + + const S_ISUID = 04000; + const S_ISGID = 02000; + const S_ISVTX = 01000; + + private + { + extern (D) bool S_ISTYPE( mode_t mode, uint mask ) + { + return ( mode & S_IFMT ) == mask; + } + } + + extern (D) bool S_ISBLK( mode_t mode ) { return S_ISTYPE( mode, S_IFBLK ); } + extern (D) bool S_ISCHR( mode_t mode ) { return S_ISTYPE( mode, S_IFCHR ); } + extern (D) bool S_ISDIR( mode_t mode ) { return S_ISTYPE( mode, S_IFDIR ); } + extern (D) bool S_ISFIFO( mode_t mode ) { return S_ISTYPE( mode, S_IFIFO ); } + extern (D) bool S_ISREG( mode_t mode ) { return S_ISTYPE( mode, S_IFREG ); } + extern (D) bool S_ISLNK( mode_t mode ) { return S_ISTYPE( mode, S_IFLNK ); } + extern (D) bool S_ISSOCK( mode_t mode ) { return S_ISTYPE( mode, S_IFSOCK ); } +} + +int chmod(char*, mode_t); +int fchmod(int, mode_t); +int fstat(int, stat_t*); +int lstat(char*, stat_t*); +int mkdir(char*, mode_t); +int mkfifo(char*, mode_t); +int stat(char*, stat_t*); +mode_t umask(mode_t); + +// +// Typed Memory Objects (TYM) +// +/* +S_TYPEISTMO(buf) +*/ + +// +// XOpen (XSI) +// +/* +S_IFMT +S_IFBLK +S_IFCHR +S_IFIFO +S_IFREG +S_IFDIR +S_IFLNK +S_IFSOCK + +int mknod(char*, mode_t, dev_t); +*/ + +version( linux ) +{ + const S_IFMT = 0170000; + const S_IFBLK = 0060000; + const S_IFCHR = 0020000; + const S_IFIFO = 0010000; + const S_IFREG = 0100000; + const S_IFDIR = 0040000; + const S_IFLNK = 0120000; + const S_IFSOCK = 0140000; + + int mknod(char*, mode_t, dev_t); +} +else version( darwin ) +{ + const S_IFMT = 0170000; + const S_IFBLK = 0060000; + const S_IFCHR = 0020000; + const S_IFIFO = 0010000; + const S_IFREG = 0100000; + const S_IFDIR = 0040000; + const S_IFLNK = 0120000; + const S_IFSOCK = 0140000; + + int mknod(char*, mode_t, dev_t); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/posix/sys/time.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/posix/sys/time.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,94 @@ +/** + * D header file for POSIX. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition + */ +module tango.stdc.posix.sys.time; + +private import tango.stdc.posix.config; +public import tango.stdc.posix.sys.types; // for time_t, suseconds_t +public import tango.stdc.posix.sys.select; // for fd_set, FD_CLR() FD_ISSET() FD_SET() FD_ZERO() FD_SETSIZE + +extern (C): + +// +// XOpen (XSI) +// +/* +struct timeval +{ + time_t tv_sec; + suseconds_t tv_usec; +} + +struct itimerval +{ + timeval it_interval; + timeval it_value; +} + +ITIMER_REAL +ITIMER_VIRTUAL +ITIMER_PROF + +int getitimer(int, itimerval*); +int gettimeofday(timeval*, void*); +int select(int, fd_set*, fd_set*, fd_set*, timeval*); +int setitimer(int, itimerval*, itimerval*); +int utimes(char*, timeval[2]); // LEGACY +*/ + +version( linux ) +{ + struct timeval + { + time_t tv_sec; + suseconds_t tv_usec; + } + + struct itimerval + { + timeval it_interval; + timeval it_value; + } + + const ITIMER_REAL = 0; + const ITIMER_VIRTUAL = 1; + const ITIMER_PROF = 2; + + int getitimer(int, itimerval*); + int gettimeofday(timeval*, void*); + int select(int, fd_set*, fd_set*, fd_set*, timeval*); + int setitimer(int, itimerval*, itimerval*); + int utimes(char*, timeval[2]); // LEGACY +} +else version( darwin ) +{ + struct timeval + { + time_t tv_sec; + suseconds_t tv_usec; + } + + struct itimerval + { + timeval it_interval; + timeval it_value; + } + + // non-standard + struct timezone_t + { + int tz_minuteswest; + int tz_dsttime; + } + + int getitimer(int, itimerval*); + int gettimeofday(timeval*, timezone_t*); // timezone_t* is normally void* + int select(int, fd_set*, fd_set*, fd_set*, timeval*); + int setitimer(int, itimerval*, itimerval*); + int utimes(char*, timeval*); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/posix/sys/types.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/posix/sys/types.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,397 @@ +/** + * D header file for POSIX. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition + */ +module tango.stdc.posix.sys.types; + +private import tango.stdc.posix.config; +private import tango.stdc.stdint; +public import tango.stdc.stddef; // for size_t +public import tango.stdc.time; // for clock_t, time_t + +extern (C): + +// +// Required +// +/* +blkcnt_t +blksize_t +dev_t +gid_t +ino_t +mode_t +nlink_t +off_t +pid_t +size_t +ssize_t +time_t +uid_t +*/ + +version( linux ) +{ + static if( __USE_FILE_OFFSET64 ) + { + alias long blkcnt_t; + alias ulong ino_t; + alias long off_t; + } + else + { + alias c_long blkcnt_t; + alias c_ulong ino_t; + alias c_long off_t; + } + alias c_long blksize_t; + alias ulong dev_t; + alias uint gid_t; + alias uint mode_t; + alias uint nlink_t; + alias int pid_t; + //size_t (defined in tango.stdc.stddef) + alias int ssize_t; + //time_t (defined in tango.stdc.time) + alias uint uid_t; +} +else version( darwin ) +{ + alias long blkcnt_t; + alias int blksize_t; + alias int dev_t; + alias uint gid_t; + alias uint ino_t; + alias ushort mode_t; + alias ushort nlink_t; + alias long off_t; + alias int pid_t; + //size_t (defined in tango.stdc.stddef) + alias size_t ssize_t; + //time_t (defined in tango.stdc.time) + alias uint uid_t; +} + +// +// XOpen (XSI) +// +/* +clock_t +fsblkcnt_t +fsfilcnt_t +id_t +key_t +suseconds_t +useconds_t +*/ + +version( linux ) +{ + static if( __USE_FILE_OFFSET64 ) + { + alias ulong fsblkcnt_t; + alias ulong fsfilcnt_t; + } + else + { + alias c_ulong fsblkcnt_t; + alias c_ulong fsfilcnt_t; + } + // clock_t (defined in tango.stdc.time) + alias uint id_t; + alias int key_t; + alias c_long suseconds_t; + alias uint useconds_t; +} +else version( darwin ) +{ + //clock_t + alias uint fsblkcnt_t; + alias uint fsfilcnt_t; + alias uint id_t; + // key_t + alias int suseconds_t; + alias uint useconds_t; +} + +// +// Thread (THR) +// +/* +pthread_attr_t +pthread_cond_t +pthread_condattr_t +pthread_key_t +pthread_mutex_t +pthread_mutexattr_t +pthread_once_t +pthread_rwlock_t +pthread_rwlockattr_t +pthread_t +*/ + +version( linux ) +{ + private struct __sched_param + { + int __sched_priority; + } + + struct pthread_attr_t + { + int __detachstate; + int __schedpolicy; + __sched_param __schedparam; + int __inheritsched; + int __scope; + size_t __guardsize; + int __stackaddr_set; + void* __stackaddr; + size_t __stacksize; + } + + private alias int __atomic_lock_t; + + private struct _pthread_fastlock + { + c_long __status; + __atomic_lock_t __spinlock; + } + + private alias void* _pthread_descr; + + private alias long __pthread_cond_align_t; + + struct pthread_cond_t + { + _pthread_fastlock __c_lock; + _pthread_descr __c_waiting; + char[48 - + _pthread_fastlock.sizeof - + _pthread_descr.sizeof - + __pthread_cond_align_t.sizeof] + __padding; + __pthread_cond_align_t __align; + } + + struct pthread_condattr_t + { + int __dummy; + } + + alias uint pthread_key_t; + + struct pthread_mutex_t + { + int __m_reserved; + int __m_count; + _pthread_descr __m_owner; + int __m_kind; + _pthread_fastlock __m_lock; + } + + struct pthread_mutexattr_t + { + int __mutexkind; + } + + alias int pthread_once_t; + + struct pthread_rwlock_t + { + _pthread_fastlock __rw_lock; + int __rw_readers; + _pthread_descr __rw_writer; + _pthread_descr __rw_read_waiting; + _pthread_descr __rw_write_waiting; + int __rw_kind; + int __rw_pshared; + } + + struct pthread_rwlockattr_t + { + int __lockkind; + int __pshared; + } + + alias c_ulong pthread_t; +} +else version( darwin ) +{ + private + { + // #if defined(__LP64__) + // FIXME: what is LP64, is it important enough to be included? + version( LP64 ) + { + const __PTHREAD_SIZE__ = 1168; + const __PTHREAD_ATTR_SIZE__ = 56; + const __PTHREAD_MUTEXATTR_SIZE__ = 8; + const __PTHREAD_MUTEX_SIZE__ = 56; + const __PTHREAD_CONDATTR_SIZE__ = 8; + const __PTHREAD_COND_SIZE__ = 40; + const __PTHREAD_ONCE_SIZE__ = 8; + const __PTHREAD_RWLOCK_SIZE__ = 192; + const __PTHREAD_RWLOCKATTR_SIZE__ = 16; + } + else + { + const __PTHREAD_SIZE__ = 596; + const __PTHREAD_ATTR_SIZE__ = 36; + const __PTHREAD_MUTEXATTR_SIZE__ = 8; + const __PTHREAD_MUTEX_SIZE__ = 40; + const __PTHREAD_CONDATTR_SIZE__ = 4; + const __PTHREAD_COND_SIZE__ = 24; + const __PTHREAD_ONCE_SIZE__ = 4; + const __PTHREAD_RWLOCK_SIZE__ = 124; + const __PTHREAD_RWLOCKATTR_SIZE__ = 12; + } + } + + struct pthread_handler_rec + { + void function(void*) __routine; + void* __arg; + pthread_handler_rec* __next; + } + + struct pthread_attr_t + { + c_long __sig; + byte[__PTHREAD_ATTR_SIZE__] __opaque; + } + + struct pthread_cond_t + { + c_long __sig; + byte[__PTHREAD_COND_SIZE__] __opaque; + } + + struct pthread_condattr_t + { + c_long __sig; + byte[__PTHREAD_CONDATTR_SIZE__] __opaque; + } + + alias c_ulong pthread_key_t; + + struct pthread_mutex_t + { + c_long __sig; + byte[__PTHREAD_MUTEX_SIZE__] __opaque; + } + + struct pthread_mutexattr_t + { + c_long __sig; + byte[__PTHREAD_MUTEXATTR_SIZE__] __opaque; + } + + struct pthread_once_t + { + c_long __sig; + byte[__PTHREAD_ONCE_SIZE__] __opaque; + } + + struct pthread_rwlock_t + { + c_long __sig; + byte[__PTHREAD_RWLOCK_SIZE__] __opaque; + } + + struct pthread_rwlockattr_t + { + c_long __sig; + byte[__PTHREAD_RWLOCKATTR_SIZE__] __opaque; + } + + private struct _opaque_pthread_t + { + c_long __sig; + pthread_handler_rec* __cleanup_stack; + byte[__PTHREAD_SIZE__] __opaque; + } + + alias _opaque_pthread_t* pthread_t; +} + +// +// Barrier (BAR) +// +/* +pthread_barrier_t +pthread_barrierattr_t +*/ + +version( linux ) +{ + struct pthread_barrier_t + { + _pthread_fastlock __ba_lock; + int __ba_required; + int __ba_present; + _pthread_descr __ba_waiting; + } + + struct pthread_barrierattr_t + { + int __pshared; + } +} +else version( darwin ) +{ + // NOTE: The following definitions are Tango-specific because darwin does + // not support them directly. + + struct pthread_barrier_t + { + pthread_mutex_t b_lock; + pthread_cond_t b_cond; + int b_count; + int b_waiters; + int b_generation; + } + + struct pthread_barrierattr_t + { + int pshared; + } +} + +// +// Spin (SPN) +// +/* +pthread_spinlock_t +*/ + +version( linux ) +{ + alias int pthread_spinlock_t; // volatile +} +else version( darwin ) +{ + struct pthread_spinlock_t; +} + +// +// Timer (TMR) +// +/* +clockid_t +timer_t +*/ + +// +// Trace (TRC) +// +/* +trace_attr_t +trace_event_id_t +trace_event_set_t +trace_id_t +*/ diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/posix/sys/uio.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/posix/sys/uio.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,43 @@ +/** + * D header file for POSIX. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition + */ +module tango.stdc.posix.sys.uio; + +private import tango.stdc.posix.config; +public import tango.stdc.posix.sys.types; // for ssize_t, size_t + +extern (C): + +// +// Required +// +/* +struct iovec +{ + void* iov_base; + size_t iov_len; +} + +ssize_t // from tango.stdc.posix.sys.types +size_t // from tango.stdc.posix.sys.types + +ssize_t readv(int, iovec*, int); +ssize_t writev(int, iovec*, int); +*/ + +version( linux ) +{ + struct iovec + { + void* iov_base; + size_t iov_len; + } + + ssize_t readv(int, iovec*, int); + ssize_t writev(int, iovec*, int); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/posix/sys/wait.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/posix/sys/wait.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,112 @@ +/** + * D header file for POSIX. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition + */ +module tango.stdc.posix.sys.wait; + +public import tango.stdc.posix.sys.types; // for id_t, pid_t +public import tango.stdc.posix.signal; // for siginfo_t (XSI) +//public import tango.stdc.posix.resource; // for rusage (XSI) + +extern (C): + +// +// Required +// +/* +WNOHANG +WUNTRACED + +WEXITSTATUS +WIFCONTINUED +WIFEXITED +WIFSIGNALED +WIFSTOPPED +WSTOPSIG +WTERMSIG + +pid_t wait(int*); +pid_t waitpid(pid_t, int*, int); +*/ + +version( linux ) +{ + const WNOHANG = 1; + const WUNTRACED = 2; + + private + { + const __W_CONTINUED = 0xFFFF; + + extern (D) int __WTERMSIG( int status ) { return status & 0x7F; } + } + + // + // NOTE: These macros assume __USE_BSD is not defined in the relevant + // C headers as the parameter definition there is different and + // much more complicated. + // + extern (D) int WEXITSTATUS( int status ) { return ( status & 0xFF00 ) >> 8; } + extern (D) int WIFCONTINUED( int status ) { return status == __W_CONTINUED; } + extern (D) bool WIFEXITED( int status ) { return __WTERMSIG( status ) == 0; } + extern (D) bool WIFSIGNALED( int status ) + { + return ( cast(byte) ( ( status & 0x7F ) + 1 ) >> 1 ) > 0; + } + extern (D) bool WIFSTOPPED( int status ) { return ( status & 0xFF ) == 0x7F; } + extern (D) int WSTOPSIG( int status ) { return WEXITSTATUS( status ); } + extern (D) int WTERMSIG( int status ) { return status & 0x7F; } +} +else version( darwin ) +{ + const WNOHANG = 1; + const WUNTRACED = 2; + + private + { + const _WSTOPPED = 0177; + } + + extern (D) int _WSTATUS(int status) { return (status & 0177); } + extern (D) int WEXITSTATUS( int status ) { return (status >> 8); } + extern (D) int WIFCONTINUED( int status ) { return status == 0x13; } + extern (D) bool WIFEXITED( int status ) { return _WSTATUS(status) == 0; } + extern (D) bool WIFSIGNALED( int status ) + { + return _WSTATUS( status ) != _WSTOPPED && _WSTATUS( status ) != 0; + } + extern (D) bool WIFSTOPPED( int status ) { return _WSTATUS( status ) == _WSTOPPED; } + extern (D) int WSTOPSIG( int status ) { return status >> 8; } + extern (D) int WTERMSIG( int status ) { return _WSTATUS( status ); } +} +else +{ + static assert( false ); +} + +pid_t wait(int*); +pid_t waitpid(pid_t, int*, int); + +// +// XOpen (XSI) +// +/* +WEXITED +WSTOPPED +WCONTINUED +WNOHANG +WNOWAIT + +enum idtype_t +{ + P_ALL, + P_PID, + P_PGID +} + +int waitid(idtype_t, id_t, siginfo_t*, int); +*/ diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/posix/time.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/posix/time.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,204 @@ +/** + * D header file for POSIX. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition + */ +module tango.stdc.posix.time; + +private import tango.stdc.posix.config; +public import tango.stdc.time; +public import tango.stdc.posix.sys.types; +public import tango.stdc.posix.signal; // for sigevent + +extern (C): + +// +// Required (defined in tango.stdc.time) +// +/* +char* asctime(tm*); +clock_t clock(); +char* ctime(time_t*); +double difftime(time_t, time_t); +tm* gmtime(time_t*); +tm* localtime(time_t*); +time_t mktime(tm*); +size_t strftime(char*, size_t, char*, tm*); +time_t time(time_t*); +*/ + +version( linux ) +{ + time_t timegm(tm*); // non-standard +} +else version( darwin ) +{ + time_t timegm(tm*); // non-standard +} + +// +// C Extension (CX) +// (defined in tango.stdc.time) +// +/* +char* tzname[]; +void tzset(); +*/ + +// +// Process CPU-Time Clocks (CPT) +// +/* +int clock_getcpuclockid(pid_t, clockid_t*); +*/ + +// +// Clock Selection (CS) +// +/* +int clock_nanosleep(clockid_t, int, timespec*, timespec*); +*/ + +// +// Monotonic Clock (MON) +// +/* +CLOCK_MONOTONIC +*/ + +// +// Timer (TMR) +// +/* +CLOCK_PROCESS_CPUTIME_ID (TMR|CPT) +CLOCK_THREAD_CPUTIME_ID (TMR|TCT) + +NOTE: timespec must be defined in tango.stdc.posix.signal to break + a circular import. + +struct timespec +{ + time_t tv_sec; + int tv_nsec; +} + +struct itimerspec +{ + timespec it_interval; + timespec it_value; +} + +CLOCK_REALTIME +TIMER_ABSTIME + +clockid_t +timer_t + +int clock_getres(clockid_t, timespec*); +int clock_gettime(clockid_t, timespec*); +int clock_settime(clockid_t, timespec*); +int nanosleep(timespec*, timespec*); +int timer_create(clockid_t, sigevent*, timer_t*); +int timer_delete(timer_t); +int timer_gettime(timer_t, itimerspec*); +int timer_getoverrun(timer_t); +int timer_settime(timer_t, int, itimerspec*, itimerspec*); +*/ + +version( linux ) +{ + const CLOCK_PROCESS_CPUTIME_ID = 2; // (TMR|CPT) + const CLOCK_THREAD_CPUTIME_ID = 3; // (TMR|TCT) + + // NOTE: See above for why this is commented out. + // + //struct timespec + //{ + // time_t tv_sec; + // c_long tv_nsec; + //} + + struct itimerspec + { + timespec it_interval; + timespec it_value; + } + + const CLOCK_REALTIME = 0; + const TIMER_ABSTIME = 0x01; + + alias int clockid_t; + alias int timer_t; + + int clock_getres(clockid_t, timespec*); + //int clock_gettime(clockid_t, timespec*); + //int clock_settime(clockid_t, timespec*); + int nanosleep(timespec*, timespec*); + int timer_create(clockid_t, sigevent*, timer_t*); + int timer_delete(timer_t); + int timer_gettime(timer_t, itimerspec*); + int timer_getoverrun(timer_t); + int timer_settime(timer_t, int, itimerspec*, itimerspec*); +} +else version( darwin ) +{ + int nanosleep(timespec*, timespec*); +} + + +// +// Thread-Safe Functions (TSF) +// +/* +char* asctime_r(tm*, char*); +char* ctime_r(time_t*, char*); +tm* gmtime_r(time_t*, tm*); +tm* localtime_r(time_t*, tm*); +*/ + +version( linux ) +{ + char* asctime_r(tm*, char*); + char* ctime_r(time_t*, char*); + tm* gmtime_r(time_t*, tm*); + tm* localtime_r(time_t*, tm*); +} +else version( darwin ) +{ + char* asctime_r(tm*, char*); + char* ctime_r(time_t*, char*); + tm* gmtime_r(time_t*, tm*); + tm* localtime_r(time_t*, tm*); +} + +// +// XOpen (XSI) +// +/* +getdate_err + +int daylight; +int timezone; + +tm* getdate(char*); +char* strptime(char*, char*, tm*); +*/ + +version( linux ) +{ + extern int daylight; + extern c_long timezone; + + tm* getdate(char*); + char* strptime(char*, char*, tm*); +} +else version( darwin ) +{ + extern c_long timezone; + + tm* getdate(char *); + char* strptime(char*, char*, tm*); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/posix/ucontext.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/posix/ucontext.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,145 @@ +/** + * D header file for POSIX. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition + */ +module tango.stdc.posix.ucontext; + +private import tango.stdc.posix.config; +public import tango.stdc.posix.signal; // for sigset_t, stack_t + +extern (C): + +// +// XOpen (XSI) +// +/* +mcontext_t + +struct ucontext_t +{ + ucontext_t* uc_link; + sigset_t uc_sigmask; + stack_t uc_stack; + mcontext_t uc_mcontext; +} +*/ + +version( linux ) +{ + + version( X86_64 ) + { + private + { + struct _libc_fpxreg + { + ushort[4] significand; + ushort exponent; + ushort[3] padding; + } + + struct _libc_xmmreg + { + uint[4] element; + } + + struct _libc_fpstate + { + ushort cwd; + ushort swd; + ushort ftw; + ushort fop; + ulong rip; + ulong rdp; + uint mxcsr; + uint mxcr_mask; + _libc_fpxreg[8] _st; + _libc_xmmreg[16] _xmm; + uint[24] padding; + } + + const NGREG = 23; + + alias c_long greg_t; + alias greg_t[NGREG] gregset_t; + alias _libc_fpstate* fpregset_t; + } + + struct mcontext_t + { + gregset_t gregs; + fpregset_t fpregs; + c_ulong[8] __reserved1; + } + } + else version( X86 ) + { + private + { + struct _libc_fpreg + { + ushort[4] significand; + ushort exponent; + } + + struct _libc_fpstate + { + c_ulong cw; + c_ulong sw; + c_ulong tag; + c_ulong ipoff; + c_ulong cssel; + c_ulong dataoff; + c_ulong datasel; + _libc_fpreg[8] _st; + c_ulong status; + } + + const NGREG = 19; + + alias int greg_t; + alias greg_t[NGREG] gregset_t; + alias _libc_fpstate* fpregset_t; + } + + struct mcontext_t + { + gregset_t gregs; + fpregset_t fpregs; + c_ulong oldmask; + c_ulong cr2; + } + + struct ucontext_t + { + c_ulong uc_flags; + ucontext_t* uc_link; + stack_t uc_stack; + mcontext_t uc_mcontext; + sigset_t uc_sigmask; + _libc_fpstate __fpregs_mem; + } + } +} + +// +// Obsolescent (OB) +// +/* +int getcontext(ucontext_t*); +void makecontext(ucontext_t*, void function(), int, ...); +int setcontext(ucontext_t*); +int swapcontext(ucontext_t*, ucontext_t*); +*/ + +static if( is( typeof( ucontext_t ) ) ) +{ + int getcontext(ucontext_t*); + void makecontext(ucontext_t*, void function(), int, ...); + int setcontext(ucontext_t*); + int swapcontext(ucontext_t*, ucontext_t*); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/posix/unistd.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/posix/unistd.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,503 @@ +/** + * D header file for POSIX. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition + */ +module tango.stdc.posix.unistd; + +private import tango.stdc.posix.config; +private import tango.stdc.stddef; +public import tango.stdc.posix.inttypes; // for intptr_t +public import tango.stdc.posix.sys.types; // for size_t, ssize_t, uid_t, gid_t, off_t, pid_t, useconds_t + +extern (C): + +const STDIN_FILENO = 0; +const STDOUT_FILENO = 1; +const STDERR_FILENO = 2; + +char* optarg; +int optind; +int opterr; +int optopt; + +int access(char*, int); +uint alarm(uint); +int chdir(char*); +int chown(char*, uid_t, gid_t); +int close(int); +size_t confstr(int, char*, size_t); +int dup(int); +int dup2(int, int); +int execl(char*, char*, ...); +int execle(char*, char*, ...); +int execlp(char*, char*, ...); +int execv(char*, char**); +int execve(char*, char**, char**); +int execvp(char*, char**); +void _exit(int); +int fchown(int, uid_t, gid_t); +pid_t fork(); +c_long fpathconf(int, int); +int ftruncate(int, off_t); +char* getcwd(char*, size_t); +gid_t getegid(); +uid_t geteuid(); +gid_t getgid(); +int getgroups(int, gid_t *); +int gethostname(char*, size_t); +char* getlogin(); +int getlogin_r(char*, size_t); +int getopt(int, char**, char*); +pid_t getpgrp(); +pid_t getpid(); +pid_t getppid(); +uid_t getuid(); +int isatty(int); +int link(char*, char*); +off_t lseek(int, off_t, int); +c_long pathconf(char*, int); +int pause(); +int pipe(int[2]); +ssize_t read(int, void*, size_t); +ssize_t readlink(char*, char*, size_t); +int rmdir(char*); +int setegid(gid_t); +int seteuid(uid_t); +int setgid(gid_t); +int setpgid(pid_t, pid_t); +pid_t setsid(); +int setuid(uid_t); +uint sleep(uint); +int symlink(char*, char*); +c_long sysconf(int); +pid_t tcgetpgrp(int); +int tcsetpgrp(int, pid_t); +char* ttyname(int); +int ttyname_r(int, char*, size_t); +int unlink(char*); +ssize_t write(int, void*, size_t); + +version( linux ) +{ + const F_OK = 0; + const R_OK = 4; + const W_OK = 2; + const X_OK = 1; + + const F_ULOCK = 0; + const F_LOCK = 1; + const F_TLOCK = 2; + const F_TEST = 3; + + enum + { + _CS_PATH, + + _CS_V6_WIDTH_RESTRICTED_ENVS, + + _CS_GNU_LIBC_VERSION, + _CS_GNU_LIBPTHREAD_VERSION, + + _CS_LFS_CFLAGS = 1000, + _CS_LFS_LDFLAGS, + _CS_LFS_LIBS, + _CS_LFS_LINTFLAGS, + _CS_LFS64_CFLAGS, + _CS_LFS64_LDFLAGS, + _CS_LFS64_LIBS, + _CS_LFS64_LINTFLAGS, + + _CS_XBS5_ILP32_OFF32_CFLAGS = 1100, + _CS_XBS5_ILP32_OFF32_LDFLAGS, + _CS_XBS5_ILP32_OFF32_LIBS, + _CS_XBS5_ILP32_OFF32_LINTFLAGS, + _CS_XBS5_ILP32_OFFBIG_CFLAGS, + _CS_XBS5_ILP32_OFFBIG_LDFLAGS, + _CS_XBS5_ILP32_OFFBIG_LIBS, + _CS_XBS5_ILP32_OFFBIG_LINTFLAGS, + _CS_XBS5_LP64_OFF64_CFLAGS, + _CS_XBS5_LP64_OFF64_LDFLAGS, + _CS_XBS5_LP64_OFF64_LIBS, + _CS_XBS5_LP64_OFF64_LINTFLAGS, + _CS_XBS5_LPBIG_OFFBIG_CFLAGS, + _CS_XBS5_LPBIG_OFFBIG_LDFLAGS, + _CS_XBS5_LPBIG_OFFBIG_LIBS, + _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS, + + _CS_POSIX_V6_ILP32_OFF32_CFLAGS, + _CS_POSIX_V6_ILP32_OFF32_LDFLAGS, + _CS_POSIX_V6_ILP32_OFF32_LIBS, + _CS_POSIX_V6_ILP32_OFF32_LINTFLAGS, + _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS, + _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS, + _CS_POSIX_V6_ILP32_OFFBIG_LIBS, + _CS_POSIX_V6_ILP32_OFFBIG_LINTFLAGS, + _CS_POSIX_V6_LP64_OFF64_CFLAGS, + _CS_POSIX_V6_LP64_OFF64_LDFLAGS, + _CS_POSIX_V6_LP64_OFF64_LIBS, + _CS_POSIX_V6_LP64_OFF64_LINTFLAGS, + _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS, + _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS, + _CS_POSIX_V6_LPBIG_OFFBIG_LIBS, + _CS_POSIX_V6_LPBIG_OFFBIG_LINTFLAGS + } + + enum + { + _PC_LINK_MAX, + _PC_MAX_CANON, + _PC_MAX_INPUT, + _PC_NAME_MAX, + _PC_PATH_MAX, + _PC_PIPE_BUF, + _PC_CHOWN_RESTRICTED, + _PC_NO_TRUNC, + _PC_VDISABLE, + _PC_SYNC_IO, + _PC_ASYNC_IO, + _PC_PRIO_IO, + _PC_SOCK_MAXBUF, + _PC_FILESIZEBITS, + _PC_REC_INCR_XFER_SIZE, + _PC_REC_MAX_XFER_SIZE, + _PC_REC_MIN_XFER_SIZE, + _PC_REC_XFER_ALIGN, + _PC_ALLOC_SIZE_MIN, + _PC_SYMLINK_MAX, + _PC_2_SYMLINKS + } + + enum + { + _SC_ARG_MAX, + _SC_CHILD_MAX, + _SC_CLK_TCK, + _SC_NGROUPS_MAX, + _SC_OPEN_MAX, + _SC_STREAM_MAX, + _SC_TZNAME_MAX, + _SC_JOB_CONTROL, + _SC_SAVED_IDS, + _SC_REALTIME_SIGNALS, + _SC_PRIORITY_SCHEDULING, + _SC_TIMERS, + _SC_ASYNCHRONOUS_IO, + _SC_PRIORITIZED_IO, + _SC_SYNCHRONIZED_IO, + _SC_FSYNC, + _SC_MAPPED_FILES, + _SC_MEMLOCK, + _SC_MEMLOCK_RANGE, + _SC_MEMORY_PROTECTION, + _SC_MESSAGE_PASSING, + _SC_SEMAPHORES, + _SC_SHARED_MEMORY_OBJECTS, + _SC_AIO_LISTIO_MAX, + _SC_AIO_MAX, + _SC_AIO_PRIO_DELTA_MAX, + _SC_DELAYTIMER_MAX, + _SC_MQ_OPEN_MAX, + _SC_MQ_PRIO_MAX, + _SC_VERSION, + _SC_PAGESIZE, + _SC_PAGE_SIZE = _SC_PAGESIZE, + _SC_RTSIG_MAX, + _SC_SEM_NSEMS_MAX, + _SC_SEM_VALUE_MAX, + _SC_SIGQUEUE_MAX, + _SC_TIMER_MAX, + + _SC_BC_BASE_MAX, + _SC_BC_DIM_MAX, + _SC_BC_SCALE_MAX, + _SC_BC_STRING_MAX, + _SC_COLL_WEIGHTS_MAX, + _SC_EQUIV_CLASS_MAX, + _SC_EXPR_NEST_MAX, + _SC_LINE_MAX, + _SC_RE_DUP_MAX, + _SC_CHARCLASS_NAME_MAX, + + _SC_2_VERSION, + _SC_2_C_BIND, + _SC_2_C_DEV, + _SC_2_FORT_DEV, + _SC_2_FORT_RUN, + _SC_2_SW_DEV, + _SC_2_LOCALEDEF, + + _SC_PII, + _SC_PII_XTI, + _SC_PII_SOCKET, + _SC_PII_INTERNET, + _SC_PII_OSI, + _SC_POLL, + _SC_SELECT, + _SC_UIO_MAXIOV, + _SC_IOV_MAX = _SC_UIO_MAXIOV, + _SC_PII_INTERNET_STREAM, + _SC_PII_INTERNET_DGRAM, + _SC_PII_OSI_COTS, + _SC_PII_OSI_CLTS, + _SC_PII_OSI_M, + _SC_T_IOV_MAX, + + _SC_THREADS, + _SC_THREAD_SAFE_FUNCTIONS, + _SC_GETGR_R_SIZE_MAX, + _SC_GETPW_R_SIZE_MAX, + _SC_LOGIN_NAME_MAX, + _SC_TTY_NAME_MAX, + _SC_THREAD_DESTRUCTOR_ITERATIONS, + _SC_THREAD_KEYS_MAX, + _SC_THREAD_STACK_MIN, + _SC_THREAD_THREADS_MAX, + _SC_THREAD_ATTR_STACKADDR, + _SC_THREAD_ATTR_STACKSIZE, + _SC_THREAD_PRIORITY_SCHEDULING, + _SC_THREAD_PRIO_INHERIT, + _SC_THREAD_PRIO_PROTECT, + _SC_THREAD_PROCESS_SHARED, + + _SC_NPROCESSORS_CONF, + _SC_NPROCESSORS_ONLN, + _SC_PHYS_PAGES, + _SC_AVPHYS_PAGES, + _SC_ATEXIT_MAX, + _SC_PASS_MAX, + + _SC_XOPEN_VERSION, + _SC_XOPEN_XCU_VERSION, + _SC_XOPEN_UNIX, + _SC_XOPEN_CRYPT, + _SC_XOPEN_ENH_I18N, + _SC_XOPEN_SHM, + + _SC_2_CHAR_TERM, + _SC_2_C_VERSION, + _SC_2_UPE, + + _SC_XOPEN_XPG2, + _SC_XOPEN_XPG3, + _SC_XOPEN_XPG4, + + _SC_CHAR_BIT, + _SC_CHAR_MAX, + _SC_CHAR_MIN, + _SC_INT_MAX, + _SC_INT_MIN, + _SC_LONG_BIT, + _SC_WORD_BIT, + _SC_MB_LEN_MAX, + _SC_NZERO, + _SC_SSIZE_MAX, + _SC_SCHAR_MAX, + _SC_SCHAR_MIN, + _SC_SHRT_MAX, + _SC_SHRT_MIN, + _SC_UCHAR_MAX, + _SC_UINT_MAX, + _SC_ULONG_MAX, + _SC_USHRT_MAX, + + _SC_NL_ARGMAX, + _SC_NL_LANGMAX, + _SC_NL_MSGMAX, + _SC_NL_NMAX, + _SC_NL_SETMAX, + _SC_NL_TEXTMAX, + + _SC_XBS5_ILP32_OFF32, + _SC_XBS5_ILP32_OFFBIG, + _SC_XBS5_LP64_OFF64, + _SC_XBS5_LPBIG_OFFBIG, + + _SC_XOPEN_LEGACY, + _SC_XOPEN_REALTIME, + _SC_XOPEN_REALTIME_THREADS, + + _SC_ADVISORY_INFO, + _SC_BARRIERS, + _SC_BASE, + _SC_C_LANG_SUPPORT, + _SC_C_LANG_SUPPORT_R, + _SC_CLOCK_SELECTION, + _SC_CPUTIME, + _SC_THREAD_CPUTIME, + _SC_DEVICE_IO, + _SC_DEVICE_SPECIFIC, + _SC_DEVICE_SPECIFIC_R, + _SC_FD_MGMT, + _SC_FIFO, + _SC_PIPE, + _SC_FILE_ATTRIBUTES, + _SC_FILE_LOCKING, + _SC_FILE_SYSTEM, + _SC_MONOTONIC_CLOCK, + _SC_MULTI_PROCESS, + _SC_SINGLE_PROCESS, + _SC_NETWORKING, + _SC_READER_WRITER_LOCKS, + _SC_SPIN_LOCKS, + _SC_REGEXP, + _SC_REGEX_VERSION, + _SC_SHELL, + _SC_SIGNALS, + _SC_SPAWN, + _SC_SPORADIC_SERVER, + _SC_THREAD_SPORADIC_SERVER, + _SC_SYSTEM_DATABASE, + _SC_SYSTEM_DATABASE_R, + _SC_TIMEOUTS, + _SC_TYPED_MEMORY_OBJECTS, + _SC_USER_GROUPS, + _SC_USER_GROUPS_R, + _SC_2_PBS, + _SC_2_PBS_ACCOUNTING, + _SC_2_PBS_LOCATE, + _SC_2_PBS_MESSAGE, + _SC_2_PBS_TRACK, + _SC_SYMLOOP_MAX, + _SC_STREAMS, + _SC_2_PBS_CHECKPOINT, + + _SC_V6_ILP32_OFF32, + _SC_V6_ILP32_OFFBIG, + _SC_V6_LP64_OFF64, + _SC_V6_LPBIG_OFFBIG, + + _SC_HOST_NAME_MAX, + _SC_TRACE, + _SC_TRACE_EVENT_FILTER, + _SC_TRACE_INHERIT, + _SC_TRACE_LOG, + + _SC_LEVEL1_ICACHE_SIZE, + _SC_LEVEL1_ICACHE_ASSOC, + _SC_LEVEL1_ICACHE_LINESIZE, + _SC_LEVEL1_DCACHE_SIZE, + _SC_LEVEL1_DCACHE_ASSOC, + _SC_LEVEL1_DCACHE_LINESIZE, + _SC_LEVEL2_CACHE_SIZE, + _SC_LEVEL2_CACHE_ASSOC, + _SC_LEVEL2_CACHE_LINESIZE, + _SC_LEVEL3_CACHE_SIZE, + _SC_LEVEL3_CACHE_ASSOC, + _SC_LEVEL3_CACHE_LINESIZE, + _SC_LEVEL4_CACHE_SIZE, + _SC_LEVEL4_CACHE_ASSOC, + _SC_LEVEL4_CACHE_LINESIZE, + + _SC_IPV6 = _SC_LEVEL1_ICACHE_SIZE + 50, + _SC_RAW_SOCKETS + } +} +else version( darwin ) +{ + const F_OK = 0; + const R_OK = 4; + const W_OK = 2; + const X_OK = 1; + + const F_ULOCK = 0; + const F_LOCK = 1; + const F_TLOCK = 2; + const F_TEST = 3; +} + +// +// File Synchronization (FSC) +// +/* +int fsync(int); +*/ + +// +// Synchronized I/O (SIO) +// +/* +int fdatasync(int); +*/ + +// +// XOpen (XSI) +// +/* +char* crypt(char*, char*); +char* ctermid(char*); +void encrypt(char[64], int); +int fchdir(int); +c_long gethostid(); +pid_t getpgid(pid_t); +pid_t getsid(pid_t); +char* getwd(char*); // LEGACY +int lchown(char*, uid_t, gid_t); +int lockf(int, int, off_t); +int nice(int); +ssize_t pread(int, void*, size_t, off_t); +ssize_t pwrite(int, void*, size_t, off_t); +pid_t setpgrp(); +int setregid(gid_t, gid_t); +int setreuid(uid_t, uid_t); +void swab(void*, void*, ssize_t); +void sync(); +int truncate(char*, off_t); +useconds_t ualarm(useconds_t, useconds_t); +int usleep(useconds_t); +pid_t vfork(); +*/ + +version( linux ) +{ + char* crypt(char*, char*); + char* ctermid(char*); + void encrypt(char[64], int); + int fchdir(int); + c_long gethostid(); + pid_t getpgid(pid_t); + pid_t getsid(pid_t); + char* getwd(char*); // LEGACY + int lchown(char*, uid_t, gid_t); + int lockf(int, int, off_t); + int nice(int); + ssize_t pread(int, void*, size_t, off_t); + ssize_t pwrite(int, void*, size_t, off_t); + pid_t setpgrp(); + int setregid(gid_t, gid_t); + int setreuid(uid_t, uid_t); + void swab(void*, void*, ssize_t); + void sync(); + int truncate(char*, off_t); + useconds_t ualarm(useconds_t, useconds_t); + int usleep(useconds_t); + pid_t vfork(); +} +else version (darwin) +{ + char* crypt(char*, char*); + char* ctermid(char*); + void encrypt(char[64], int); + int fchdir(int); + c_long gethostid(); + pid_t getpgid(pid_t); + pid_t getsid(pid_t); + char* getwd(char*); // LEGACY + int lchown(char*, uid_t, gid_t); + int lockf(int, int, off_t); + int nice(int); + ssize_t pread(int, void*, size_t, off_t); + ssize_t pwrite(int, void*, size_t, off_t); + pid_t setpgrp(); + int setregid(gid_t, gid_t); + int setreuid(uid_t, uid_t); + void swab(void*, void*, ssize_t); + void sync(); + int truncate(char*, off_t); + useconds_t ualarm(useconds_t, useconds_t); + int usleep(useconds_t); + pid_t vfork(); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/posix/utime.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/posix/utime.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,48 @@ +/** + * D header file for POSIX. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition + */ +module tango.stdc.posix.utime; + +private import tango.stdc.posix.config; +public import tango.stdc.posix.sys.types; // for time_t + +extern (C): + +// +// Required +// +/* +struct utimbuf +{ + time_t actime; + time_t modtime; +} + +int utime(char*, utimbuf*); +*/ + +version( linux ) +{ + struct utimbuf + { + time_t actime; + time_t modtime; + } + + int utime(char*, utimbuf*); +} +else version( darwin ) +{ + struct utimbuf + { + time_t actime; + time_t modtime; + } + + int utime(char*, utimbuf*); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/signal.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/signal.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,48 @@ +/** + * D header file for C99. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: ISO/IEC 9899:1999 (E) + */ +module tango.stdc.signal; + +extern (C): + +// this should be volatile +alias int sig_atomic_t; + +private alias void function(int) sigfn_t; + +version( Posix ) +{ + const SIG_ERR = cast(sigfn_t) -1; + const SIG_DFL = cast(sigfn_t) 0; + const SIG_IGN = cast(sigfn_t) 1; + + // standard C signals + const SIGABRT = 6; // Abnormal termination + const SIGFPE = 8; // Floating-point error + const SIGILL = 4; // Illegal hardware instruction + const SIGINT = 2; // Terminal interrupt character + const SIGSEGV = 11; // Invalid memory reference + const SIGTERM = 15; // Termination +} +else +{ + const SIG_ERR = cast(sigfn_t) -1; + const SIG_DFL = cast(sigfn_t) 0; + const SIG_IGN = cast(sigfn_t) 1; + + // standard C signals + const SIGABRT = 22; // Abnormal termination + const SIGFPE = 8; // Floating-point error + const SIGILL = 4; // Illegal hardware instruction + const SIGINT = 2; // Terminal interrupt character + const SIGSEGV = 11; // Invalid memory reference + const SIGTERM = 15; // Termination +} + +sigfn_t signal(int sig, sigfn_t func); +int raise(int sig); diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/stdarg.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/stdarg.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,47 @@ +/** + * D header file for C99. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Hauke Duden, Walter Bright + * Standards: ISO/IEC 9899:1999 (E) + */ +module tango.stdc.stdarg; + + +version( GNU ) +{ + public import std.c.stdarg; +} +else +{ + alias void* va_list; + + template va_start( T ) + { + void va_start( out va_list ap, inout T parmn ) + { + ap = cast(va_list) ( cast(void*) &parmn + ( ( T.sizeof + int.sizeof - 1 ) & ~( int.sizeof - 1 ) ) ); + } + } + + template va_arg( T ) + { + T va_arg( inout va_list ap ) + { + T arg = *cast(T*) ap; + ap = cast(va_list) ( cast(void*) ap + ( ( T.sizeof + int.sizeof - 1 ) & ~( int.sizeof - 1 ) ) ); + return arg; + } + } + + void va_end( va_list ap ) + { + + } + + void va_copy( out va_list dest, va_list src ) + { + dest = src; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/stddef.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/stddef.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,33 @@ +/** + * D header file for C99. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: ISO/IEC 9899:1999 (E) + */ +module tango.stdc.stddef; + +extern (C): + +//alias typeof(int.sizeof) size_t; +//alias typeof(cast(void*)0 - cast(void*)0) ptrdiff_t; + +version( Win32 ) +{ + alias wchar wint_t; + alias wchar wchar_t; + alias wchar wctype_t; + alias wchar wctrans_t; + + const wchar WEOF = 0xFFFF; +} +else +{ + alias dchar wint_t; + alias dchar wchar_t; + alias dchar wctype_t; + alias dchar wctrans_t; + + const dchar WEOF = 0xFFFF; +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/stdint.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/stdint.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,151 @@ +/** + * D header file for C99. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: ISO/IEC 9899:1999 (E) + */ +module tango.stdc.stdint; + +private +{ + template typify(T) + { + T typify( T val ) { return val; } + } +} + +extern (C): + +alias byte int8_t; +alias short int16_t; +alias int int32_t; +alias long int64_t; +//alias cent int128_t; + +alias ubyte uint8_t; +alias ushort uint16_t; +alias uint uint32_t; +alias ulong uint64_t; +//alias ucent uint128_t; + +alias byte int_least8_t; +alias short int_least16_t; +alias int int_least32_t; +alias long int_least64_t; + +alias ubyte uint_least8_t; +alias ushort uint_least16_t; +alias uint uint_least32_t; +alias ulong uint_least64_t; + +alias byte int_fast8_t; +alias int int_fast16_t; +alias int int_fast32_t; +alias long int_fast64_t; + +alias ubyte uint_fast8_t; +alias uint uint_fast16_t; +alias uint uint_fast32_t; +alias ulong uint_fast64_t; + +version( X86_64 ) +{ + alias long intptr_t; + alias ulong uintptr_t; +} +else +{ + alias int intptr_t; + alias uint uintptr_t; +} + +alias long intmax_t; +alias ulong uintmax_t; + +version( VerboseC ) +{ + private import tango.stdc.stddef; + private import tango.stdc.signal; // for sig_atomic_t + + const int8_t INT8_MIN = int8_t.min; + const int8_t INT8_MAX = int8_t.max; + const int16_t INT16_MIN = int16_t.min; + const int16_t INT16_MAX = int16_t.max; + const int32_t INT32_MIN = int32_t.min; + const int32_t INT32_MAX = int32_t.max; + const int64_t INT64_MIN = int64_t.min; + const int64_t INT64_MAX = int64_t.max; + + const uint8_t UINT8_MAX = uint8_t.max; + const uint16_t UINT16_MAX = uint16_t.max; + const uint32_t UINT32_MAX = uint32_t.max; + const uint64_t UINT64_MAX = uint64_t.max; + + const int_least8_t INT_LEAST8_MIN = int_least8_t.min; + const int_least8_t INT_LEAST8_MAX = int_least8_t.max; + const int_least16_t INT_LEAST16_MIN = int_least16_t.min; + const int_least16_t INT_LEAST16_MAX = int_least16_t.max; + const int_least32_t INT_LEAST32_MIN = int_least32_t.min; + const int_least32_t INT_LEAST32_MAX = int_least32_t.max; + const int_least64_t INT_LEAST64_MIN = int_least64_t.min; + const int_least64_t INT_LEAST64_MAX = int_least64_t.max; + + const uint_least8_t UINT_LEAST8_MAX = uint_least8_t.max; + const uint_least16_t UINT_LEAST16_MAX = uint_least16_t.max; + const uint_least32_t UINT_LEAST32_MAX = uint_least32_t.max; + const uint_least64_t UINT_LEAST64_MAX = uint_least64_t.max; + + const int_fast8_t INT_FAST8_MIN = int_fast8_t.min; + const int_fast8_t INT_FAST8_MAX = int_fast8_t.max; + const int_fast16_t INT_FAST16_MIN = int_fast16_t.min; + const int_fast16_t INT_FAST16_MAX = int_fast16_t.max; + const int_fast32_t INT_FAST32_MIN = int_fast32_t.min; + const int_fast32_t INT_FAST32_MAX = int_fast32_t.max; + const int_fast64_t INT_FAST64_MIN = int_fast64_t.min; + const int_fast64_t INT_FAST64_MAX = int_fast64_t.max; + + const uint_fast8_t UINT_FAST8_MAX = uint_fast8_t.max; + const uint_fast16_t UINT_FAST16_MAX = uint_fast16_t.max; + const uint_fast32_t UINT_FAST32_MAX = uint_fast32_t.max; + const uint_fast64_t UINT_FAST64_MAX = uint_fast64_t.max; + + const intptr_t INTPTR_MIN = intptr_t.min; + const intptr_t INTPTR_MAX = intptr_t.max; + + const uintptr_t UINTPTR_MIN = uintptr_t.min; + const uintptr_t UINTPTR_MAX = uintptr_t.max; + + const intmax_t INTMAX_MIN = intmax_t.min; + const intmax_t INTMAX_MAX = intmax_t.max; + + const uintmax_t UINTMAX_MAX = uintmax_t.max; + + const ptrdiff_t PTRDIFF_MIN = ptrdiff_t.min; + const ptrdiff_t PTRDIFF_MAX = ptrdiff_t.max; + + const sig_atomic_t SIG_ATOMIC_MIN = sig_atomic_t.min; + const sig_atomic_t SIG_ATOMIC_MAX = sig_atomic_t.max; + + const size_t SIZE_MAX = size_t.max; + + const wchar_t WCHAR_MIN = wchar_t.min; + const wchar_t WCHAR_MAX = wchar_t.max; + + const wint_t WINT_MIN = wint_t.min; + const wint_t WINT_MAX = wint_t.max; +} + +alias typify!(int8_t) INT8_C; +alias typify!(int16_t) INT16_C; +alias typify!(int32_t) INT32_C; +alias typify!(int64_t) INT64_C; + +alias typify!(uint8_t) UINT8_C; +alias typify!(uint16_t) UINT16_C; +alias typify!(uint32_t) UINT32_C; +alias typify!(uint64_t) UINT64_C; + +alias typify!(intmax_t) INTMAX_C; +alias typify!(uintmax_t) UINTMAX_C; diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/stdio.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/stdio.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,360 @@ +/** + * D header file for C99. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly, Walter Bright + * Standards: ISO/IEC 9899:1999 (E) + */ +module tango.stdc.stdio; + +private +{ + import tango.stdc.stdarg; + import tango.stdc.stddef; + import tango.stdc.config; +} + +extern (C): + +version( Win32 ) +{ + const int BUFSIZ = 0x4000; + const int EOF = -1; + const int FOPEN_MAX = 20; + const int FILENAME_MAX = 256; // 255 plus NULL + const int TMP_MAX = 32767; + const int _SYS_OPEN = 20; + const int SYS_OPEN = _SYS_OPEN; + + const int _NFILE = 60; + const char[] _P_tmpdir = "\\"; + const wchar[] _wP_tmpdir = "\\"; + const int L_tmpnam = _P_tmpdir.length + 12; +} +else version( linux ) +{ + //const int BUFSIZ = 0x4000; + const int EOF = -1; + const int FOPEN_MAX = 16; + const int FILENAME_MAX = 4095; + const int TMP_MAX = 238328; + const int L_tmpnam = 20; +} +else version( darwin ) +{ + const int EOF = -1; + const int FOPEN_MAX = 20; + const int FILENAME_MAX = 1024; + const int TMP_MAX = 308915776; + const int L_tmpnam = 1024; + + private + { + struct __sbuf + { + ubyte* _base; + int _size; + } + + struct __sFILEX + { + + } + } +} +else +{ + static assert( false ); +} + +enum +{ + SEEK_SET, + SEEK_CUR, + SEEK_END +} + +struct _iobuf +{ + align (1): + version( Win32 ) + { + char* _ptr; + int _cnt; + char* _base; + int _flag; + int _file; + int _charbuf; + int _bufsiz; + int __tmpnum; + } + else version( linux ) + { + char* _read_ptr; + char* _read_end; + char* _read_base; + char* _write_base; + char* _write_ptr; + char* _write_end; + char* _buf_base; + char* _buf_end; + char* _save_base; + char* _backup_base; + char* _save_end; + void* _markers; + _iobuf* _chain; + int _fileno; + int _blksize; + int _old_offset; + ushort _cur_column; + byte _vtable_offset; + char[1] _shortbuf; + void* _lock; + } + else version( darwin ) + { + ubyte* _p; + int _r; + int _w; + short _flags; + short _file; + __sbuf _bf; + int _lbfsize; + + int* function(void*) _close; + int* function(void*, char*, int) _read; + fpos_t* function(void*, fpos_t, int) _seek; + int* function(void*, char *, int) _write; + + __sbuf _ub; + __sFILEX* _extra; + int _ur; + + ubyte[3] _ubuf; + ubyte[1] _nbuf; + + __sbuf _lb; + + int _blksize; + fpos_t _offset; + } +} + +alias _iobuf FILE; + +enum +{ + _F_RDWR = 0x0003, + _F_READ = 0x0001, + _F_WRIT = 0x0002, + _F_BUF = 0x0004, + _F_LBUF = 0x0008, + _F_ERR = 0x0010, + _F_EOF = 0x0020, + _F_BIN = 0x0040, + _F_IN = 0x0080, + _F_OUT = 0x0100, + _F_TERM = 0x0200, +} + +version( Win32 ) +{ + enum + { + _IOFBF = 0, + _IOREAD = 1, + _IOWRT = 2, + _IONBF = 4, + _IOMYBUF = 8, + _IOEOF = 0x10, + _IOERR = 0x20, + _IOLBF = 0x40, + _IOSTRG = 0x40, + _IORW = 0x80, + _IOTRAN = 0x100, + _IOAPP = 0x200, + } + + extern void function() _fcloseallp; + + version (GNU) { + extern FILE[_NFILE]* _imp___iob; + + const FILE* stdin; + const FILE* stdout; + const FILE* stderr; + const FILE* stdaux; + const FILE* stdprn; + + static this() { + stdin = &(*_imp___iob)[0]; + stdout = &(*_imp___iob)[1]; + stderr = &(*_imp___iob)[2]; + stdaux = &(*_imp___iob)[3]; + stdprn = &(*_imp___iob)[4]; + } + } else { + extern FILE[_NFILE] _iob; + + const FILE* stdin = &_iob[0]; + const FILE* stdout = &_iob[1]; + const FILE* stderr = &_iob[2]; + const FILE* stdaux = &_iob[3]; + const FILE* stdprn = &_iob[4]; + } +} +else version( linux ) +{ + enum + { + _IOFBF = 0, + _IOLBF = 1, + _IONBF = 2, + } + + extern FILE* stdin; + extern FILE* stdout; + extern FILE* stderr; +} +else version( darwin ) +{ + extern FILE[3] __sF; + const FILE* stdin = &__sF[0]; + const FILE* stdout = &__sF[1]; + const FILE* stderr = &__sF[2]; +} +else +{ + static assert( false ); +} + +alias int fpos_t; + +int remove(char* filename); +int rename(char* from, char* to); + +FILE* tmpfile(); +char* tmpnam(char* s); + +int fclose(FILE* stream); +int fflush(FILE* stream); +FILE* fopen(char* filename, char* mode); +FILE* freopen(char* filename, char* mode, FILE* stream); + +void setbuf(FILE* stream, char* buf); +int setvbuf(FILE* stream, char* buf, int mode, size_t size); + +int fprintf(FILE* stream, char* format, ...); +int fscanf(FILE* stream, char* format, ...); +int sprintf(char* s, char* format, ...); +int sscanf(char* s, char* format, ...); +int vfprintf(FILE* stream, char* format, va_list arg); +int vfscanf(FILE* stream, char* format, va_list arg); +int vsprintf(char* s, char* format, va_list arg); +int vsscanf(char* s, char* format, va_list arg); +int vprintf(char* format, va_list arg); +int vscanf(char* format, va_list arg); +int printf(char* format, ...); +int scanf(char* format, ...); + +int fgetc(FILE* stream); +int fputc(int c, FILE* stream); + +char* fgets(char* s, int n, FILE* stream); +int fputs(char* s, FILE* stream); +char* gets(char* s); +int puts(char* s); + +extern (D) +{ + int getchar() { return getc(stdin); } + int putchar(int c) { return putc(c,stdout); } + int getc(FILE* stream) { return fgetc(stream); } + int putc(int c, FILE* stream) { return fputc(c,stream); } +} + +int ungetc(int c, FILE* stream); + +size_t fread(void* ptr, size_t size, size_t nmemb, FILE* stream); +size_t fwrite(void* ptr, size_t size, size_t nmemb, FILE* stream); + +int fgetpos(FILE* stream, fpos_t * pos); +int fsetpos(FILE* stream, fpos_t* pos); + +int fseek(FILE* stream, c_long offset, int whence); +c_long ftell(FILE* stream); + +version( Win32 ) +{ + extern (D) + { + void rewind(FILE* stream) { fseek(stream,0L,SEEK_SET); stream._flag&=~_IOERR; } + void clearerr(FILE* stream) { stream._flag &= ~(_IOERR|_IOEOF); } + int feof(FILE* stream) { return stream._flag&_IOEOF; } + int ferror(FILE* stream) { return stream._flag&_IOERR; } + } + int _snprintf(char*,size_t,char*,...); + alias _snprintf snprintf; + + int _vsnprintf(char* s, size_t n, char* format, va_list arg); + alias _vsnprintf vsnprintf; +} +else version( linux ) +{ + void rewind(FILE* stream); + void clearerr(FILE* stream); + int feof(FILE* stream); + int ferror(FILE* stream); + int fileno(FILE *); + + int snprintf(char* s, size_t n, char* format, ...); + int vsnprintf(char* s, size_t n, char* format, va_list arg); +} +else version( darwin ) +{ + void rewind(FILE*); + void clearerr(FILE*); + int feof(FILE*); + int ferror(FILE*); + int fileno(FILE*); + + int snprintf(char*, size_t, char*, ...); + int vsnprintf(char*, size_t, char*, va_list); +} +else +{ + static assert( false ); +} + +void perror(char* s); + +int fwprintf(FILE* stream, wchar_t* format, ...); +int fwscanf(FILE* stream, wchar_t* format, ...); +int swprintf(wchar_t* s, size_t n, wchar_t* format, ...); +int swscanf(wchar_t* s, wchar_t* format, ...); +int vfwprintf(FILE* stream, wchar_t* format, va_list arg); +int vfwscanf(FILE* stream, wchar_t* format, va_list arg); +int vswprintf(wchar_t* s, size_t n, wchar_t* format, va_list arg); +int vswscanf(wchar_t* s, wchar_t* format, va_list arg); +int vwprintf(wchar_t* format, va_list arg); +int vwscanf(wchar_t* format, va_list arg); +int wprintf(wchar_t* format, ...); +int wscanf(wchar_t* format, ...); + +wint_t fgetwc(FILE* stream); +wint_t fputwc(wchar_t c, FILE* stream); + +wchar_t* fgetws(wchar_t* s, int n, FILE* stream); +int fputws(wchar_t* s, FILE* stream); + +extern (D) +{ + wint_t getwchar() { return fgetwc(stdin); } + wint_t putwchar(wchar_t c) { return fputwc(c,stdout); } + wint_t getwc(FILE* stream) { return fgetwc(stream); } + wint_t putwc(wchar_t c, FILE* stream) { return fputwc(c, stream); } +} + +wint_t ungetwc(wint_t c, FILE* stream); +int fwide(FILE* stream, int mode); diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/stdlib.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/stdlib.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,106 @@ +/** + * D header file for C99. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: ISO/IEC 9899:1999 (E) + */ +module tango.stdc.stdlib; + +private import tango.stdc.stddef; +private import tango.stdc.config; + +extern (C): + +struct div_t +{ + int quot, + rem; +} + +struct ldiv_t +{ + int quot, + rem; +} + +struct lldiv_t +{ + long quot, + rem; +} + +const EXIT_SUCCESS = 0; +const EXIT_FAILURE = 1; +const RAND_MAX = 32767; +const MB_CUR_MAX = 1; + +double atof(char* nptr); +int atoi(char* nptr); +c_long atol(char* nptr); +long atoll(char* nptr); + +double strtod(char* nptr, char** endptr); +float strtof(char* nptr, char** endptr); +real strtold(char* nptr, char** endptr); +c_long strtol(char* nptr, char** endptr, int base); +long strtoll(char* nptr, char** endptr, int base); +c_ulong strtoul(char* nptr, char** endptr, int base); +ulong strtoull(char* nptr, char** endptr, int base); + +double wcstod(wchar_t* nptr, wchar_t** endptr); +float wcstof(wchar_t* nptr, wchar_t** endptr); +real wcstold(wchar_t* nptr, wchar_t** endptr); +c_long wcstol(wchar_t* nptr, wchar_t** endptr, int base); +long wcstoll(wchar_t* nptr, wchar_t** endptr, int base); +c_ulong wcstoul(wchar_t* nptr, wchar_t** endptr, int base); +ulong wcstoull(wchar_t* nptr, wchar_t** endptr, int base); + +int rand(); +void srand(uint seed); + +void* malloc(size_t size); +void* calloc(size_t nmemb, size_t size); +void* realloc(void* ptr, size_t size); +void free(void* ptr); + +void abort(); +void exit(int status); +int atexit(void function() func); +void _Exit(int status); + +char* getenv(char* name); +int system(char* string); + +void* bsearch(void* key, void* base, size_t nmemb, size_t size, int function(void*, void*) compar); +void qsort(void* base, size_t nmemb, size_t size, int function(void*, void*) compar); + +int abs(int j); +c_long labs(c_long j); +long llabs(long j); + +div_t div(int numer, int denom); +ldiv_t ldiv(c_long numer, c_long denom); +lldiv_t lldiv(long numer, long denom); + +int mblen(char* s, size_t n); +int mbtowc(wchar_t* pwc, char* s, size_t n); +int wctomb(char*s, wchar_t wc); +size_t mbstowcs(wchar_t* pwcs, char* s, size_t n); +size_t wcstombs(char* s, wchar_t* pwcs, size_t n); + +version( DigitalMars ) +{ + void* alloca(size_t size); +} +else version( GNU ) +{ + private import gcc.builtins; + alias gcc.builtins.__builtin_alloca alloca; +} +else version( LLVMDC ) +{ + pragma(LLVM_internal, "alloca") + void* alloca(size_t size); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/string.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/string.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,76 @@ +/** + * D header file for C99. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: ISO/IEC 9899:1999 (E) + */ +module tango.stdc.string; + +private import tango.stdc.stddef; + +extern (C): + +void* memchr(void* s, int c, size_t n); +int memcmp(void* s1, void* s2, size_t n); +void* memcpy(void* s1, void* s2, size_t n); +void* memmove(void* s1, void* s2, size_t n); +void* memset(void* s, int c, size_t n); + +char* strcpy(char* s1, char* s2); +char* strncpy(char* s1, char* s2, size_t n); +char* strcat(char* s1, char* s2); +char* strncat(char* s1, char* s2, size_t n); +int strcmp(char* s1, char* s2); +int strcoll(char* s1, char* s2); +int strncmp(char* s1, char* s2, size_t n); +size_t strxfrm(char* s1, char* s2, size_t n); +char* strchr(char* s, int c); +size_t strcspn(char* s1, char* s2); +char* strpbrk(char* s1, char* s2); +char* strrchr(char* s, int c); +size_t strspn(char* s1, char* s2); +char* strstr(char* s1, char* s2); +char* strtok(char* s1, char* s2); +char* strerror(int errnum); +size_t strlen(char* s); + +version( Posix ) +{ + char* strdup(char*); +} + +wchar_t* wmemchr(wchar_t* s, wchar_t c, size_t n); +int wmemcmp(wchar_t* s1, wchar_t* s2, size_t n); +wchar_t* wmemcpy(wchar_t* s1, wchar_t* s2, size_t n); +wchar_t* wmemmove(wchar_t*s1, wchar_t*s2, size_t n); +wchar_t* wmemset(wchar_t* s, wchar_t c, size_t n); + +wchar_t* wcscpy(wchar_t* s1, wchar_t* s2); +wchar_t* wcsncpy(wchar_t* s1, wchar_t* s2, size_t n); +wchar_t* wcscat(wchar_t* s1, wchar_t* s2); +wchar_t* wcsncat(wchar_t* s1, wchar_t* s2, size_t n); +int wcscmp(wchar_t*s1, wchar_t*s2); +int wcscoll(wchar_t*s1, wchar_t*s2); +int wcsncmp(wchar_t*s1, wchar_t*s2, size_t n); +size_t wcsxfrm(wchar_t* s1, wchar_t* s2, size_t n); +wchar_t* wcschr(wchar_t* s, wchar_t c); +size_t wcscspn(wchar_t*s1, wchar_t*s2); +wchar_t* wcspbrk(wchar_t*s1, wchar_t*s2); +wchar_t* wcsrchr(wchar_t* s, wchar_t c); +size_t wcsspn(wchar_t*s1, wchar_t*s2); +wchar_t* wcsstr(wchar_t*s1, wchar_t*s2); +wchar_t* wcstok(wchar_t* s1, wchar_t* s2, wchar_t** ptr); +size_t wcslen(wchar_t* s); + +alias int mbstate_t; + +wint_t btowc(int c); +int wctob(wint_t c); +int mbsinit(mbstate_t*ps); +size_t mbrlen(char* s, size_t n, mbstate_t* ps); +size_t mbrtowc(wchar_t* pwc, char* s, size_t n, mbstate_t* ps); +size_t wcrtomb(char* s, wchar_t wc, mbstate_t* ps); +size_t mbsrtowcs(wchar_t* dst, char** src, size_t len, mbstate_t* ps); +size_t wcsrtombs(char* dst, wchar_t** src, size_t len, mbstate_t* ps); diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/stringz.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/stringz.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,93 @@ +/******************************************************************************* + + copyright: Copyright (c) 2006 Keinfarbton. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: October 2006 + + author: Keinfarbton + +*******************************************************************************/ + +module tango.stdc.stringz; + +/********************************* + * Convert array of chars s[] to a C-style 0 terminated string. + */ + +char* toStringz (char[] s) +{ + if (s.ptr) + if (! (s.length && s[$-1] is 0)) + s = s ~ '\0'; + return s.ptr; +} + +/********************************* + * Convert a C-style 0 terminated string to an array of char + */ + +char[] fromUtf8z (char* s) +{ + return s ? s[0 .. strlenz(s)] : null; +} + +/********************************* + * Convert array of wchars s[] to a C-style 0 terminated string. + */ + +wchar* toString16z (wchar[] s) +{ + if (s.ptr) + if (! (s.length && s[$-1] is 0)) + s = s ~ "\0"w; + return s.ptr; +} + +/********************************* + * Convert a C-style 0 terminated string to an array of wchar + */ + +wchar[] fromUtf16z (wchar* s) +{ + return s ? s[0 .. strlenz(s)] : null; +} + +/********************************* + * portable strlen + */ + +size_t strlenz(T) (T* s) +{ + size_t i; + + if (s) + while (*s++) + ++i; + return i; +} + + + +debug (UnitTest) +{ + import tango.stdc.stdio; + + unittest + { + debug(string) printf("stdc.stringz.unittest\n"); + + char* p = toStringz("foo"); + assert(strlenz(p) == 3); + char foo[] = "abbzxyzzy"; + p = toStringz(foo[3..5]); + assert(strlenz(p) == 2); + + char[] test = "\0"; + p = toStringz(test); + assert(*p == 0); + assert(p == test.ptr); + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/tgmath.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/tgmath.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,331 @@ +/** + * D header file for C99. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly, Walter Bright + * Standards: ISO/IEC 9899:1999 (E) + */ +module tango.stdc.tgmath; + +private import tango.stdc.config; +private static import tango.stdc.math; +private static import tango.stdc.complex; + +extern (C): + +alias tango.stdc.math.acos acos; +alias tango.stdc.math.acosf acos; +alias tango.stdc.math.acosl acos; + +alias tango.stdc.complex.cacos acos; +alias tango.stdc.complex.cacosf acos; +alias tango.stdc.complex.cacosl acos; + +alias tango.stdc.math.asin asin; +alias tango.stdc.math.asinf asin; +alias tango.stdc.math.asinl asin; + +alias tango.stdc.complex.casin asin; +alias tango.stdc.complex.casinf asin; +alias tango.stdc.complex.casinl asin; + +alias tango.stdc.math.atan atan; +alias tango.stdc.math.atanf atan; +alias tango.stdc.math.atanl atan; + +alias tango.stdc.complex.catan atan; +alias tango.stdc.complex.catanf atan; +alias tango.stdc.complex.catanl atan; + +alias tango.stdc.math.atan2 atan2; +alias tango.stdc.math.atan2f atan2; +alias tango.stdc.math.atan2l atan2; + +alias tango.stdc.math.cos cos; +alias tango.stdc.math.cosf cos; +alias tango.stdc.math.cosl cos; + +alias tango.stdc.complex.ccos cos; +alias tango.stdc.complex.ccosf cos; +alias tango.stdc.complex.ccosl cos; + +alias tango.stdc.math.sin sin; +alias tango.stdc.math.sinf sin; +alias tango.stdc.math.sinl sin; + +alias tango.stdc.complex.csin csin; +alias tango.stdc.complex.csinf csin; +alias tango.stdc.complex.csinl csin; + +alias tango.stdc.math.tan tan; +alias tango.stdc.math.tanf tan; +alias tango.stdc.math.tanl tan; + +alias tango.stdc.complex.ctan tan; +alias tango.stdc.complex.ctanf tan; +alias tango.stdc.complex.ctanl tan; + +alias tango.stdc.math.acosh acosh; +alias tango.stdc.math.acoshf acosh; +alias tango.stdc.math.acoshl acosh; + +alias tango.stdc.complex.cacosh acosh; +alias tango.stdc.complex.cacoshf acosh; +alias tango.stdc.complex.cacoshl acosh; + +alias tango.stdc.math.asinh asinh; +alias tango.stdc.math.asinhf asinh; +alias tango.stdc.math.asinhl asinh; + +alias tango.stdc.complex.casinh asinh; +alias tango.stdc.complex.casinhf asinh; +alias tango.stdc.complex.casinhl asinh; + +alias tango.stdc.math.atanh atanh; +alias tango.stdc.math.atanhf atanh; +alias tango.stdc.math.atanhl atanh; + +alias tango.stdc.complex.catanh atanh; +alias tango.stdc.complex.catanhf atanh; +alias tango.stdc.complex.catanhl atanh; + +alias tango.stdc.math.cosh cosh; +alias tango.stdc.math.coshf cosh; +alias tango.stdc.math.coshl cosh; + +alias tango.stdc.complex.ccosh cosh; +alias tango.stdc.complex.ccoshf cosh; +alias tango.stdc.complex.ccoshl cosh; + +alias tango.stdc.math.sinh sinh; +alias tango.stdc.math.sinhf sinh; +alias tango.stdc.math.sinhl sinh; + +alias tango.stdc.complex.csinh sinh; +alias tango.stdc.complex.csinhf sinh; +alias tango.stdc.complex.csinhl sinh; + +alias tango.stdc.math.tanh tanh; +alias tango.stdc.math.tanhf tanh; +alias tango.stdc.math.tanhl tanh; + +alias tango.stdc.complex.ctanh tanh; +alias tango.stdc.complex.ctanhf tanh; +alias tango.stdc.complex.ctanhl tanh; + +alias tango.stdc.math.exp exp; +alias tango.stdc.math.expf exp; +alias tango.stdc.math.expl exp; + +alias tango.stdc.complex.cexp exp; +alias tango.stdc.complex.cexpf exp; +alias tango.stdc.complex.cexpl exp; + +alias tango.stdc.math.exp2 exp2; +alias tango.stdc.math.exp2f exp2; +alias tango.stdc.math.exp2l exp2; + +alias tango.stdc.math.expm1 expm1; +alias tango.stdc.math.expm1f expm1; +alias tango.stdc.math.expm1l expm1; + +alias tango.stdc.math.frexp frexp; +alias tango.stdc.math.frexpf frexp; +alias tango.stdc.math.frexpl frexp; + +alias tango.stdc.math.ilogb ilogb; +alias tango.stdc.math.ilogbf ilogb; +alias tango.stdc.math.ilogbl ilogb; + +alias tango.stdc.math.ldexp ldexp; +alias tango.stdc.math.ldexpf ldexp; +alias tango.stdc.math.ldexpl ldexp; + +alias tango.stdc.math.log log; +alias tango.stdc.math.logf log; +alias tango.stdc.math.logl log; + +alias tango.stdc.complex.clog log; +alias tango.stdc.complex.clogf log; +alias tango.stdc.complex.clogl log; + +alias tango.stdc.math.log10 log10; +alias tango.stdc.math.log10f log10; +alias tango.stdc.math.log10l log10; + +alias tango.stdc.math.log1p log1p; +alias tango.stdc.math.log1pf log1p; +alias tango.stdc.math.log1pl log1p; + +alias tango.stdc.math.log2 log1p; +alias tango.stdc.math.log2f log1p; +alias tango.stdc.math.log2l log1p; + +alias tango.stdc.math.logb log1p; +alias tango.stdc.math.logbf log1p; +alias tango.stdc.math.logbl log1p; + +alias tango.stdc.math.modf modf; +alias tango.stdc.math.modff modf; +alias tango.stdc.math.modfl modf; + +alias tango.stdc.math.scalbn scalbn; +alias tango.stdc.math.scalbnf scalbn; +alias tango.stdc.math.scalbnl scalbn; + +alias tango.stdc.math.scalbln scalbln; +alias tango.stdc.math.scalblnf scalbln; +alias tango.stdc.math.scalblnl scalbln; + +alias tango.stdc.math.cbrt cbrt; +alias tango.stdc.math.cbrtf cbrt; +alias tango.stdc.math.cbrtl cbrt; + +alias tango.stdc.math.fabs fabs; +alias tango.stdc.math.fabsf fabs; +alias tango.stdc.math.fabsl fabs; + +alias tango.stdc.complex.cabs fabs; +alias tango.stdc.complex.cabsf fabs; +alias tango.stdc.complex.cabsl fabs; + +alias tango.stdc.math.hypot hypot; +alias tango.stdc.math.hypotf hypot; +alias tango.stdc.math.hypotl hypot; + +alias tango.stdc.math.pow pow; +alias tango.stdc.math.powf pow; +alias tango.stdc.math.powl pow; + +alias tango.stdc.complex.cpow pow; +alias tango.stdc.complex.cpowf pow; +alias tango.stdc.complex.cpowl pow; + +alias tango.stdc.math.sqrt sqrt; +alias tango.stdc.math.sqrtf sqrt; +alias tango.stdc.math.sqrtl sqrt; + +alias tango.stdc.complex.csqrt sqrt; +alias tango.stdc.complex.csqrtf sqrt; +alias tango.stdc.complex.csqrtl sqrt; + +alias tango.stdc.math.erf erf; +alias tango.stdc.math.erff erf; +alias tango.stdc.math.erfl erf; + +alias tango.stdc.math.erfc erfc; +alias tango.stdc.math.erfcf erfc; +alias tango.stdc.math.erfcl erfc; + +alias tango.stdc.math.lgamma lgamma; +alias tango.stdc.math.lgammaf lgamma; +alias tango.stdc.math.lgammal lgamma; + +alias tango.stdc.math.tgamma tgamma; +alias tango.stdc.math.tgammaf tgamma; +alias tango.stdc.math.tgammal tgamma; + +alias tango.stdc.math.ceil ceil; +alias tango.stdc.math.ceilf ceil; +alias tango.stdc.math.ceill ceil; + +alias tango.stdc.math.floor floor; +alias tango.stdc.math.floorf floor; +alias tango.stdc.math.floorl floor; + +alias tango.stdc.math.nearbyint nearbyint; +alias tango.stdc.math.nearbyintf nearbyint; +alias tango.stdc.math.nearbyintl nearbyint; + +alias tango.stdc.math.rint rint; +alias tango.stdc.math.rintf rint; +alias tango.stdc.math.rintl rint; + +alias tango.stdc.math.lrint lrint; +alias tango.stdc.math.lrintf lrint; +alias tango.stdc.math.lrintl lrint; + +alias tango.stdc.math.llrint llrint; +alias tango.stdc.math.llrintf llrint; +alias tango.stdc.math.llrintl llrint; + +alias tango.stdc.math.round round; +alias tango.stdc.math.roundf round; +alias tango.stdc.math.roundl round; + +alias tango.stdc.math.lround lround; +alias tango.stdc.math.lroundf lround; +alias tango.stdc.math.lroundl lround; + +alias tango.stdc.math.llround llround; +alias tango.stdc.math.llroundf llround; +alias tango.stdc.math.llroundl llround; + +alias tango.stdc.math.trunc trunc; +alias tango.stdc.math.truncf trunc; +alias tango.stdc.math.truncl trunc; + +alias tango.stdc.math.fmod fmod; +alias tango.stdc.math.fmodf fmod; +alias tango.stdc.math.fmodl fmod; + +alias tango.stdc.math.remainder remainder; +alias tango.stdc.math.remainderf remainder; +alias tango.stdc.math.remainderl remainder; + +alias tango.stdc.math.remquo remquo; +alias tango.stdc.math.remquof remquo; +alias tango.stdc.math.remquol remquo; + +alias tango.stdc.math.copysign copysign; +alias tango.stdc.math.copysignf copysign; +alias tango.stdc.math.copysignl copysign; + +alias tango.stdc.math.nan nan; +alias tango.stdc.math.nanf nan; +alias tango.stdc.math.nanl nan; + +alias tango.stdc.math.nextafter nextafter; +alias tango.stdc.math.nextafterf nextafter; +alias tango.stdc.math.nextafterl nextafter; + +alias tango.stdc.math.nexttoward nexttoward; +alias tango.stdc.math.nexttowardf nexttoward; +alias tango.stdc.math.nexttowardl nexttoward; + +alias tango.stdc.math.fdim fdim; +alias tango.stdc.math.fdimf fdim; +alias tango.stdc.math.fdiml fdim; + +alias tango.stdc.math.fmax fmax; +alias tango.stdc.math.fmaxf fmax; +alias tango.stdc.math.fmaxl fmax; + +alias tango.stdc.math.fmin fmin; +alias tango.stdc.math.fmin fmin; +alias tango.stdc.math.fminl fmin; + +alias tango.stdc.math.fma fma; +alias tango.stdc.math.fmaf fma; +alias tango.stdc.math.fmal fma; + +alias tango.stdc.complex.carg carg; +alias tango.stdc.complex.cargf carg; +alias tango.stdc.complex.cargl carg; + +alias tango.stdc.complex.cimag cimag; +alias tango.stdc.complex.cimagf cimag; +alias tango.stdc.complex.cimagl cimag; + +alias tango.stdc.complex.conj conj; +alias tango.stdc.complex.conjf conj; +alias tango.stdc.complex.conjl conj; + +alias tango.stdc.complex.cproj cproj; +alias tango.stdc.complex.cprojf cproj; +alias tango.stdc.complex.cprojl cproj; + +//alias tango.stdc.complex.creal creal; +//alias tango.stdc.complex.crealf creal; +//alias tango.stdc.complex.creall creal; diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/time.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/time.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,91 @@ +/** + * D header file for C99. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: ISO/IEC 9899:1999 (E) + */ +module tango.stdc.time; + +private import tango.stdc.config; +private import tango.stdc.stddef; + +extern (C): + +version( Win32 ) +{ + struct tm + { + int tm_sec; // seconds after the minute - [0, 60] + int tm_min; // minutes after the hour - [0, 59] + int tm_hour; // hours since midnight - [0, 23] + int tm_mday; // day of the month - [1, 31] + int tm_mon; // months since January - [0, 11] + int tm_year; // years since 1900 + int tm_wday; // days since Sunday - [0, 6] + int tm_yday; // days since January 1 - [0, 365] + int tm_isdst; // Daylight Saving Time flag + } +} +else +{ + struct tm + { + int tm_sec; // seconds after the minute [0-60] + int tm_min; // minutes after the hour [0-59] + int tm_hour; // hours since midnight [0-23] + int tm_mday; // day of the month [1-31] + int tm_mon; // months since January [0-11] + int tm_year; // years since 1900 + int tm_wday; // days since Sunday [0-6] + int tm_yday; // days since January 1 [0-365] + int tm_isdst; // Daylight Savings Time flag + c_long tm_gmtoff; // offset from CUT in seconds + char* tm_zone; // timezone abbreviation + } +} + +alias int time_t; +alias int clock_t; + +version( Win32 ) +{ + clock_t CLOCKS_PER_SEC = 1000; +} +else version( darwin ) +{ + clock_t CLOCKS_PER_SEC = 100; +} +else +{ + clock_t CLOCKS_PER_SEC = 1000000; +} + +clock_t clock(); +double difftime(time_t time1, time_t time0); +time_t mktime(tm* timeptr); +time_t time(time_t* timer); +char* asctime(tm* timeptr); +char* ctime(time_t* timer); +tm* gmtime(time_t* timer); +tm* localtime(time_t* timer); +size_t strftime(char* s, size_t maxsize, char* format, tm* timeptr); +size_t wcsftime(wchar_t* s, size_t maxsize, wchar_t* format, tm* timeptr); + +version( Win32 ) +{ + void tzset(); + void _tzset(); + char* _strdate(char* s); + char* _strtime(char* s); + + wchar_t* _wasctime(tm*); + wchar_t* _wctime(time_t*); + wchar_t* _wstrdate(wchar_t*); + wchar_t* _wstrtime(wchar_t*); +} +else version( linux ) +{ + void tzset(); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/stdc/wctype.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/stdc/wctype.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,26 @@ +/** + * D header file for C99. + * + * Copyright: Public Domain + * License: Public Domain + * Authors: Sean Kelly + * Standards: ISO/IEC 9899:1999 (E) + */ +module tango.stdc.wctype; + +private import tango.stdc.stddef; + +extern (C): + +int iswalnum(wint_t wc); +int iswalpha(wint_t wc); +int iswblank(wint_t wc); +int iswcntrl(wint_t wc); +int iswdigit(wint_t wc); +int iswgraph(wint_t wc); +int iswlower(wint_t wc); +int iswprint(wint_t wc); +int iswpunct(wint_t wc); +int iswspace(wint_t wc); +int iswupper(wint_t wc); +int iswxdigit(wint_t wc); diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/sys/Common.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/sys/Common.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,155 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: November 2005 + + author: Kris + +*******************************************************************************/ + +module tango.sys.Common; + +version (Win32) + { + public import tango.sys.win32.UserGdi; + } + +version (linux) + { + public import tango.sys.linux.linux; + alias tango.sys.linux.linux posix; + } + +version (darwin) + { + public import tango.sys.darwin.darwin; + alias tango.sys.darwin.darwin posix; + } + + +/******************************************************************************* + + Stuff for sysErrorMsg(), kindly provided by Regan Heath. + +*******************************************************************************/ + +version (Win32) + { + private const FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x00000100; + private const FORMAT_MESSAGE_IGNORE_INSERTS = 0x00000200; + private const FORMAT_MESSAGE_FROM_STRING = 0x00000400; + private const FORMAT_MESSAGE_FROM_HMODULE = 0x00000800; + private const FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000; + private const FORMAT_MESSAGE_ARGUMENT_ARRAY = 0x00002000; + private const FORMAT_MESSAGE_MAX_WIDTH_MASK = 0x000000FF; + + private DWORD MAKELANGID(WORD p, WORD s) { return (((cast(WORD)s) << 10) | cast(WORD)p); } + + private alias HGLOBAL HLOCAL; + + private const LANG_NEUTRAL = 0x00; + private const SUBLANG_DEFAULT = 0x01; + + private extern (Windows) + { + DWORD FormatMessageA (DWORD dwFlags, + LPCVOID lpSource, + DWORD dwMessageId, + DWORD dwLanguageId, + LPTSTR lpBuffer, + DWORD nSize, + LPCVOID args + ); + + HLOCAL LocalFree(HLOCAL hMem); + } + } +else +version (Posix) + { + private import tango.stdc.errno; + private import tango.stdc.string; + } +else + { + pragma (msg, "Unsupported environment; neither Win32 or Posix is declared"); + static assert(0); + } + + +/******************************************************************************* + +*******************************************************************************/ + +struct SysError +{ + /*********************************************************************** + + ***********************************************************************/ + + static uint lastCode () + { + version (Win32) + return GetLastError; + else + return errno; + } + + /*********************************************************************** + + ***********************************************************************/ + + static char[] lastMsg () + { + return lookup (lastCode); + } + + /*********************************************************************** + + ***********************************************************************/ + + static char[] lookup (uint errcode) + { + char[] text; + + version (Win32) + { + DWORD r; + LPVOID lpMsgBuf; + + r = FormatMessageA ( + FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + null, + errcode, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language + cast(LPTSTR)&lpMsgBuf, + 0, + null); + + /* Remove \r\n from error string */ + if (r >= 2) r-= 2; + text = (cast(char *)lpMsgBuf)[0..r].dup; + LocalFree(cast(HLOCAL)lpMsgBuf); + } + else + { + uint r; + char* pemsg; + + pemsg = strerror(errcode); + r = strlen(pemsg); + + /* Remove \r\n from error string */ + if (pemsg[r-1] == '\n') r--; + if (pemsg[r-1] == '\r') r--; + text = pemsg[0..r].dup; + } + + return text; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/sys/Environment.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/sys/Environment.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,310 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Tango. All rights reserved + + license: BSD style: $(LICENSE) + + version: Feb 2007: Initial release + + author: Deewiant, Maxter, Gregor, Kris + +*******************************************************************************/ + +module tango.sys.Environment; + +private import tango.sys.Common; + +private import tango.io.FilePath, + tango.io.FileConst, + tango.io.FileSystem; + +private import tango.core.Exception; + +private import Text = tango.text.Util; + +/******************************************************************************* + +*******************************************************************************/ + +version (Windows) +{ + private import tango.text.convert.Utf; + + pragma (lib, "kernel32.lib"); + + extern (Windows) + { + private void* GetEnvironmentStringsW(); + private bool FreeEnvironmentStringsW(wchar**); + } + extern (Windows) + { + private int SetEnvironmentVariableW(wchar*, wchar*); + private uint GetEnvironmentVariableW(wchar*, wchar*, uint); + private const int ERROR_ENVVAR_NOT_FOUND = 203; + } +} +else +{ + private extern (C) extern char** environ; + + import tango.stdc.posix.stdlib; + import tango.stdc.string; +} + + +/******************************************************************************* + + Exposes the system Environment settings, along with some handy + utilities + +*******************************************************************************/ + +struct Environment +{ + /*********************************************************************** + + Returns the full path location of the provided executable + file, rifling through the PATH as necessary. + + Returns null if the provided filename was not found + + ***********************************************************************/ + + static FilePath exePath (char[] file) + { + auto bin = new FilePath (file); + + // on Windows, this is a .exe + version (Windows) + if (bin.ext.length is 0) + bin.append (".exe"); + + // is this a directory? Potentially make it absolute + if (bin.isChild) + return FileSystem.toAbsolute (bin); + + // is it in cwd? + version (Windows) + if (bin.path(FileSystem.getDirectory).exists) + return bin; + + // rifle through the path + foreach (pe; Text.patterns (get("PATH"), FileConst.SystemPathString)) + if (bin.path(pe).exists) + version (Windows) + return bin; + else + { + stat_t stats; + stat(bin.cString.ptr, &stats); + if (stats.st_mode & 0100) + return bin; + } + return null; + } + + + version (Win32) + { + /************************************************************** + + Returns the provided 'def' value if the variable + does not exist + + **************************************************************/ + + static char[] get (char[] variable, char[] def = null) + { + wchar[] var = toString16(variable) ~ "\0"; + + uint size = GetEnvironmentVariableW(var.ptr, cast(wchar*)null, 0); + if (size is 0) + { + if (SysError.lastCode is ERROR_ENVVAR_NOT_FOUND) + return def; + else + throw new PlatformException (SysError.lastMsg); + } + + auto buffer = new wchar[size]; + size = GetEnvironmentVariableW(var.ptr, buffer.ptr, size); + if (size is 0) + throw new PlatformException (SysError.lastMsg); + + return toString (buffer[0 .. size]); + } + + /************************************************************** + + clears the variable if value is null or empty + + **************************************************************/ + + static void set (char[] variable, char[] value = null) + { + wchar * var, val; + + var = (toString16 (variable) ~ "\0").ptr; + + if (value.length > 0) + val = (toString16 (value) ~ "\0").ptr; + + if (! SetEnvironmentVariableW(var, val)) + throw new PlatformException (SysError.lastMsg); + } + + /************************************************************** + + **************************************************************/ + + static char[][char[]] get () + { + char[][char[]] arr; + + wchar[] key = new wchar[20], + value = new wchar[40]; + + wchar** env = cast(wchar**) GetEnvironmentStringsW(); + scope (exit) + FreeEnvironmentStringsW (env); + + for (wchar* str = cast(wchar*) env; *str; ++str) + { + size_t k = 0, v = 0; + + while (*str != '=') + { + key[k++] = *str++; + + if (k is key.length) + key.length = 2 * key.length; + } + + ++str; + + while (*str) + { + value [v++] = *str++; + + if (v is value.length) + value.length = 2 * value.length; + } + + arr [toString(key[0 .. k])] = toString(value[0 .. v]); + } + + return arr; + } + } + else // POSIX + { + /************************************************************** + + Returns the provided 'def' value if the variable + does not exist + + **************************************************************/ + + static char[] get (char[] variable, char[] def = null) + { + char* ptr = getenv (variable.ptr); + + if (ptr is null) + return def; + + return ptr[0 .. strlen(ptr)].dup; + } + + /************************************************************** + + clears the variable, if value is null or empty + + **************************************************************/ + + static void set (char[] variable, char[] value = null) + { + int result; + + if (value.length is 0) + unsetenv ((variable ~ '\0').ptr); + else + result = setenv ((variable ~ '\0').ptr, (value ~ '\0').ptr, 1); + + if (result != 0) + throw new PlatformException (SysError.lastMsg); + } + + /************************************************************** + + **************************************************************/ + + static char[][char[]] get () + { + char[][char[]] arr; + + for (char** p = environ; *p; ++p) + { + size_t k = 0; + char* str = *p; + + while (*str++ != '=') + ++k; + char[] key = (*p)[0..k]; + + k = 0; + char* val = str; + while (*str++) + ++k; + arr[key] = val[0 .. k]; + } + + return arr; + } + } +} + +debug (Environment) +{ + import tango.io.Console; + + + void main(char[][] args) + { + const char[] VAR = "TESTENVVAR"; + const char[] VAL1 = "VAL1"; + const char[] VAL2 = "VAL2"; + + assert(Environment.get(VAR) is null); + + Environment.set(VAR, VAL1); + assert(Environment.get(VAR) == VAL1); + + Environment.set(VAR, VAL2); + assert(Environment.get(VAR) == VAL2); + + Environment.set(VAR, null); + assert(Environment.get(VAR) is null); + + Environment.set(VAR, VAL1); + Environment.set(VAR, ""); + + assert(Environment.get(VAR) is null); + + foreach (key, value; Environment.get) + Cout (key) ("=") (value).newline; + + if (args.length > 0) + { + auto p = Environment.exePath (args[0]); + Cout (p).newline; + } + + if (args.length > 1) + { + if (auto p = Environment.exePath (args[1])) + Cout (p).newline; + } + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/sys/Pipe.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/sys/Pipe.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,224 @@ +/******************************************************************************* + copyright: Copyright (c) 2006 Juan Jose Comellas. All rights reserved + license: BSD style: $(LICENSE) + author: Juan Jose Comellas +*******************************************************************************/ + +module tango.sys.Pipe; + +private import tango.sys.Common; +private import tango.io.Buffer; +private import tango.io.DeviceConduit; + +private import tango.core.Exception; + +version (Posix) +{ + private import tango.stdc.posix.unistd; +} + +debug (PipeConduit) +{ + private import tango.io.Stdout; +} + + +/** + * Conduit for pipes. + * + * Each PipeConduit can only read or write, depending on the way it has been + * created. + */ +class PipeConduit: DeviceConduit +{ + version (OLD) + { + alias DeviceConduit.fileHandle fileHandle; + alias DeviceConduit.copy copy; + alias DeviceConduit.read read; + alias DeviceConduit.write write; + alias DeviceConduit.close close; + alias DeviceConduit.error error; + } + + static const uint DefaultBufferSize = 8 * 1024; + + private uint _bufferSize; + + + /** + * Create a PipeConduit with the provided handle and access permissions. + * + * Params: + * handle = handle of the operating system pipe we will wrap inside + * the PipeConduit. + * style = access flags for the pipe (readable, writable, etc.). + * bufferSize = buffer size. + */ + private this(ISelectable.Handle handle, + uint bufferSize = DefaultBufferSize) + { + version (Win32) + this.handle = cast(HANDLE) handle; + else + this.handle = handle; + _bufferSize = bufferSize; + } + + /** + * Destructor. + */ + public ~this() + { + close(); + } + + /** + * Returns the buffer size for the PipeConduit. + */ + public override uint bufferSize() + { + return _bufferSize; + } + + /** + * Returns the name of the device. + */ + public override char[] toString() + { + return ""; + } + + version (OLD) + { + /** + * Read a chunk of bytes from the file into the provided array + * (typically that belonging to an IBuffer) + */ + protected override uint read (void[] dst) + { + uint result; + DWORD read; + void *p = dst.ptr; + + if (!ReadFile (handle, p, dst.length, &read, null)) + { + if (SysError.lastCode() == ERROR_BROKEN_PIPE) + { + return Eof; + } + else + { + error(); + } + } + + if (read == 0 && dst.length > 0) + { + return Eof; + } + return read; + } + + /** + * Write a chunk of bytes to the file from the provided array + * (typically that belonging to an IBuffer). + */ + protected override uint write (void[] src) + { + DWORD written; + + if (!WriteFile (handle, src.ptr, src.length, &written, null)) + { + error(); + } + return written; + } + } +} + +/** + * Factory class for Pipes. + */ +class Pipe +{ + private PipeConduit _source; + private PipeConduit _sink; + + /** + * Create a Pipe. + */ + public this(uint bufferSize = PipeConduit.DefaultBufferSize) + { + version (Windows) + { + this(bufferSize, null); + } + else version (Posix) + { + int fd[2]; + + if (pipe(fd) == 0) + { + _source = new PipeConduit(cast(ISelectable.Handle) fd[0], bufferSize); + _sink = new PipeConduit(cast(ISelectable.Handle) fd[1], bufferSize); + } + else + { + error(); + } + } + else + { + assert(false, "Unknown platform"); + } + } + + version (Windows) + { + /** + * Helper constructor for pipes on Windows with non-null security + * attributes. + */ + package this(uint bufferSize, SECURITY_ATTRIBUTES *sa) + { + HANDLE sourceHandle; + HANDLE sinkHandle; + + if (CreatePipe(&sourceHandle, &sinkHandle, sa, cast(DWORD) bufferSize)) + { + _source = new PipeConduit(cast(ISelectable.Handle) sourceHandle); + _sink = new PipeConduit(cast(ISelectable.Handle) sinkHandle); + } + else + { + error(); + } + } + } + + /** + * Return the PipeConduit that you can write to. + */ + public PipeConduit sink() + { + return _sink; + } + + /** + * Return the PipeConduit that you can read from. + */ + public PipeConduit source() + { + return _source; + } + + /** + * + */ + private final void error () + { + throw new IOException("Pipe error: " ~ SysError.lastMsg); + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/sys/Process.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/sys/Process.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,1504 @@ +/******************************************************************************* + copyright: Copyright (c) 2006 Juan Jose Comellas. All rights reserved + license: BSD style: $(LICENSE) + author: Juan Jose Comellas +*******************************************************************************/ + +module tango.sys.Process; + +private import tango.io.FileConst; +private import tango.io.Console; +private import tango.io.Buffer; +private import tango.sys.Common; +private import tango.sys.Pipe; +private import tango.core.Exception; +private import tango.text.Util; +private import Integer = tango.text.convert.Integer; + +private import tango.stdc.stdlib; +private import tango.stdc.string; +private import tango.stdc.stringz; + +version (Posix) +{ + private import tango.stdc.errno; + private import tango.stdc.posix.fcntl; + private import tango.stdc.posix.unistd; + private import tango.stdc.posix.sys.wait; +} + +debug (Process) +{ + private import tango.io.Stdout; +} + + +/** + * The Process class is used to start external programs and communicate with + * them via their standard input, output and error streams. + * + * You can pass either the command line or an array of arguments to execute, + * either in the constructor or to the args property. The environment + * variables can be set in a similar way using the env property and you can + * set the program's working directory via the workDir property. + * + * To actually start a process you need to use the execute() method. Once the + * program is running you will be able to write to its standard input via the + * stdin OutputStream and you will be able to read from its standard output and + * error through the stdout and stderr InputStream respectively. + * + * You can check whether the process is running or not with the isRunning() + * method and you can get its process ID via the pid property. + * + * After you are done with the process of if you just want to wait for it to + * end you need to call the wait() method, which will return once the process + * is no longer running. + * + * To stop a running process you must use kill() method. If you do this you + * cannot call the wait() method. Once the kill() method returns the process + * will be already dead. + * + * Examples: + * --- + * try + * { + * auto p = new Process ("ls -al", null); + * p.execute; + * + * Stdout.formatln ("Output from {}:", p.programName); + * Stdout.copy (p.stdout).flush; + * auto result = p.wait; + * + * Stdout.formatln ("Process '{}' ({}) exited with reason {}, status {}", + * p.programName, p.pid, cast(int) result.reason, result.status); + * } + * catch (ProcessException e) + * Stdout.formatln ("Process execution failed: {}", e); + * --- + */ +class Process +{ + /** + * Result returned by wait(). + */ + public struct Result + { + /** + * Reasons returned by wait() indicating why the process is no + * longer running. + */ + public enum + { + Exit, + Signal, + Stop, + Continue, + Error + } + + public int reason; + public int status; + + /** + * Returns a string with a description of the process execution result. + */ + public char[] toString() + { + char[] str; + + switch (reason) + { + case Exit: + str = format("Process exited normally with return code ", status); + break; + + case Signal: + str = format("Process was killed with signal ", status); + break; + + case Stop: + str = format("Process was stopped with signal ", status); + break; + + case Continue: + str = format("Process was resumed with signal ", status); + break; + + case Error: + str = format("Process failed with error code ", reason) ~ + " : " ~ SysError.lookup(status); + break; + + default: + str = format("Unknown process result ", reason); + break; + } + return str; + } + } + + static const uint DefaultStdinBufferSize = 512; + static const uint DefaultStdoutBufferSize = 8192; + static const uint DefaultStderrBufferSize = 512; + + private char[][] _args; + private char[][char[]] _env; + private char[] _workDir; + private PipeConduit _stdin; + private PipeConduit _stdout; + private PipeConduit _stderr; + private bool _running = false; + + version (Windows) + { + private PROCESS_INFORMATION *_info = null; + } + else + { + private pid_t _pid = cast(pid_t) -1; + } + + /** + * Constructor (variadic version). + * + * Params: + * args = array of strings with the process' arguments; the first + * argument must be the process' name; the arguments can be + * empty. + * + * Examples: + * --- + * auto p = new Process("myprogram", "first argument", "second", "third") + * --- + */ + public this(char[][] args ...) + { + _args = args; + } + + /** + * Constructor. + * + * Params: + * command = string with the process' command line; arguments that have + * embedded whitespace must be enclosed in inside double-quotes ("). + * env = associative array of strings with the process' environment + * variables; the variable name must be the key of each entry. + * + * Examples: + * --- + * char[] command = "myprogram \"first argument\" second third"; + * char[][char[]] env; + * + * // Environment variables + * env["MYVAR1"] = "first"; + * env["MYVAR2"] = "second"; + * + * auto p = new Process(command, env) + * --- + */ + public this(char[] command, char[][char[]] env) + in + { + assert(command.length > 0); + } + body + { + _args = splitArgs(command); + _env = env; + } + + /** + * Constructor. + * + * Params: + * args = array of strings with the process' arguments; the first + * argument must be the process' name; the arguments can be + * empty. + * env = associative array of strings with the process' environment + * variables; the variable name must be the key of each entry. + * + * Examples: + * --- + * char[][] args; + * char[][char[]] env; + * + * // Process name + * args ~= "myprogram"; + * // Process arguments + * args ~= "first argument"; + * args ~= "second"; + * args ~= "third"; + * + * // Environment variables + * env["MYVAR1"] = "first"; + * env["MYVAR2"] = "second"; + * + * auto p = new Process(args, env) + * --- + */ + public this(char[][] args, char[][char[]] env) + in + { + assert(args.length > 0); + assert(args[0].length > 0); + } + body + { + _args = args; + _env = env; + } + + /** + * Indicate whether the process is running or not. + */ + public bool isRunning() + { + return _running; + } + + /** + * Return the running process' ID. + * + * Returns: an int with the process ID if the process is running; + * -1 if not. + */ + public int pid() + { + version (Windows) + { + return (_info !is null ? cast(int) _info.dwProcessId : -1); + } + else // version (Posix) + { + return cast(int) _pid; + } + } + + /** + * Return the process' executable filename. + */ + public char[] programName() + { + return (_args !is null ? _args[0] : null); + } + + /** + * Set the process' executable filename. + */ + public void programName(char[] name) + { + if (_args.length == 0) + { + _args.length = 1; + } + _args[0] = name; + } + + /** + * Return an array with the process' arguments. + */ + public char[][] args() + { + return _args; + } + + /** + * Set the process' arguments from the arguments received by the method. + * + * Remarks: + * The first element of the array must be the name of the process' + * executable. + * + * Examples: + * --- + * p.args("myprogram", "first", "second argument", "third"); + * --- + */ + public void args(char[][] args ...) + { + _args = args; + } + + /** + * Return an associative array with the process' environment variables. + */ + public char[][char[]] env() + { + return _env; + } + + /** + * Set the process' environment variables from the associative array + * received by the method. + * + * Params: + * env = associative array of strings containing the environment + * variables for the process. The variable name should be the key + * used for each entry. + * + * Examples: + * --- + * char[][char[]] env; + * + * env["MYVAR1"] = "first"; + * env["MYVAR2"] = "second"; + * + * p.env = env; + * --- + */ + public void env(char[][char[]] env) + { + _env = env; + } + + /** + * Return an UTF-8 string with the process' command line. + */ + public char[] toString() + { + char[] command; + + for (uint i = 0; i < _args.length; ++i) + { + if (i > 0) + { + command ~= ' '; + } + if (contains(_args[i], ' ') || _args[i].length == 0) + { + command ~= '"'; + command ~= _args[i]; + command ~= '"'; + } + else + { + command ~= _args[i]; + } + } + return command; + } + + /** + * Return the working directory for the process. + * + * Returns: a string with the working directory; null if the working + * directory is the current directory. + */ + public char[] workDir() + { + return _workDir; + } + + /** + * Set the working directory for the process. + * + * Params: + * dir = a string with the working directory; null if the working + * directory is the current directory. + */ + public void workDir(char[] dir) + { + _workDir = dir; + } + + /** + * Return the running process' standard input pipe. + * + * Returns: a write-only PipeConduit connected to the child + * process' stdin. + * + * Remarks: + * The stream will be null if no child process has been executed. + */ + public PipeConduit stdin() + { + return _stdin; + } + + /** + * Return the running process' standard output pipe. + * + * Returns: a read-only PipeConduit connected to the child + * process' stdout. + * + * Remarks: + * The stream will be null if no child process has been executed. + */ + public PipeConduit stdout() + { + return _stdout; + } + + /** + * Return the running process' standard error pipe. + * + * Returns: a read-only PipeConduit connected to the child + * process' stderr. + * + * Remarks: + * The stream will be null if no child process has been executed. + */ + public PipeConduit stderr() + { + return _stderr; + } + + /** + * Execute a process using the arguments as parameters to this method. + * + * Once the process is executed successfully, its input and output can be + * manipulated through the stdin, stdout and + * stderr member PipeConduit's. + * + * Throws: + * ProcessCreateException if the process could not be created + * successfully; ProcessForkException if the call to the fork() + * system call failed (on POSIX-compatible platforms). + * + * Remarks: + * The process must not be running and the provided list of arguments must + * not be empty. If there was any argument already present in the args + * member, they will be replaced by the arguments supplied to the method. + */ + public void execute(char[][] args ...) + in + { + assert(!_running); + } + body + { + if (args.length > 0 && args[0] !is null) + { + _args = args; + } + executeInternal(); + } + + /** + * Execute a process using the command line arguments as parameters to + * this method. + * + * Once the process is executed successfully, its input and output can be + * manipulated through the stdin, stdout and + * stderr member PipeConduit's. + * + * Params: + * command = string with the process' command line; arguments that have + * embedded whitespace must be enclosed in inside double-quotes ("). + * env = associative array of strings with the process' environment + * variables; the variable name must be the key of each entry. + * + * Throws: + * ProcessCreateException if the process could not be created + * successfully; ProcessForkException if the call to the fork() + * system call failed (on POSIX-compatible platforms). + * + * Remarks: + * The process must not be running and the provided list of arguments must + * not be empty. If there was any argument already present in the args + * member, they will be replaced by the arguments supplied to the method. + */ + public void execute(char[] command, char[][char[]] env) + in + { + assert(!_running); + assert(command.length > 0); + } + body + { + _args = splitArgs(command); + _env = env; + + executeInternal(); + } + + /** + * Execute a process using the command line arguments as parameters to + * this method. + * + * Once the process is executed successfully, its input and output can be + * manipulated through the stdin, stdout and + * stderr member PipeConduit's. + * + * Params: + * args = array of strings with the process' arguments; the first + * argument must be the process' name; the arguments can be + * empty. + * env = associative array of strings with the process' environment + * variables; the variable name must be the key of each entry. + * + * Throws: + * ProcessCreateException if the process could not be created + * successfully; ProcessForkException if the call to the fork() + * system call failed (on POSIX-compatible platforms). + * + * Remarks: + * The process must not be running and the provided list of arguments must + * not be empty. If there was any argument already present in the args + * member, they will be replaced by the arguments supplied to the method. + * + * Examples: + * --- + * auto p = new Process(); + * char[][] args; + * + * args ~= "ls"; + * args ~= "-l"; + * + * p.execute(args, null); + * --- + */ + public void execute(char[][] args, char[][char[]] env) + in + { + assert(!_running); + assert(args.length > 0); + } + body + { + _args = args; + _env = env; + + executeInternal(); + } + + /** + * Execute a process using the arguments that were supplied to the + * constructor or to the args property. + * + * Once the process is executed successfully, its input and output can be + * manipulated through the stdin, stdout and + * stderr member PipeConduit's. + * + * Throws: + * ProcessCreateException if the process could not be created + * successfully; ProcessForkException if the call to the fork() + * system call failed (on POSIX-compatible platforms). + * + * Remarks: + * The process must not be running and the list of arguments must + * not be empty before calling this method. + */ + protected void executeInternal() + in + { + assert(!_running); + assert(_args.length > 0 && _args[0] !is null); + } + body + { + version (Windows) + { + SECURITY_ATTRIBUTES sa; + STARTUPINFO startup; + + // We close and delete the pipes that could have been left open + // from a previous execution. + cleanPipes(); + + // Set up the security attributes struct. + sa.nLength = SECURITY_ATTRIBUTES.sizeof; + sa.lpSecurityDescriptor = null; + sa.bInheritHandle = true; + + // Set up members of the STARTUPINFO structure. + memset(&startup, '\0', STARTUPINFO.sizeof); + startup.cb = STARTUPINFO.sizeof; + startup.dwFlags |= STARTF_USESTDHANDLES; + + // Create the pipes used to communicate with the child process. + Pipe pin = new Pipe(DefaultStdinBufferSize, &sa); + // Replace stdin with the "read" pipe + _stdin = pin.sink; + startup.hStdInput = cast(HANDLE) pin.source.fileHandle(); + // Ensure the write handle to the pipe for STDIN is not inherited. + SetHandleInformation(cast(HANDLE) pin.sink.fileHandle(), HANDLE_FLAG_INHERIT, 0); + scope(exit) + pin.source.close(); + + Pipe pout = new Pipe(DefaultStdoutBufferSize, &sa); + // Replace stdout with the "write" pipe + _stdout = pout.source; + startup.hStdOutput = cast(HANDLE) pout.sink.fileHandle(); + // Ensure the read handle to the pipe for STDOUT is not inherited. + SetHandleInformation(cast(HANDLE) pout.source.fileHandle(), HANDLE_FLAG_INHERIT, 0); + scope(exit) + pout.sink.close(); + + Pipe perr = new Pipe(DefaultStderrBufferSize, &sa); + // Replace stderr with the "write" pipe + _stderr = perr.source; + startup.hStdError = cast(HANDLE) perr.sink.fileHandle(); + // Ensure the read handle to the pipe for STDOUT is not inherited. + SetHandleInformation(cast(HANDLE) perr.source.fileHandle(), HANDLE_FLAG_INHERIT, 0); + scope(exit) + perr.sink.close(); + + _info = new PROCESS_INFORMATION; + // Set up members of the PROCESS_INFORMATION structure. + memset(_info, '\0', PROCESS_INFORMATION.sizeof); + + char[] command = toString(); + command ~= '\0'; + + // Convert the working directory to a null-ended string if + // necessary. + if (CreateProcessA(null, command.ptr, null, null, true, + DETACHED_PROCESS, + (_env.length > 0 ? toNullEndedBuffer(_env).ptr : null), + toStringz(_workDir), &startup, _info)) + { + CloseHandle(_info.hThread); + _running = true; + } + else + { + throw new ProcessCreateException(_args[0], __FILE__, __LINE__); + } + } + else version (Posix) + { + // We close and delete the pipes that could have been left open + // from a previous execution. + cleanPipes(); + + Pipe pin = new Pipe(DefaultStdinBufferSize); + Pipe pout = new Pipe(DefaultStdoutBufferSize); + Pipe perr = new Pipe(DefaultStderrBufferSize); + // This pipe is used to propagate the result of the call to + // execv*() from the child process to the parent process. + Pipe pexec = new Pipe(8); + int status = 0; + + _pid = fork(); + if (_pid >= 0) + { + if (_pid != 0) + { + // Parent process + _stdin = pin.sink; + pin.source.close(); + + _stdout = pout.source; + pout.sink.close(); + + _stderr = perr.source; + perr.sink.close(); + + pexec.sink.close(); + scope(exit) + pexec.source.close(); + + try + { + pexec.source.input.read((cast(byte*) &status)[0 .. status.sizeof]); + } + catch (Exception e) + { + // Everything's OK, the pipe was closed after the call to execv*() + } + + if (status == 0) + { + _running = true; + } + else + { + // We set errno to the value that was sent through + // the pipe from the child process + errno = status; + _running = false; + + throw new ProcessCreateException(_args[0], __FILE__, __LINE__); + } + } + else + { + // Child process + int rc; + char*[] argptr; + char*[] envptr; + + // Replace stdin with the "read" pipe + dup2(pin.source.fileHandle(), STDIN_FILENO); + pin.sink().close(); + scope(exit) + pin.source.close(); + + // Replace stdout with the "write" pipe + dup2(pout.sink.fileHandle(), STDOUT_FILENO); + pout.source.close(); + scope(exit) + pout.sink.close(); + + // Replace stderr with the "write" pipe + dup2(perr.sink.fileHandle(), STDERR_FILENO); + perr.source.close(); + scope(exit) + perr.sink.close(); + + // We close the unneeded part of the execv*() notification pipe + pexec.source.close(); + scope(exit) + pexec.sink.close(); + // Set the "write" pipe so that it closes upon a successful + // call to execv*() + if (fcntl(cast(int) pexec.sink.fileHandle(), F_SETFD, FD_CLOEXEC) == 0) + { + // Convert the arguments and the environment variables to + // the format expected by the execv() family of functions. + argptr = toNullEndedArray(_args); + envptr = (_env.length > 0 ? toNullEndedArray(_env) : null); + + // Switch to the working directory if it has been set. + if (_workDir.length > 0) + { + chdir(toStringz(_workDir)); + } + + // Replace the child fork with a new process. We always use the + // system PATH to look for executables that don't specify + // directories in their names. + rc = execvpe(_args[0], argptr, envptr); + if (rc == -1) + { + Cerr("Failed to exec ")(_args[0])(": ")(SysError.lastMsg).newline; + + try + { + status = errno; + + // Propagate the child process' errno value to + // the parent process. + pexec.sink.output.write((cast(byte*) &status)[0 .. status.sizeof]); + } + catch (Exception e) + { + } + exit(errno); + } + } + else + { + Cerr("Failed to set notification pipe to close-on-exec for ") + (_args[0])(": ")(SysError.lastMsg).newline; + exit(errno); + } + } + } + else + { + throw new ProcessForkException(_pid, __FILE__, __LINE__); + } + } + else + { + assert(false, "tango.sys.Process: Unsupported platform"); + } + } + + + /** + * Unconditionally wait for a process to end and return the reason and + * status code why the process ended. + * + * Returns: + * The return value is a Result struct, which has two members: + * reason and status. The reason can take the + * following values: + * + * Process.Result.Exit: the child process exited normally; + * status has the process' return + * code. + * + * Process.Result.Signal: the child process was killed by a signal; + * status has the signal number + * that killed the process. + * + * Process.Result.Stop: the process was stopped; status + * has the signal number that was used to stop + * the process. + * + * Process.Result.Continue: the process had been previously stopped + * and has now been restarted; + * status has the signal number + * that was used to continue the process. + * + * Process.Result.Error: We could not properly wait on the child + * process; status has the + * errno value if the process was + * running and -1 if not. + * + * Remarks: + * You can only call wait() on a running process once. The Signal, Stop + * and Continue reasons will only be returned on POSIX-compatible + * platforms. + */ + public Result wait() + { + version (Windows) + { + Result result; + + if (_running) + { + DWORD rc; + DWORD exitCode; + + assert(_info !is null); + + // We clean up the process related data and set the _running + // flag to false once we're done waiting for the process to + // finish. + // + // IMPORTANT: we don't delete the open pipes so that the parent + // process can get whatever the child process left on + // these pipes before dying. + scope(exit) + { + CloseHandle(_info.hProcess); + _running = false; + } + + rc = WaitForSingleObject(_info.hProcess, INFINITE); + if (rc == WAIT_OBJECT_0) + { + GetExitCodeProcess(_info.hProcess, &exitCode); + + result.reason = Result.Exit; + result.status = cast(typeof(result.status)) exitCode; + + debug (Process) + Stdout.formatln("Child process '{0}' ({1}) returned with code {2}\n", + _args[0], _pid, result.status); + } + else if (rc == WAIT_FAILED) + { + result.reason = Result.Error; + result.status = cast(short) GetLastError(); + + debug (Process) + Stdout.formatln("Child process '{0}' ({1}) failed " + "with unknown exit status {2}\n", + _args[0], _pid, result.status); + } + } + else + { + result.reason = Result.Error; + result.status = -1; + + debug (Process) + Stdout.formatln("Child process '{0}' is not running", _args[0]); + } + return result; + } + else version (Posix) + { + Result result; + + if (_running) + { + int rc; + + // We clean up the process related data and set the _running + // flag to false once we're done waiting for the process to + // finish. + // + // IMPORTANT: we don't delete the open pipes so that the parent + // process can get whatever the child process left on + // these pipes before dying. + scope(exit) + { + _running = false; + } + + // Wait for child process to end. + if (waitpid(_pid, &rc, 0) != -1) + { + if (WIFEXITED(rc)) + { + result.reason = Result.Exit; + result.status = WEXITSTATUS(rc); + if (result.status != 0) + { + debug (Process) + Stdout.formatln("Child process '{0}' ({1}) returned with code {2}\n", + _args[0], _pid, result.status); + } + } + else + { + if (WIFSIGNALED(rc)) + { + result.reason = Result.Signal; + result.status = WTERMSIG(rc); + + debug (Process) + Stdout.formatln("Child process '{0}' ({1}) was killed prematurely " + "with signal {2}", + _args[0], _pid, result.status); + } + else if (WIFSTOPPED(rc)) + { + result.reason = Result.Stop; + result.status = WSTOPSIG(rc); + + debug (Process) + Stdout.formatln("Child process '{0}' ({1}) was stopped " + "with signal {2}", + _args[0], _pid, result.status); + } + else if (WIFCONTINUED(rc)) + { + result.reason = Result.Stop; + result.status = WSTOPSIG(rc); + + debug (Process) + Stdout.formatln("Child process '{0}' ({1}) was continued " + "with signal {2}", + _args[0], _pid, result.status); + } + else + { + result.reason = Result.Error; + result.status = rc; + + debug (Process) + Stdout.formatln("Child process '{0}' ({1}) failed " + "with unknown exit status {2}\n", + _args[0], _pid, result.status); + } + } + } + else + { + result.reason = Result.Error; + result.status = errno; + + debug (Process) + Stdout.formatln("Could not wait on child process '{0}' ({1}): ({2}) {3}", + _args[0], _pid, result.status, SysError.lastMsg); + } + } + else + { + result.reason = Result.Error; + result.status = -1; + + debug (Process) + Stdout.formatln("Child process '{0}' is not running", _args[0]); + } + return result; + } + else + { + assert(false, "tango.sys.Process: Unsupported platform"); + } + } + + /** + * Kill a running process. This method will not return until the process + * has been killed. + * + * Throws: + * ProcessKillException if the process could not be killed; + * ProcessWaitException if we could not wait on the process after + * killing it. + * + * Remarks: + * After calling this method you will not be able to call wait() on the + * process. + */ + public void kill() + { + version (Windows) + { + if (_running) + { + assert(_info !is null); + + if (TerminateProcess(_info.hProcess, cast(UINT) -1)) + { + assert(_info !is null); + + // We clean up the process related data and set the _running + // flag to false once we're done waiting for the process to + // finish. + // + // IMPORTANT: we don't delete the open pipes so that the parent + // process can get whatever the child process left on + // these pipes before dying. + scope(exit) + { + CloseHandle(_info.hProcess); + _running = false; + } + + // FIXME: We should probably use a timeout here + if (WaitForSingleObject(_info.hProcess, INFINITE) == WAIT_FAILED) + { + throw new ProcessWaitException(cast(int) _info.dwProcessId, + __FILE__, __LINE__); + } + } + else + { + throw new ProcessKillException(cast(int) _info.dwProcessId, + __FILE__, __LINE__); + } + } + else + { + debug (Process) + Stdout.print("Tried to kill an invalid process"); + } + } + else version (Posix) + { + if (_running) + { + int rc; + + assert(_pid > 0); + + if (.kill(_pid, SIGTERM) != -1) + { + // We clean up the process related data and set the _running + // flag to false once we're done waiting for the process to + // finish. + // + // IMPORTANT: we don't delete the open pipes so that the parent + // process can get whatever the child process left on + // these pipes before dying. + scope(exit) + { + _running = false; + } + + // FIXME: is this loop really needed? + for (uint i = 0; i < 100; i++) + { + rc = waitpid(pid, null, WNOHANG | WUNTRACED); + if (rc == _pid) + { + break; + } + else if (rc == -1) + { + throw new ProcessWaitException(cast(int) _pid, __FILE__, __LINE__); + } + usleep(50000); + } + } + else + { + throw new ProcessKillException(_pid, __FILE__, __LINE__); + } + } + else + { + debug (Process) + Stdout.print("Tried to kill an invalid process"); + } + } + else + { + assert(false, "tango.sys.Process: Unsupported platform"); + } + } + + /** + * Split a string containing the command line used to invoke a program + * and return and array with the parsed arguments. The double-quotes (") + * character can be used to specify arguments with embedded spaces. + * e.g. first "second param" third + */ + protected static char[][] splitArgs(inout char[] command, char[] delims = " \t\r\n") + in + { + assert(!contains(delims, '"'), + "The argument delimiter string cannot contain a double quotes ('\"') character"); + } + body + { + enum State + { + Start, + FindDelimiter, + InsideQuotes + } + + char[][] args = null; + char[][] chunks = null; + int start = -1; + char c; + int i; + State state = State.Start; + + // Append an argument to the 'args' array using the 'chunks' array + // and the current position in the 'command' string as the source. + void appendChunksAsArg() + { + uint argPos; + + if (chunks.length > 0) + { + // Create the array element corresponding to the argument by + // appending the first chunk. + args ~= chunks[0]; + argPos = args.length - 1; + + for (uint chunkPos = 1; chunkPos < chunks.length; ++chunkPos) + { + args[argPos] ~= chunks[chunkPos]; + } + + if (start != -1) + { + args[argPos] ~= command[start .. i]; + } + chunks.length = 0; + } + else + { + if (start != -1) + { + args ~= command[start .. i]; + } + } + start = -1; + } + + for (i = 0; i < command.length; i++) + { + c = command[i]; + + switch (state) + { + // Start looking for an argument. + case State.Start: + if (c == '"') + { + state = State.InsideQuotes; + } + else if (!contains(delims, c)) + { + start = i; + state = State.FindDelimiter; + } + else + { + appendChunksAsArg(); + } + break; + + // Find the ending delimiter for an argument. + case State.FindDelimiter: + if (c == '"') + { + // If we find a quotes character this means that we've + // found a quoted section of an argument. (e.g. + // abc"def"ghi). The quoted section will be appended + // to the preceding part of the argument. This is also + // what Unix shells do (i.e. a"b"c becomes abc). + if (start != -1) + { + chunks ~= command[start .. i]; + start = -1; + } + state = State.InsideQuotes; + } + else if (contains(delims, c)) + { + appendChunksAsArg(); + state = State.Start; + } + break; + + // Inside a quoted argument or section of an argument. + case State.InsideQuotes: + if (start == -1) + { + start = i; + } + + if (c == '"') + { + chunks ~= command[start .. i]; + start = -1; + state = State.Start; + } + break; + + default: + assert(false, "Invalid state in Process.splitArgs"); + } + } + + // Add the last argument (if there is one) + appendChunksAsArg(); + + return args; + } + + /** + * Close and delete any pipe that may have been left open in a previous + * execution of a child process. + */ + protected void cleanPipes() + { + delete _stdin; + delete _stdout; + delete _stderr; + } + + version (Windows) + { + /** + * Convert an associative array of strings to a buffer containing a + * concatenation of "=" strings separated by a null + * character and with an additional null character at the end of it. + * This is the format expected by the CreateProcess() Windows API for + * the environment variables. + */ + protected static char[] toNullEndedBuffer(char[][char[]] src) + { + char[] dest; + + foreach (key, value; src) + { + dest ~= key ~ '=' ~ value ~ '\0'; + } + + if (dest.length > 0) + { + dest ~= '\0'; + } + + return dest; + } + } + else version (Posix) + { + /** + * Convert an array of strings to an array of pointers to char with + * a terminating null character (C strings). The resulting array + * has a null pointer at the end. This is the format expected by + * the execv*() family of POSIX functions. + */ + protected static char*[] toNullEndedArray(char[][] src) + { + if (src !is null) + { + char*[] dest = new char*[src.length + 1]; + int i = src.length; + + // Add terminating null pointer to the array + dest[i] = null; + + while (--i >= 0) + { + // Add a terminating null character to each string + dest[i] = toStringz(src[i]); + } + return dest; + } + else + { + return null; + } + } + + /** + * Convert an associative array of strings to an array of pointers to + * char with a terminating null character (C strings). The resulting + * array has a null pointer at the end. This is the format expected by + * the execv*() family of POSIX functions for environment variables. + */ + protected static char*[] toNullEndedArray(char[][char[]] src) + { + char*[] dest; + + foreach (key, value; src) + { + dest ~= (key ~ '=' ~ value ~ '\0').ptr; + } + + if (dest.length > 0) + { + dest ~= null; + } + return dest; + } + + /** + * Execute a process by looking up a file in the system path, passing + * the array of arguments and the the environment variables. This + * method is a combination of the execve() and execvp() POSIX system + * calls. + */ + protected static int execvpe(char[] filename, char*[] argv, char*[] envp) + in + { + assert(filename.length > 0); + } + body + { + int rc = -1; + char* str; + + if (!contains(filename, FileConst.PathSeparatorChar) && + (str = getenv("PATH")) !is null) + { + char[][] pathList = delimit(str[0 .. strlen(str)], ":"); + + foreach (path; pathList) + { + if (path[path.length - 1] != FileConst.PathSeparatorChar) + { + path ~= FileConst.PathSeparatorChar; + } + + debug (Process) + Stdout.formatln("Trying execution of '{0}' in directory '{1}'", + filename, path); + + path ~= filename; + path ~= '\0'; + + rc = execve(path.ptr, argv.ptr, (envp.length > 0 ? envp.ptr : null)); + // If the process execution failed because of an error + // other than ENOENT (No such file or directory) we + // abort the loop. + if (rc == -1 && errno != ENOENT) + { + break; + } + } + } + else + { + debug (Process) + Stdout.formatln("Calling execve('{0}', argv[{1}], {2})", + (argv[0])[0 .. strlen(argv[0])], + argv.length, (envp.length > 0 ? "envp" : "null")); + + rc = execve(argv[0], argv.ptr, (envp.length > 0 ? envp.ptr : null)); + } + return rc; + } + } +} + + +/** + * Exception thrown when the process cannot be created. + */ +class ProcessCreateException: ProcessException +{ + public this(char[] command, char[] file, uint line) + { + super("Could not create process for " ~ command ~ " : " ~ SysError.lastMsg); + } +} + +/** + * Exception thrown when the parent process cannot be forked. + * + * This exception will only be thrown on POSIX-compatible platforms. + */ +class ProcessForkException: ProcessException +{ + public this(int pid, char[] file, uint line) + { + super(format("Could not fork process ", pid) ~ " : " ~ SysError.lastMsg); + } +} + +/** + * Exception thrown when the process cannot be killed. + */ +class ProcessKillException: ProcessException +{ + public this(int pid, char[] file, uint line) + { + super(format("Could not kill process ", pid) ~ " : " ~ SysError.lastMsg); + } +} + +/** + * Exception thrown when the parent process tries to wait on the child + * process and fails. + */ +class ProcessWaitException: ProcessException +{ + public this(int pid, char[] file, uint line) + { + super(format("Could not wait on process ", pid) ~ " : " ~ SysError.lastMsg); + } +} + + + + +/** + * append an int argument to a message +*/ +private char[] format (char[] msg, int value) +{ + char[10] tmp; + + return msg ~ Integer.format (tmp, value); +} + + +debug (UnitTest) +{ + private import tango.text.stream.LineIterator; + + unittest + { + char[][] params; + char[] command = "echo "; + + params ~= "one"; + params ~= "two"; + params ~= "three"; + + command ~= '"'; + foreach (i, param; params) + { + command ~= param; + if (i != params.length - 1) + { + command ~= '\n'; + } + } + command ~= '"'; + + try + { + auto p = new Process(command, null); + + p.execute(); + + foreach (i, line; new LineIterator!(char)(p.stdout)) + { + if (i == params.length) // echo can add ending new line confusing this test + break; + assert(line == params[i]); + } + + auto result = p.wait(); + + assert(result.reason == Process.Result.Exit && result.status == 0); + } + catch (ProcessException e) + { + Cerr("Program execution failed: ")(e.toString()).newline(); + } + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/sys/SharedLib.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/sys/SharedLib.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,337 @@ +/** + * The shared library module provides a basic layer around the native functions + * used to load symbols from shared libraries. + * + * Copyright: Copyright (C) 2007 Tomasz Stachowiak + * License: BSD style: $(LICENSE) + * Authors: Tomasz Stachowiak, Anders Bergh + */ + +module tango.sys.SharedLib; + + +private { + import tango.core.Exception : TracedException; + import tango.stdc.stringz : fromUtf8z; + + version (Windows) { + import tango.sys.Common : SysError; + + alias void* HINSTANCE, HMODULE; + alias int BOOL; + + extern (Windows) { + void* GetProcAddress(HINSTANCE, char*); + HINSTANCE LoadLibraryA(char*); + BOOL FreeLibrary(HMODULE); + } + } + else version (Posix) { + import tango.stdc.posix.dlfcn; + } + else { + static assert (false, "No support for this platform"); + } + + version (SharedLibVerbose) import tango.util.log.Trace; +} + + +/** + SharedLib is an interface to system-specific shared libraries, such + as ".dll", ".so" or ".dylib" files. It provides a simple interface to obtain + symbol addresses (such as function pointers) from these libraries. + + Example: + ---- + + void main() { + if (auto lib = SharedLib.load(`c:\windows\system32\opengl32.dll`)) { + Trace.formatln("Library successfully loaded"); + + void* ptr = lib.getSymbol("glClear"); + if (ptr) { + Trace.formatln("Symbol glClear found. Address = 0x{:x}", ptr); + } else { + Trace.formatln("Symbol glClear not found"); + } + + lib.unload(); + } else { + Trace.formatln("Could not load the library"); + } + + assert (0 == SharedLib.numLoadedLibs); + } + + ---- + + This implementation uses reference counting, thus a library is not loaded + again if it has been loaded before and not unloaded by the user. + Unloading a SharedLib decreases its reference count. When it reaches 0, + the shared library associated with it is unloaded and the SharedLib instance + is deleted. Please do not delete SharedLib instances manually, unload() will + take care of it. + + Note: + SharedLib is thread-safe. + */ +final class SharedLib { + /// Mapped from RTLD_NOW, RTLD_LAZY, RTLD_GLOBAL and RTLD_LOCAL + enum LoadMode { + Now = 0b1, + Lazy = 0b10, + Global = 0b100, + Local = 0b1000 + } + + + /** + Loads an OS-specific shared library. + + Note: + Please use this function instead of the constructor, which is private. + + Params: + path = The path to a shared library to be loaded + mode = Library loading mode. See LoadMode + + Returns: + A SharedLib instance being a handle to the library, or null if it + could not be loaded and SharedLib.throwExceptions is set to false. + Otherwise, throws SharedLibException + */ + static SharedLib load(char[] path, LoadMode mode = LoadMode.Now | LoadMode.Global) { + SharedLib res; + + synchronized (mutex) { + auto lib = path in loadedLibs; + if (lib) { + version (SharedLibVerbose) Trace.formatln("SharedLib found in the hashmap"); + res = *lib; + } + else { + version (SharedLibVerbose) Trace.formatln("Creating a new instance of SharedLib"); + res = new SharedLib(path); + loadedLibs[path] = res; + } + + ++res.refCnt; + } + + bool delRes = false; + Exception exc; + + synchronized (res) { + if (!res.loaded) { + version (SharedLibVerbose) Trace.formatln("Loading the SharedLib"); + try { + res.load_(mode); + } catch (Exception e) { + exc = e; + } + } + + if (res.loaded) { + version (SharedLibVerbose) Trace.formatln("SharedLib successfully loaded, returning"); + return res; + } else { + synchronized (mutex) { + if (path in loadedLibs) { + version (SharedLibVerbose) Trace.formatln("Removing the SharedLib from the hashmap"); + loadedLibs.remove(path); + } + } + } + + // make sure that only one thread will delete the object + if (0 == --res.refCnt) { + delRes = true; + } + } + + if (delRes) { + version (SharedLibVerbose) Trace.formatln("Deleting the SharedLib"); + delete res; + } + + if (exc !is null) { + throw exc; + } + + version (SharedLibVerbose) Trace.formatln("SharedLib not loaded, returning null"); + return null; + } + + + /** + Unloads the OS-specific shared library associated with this SharedLib instance. + + Note: + It's invalid to use the object after unload() has been called, as unload() + will delete it if it's not referenced any more. + + Throws SharedLibException on failure. In this case, the SharedLib object is not deleted. + */ + void unload() { + bool deleteThis = false; + + synchronized (this) { + assert (loaded); + assert (refCnt > 0); + + synchronized (mutex) { + if (--refCnt <= 0) { + version (SharedLibVerbose) Trace.formatln("Unloading the SharedLib"); + try { + unload_(); + } catch (Exception e) { + ++refCnt; + throw e; + } + + assert ((path in loadedLibs) !is null); + loadedLibs.remove(path); + + deleteThis = true; + } + } + } + if (deleteThis) { + version (SharedLibVerbose) Trace.formatln("Deleting the SharedLib"); + delete this; + } + } + + + /** + Returns the path to the OS-specific shared library associated with this object. + */ + char[] path() { + return this.path_; + } + + + /** + Obtains the address of a symbol within the shared library + + Params: + name = The name of the symbol; must be a null-terminated C string + + Returns: + A pointer to the symbol or null if it's not present in the library + and SharedLib.throwExceptions is set to false. Otherwise, throws SharedLibException + */ + void* getSymbol(char* name) { + assert (loaded); + return getSymbol_(name); + } + + + + /** + Returns the total number of libraries currently loaded by SharedLib + */ + static uint numLoadedLibs() { + return loadedLibs.keys.length; + } + + + private { + version (Windows) { + HMODULE handle; + + void load_(LoadMode mode) { + handle = LoadLibraryA((this.path_ ~ \0).ptr); + if (handle is null && SharedLib.throwExceptions) { + throw new SharedLibException("Couldn't load shared library '" ~ this.path_ ~ "' : " ~ SysError.lastMsg); + } + } + + void* getSymbol_(char* name) { + auto res = GetProcAddress(handle, name); + if (res is null && SharedLib.throwExceptions) { + throw new SharedLibException("Couldn't load symbol '" ~ fromUtf8z(name) ~ "' from shared library '" ~ this.path_ ~ "' : " ~ SysError.lastMsg); + } else { + return res; + } + } + + void unload_() { + if (0 == FreeLibrary(handle) && SharedLib.throwExceptions) { + throw new SharedLibException("Couldn't unload shared library '" ~ this.path_ ~ "' : " ~ SysError.lastMsg); + } + } + } + else version (Posix) { + void* handle; + + void load_(LoadMode mode) { + int mode_; + if (mode & LoadMode.Now) mode_ |= RTLD_NOW; + if (mode & LoadMode.Lazy) mode_ |= RTLD_LAZY; + if (mode & LoadMode.Global) mode_ |= RTLD_GLOBAL; + if (mode & LoadMode.Local) mode_ |= RTLD_LOCAL; + + handle = dlopen((this.path_ ~ \0).ptr, mode_); + if (handle is null && SharedLib.throwExceptions) { + throw new SharedLibException("Couldn't load shared library: " ~ fromUtf8z(dlerror())); + } + } + + void* getSymbol_(char* name) { + auto res = dlsym(handle, name); + if (res is null && SharedLib.throwExceptions) { + throw new SharedLibException("Couldn't load symbol: " ~ fromUtf8z(dlerror())); + } else { + return res; + } + } + + void unload_() { + if (0 != dlclose(handle) && SharedLib.throwExceptions) { + throw new SharedLibException("Couldn't unload shared library: " ~ fromUtf8z(dlerror())); + } + } + } + else { + static assert (false, "No support for this platform"); + } + + + char[] path_; + int refCnt = 0; + + + bool loaded() { + return handle !is null; + } + + + this(char[] path) { + this.path_ = path.dup; + } + } + + + private static { + SharedLib[char[]] loadedLibs; + Object mutex; + } + + + static this() { + mutex = new Object; + } + + + /// Set this to false if you don't want SharedLib to throw exceptions in symbol(), load() and unload() + static bool throwExceptions = true; +} + + +class SharedLibException : TracedException { + this (char[] msg) { + super(msg); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/sys/darwin/darwin.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/sys/darwin/darwin.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,12 @@ +module tango.sys.darwin.darwin; + +public import tango.stdc.time; +public import tango.stdc.posix.dlfcn; +public import tango.stdc.posix.fcntl; +public import tango.stdc.posix.poll; +public import tango.stdc.posix.pwd; +public import tango.stdc.posix.time; +public import tango.stdc.posix.unistd; +public import tango.stdc.posix.sys.select; +public import tango.stdc.posix.sys.stat; +public import tango.stdc.posix.sys.types; diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/sys/linux/epoll.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/sys/linux/epoll.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,68 @@ +module tango.sys.linux.epoll; + +version (linux) +{ + // From : support for the Linux epoll_*() system calls + extern (C) + { + enum: uint + { + EPOLLIN = 0x001, + EPOLLPRI = 0x002, + EPOLLOUT = 0x004, + EPOLLRDNORM = 0x040, + EPOLLRDBAND = 0x080, + EPOLLWRNORM = 0x100, + EPOLLWRBAND = 0x200, + EPOLLMSG = 0x400, + EPOLLERR = 0x008, + EPOLLHUP = 0x010, + EPOLLONESHOT = (1 << 30), + EPOLLET = (1 << 31) + } + + // Valid opcodes ( "op" parameter ) to issue to epoll_ctl(). + public const int EPOLL_CTL_ADD = 1; // Add a file descriptor to the interface. + public const int EPOLL_CTL_DEL = 2; // Remove a file descriptor from the interface. + public const int EPOLL_CTL_MOD = 3; // Change file descriptor epoll_event structure. + + align(1) union epoll_data + { + void* ptr; + int fd; + uint u32; + ulong u64; + } + + alias epoll_data epoll_data_t; + + align(1) struct epoll_event + { + uint events; // Epoll events + epoll_data_t data; // User data variable + } + + // Creates an epoll instance. Returns an fd for the new instance. + // The "size" parameter is a hint specifying the number of file + // descriptors to be associated with the new instance. The fd + // returned by epoll_create() should be closed with close(). + int epoll_create(int size); + + // Manipulate an epoll instance "epfd". Returns 0 in case of success, + // -1 in case of error (the "errno" variable will contain the + // specific error code) The "op" parameter is one of the EPOLL_CTL_* + // constants defined above. The "fd" parameter is the target of the + // operation. The "event" parameter describes which events the caller + // is interested in and any associated user data. + int epoll_ctl(int epfd, int op, int fd, epoll_event* event); + + // Wait for events on an epoll instance "epfd". Returns the number of + // triggered events returned in "events" buffer. Or -1 in case of + // error with the "errno" variable set to the specific error code. The + // "events" parameter is a buffer that will contain triggered + // events. The "maxevents" is the maximum number of events to be + // returned (usually size of "events"). The "timeout" parameter + // specifies the maximum wait time in milliseconds (-1 == infinite). + int epoll_wait(int epfd, epoll_event* events, int maxevents, int timeout); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/sys/linux/linux.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/sys/linux/linux.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,14 @@ +module tango.sys.linux.linux; + + +public import tango.stdc.time; +public import tango.stdc.posix.dlfcn; +public import tango.stdc.posix.fcntl; +public import tango.stdc.posix.poll; +public import tango.stdc.posix.pwd; +public import tango.stdc.posix.time; +public import tango.stdc.posix.unistd; +public import tango.stdc.posix.sys.select; +public import tango.stdc.posix.sys.stat; +public import tango.stdc.posix.sys.types; +public import tango.sys.linux.epoll; diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/sys/linux/socket.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/sys/linux/socket.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,377 @@ +module tango.sys.linux.socket; + +private import tango.stdc.stdint; +public import tango.stdc.posix.fcntl; +public import tango.stdc.posix.unistd; // for gethostname + +extern(C): + +alias int socklen_t; + +int socket(int af, int type, int protocol); +int bind(int s, sockaddr* name, int namelen); +int connect(int s, sockaddr* name, int namelen); +int listen(int s, int backlog); +int accept(int s, sockaddr* addr, int* addrlen); +int shutdown(int s, int how); +int getpeername(int s, sockaddr* name, int* namelen); +int getsockname(int s, sockaddr* name, int* namelen); +int send(int s, void* buf, int len, int flags); +int sendto(int s, void* buf, int len, int flags, sockaddr* to, int tolen); +int recv(int s, void* buf, int len, int flags); +int recvfrom(int s, void* buf, int len, int flags, sockaddr* from, int* fromlen); +int getsockopt(int s, int level, int optname, void* optval, int* optlen); +int setsockopt(int s, int level, int optname, void* optval, int optlen); +uint inet_addr(char* cp); +char* inet_ntoa(in_addr ina); +hostent* gethostbyname(char* name); +hostent* gethostbyaddr(void* addr, int len, int type); +protoent* getprotobyname(char* name); +protoent* getprotobynumber(int number); +servent* getservbyname(char* name, char* proto); +servent* getservbyport(int port, char* proto); +int getaddrinfo(char* nodename, char* servname, addrinfo* hints, addrinfo** res); +void freeaddrinfo(addrinfo* ai); +int getnameinfo(sockaddr* sa, socklen_t salen, char* node, socklen_t nodelen, char* service, socklen_t servicelen, int flags); + + +enum: int +{ + AF_UNSPEC = 0, + AF_UNIX = 1, + AF_INET = 2, + AF_IPX = 4, + AF_APPLETALK = 5, + AF_INET6 = 10, + // ... + + PF_UNSPEC = AF_UNSPEC, + PF_UNIX = AF_UNIX, + PF_INET = AF_INET, + PF_IPX = AF_IPX, + PF_APPLETALK = AF_APPLETALK, + PF_INET6 = AF_INET6, +} + + +version( X86 ) +{ + enum: int + { + SOL_SOCKET = 1, + } +} +else version( X86_64 ) +{ + enum: int + { + SOL_SOCKET = 1, + } +}else +{ + // Different values on other platforms. + static assert(0); +} + + +enum: int +{ + SO_DEBUG = 1, + SO_BROADCAST = 6, + SO_REUSEADDR = 2, + SO_LINGER = 13, + SO_DONTLINGER = ~SO_LINGER, + SO_OOBINLINE = 10, + SO_SNDBUF = 7, + SO_RCVBUF = 8, + SO_ACCEPTCONN = 30, + SO_DONTROUTE = 5, + SO_TYPE = 3, + + TCP_NODELAY = 1, + + IP_MULTICAST_LOOP = 34, + IP_ADD_MEMBERSHIP = 35, + IP_DROP_MEMBERSHIP = 36, + + // ... + + IPV6_ADDRFORM = 1, + IPV6_PKTINFO = 2, + IPV6_HOPOPTS = 3, + IPV6_DSTOPTS = 4, + IPV6_RTHDR = 5, + IPV6_PKTOPTIONS = 6, + IPV6_CHECKSUM = 7, + IPV6_HOPLIMIT = 8, + IPV6_NEXTHOP = 9, + IPV6_AUTHHDR = 10, + IPV6_UNICAST_HOPS = 16, + IPV6_MULTICAST_IF = 17, + IPV6_MULTICAST_HOPS = 18, + IPV6_MULTICAST_LOOP = 19, + IPV6_JOIN_GROUP = 20, + IPV6_LEAVE_GROUP = 21, + IPV6_ROUTER_ALERT = 22, + IPV6_MTU_DISCOVER = 23, + IPV6_MTU = 24, + IPV6_RECVERR = 25, + IPV6_V6ONLY = 26, + IPV6_JOIN_ANYCAST = 27, + IPV6_LEAVE_ANYCAST = 28, + IPV6_IPSEC_POLICY = 34, + IPV6_XFRM_POLICY = 35, +} + + +struct linger +{ + int32_t l_onoff; + int32_t l_linger; +} + + +struct protoent +{ + char* p_name; + char** p_aliases; + int32_t p_proto; +} + + +struct servent +{ + char* s_name; + char** s_aliases; + int32_t s_port; + char* s_proto; +} + + +version( BigEndian ) +{ + uint16_t htons(uint16_t x) + { + return x; + } + + + uint32_t htonl(uint32_t x) + { + return x; + } +} +else version( LittleEndian ) +{ + private import tango.core.BitManip; + + + uint16_t htons(uint16_t x) + { + return cast(uint16_t) ((x >> 8) | (x << 8)); + } + + + uint32_t htonl(uint32_t x) + { + return bswap(x); + } +} +else +{ + static assert(0); +} + + +uint16_t ntohs(uint16_t x) +{ + return htons(x); +} + + +uint32_t ntohl(uint32_t x) +{ + return htonl(x); +} + + +enum: int +{ + SOCK_STREAM = 1, + SOCK_DGRAM = 2, + SOCK_RAW = 3, + SOCK_RDM = 4, + SOCK_SEQPACKET = 5, +} + + +enum: int +{ + IPPROTO_IP = 0, + IPPROTO_ICMP = 1, + IPPROTO_IGMP = 2, + IPPROTO_GGP = 3, + IPPROTO_TCP = 6, + IPPROTO_PUP = 12, + IPPROTO_UDP = 17, + IPPROTO_IDP = 22, + IPPROTO_IPV6 = 41, + IPPROTO_ND = 77, + IPPROTO_RAW = 255, + + IPPROTO_MAX = 256, +} + + +enum: int +{ + MSG_OOB = 0x1, + MSG_PEEK = 0x2, + MSG_DONTROUTE = 0x4, +} + + +enum: int +{ + SD_RECEIVE = 0, + SD_SEND = 1, + SD_BOTH = 2, +} + + +enum: uint +{ + INADDR_ANY = 0, + INADDR_LOOPBACK = 0x7F000001, + INADDR_BROADCAST = 0xFFFFFFFF, + INADDR_NONE = 0xFFFFFFFF, + ADDR_ANY = INADDR_ANY, +} + + +enum: int +{ + AI_PASSIVE = 0x1, + AI_CANONNAME = 0x2, + AI_NUMERICHOST = 0x4, +} + + +union in_addr +{ + private union _S_un_t + { + private struct _S_un_b_t + { + uint8_t s_b1, s_b2, s_b3, s_b4; + } + _S_un_b_t S_un_b; + + private struct _S_un_w_t + { + uint16_t s_w1, s_w2; + } + _S_un_w_t S_un_w; + + uint32_t S_addr; + } + _S_un_t S_un; + + uint32_t s_addr; + + struct + { + uint8_t s_net, s_host; + + union + { + uint16_t s_imp; + + struct + { + uint8_t s_lh, s_impno; + } + } + } +} + + +union in6_addr +{ + private union _in6_u_t + { + uint8_t[16] u6_addr8; + uint16_t[8] u6_addr16; + uint32_t[4] u6_addr32; + } + _in6_u_t in6_u; + + uint8_t[16] s6_addr8; + uint16_t[8] s6_addr16; + uint32_t[4] s6_addr32; +} + + +const in6_addr IN6ADDR_ANY = { s6_addr8: [0] }; +const in6_addr IN6ADDR_LOOPBACK = { s6_addr8: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1] }; +//alias IN6ADDR_ANY IN6ADDR_ANY_INIT; +//alias IN6ADDR_LOOPBACK IN6ADDR_LOOPBACK_INIT; + +const uint INET_ADDRSTRLEN = 16; +const uint INET6_ADDRSTRLEN = 46; + + +struct sockaddr +{ + int16_t sa_family; + ubyte[14] sa_data; +} + + +struct sockaddr_in +{ + int16_t sin_family = AF_INET; + uint16_t sin_port; + in_addr sin_addr; + ubyte[8] sin_zero; +} + + +struct sockaddr_in6 +{ + int16_t sin6_family = AF_INET6; + uint16_t sin6_port; + uint32_t sin6_flowinfo; + in6_addr sin6_addr; + uint32_t sin6_scope_id; +} + + +struct addrinfo +{ + int32_t ai_flags; + int32_t ai_family; + int32_t ai_socktype; + int32_t ai_protocol; + size_t ai_addrlen; + sockaddr* ai_addr; + char* ai_canonname; + addrinfo* ai_next; +} + + +struct hostent +{ + char* h_name; + char** h_aliases; + int32_t h_addrtype; + int32_t h_length; + char** h_addr_list; + + + char* h_addr() + { + return h_addr_list[0]; + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/sys/win32/CodePage.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/sys/win32/CodePage.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,150 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: April 2007 + + author: Kris + +*******************************************************************************/ + +module tango.sys.win32.CodePage; + +private import tango.sys.Common; + +private import tango.core.Exception; + +/******************************************************************************* + + Convert text to and from Windows 'code pages'. This is non-portable, + and will be unlikely to operate even across all Windows platforms. + +*******************************************************************************/ + +struct CodePage +{ + /********************************************************************** + + Test a text array to see if it contains non-ascii elements. + Returns true if ascii, false otherwise + + **********************************************************************/ + + static bool isAscii (char[] src) + { + foreach (c; src) + if (c & 0x80) + return false; + return true; + } + + + /********************************************************************** + + Convert utf8 text to a codepage representation + + page 0 - the ansi code page + 1 - the oem code page + 2 - the mac code page + 3 - ansi code page for the calling thread + 65000 - UTF-7 translation + 65001 - UTF-8 translation + + or a region-specific codepage + + returns: a slice of the provided output buffer + representing converted text + + Note that the input must be utf8 encoded. Note also + that the dst output should be sufficiently large to + accomodate the output; a size of 2*src.length would + be enough to host almost any conversion + + **********************************************************************/ + + static char[] into (char[] src, char[] dst, uint page=0) + { + return convert (src, dst, CP_UTF8, page); + } + + + /********************************************************************** + + Convert codepage text to a utf8 representation + + page 0 - the ansi code page + 1 - the oem code page + 2 - the mac code page + 3 - ansi code page for the calling thread + 65000 - UTF-7 translation + 65001 - UTF-8 translation + + or a region-specific codepage + + returns: a slice of the provided output buffer + representing converted text + + Note that the input will be utf8 encoded. Note also + that the dst output should be sufficiently large to + accomodate the output; a size of 2*src.length would + be enough to host almost any conversion + + **********************************************************************/ + + static char[] from (char[] src, char[] dst, uint page=0) + { + return convert (src, dst, page, CP_UTF8); + } + + + /********************************************************************** + + Internal conversion routine; we avoid heap activity for + strings of short and medium length. A zero is appended + to the dst array in order to simplify C API conversions + + **********************************************************************/ + + private static char[] convert (char[] src, char[] dst, uint from, uint into) + { + uint len = 0; + + // sanity check + assert (dst.length); + + // got some input? + if (src.length > 0) + { + wchar[2000] tmp = void; + wchar[] wide = (src.length <= tmp.length) ? tmp : new wchar[src.length]; + + len = MultiByteToWideChar (from, 0, src.ptr, src.length, + wide.ptr, wide.length); + if (len) + len = WideCharToMultiByte (into, 0, wide.ptr, len, + dst.ptr, dst.length-1, null, null); + if (len is 0) + throw new IllegalArgumentException ("CodePage.convert :: "~SysError.lastMsg); + } + + // append a null terminator + dst[len] = 0; + return dst [0 .. len]; + } +} + + +debug(Test) +{ + void main () + { + char[] s = "foo"; + char[3] x = void; + + //if (! CodePage.isAscii (s)) + s = CodePage.into (s, x); + s = CodePage.from (s, x); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/sys/win32/Macros.di --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/sys/win32/Macros.di Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,210 @@ +module tango.sys.win32.Macros; + +/* + Module: Windows Utilities + Author: Trevor Parscal +*/ + +/+ Imports +/ +public +{ + import tango.sys.win32.Types; +} +private +{ + import tango.stdc.string; + import tango.sys.win32.UserGdi; +} + + +/+ Functions +/ +ushort MAKEWORD(ubyte A, ubyte B) +{ + return cast(ushort)(A | (B << 8)); +} +uint MAKELONG(ushort A, ushort B) +{ + return cast(uint)(A | (B << 16)); +} +ushort HIWORD(uint L) +{ + return cast(ushort)(L >> 16); +} +ushort LOWORD(uint L) +{ + return cast(ushort)(L & 0xFFFF); +} +ubyte HIBYTE(ushort W) +{ + return cast(ubyte)(W >> 8); +} +ubyte LOBYTE(ushort W) +{ + return cast(ubyte)(W & 0xFF); +} +HANDLE GlobalDiscard(HANDLE h) +{ + return GlobalReAlloc(h, 0, GMEM_MOVEABLE); +} +HANDLE LocalDiscard(HANDLE h) +{ + return LocalReAlloc(h, 0, LMEM_MOVEABLE); +} +BOOL SUCCEEDED(HRESULT Status) +{ + return (cast(int)Status & 0x80000000) == 0; +} +BOOL FAILED(HRESULT Status) +{ + return (cast(int)Status & 0x80000000) != 0; +} +BOOL IS_ERROR(HRESULT Status) +{ + return (cast(int)Status >> 31) == SEVERITY_ERROR; +} +int HRESULT_CODE(HRESULT hr) +{ + return cast(int)hr & 0xFFFF; +} +int HRESULT_FACILITY(HRESULT hr) +{ + return (cast(int)hr >> 16) & 0x1FFF; +} +int HRESULT_SEVERITY(HRESULT hr) +{ + return (cast(int)hr >> 31) & 0x1; +} +HRESULT MAKE_HRESULT(int sev, int fac, int code) +{ + return cast(HRESULT)((sev << 31) | (fac << 16) | code); +} +HRESULT HRESULT_FROM_WIN32(int x) +{ + return cast(HRESULT) (x ? (x & 0xFFFF) | (FACILITY_WIN32 << 16) | 0x80000000 : 0); +} +//HRESULT HRESULT_FROM_NT(int x) +//{ +// return x | FACILITY_NT_BIT; +//} +DWORD MAKEROP4(DWORD fore, DWORD back) +{ + return ((back << 8) & 0xFF000000) | fore; +} +ubyte GetKValue(COLORREF cmyk) +{ + return cast(ubyte)(cmyk & 0xFF); +} +ubyte GetYValue(COLORREF cmyk) +{ + return cast(ubyte)((cmyk >> 8) & 0xFF); +} +ubyte GetMValue(COLORREF cmyk) +{ + return cast(ubyte)((cmyk >> 16) & 0xFF); +} +ubyte GetCValue(COLORREF cmyk) +{ + return cast(ubyte)((cmyk >> 24) & 0xFF); +} +COLORREF CMYK(ubyte c, ubyte m, ubyte y, ubyte k) +{ + return k | (y << 8) | (m << 16) | (c << 24); +} +COLORREF RGB(ubyte r, ubyte g, ubyte b) +{ + return r | (g << 8) | (b << 16); +} +COLORREF PALETTERGB(ubyte r, ubyte g, ubyte b) +{ + return 0x02000000 | RGB(r, g, b); +} +COLORREF PALETTEINDEX(ushort i) +{ + return 0x01000000 | i; +} +ubyte GetRValue(COLORREF rgb) +{ + return cast(ubyte)(rgb & 0xFF); +} +ubyte GetGValue(COLORREF rgb) +{ + return cast(ubyte)((rgb >> 8) & 0xFF); +} +ubyte GetBValue(COLORREF rgb) +{ + return cast(ubyte)((rgb >> 16) & 0xFF); +} +WPARAM MAKEWPARAM(ushort l, ushort h) +{ + return MAKELONG(l, h); +} +LPARAM MAKELPARAM(ushort l, ushort h) +{ + return MAKELONG(l, h); +} +LRESULT MAKELRESULT(ushort l, ushort h) +{ + return MAKELONG(l, h); +} +BOOL ExitWindows(DWORD dwReserved, UINT uReserved) +{ + return ExitWindowsEx(EWX_LOGOFF, 0); +} +HWND CreateWindowA(PCHAR b, PCHAR c, DWORD d, int e, + int f, int g, int h, HWND i, HMENU j, HINST k, POINTER l) +{ + return CreateWindowExA(0, b, c, d, e, f, g, h, i, j, k, l); +} +HWND CreateWindowW(PWIDECHAR b, PWIDECHAR c, DWORD d, int e, + int f, int g, int h, HWND i, HMENU j, HINST k, POINTER l) +{ + return CreateWindowExW(0, b, c, d, e, f, g, h, i, j, k, l); +} +HWND CreateDialogA(HINST a, PANSICHAR b, HWND c, DLGPROC d) +{ + return CreateDialogParamA(a, b, c, d, 0); +} +HWND CreateDialogW(HINST a, PWIDECHAR b, HWND c, DLGPROC d) +{ + return CreateDialogParamW(a, b, c, d, 0); +} +HWND CreateDialogIndirectA(HINST a, DLGTEMPLATE* b, HWND c, DLGPROC d) +{ + return CreateDialogIndirectParamA(a, b, c, d, 0); +} +HWND CreateDialogIndirectW(HINST a, DLGTEMPLATE* b, HWND c, DLGPROC d) +{ + return CreateDialogIndirectParamW(a, b, c, d, 0); +} +int DialogBoxA(HINST a, PANSICHAR b, HWND c, DLGPROC d) +{ + return DialogBoxParamA(a, b, c, d, 0); +} +int DialogBoxW(HINST a, PWIDECHAR b, HWND c, DLGPROC d) +{ + return DialogBoxParamW(a, b, c, d, 0); +} +int DialogBoxIndirectA(HINST a, DLGTEMPLATE* b, HWND c, DLGPROC d) +{ + return DialogBoxIndirectParamA(a, b, c, d, 0); +} +int DialogBoxIndirectW(HINST a, DLGTEMPLATE* b, HWND c, DLGPROC d) +{ + return DialogBoxIndirectParamW(a, b, c, d, 0); +} +void ZeroMemory(void* dest, uint len) +{ + memset(dest, 0, len); +} +void FillMemory(void* dest, uint len, ubyte c) +{ + memset(dest, c, len); +} +void MoveMemory(void* dest, void* src, uint len) +{ + memmove(dest, src, len); +} +void CopyMemory(void* dest, void* src, uint len) +{ + memcpy(dest, src, len); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/sys/win32/Process.di --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/sys/win32/Process.di Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,91 @@ +/* + * Written by Sean Kelly + * Placed into Public Domain + */ + +module tango.sys.win32.Process; + + +private +{ + import tango.stdc.stdint; + import tango.stdc.stddef; +} + +extern (C): + +enum +{ + P_WAIT, + P_NOWAIT, + P_OVERLAY, + P_NOWAITO, + P_DETACH, +} + +enum +{ + WAIT_CHILD, + WAIT_GRANDCHILD, +} + +private +{ + extern (C) alias void function(void*) bt_fptr; + extern (Windows) alias uint function(void*) btex_fptr; +} + +uintptr_t _beginthread(bt_fptr, uint, void*); +void _endthread(); +uintptr_t _beginthreadex(void*, uint, btex_fptr, void*, uint, uint *); +void _endthreadex(uint); + +void abort(); +void exit(int); +void _exit(int); +void _cexit(); +void _c_exit(); + +intptr_t cwait(int*, intptr_t, int); +intptr_t wait(int*); + +int getpid(); +int system(char*); + +intptr_t spawnl(int, char*, char*, ...); +intptr_t spawnle(int, char*, char*, ...); +intptr_t spawnlp(int, char*, char*, ...); +intptr_t spawnlpe(int, char*, char*, ...); +intptr_t spawnv(int, char*, char**); +intptr_t spawnve(int, char*, char**, char**); +intptr_t spawnvp(int, char*, char**); +intptr_t spawnvpe(int, char*, char**, char**); + +intptr_t execl(char*, char*, ...); +intptr_t execle(char*, char*, ...); +intptr_t execlp(char*, char*, ...); +intptr_t execlpe(char*, char*, ...); +intptr_t execv(char*, char**); +intptr_t execve(char*, char**, char**); +intptr_t execvp(char*, char**); +intptr_t execvpe(char*, char**, char**); + +int _wsystem(wchar_t*); + +intptr_t _wspawnl(int, wchar_t*, wchar_t*, ...); +intptr_t _wspawnle(int, wchar_t*, wchar_t*, ...); +intptr_t _wspawnlp(int, wchar_t*, wchar_t*, ...); +intptr_t _wspawnlpe(int, wchar_t*, wchar_t*, ...); +intptr_t _wspawnv(int, wchar_t*, wchar_t**); +intptr_t _wspawnve(int, wchar_t*, wchar_t**, wchar_t**); +intptr_t _wspawnvp(int, wchar_t*, wchar_t**); +intptr_t _wspawnvpe(int, wchar_t*, wchar_t**, wchar_t**); + +intptr_t _wexecl(wchar_t*, wchar_t*, ...); +intptr_t _wexecle(wchar_t*, wchar_t*, ...); +intptr_t _wexeclp(wchar_t*, wchar_t*, ...); +intptr_t _wexeclpe(wchar_t*, wchar_t*, ...); +intptr_t _wexecv(wchar_t*, wchar_t**); +intptr_t _wexecve(wchar_t*, wchar_t**, wchar_t**); +intptr_t _wexecvp(wchar_t*, wchar_t**); +intptr_t _wexecvpe(wchar_t*, wchar_t**, wchar_t**); diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/sys/win32/Types.di --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/sys/win32/Types.di Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,13437 @@ +module tango.sys.win32.Types; + +/* + Module: Windows Types + Author: Trevor Parscal +*/ + +/+ Aliases, Types, and Constants +/ +const int NULL = 0; +alias int SCODE; +alias void VOID; +alias void* POINTER; +alias ushort ATOM; +alias int WINBOOL; +alias WINBOOL BOOL; +alias uint CALTYPE; +alias uint CALID; +alias char CCHAR; +alias char* PCHAR; +alias uint COLORREF; +alias uint TCOLORREF; +alias ubyte BYTE; +alias short INT16; +alias ushort UINT16; +alias short SHORT; +alias int INT; +alias int WINT; +alias int LONG; +alias ushort WORD; +alias uint DWORD; +alias int INT_PTR; +alias uint UINT_PTR; +alias int LONG_PTR; +alias uint ULONG_PTR; +alias uint PROPID; +const BOOL FALSE = 0; +const BOOL TRUE = -1; +alias char* PANSICHAR; +alias wchar* PWIDECHAR; +alias int* PINTEGER; +alias double LONGLONG; +alias LONGLONG* PLONGLONG; +alias double DWORDLONG; +alias DWORDLONG* PDWORDLONG; +alias double FLOAT; +alias void* HANDLE; +alias HANDLE HACCEL; +alias HANDLE HBITMAP; +alias HANDLE HBRUSH; +alias HANDLE HCOLORSPACE; +alias HANDLE HCONV; +alias HANDLE HCONVLIST; +alias HANDLE HCURSOR; +alias HANDLE HDBC; +alias HANDLE HDC; +alias HANDLE HDDEDATA; +alias HANDLE HDESK; +alias HANDLE HDROP; +alias HANDLE HDWP; +alias HANDLE HENHMETAFILE; +alias HANDLE HENV; +alias HANDLE HFILE; +alias HANDLE HFONT; +alias HANDLE HGDIOBJ; +alias HANDLE HGLOBAL; +alias HANDLE HGLRC; +alias HANDLE HHOOK; +alias HANDLE HICON; +alias HANDLE HIMAGELIST; +alias HANDLE HINST; +alias HINST HINSTANCE; +alias HANDLE HKEY; +alias HANDLE HKL; +alias HANDLE HLOCAL; +alias HANDLE HMENU; +alias HANDLE HMETAFILE; +alias HANDLE HMODULE; +alias HANDLE HPALETTE; +alias HANDLE HPEN; +alias HANDLE HRASCONN; +alias int HRESULT; +alias HANDLE HRGN; +alias HANDLE HRSRC; +alias HANDLE HSTMT; +alias HANDLE HSZ; +alias HANDLE HWINSTA; +alias HANDLE HWND; +alias ushort LANGID; +alias DWORD LCID; +alias DWORD LCTYPE; +alias int LPARAM; +alias ushort* LP; +alias WINBOOL* LPBOOL; +alias ubyte* LPBYTE; +alias PCHAR LPCCH; +alias PCHAR LPCH; +alias COLORREF* LPCOLORREF; +alias PCHAR LPCSTR; +alias PCHAR LPCTSTR; +alias wchar* LPCWCH; +alias wchar* LPCWSTR; +alias DWORD* LPDWORD; +alias HANDLE* LPHANDLE; +alias int* LPINT; +alias int* LPLONG; +alias PCHAR LPSTR; +alias PCHAR LPTCH; +alias PCHAR LPTSTR; +alias int LRESULT; +alias POINTER LPVOID; +alias POINTER LPCVOID; +alias wchar* LPWCH; +alias wchar* LPWORD; +alias wchar* LPWSTR; +alias wchar* NWPSTR; +alias WINBOOL* PWINBOOL; +alias ubyte* PBOOLEAN; +alias ubyte* PBYTE; +alias PCHAR PCCH; +alias PCHAR PCH; +alias PCHAR PCSTR; +alias wchar* PCWCH; +alias wchar* PCWSTR; +alias DWORD* PDWORD; +alias double* PFLOAT; +alias HANDLE* PHANDLE; +alias HKEY* PHKEY; +alias int* PINT; +alias int* PLONG; +alias int* PSHORT; +alias PCHAR PSTR; +alias PCHAR PSZ; +alias ubyte* PTBYTE; +alias PCHAR PTCH; +alias PCHAR PTCHAR; +alias PCHAR PTSTR; +alias ubyte* PUCHAR; +alias wchar* PWCH; +alias wchar* PWCHAR; +alias ushort* PWORD; +alias uint* PUINT; +alias uint* PULONG; +alias ushort* PUSHORT; +alias POINTER PVOID; +// NOTE: This is defined in sqltypes. Probably shouldn't be here. Commenting for now. +//alias int RETCODE; +alias HANDLE SC_HANDLE; +alias LPVOID SC_LOCK; +alias SC_HANDLE* LPSC_HANDLE; +alias DWORD SERVICE_STATUS_HANDLE; +alias ubyte TBYTE; +alias char TCHAR; +alias ubyte BCHAR; +alias ubyte UCHAR; +alias wchar WCHAR; +alias uint UINT; +alias uint ULONG; +alias ushort USHORT; +alias uint WPARAM; +alias int ACL_INFORMATION_CLASS; + +struct GUID { // size is 16 +align(1): + DWORD Data1; + WORD Data2; + WORD Data3; + BYTE[8] Data4; +} + +enum { AclRevisionInformation = 1, AclSizeInformation, }; +alias ACL_INFORMATION_CLASS _ACL_INFORMATION_CLASS; +alias int MEDIA_TYPE; +enum { Unknown, F5_1Pt2_512, F3_1Pt44_512, F3_2Pt88_512, F3_20Pt8_512, F3_720_512, F5_360_512, F5_320_512, F5_320_1024, F5_180_512, F5_160_512, RemovableMedia, FixedMedia, }; +alias MEDIA_TYPE _MEDIA_TYPE; +const int RASCS_DONE = (0x2000); +const int RASCS_PAUSED = (0x1000); +alias int RASCONNSTATE; +enum { RASCS_OpenPort = 0, RASCS_PortOpened, RASCS_ConnectDevice, RASCS_DeviceConnected, RASCS_AllDevicesConnected, RASCS_Authenticate, RASCS_AuthNotify, RASCS_AuthRetry, RASCS_AuthCallback, RASCS_AuthChangePassword, RASCS_AuthProject, RASCS_AuthLinkSpeed, RASCS_AuthAck, RASCS_ReAuthenticate, RASCS_Authenticated, RASCS_PrepareForCallback, RASCS_WaitForModemReset, RASCS_WaitForCallback, RASCS_Projected, RASCS_StartAuthentication, RASCS_CallbackComplete, RASCS_LogonNetwork, RASCS_Interactive = RASCS_PAUSED, RASCS_RetryAuthentication, RASCS_CallbackSetByCaller, RASCS_PasswordExpired, RASCS_Connected = RASCS_DONE, RASCS_Disconnected, }; +alias RASCONNSTATE _RASCONNSTATE; +alias int RASPROJECTION; +enum { RASP_Amb = 0x10000, RASP_PppNbf = 0x803F, RASP_PppIpx = 0x802B, RASP_PppIp = 0x8021, }; +alias RASPROJECTION _RASPROJECTION; +alias int SECURITY_IMPERSONATION_LEVEL; +enum { SecurityAnonymous, SecurityIdentification, SecurityImpersonation, SecurityDelegation, }; +alias SECURITY_IMPERSONATION_LEVEL _SECURITY_IMPERSONATION_LEVEL; +alias int SID_NAME_USE; +enum { SidTypeUser = 1, SidTypeGroup, SidTypeDomain, SidTypeAlias, SidTypeWellKnownGroup, SidTypeDeletedAccount, SidTypeInvalid, SidTypeUnknown, }; +alias SID_NAME_USE* PSID_NAME_USE; +alias SID_NAME_USE _SID_NAME_USE; +alias int TOKEN_INFORMATION_CLASS; +enum { TokenUser = 1, TokenGroups, TokenPrivileges, TokenOwner, TokenPrimaryGroup, TokenDefaultDacl, TokenSource, TokenType, TokenImpersonationLevel, TokenStatistics, }; +alias TOKEN_INFORMATION_CLASS _TOKEN_INFORMATION_CLASS; +alias int TOKEN_TYPE; +enum { TokenPrimary = 1, TokenImpersonation, }; +alias TOKEN_TYPE TAGTOKEN_TYPE; + +extern(Windows){ +alias int (*BFFCALLBACK)(HWND, UINT, LPARAM, LPARAM); +alias UINT (*LPCCHOOKPROC)(HWND, UINT, WPARAM, LPARAM); +alias UINT (*LPCFHOOKPROC)(HWND, UINT, WPARAM, LPARAM); +alias POINTER PTHREAD_START_ROUTINE; +alias PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE; +alias DWORD (*EDITSTREAMCALLBACK)(DWORD, LPBYTE, LONG, LONG); +alias UINT (*LPFRHOOKPROC)(HWND, UINT, WPARAM, LPARAM); +alias UINT (*LPOFNHOOKPROC)(HWND, UINT, WPARAM, LPARAM); +alias UINT (*LPPRINTHOOKPROC)(HWND, UINT, WPARAM, LPARAM); +alias UINT (*LPSETUPHOOKPROC)(HWND, UINT, WPARAM, LPARAM); +alias LRESULT (*DLGPROC)(HWND, UINT, WPARAM, LPARAM); +alias int (*PFNPROPSHEETCALLBACK)(HWND, UINT, LPARAM); +alias void (*LPSERVICE_MAIN_FUNCTION)(DWORD); +alias int (*PFNTVCOMPARE)(LPARAM, LPARAM, LPARAM); +alias LRESULT (*WNDPROC)(HWND, UINT, WPARAM, LPARAM); +alias POINTER FARPROC; +alias FARPROC PROC; +alias WINBOOL (*ENUMRESTYPEPROC)(HANDLE, LPTSTR, LONG); +alias WINBOOL (*ENUMRESNAMEPROC)(HANDLE, LPCTSTR, LPTSTR, LONG); +alias WINBOOL (*ENUMRESLANGPROC)(HANDLE, LPCTSTR, LPCTSTR, ushort, LONG); +alias FARPROC DESKTOPENUMPROC; +alias WINBOOL (*ENUMWINDOWSPROC)(HWND, LPARAM); +alias WINBOOL (*ENUMWINDOWSTATIONPROC)(LPTSTR, LPARAM); +alias void (*SENDASYNCPROC)(HWND, UINT, DWORD); +alias void (*TIMERPROC)(HWND, UINT, UINT); +alias BOOL(*MONITORENUMPROC)(HMONITOR, HDC, RECT*, LPARAM); +alias FARPROC GRAYSTRINGPROC; +alias WINBOOL (*DRAWSTATEPROC)(HDC, LPARAM, WPARAM, int, int); +alias WINBOOL (*PROPENUMPROCEX)(HWND, LPCTSTR, HANDLE, DWORD); +alias WINBOOL (*PROPENUMPROC)(HWND, LPCTSTR, HANDLE); +alias LRESULT (*HOOKPROC)(int, WPARAM, LPARAM); +alias void (*ENUMOBJECTSPROC)(LPVOID); +alias void (*LINEDDAPROC)(int, int); +alias WINBOOL (*TABORTPROC)(HDC, int); +alias UINT (*LPPAGEPAINTHOOK)(HWND, UINT, WPARAM, LPARAM); +alias UINT (*LPPAGESETUPHOOK)(HWND, UINT, WPARAM, LPARAM); +alias int (*ICMENUMPROC)(LPTSTR, LPARAM); +alias LONG (*EDITWORDBREAKPROCEX)(PCHAR, LONG, ubyte, INT); +alias int (*PFNLVCOMPARE)(LPARAM, LPARAM, LPARAM); +alias WINBOOL (*LOCALE_ENUMPROC)(LPTSTR); +alias WINBOOL (*CODEPAGE_ENUMPROC)(LPTSTR); +alias WINBOOL (*DATEFMT_ENUMPROC)(LPTSTR); +alias WINBOOL (*TIMEFMT_ENUMPROC)(LPTSTR); +alias WINBOOL (*CALINFO_ENUMPROC)(LPTSTR); +alias WINBOOL (*PHANDLER_ROUTINE)(DWORD); +alias WINBOOL (*LPHANDLER_FUNCTION)(DWORD); +alias void (*PTIMERAPCROUTINE)(LPVOID, DWORD, DWORD); +alias UINT (*PFNGETPROFILEPATH)(LPCTSTR, LPSTR, UINT); +alias UINT (*PFNRECONCILEPROFILE)(LPCTSTR, LPCTSTR, DWORD); +alias WINBOOL (*PFNPROCESSPOLICIES)(HWND, LPCTSTR, LPCTSTR, LPCTSTR, DWORD); +} + +const { + char* SE_CREATE_TOKEN_NAME = ("SeCreateTokenPrivilege"); + char* SE_ASSIGNPRIMARYTOKEN_NAME = ("SeAssignPrimaryTokenPrivilege"); + char* SE_LOCK_MEMORY_NAME = ("SeLockMemoryPrivilege"); + char* SE_INCREASE_QUOTA_NAME = ("SeIncreaseQuotaPrivilege"); + char* SE_UNSOLICITED_INPUT_NAME = ("SeUnsolicitedInputPrivilege"); + char* SE_MACHINE_ACCOUNT_NAME = ("SeMachineAccountPrivilege"); + char* SE_TCB_NAME = ("SeTcbPrivilege"); + char* SE_SECURITY_NAME = ("SeSecurityPrivilege"); + char* SE_TAKE_OWNERSHIP_NAME = ("SeTakeOwnershipPrivilege"); + char* SE_LOAD_DRIVER_NAME = ("SeLoadDriverPrivilege"); + char* SE_SYSTEM_PROFILE_NAME = ("SeSystemProfilePrivilege"); + char* SE_SYSTEMTIME_NAME = ("SeSystemtimePrivilege"); + char* SE_PROF_SINGLE_PROCESS_NAME = ("SeProfileSingleProcessPrivilege"); + char* SE_INC_BASE_PRIORITY_NAME = ("SeIncreaseBasePriorityPrivilege"); + char* SE_CREATE_PAGEFILE_NAME = ("SeCreatePagefilePrivilege"); + char* SE_CREATE_PERMANENT_NAME = ("SeCreatePermanentPrivilege"); + char* SE_BACKUP_NAME = ("SeBackupPrivilege"); + char* SE_RESTORE_NAME = ("SeRestorePrivilege"); + char* SE_SHUTDOWN_NAME = ("SeShutdownPrivilege"); + char* SE_DEBUG_NAME = ("SeDebugPrivilege"); + char* SE_AUDIT_NAME = ("SeAuditPrivilege"); + char* SE_SYSTEM_ENVIRONMENT_NAME = ("SeSystemEnvironmentPrivilege"); + char* SE_CHANGE_NOTIFY_NAME = ("SeChangeNotifyPrivilege"); + char* SE_REMOTE_SHUTDOWN_NAME = ("SeRemoteShutdownPrivilege"); + char* SERVICES_ACTIVE_DATABASEA = ("ServicesActive"); + char* SERVICES_FAILED_DATABASEA = ("ServicesFailed"); + char* SC_GROUP_IDENTIFIERA = ("+"); + char* SERVICES_ACTIVE_DATABASE = (SERVICES_ACTIVE_DATABASEA); + char* SERVICES_FAILED_DATABASE = (SERVICES_FAILED_DATABASEA); + char* SC_GROUP_IDENTIFIER = (SC_GROUP_IDENTIFIERA); +} + +extern(Windows){ +alias HDDEDATA (*PFNCALLBACK)(UINT, UINT, HCONV, HSZ, HSZ, HDDEDATA, DWORD, DWORD); +} +alias PFNCALLBACK CALLB; +alias WINBOOL SECURITY___FILE___TRACKING_MODE; +alias FARPROC WNDENUMPROC; +alias FARPROC ENHMFENUMPROC; +alias DWORD CCSTYLE; +alias CCSTYLE* PCCSTYLE; +alias CCSTYLE* LPCCSTYLE; +alias DWORD CCSTYLEFLAGA; +alias CCSTYLEFLAGA* PCCSTYLEFLAGA; +alias CCSTYLEFLAGA* LPCCSTYLEFLAGA; + +const HANDLE INVALID_HANDLE_VALUE = cast(HANDLE) -1; + + +enum : DWORD { + SM_CXVIRTUALSCREEN = (76), + SM_CYVIRTUALSCREEN = (77), + MONITORINFOF_PRIMARY = (1), + LZERROR_UNKNOWNALG = -((8)), + LZERROR_BADVALUE = -((7)), + LZERROR_GLOBLOCK = -((6)), + LZERROR_GLOBALLOC = -((5)), + LZERROR_WRITE = -((4)), + LZERROR_READ = -((3)), + LZERROR_BADOUTHANDLE = -((2)), + LZERROR_BADINHANDLE = -((1)), + NO_ERROR = (0), + ERROR_SUCCESS = (0), + ERROR_INVALID_FUNCTION = (1), + ERROR_FILE_NOT_FOUND = (2), + ERROR_PATH_NOT_FOUND = (3), + ERROR_TOO_MANY_OPEN_FILES = (4), + ERROR_ACCESS_DENIED = (5), + ERROR_INVALID_HANDLE = (6), + ERROR_ARENA_TRASHED = (7), + ERROR_NOT_ENOUGH_MEMORY = (8), + ERROR_INVALID_BLOCK = (9), + ERROR_BAD_ENVIRONMENT = (10), + ERROR_BAD_FORMAT = (11), + ERROR_INVALID_ACCESS = (12), + ERROR_INVALID_DATA = (13), + ERROR_OUTOFMEMORY = (14), + ERROR_INVALID_DRIVE = (15), + ERROR_CURRENT_DIRECTORY = (16), + ERROR_NOT_SAME_DEVICE = (17), + ERROR_NO_MORE_FILES = (18), + ERROR_WRITE_PROTECT = (19), + ERROR_BAD_UNIT = (20), + ERROR_NOT_READY = (21), + ERROR_BAD_COMMAND = (22), + ERROR_CRC = (23), + ERROR_BAD_LENGTH = (24), + ERROR_SEEK = (25), + ERROR_NOT_DOS_DISK = (26), + ERROR_SECTOR_NOT_FOUND = (27), + ERROR_OUT_OF_PAPER = (28), + ERROR_WRITE_FAULT = (29), + ERROR_READ_FAULT = (30), + ERROR_GEN_FAILURE = (31), + ERROR_SHARING_VIOLATION = (32), + ERROR_LOCK_VIOLATION = (33), + ERROR_WRONG_DISK = (34), + ERROR_SHARING_BUFFER_EXCEEDED = (36), + ERROR_HANDLE_EOF = (38), + ERROR_HANDLE_DISK_FULL = (39), + ERROR_NOT_SUPPORTED = (50), + ERROR_REM_NOT_LIST = (51), + ERROR_DUP_NAME = (52), + ERROR_BAD_NETPATH = (53), + ERROR_NETWORK_BUSY = (54), + ERROR_DEV_NOT_EXIST = (55), + ERROR_TOO_MANY_CMDS = (56), + ERROR_ADAP_HDW_ERR = (57), + ERROR_BAD_NET_RESP = (58), + ERROR_UNEXP_NET_ERR = (59), + ERROR_BAD_REM_ADAP = (60), + ERROR_PRINTQ_FULL = (61), + ERROR_NO_SPOOL_SPACE = (62), + ERROR_PRINT_CANCELLED = (63), + ERROR_NETNAME_DELETED = (64), + ERROR_NETWORK_ACCESS_DENIED = (65), + ERROR_BAD_DEV_TYPE = (66), + ERROR_BAD_NET_NAME = (67), + ERROR_TOO_MANY_NAMES = (68), + ERROR_TOO_MANY_SESS = (69), + ERROR_SHARING_PAUSED = (70), + ERROR_REQ_NOT_ACCEP = (71), + ERROR_REDIR_PAUSED = (72), + ERROR_FILE_EXISTS = (80), + ERROR_CANNOT_MAKE = (82), + ERROR_FAIL_I24 = (83), + ERROR_OUT_OF_STRUCTURES = (84), + ERROR_ALREADY_ASSIGNED = (85), + ERROR_INVALID_PASSWORD = (86), + ERROR_INVALID_PARAMETER = (87), + ERROR_NET_WRITE_FAULT = (88), + ERROR_NO_PROC_SLOTS = (89), + ERROR_TOO_MANY_SEMAPHORES = (100), + ERROR_EXCL_SEM_ALREADY_OWNED = (101), + ERROR_SEM_IS_SET = (102), + ERROR_TOO_MANY_SEM_REQUESTS = (103), + ERROR_INVALID_AT_INTERRUPT_TIME = (104), + ERROR_SEM_OWNER_DIED = (105), + ERROR_SEM_USER_LIMIT = (106), + ERROR_DISK_CHANGE = (107), + ERROR_DRIVE_LOCKED = (108), + ERROR_BROKEN_PIPE = (109), + ERROR_OPEN_FAILED = (110), + ERROR_BUFFER_OVERFLOW = (111), + ERROR_DISK_FULL = (112), + ERROR_NO_MORE_SEARCH_HANDLES = (113), + ERROR_INVALID_TARGET_HANDLE = (114), + ERROR_INVALID_CATEGORY = (117), + ERROR_INVALID_VERIFY_SWITCH = (118), + ERROR_BAD_DRIVER_LEVEL = (119), + ERROR_CALL_NOT_IMPLEMENTED = (120), + ERROR_SEM_TIMEOUT = (121), + ERROR_INSUFFICIENT_BUFFER = (122), + ERROR_INVALID_NAME = (123), + ERROR_INVALID_LEVEL = (124), + ERROR_NO_VOLUME_LABEL = (125), + ERROR_MOD_NOT_FOUND = (126), + ERROR_PROC_NOT_FOUND = (127), + ERROR_WAIT_NO_CHILDREN = (128), + ERROR_CHILD_NOT_COMPLETE = (129), + ERROR_DIRECT_ACCESS_HANDLE = (130), + ERROR_NEGATIVE_SEEK = (131), + ERROR_SEEK_ON_DEVICE = (132), + ERROR_IS_JOIN_TARGET = (133), + ERROR_IS_JOINED = (134), + ERROR_IS_SUBSTED = (135), + ERROR_NOT_JOINED = (136), + ERROR_NOT_SUBSTED = (137), + ERROR_JOIN_TO_JOIN = (138), + ERROR_SUBST_TO_SUBST = (139), + ERROR_JOIN_TO_SUBST = (140), + ERROR_SUBST_TO_JOIN = (141), + ERROR_BUSY_DRIVE = (142), + ERROR_SAME_DRIVE = (143), + ERROR_DIR_NOT_ROOT = (144), + ERROR_DIR_NOT_EMPTY = (145), + ERROR_IS_SUBST_PATH = (146), + ERROR_IS_JOIN_PATH = (147), + ERROR_PATH_BUSY = (148), + ERROR_IS_SUBST_TARGET = (149), + ERROR_SYSTEM_TRACE = (150), + ERROR_INVALID_EVENT_COUNT = (151), + ERROR_TOO_MANY_MUXWAITERS = (152), + ERROR_INVALID_LIST_FORMAT = (153), + ERROR_LABEL_TOO_LONG = (154), + ERROR_TOO_MANY_TCBS = (155), + ERROR_SIGNAL_REFUSED = (156), + ERROR_DISCARDED = (157), + ERROR_NOT_LOCKED = (158), + ERROR_BAD_THREADID_ADDR = (159), + ERROR_BAD_ARGUMENTS = (160), + ERROR_BAD_PATHNAME = (161), + ERROR_SIGNAL_PENDING = (162), + ERROR_MAX_THRDS_REACHED = (164), + ERROR_LOCK_FAILED = (167), + ERROR_BUSY = (170), + ERROR_CANCEL_VIOLATION = (173), + ERROR_ATOMIC_LOCKS_NOT_SUPPORTED = (174), + ERROR_INVALID_SEGMENT_NUMBER = (180), + ERROR_INVALID_ORDINAL = (182), + ERROR_ALREADY_EXISTS = (183), + ERROR_INVALID_FLAG_NUMBER = (186), + ERROR_SEM_NOT_FOUND = (187), + ERROR_INVALID_STARTING_CODESEG = (188), + ERROR_INVALID_STACKSEG = (189), + ERROR_INVALID_MODULETYPE = (190), + ERROR_INVALID_EXE_SIGNATURE = (191), + ERROR_EXE_MARKED_INVALID = (192), + ERROR_BAD_EXE_FORMAT = (193), + ERROR_ITERATED_DATA_EXCEEDS_64k = (194), + ERROR_INVALID_MINALLOCSIZE = (195), + ERROR_DYNLINK_FROM_INVALID_RING = (196), + ERROR_IOPL_NOT_ENABLED = (197), + ERROR_INVALID_SEGDPL = (198), + ERROR_AUTODATASEG_EXCEEDS_64k = (199), + ERROR_RING2SEG_MUST_BE_MOVABLE = (200), + ERROR_RELOC_CHAIN_XEEDS_SEGLIM = (201), + ERROR_INFLOOP_IN_RELOC_CHAIN = (202), + ERROR_ENVVAR_NOT_FOUND = (203), + ERROR_NO_SIGNAL_SENT = (205), + ERROR_FILENAME_EXCED_RANGE = (206), + ERROR_RING2_STACK_IN_USE = (207), + ERROR_META_EXPANSION_TOO_LONG = (208), + ERROR_INVALID_SIGNAL_NUMBER = (209), + ERROR_THREAD_1_INACTIVE = (210), + ERROR_LOCKED = (212), + ERROR_TOO_MANY_MODULES = (214), + ERROR_NESTING_NOT_ALLOWED = (215), + ERROR_BAD_PIPE = (230), + ERROR_PIPE_BUSY = (231), + ERROR_NO_DATA = (232), + ERROR_PIPE_NOT_CONNECTED = (233), + ERROR_MORE_DATA = (234), + ERROR_VC_DISCONNECTED = (240), + ERROR_INVALID_EA_NAME = (254), + ERROR_EA_LIST_INCONSISTENT = (255), + ERROR_NO_MORE_ITEMS = (259), + ERROR_CANNOT_COPY = (266), + ERROR_DIRECTORY = (267), + ERROR_EAS_DIDNT_FIT = (275), + ERROR_EA_FILE_CORRUPT = (276), + ERROR_EA_TABLE_FULL = (277), + ERROR_INVALID_EA_HANDLE = (278), + ERROR_EAS_NOT_SUPPORTED = (282), + ERROR_NOT_OWNER = (288), + ERROR_TOO_MANY_POSTS = (298), + ERROR_PARTIAL_COPY = (299), + ERROR_MR_MID_NOT_FOUND = (317), + ERROR_INVALID_ADDRESS = (487), + ERROR_ARITHMETIC_OVERFLOW = (534), + ERROR_PIPE_CONNECTED = (535), + ERROR_PIPE_LISTENING = (536), + ERROR_EA_ACCESS_DENIED = (994), + ERROR_OPERATION_ABORTED = (995), + ERROR_IO_INCOMPLETE = (996), + ERROR_IO_PENDING = (997), + ERROR_NOACCESS = (998), + ERROR_SWAPERROR = (999), + ERROR_STACK_OVERFLOW = (1001), + ERROR_INVALID_MESSAGE = (1002), + ERROR_CAN_NOT_COMPLETE = (1003), + ERROR_INVALID_FLAGS = (1004), + ERROR_UNRECOGNIZED_VOLUME = (1005), + ERROR_FILE_INVALID = (1006), + ERROR_FULLSCREEN_MODE = (1007), + ERROR_NO_TOKEN = (1008), + ERROR_BADDB = (1009), + ERROR_BADKEY = (1010), + ERROR_CANTOPEN = (1011), + ERROR_CANTREAD = (1012), + ERROR_CANTWRITE = (1013), + ERROR_REGISTRY_RECOVERED = (1014), + ERROR_REGISTRY_CORRUPT = (1015), + ERROR_REGISTRY_IO_FAILED = (1016), + ERROR_NOT_REGISTRY_FILE = (1017), + ERROR_KEY_DELETED = (1018), + ERROR_NO_LOG_SPACE = (1019), + ERROR_KEY_HAS_CHILDREN = (1020), + ERROR_CHILD_MUST_BE_VOLATILE = (1021), + ERROR_NOTIFY_ENUM_DIR = (1022), + ERROR_DEPENDENT_SERVICES_RUNNING = (1051), + ERROR_INVALID_SERVICE_CONTROL = (1052), + ERROR_SERVICE_REQUEST_TIMEOUT = (1053), + ERROR_SERVICE_NO_THREAD = (1054), + ERROR_SERVICE_DATABASE_LOCKED = (1055), + ERROR_SERVICE_ALREADY_RUNNING = (1056), + ERROR_INVALID_SERVICE_ACCOUNT = (1057), + ERROR_SERVICE_DISABLED = (1058), + ERROR_CIRCULAR_DEPENDENCY = (1059), + ERROR_SERVICE_DOES_NOT_EXIST = (1060), + ERROR_SERVICE_CANNOT_ACCEPT_CTRL = (1061), + ERROR_SERVICE_NOT_ACTIVE = (1062), + ERROR_FAILED_SERVICE_CONTROLLER_CONNECT = (1063), + ERROR_EXCEPTION_IN_SERVICE = (1064), + ERROR_DATABASE_DOES_NOT_EXIST = (1065), + ERROR_SERVICE_SPECIFIC_ERROR = (1066), + ERROR_PROCESS_ABORTED = (1067), + ERROR_SERVICE_DEPENDENCY_FAIL = (1068), + ERROR_SERVICE_LOGON_FAILED = (1069), + ERROR_SERVICE_START_HANG = (1070), + ERROR_INVALID_SERVICE_LOCK = (1071), + ERROR_SERVICE_MARKED_FOR_DELETE = (1072), + ERROR_SERVICE_EXISTS = (1073), + ERROR_ALREADY_RUNNING_LKG = (1074), + ERROR_SERVICE_DEPENDENCY_DELETED = (1075), + ERROR_BOOT_ALREADY_ACCEPTED = (1076), + ERROR_SERVICE_NEVER_STARTED = (1077), + ERROR_DUPLICATE_SERVICE_NAME = (1078), + ERROR_END_OF_MEDIA = (1100), + ERROR_FILEMARK_DETECTED = (1101), + ERROR_BEGINNING_OF_MEDIA = (1102), + ERROR_SETMARK_DETECTED = (1103), + ERROR_NO_DATA_DETECTED = (1104), + ERROR_PARTITION_FAILURE = (1105), + ERROR_INVALID_BLOCK_LENGTH = (1106), + ERROR_DEVICE_NOT_PARTITIONED = (1107), + ERROR_UNABLE_TO_LOCK_MEDIA = (1108), + ERROR_UNABLE_TO_UNLOAD_MEDIA = (1109), + ERROR_MEDIA_CHANGED = (1110), + ERROR_BUS_RESET = (1111), + ERROR_NO_MEDIA_IN_DRIVE = (1112), + ERROR_NO_UNICODE_TRANSLATION = (1113), + ERROR_DLL_INIT_FAILED = (1114), + ERROR_SHUTDOWN_IN_PROGRESS = (1115), + ERROR_NO_SHUTDOWN_IN_PROGRESS = (1116), + ERROR_IO_DEVICE = (1117), + ERROR_SERIAL_NO_DEVICE = (1118), + ERROR_IRQ_BUSY = (1119), + ERROR_MORE_WRITES = (1120), + ERROR_COUNTER_TIMEOUT = (1121), + ERROR_FLOPPY_ID_MARK_NOT_FOUND = (1122), + ERROR_FLOPPY_WRONG_CYLINDER = (1123), + ERROR_FLOPPY_UNKNOWN_ERROR = (1124), + ERROR_FLOPPY_BAD_REGISTERS = (1125), + ERROR_DISK_RECALIBRATE_FAILED = (1126), + ERROR_DISK_OPERATION_FAILED = (1127), + ERROR_DISK_RESET_FAILED = (1128), + ERROR_EOM_OVERFLOW = (1129), + ERROR_NOT_ENOUGH_SERVER_MEMORY = (1130), + ERROR_POSSIBLE_DEADLOCK = (1131), + ERROR_MAPPED_ALIGNMENT = (1132), + ERROR_SET_POWER_STATE_VETOED = (1140), + ERROR_SET_POWER_STATE_FAILED = (1141), + ERROR_OLD_WIN_VERSION = (1150), + ERROR_APP_WRONG_OS = (1151), + ERROR_SINGLE_INSTANCE_APP = (1152), + ERROR_RMODE_APP = (1153), + ERROR_INVALID_DLL = (1154), + ERROR_NO_ASSOCIATION = (1155), + ERROR_DDE_FAIL = (1156), + ERROR_DLL_NOT_FOUND = (1157), + ERROR_BAD_USERNAME = (2202), + ERROR_NOT_CONNECTED = (2250), + ERROR_OPEN_FILES = (2401), + ERROR_ACTIVE_CONNECTIONS = (2402), + ERROR_DEVICE_IN_USE = (2404), + ERROR_BAD_DEVICE = (1200), + ERROR_CONNECTION_UNAVAIL = (1201), + ERROR_DEVICE_ALREADY_REMEMBERED = (1202), + ERROR_NO_NET_OR_BAD_PATH = (1203), + ERROR_BAD_PROVIDER = (1204), + ERROR_CANNOT_OPEN_PROFILE = (1205), + ERROR_BAD_PROFILE = (1206), + ERROR_NOT_CONTAINER = (1207), + ERROR_EXTENDED_ERROR = (1208), + ERROR_INVALID_GROUPNAME = (1209), + ERROR_INVALID_COMPUTERNAME = (1210), + ERROR_INVALID_EVENTNAME = (1211), + ERROR_INVALID_DOMAINNAME = (1212), + ERROR_INVALID_SERVICENAME = (1213), + ERROR_INVALID_NETNAME = (1214), + ERROR_INVALID_SHARENAME = (1215), + ERROR_INVALID_PASSWORDNAME = (1216), + ERROR_INVALID_MESSAGENAME = (1217), + ERROR_INVALID_MESSAGEDEST = (1218), + ERROR_SESSION_CREDENTIAL_CONFLICT = (1219), + ERROR_REMOTE_SESSION_LIMIT_EXCEEDED = (1220), + ERROR_DUP_DOMAINNAME = (1221), + ERROR_NO_NETWORK = (1222), + ERROR_CANCELLED = (1223), + ERROR_USER_MAPPED_FILE = (1224), + ERROR_CONNECTION_REFUSED = (1225), + ERROR_GRACEFUL_DISCONNECT = (1226), + ERROR_ADDRESS_ALREADY_ASSOCIATED = (1227), + ERROR_ADDRESS_NOT_ASSOCIATED = (1228), + ERROR_CONNECTION_INVALID = (1229), + ERROR_CONNECTION_ACTIVE = (1230), + ERROR_NETWORK_UNREACHABLE = (1231), + ERROR_HOST_UNREACHABLE = (1232), + ERROR_PROTOCOL_UNREACHABLE = (1233), + ERROR_PORT_UNREACHABLE = (1234), + ERROR_REQUEST_ABORTED = (1235), + ERROR_CONNECTION_ABORTED = (1236), + ERROR_RETRY = (1237), + ERROR_CONNECTION_COUNT_LIMIT = (1238), + ERROR_LOGIN_TIME_RESTRICTION = (1239), + ERROR_LOGIN_WKSTA_RESTRICTION = (1240), + ERROR_INCORRECT_ADDRESS = (1241), + ERROR_ALREADY_REGISTERED = (1242), + ERROR_SERVICE_NOT_FOUND = (1243), + ERROR_NOT_AUTHENTICATED = (1244), + ERROR_NOT_LOGGED_ON = (1245), + ERROR_CONTINUE = (1246), + ERROR_ALREADY_INITIALIZED = (1247), + ERROR_NO_MORE_DEVICES = (1248), + ERROR_NOT_ALL_ASSIGNED = (1300), + ERROR_SOME_NOT_MAPPED = (1301), + ERROR_NO_QUOTAS_FOR_ACCOUNT = (1302), + ERROR_LOCAL_USER_SESSION_KEY = (1303), + ERROR_NULL_LM_PASSWORD = (1304), + ERROR_UNKNOWN_REVISION = (1305), + ERROR_REVISION_MISMATCH = (1306), + ERROR_INVALID_OWNER = (1307), + ERROR_INVALID_PRIMARY_GROUP = (1308), + ERROR_NO_IMPERSONATION_TOKEN = (1309), + ERROR_CANT_DISABLE_MANDATORY = (1310), + ERROR_NO_LOGON_SERVERS = (1311), + ERROR_NO_SUCH_LOGON_SESSION = (1312), + ERROR_NO_SUCH_PRIVILEGE = (1313), + ERROR_PRIVILEGE_NOT_HELD = (1314), + ERROR_INVALID_ACCOUNT_NAME = (1315), + ERROR_USER_EXISTS = (1316), + ERROR_NO_SUCH_USER = (1317), + ERROR_GROUP_EXISTS = (1318), + ERROR_NO_SUCH_GROUP = (1319), + ERROR_MEMBER_IN_GROUP = (1320), + ERROR_MEMBER_NOT_IN_GROUP = (1321), + ERROR_LAST_ADMIN = (1322), + ERROR_WRONG_PASSWORD = (1323), + ERROR_ILL_FORMED_PASSWORD = (1324), + ERROR_PASSWORD_RESTRICTION = (1325), + ERROR_LOGON_FAILURE = (1326), + ERROR_ACCOUNT_RESTRICTION = (1327), + ERROR_INVALID_LOGON_HOURS = (1328), + ERROR_INVALID_WORKSTATION = (1329), + ERROR_PASSWORD_EXPIRED = (1330), + ERROR_ACCOUNT_DISABLED = (1331), + ERROR_NONE_MAPPED = (1332), + ERROR_TOO_MANY_LUIDS_REQUESTED = (1333), + ERROR_LUIDS_EXHAUSTED = (1334), + ERROR_INVALID_SUB_AUTHORITY = (1335), + ERROR_INVALID_ACL = (1336), + ERROR_INVALID_SID = (1337), + ERROR_INVALID_SECURITY_DESCR = (1338), + ERROR_BAD_INHERITANCE_ACL = (1340), + ERROR_SERVER_DISABLED = (1341), + ERROR_SERVER_NOT_DISABLED = (1342), + ERROR_INVALID_ID_AUTHORITY = (1343), + ERROR_ALLOTTED_SPACE_EXCEEDED = (1344), + ERROR_INVALID_GROUP_ATTRIBUTES = (1345), + ERROR_BAD_IMPERSONATION_LEVEL = (1346), + ERROR_CANT_OPEN_ANONYMOUS = (1347), + ERROR_BAD_VALIDATION_CLASS = (1348), + ERROR_BAD_TOKEN_TYPE = (1349), + ERROR_NO_SECURITY_ON_OBJECT = (1350), + ERROR_CANT_ACCESS_DOMAIN_INFO = (1351), + ERROR_INVALID_SERVER_STATE = (1352), + ERROR_INVALID_DOMAIN_STATE = (1353), + ERROR_INVALID_DOMAIN_ROLE = (1354), + ERROR_NO_SUCH_DOMAIN = (1355), + ERROR_DOMAIN_EXISTS = (1356), + ERROR_DOMAIN_LIMIT_EXCEEDED = (1357), + ERROR_INTERNAL_DB_CORRUPTION = (1358), + ERROR_INTERNAL_ERROR = (1359), + ERROR_GENERIC_NOT_MAPPED = (1360), + ERROR_BAD_DESCRIPTOR_FORMAT = (1361), + ERROR_NOT_LOGON_PROCESS = (1362), + ERROR_LOGON_SESSION_EXISTS = (1363), + ERROR_NO_SUCH_PACKAGE = (1364), + ERROR_BAD_LOGON_SESSION_STATE = (1365), + ERROR_LOGON_SESSION_COLLISION = (1366), + ERROR_INVALID_LOGON_TYPE = (1367), + ERROR_CANNOT_IMPERSONATE = (1368), + ERROR_RXACT_INVALID_STATE = (1369), + ERROR_RXACT_COMMIT_FAILURE = (1370), + ERROR_SPECIAL_ACCOUNT = (1371), + ERROR_SPECIAL_GROUP = (1372), + ERROR_SPECIAL_USER = (1373), + ERROR_MEMBERS_PRIMARY_GROUP = (1374), + ERROR_TOKEN_ALREADY_IN_USE = (1375), + ERROR_NO_SUCH_ALIAS = (1376), + ERROR_MEMBER_NOT_IN_ALIAS = (1377), + ERROR_MEMBER_IN_ALIAS = (1378), + ERROR_ALIAS_EXISTS = (1379), + ERROR_LOGON_NOT_GRANTED = (1380), + ERROR_TOO_MANY_SECRETS = (1381), + ERROR_SECRET_TOO_LONG = (1382), + ERROR_INTERNAL_DB_ERROR = (1383), + ERROR_TOO_MANY___FILE___IDS = (1384), + ERROR_LOGON_TYPE_NOT_GRANTED = (1385), + ERROR_NT_CROSS_ENCRYPTION_REQUIRED = (1386), + ERROR_NO_SUCH_MEMBER = (1387), + ERROR_INVALID_MEMBER = (1388), + ERROR_TOO_MANY_SIDS = (1389), + ERROR_LM_CROSS_ENCRYPTION_REQUIRED = (1390), + ERROR_NO_INHERITANCE = (1391), + ERROR_FILE_CORRUPT = (1392), + ERROR_DISK_CORRUPT = (1393), + ERROR_NO_USER_SESSION_KEY = (1394), + ERROR_LICENSE_QUOTA_EXCEEDED = (1395), + ERROR_INVALID_WINDOW_HANDLE = (1400), + ERROR_INVALID_MENU_HANDLE = (1401), + ERROR_INVALID_CURSOR_HANDLE = (1402), + ERROR_INVALID_ACCEL_HANDLE = (1403), + ERROR_INVALID_HOOK_HANDLE = (1404), + ERROR_INVALID_DWP_HANDLE = (1405), + ERROR_TLW_WITH_WSCHILD = (1406), + ERROR_CANNOT_FIND_WND_CLASS = (1407), + ERROR_WINDOW_OF_OTHER_THREAD = (1408), + ERROR_HOTKEY_ALREADY_REGISTERED = (1409), + ERROR_CLASS_ALREADY_EXISTS = (1410), + ERROR_CLASS_DOES_NOT_EXIST = (1411), + ERROR_CLASS_HAS_WINDOWS = (1412), + ERROR_INVALID_INDEX = (1413), + ERROR_INVALID_ICON_HANDLE = (1414), + ERROR_PRIVATE_DIALOG_INDEX = (1415), + ERROR_LISTBOX_ID_NOT_FOUND = (1416), + ERROR_NO_WILDCARD_CHARACTERS = (1417), + ERROR_CLIPBOARD_NOT_OPEN = (1418), + ERROR_HOTKEY_NOT_REGISTERED = (1419), + ERROR_WINDOW_NOT_DIALOG = (1420), + ERROR_CONTROL_ID_NOT_FOUND = (1421), + ERROR_INVALID_COMBOBOX_MESSAGE = (1422), + ERROR_WINDOW_NOT_COMBOBOX = (1423), + ERROR_INVALID_EDIT_HEIGHT = (1424), + ERROR_DC_NOT_FOUND = (1425), + ERROR_INVALID_HOOK_FILTER = (1426), + ERROR_INVALID_FILTER_PROC = (1427), + ERROR_HOOK_NEEDS_HMOD = (1428), + ERROR_GLOBAL_ONLY_HOOK = (1429), + ERROR_JOURNAL_HOOK_SET = (1430), + ERROR_HOOK_NOT_INSTALLED = (1431), + ERROR_INVALID_LB_MESSAGE = (1432), + ERROR_SETCOUNT_ON_BAD_LB = (1433), + ERROR_LB_WITHOUT_TABSTOPS = (1434), + ERROR_DESTROY_OBJECT_OF_OTHER_THREAD = (1435), + ERROR_CHILD_WINDOW_MENU = (1436), + ERROR_NO_SYSTEM_MENU = (1437), + ERROR_INVALID_MSGBOX_STYLE = (1438), + ERROR_INVALID_SPI_VALUE = (1439), + ERROR_SCREEN_ALREADY_LOCKED = (1440), + ERROR_HWNDS_HAVE_DIFF_PARENT = (1441), + ERROR_NOT_CHILD_WINDOW = (1442), + ERROR_INVALID_GW_COMMAND = (1443), + ERROR_INVALID_THREAD_ID = (1444), + ERROR_NON_MDICHILD_WINDOW = (1445), + ERROR_POPUP_ALREADY_ACTIVE = (1446), + ERROR_NO_SCROLLBARS = (1447), + ERROR_INVALID_SCROLLBAR_RANGE = (1448), + ERROR_INVALID_SHOWWIN_COMMAND = (1449), + ERROR_NO_SYSTEM_RESOURCES = (1450), + ERROR_NONPAGED_SYSTEM_RESOURCES = (1451), + ERROR_PAGED_SYSTEM_RESOURCES = (1452), + ERROR_WORKING_SET_QUOTA = (1453), + ERROR_PAGEFILE_QUOTA = (1454), + ERROR_COMMITMENT_LIMIT = (1455), + ERROR_MENU_ITEM_NOT_FOUND = (1456), + ERROR_EVENTLOG_FILE_CORRUPT = (1500), + ERROR_EVENTLOG_CANT_START = (1501), + ERROR_LOG_FILE_FULL = (1502), + ERROR_EVENTLOG_FILE_CHANGED = (1503), + RPC_S_INVALID_STRING_BINDING = (1700), + RPC_S_WRONG_KIND_OF_BINDING = (1701), + RPC_S_INVALID_BINDING = (1702), + RPC_S_PROTSEQ_NOT_SUPPORTED = (1703), + RPC_S_INVALID_RPC_PROTSEQ = (1704), + RPC_S_INVALID_STRING_UUID = (1705), + RPC_S_INVALID_ENDPOINT_FORMAT = (1706), + RPC_S_INVALID_NET_ADDR = (1707), + RPC_S_NO_ENDPOINT_FOUND = (1708), + RPC_S_INVALID_TIMEOUT = (1709), + RPC_S_OBJECT_NOT_FOUND = (1710), + RPC_S_ALREADY_REGISTERED = (1711), + RPC_S_TYPE_ALREADY_REGISTERED = (1712), + RPC_S_ALREADY_LISTENING = (1713), + RPC_S_NO_PROTSEQS_REGISTERED = (1714), + RPC_S_NOT_LISTENING = (1715), + RPC_S_UNKNOWN_MGR_TYPE = (1716), + RPC_S_UNKNOWN_IF = (1717), + RPC_S_NO_BINDINGS = (1718), + RPC_S_NO_PROTSEQS = (1719), + RPC_S_CANT_CREATE_ENDPOINT = (1720), + RPC_S_OUT_OF_RESOURCES = (1721), + RPC_S_SERVER_UNAVAILABLE = (1722), + RPC_S_SERVER_TOO_BUSY = (1723), + RPC_S_INVALID_NETWORK_OPTIONS = (1724), + RPC_S_NO_CALL_ACTIVE = (1725), + RPC_S_CALL_FAILED = (1726), + RPC_S_CALL_FAILED_DNE = (1727), + RPC_S_PROTOCOL_ERROR = (1728), + RPC_S_UNSUPPORTED_TRANS_SYN = (1730), + RPC_S_UNSUPPORTED_TYPE = (1732), + RPC_S_INVALID_TAG = (1733), + RPC_S_INVALID_BOUND = (1734), + RPC_S_NO_ENTRY_NAME = (1735), + RPC_S_INVALID_NAME_SYNTAX = (1736), + RPC_S_UNSUPPORTED_NAME_SYNTAX = (1737), + RPC_S_UUID_NO_ADDRESS = (1739), + RPC_S_DUPLICATE_ENDPOINT = (1740), + RPC_S_UNKNOWN_AUTHN_TYPE = (1741), + RPC_S_MAX_CALLS_TOO_SMALL = (1742), + RPC_S_STRING_TOO_LONG = (1743), + RPC_S_PROTSEQ_NOT_FOUND = (1744), + RPC_S_PROCNUM_OUT_OF_RANGE = (1745), + RPC_S_BINDING_HAS_NO_AUTH = (1746), + RPC_S_UNKNOWN_AUTHN_SERVICE = (1747), + RPC_S_UNKNOWN_AUTHN_LEVEL = (1748), + RPC_S_INVALID_AUTH_IDENTITY = (1749), + RPC_S_UNKNOWN_AUTHZ_SERVICE = (1750), + EPT_S_INVALID_ENTRY = (1751), + EPT_S_CANT_PERFORM_OP = (1752), + EPT_S_NOT_REGISTERED = (1753), + RPC_S_NOTHING_TO_EXPORT = (1754), + RPC_S_INCOMPLETE_NAME = (1755), + RPC_S_INVALID_VERS_OPTION = (1756), + RPC_S_NO_MORE_MEMBERS = (1757), + RPC_S_NOT_ALL_OBJS_UNEXPORTED = (1758), + RPC_S_INTERFACE_NOT_FOUND = (1759), + RPC_S_ENTRY_ALREADY_EXISTS = (1760), + RPC_S_ENTRY_NOT_FOUND = (1761), + RPC_S_NAME_SERVICE_UNAVAILABLE = (1762), + RPC_S_INVALID_NAF_ID = (1763), + RPC_S_CANNOT_SUPPORT = (1764), + RPC_S_NO___FILE___AVAILABLE = (1765), + RPC_S_INTERNAL_ERROR = (1766), + RPC_S_ZERO_DIVIDE = (1767), + RPC_S_ADDRESS_ERROR = (1768), + RPC_S_FP_DIV_ZERO = (1769), + RPC_S_FP_UNDERFLOW = (1770), + RPC_S_FP_OVERFLOW = (1771), + RPC_X_NO_MORE_ENTRIES = (1772), + RPC_X_SS_CHAR_TRANS_OPEN_FAIL = (1773), + RPC_X_SS_CHAR_TRANS_SHORT_FILE = (1774), + RPC_X_SS_IN_NULL___FILE__ = (1775), + RPC_X_SS___FILE___DAMAGED = (1777), + RPC_X_SS_HANDLES_MISMATCH = (1778), + RPC_X_SS_CANNOT_GET_CALL_HANDLE = (1779), + RPC_X_NULL_REF_POINTER = (1780), + RPC_X_ENUM_VALUE_OUT_OF_RANGE = (1781), + RPC_X_BYTE_COUNT_TOO_SMALL = (1782), + RPC_X_BAD_STUB_DATA = (1783), + ERROR_INVALID_USER_BUFFER = (1784), + ERROR_UNRECOGNIZED_MEDIA = (1785), + ERROR_NO_TRUST_LSA_SECRET = (1786), + ERROR_NO_TRUST_SAM_ACCOUNT = (1787), + ERROR_TRUSTED_DOMAIN_FAILURE = (1788), + ERROR_TRUSTED_RELATIONSHIP_FAILURE = (1789), + ERROR_TRUST_FAILURE = (1790), + RPC_S_CALL_IN_PROGRESS = (1791), + ERROR_NETLOGON_NOT_STARTED = (1792), + ERROR_ACCOUNT_EXPIRED = (1793), + ERROR_REDIRECTOR_HAS_OPEN_HANDLES = (1794), + ERROR_PRINTER_DRIVER_ALREADY_INSTALLED = (1795), + ERROR_UNKNOWN_PORT = (1796), + ERROR_UNKNOWN_PRINTER_DRIVER = (1797), + ERROR_UNKNOWN_PRINTPROCESSOR = (1798), + ERROR_INVALID_SEPARATOR_FILE = (1799), + ERROR_INVALID_PRIORITY = (1800), + ERROR_INVALID_PRINTER_NAME = (1801), + ERROR_PRINTER_ALREADY_EXISTS = (1802), + ERROR_INVALID_PRINTER_COMMAND = (1803), + ERROR_INVALID_DATATYPE = (1804), + ERROR_INVALID_ENVIRONMENT = (1805), + RPC_S_NO_MORE_BINDINGS = (1806), + ERROR_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT = (1807), + ERROR_NOLOGON_WORKSTATION_TRUST_ACCOUNT = (1808), + ERROR_NOLOGON_SERVER_TRUST_ACCOUNT = (1809), + ERROR_DOMAIN_TRUST_INCONSISTENT = (1810), + ERROR_SERVER_HAS_OPEN_HANDLES = (1811), + ERROR_RESOURCE_DATA_NOT_FOUND = (1812), + ERROR_RESOURCE_TYPE_NOT_FOUND = (1813), + ERROR_RESOURCE_NAME_NOT_FOUND = (1814), + ERROR_RESOURCE_LANG_NOT_FOUND = (1815), + ERROR_NOT_ENOUGH_QUOTA = (1816), + RPC_S_NO_INTERFACES = (1817), + RPC_S_CALL_CANCELLED = (1818), + RPC_S_BINDING_INCOMPLETE = (1819), + RPC_S_COMM_FAILURE = (1820), + RPC_S_UNSUPPORTED_AUTHN_LEVEL = (1821), + RPC_S_NO_PRINC_NAME = (1822), + RPC_S_NOT_RPC_ERROR = (1823), + RPC_S_UUID_LOCAL_ONLY = (1824), + RPC_S_SEC_PKG_ERROR = (1825), + RPC_S_NOT_CANCELLED = (1826), + RPC_X_INVALID_ES_ACTION = (1827), + RPC_X_WRONG_ES_VERSION = (1828), + RPC_X_WRONG_STUB_VERSION = (1829), + RPC_S_GROUP_MEMBER_NOT_FOUND = (1898), + EPT_S_CANT_CREATE = (1899), + RPC_S_INVALID_OBJECT = (1900), + ERROR_INVALID_TIME = (1901), + ERROR_INVALID_FORM_NAME = (1902), + ERROR_INVALID_FORM_SIZE = (1903), + ERROR_ALREADY_WAITING = (1904), + ERROR_PRINTER_DELETED = (1905), + ERROR_INVALID_PRINTER_STATE = (1906), + ERROR_PASSWORD_MUST_CHANGE = (1907), + ERROR_DOMAIN_CONTROLLER_NOT_FOUND = (1908), + ERROR_ACCOUNT_LOCKED_OUT = (1909), + ERROR_NO_BROWSER_SERVERS_FOUND = (6118), + ERROR_INVALID_PIXEL_FORMAT = (2000), + ERROR_BAD_DRIVER = (2001), + ERROR_INVALID_WINDOW_STYLE = (2002), + ERROR_METAFILE_NOT_SUPPORTED = (2003), + ERROR_TRANSFORM_NOT_SUPPORTED = (2004), + ERROR_CLIPPING_NOT_SUPPORTED = (2005), + ERROR_UNKNOWN_PRINT_MONITOR = (3000), + ERROR_PRINTER_DRIVER_IN_USE = (3001), + ERROR_SPOOL_FILE_NOT_FOUND = (3002), + ERROR_SPL_NO_STARTDOC = (3003), + ERROR_SPL_NO_ADDJOB = (3004), + ERROR_PRINT_PROCESSOR_ALREADY_INSTALLED = (3005), + ERROR_PRINT_MONITOR_ALREADY_INSTALLED = (3006), + ERROR_WINS_INTERNAL = (4000), + ERROR_CAN_NOT_DEL_LOCAL_WINS = (4001), + ERROR_STATIC_INIT = (4002), + ERROR_INC_BACKUP = (4003), + ERROR_FULL_BACKUP = (4004), + ERROR_REC_NON_EXISTENT = (4005), + ERROR_RPL_NOT_ALLOWED = (4006), + MAX_PATH = (260), + LF_FACESIZE = (32), + LF_FULLFACESIZE = (64), + ELF_VENDOR_SIZE = (4), + SECURITY_STATIC_TRACKING = (0), + SECURITY_DYNAMIC_TRACKING = (1), + MAX_DEFAULTCHAR = (2), + MAX_LEADBYTES = (12), + EXCEPTION_MAXIMUM_PARAMETERS = (15), + CCHDEVICENAME = (32), + CCHFORMNAME = (32), + MENU_TEXT_LEN = (40), + MAX_LANA = (254), + NCBNAMSZ = (16), + NETBIOS_NAME_LEN = (16), + OFS_MAXPATHNAME = (128), + MAX_TAB_STOPS = (32), + ANYSIZE_ARRAY = (1), + RAS_MaxCallbackNumber = (128), + RAS_MaxDeviceName = (128), + RAS_MaxDeviceType = (16), + RAS_MaxEntryName = (256), + RAS_MaxIpAddress = (15), + RAS_MaxIpxAddress = (21), + RAS_MaxPhoneNumber = (128), + UNLEN = (256), + PWLEN = (256), + CNLEN = (15), + DNLEN = (15), + MAXDWORD = (0xFFFFFFFF), + MAXWORD = (0xFFFF), + MAXBYTE = (0xFF), + MINCHAR = (0x80), + MAXCHAR = (0x7F), + MINSHORT = (0x8000), + MAXSHORT = (0x7FFF), + MINLONG = (0x80000000), + MAXLONG = (0x7FFFFFFF), + FILE_BEGIN = (0), + FILE_CURRENT = (1), + FILE_END = (2), + OF_READ = (0), + OF_READWRITE = (2), + OF_WRITE = (1), + OF_SHARE_COMPAT = (0), + OF_SHARE_DENY_NONE = (64), + OF_SHARE_DENY_READ = (48), + OF_SHARE_DENY_WRITE = (32), + OF_SHARE_EXCLUSIVE = (16), + OF_CANCEL = (2048), + OF_CREATE = (4096), + OF_DELETE = (512), + OF_EXIST = (16384), + OF_PARSE = (256), + OF_PROMPT = (8192), + OF_REOPEN = (32768), + OF_VERIFY = (1024), + HKL_NEXT = (1), + HKL_PREV = (0), + KLF_REORDER = (8), + KLF_UNLOADPREVIOUS = (4), + KLF_ACTIVATE = (1), + KLF_NOTELLSHELL = (128), + KLF_REPLACELANG = (16), + KLF_SUBSTITUTE_OK = (2), + MF_BITMAP = (0x4), + MF_DISABLED = (0x2), + MF_ENABLED = (0), + MF_GRAYED = (0x1), + MF_HELP = (0x4000), + MF_MENUBARBREAK = (0x20), + MF_MENUBREAK = (0x40), + MF_MOUSESELECT = (0x8000), + MF_OWNERDRAW = (0x100), + MF_POPUP = (0x10), + MF_SEPARATOR = (0x800), + MF_STRING = (0), + MF_SYSMENU = (0x2000), + MF_USECHECKBITMAPS = (0x200), + BLACKNESS = (0x00000042), + NOTSRCERASE = (0x001100A6), + NOTSRCCOPY = (0x00330008), + SRCERASE = (0x00440328), + DSTINVERT = (0x00550009), + PATINVERT = (0x005A0049), + SRCINVERT = (0x00660046), + SRCAND = (0x008800C6), + MERGEPAINT = (0x00BB0226), + MERGECOPY = (0x00C000CA), + SRCCOPY = (0x00CC0020), + SRCPAINT = (0x00EE0086), + PATCOPY = (0x00F00021), + PATPAINT = (0x00FB0A09), + WHITENESS = (0x00FF0062), + R2_BLACK = (1), + R2_COPYPEN = (13), + R2_MASKNOTPEN = (3), + R2_MASKPEN = (9), + R2_MASKPENNOT = (5), + R2_MERGENOTPEN = (12), + R2_MERGEPEN = (15), + R2_MERGEPENNOT = (14), + R2_NOP = (11), + R2_NOT = (6), + R2_NOTCOPYPEN = (4), + R2_NOTMASKPEN = (8), + R2_NOTMERGEPEN = (2), + R2_NOTXORPEN = (10), + R2_WHITE = (16), + R2_XORPEN = (7), + BSF_FLUSHDISK = (4), + BSF_FORCEIFHUNG = (32), + BSF_IGNORECURRENTTASK = (2), + BSF_NOHANG = (8), + BSF_POSTMESSAGE = (16), + BSF_QUERY = (1), + BSM_ALLCOMPONENTS = (0), + BSM_APPLICATIONS = (8), + BSM_INSTALLABLEDRIVERS = (4), + BSM_NETDRIVER = (2), + BSM_VXDS = (1), + BROADCAST_QUERY_DENY = (1112363332), + NMPWAIT_NOWAIT = (1), + NMPWAIT_WAIT_FOREVER = -((1)), + NMPWAIT_USE_DEFAULT_WAIT = (0), + MDITILE_SKIPDISABLED = (2), + MDITILE_HORIZONTAL = (1), + MDITILE_VERTICAL = (0), + HCBT_ACTIVATE = (5), + HCBT_CLICKSKIPPED = (6), + HCBT_CREATEWND = (3), + HCBT_DESTROYWND = (4), + HCBT_KEYSKIPPED = (7), + HCBT_MINMAX = (1), + HCBT_MOVESIZE = (0), + HCBT_QS = (2), + HCBT_SETFOCUS = (9), + HCBT_SYSCOMMAND = (8), + DM_BITSPERPEL = (0x40000), + DM_PELSWIDTH = (0x80000), + DM_PELSHEIGHT = (0x100000), + DM_DISPLAYFLAGS = (0x200000), + DM_DISPLAYFREQUENCY = (0x400000), + CDS_UPDATEREGISTRY = (1), + CDS_TEST = (2), + DISP_CHANGE_SUCCESSFUL = (0), + DISP_CHANGE_RESTART = (1), + DISP_CHANGE_BADFLAGS = -((4)), + DISP_CHANGE_FAILED = -((1)), + DISP_CHANGE_BADMODE = -((2)), + DISP_CHANGE_NOTUPDATED = -((3)), + SERVICE_NO_CHANGE = -((1)), + SERVICE_WIN32_OWN_PROCESS = (16), + SERVICE_WIN32_SHARE_PROCESS = (32), + SERVICE_KERNEL_DRIVER = (1), + SERVICE_FILE_SYSTEM_DRIVER = (2), + SERVICE_INTERACTIVE_PROCESS = (256), + SERVICE_BOOT_START = (0), + SERVICE_SYSTEM_START = (1), + SERVICE_AUTO_START = (2), + SERVICE_DEMAND_START = (3), + SERVICE_DISABLED = (4), + SERVICE_STOPPED = (1), + SERVICE_START_PENDING = (2), + SERVICE_STOP_PENDING = (3), + SERVICE_RUNNING = (4), + SERVICE_CONTINUE_PENDING = (5), + SERVICE_PAUSE_PENDING = (6), + SERVICE_PAUSED = (7), + SERVICE_ACCEPT_STOP = (1), + SERVICE_ACCEPT_PAUSE_CONTINUE = (2), + SERVICE_ACCEPT_SHUTDOWN = (4), + BST_CHECKED = (1), + BST_INDETERMINATE = (2), + BST_UNCHECKED = (0), + BST_FOCUS = (8), + BST_PUSHED = (4), + MF_BYCOMMAND = (0), + MF_BYPOSITION = (0x400), + MF_CHECKED = (0x8), + MF_UNCHECKED = (0), + MF_HILITE = (0x80), + MF_UNHILITE = (0), + CWP_ALL = (0), + CWP_SKIPINVISIBLE = (1), + CWP_SKIPDISABLED = (2), + CWP_SKIPTRANSPARENT = (4), + CE_BREAK = (16), + CE_DNS = (2048), + CE_FRAME = (8), + CE_IOE = (1024), + CE_MODE = (32768), + CE_OOP = (4096), + CE_OVERRUN = (2), + CE_PTO = (512), + CE_RXOVER = (1), + CE_RXPARITY = (4), + CE_TXFULL = (256), + RGN_AND = (1), + RGN_COPY = (5), + RGN_DIFF = (4), + RGN_OR = (2), + RGN_XOR = (3), + NULLREGION = (1), + SIMPLEREGION = (2), + COMPLEXREGION = (3), + ERROR = (0), + CDERR_DIALOGFAILURE = (0xffff), + CDERR_FINDRESFAILURE = (6), + CDERR_INITIALIZATION = (2), + CDERR_LOADRESFAILURE = (7), + CDERR_LOADSTRFAILURE = (5), + CDERR_LOCKRESFAILURE = (8), + CDERR_MEMALLOCFAILURE = (9), + CDERR_MEMLOCKFAILURE = (10), + CDERR_NOHINSTANCE = (4), + CDERR_NOHOOK = (11), + CDERR_NOTEMPLATE = (3), + CDERR_REGISTERMSGFAIL = (12), + CDERR_STRUCTSIZE = (1), + PDERR_CREATEICFAILURE = (0x1000)+(10), + PDERR_DEFAULTDIFFERENT = (0x1000)+(12), + PDERR_DNDMMISMATCH = (0x1000)+(9), + PDERR_GETDEVMODEFAIL = (0x1000)+(5), + PDERR_INITFAILURE = (0x1000)+(6), + PDERR_LOADDRVFAILURE = (0x1000)+(4), + PDERR_NODEFAULTPRN = (0x1000)+(8), + PDERR_NODEVICES = (0x1000)+(7), + PDERR_PARSEFAILURE = (0x1000)+(2), + PDERR_PRINTERNOTFOUND = (0x1000)+(11), + PDERR_RETDEFFAILURE = (0x1000)+(3), + PDERR_SETUPFAILURE = (0x1000)+(1), + CFERR_MAXLESSTHANMIN = (0x2000)+(2), + CFERR_NOFONTS = (0x2000)+(1), + FNERR_BUFFERTOOSMALL = (0x3000)+(3), + FNERR_INVALIDFILENAME = (0x3000)+(2), + FNERR_SUBCLASSFAILURE = (0x3000)+(1), + FRERR_BUFFERLENGTHZERO = (0x4000)+(1), + LOCALE_SYSTEM_DEFAULT = (0x800), + LOCALE_USER_DEFAULT = (0x400), + NORM_IGNORECASE = (1), + NORM_IGNOREKANATYPE = (65536), + NORM_IGNORENONSPACE = (2), + NORM_IGNORESYMBOLS = (4), + NORM_IGNOREWIDTH = (131072), + SORT_STRINGSORT = (4096), + LCMAP_BYTEREV = (2048), + LCMAP_FULLWIDTH = (8388608), + LCMAP_HALFWIDTH = (4194304), + LCMAP_HIRAGANA = (1048576), + LCMAP_KATAKANA = (2097152), + LCMAP_LOWERCASE = (256), + LCMAP_SORTKEY = (1024), + LCMAP_UPPERCASE = (512), + DBG_CONTINUE = (0x10002), + DBG_CONTROL_BREAK = (0x40010008), + DBG_CONTROL_C = (0x40010005), + DBG_EXCEPTION_NOT_HANDLED = (0x80010001), + DBG_TERMINATE_THREAD = (0x40010003), + DBG_TERMINATE_PROCESS = (0x40010004), + SERVICE_CONTROL_STOP = (1), + SERVICE_CONTROL_PAUSE = (2), + SERVICE_CONTROL_CONTINUE = (3), + SERVICE_CONTROL_INTERROGATE = (4), + SERVICE_CONTROL_SHUTDOWN = (5), + IMAGE_BITMAP = (0), + IMAGE_CURSOR = (2), + IMAGE_ENHMETAFILE = (1), + IMAGE_ICON = (1), + LR_COPYDELETEORG = (8), + LR_COPYRETURNORG = (4), + LR_MONOCHROME = (1), + LR_CREATEDIBSECTION = (8192), + LR_DEFAULTSIZE = (64), + DF_ALLOWOTHERACCOUNTHOOK = (0x1), + DESKTOP_CREATEMENU = (0x4), + DESKTOP_CREATEWINDOW = (0x2), + DESKTOP_ENUMERATE = (0x40), + DESKTOP_HOOKCONTROL = (0x8), + DESKTOP_JOURNALPLAYBACK = (0x20), + DESKTOP_JOURNALRECORD = (0x10), + DESKTOP_READOBJECTS = (0x1), + DESKTOP_SWITCHDESKTOP = (0x100), + DESKTOP_WRITEOBJECTS = (0x80), + WSF_VISIBLE = (0x1), + CBM_INIT = (0x4), + DIB_PAL_COLORS = (1), + DIB_RGB_COLORS = (0), + GENERIC_READ = (0x80000000), + GENERIC_WRITE = (0x40000000), + FILE_READ_DATA = (0x0001), + FILE_LIST_DIRECTORY = (0x0001), + FILE_WRITE_DATA = (0x0002), + FILE_ADD_FILE = (0x0002), + FILE_APPEND_DATA = (0x0004), + FILE_ADD_SUBDIRECTORY = (0x0004), + FILE_CREATE_PIPE_INSTANCE = (0x0004), + FILE_READ_EA = (0x0008), + FILE_READ_PROPERTIES = (FILE_READ_EA), + FILE_WRITE_EA = (0x0010), + FILE_WRITE_PROPERTIES = (FILE_WRITE_EA), + FILE_EXECUTE = (0x0020), + FILE_TRAVERSE = (0x0020), + FILE_DELETE_CHILD = (0x0040), + FILE_READ_ATTRIBUTES = (0x0080), + FILE_WRITE_ATTRIBUTES = (0x0100), + FILE_SHARE_DELETE = (4), + FILE_SHARE_READ = (1), + FILE_SHARE_WRITE = (2), + CONSOLE_TEXTMODE_BUFFER = (1), + CREATE_NEW = (1), + CREATE_ALWAYS = (2), + OPEN_EXISTING = (3), + OPEN_ALWAYS = (4), + TRUNCATE_EXISTING = (5), + INVALID_FILE_ATTRIBUTE = (-1), + FILE_ATTRIBUTE_ARCHIVE = (32), + FILE_ATTRIBUTE_COMPRESSED = (2048), + FILE_ATTRIBUTE_NORMAL = (128), + FILE_ATTRIBUTE_DIRECTORY = (16), + FILE_ATTRIBUTE_HIDDEN = (2), + FILE_ATTRIBUTE_READONLY = (1), + FILE_ATTRIBUTE_SYSTEM = (4), + FILE_ATTRIBUTE_TEMPORARY = (256), + FILE_FLAG_WRITE_THROUGH = (2147483648), + FILE_FLAG_OVERLAPPED = (1073741824), + FILE_FLAG_NO_BUFFERING = (536870912), + FILE_FLAG_RANDOM_ACCESS = (268435456), + FILE_FLAG_SEQUENTIAL_SCAN = (134217728), + FILE_FLAG_DELETE_ON_CLOSE = (67108864), + FILE_FLAG_BACKUP_SEMANTICS = (33554432), + FILE_FLAG_POSIX_SEMANTICS = (16777216), + SECURITY_ANONYMOUS = (0), + SECURITY_IDENTIFICATION = (65536), + SECURITY_IMPERSONATION = (131072), + SECURITY_DELEGATION = (196608), + SECURITY___FILE___TRACKING = (262144), + SECURITY_EFFECTIVE_ONLY = (524288), + SECURITY_SQOS_PRESENT = (1048576), + SEC_COMMIT = (134217728), + SEC_IMAGE = (16777216), + SEC_NOCACHE = (268435456), + SEC_RESERVE = (67108864), + PAGE_READONLY = (2), + PAGE_READWRITE = (4), + PAGE_WRITECOPY = (8), + PAGE_EXECUTE = (16), + PAGE_EXECUTE_READ = (32), + PAGE_EXECUTE_READWRITE = (64), + PAGE_EXECUTE_WRITECOPY = (128), + PAGE_GUARD = (256), + PAGE_NOACCESS = (1), + PAGE_NOCACHE = (512), + MEM_COMMIT = (4096), + MEM_FREE = (65536), + MEM_RESERVE = (8192), + MEM_IMAGE = (16777216), + MEM_MAPPED = (262144), + MEM_PRIVATE = (131072), + MEM_DECOMMIT = (16384), + MEM_RELEASE = (32768), + MEM_TOP_DOWN = (1048576), + EXCEPTION_GUARD_PAGE = (0x80000001), + SECTION_EXTEND_SIZE = (0x10), + SECTION_MAP_READ = (0x4), + SECTION_MAP_WRITE = (0x2), + SECTION_QUERY = (0x1), + SECTION_ALL_ACCESS = (0xf001f), + FW_DONTCARE = (0), + FW_THIN = (100), + FW_EXTRALIGHT = (200), + FW_LIGHT = (300), + FW_NORMAL = (400), + FW_REGULAR = (FW_NORMAL), + FW_MEDIUM = (500), + FW_SEMIBOLD = (600), + FW_BOLD = (700), + FW_EXTRABOLD = (800), + FW_HEAVY = (900), + ANSI_CHARSET = (0), + DEFAULT_CHARSET = (1), + SYMBOL_CHARSET = (2), + SHIFTJIS_CHARSET = (128), + HANGEUL_CHARSET = (129), + GB2312_CHARSET = (134), + CHINESEBIG5_CHARSET = (136), + GREEK_CHARSET = (161), + TURKISH_CHARSET = (162), + HEBREW_CHARSET = (177), + ARABIC_CHARSET = (178), + BALTIC_CHARSET = (186), + RUSSIAN_CHARSET = (204), + THAI_CHARSET = (222), + EASTEUROPE_CHARSET = (238), + OEM_CHARSET = (255), + OUT_DEFAULT_PRECIS = (0), + OUT_STRING_PRECIS = (1), + OUT_CHARACTER_PRECIS = (2), + OUT_STROKE_PRECIS = (3), + OUT_TT_PRECIS = (4), + OUT_DEVICE_PRECIS = (5), + OUT_RASTER_PRECIS = (6), + OUT_TT_ONLY_PRECIS = (7), + OUT_OUTLINE_PRECIS = (8), + CLIP_DEFAULT_PRECIS = (0), + CLIP_CHARACTER_PRECIS = (1), + CLIP_STROKE_PRECIS = (2), + CLIP_MASK = (15), + CLIP_LH_ANGLES = (16), + CLIP_TT_ALWAYS = (32), + CLIP_EMBEDDED = (128), + DEFAULT_QUALITY = (0), + DRAFT_QUALITY = (1), + PROOF_QUALITY = (2), + DEFAULT_PITCH = (0), + FIXED_PITCH = (1), + VARIABLE_PITCH = (2), + FF_DECORATIVE = (80), + FF_DONTCARE = (0), + FF_MODERN = (48), + FF_ROMAN = (16), + FF_SCRIPT = (64), + FF_SWISS = (32), + HS_BDIAGONAL = (3), + HS_CROSS = (4), + HS_DIAGCROSS = (5), + HS_FDIAGONAL = (2), + HS_HORIZONTAL = (0), + HS_VERTICAL = (1), + LR_DEFAULTCOLOR = (0), + LR_LOADREALSIZE = (128), + MAILSLOT_WAIT_FOREVER = (0xffffffff), + MAILSLOT_NO_MESSAGE = (0xffffffff), + CMB_MASKED = (2), + PIPE_ACCESS_DUPLEX = (3), + PIPE_ACCESS_INBOUND = (1), + PIPE_ACCESS_OUTBOUND = (2), + WRITE_DAC = (0x40000), + WRITE_OWNER = (0x80000), + ACCESS_SYSTEM_SECURITY = (0x1000000), + PIPE_TYPE_BYTE = (0), + PIPE_TYPE_MESSAGE = (4), + PIPE_READMODE_BYTE = (0), + PIPE_READMODE_MESSAGE = (2), + PIPE_WAIT = (0), + PIPE_NOWAIT = (1), + PS_GEOMETRIC = (65536), + PS_COSMETIC = (0), + PS_ALTERNATE = (8), + PS_SOLID = (0), + PS_DASH = (1), + PS_DOT = (2), + PS_DASHDOT = (3), + PS_DASHDOTDOT = (4), + PS_NULL = (5), + PS_USERSTYLE = (7), + PS_INSIDEFRAME = (6), + PS_ENDCAP_ROUND = (0), + PS_ENDCAP_SQUARE = (256), + PS_ENDCAP_FLAT = (512), + PS_JOIN_BEVEL = (4096), + PS_JOIN_MITER = (8192), + PS_JOIN_ROUND = (0), + PS_STYLE_MASK = (15), + PS_ENDCAP_MASK = (3840), + PS_TYPE_MASK = (983040), + ALTERNATE = (1), + WINDING = (2), + CREATE_DEFAULT_ERROR_MODE = (67108864), + CREATE_NEW_CONSOLE = (16), + CREATE_NEW_PROCESS_GROUP = (512), + CREATE_SEPARATE_WOW_VDM = (2048), + CREATE_SUSPENDED = (4), + CREATE_UNICODE_ENVIRONMENT = (1024), + DEBUG_PROCESS = (1), + DEBUG_ONLY_THIS_PROCESS = (2), + DETACHED_PROCESS = (8), + HIGH_PRIORITY_CLASS = (128), + IDLE_PRIORITY_CLASS = (64), + NORMAL_PRIORITY_CLASS = (32), + REALTIME_PRIORITY_CLASS = (256), + SERVICE_ALL_ACCESS = (0xf01ff), + SERVICE_CHANGE_CONFIG = (2), + SERVICE_ENUMERATE_DEPENDENTS = (8), + SERVICE_INTERROGATE = (128), + SERVICE_PAUSE_CONTINUE = (64), + SERVICE_QUERY_CONFIG = (1), + SERVICE_QUERY_STATUS = (4), + SERVICE_START = (16), + SERVICE_STOP = (32), + SERVICE_USER_DEFINED_CONTROL = (256), + SERVICE_DELETE = (0x10000), + SERVICE_READ_CONTROL = (0x20000), + SERVICE_GENERIC_EXECUTE = (0x20000000), + SERVICE_ERROR_IGNORE = (0), + SERVICE_ERROR_NORMAL = (1), + SERVICE_ERROR_SEVERE = (2), + SERVICE_ERROR_CRITICAL = (3), + TAPE_FIXED_PARTITIONS = (0), + TAPE_INITIATOR_PARTITIONS = (0x2), + TAPE_SELECT_PARTITIONS = (0x1), + TAPE_FILEMARKS = (0x1), + TAPE_LONG_FILEMARKS = (0x3), + TAPE_SETMARKS = (0), + TAPE_SHORT_FILEMARKS = (0x2), + CW_USEDEFAULT = (0x80000000), + WS_BORDER = (0x800000), + WS_CAPTION = (0xc00000), + WS_CHILD = (0x40000000), + WS_CHILDWINDOW = (0x40000000), + WS_CLIPCHILDREN = (0x2000000), + WS_CLIPSIBLINGS = (0x4000000), + WS_DISABLED = (0x8000000), + WS_DLGFRAME = (0x400000), + WS_GROUP = (0x20000), + WS_HSCROLL = (0x100000), + WS_ICONIC = (0x20000000), + WS_MAXIMIZE = (0x1000000), + WS_MAXIMIZEBOX = (0x10000), + WS_MINIMIZE = (0x20000000), + WS_MINIMIZEBOX = (0x20000), + WS_OVERLAPPED = (0), + WS_OVERLAPPEDWINDOW = (0xcf0000), + WS_POPUP = (0x80000000), + WS_POPUPWINDOW = (0x80880000), + WS_SIZEBOX = (0x40000), + WS_SYSMENU = (0x80000), + WS_TABSTOP = (0x10000), + WS_THICKFRAME = (0x40000), + WS_TILED = (0), + WS_TILEDWINDOW = (0xcf0000), + WS_VISIBLE = (0x10000000), + WS_VSCROLL = (0x200000), + MDIS_ALLCHILDSTYLES = (0x1), + BS_3STATE = (0x5), + BS_AUTO3STATE = (0x6), + BS_AUTOCHECKBOX = (0x3), + BS_AUTORADIOBUTTON = (0x9), + BS_BITMAP = (0x80), + BS_BOTTOM = (0x800), + BS_CENTER = (0x300), + BS_CHECKBOX = (0x2), + BS_DEFPUSHBUTTON = (0x1), + BS_GROUPBOX = (0x7), + BS_ICON = (0x40), + BS_LEFT = (0x100), + BS_LEFTTEXT = (0x20), + BS_MULTILINE = (0x2000), + BS_NOTIFY = (0x4000), + BS_OWNERDRAW = (0xb), + BS_PUSHBUTTON = (0), + BS_PUSHLIKE = (0x1000), + BS_RADIOBUTTON = (0x4), + BS_RIGHT = (0x200), + BS_RIGHTBUTTON = (0x20), + BS_TEXT = (0), + BS_TOP = (0x400), + BS_USERBUTTON = (0x8), + BS_VCENTER = (0xc00), + CBS_AUTOHSCROLL = (0x40), + CBS_DISABLENOSCROLL = (0x800), + CBS_DROPDOWN = (0x2), + CBS_DROPDOWNLIST = (0x3), + CBS_HASSTRINGS = (0x200), + CBS_LOWERCASE = (0x4000), + CBS_NOINTEGRALHEIGHT = (0x400), + CBS_OEMCONVERT = (0x80), + CBS_OWNERDRAWFIXED = (0x10), + CBS_OWNERDRAWVARIABLE = (0x20), + CBS_SIMPLE = (0x1), + CBS_SORT = (0x100), + CBS_UPPERCASE = (0x2000), + ES_AUTOHSCROLL = (0x80), + ES_AUTOVSCROLL = (0x40), + ES_CENTER = (0x1), + ES_LEFT = (0), + ES_LOWERCASE = (0x10), + ES_MULTILINE = (0x4), + ES_NOHIDESEL = (0x100), + ES_NUMBER = (0x2000), + ES_OEMCONVERT = (0x400), + ES_PASSWORD = (0x20), + ES_READONLY = (0x800), + ES_RIGHT = (0x2), + ES_UPPERCASE = (0x8), + ES_WANTRETURN = (0x1000), + LBS_DISABLENOSCROLL = (0x1000), + LBS_EXTENDEDSEL = (0x800), + LBS_HASSTRINGS = (0x40), + LBS_MULTICOLUMN = (0x200), + LBS_MULTIPLESEL = (0x8), + LBS_NODATA = (0x2000), + LBS_NOINTEGRALHEIGHT = (0x100), + LBS_NOREDRAW = (0x4), + LBS_NOSEL = (0x4000), + LBS_NOTIFY = (0x1), + LBS_OWNERDRAWFIXED = (0x10), + LBS_OWNERDRAWVARIABLE = (0x20), + LBS_SORT = (0x2), + LBS_STANDARD = (0xa00003), + LBS_USETABSTOPS = (0x80), + LBS_WANTKEYBOARDINPUT = (0x400), + SBS_BOTTOMALIGN = (0x4), + SBS_HORZ = (0), + SBS_LEFTALIGN = (0x2), + SBS_RIGHTALIGN = (0x4), + SBS_SIZEBOX = (0x8), + SBS_SIZEBOXBOTTOMRIGHTALIGN = (0x4), + SBS_SIZEBOXTOPLEFTALIGN = (0x2), + SBS_SIZEGRIP = (0x10), + SBS_TOPALIGN = (0x2), + SBS_VERT = (0x1), + SS_BITMAP = (0xe), + SS_BLACKFRAME = (0x7), + SS_BLACKRECT = (0x4), + SS_CENTER = (0x1), + SS_CENTERIMAGE = (0x200), + SS_ENHMETAFILE = (0xf), + SS_ETCHEDFRAME = (0x12), + SS_ETCHEDHORZ = (0x10), + SS_ETCHEDVERT = (0x11), + SS_GRAYFRAME = (0x8), + SS_GRAYRECT = (0x5), + SS_ICON = (0x3), + SS_LEFT = (0), + SS_LEFTNOWORDWRAP = (0xc), + SS_NOPREFIX = (0x80), + SS_NOTIFY = (0x100), + SS_OWNERDRAW = (0xd), + SS_REALSIZEIMAGE = (0x800), + SS_RIGHT = (0x2), + SS_RIGHTJUST = (0x400), + SS_SIMPLE = (0xb), + SS_SUNKEN = (0x1000), + SS_USERITEM = (0xa), + SS_WHITEFRAME = (0x9), + SS_WHITERECT = (0x6), + DS_3DLOOK = (0x4), + DS_ABSALIGN = (0x1), + DS_CENTER = (0x800), + DS_CENTERMOUSE = (0x1000), + DS___FILE__HELP = (0x2000), + DS_CONTROL = (0x400), + DS_FIXEDSYS = (0x8), + DS_LOCALEDIT = (0x20), + DS_MODALFRAME = (0x80), + DS_NOFAILCREATE = (0x10), + DS_NOIDLEMSG = (0x100), + DS_SETFONT = (0x40), + DS_SETFOREGROUND = (0x200), + DS_SYSMODAL = (0x2), + WS_EX_ACCEPTFILES = (0x10), + WS_EX_APPWINDOW = (0x40000), + WS_EX_CLIENTEDGE = (0x200), + WS_EX___FILE__HELP = (0x400), + WS_EX_CONTROLPARENT = (0x10000), + WS_EX_DLGMODALFRAME = (0x1), + WS_EX_LEFT = (0), + WS_EX_LEFTSCROLLBAR = (0x4000), + WS_EX_LTRREADING = (0), + WS_EX_MDICHILD = (0x40), + WS_EX_NOPARENTNOTIFY = (0x4), + WS_EX_OVERLAPPEDWINDOW = (0x300), + WS_EX_PALETTEWINDOW = (0x188), + WS_EX_RIGHT = (0x1000), + WS_EX_RIGHTSCROLLBAR = (0), + WS_EX_RTLREADING = (0x2000), + WS_EX_STATICEDGE = (0x20000), + WS_EX_TOOLWINDOW = (0x80), + WS_EX_TOPMOST = (0x8), + WS_EX_TRANSPARENT = (0x20), + WS_EX_WINDOWEDGE = (0x100), + WINSTA_ACCESSCLIPBOARD = (0x4), + WINSTA_ACCESSGLOBALATOMS = (0x20), + WINSTA_CREATEDESKTOP = (0x8), + WINSTA_ENUMDESKTOPS = (0x1), + WINSTA_ENUMERATE = (0x100), + WINSTA_EXITWINDOWS = (0x40), + WINSTA_READATTRIBUTES = (0x2), + WINSTA_READSCREEN = (0x200), + WINSTA_WRITEATTRIBUTES = (0x10), + WH_CALLWNDPROC = (4), + WH_CALLWNDPROCRET = (12), + WH_CBT = (5), + WH_DEBUG = (9), + WH_GETMESSAGE = (3), + WH_JOURNALPLAYBACK = (1), + WH_JOURNALRECORD = (0), + WH_KEYBOARD = (2), + WH_MOUSE = (7), + WH_MSGFILTER = -((1)), + WH_SHELL = (10), + WH_SYSMSGFILTER = (6), + WH_FOREGROUNDIDLE = (11), + DDD_RAW_TARGET_PATH = (1), + DDD_REMOVE_DEFINITION = (2), + DDD_EXACT_MATCH_ON_REMOVE = (4), + DC_BINNAMES = (12), + DC_BINS = (6), + DC_COPIES = (18), + DC_DRIVER = (11), + DC_DATATYPE_PRODUCED = (21), + DC_DUPLEX = (7), + DC_EMF_COMPLIANT = (20), + DC_ENUMRESOLUTIONS = (13), + DC_EXTRA = (9), + DC_FIELDS = (1), + DC_FILEDEPENDENCIES = (14), + DC_MAXEXTENT = (5), + DC_MINEXTENT = (4), + DC_ORIENTATION = (17), + DC_PAPERNAMES = (16), + DC_PAPERS = (2), + DC_PAPERSIZE = (3), + DC_SIZE = (8), + DC_TRUETYPE = (15), + DCTT_BITMAP = (0x1), + DCTT_DOWNLOAD = (0x2), + DCTT_SUBDEV = (0x4), + DC_VERSION = (10), + DC_BINADJUST = (19), + DDL_ARCHIVE = (32), + DDL_DIRECTORY = (16), + DDL_DRIVES = (16384), + DDL_EXCLUSIVE = (32768), + DDL_HIDDEN = (2), + DDL_READONLY = (1), + DDL_READWRITE = (0), + DDL_SYSTEM = (4), + DDL_POSTMSGS = (8192), + DLL_PROCESS_ATTACH = (1), + DLL_THREAD_ATTACH = (2), + DLL_PROCESS_DETACH = (0), + DLL_THREAD_DETACH = (3), + DM_IN_BUFFER = (8), + DM_MODIFY = (8), + DM_IN_PROMPT = (4), + DM_PROMPT = (4), + DM_OUT_BUFFER = (2), + DM_COPY = (2), + DM_UPDATE = (1), + IDANI_OPEN = (1), + IDANI_CLOSE = (2), + DC_ACTIVE = (1), + DC_SMALLCAP = (2), + BDR_RAISEDINNER = (4), + BDR_SUNKENINNER = (8), + BDR_RAISEDOUTER = (1), + BDR_SUNKENOUTER = (1), + EDGE_BUMP = (9), + EDGE_ETCHED = (6), + EDGE_RAISED = (5), + EDGE_SUNKEN = (10), + BF_ADJUST = (8192), + BF_BOTTOM = (8), + BF_BOTTOMLEFT = (9), + BF_BOTTOMRIGHT = (12), + BF_DIAGONAL = (16), + BF_DIAGONAL_ENDBOTTOMLEFT = (25), + BF_DIAGONAL_ENDBOTTOMRIGHT = (28), + BF_DIAGONAL_ENDTOPLEFT = (19), + BF_DIAGONAL_ENDTOPRIGHT = (22), + BF_FLAT = (16384), + BF_LEFT = (1), + BF_MIDDLE = (2048), + BF_MONO = (32768), + BF_RECT = (15), + BF_RIGHT = (4), + BF_SOFT = (4096), + BF_TOP = (2), + BF_TOPLEFT = (3), + BF_TOPRIGHT = (6), + DFC_BUTTON = (4), + DFC_CAPTION = (1), + DFC_MENU = (2), + DFC_SCROLL = (3), + DFCS_BUTTON3STATE = (8), + DFCS_BUTTONCHECK = (0), + DFCS_BUTTONPUSH = (16), + DFCS_BUTTONRADIO = (4), + DFCS_BUTTONRADIOIMAGE = (1), + DFCS_BUTTONRADIOMASK = (2), + DFCS_CAPTIONCLOSE = (0), + DFCS_CAPTIONHELP = (4), + DFCS_CAPTIONMAX = (2), + DFCS_CAPTIONMIN = (1), + DFCS_CAPTIONRESTORE = (3), + DFCS_MENUARROW = (0), + DFCS_MENUBULLET = (2), + DFCS_MENUCHECK = (1), + DFCS_SCROLLCOMBOBOX = (5), + DFCS_SCROLLDOWN = (1), + DFCS_SCROLLLEFT = (2), + DFCS_SCROLLRIGHT = (3), + DFCS_SCROLLSIZEGRIP = (8), + DFCS_SCROLLUP = (0), + DFCS_ADJUSTRECT = (8192), + DFCS_CHECKED = (1024), + DFCS_FLAT = (16384), + DFCS_INACTIVE = (256), + DFCS_MONO = (32768), + DFCS_PUSHED = (512), + DI_COMPAT = (4), + DI_DEFAULTSIZE = (8), + DI_IMAGE = (2), + DI_MASK = (1), + DI_NORMAL = (3), + DST_BITMAP = (4), + DST_COMPLEX = (0), + DST_ICON = (3), + DST_PREFIXTEXT = (2), + DST_TEXT = (1), + DSS_NORMAL = (0), + DSS_UNION = (16), + DSS_DISABLED = (32), + DSS_MONO = (128), + SBT_NOBORDERS = (256), + SBT_OWNERDRAW = (4096), + SBT_POPOUT = (512), + SBT_RTLREADING = (1024), + DT_BOTTOM = (8), + DT_CALCRECT = (1024), + DT_CENTER = (1), + DT_EDITCONTROL = (8192), + DT_END_ELLIPSIS = (32768), + DT_PATH_ELLIPSIS = (16384), + DT_EXPANDTABS = (64), + DT_EXTERNALLEADING = (512), + DT_LEFT = (0), + DT_MODIFYSTRING = (65536), + DT_NOCLIP = (256), + DT_NOPREFIX = (2048), + DT_RIGHT = (2), + DT_RTLREADING = (131072), + DT_SINGLELINE = (32), + DT_TABSTOP = (128), + DT_TOP = (0), + DT_VCENTER = (4), + DT_WORDBREAK = (16), + DT_INTERNAL = (4096), + DUPLICATE_CLOSE_SOURCE = (1), + DUPLICATE_SAME_ACCESS = (2), + FILE_MAP_ALL_ACCESS = (0xf001f), + FILE_MAP_READ = (4), + FILE_MAP_WRITE = (2), + FILE_MAP_COPY = (1), + MUTEX_ALL_ACCESS = (0x1f0001), + MUTEX_MODIFY_STATE = (1), + SYNCHRONIZE = (0x100000), + SEMAPHORE_ALL_ACCESS = (0x1f0003), + SEMAPHORE_MODIFY_STATE = (2), + EVENT_ALL_ACCESS = (0x1f0003), + EVENT_MODIFY_STATE = (2), + KEY_ALL_ACCESS = (0xf003f), + KEY_CREATE_LINK = (32), + KEY_CREATE_SUB_KEY = (4), + KEY_ENUMERATE_SUB_KEYS = (8), + KEY_EXECUTE = (0x20019), + KEY_NOTIFY = (16), + KEY_QUERY_VALUE = (1), + KEY_READ = (0x20019), + KEY_SET_VALUE = (2), + KEY_WRITE = (0x20006), + PROCESS_ALL_ACCESS = (0x1f0fff), + PROCESS_CREATE_PROCESS = (128), + PROCESS_CREATE_THREAD = (2), + PROCESS_DUP_HANDLE = (64), + PROCESS_QUERY_INFORMATION = (1024), + PROCESS_SET_INFORMATION = (512), + PROCESS_TERMINATE = (1), + PROCESS_VM_OPERATION = (8), + PROCESS_VM_READ = (16), + PROCESS_VM_WRITE = (32), + THREAD_ALL_ACCESS = (0x1f03ff), + THREAD_DIRECT_IMPERSONATION = (512), + THREAD_GET___FILE__ = (8), + THREAD_IMPERSONATE = (256), + THREAD_QUERY_INFORMATION = (64), + THREAD_SET___FILE__ = (16), + THREAD_SET_INFORMATION = (32), + THREAD_SET_THREAD_TOKEN = (128), + THREAD_SUSPEND_RESUME = (2), + THREAD_TERMINATE = (1), + WB_ISDELIMITER = (2), + WB_LEFT = (0), + WB_RIGHT = (1), + SB_BOTH = (3), + SB_CTL = (2), + SB_HORZ = (0), + SB_VERT = (1), + ESB_DISABLE_BOTH = (3), + ESB_DISABLE_DOWN = (2), + ESB_DISABLE_LEFT = (1), + ESB_DISABLE_LTUP = (1), + ESB_DISABLE_RIGHT = (2), + ESB_DISABLE_RTDN = (2), + ESB_DISABLE_UP = (1), + ESB_ENABLE_BOTH = (0), + SB_LINEUP = (0), + SB_LINEDOWN = (1), + SB_LINELEFT = (0), + SB_LINERIGHT = (1), + SB_PAGEUP = (2), + SB_PAGEDOWN = (3), + SB_PAGELEFT = (2), + SB_PAGERIGHT = (3), + SB_THUMBPOSITION = (4), + SB_THUMBTRACK = (5), + SB_ENDSCROLL = (8), + SB_LEFT = (6), + SB_RIGHT = (7), + SB_BOTTOM = (7), + SB_TOP = (6), + ENUM_ALL_CALENDARS = -((1)), + DATE_SHORTDATE = (1), + DATE_LONGDATE = (2), + SERVICE_ACTIVE = (1), + SERVICE_INACTIVE = (2), + DEVICE_FONTTYPE = (2), + RASTER_FONTTYPE = (1), + TRUETYPE_FONTTYPE = (4), + OBJ_BRUSH = (2), + OBJ_PEN = (1), + OBJ_PAL = (5), + OBJ_FONT = (6), + OBJ_BITMAP = (7), + OBJ_EXTPEN = (11), + OBJ_REGION = (8), + OBJ_DC = (3), + OBJ_MEMDC = (10), + OBJ_METAFILE = (9), + OBJ_METADC = (4), + OBJ_ENHMETAFILE = (13), + OBJ_ENHMETADC = (12), + SERVICE_WIN32 = (48), + SERVICE_DRIVER = (11), + CP_INSTALLED = (1), + CP_SUPPORTED = (2), + LCID_INSTALLED = (1), + LCID_SUPPORTED = (2), + TAPE_ERASE_LONG = (0x1), + TAPE_ERASE_SHORT = (0), + SP_ERROR = -((1)), + SP_OUTOFDISK = -((4)), + SP_OUTOFMEMORY = -((5)), + SP_USERABORT = -((3)), + PHYSICALWIDTH = (110), + PHYSICALHEIGHT = (111), + PHYSICALOFFSETX = (112), + PHYSICALOFFSETY = (113), + SCALINGFACTORX = (114), + SCALINGFACTORY = (115), + QUERYESCSUPPORT = (8), + cABORTDOC = (2), + cENDDOC = (11), + GETPHYSPAGESIZE = (12), + GETPRINTINGOFFSET = (13), + GETSCALINGFACTOR = (14), + NEWFRAME = (1), + NEXTBAND = (3), + PASSTHROUGH = (19), + cSETABORTPROC = (9), + cSTARTDOC = (10), + CLRDTR = (6), + CLRRTS = (4), + SETDTR = (5), + SETRTS = (3), + SETXOFF = (1), + SETXON = (2), + SETBREAK = (8), + CLRBREAK = (9), + EWX_FORCE = (4), + EWX_LOGOFF = (0), + EWX_POWEROFF = (8), + EWX_REBOOT = (2), + EWX_SHUTDOWN = (1), + FLOODFILLBORDER = (0), + FLOODFILLSURFACE = (1), + ETO_CLIPPED = (4), + ETO_GLYPH_INDEX = (16), + ETO_OPAQUE = (2), + ETO_RTLREADING = (128), + FOREGROUND_BLUE = (1), + FOREGROUND_GREEN = (2), + FOREGROUND_RED = (4), + FOREGROUND_INTENSITY = (8), + BACKGROUND_BLUE = (16), + BACKGROUND_GREEN = (32), + BACKGROUND_RED = (64), + BACKGROUND_INTENSITY = (128), + FILE_NOTIFY_CHANGE_FILE_NAME = (1), + FILE_NOTIFY_CHANGE_DIR_NAME = (2), + FILE_NOTIFY_CHANGE_ATTRIBUTES = (4), + FILE_NOTIFY_CHANGE_SIZE = (8), + FILE_NOTIFY_CHANGE_LAST_WRITE = (16), + FILE_NOTIFY_CHANGE_SECURITY = (256), + MAP_FOLDCZONE = (16), + MAP_FOLDDIGITS = (128), + MAP_PRECOMPOSED = (32), + MAP_COMPOSITE = (64), + HC_ACTION = (0), + FORMAT_MESSAGE_ALLOCATE_BUFFER = (256), + FORMAT_MESSAGE_IGNORE_INSERTS = (512), + FORMAT_MESSAGE_FROM_STRING = (1024), + FORMAT_MESSAGE_FROM_HMODULE = (2048), + FORMAT_MESSAGE_FROM_SYSTEM = (4096), + FORMAT_MESSAGE_ARGUMENT_ARRAY = (8192), + FORMAT_MESSAGE_MAX_WIDTH_MASK = (255), + GDICOMMENT_WINDOWS_METAFILE = -((2147483647)), + GDICOMMENT_BEGINGROUP = (2), + GDICOMMENT_ENDGROUP = (3), + GDICOMMENT_MULTIFORMATS = (1073741828), + GDICOMMENT_IDENTIFIER = (1128875079), + CTRL_C_EVENT = (0), + CTRL_BREAK_EVENT = (1), + CTRL_CLOSE_EVENT = (2), + CTRL_LOGOFF_EVENT = (5), + CTRL_SHUTDOWN_EVENT = (6), + AD_COUNTERCLOCKWISE = (1), + AD_CLOCKWISE = (2), + SCS_32BIT_BINARY = (0), + SCS_DOS_BINARY = (1), + SCS_OS216_BINARY = (5), + SCS_PIF_BINARY = (3), + SCS_POSIX_BINARY = (4), + SCS_WOW_BINARY = (2), + DCB_DISABLE = (8), + DCB_ENABLE = (4), + DCB_RESET = (1), + DCB_SET = (3), + DCB_ACCUMULATE = (2), + GCP_DBCS = (1), + GCP_ERROR = (0x8000), + GCP_CLASSIN = (0x80000), + GCP_DIACRITIC = (256), + GCP_DISPLAYZWG = (0x400000), + GCP_GLYPHSHAPE = (16), + GCP_JUSTIFY = (0x10000), + GCP_JUSTIFYIN = (0x200000), + GCP_KASHIDA = (1024), + GCP_LIGATE = (32), + GCP_MAXEXTENT = (0x100000), + GCP_NEUTRALOVERRIDE = (0x2000000), + GCP_NUMERICOVERRIDE = (0x1000000), + GCP_NUMERICSLATIN = (0x4000000), + GCP_NUMERICSLOCAL = (0x8000000), + GCP_REORDER = (2), + GCP_SYMSWAPOFF = (0x800000), + GCP_USEKERNING = (8), + FLI_GLYPHS = (0x40000), + FLI_MASK = (0x103b), + GCW_ATOM = -((32)), + GCL_CBCLSEXTRA = -((20)), + GCL_CBWNDEXTRA = -((18)), + GCL_HBRBACKGROUND = -((10)), + GCL_HCURSOR = -((12)), + GCL_HICON = -((14)), + GCL_HICONSM = -((34)), + GCL_HMODULE = -((16)), + GCL_MENUNAME = -((8)), + GCL_STYLE = -((26)), + GCL_WNDPROC = -((24)), + CF_BITMAP = (2), + CF_DIB = (8), + CF_PALETTE = (9), + CF_ENHMETAFILE = (14), + CF_METAFILEPICT = (3), + CF_OEMTEXT = (7), + CF_TEXT = (1), + CF_UNICODETEXT = (13), + CF_DIF = (5), + CF_DSPBITMAP = (130), + CF_DSPENHMETAFILE = (142), + CF_DSPMETAFILEPICT = (131), + CF_DSPTEXT = (129), + CF_GDIOBJFIRST = (768), + CF_GDIOBJLAST = (1023), + CF_HDROP = (15), + CF_LOCALE = (16), + CF_OWNERDISPLAY = (128), + CF_PENDATA = (10), + CF_PRIVATEFIRST = (512), + CF_PRIVATELAST = (767), + CF_RIFF = (11), + CF_SYLK = (4), + CF_WAVE = (12), + CF_TIFF = (6), + EV_BREAK = (64), + EV_CTS = (8), + EV_DSR = (16), + EV_ERR = (128), + EV_EVENT1 = (2048), + EV_EVENT2 = (4096), + EV_PERR = (512), + EV_RING = (256), + EV_RLSD = (32), + EV_RX80FULL = (1024), + EV_RXCHAR = (1), + EV_RXFLAG = (2), + EV_TXEMPTY = (4), + MS_CTS_ON = (0x10), + MS_DSR_ON = (0x20), + MS_RING_ON = (0x40), + MS_RLSD_ON = (0x80), + MAX_COMPUTERNAME_LENGTH = (15), + ENABLE_LINE_INPUT = (2), + ENABLE_ECHO_INPUT = (4), + ENABLE_PROCESSED_INPUT = (1), + ENABLE_WINDOW_INPUT = (8), + ENABLE_MOUSE_INPUT = (16), + ENABLE_PROCESSED_OUTPUT = (1), + ENABLE_WRAP_AT_EOL_OUTPUT = (2), + CP_ACP = (0), + CP_MACCP = (2), + CP_OEMCP = (1), + CP_UTF8 = 65001, + DATE_USE_ALT_CALENDAR = (4), + DCX_WINDOW = (0x1), + DCX_CACHE = (0x2), + DCX_PARENTCLIP = (0x20), + DCX_CLIPSIBLINGS = (0x10), + DCX_CLIPCHILDREN = (0x8), + DCX_NORESETATTRS = (0x4), + DCX_LOCKWINDOWUPDATE = (0x400), + DCX_EXCLUDERGN = (0x40), + DCX_INTERSECTRGN = (0x80), + DCX_VALIDATE = (0x200000), + DRIVERVERSION = (0), + TECHNOLOGY = (2), + DT_PLOTTER = (0), + DT_RASDISPLAY = (1), + DT_RASPRINTER = (2), + DT_RASCAMERA = (3), + DT_CHARSTREAM = (4), + DT_METAFILE = (5), + DT_DISPFILE = (6), + HORZSIZE = (4), + VERTSIZE = (6), + HORZRES = (8), + VERTRES = (10), + LOGPIXELSX = (88), + LOGPIXELSY = (90), + BITSPIXEL = (12), + PLANES = (14), + NUMBRUSHES = (16), + NUMPENS = (18), + NUMFONTS = (22), + NUMCOLORS = (24), + ASPECTX = (40), + ASPECTY = (42), + ASPECTXY = (44), + PDEVICESIZE = (26), + CLIPCAPS = (36), + SIZEPALETTE = (104), + NUMRESERVED = (106), + COLORRES = (108), + VREFRESH = (116), + DESKTOPHORZRES = (118), + DESKTOPVERTRES = (117), + BLTALIGNMENT = (119), + RASTERCAPS = (38), + RC_BANDING = (2), + RC_BITBLT = (1), + RC_BITMAP64 = (8), + RC_DI_BITMAP = (128), + RC_DIBTODEV = (512), + RC_FLOODFILL = (4096), + RC_GDI20_OUTPUT = (16), + RC_PALETTE = (256), + RC_SCALING = (4), + RC_STRETCHBLT = (2048), + RC_STRETCHDIB = (8192), + CURVECAPS = (28), + CC_NONE = (0), + CC_CIRCLES = (1), + CC_PIE = (2), + CC_CHORD = (4), + CC_ELLIPSES = (8), + CC_WIDE = (16), + CC_STYLED = (32), + CC_WIDESTYLED = (64), + CC_INTERIORS = (128), + CC_ROUNDRECT = (256), + LINECAPS = (30), + LC_NONE = (0), + LC_POLYLINE = (2), + LC_MARKER = (4), + LC_POLYMARKER = (8), + LC_WIDE = (16), + LC_STYLED = (32), + LC_WIDESTYLED = (64), + LC_INTERIORS = (128), + POLYGONALCAPS = (32), + PC_NONE = (0), + PC_POLYGON = (1), + PC_RECTANGLE = (2), + PC_WINDPOLYGON = (4), + PC_SCANLINE = (8), + PC_WIDE = (16), + PC_STYLED = (32), + PC_WIDESTYLED = (64), + PC_INTERIORS = (128), + TEXTCAPS = (34), + TC_OP_CHARACTER = (1), + TC_OP_STROKE = (2), + TC_CP_STROKE = (4), + TC_CR_90 = (8), + TC_CR_ANY = (16), + TC_SF_X_YINDEP = (32), + TC_SA_DOUBLE = (64), + TC_SA_INTEGER = (128), + TC_SA_CONTIN = (256), + TC_EA_DOUBLE = (512), + TC_IA_ABLE = (1024), + TC_UA_ABLE = (2048), + TC_SO_ABLE = (4096), + TC_RA_ABLE = (8192), + TC_VA_ABLE = (16384), + TC_RESERVED = (32768), + TC_SCROLLBLT = (65536), + PC_PATHS = (512), + DRIVE_REMOVABLE = (2), + DRIVE_FIXED = (3), + DRIVE_REMOTE = (4), + DRIVE_CDROM = (5), + DRIVE_RAMDISK = (6), + DRIVE_UNKNOWN = (0), + DRIVE_NO_ROOT_DIR = (1), + EXCEPTION_ACCESS_VIOLATION = (0xc0000005), + EXCEPTION_BREAKPOINT = (0x80000003), + EXCEPTION_DATATYPE_MISALIGNMENT = (0x80000002), + EXCEPTION_SINGLE_STEP = (0x80000004), + EXCEPTION_ARRAY_BOUNDS_EXCEEDED = (0xc000008c), + EXCEPTION_FLT_DENORMAL_OPERAND = (0xc000008d), + EXCEPTION_FLT_DIVIDE_BY_ZERO = (0xc000008e), + EXCEPTION_FLT_INEXACT_RESULT = (0xc000008f), + EXCEPTION_FLT_INVALID_OPERATION = (0xc0000090), + EXCEPTION_FLT_OVERFLOW = (0xc0000091), + EXCEPTION_FLT_STACK_CHECK = (0xc0000092), + EXCEPTION_FLT_UNDERFLOW = (0xc0000093), + EXCEPTION_INT_DIVIDE_BY_ZERO = (0xc0000094), + EXCEPTION_INT_OVERFLOW = (0xc0000095), + EXCEPTION_INVALID_HANDLE = (0xc0000008), + EXCEPTION_PRIV_INSTRUCTION = (0xc0000096), + EXCEPTION_NONCONTINUABLE_EXCEPTION = (0xc0000025), + EXCEPTION_NONCONTINUABLE = (0x1), + EXCEPTION_STACK_OVERFLOW = (0xc00000fd), + EXCEPTION_INVALID_DISPOSITION = (0xc0000026), + FILE_TYPE_UNKNOWN = (0), + FILE_TYPE_DISK = (1), + FILE_TYPE_CHAR = (2), + FILE_TYPE_PIPE = (3), + GGO_BITMAP = (1), + GGO_NATIVE = (2), + GGO_METRICS = (0), + GGO_GRAY2_BITMAP = (4), + GGO_GRAY4_BITMAP = (5), + GGO_GRAY8_BITMAP = (6), + GDI_ERROR = (0xffffffff), + GM_COMPATIBLE = (1), + GM_ADVANCED = (2), + HANDLE_FLAG_INHERIT = (1), + HANDLE_FLAG_PROTECT_FROM_CLOSE = (2), +} +char* RT_ACCELERATOR = cast(char*) ((9)); +char* RT_BITMAP = cast(char*) ((2)); +char* RT_DIALOG = cast(char*) ((5)); +char* RT_FONT = cast(char*) ((8)); +char* RT_FONTDIR = cast(char*) ((7)); +char* RT_MENU = cast(char*) ((4)); +char* RT_RCDATA = cast(char*) ((10)); +char* RT_STRING = cast(char*) ((6)); +char* RT_MESSAGETABLE = cast(char*) ((11)); +char* RT_CURSOR = cast(char*) ((1)); +char* RT_GROUP_CURSOR = cast(char*) ((12)); +char* RT_ICON = cast(char*) ((3)); +char* RT_GROUP_ICON = cast(char*) ((13)); +char* RT_VERSION = cast(char*) ((16)); +char* IDC_ARROW = cast(char*) ((32512)); +char* IDC_IBEAM = cast(char*) ((32513)); +char* IDC_WAIT = cast(char*) ((32514)); +char* IDC_CROSS = cast(char*) ((32515)); +char* IDC_UPARROW = cast(char*) ((32516)); +char* IDC_SIZENWSE = cast(char*) ((32642)); +char* IDC_SIZENESW = cast(char*) ((32643)); +char* IDC_SIZEWE = cast(char*) ((32644)); +char* IDC_SIZENS = cast(char*) ((32645)); +char* IDC_SIZEALL = cast(char*) ((32646)); +char* IDC_NO = cast(char*) ((32648)); +char* IDC_APPSTARTING = cast(char*) ((32650)); +char* IDC_HELP = cast(char*) ((32651)); +char* IDI_APPLICATION = cast(char*) ((32512)); +char* IDI_HAND = cast(char*) ((32513)); +char* IDI_QUESTION = cast(char*) ((32514)); +char* IDI_EXCLAMATION = cast(char*) ((32515)); +char* IDI_ASTERISK = cast(char*) ((32516)); +char* IDI_WINLOGO = cast(char*) ((32517)); +char* IDC_SIZE = cast(char*) ((32640)); +char* IDC_ICON = cast(char*) ((32641)); +enum : DWORD { + MM_ANISOTROPIC = (8), + MM_HIENGLISH = (5), + MM_HIMETRIC = (3), + MM_ISOTROPIC = (7), + MM_LOENGLISH = (4), + MM_LOMETRIC = (2), + MM_TEXT = (1), + MM_TWIPS = (6), + GMDI_GOINTOPOPUPS = (0x2), + GMDI_USEDISABLED = (0x1), + PM_NOREMOVE = (0), + PM_REMOVE = (1), + PM_NOYIELD = (2), + PIPE_CLIENT_END = (0), + PIPE_SERVER_END = (1), + GW_HWNDNEXT = (2), + GW_HWNDPREV = (3), + GW_CHILD = (5), + GW_HWNDFIRST = (0), + GW_HWNDLAST = (1), + GW_OWNER = (4), + PT_MOVETO = (6), + PT_LINETO = (2), + PT_BEZIERTO = (4), + PT_CLOSEFIGURE = (1), + SHUTDOWN_NORETRY = (1), + QS_ALLEVENTS = (191), + QS_ALLINPUT = (255), + QS_HOTKEY = (128), + QS_INPUT = (7), + QS_KEY = (1), + QS_MOUSE = (6), + QS_MOUSEBUTTON = (4), + QS_MOUSEMOVE = (2), + QS_PAINT = (32), + QS_POSTMESSAGE = (8), + QS_SENDMESSAGE = (64), + QS_TIMER = (16), + SIF_ALL = (23), + SIF_PAGE = (2), + SIF_POS = (4), + SIF_RANGE = (1), + SIF_DISABLENOSCROLL = (8), + STD_INPUT_HANDLE = -(10), + STD_OUTPUT_HANDLE = -(11), + STD_ERROR_HANDLE = -(12), + BLACK_BRUSH = (4), + DKGRAY_BRUSH = (3), + GRAY_BRUSH = (2), + HOLLOW_BRUSH = (5), + LTGRAY_BRUSH = (1), + NULL_BRUSH = (5), + WHITE_BRUSH = (0), + BLACK_PEN = (7), + NULL_PEN = (8), + WHITE_PEN = (6), + ANSI_FIXED_FONT = (11), + ANSI_VAR_FONT = (12), + DEVICE_DEFAULT_FONT = (14), + DEFAULT_GUI_FONT = (17), + OEM_FIXED_FONT = (10), + SYSTEM_FONT = (13), + SYSTEM_FIXED_FONT = (16), + DEFAULT_PALETTE = (15), + CT_CTYPE1 = (1), + CT_CTYPE2 = (2), + CT_CTYPE3 = (4), + C1_UPPER = (1), + C1_LOWER = (2), + C1_DIGIT = (4), + C1_SPACE = (8), + C1_PUNCT = (16), + C1_CNTRL = (32), + C1_BLANK = (64), + C1_XDIGIT = (128), + C1_ALPHA = (256), + C2_LEFTTORIGHT = (1), + C2_RIGHTTOLEFT = (2), + C2_EUROPENUMBER = (3), + C2_EUROPESEPARATOR = (4), + C2_EUROPETERMINATOR = (5), + C2_ARABICNUMBER = (6), + C2_COMMONSEPARATOR = (7), + C2_BLOCKSEPARATOR = (8), + C2_SEGMENTSEPARATOR = (9), + C2_WHITESPACE = (10), + C2_OTHERNEUTRAL = (11), + C2_NOTAPPLICABLE = (0), + C3_NONSPACING = (1), + C3_DIACRITIC = (2), + C3_VOWELMARK = (4), + C3_SYMBOL = (8), + C3_KATAKANA = (16), + C3_HIRAGANA = (32), + C3_HALFWIDTH = (64), + C3_FULLWIDTH = (128), + C3_IDEOGRAPH = (256), + C3_KASHIDA = (512), + C3_ALPHA = (32768), + C3_NOTAPPLICABLE = (0), + COLOR_3DDKSHADOW = (21), + COLOR_3DFACE = (15), + COLOR_3DHILIGHT = (20), + COLOR_3DLIGHT = (22), + COLOR_BTNHILIGHT = (20), + COLOR_3DSHADOW = (16), + COLOR_ACTIVEBORDER = (10), + COLOR_ACTIVECAPTION = (2), + COLOR_APPWORKSPACE = (12), + COLOR_BACKGROUND = (1), + COLOR_DESKTOP = (1), + COLOR_BTNFACE = (15), + COLOR_BTNHIGHLIGHT = (20), + COLOR_BTNSHADOW = (16), + COLOR_BTNTEXT = (18), + COLOR_CAPTIONTEXT = (9), + COLOR_GRAYTEXT = (17), + COLOR_HIGHLIGHT = (13), + COLOR_HIGHLIGHTTEXT = (14), + COLOR_INACTIVEBORDER = (11), + COLOR_INACTIVECAPTION = (3), + COLOR_INACTIVECAPTIONTEXT = (19), + COLOR_INFOBK = (24), + COLOR_INFOTEXT = (23), + COLOR_MENU = (4), + COLOR_MENUTEXT = (7), + COLOR_SCROLLBAR = (0), + COLOR_WINDOW = (5), + COLOR_WINDOWFRAME = (6), + COLOR_WINDOWTEXT = (8), + SM_CYMIN = (29), + SM_CXMIN = (28), + SM_ARRANGE = (56), + SM_CLEANBOOT = (67), + SM_CMETRICS = (76), + SM_CMOUSEBUTTONS = (43), + SM_CXBORDER = (5), + SM_CYBORDER = (6), + SM_CXCURSOR = (13), + SM_CYCURSOR = (14), + SM_CXDLGFRAME = (7), + SM_CYDLGFRAME = (8), + SM_CXDOUBLECLK = (36), + SM_CYDOUBLECLK = (37), + SM_CXDRAG = (68), + SM_CYDRAG = (69), + SM_CXEDGE = (45), + SM_CYEDGE = (46), + SM_CXFIXEDFRAME = (7), + SM_CYFIXEDFRAME = (8), + SM_CXFRAME = (32), + SM_CYFRAME = (33), + SM_CXFULLSCREEN = (16), + SM_CYFULLSCREEN = (17), + SM_CXHSCROLL = (21), + SM_CYHSCROLL = (3), + SM_CXHTHUMB = (10), + SM_CXICON = (11), + SM_CYICON = (12), + SM_CXICONSPACING = (38), + SM_CYICONSPACING = (39), + SM_CXMAXIMIZED = (61), + SM_CYMAXIMIZED = (62), + SM_CXMAXTRACK = (59), + SM_CYMAXTRACK = (60), + SM_CXMENUCHECK = (71), + SM_CYMENUCHECK = (72), + SM_CXMENUSIZE = (54), + SM_CYMENUSIZE = (55), + SM_CXMINIMIZED = (57), + SM_CYMINIMIZED = (58), + SM_CXMINSPACING = (47), + SM_CYMINSPACING = (48), + SM_CXMINTRACK = (34), + SM_CYMINTRACK = (35), + SM_CXSCREEN = (0), + SM_CYSCREEN = (1), + SM_CXSIZE = (30), + SM_CYSIZE = (31), + SM_CXSIZEFRAME = (32), + SM_CYSIZEFRAME = (33), + SM_CXSMICON = (49), + SM_CYSMICON = (50), + SM_CXSMSIZE = (52), + SM_CYSMSIZE = (53), + SM_CXVSCROLL = (2), + SM_CYVSCROLL = (20), + SM_CYVTHUMB = (9), + SM_CYCAPTION = (4), + SM_CYKANJIWINDOW = (18), + SM_CYMENU = (15), + SM_CYSMCAPTION = (51), + SM_DBCSENABLED = (42), + SM_DEBUG = (22), + SM_MENUDROPALIGNMENT = (40), + SM_MIDEASTENABLED = (74), + SM_MOUSEPRESENT = (19), + SM_MOUSEWHEELPRESENT = (75), + SM_NETWORK = (63), + SM_PENWINDOWS = (41), + SM_SECURE = (44), + SM_SHOWSOUNDS = (70), + SM_SLOWMACHINE = (73), + SM_SWAPBUTTON = (23), + ARW_BOTTOMLEFT = (0), + ARW_BOTTOMRIGHT = (0x1), + ARW_HIDE = (0x8), + ARW_TOPLEFT = (0x2), + ARW_TOPRIGHT = (0x3), + ARW_DOWN = (0x4), + ARW_LEFT = (0), + ARW_RIGHT = (0), + ARW_UP = (0x4), + SYSPAL_NOSTATIC = (2), + SYSPAL_STATIC = (1), + SYSPAL_ERROR = (0), + GET_TAPE_MEDIA_INFORMATION = (0), + GET_TAPE_DRIVE_INFORMATION = (1), + SET_TAPE_MEDIA_INFORMATION = (0), + SET_TAPE_DRIVE_INFORMATION = (1), + TAPE_ABSOLUTE_POSITION = (0), + TAPE_LOGICAL_POSITION = (0x1), + TA_BASELINE = (24), + TA_BOTTOM = (8), + TA_TOP = (0), + TA_CENTER = (6), + TA_LEFT = (0), + TA_RIGHT = (2), + TA_RTLREADING = (256), + TA_NOUPDATECP = (0), + TA_UPDATECP = (1), + VTA_BASELINE = (24), + VTA_CENTER = (6), + THREAD_PRIORITY_ABOVE_NORMAL = (1), + THREAD_PRIORITY_BELOW_NORMAL = -((1)), + THREAD_PRIORITY_HIGHEST = (2), + THREAD_PRIORITY_IDLE = -((15)), + THREAD_PRIORITY_LOWEST = -((2)), + THREAD_PRIORITY_NORMAL = (0), + THREAD_PRIORITY_TIME_CRITICAL = (15), + THREAD_PRIORITY_ERROR_RETURN = (2147483647), + TLS_MINIMUM_AVAILABLE = (64), + TIME_NOMINUTESORSECONDS = (1), + TIME_NOSECONDS = (2), + TIME_NOTIMEMARKER = (4), + TIME_FORCE24HOURFORMAT = (8), + TIME_ZONE_ID_INVALID = -(1), + TIME_ZONE_ID_UNKNOWN = (0), + TIME_ZONE_ID_STANDARD = (1), + TIME_ZONE_ID_DAYLIGHT = (2), + UOI_FLAGS = (1), + UOI_NAME = (2), + UOI_TYPE = (3), + FS_CASE_IS_PRESERVED = (2), + FS_CASE_SENSITIVE = (1), + FS_UNICODE_STORED_ON_DISK = (4), + FS_PERSISTENT_ACLS = (8), + FS_FILE_COMPRESSION = (16), + FS_VOL_IS_COMPRESSED = (32768), + GWL_EXSTYLE = -((20)), + GWL_STYLE = -((16)), + GWL_WNDPROC = -((4)), + GWL_HINSTANCE = -((6)), + GWL_HWNDPARENT = -((8)), + GWL_ID = -((12)), + GWL_USERDATA = -((21)), + DWL_DLGPROC = (4), + DWL_MSGRESULT = (0), + DWL_USER = (8), + GMEM_FIXED = (0), + GMEM_MOVEABLE = (2), + GPTR = (64), + GHND = (66), + GMEM_DDESHARE = (8192), + GMEM_DISCARDABLE = (256), + GMEM_LOWER = (4096), + GMEM_NOCOMPACT = (16), + GMEM_NODISCARD = (32), + GMEM_NOT_BANKED = (4096), + GMEM_NOTIFY = (16384), + GMEM_SHARE = (8192), + GMEM_ZEROINIT = (64), + GMEM_DISCARDED = (16384), + GMEM_INVALID_HANDLE = (32768), + GMEM_LOCKCOUNT = (255), + HEAP_GENERATE_EXCEPTIONS = (4), + HEAP_NO_SERIALIZE = (1), + HEAP_ZERO_MEMORY = (8), + STATUS_NO_MEMORY = (0xc0000017), + STATUS_ACCESS_VIOLATION = (0xc0000005), + HEAP_REALLOC_IN_PLACE_ONLY = (16), + ILC_COLOR = (0), + ILC_COLOR4 = (4), + ILC_COLOR8 = (8), + ILC_COLOR16 = (16), + ILC_COLOR24 = (24), + ILC_COLOR32 = (32), + ILC_COLORDDB = (254), + ILC_MASK = (1), + ILC_PALETTE = (2048), + ILD_BLEND25 = (2), + ILD_BLEND50 = (4), + ILD_SELECTED = (4), + ILD_BLEND = (4), + ILD_FOCUS = (2), + ILD_MASK = (16), + ILD_NORMAL = (0), + ILD_TRANSPARENT = (1), + CLR_NONE = (0xffffffff), + CLR_DEFAULT = (0xff000000), + CLR_INVALID = (0xFFFFFFFF), + LR_LOADFROMFILE = (16), + LR_LOADMAP3DCOLORS = (4096), + LR_LOADTRANSPARENT = (32), + IME_CONFIG_GENERAL = (1), + IME_CONFIG_REGISTERWORD = (2), + IME_CONFIG_SELECTDICTIONARY = (3), + GCL_CONVERSION = (1), + GCL_REVERSECONVERSION = (2), + GCL_REVERSE_LENGTH = (3), + GGL_LEVEL = (1), + GGL_INDEX = (2), + GGL_STRING = (3), + GGL_PRIVATE = (4), + GL_LEVEL_ERROR = (2), + GL_LEVEL_FATAL = (1), + GL_LEVEL_INFORMATION = (4), + GL_LEVEL_NOGUIDELINE = (0), + GL_LEVEL_WARNING = (3), + GL_ID_CANNOTSAVE = (17), + GL_ID_NOCONVERT = (32), + GL_ID_NODICTIONARY = (16), + GL_ID_NOMODULE = (1), + GL_ID_READINGCONFLICT = (35), + GL_ID_TOOMANYSTROKE = (34), + GL_ID_TYPINGERROR = (33), + GL_ID_UNKNOWN = (0), + GL_ID_INPUTREADING = (36), + GL_ID_INPUTRADICAL = (37), + GL_ID_INPUTCODE = (38), + GL_ID_CHOOSECANDIDATE = (40), + GL_ID_REVERSECONVERSION = (41), + IGP_PROPERTY = (4), + IGP_CONVERSION = (8), + IGP_SENTENCE = (12), + IGP_UI = (16), + IGP_SETCOMPSTR = (20), + IGP_SELECT = (24), + IME_PROP_AT_CARET = (65536), + IME_PROP_SPECIAL_UI = (131072), + IME_PROP_CANDLIST_START_FROM_1 = (262144), + IME_PROP_UNICODE = (524288), + UI_CAP_2700 = (1), + UI_CAP_ROT90 = (2), + UI_CAP_ROTANY = (4), + SCS_CAP_COMPSTR = (1), + SCS_CAP_MAKEREAD = (2), + SELECT_CAP_CONVERSION = (1), + SELECT_CAP_SENTENCE = (2), + NI_CHANGECANDIDATELIST = (19), + NI_CLOSECANDIDATE = (17), + NI_COMPOSITIONSTR = (21), + NI_OPENCANDIDATE = (16), + NI_SELECTCANDIDATESTR = (18), + NI_SETCANDIDATE_PAGESIZE = (23), + NI_SETCANDIDATE_PAGESTART = (22), + CPS_CANCEL = (4), + CPS_COMPLETE = (1), + CPS_CONVERT = (2), + CPS_REVERT = (3), + SCS_SETSTR = (9), + SCS_CHANGEATTR = (18), + SCS_CHANGECLAUSE = (36), + IME_REGWORD_STYLE_EUDC = (1), + IME_REGWORD_STYLE_USER_FIRST = (0x80000000), + IME_REGWORD_STYLE_USER_LAST = -((1)), + SECURITY_DESCRIPTOR_REVISION = (1), + IS_TEXT_UNICODE_ASCII16 = (1), + IS_TEXT_UNICODE_REVERSE_ASCII16 = (16), + IS_TEXT_UNICODE_STATISTICS = (2), + IS_TEXT_UNICODE_REVERSE_STATISTICS = (32), + IS_TEXT_UNICODE_CONTROLS = (4), + IS_TEXT_UNICODE_REVERSE_CONTROLS = (64), + IS_TEXT_UNICODE_SIGNATURE = (8), + IS_TEXT_UNICODE_REVERSE_SIGNATURE = (128), + IS_TEXT_UNICODE_ILLEGAL_CHARS = (256), + IS_TEXT_UNICODE_ODD_LENGTH = (512), + IS_TEXT_UNICODE_NULL_BYTES = (4096), + IS_TEXT_UNICODE_UNICODE_MASK = (15), + IS_TEXT_UNICODE_REVERSE_MASK = (240), + IS_TEXT_UNICODE_NOT_UNICODE_MASK = (3840), + IS_TEXT_UNICODE_NOT_ASCII_MASK = (61440), + HC_GETNEXT = (1), + HC_SKIP = (2), + HC_SYSMODALOFF = (5), + HC_SYSMODALON = (4), + HC_NOREMOVE = (3), + KEYEVENTF_EXTENDEDKEY = (1), + KEYEVENTF_KEYUP = (2), + OBM_BTNCORNERS = (32758), + OBM_BTSIZE = (32761), + OBM_CHECK = (32760), + OBM_CHECKBOXES = (32759), + OBM_CLOSE = (32754), + OBM_COMBO = (32738), + OBM_DNARROW = (32752), + OBM_DNARROWD = (32742), + OBM_DNARROWI = (32736), + OBM_LFARROW = (32750), + OBM_LFARROWI = (32734), + OBM_LFARROWD = (32740), + OBM_MNARROW = (32739), + OBM_OLD_CLOSE = (32767), + OBM_OLD_DNARROW = (32764), + OBM_OLD_LFARROW = (32762), + OBM_OLD_REDUCE = (32757), + OBM_OLD_RESTORE = (32755), + OBM_OLD_RGARROW = (32763), + OBM_OLD_UPARROW = (32765), + OBM_OLD_ZOOM = (32756), + OBM_REDUCE = (32749), + OBM_REDUCED = (32746), + OBM_RESTORE = (32747), + OBM_RESTORED = (32744), + OBM_RGARROW = (32751), + OBM_RGARROWD = (32741), + OBM_RGARROWI = (32735), + OBM_SIZE = (32766), + OBM_UPARROW = (32753), + OBM_UPARROWD = (32743), + OBM_UPARROWI = (32737), + OBM_ZOOM = (32748), + OBM_ZOOMD = (32745), + DONT_RESOLVE_DLL_REFERENCES = (1), + LOAD_LIBRARY_AS_DATAFILE = (2), + LOAD_WITH_ALTERED_SEARCH_PATH = (8), + LPTR = (64), + LHND = (66), + NONZEROLHND = (2), + NONZEROLPTR = (0), + LMEM_NONZEROLHND = (2), + LMEM_NONZEROLPTR = (0), + LMEM_FIXED = (0), + LMEM_MOVEABLE = (2), + LMEM_NOCOMPACT = (16), + LMEM_NODISCARD = (32), + LMEM_ZEROINIT = (64), + LMEM_MODIFY = (128), + LMEM_LOCKCOUNT = (255), + LMEM_DISCARDABLE = (3840), + LMEM_DISCARDED = (16384), + LMEM_INVALID_HANDLE = (32768), + LOCKFILE_FAIL_IMMEDIATELY = (1), + LOCKFILE_EXCLUSIVE_LOCK = (2), + MB_USERICON = (0x80), + MB_ICONASTERISK = (0x40), + MB_ICONEXCLAMATION = (0x30), + MB_ICONWARNING = (0x30), + MB_ICONERROR = (0x10), + MB_ICONHAND = (0x10), + MB_ICONQUESTION = (0x20), + MB_OK = (0), + MB_ABORTRETRYIGNORE = (0x2), + MB_APPLMODAL = (0), + MB_DEFAULT_DESKTOP_ONLY = (0x20000), + MB_HELP = (0x4000), + MB_RIGHT = (0x80000), + MB_RTLREADING = (0x100000), + MB_TOPMOST = (0x40000), + MB_DEFBUTTON1 = (0), + MB_DEFBUTTON2 = (0x100), + MB_DEFBUTTON3 = (0x200), + MB_DEFBUTTON4 = (0x300), + MB_ICONINFORMATION = (0x40), + MB_ICONSTOP = (0x10), + MB_OKCANCEL = (0x1), + MB_RETRYCANCEL = (0x5), + MB_SERVICE_NOTIFICATION = (0x40000), + MB_SETFOREGROUND = (0x10000), + MB_SYSTEMMODAL = (0x1000), + MB_TASKMODAL = (0x2000), + MB_YESNO = (0x4), + MB_YESNOCANCEL = (0x3), + IDABORT = (3), + IDCANCEL = (2), + IDCLOSE = (8), + IDHELP = (9), + IDIGNORE = (5), + IDNO = (7), + IDOK = (1), + IDRETRY = (4), + IDYES = (6), + MSGF_DIALOGBOX = (0), + MSGF_MENU = (2), + MSGF_NEXTWINDOW = (6), + MSGF_SCROLLBAR = (5), + MSGF_MAINLOOP = (8), + MSGF_USER = (4096), + MWT_IDENTITY = (1), + MWT_LEFTMULTIPLY = (2), + MWT_RIGHTMULTIPLY = (3), + MOUSEEVENTF_ABSOLUTE = (32768), + MOUSEEVENTF_MOVE = (1), + MOUSEEVENTF_LEFTDOWN = (2), + MOUSEEVENTF_LEFTUP = (4), + MOUSEEVENTF_RIGHTDOWN = (8), + MOUSEEVENTF_RIGHTUP = (16), + MOUSEEVENTF_MIDDLEDOWN = (32), + MOUSEEVENTF_MIDDLEUP = (64), + MOVEFILE_REPLACE_EXISTING = (1), + MOVEFILE_COPY_ALLOWED = (2), + MOVEFILE_DELAY_UNTIL_REBOOT = (4), + MOVEFILE_WRITE_THROUGH = (8), + WAIT_OBJECT_0 = (0), + WAIT_ABANDONED_0 = (0x80), + WAIT_TIMEOUT = (0x102), + WAIT_IO_COMPLETION = (0xc0), + WAIT_ABANDONED = (0x80), + WAIT_FAILED = (0xffffffff), + MAXIMUM_WAIT_OBJECTS = (0x40), + MAXIMUM_SUSPEND_COUNT = (0x7f), + MB_PRECOMPOSED = (1), + MB_COMPOSITE = (2), + MB_ERR_INVALID_CHARS = (8), + MB_USEGLYPHCHARS = (4), + TOKEN_ADJUST_DEFAULT = (128), + TOKEN_ADJUST_GROUPS = (64), + TOKEN_ADJUST_PRIVILEGES = (32), + TOKEN_ALL_ACCESS = (0xf00ff), + TOKEN_ASSIGN_PRIMARY = (1), + TOKEN_DUPLICATE = (2), + TOKEN_EXECUTE = (0x20000), + TOKEN_IMPERSONATE = (4), + TOKEN_QUERY = (8), + TOKEN_QUERY_SOURCE = (16), + TOKEN_READ = (0x20008), + TOKEN_WRITE = (0x200e0), + SC_MANAGER_ALL_ACCESS = (0xf003f), + SC_MANAGER_CONNECT = (1), + SC_MANAGER_CREATE_SERVICE = (2), + SC_MANAGER_ENUMERATE_SERVICE = (4), + SC_MANAGER_LOCK = (8), + SC_MANAGER_QUERY_LOCK_STATUS = (16), + SC_MANAGER_MODIFY_BOOT_CONFIG = (32), + HWND_BROADCAST = (0xFFFF), + TAPE_FORMAT = (0x5), + TAPE_LOAD = (0), + TAPE_LOCK = (0x3), + TAPE_TENSION = (0x2), + TAPE_UNLOAD = (0x1), + TAPE_UNLOCK = (0x4), + IS_PSREBOOTSYSTEM = (3), + IS_PSRESTARTWINDOWS = (2), + PSPCB_CREATE = (2), + PSPCB_RELEASE = (1), + PURGE_TXABORT = (1), + PURGE_RXABORT = (2), + PURGE_TXCLEAR = (4), + PURGE_RXCLEAR = (8), + OWNER_SECURITY_INFORMATION = (0x1), + GROUP_SECURITY_INFORMATION = (0x2), + DACL_SECURITY_INFORMATION = (0x4), + SACL_SECURITY_INFORMATION = (0x8), + EVENTLOG_FORWARDS_READ = (4), + EVENTLOG_BACKWARDS_READ = (8), + EVENTLOG_SEEK_READ = (2), + EVENTLOG_SEQUENTIAL_READ = (1), + EVENTLOG_ERROR_TYPE = (1), + EVENTLOG_WARNING_TYPE = (2), + EVENTLOG_INFORMATION_TYPE = (4), + EVENTLOG_AUDIT_SUCCESS = (8), + EVENTLOG_AUDIT_FAILURE = (16), + RDW_ERASE = (4), + RDW_FRAME = (1024), + RDW_INTERNALPAINT = (2), + RDW_INVALIDATE = (1), + RDW_NOERASE = (32), + RDW_NOFRAME = (2048), + RDW_NOINTERNALPAINT = (16), + RDW_VALIDATE = (8), + RDW_ERASENOW = (512), + RDW_UPDATENOW = (256), + RDW_ALLCHILDREN = (128), + RDW_NOCHILDREN = (64), + HKEY_CLASSES_ROOT = (0x80000000), + HKEY_CURRENT_USER = (0x80000001), + HKEY_LOCAL_MACHINE = (0x80000002), + HKEY_USERS = (0x80000003), + HKEY_PERFORMANCE_DATA = (0x80000004), + HKEY_CURRENT_CONFIG = (0x80000005), + HKEY_DYN_DATA = (0x80000006), + REG_OPTION_VOLATILE = (0x1), + REG_OPTION_NON_VOLATILE = (0), + REG_CREATED_NEW_KEY = (0x1), + REG_OPENED_EXISTING_KEY = (0x2), + REG_BINARY = (3), + REG_DWORD = (4), + REG_DWORD_LITTLE_ENDIAN = (4), + REG_DWORD_BIG_ENDIAN = (5), + REG_EXPAND_SZ = (2), + REG_FULL_RESOURCE_DESCRIPTOR = (9), + REG_LINK = (6), + REG_MULTI_SZ = (7), + REG_NONE = (0), + REG_RESOURCE_LIST = (8), + REG_RESOURCE_REQUIREMENTS_LIST = (10), + REG_SZ = (1), + MOD_ALT = (1), + MOD_CONTROL = (2), + MOD_SHIFT = (4), + MOD_WIN = (8), + IDHOT_SNAPDESKTOP = -((2)), + IDHOT_SNAPWINDOW = -((1)), + REG_NOTIFY_CHANGE_NAME = (0x1), + REG_NOTIFY_CHANGE_ATTRIBUTES = (0x2), + REG_NOTIFY_CHANGE_LAST_SET = (0x4), + REG_NOTIFY_CHANGE_SECURITY = (0x8), + SW_ERASE = (4), + SW_INVALIDATE = (2), + SW_SCROLLCHILDREN = (1), + SMTO_ABORTIFHUNG = (2), + SMTO_BLOCK = (1), + SMTO_NORMAL = (0), + OPAQUE = (2), + TRANSPARENT = (1), + SLE_ERROR = (1), + SLE_MINORERROR = (2), + SLE_WARNING = (3), + SEM_FAILCRITICALERRORS = (1), + SEM_NOALIGNMENTFAULTEXCEPT = (4), + SEM_NOGPFAULTERRORBOX = (2), + SEM_NOOPENFILEERRORBOX = (32768), + ICM_ON = (2), + ICM_OFF = (1), + ICM_QUERY = (3), + LOCALE_ILANGUAGE = (1), + LOCALE_SLANGUAGE = (2), + LOCALE_SENGLANGUAGE = (4097), + LOCALE_SABBREVLANGNAME = (3), + LOCALE_SNATIVELANGNAME = (4), + LOCALE_ICOUNTRY = (5), + LOCALE_SCOUNTRY = (6), + LOCALE_SENGCOUNTRY = (4098), + LOCALE_SABBREVCTRYNAME = (7), + LOCALE_SNATIVECTRYNAME = (8), + LOCALE_IDEFAULTLANGUAGE = (9), + LOCALE_IDEFAULTCOUNTRY = (10), + LOCALE_IDEFAULTANSICODEPAGE = (4100), + LOCALE_IDEFAULTCODEPAGE = (11), + LOCALE_SLIST = (12), + LOCALE_IMEASURE = (13), + LOCALE_SDECIMAL = (14), + LOCALE_STHOUSAND = (15), + LOCALE_SGROUPING = (16), + LOCALE_IDIGITS = (17), + LOCALE_ILZERO = (18), + LOCALE_INEGNUMBER = (4112), + LOCALE_SCURRENCY = (20), + LOCALE_SMONDECIMALSEP = (22), + LOCALE_SMONTHOUSANDSEP = (23), + LOCALE_SMONGROUPING = (24), + LOCALE_ICURRDIGITS = (25), + LOCALE_ICURRENCY = (27), + LOCALE_INEGCURR = (28), + LOCALE_SDATE = (29), + LOCALE_STIME = (30), + LOCALE_STIMEFORMAT = (4099), + LOCALE_SSHORTDATE = (31), + LOCALE_SLONGDATE = (32), + LOCALE_IDATE = (33), + LOCALE_ILDATE = (34), + LOCALE_ITIME = (35), + LOCALE_ITLZERO = (37), + LOCALE_IDAYLZERO = (38), + LOCALE_IMONLZERO = (39), + LOCALE_S1159 = (40), + LOCALE_S2359 = (41), + LOCALE_ICALENDARTYPE = (4105), + LOCALE_IOPTIONALCALENDAR = (4107), + LOCALE_IFIRSTDAYOFWEEK = (4108), + LOCALE_IFIRSTWEEKOFYEAR = (4109), + LOCALE_SDAYNAME1 = (42), + LOCALE_SDAYNAME2 = (43), + LOCALE_SDAYNAME3 = (44), + LOCALE_SDAYNAME4 = (45), + LOCALE_SDAYNAME5 = (46), + LOCALE_SDAYNAME6 = (47), + LOCALE_SDAYNAME7 = (48), + LOCALE_SABBREVDAYNAME1 = (49), + LOCALE_SABBREVDAYNAME2 = (50), + LOCALE_SABBREVDAYNAME3 = (51), + LOCALE_SABBREVDAYNAME4 = (52), + LOCALE_SABBREVDAYNAME5 = (53), + LOCALE_SABBREVDAYNAME6 = (54), + LOCALE_SABBREVDAYNAME7 = (55), + LOCALE_SMONTHNAME1 = (56), + LOCALE_SMONTHNAME2 = (57), + LOCALE_SMONTHNAME3 = (58), + LOCALE_SMONTHNAME4 = (59), + LOCALE_SMONTHNAME5 = (60), + LOCALE_SMONTHNAME6 = (61), + LOCALE_SMONTHNAME7 = (62), + LOCALE_SMONTHNAME8 = (63), + LOCALE_SMONTHNAME9 = (64), + LOCALE_SMONTHNAME10 = (65), + LOCALE_SMONTHNAME11 = (66), + LOCALE_SMONTHNAME12 = (67), + LOCALE_SMONTHNAME13 = (4110), + LOCALE_SABBREVMONTHNAME1 = (68), + LOCALE_SABBREVMONTHNAME2 = (69), + LOCALE_SABBREVMONTHNAME3 = (70), + LOCALE_SABBREVMONTHNAME4 = (71), + LOCALE_SABBREVMONTHNAME5 = (72), + LOCALE_SABBREVMONTHNAME6 = (73), + LOCALE_SABBREVMONTHNAME7 = (74), + LOCALE_SABBREVMONTHNAME8 = (75), + LOCALE_SABBREVMONTHNAME9 = (76), + LOCALE_SABBREVMONTHNAME10 = (77), + LOCALE_SABBREVMONTHNAME11 = (78), + LOCALE_SABBREVMONTHNAME12 = (79), + LOCALE_SABBREVMONTHNAME13 = (4111), + LOCALE_SPOSITIVESIGN = (80), + LOCALE_SNEGATIVESIGN = (81), + LOCALE_IPOSSIGNPOSN = (82), + LOCALE_INEGSIGNPOSN = (83), + LOCALE_IPOSSYMPRECEDES = (84), + LOCALE_IPOSSEPBYSPACE = (85), + LOCALE_INEGSYMPRECEDES = (86), + LOCALE_INEGSEPBYSPACE = (87), + LOCALE_NOUSEROVERRIDE = (0x80000000), + CAL_ICALINTVALUE = (1), + CAL_IYEAROFFSETRANGE = (3), + CAL_SABBREVDAYNAME1 = (14), + CAL_SABBREVDAYNAME2 = (15), + CAL_SABBREVDAYNAME3 = (16), + CAL_SABBREVDAYNAME4 = (17), + CAL_SABBREVDAYNAME5 = (18), + CAL_SABBREVDAYNAME6 = (19), + CAL_SABBREVDAYNAME7 = (20), + CAL_SABBREVMONTHNAME1 = (34), + CAL_SABBREVMONTHNAME2 = (35), + CAL_SABBREVMONTHNAME3 = (36), + CAL_SABBREVMONTHNAME4 = (37), + CAL_SABBREVMONTHNAME5 = (38), + CAL_SABBREVMONTHNAME6 = (39), + CAL_SABBREVMONTHNAME7 = (40), + CAL_SABBREVMONTHNAME8 = (41), + CAL_SABBREVMONTHNAME9 = (42), + CAL_SABBREVMONTHNAME10 = (43), + CAL_SABBREVMONTHNAME11 = (44), + CAL_SABBREVMONTHNAME12 = (45), + CAL_SABBREVMONTHNAME13 = (46), + CAL_SCALNAME = (2), + CAL_SDAYNAME1 = (7), + CAL_SDAYNAME2 = (8), + CAL_SDAYNAME3 = (9), + CAL_SDAYNAME4 = (10), + CAL_SDAYNAME5 = (11), + CAL_SDAYNAME6 = (12), + CAL_SDAYNAME7 = (13), + CAL_SERASTRING = (4), + CAL_SLONGDATE = (6), + CAL_SMONTHNAME1 = (21), + CAL_SMONTHNAME2 = (22), + CAL_SMONTHNAME3 = (23), + CAL_SMONTHNAME4 = (24), + CAL_SMONTHNAME5 = (25), + CAL_SMONTHNAME6 = (26), + CAL_SMONTHNAME7 = (27), + CAL_SMONTHNAME8 = (28), + CAL_SMONTHNAME9 = (29), + CAL_SMONTHNAME10 = (30), + CAL_SMONTHNAME11 = (31), + CAL_SMONTHNAME12 = (32), + CAL_SMONTHNAME13 = (33), + CAL_SSHORTDATE = (5), + PROCESS_SET_QUOTA = (256), + BLACKONWHITE = (1), + COLORONCOLOR = (3), + HALFTONE = (4), + STRETCH_ANDSCANS = (1), + STRETCH_DELETESCANS = (3), + STRETCH_HALFTONE = (4), + STRETCH_ORSCANS = (2), + WHITEONBLACK = (2), + OCR_NORMAL = (32512), + OCR_IBEAM = (32513), + OCR_WAIT = (32514), + OCR_CROSS = (32515), + OCR_UP = (32516), + OCR_SIZE = (32640), + OCR_ICON = (32641), + OCR_SIZENWSE = (32642), + OCR_SIZENESW = (32643), + OCR_SIZEWE = (32644), + OCR_SIZENS = (32645), + OCR_SIZEALL = (32646), + OCR_NO = (32648), + OCR_APPSTARTING = (32650), + TAPE_ABSOLUTE_BLOCK = (0x1), + TAPE_LOGICAL_BLOCK = (0x2), + TAPE_REWIND = (0), + TAPE_SPACE_END_OF_DATA = (0x4), + TAPE_SPACE_FILEMARKS = (0x6), + TAPE_SPACE_RELATIVE_BLOCKS = (0x5), + TAPE_SPACE_SEQUENTIAL_FMKS = (0x7), + TAPE_SPACE_SEQUENTIAL_SMKS = (0x9), + TAPE_SPACE_SETMARKS = (0x8), + EXCEPTION_EXECUTE_HANDLER = (1), + EXCEPTION_CONTINUE_EXECUTION = -((1)), + EXCEPTION_CONTINUE_SEARCH = (0), + HWND_BOTTOM = (1), + HWND_NOTOPMOST = -(2), + HWND_TOP = (0), + HWND_TOPMOST = -(1), + SWP_DRAWFRAME = (32), + SWP_FRAMECHANGED = (32), + SWP_HIDEWINDOW = (128), + SWP_NOACTIVATE = (16), + SWP_NOCOPYBITS = (256), + SWP_NOMOVE = (2), + SWP_NOSIZE = (1), + SWP_NOREDRAW = (8), + SWP_NOZORDER = (4), + SWP_SHOWWINDOW = (64), + SWP_NOOWNERZORDER = (512), + SWP_NOREPOSITION = (512), + SWP_NOSENDCHANGING = (1024), + HSHELL_ACTIVATESHELLWINDOW = (3), + HSHELL_GETMINRECT = (5), + HSHELL_LANGUAGE = (8), + HSHELL_REDRAW = (6), + HSHELL_TASKMAN = (7), + HSHELL_WINDOWACTIVATED = (4), + HSHELL_WINDOWCREATED = (1), + HSHELL_WINDOWDESTROYED = (2), + SW_HIDE = (0), + SW_MAXIMIZE = (3), + SW_MINIMIZE = (6), + SW_NORMAL = (1), + SW_RESTORE = (9), + SW_SHOW = (5), + SW_SHOWDEFAULT = (10), + SW_SHOWMAXIMIZED = (3), + SW_SHOWMINIMIZED = (2), + SW_SHOWMINNOACTIVE = (7), + SW_SHOWNA = (8), + SW_SHOWNOACTIVATE = (4), + SW_SHOWNORMAL = (1), + WPF_RESTORETOMAXIMIZED = (2), + WPF_SETMINPOSITION = (1), + INFINITE = (0xFFFFFFFF), + SPI_GETACCESSTIMEOUT = (60), + SPI_GETANIMATION = (72), + SPI_GETBEEP = (1), + SPI_GETBORDER = (5), + SPI_GETDEFAULTINPUTLANG = (89), + SPI_GETDRAGFULLWINDOWS = (38), + SPI_GETFASTTASKSWITCH = (35), + SPI_GETFILTERKEYS = (50), + SPI_GETFONTSMOOTHING = (74), + SPI_GETGRIDGRANULARITY = (18), + SPI_GETHIGHCONTRAST = (66), + SPI_GETICONMETRICS = (45), + SPI_GETICONTITLELOGFONT = (31), + SPI_GETICONTITLEWRAP = (25), + SPI_GETKEYBOARDDELAY = (22), + SPI_GETKEYBOARDPREF = (68), + SPI_GETKEYBOARDSPEED = (10), + SPI_GETLOWPOWERACTIVE = (83), + SPI_GETLOWPOWERTIMEOUT = (79), + SPI_GETMENUDROPALIGNMENT = (27), + SPI_GETMINIMIZEDMETRICS = (43), + SPI_GETMOUSE = (3), + SPI_GETMOUSEKEYS = (54), + SPI_GETMOUSETRAILS = (94), + SPI_GETNONCLIENTMETRICS = (41), + SPI_GETPOWEROFFACTIVE = (84), + SPI_GETPOWEROFFTIMEOUT = (80), + SPI_GETSCREENREADER = (70), + SPI_GETSCREENSAVEACTIVE = (16), + SPI_GETSCREENSAVETIMEOUT = (14), + SPI_GETSERIALKEYS = (62), + SPI_GETSHOWSOUNDS = (56), + SPI_GETSOUNDSENTRY = (64), + SPI_GETSTICKYKEYS = (58), + SPI_GETTOGGLEKEYS = (52), + SPI_GETWINDOWSEXTENSION = (92), + SPI_GETWORKAREA = (48), + SPI_ICONHORIZONTALSPACING = (13), + SPI_ICONVERTICALSPACING = (24), + SPI_LANGDRIVER = (12), + SPI_SCREENSAVERRUNNING = (97), + SPI_SETACCESSTIMEOUT = (61), + SPI_SETANIMATION = (73), + SPI_SETBEEP = (2), + SPI_SETBORDER = (6), + SPI_SETDEFAULTINPUTLANG = (90), + SPI_SETDESKPATTERN = (21), + SPI_SETDESKWALLPAPER = (20), + SPI_SETDOUBLECLICKTIME = (32), + SPI_SETDOUBLECLKHEIGHT = (30), + SPI_SETDOUBLECLKWIDTH = (29), + SPI_SETDRAGFULLWINDOWS = (37), + SPI_SETDRAGHEIGHT = (77), + SPI_SETDRAGWIDTH = (76), + SPI_SETFASTTASKSWITCH = (36), + SPI_SETFILTERKEYS = (51), + SPI_SETFONTSMOOTHING = (75), + SPI_SETGRIDGRANULARITY = (19), + SPI_SETHANDHELD = (78), + SPI_SETHIGHCONTRAST = (67), + SPI_SETICONMETRICS = (46), + SPI_SETICONTITLELOGFONT = (34), + SPI_SETICONTITLEWRAP = (26), + SPI_SETKEYBOARDDELAY = (23), + SPI_SETKEYBOARDPREF = (69), + SPI_SETKEYBOARDSPEED = (11), + SPI_SETLANGTOGGLE = (91), + SPI_SETLOWPOWERACTIVE = (85), + SPI_SETLOWPOWERTIMEOUT = (81), + SPI_SETMENUDROPALIGNMENT = (28), + SPI_SETMINIMIZEDMETRICS = (44), + SPI_SETMOUSE = (4), + SPI_SETMOUSEBUTTONSWAP = (33), + SPI_SETMOUSEKEYS = (55), + SPI_SETMOUSETRAILS = (93), + SPI_SETNONCLIENTMETRICS = (42), + SPI_SETPENWINDOWS = (49), + SPI_SETPOWEROFFACTIVE = (86), + SPI_SETPOWEROFFTIMEOUT = (82), + SPI_SETSCREENREADER = (71), + SPI_SETSCREENSAVEACTIVE = (17), + SPI_SETSCREENSAVETIMEOUT = (15), + SPI_SETSERIALKEYS = (63), + SPI_SETSHOWSOUNDS = (57), + SPI_SETSOUNDSENTRY = (65), + SPI_SETSTICKYKEYS = (59), + SPI_SETTOGGLEKEYS = (53), + SPI_SETWORKAREA = (47), + SPIF_UPDATEINIFILE = (1), + SPIF_SENDWININICHANGE = (2), + SPIF_SENDCHANGE = (2), + TPM_CENTERALIGN = (0x4), + TPM_LEFTALIGN = (0), + TPM_RIGHTALIGN = (0x8), + TPM_LEFTBUTTON = (0), + TPM_RIGHTBUTTON = (0x2), + TPM_HORIZONTAL = (0), + TPM_VERTICAL = (0x40), + TCI_SRCCHARSET = (1), + TCI_SRCCODEPAGE = (2), + TCI_SRCFONTSIG = (3), + VFFF_ISSHAREDFILE = (1), + VFF_CURNEDEST = (1), + VFF_FILEINUSE = (2), + VFF_BUFFTOOSMALL = (4), + VIFF_FORCEINSTALL = (1), + VIFF_DONTDELETEOLD = (2), + VIF_TEMPFILE = (0x1), + VIF_MISMATCH = (0x2), + VIF_SRCOLD = (0x4), + VIF_DIFFLANG = (0x8), + VIF_DIFFCODEPG = (0x10), + VIF_DIFFTYPE = (0x20), + VIF_WRITEPROT = (0x40), + VIF_FILEINUSE = (0x80), + VIF_OUTOFSPACE = (0x100), + VIF_ACCESSVIOLATION = (0x200), + VIF_SHARINGVIOLATION = (0x400), + VIF_CANNOTCREATE = (0x800), + VIF_CANNOTDELETE = (0x1000), + VIF_CANNOTDELETECUR = (0x4000), + VIF_CANNOTRENAME = (0x2000), + VIF_OUTOFMEMORY = (0x8000), + VIF_CANNOTREADSRC = (0x10000), + VIF_CANNOTREADDST = (0x20000), + VIF_BUFFTOOSMALL = (0x40000), + WC_COMPOSITECHECK = (512), + WC_DISCARDNS = (16), + WC_SEPCHARS = (32), + WC_DEFAULTCHAR = (64), + HELP_COMMAND = (0x102), + HELP_CONTENTS = (0x3), + HELP___FILE__ = (0x1), + HELP___FILE__POPUP = (0x8), + HELP_FORCEFILE = (0x9), + HELP_HELPONHELP = (0x4), + HELP_INDEX = (0x3), + HELP_KEY = (0x101), + HELP_MULTIKEY = (0x201), + HELP_PARTIALKEY = (0x105), + HELP_QUIT = (0x2), + HELP_SETCONTENTS = (0x5), + HELP_SETINDEX = (0x5), + HELP___FILE__MENU = (0xa), + HELP_FINDER = (0xb), + HELP_WM_HELP = (0xc), + HELP_TCARD = (0x8000), + HELP_TCARD_DATA = (0x10), + HELP_TCARD_OTHER_CALLER = (0x11), + CONNECT_UPDATE_PROFILE = (1), + RESOURCETYPE_DISK = (1), + RESOURCETYPE_PRINT = (2), + RESOURCETYPE_ANY = (0), + RESOURCE_CONNECTED = (1), + RESOURCE_GLOBALNET = (2), + RESOURCE_REMEMBERED = (3), + RESOURCEUSAGE_CONNECTABLE = (1), + RESOURCEUSAGE_CONTAINER = (2), + WN_BAD_NETNAME = (0x43), + WN_EXTENDED_ERROR = (0x4b8), + WN_MORE_DATA = (0xea), + WN_NO_NETWORK = (0x4c6), + WN_SUCCESS = (0), + WN_ACCESS_DENIED = (0x5), + WN_BAD_PROVIDER = (0x4b4), + WN_NOT_AUTHENTICATED = (0x4dc), + UNIVERSAL_NAME_INFO_LEVEL = (1), + REMOTE_NAME_INFO_LEVEL = (2), + STILL_ACTIVE = (0x103), + SP_SERIALCOMM = (0x1), + BAUD_075 = (0x1), + BAUD_110 = (0x2), + BAUD_134_5 = (0x4), + BAUD_150 = (0x8), + BAUD_300 = (0x10), + BAUD_600 = (0x20), + BAUD_1200 = (0x40), + BAUD_1800 = (0x80), + BAUD_2400 = (0x100), + BAUD_4800 = (0x200), + BAUD_7200 = (0x400), + BAUD_9600 = (0x800), + BAUD_14400 = (0x1000), + BAUD_19200 = (0x2000), + BAUD_38400 = (0x4000), + BAUD_56K = (0x8000), + BAUD_57600 = (0x40000), + BAUD_115200 = (0x20000), + BAUD_128K = (0x10000), + BAUD_USER = (0x10000000), + PST_FAX = (0x21), + PST_LAT = (0x101), + PST_MODEM = (0x6), + PST_NETWORK_BRIDGE = (0x100), + PST_PARALLELPORT = (0x2), + PST_RS232 = (0x1), + PST_RS422 = (0x3), + PST_RS423 = (0x4), + PST_RS449 = (0x5), + PST_SCANNER = (0x22), + PST_TCPIP_TELNET = (0x102), + PST_UNSPECIFIED = (0), + PST_X25 = (0x103), + PCF_16BITMODE = (0x200), + PCF_DTRDSR = (0x1), + PCF_INTTIMEOUTS = (0x80), + PCF_PARITY_CHECK = (0x8), + PCF_RLSD = (0x4), + PCF_RTSCTS = (0x2), + PCF_SETXCHAR = (0x20), + PCF_SPECIALCHARS = (0x100), + PCF_TOTALTIMEOUTS = (0x40), + PCF_XONXOFF = (0x10), + SP_BAUD = (0x2), + SP_DATABITS = (0x4), + SP_HANDSHAKING = (0x10), + SP_PARITY = (0x1), + SP_PARITY_CHECK = (0x20), + SP_RLSD = (0x40), + SP_STOPBITS = (0x8), + DATABITS_5 = (1), + DATABITS_6 = (2), + DATABITS_7 = (4), + DATABITS_8 = (8), + DATABITS_16 = (16), + DATABITS_16X = (32), + STOPBITS_10 = (1), + STOPBITS_15 = (2), + STOPBITS_20 = (4), + PARITY_NONE = (256), + PARITY_ODD = (512), + PARITY_EVEN = (1024), + PARITY_MARK = (2048), + PARITY_SPACE = (4096), + COMMPROP_INITIALIZED = (0xe73cf52e), + CBR_110 = (110), + CBR_300 = (300), + CBR_600 = (600), + CBR_1200 = (1200), + CBR_2400 = (2400), + CBR_4800 = (4800), + CBR_9600 = (9600), + CBR_14400 = (14400), + CBR_19200 = (19200), + CBR_38400 = (38400), + CBR_56000 = (56000), + CBR_57600 = (57600), + CBR_115200 = (115200), + CBR_128000 = (128000), + CBR_256000 = (256000), + DTR_CONTROL_DISABLE = (0), + DTR_CONTROL_ENABLE = (1), + DTR_CONTROL_HANDSHAKE = (2), + RTS_CONTROL_DISABLE = (0), + RTS_CONTROL_ENABLE = (1), + RTS_CONTROL_HANDSHAKE = (2), + RTS_CONTROL_TOGGLE = (3), + EVENPARITY = (2), + MARKPARITY = (3), + NOPARITY = (0), + ODDPARITY = (1), + SPACEPARITY = (4), + ONESTOPBIT = (0), + ONE5STOPBITS = (1), + TWOSTOPBITS = (2), + CREATE_PROCESS_DEBUG_EVENT = (3), + CREATE_THREAD_DEBUG_EVENT = (2), + EXCEPTION_DEBUG_EVENT = (1), + EXIT_PROCESS_DEBUG_EVENT = (5), + EXIT_THREAD_DEBUG_EVENT = (4), + LOAD_DLL_DEBUG_EVENT = (6), + OUTPUT_DEBUG_STRING_EVENT = (8), + UNLOAD_DLL_DEBUG_EVENT = (7), + RIP_EVENT = (9), + PROCESS_HEAP_REGION = (1), + PROCESS_HEAP_UNCOMMITTED_RANGE = (2), + PROCESS_HEAP_ENTRY_BUSY = (4), + PROCESS_HEAP_ENTRY_MOVEABLE = (16), + PROCESS_HEAP_ENTRY_DDESHARE = (32), + HINSTANCE_ERROR = (32), + BACKUP_DATA = (1), + BACKUP_EA_DATA = (2), + BACKUP_SECURITY_DATA = (3), + BACKUP_ALTERNATE_DATA = (4), + BACKUP_LINK = (5), + STREAM_MODIFIED_WHEN_READ = (1), + STREAM_CONTAINS_SECURITY = (2), + STARTF_USESHOWWINDOW = (1), + STARTF_USEPOSITION = (4), + STARTF_USESIZE = (2), + STARTF_USECOUNTCHARS = (8), + STARTF_USEFILLATTRIBUTE = (16), + STARTF_RUNFULLSCREEN = (32), + STARTF_FORCEONFEEDBACK = (64), + STARTF_FORCEOFFFEEDBACK = (128), + STARTF_USESTDHANDLES = (256), + STARTF_USEHOTKEY = (512), + VER_PLATFORM_WIN32s = (0), + VER_PLATFORM_WIN32_WINDOWS = (1), + VER_PLATFORM_WIN32_NT = (2), + MAXPROPPAGES = (100), + PSP_DEFAULT = (0), + PSP_DLGINDIRECT = (1), + PSP_HASHELP = (32), + PSP_USECALLBACK = (128), + PSP_USEHICON = (2), + PSP_USEICONID = (4), + PSP_USEREFPARENT = (64), + PSP_USETITLE = (8), + PSP_RTLREADING = (16), + PSH_DEFAULT = (0), + PSH_HASHELP = (512), + PSH_MODELESS = (1024), + PSH_NOAPPLYNOW = (128), + PSH_PROPSHEETPAGE = (8), + PSH_PROPTITLE = (1), + PSH_USECALLBACK = (256), + PSH_USEHICON = (2), + PSH_USEICONID = (4), + PSH_USEPSTARTPAGE = (64), + PSH_WIZARD = (32), + PSH_RTLREADING = (2048), + PSCB_INITIALIZED = (1), + PSCB_PRECREATE = (2), + PSNRET_NOERROR = (0), + PSNRET_INVALID_NOCHANGEPAGE = (2), + PSBTN_APPLYNOW = (4), + PSBTN_BACK = (0), + PSBTN_CANCEL = (5), + PSBTN_FINISH = (2), + PSBTN_HELP = (6), + PSBTN_NEXT = (1), + PSBTN_OK = (3), + PSWIZB_BACK = (1), + PSWIZB_NEXT = (2), + PSWIZB_FINISH = (4), + PSWIZB_DISABLEDFINISH = (8), + ID_PSREBOOTSYSTEM = (3), + ID_PSRESTARTWINDOWS = (2), + WIZ_BODYCX = (184), + WIZ_BODYX = (92), + WIZ_CXBMP = (80), + WIZ_CXDLG = (276), + WIZ_CYDLG = (140), +} +char* VS_FILE_INFO = cast(char*) ((16)); +enum : DWORD { + VS_VERSION_INFO = (1), + VS_FF_DEBUG = (0x1), + VS_FF_INFOINFERRED = (0x10), + VS_FF_PATCHED = (0x4), + VS_FF_PRERELEASE = (0x2), + VS_FF_PRIVATEBUILD = (0x8), + VS_FF_SPECIALBUILD = (0x20), + VOS_UNKNOWN = (0), + VOS_DOS = (0x10000), + VOS_OS216 = (0x20000), + VOS_OS232 = (0x30000), + VOS_NT = (0x40000), + VOS_DOS_WINDOWS16 = (0x10001), + VOS_DOS_WINDOWS32 = (0x10004), + VOS_OS216_PM16 = (0x20002), + VOS_OS232_PM32 = (0x30003), + VOS_NT_WINDOWS32 = (0x40004), + VFT_UNKNOWN = (0), + VFT_APP = (0x1), + VFT_DLL = (0x2), + VFT_DRV = (0x3), + VFT_FONT = (0x4), + VFT_VXD = (0x5), + VFT_STATIC_LIB = (0x7), + VFT2_UNKNOWN = (0), + VFT2_DRV_PRINTER = (0x1), + VFT2_DRV_KEYBOARD = (0x2), + VFT2_DRV_LANGUAGE = (0x3), + VFT2_DRV_DISPLAY = (0x4), + VFT2_DRV_MOUSE = (0x5), + VFT2_DRV_NETWORK = (0x6), + VFT2_DRV_SYSTEM = (0x7), + VFT2_DRV_INSTALLABLE = (0x8), + VFT2_DRV_SOUND = (0x9), + VFT2_FONT_RASTER = (0x1), + VFT2_FONT_VECTOR = (0x2), + VFT2_FONT_TRUETYPE = (0x3), + PAN_ANY = (0), + PAN_NO_FIT = (1), + PAN_FAMILY_TEXT_DISPLAY = (2), + PAN_FAMILY_SCRIPT = (3), + PAN_FAMILY_DECORATIVE = (4), + PAN_FAMILY_PICTORIAL = (5), + PAN_SERIF_COVE = (2), + PAN_SERIF_OBTUSE_COVE = (3), + PAN_SERIF_SQUARE_COVE = (4), + PAN_SERIF_OBTUSE_SQUARE_COVE = (5), + PAN_SERIF_SQUARE = (6), + PAN_SERIF_THIN = (7), + PAN_SERIF_BONE = (8), + PAN_SERIF_EXAGGERATED = (9), + PAN_SERIF_TRIANGLE = (10), + PAN_SERIF_NORMAL_SANS = (11), + PAN_SERIF_OBTUSE_SANS = (12), + PAN_SERIF_PERP_SANS = (13), + PAN_SERIF_FLARED = (14), + PAN_SERIF_ROUNDED = (15), + PAN_WEIGHT_VERY_LIGHT = (2), + PAN_WEIGHT_LIGHT = (3), + PAN_WEIGHT_THIN = (4), + PAN_WEIGHT_BOOK = (5), + PAN_WEIGHT_MEDIUM = (6), + PAN_WEIGHT_DEMI = (7), + PAN_WEIGHT_BOLD = (8), + PAN_WEIGHT_HEAVY = (9), + PAN_WEIGHT_BLACK = (10), + PAN_WEIGHT_NORD = (11), + PAN_PROP_OLD_STYLE = (2), + PAN_PROP_MODERN = (3), + PAN_PROP_EVEN_WIDTH = (4), + PAN_PROP_EXPANDED = (5), + PAN_PROP_CONDENSED = (6), + PAN_PROP_VERY_EXPANDED = (7), + PAN_PROP_VERY_CONDENSED = (8), + PAN_PROP_MONOSPACED = (9), + PAN_CONTRAST_NONE = (2), + PAN_CONTRAST_VERY_LOW = (3), + PAN_CONTRAST_LOW = (4), + PAN_CONTRAST_MEDIUM_LOW = (5), + PAN_CONTRAST_MEDIUM = (6), + PAN_CONTRAST_MEDIUM_HIGH = (7), + PAN_CONTRAST_HIGH = (8), + PAN_CONTRAST_VERY_HIGH = (9), + PAN_STROKE_GRADUAL_DIAG = (2), + PAN_STROKE_GRADUAL_TRAN = (3), + PAN_STROKE_GRADUAL_VERT = (4), + PAN_STROKE_GRADUAL_HORZ = (5), + PAN_STROKE_RAPID_VERT = (6), + PAN_STROKE_RAPID_HORZ = (7), + PAN_STROKE_INSTANT_VERT = (8), + PAN_STRAIGHT_ARMS_HORZ = (2), + PAN_STRAIGHT_ARMS_WEDGE = (3), + PAN_STRAIGHT_ARMS_VERT = (4), + PAN_STRAIGHT_ARMS_SINGLE_SERIF = (5), + PAN_STRAIGHT_ARMS_DOUBLE_SERIF = (6), + PAN_BENT_ARMS_HORZ = (7), + PAN_BENT_ARMS_VERT = (9), + PAN_BENT_ARMS_WEDGE = (8), + PAN_BENT_ARMS_SINGLE_SERIF = (10), + PAN_BENT_ARMS_DOUBLE_SERIF = (11), + PAN_LETT_NORMAL_CONTACT = (2), + PAN_LETT_NORMAL_WEIGHTED = (3), + PAN_LETT_NORMAL_BOXED = (4), + PAN_LETT_NORMAL_FLATTENED = (5), + PAN_LETT_NORMAL_ROUNDED = (6), + PAN_LETT_NORMAL_OFF_CENTER = (7), + PAN_LETT_NORMAL_SQUARE = (8), + PAN_LETT_OBLIQUE_CONTACT = (9), + PAN_LETT_OBLIQUE_WEIGHTED = (10), + PAN_LETT_OBLIQUE_BOXED = (11), + PAN_LETT_OBLIQUE_FLATTENED = (12), + PAN_LETT_OBLIQUE_ROUNDED = (13), + PAN_LETT_OBLIQUE_OFF_CENTER = (14), + PAN_LETT_OBLIQUE_SQUARE = (15), + PAN_MIDLINE_STANDARD_TRIMMED = (2), + PAN_MIDLINE_STANDARD_POINTED = (3), + PAN_MIDLINE_STANDARD_SERIFED = (4), + PAN_MIDLINE_HIGH_TRIMMED = (5), + PAN_MIDLINE_HIGH_POINTED = (6), + PAN_MIDLINE_HIGH_SERIFED = (7), + PAN_MIDLINE_CONSTANT_TRIMMED = (8), + PAN_MIDLINE_CONSTANT_POINTED = (9), + PAN_MIDLINE_CONSTANT_SERIFED = (10), + PAN_MIDLINE_LOW_TRIMMED = (11), + PAN_MIDLINE_LOW_POINTED = (12), + PAN_MIDLINE_LOW_SERIFED = (13), + PAN_XHEIGHT_CONSTANT_SMALL = (2), + PAN_XHEIGHT_CONSTANT_STD = (3), + PAN_XHEIGHT_CONSTANT_LARGE = (4), + PAN_XHEIGHT_DUCKING_SMALL = (5), + PAN_XHEIGHT_DUCKING_STD = (6), + PAN_XHEIGHT_DUCKING_LARGE = (7), + PC_EXPLICIT = (2), + PC_NOCOLLAPSE = (4), + PC_RESERVED = (1), + BS_DIBPATTERN = (5), + BS_DIBPATTERN8X8 = (8), + BS_DIBPATTERNPT = (6), + BS_HATCHED = (2), + BS_HOLLOW = (1), + BS_NULL = (1), + BS_PATTERN = (3), + BS_PATTERN8X8 = (7), + BS_SOLID = (0), + DM_ORIENTATION = (0x1), + DM_PAPERSIZE = (0x2), + DM_PAPERLENGTH = (0x4), + DM_PAPERWIDTH = (0x8), + DM_SCALE = (0x10), + DM_COPIES = (0x100), + DM_DEFAULTSOURCE = (0x200), + DM_PRINTQUALITY = (0x400), + DM_COLOR = (0x800), + DM_DUPLEX = (0x1000), + DM_YRESOLUTION = (0x2000), + DM_TTOPTION = (0x4000), + DM_COLLATE = (0x8000), + DM_FORMNAME = (0x10000), + DM_LOGPIXELS = (0x20000), + DM_ICMMETHOD = (0x800000), + DM_ICMINTENT = (0x1000000), + DM_MEDIATYPE = (0x2000000), + DM_DITHERTYPE = (0x4000000), + DMORIENT_LANDSCAPE = (2), + DMORIENT_PORTRAIT = (1), + DMPAPER_LETTER = (1), + DMPAPER_LEGAL = (5), + DMPAPER_A4 = (9), + DMPAPER_CSHEET = (24), + DMPAPER_DSHEET = (25), + DMPAPER_ESHEET = (26), + DMPAPER_LETTERSMALL = (2), + DMPAPER_TABLOID = (3), + DMPAPER_LEDGER = (4), + DMPAPER_STATEMENT = (6), + DMPAPER_EXECUTIVE = (7), + DMPAPER_A3 = (8), + DMPAPER_A4SMALL = (10), + DMPAPER_A5 = (11), + DMPAPER_B4 = (12), + DMPAPER_B5 = (13), + DMPAPER_FOLIO = (14), + DMPAPER_QUARTO = (15), + DMPAPER_10X14 = (16), + DMPAPER_11X17 = (17), + DMPAPER_NOTE = (18), + DMPAPER_ENV_9 = (19), + DMPAPER_ENV_10 = (20), + DMPAPER_ENV_11 = (21), + DMPAPER_ENV_12 = (22), + DMPAPER_ENV_14 = (23), + DMPAPER_ENV_DL = (27), + DMPAPER_ENV_C5 = (28), + DMPAPER_ENV_C3 = (29), + DMPAPER_ENV_C4 = (30), + DMPAPER_ENV_C6 = (31), + DMPAPER_ENV_C65 = (32), + DMPAPER_ENV_B4 = (33), + DMPAPER_ENV_B5 = (34), + DMPAPER_ENV_B6 = (35), + DMPAPER_ENV_ITALY = (36), + DMPAPER_ENV_MONARCH = (37), + DMPAPER_ENV_PERSONAL = (38), + DMPAPER_FANFOLD_US = (39), + DMPAPER_FANFOLD_STD_GERMAN = (40), + DMPAPER_FANFOLD_LGL_GERMAN = (41), + DMRES_HIGH = -((4)), + DMRES_MEDIUM = -((3)), + DMRES_LOW = -((2)), + DMRES_DRAFT = -((1)), + DMCOLOR_COLOR = (2), + DMCOLOR_MONOCHROME = (1), + DMDUP_SIMPLEX = (1), + DMDUP_HORIZONTAL = (3), + DMDUP_VERTICAL = (2), + DMTT_BITMAP = (1), + DMTT_DOWNLOAD = (2), + DMTT_SUBDEV = (3), + DMCOLLATE_TRUE = (1), + DMCOLLATE_FALSE = (0), + DM_GRAYSCALE = (1), + DM_INTERLACED = (2), + DMICMMETHOD_NONE = (1), + DMICMMETHOD_SYSTEM = (2), + DMICMMETHOD_DRIVER = (3), + DMICMMETHOD_DEVICE = (4), + DMICMMETHOD_USER = (256), + DMICM_SATURATE = (1), + DMICM_CONTRAST = (2), + DMICM_COLORMETRIC = (3), + DMICM_USER = (256), + DMMEDIA_STANDARD = (1), + DMMEDIA_GLOSSY = (3), + DMMEDIA_TRANSPARENCY = (2), + DMMEDIA_USER = (256), + DMDITHER_NONE = (1), + DMDITHER_COARSE = (2), + DMDITHER_FINE = (3), + DMDITHER_LINEART = (4), + DMDITHER_GRAYSCALE = (10), + DMDITHER_USER = (256), + RDH_RECTANGLES = (1), + TT_POLYGON_TYPE = (24), + TT_PRIM_LINE = (1), + TT_PRIM_QSPLINE = (2), + GCPCLASS_ARABIC = (2), + GCPCLASS_HEBREW = (2), + GCPCLASS_LATIN = (1), + GCPCLASS_LATINNUMBER = (5), + GCPCLASS_LOCALNUMBER = (4), + GCPCLASS_LATINNUMERICSEPARATOR = (7), + GCPCLASS_LATINNUMERICTERMINATOR = (6), + GCPCLASS_NEUTRAL = (3), + GCPCLASS_NUMERICSEPARATOR = (8), + GCPCLASS_PREBOUNDLTR = (128), + GCPCLASS_PREBOUNDRTL = (64), + GCPCLASS_POSTBOUNDLTR = (32), + GCPCLASS_POSTBOUNDRTL = (16), + GCPGLYPH_LINKBEFORE = (32768), + GCPGLYPH_LINKAFTER = (16384), + TT_AVAILABLE = (1), + TT_ENABLED = (2), + CA_NEGATIVE = (1), + CA_LOG_FILTER = (2), + ILLUMINANT_DEVICE_DEFAULT = (0), + ILLUMINANT_A = (1), + ILLUMINANT_B = (2), + ILLUMINANT_C = (3), + ILLUMINANT_D50 = (4), + ILLUMINANT_D55 = (5), + ILLUMINANT_D65 = (6), + ILLUMINANT_D75 = (7), + ILLUMINANT_F2 = (8), + ILLUMINANT_TUNGSTEN = (1), + ILLUMINANT_DAYLIGHT = (3), + ILLUMINANT_FLUORESCENT = (8), + ILLUMINANT_NTSC = (3), + DI_APPBANDING = (1), + EMR_HEADER = (1), + ENHMETA_SIGNATURE = (1179469088), + ENM_CHANGE = (1), + ENM_CORRECTTEXT = (4194304), + ENM_DROPFILES = (1048576), + ENM_KEYEVENTS = (65536), + ENM_MOUSEEVENTS = (131072), + ENM_PROTECTED = (2097152), + ENM_REQUESTRESIZE = (262144), + ENM_SCROLL = (4), + ENM_SELCHANGE = (524288), + ENM_UPDATE = (2), + ENM_NONE = (0), + ES_DISABLENOSCROLL = (8192), + ES_EX_NOCALLOLEINIT = (16777216), + ES_NOIME = (524288), + ES_SAVESEL = (32768), + ES_SELFIME = (262144), + ES_SUNKEN = (16384), + ES_VERTICAL = (4194304), + ES_SELECTIONBAR = (16777216), + ECOOP_SET = (1), + ECOOP_OR = (2), + ECOOP_AND = (3), + ECOOP_XOR = (4), + ECO_AUTOWORDSELECTION = (1), + ECO_AUTOVSCROLL = (64), + ECO_AUTOHSCROLL = (128), + ECO_NOHIDESEL = (256), + ECO_READONLY = (2048), + ECO_WANTRETURN = (4096), + ECO_SAVESEL = (32768), + ECO_SELECTIONBAR = (16777216), + ECO_VERTICAL = (4194304), + SCF_WORD = (2), + SCF_SELECTION = (1), + SF_TEXT = (1), + SF_RTF = (2), + SF_RTFNOOBJS = (3), + SF_TEXTIZED = (4), + SFF_SELECTION = (32768), + SFF_PLAINRTF = (16384), + WB_CLASSIFY = (3), + WB_LEFTBREAK = (6), + WB_PREVBREAK = (6), + WB_MOVEWORDLEFT = (4), + WB_MOVEWORDPREV = (4), + WB_MOVEWORDRIGHT = (5), + WB_MOVEWORDNEXT = (5), + WB_RIGHTBREAK = (7), + WB_NEXTBREAK = (7), + PC_LEADING = (2), + PC_FOLLOWING = (1), + PC_DELIMITER = (4), + PC_OVERFLOW = (3), + WBF_WORDWRAP = (16), + WBF_WORDBREAK = (32), + WBF_OVERFLOW = (64), + WBF_LEVEL1 = (128), + WBF_LEVEL2 = (256), + WBF_CUSTOM = (512), + WBF_BREAKAFTER = (64), + WBF_BREAKLINE = (32), + WBF_ISWHITE = (16), + CFM_BOLD = (1), + CFM_COLOR = (1073741824), + CFM_FACE = (536870912), + CFM_ITALIC = (2), + CFM_OFFSET = (268435456), + CFM_PROTECTED = (16), + CFM_SIZE = (0x80000000), + CFM_STRIKEOUT = (8), + CFM_UNDERLINE = (4), + CFE_AUTOCOLOR = (1073741824), + CFE_BOLD = (1), + CFE_ITALIC = (2), + CFE_STRIKEOUT = (8), + CFE_UNDERLINE = (4), + CFE_PROTECTED = (16), + PFM_ALIGNMENT = (8), + PFM_NUMBERING = (32), + PFM_OFFSET = (4), + PFM_OFFSETINDENT = (0x80000000), + PFM_RIGHTINDENT = (2), + PFM_STARTINDENT = (1), + PFM_TABSTOPS = (16), + PFN_BULLET = (1), + PFA_LEFT = (1), + PFA_RIGHT = (2), + PFA_CENTER = (3), + SEL_EMPTY = (0), + SEL_TEXT = (1), + SEL_OBJECT = (2), + SEL_MULTICHAR = (4), + SEL_MULTIOBJECT = (8), +} +const { +char* CF_RTF = ("Rich Text Format"); +char* CF_RETEXTOBJ = ("RichEdit Text and Objects"); +} +enum : DWORD { + ODT_BUTTON = (4), + ODT_COMBOBOX = (3), + ODT_LISTBOX = (2), + ODT_LISTVIEW = (102), + ODT_MENU = (1), + ODT_STATIC = (5), + ODT_TAB = (101), + ODT_HEADER = (100), + ODA_DRAWENTIRE = (1), + ODA_FOCUS = (4), + ODA_SELECT = (2), + ODS_CHECKED = (8), + ODS_COMBOBOXEDIT = (4096), + ODS_DEFAULT = (32), + ODS_DISABLED = (4), + ODS_FOCUS = (16), + ODS_GRAYED = (2), + ODS_SELECTED = (1), +} +const { +char* ANIMATE_CLASSW = ("SysAnimate32"); +char* HOTKEY_CLASSW = ("msctls_hotkey32"); +char* PROGRESS_CLASSW = ("msctls_progress32"); +char* STATUSCLASSNAMEW = ("msctls_statusbar32"); +char* TOOLBARCLASSNAMEW = ("ToolbarWindow32"); +char* TOOLTIPS_CLASSW = ("tooltips_class32"); +char* TRACKBAR_CLASSW = ("msctls_trackbar32"); +char* UPDOWN_CLASSW = ("msctls_updown32"); +char* WC_HEADERW = ("SysHeader32"); +char* WC_LISTVIEWW = ("SysListView32"); +char* WC_TABCONTROLW = ("SysTabControl32"); +char* WC_TREEVIEWW = ("SysTreeView32"); +} +enum : DWORD { + CCS_ADJUSTABLE = (0x20), + CCS_BOTTOM = (0x3), + CCS_NODIVIDER = (0x40), + CCS_NOMOVEY = (0x2), + CCS_NOPARENTALIGN = (0x8), + CCS_NORESIZE = (0x4), + CCS_TOP = (0x1), +} +const { +char* ANIMATE_CLASSA = ("SysAnimate32"); +char* HOTKEY_CLASSA = ("msctls_hotkey32"); +char* PROGRESS_CLASSA = ("msctls_progress32"); +char* STATUSCLASSNAMEA = ("msctls_statusbar32"); +char* TOOLBARCLASSNAMEA = ("ToolbarWindow32"); +char* TOOLTIPS_CLASSA = ("tooltips_class32"); +char* TRACKBAR_CLASSA = ("msctls_trackbar32"); +char* UPDOWN_CLASSA = ("msctls_updown32"); +char* WC_HEADERA = ("SysHeader32"); +char* WC_LISTVIEWA = ("SysListView32"); +char* WC_TABCONTROLA = ("SysTabControl32"); +char* WC_TREEVIEWA = ("SysTreeView32"); +char* ANIMATE_CLASS = (ANIMATE_CLASSA); +char* HOTKEY_CLASS = (HOTKEY_CLASSA); +char* PROGRESS_CLASS = (PROGRESS_CLASSA); +char* STATUSCLASSNAME = (STATUSCLASSNAMEA); +char* TOOLBARCLASSNAME = (TOOLBARCLASSNAMEA); +char* TOOLTIPS_CLASS = (TOOLTIPS_CLASSA); +char* TRACKBAR_CLASS = (TRACKBAR_CLASSA); +char* UPDOWN_CLASS = (UPDOWN_CLASSA); +char* WC_HEADER = (WC_HEADERA); +char* WC_LISTVIEW = (WC_LISTVIEWA); +char* WC_TABCONTROL = (WC_TABCONTROLA); +char* WC_TREEVIEW = (WC_TREEVIEWA); +} +enum : DWORD { + HDS_BUTTONS = (2), + HDS_HIDDEN = (8), + HDS_HORZ = (0), + HDI_BITMAP = (16), + HDI_FORMAT = (4), + HDI_HEIGHT = (1), + HDI_LPARAM = (8), + HDI_TEXT = (2), + HDI_WIDTH = (1), + HDF_CENTER = (2), + HDF_LEFT = (0), + HDF_RIGHT = (1), + HDF_RTLREADING = (4), + HDF_BITMAP = (8192), + HDF_OWNERDRAW = (32768), + HDF_STRING = (16384), + HDF_JUSTIFYMASK = (3), + HHT_NOWHERE = (1), + HHT_ONDIVIDER = (4), + HHT_ONDIVOPEN = (8), + HHT_ONHEADER = (2), + HHT_TOLEFT = (2048), + HHT_TORIGHT = (1024), + HINST_COMMCTRL = -(1), + IDB_STD_LARGE_COLOR = (1), + IDB_STD_SMALL_COLOR = (0), + IDB_VIEW_LARGE_COLOR = (5), + IDB_VIEW_SMALL_COLOR = (4), + STD_COPY = (1), + STD_CUT = (0), + STD_DELETE = (5), + STD_FILENEW = (6), + STD_FILEOPEN = (7), + STD_FILESAVE = (8), + STD_FIND = (12), + STD_HELP = (11), + STD_PASTE = (2), + STD_PRINT = (14), + STD_PRINTPRE = (9), + STD_PROPERTIES = (10), + STD_REDOW = (4), + STD_REPLACE = (13), + STD_UNDO = (3), + VIEW_LARGEICONS = (0), + VIEW_SMALLICONS = (1), + VIEW_LIST = (2), + VIEW_DETAILS = (3), + VIEW_SORTNAME = (4), + VIEW_SORTSIZE = (5), + VIEW_SORTDATE = (6), + VIEW_SORTTYPE = (7), + TBSTYLE_ALTDRAG = (1024), + TBSTYLE_TOOLTIPS = (256), + TBSTYLE_WRAPABLE = (512), + TBSTYLE_BUTTON = (0), + TBSTYLE_CHECK = (2), + TBSTYLE_CHECKGROUP = (6), + TBSTYLE_GROUP = (4), + TBSTYLE_SEP = (1), + TBSTATE_CHECKED = (1), + TBSTATE_ENABLED = (4), + TBSTATE_HIDDEN = (8), + TBSTATE_INDETERMINATE = (16), + TBSTATE_PRESSED = (2), + TBSTATE_WRAP = (32), + TTS_ALWAYSTIP = (1), + TTS_NOPREFIX = (2), + TTF_IDISHWND = (1), + TTF_CENTERTIP = (2), + TTF_RTLREADING = (4), + TTF_SUBCLASS = (16), + TTDT_AUTOMATIC = (0), + TTDT_AUTOPOP = (2), + TTDT_INITIAL = (3), + TTDT_RESHOW = (1), + SBARS_SIZEGRIP = (256), + DL_MOVECURSOR = (3), + DL_COPYCURSOR = (2), + DL_STOPCURSOR = (1), + UDS_ALIGNLEFT = (8), + UDS_ALIGNRIGHT = (4), + UDS_ARROWKEYS = (32), + UDS_AUTOBUDDY = (16), + UDS_HORZ = (64), + UDS_NOTHOUSANDS = (128), + UDS_SETBUDDYINT = (2), + UDS_WRAP = (1), + UD_MAXVAL = (32767), + UD_MINVAL = -((32767)), + HOTKEYF_ALT = (4), + HOTKEYF_CONTROL = (2), + HOTKEYF_EXT = (8), + HOTKEYF_SHIFT = (1), + HKCOMB_A = (8), + HKCOMB_C = (4), + HKCOMB_CA = (64), + HKCOMB_NONE = (1), + HKCOMB_S = (2), + HKCOMB_SA = (32), + HKCOMB_SC = (16), + HKCOMB_SCA = (128), + TBS_HORZ = (0), + TBS_VERT = (2), + TBS_AUTOTICKS = (1), + TBS_NOTICKS = (16), + TBS_TOP = (4), + TBS_BOTTOM = (0), + TBS_LEFT = (4), + TBS_RIGHT = (0), + TBS_BOTH = (8), + TBS_ENABLESELRANGE = (32), + TBS_FIXEDLENGTH = (64), + TBS_NOTHUMB = (128), + TB_BOTTOM = (7), + TB_ENDTRACK = (8), + TB_LINEDOWN = (1), + TB_LINEUP = (0), + TB_PAGEDOWN = (3), + TB_PAGEUP = (2), + TB_THUMBPOSITION = (4), + TB_THUMBTRACK = (5), + TB_TOP = (6), + LVS_ALIGNLEFT = (2048), + LVS_ALIGNTOP = (0), + LVS_AUTOARRANGE = (256), + LVS_EDITLABELS = (512), + LVS_ICON = (0), + LVS_LIST = (3), + LVS_NOCOLUMNHEADER = (16384), + LVS_NOLABELWRAP = (128), + LVS_NOSCROLL = (8192), + LVS_NOSORTHEADER = (32768), + LVS_OWNERDRAWFIXED = (1024), + LVS_REPORT = (1), + LVS_SHAREIMAGELISTS = (64), + LVS_SHOWSELALWAYS = (8), + LVS_SINGLESEL = (4), + LVS_SMALLICON = (2), + LVS_SORTASCENDING = (16), + LVS_SORTDESCENDING = (32), + LVS_TYPESTYLEMASK = (64512), + LVSIL_NORMAL = (0), + LVSIL_SMALL = (1), + LVSIL_STATE = (2), + LVIS_CUT = (4), + LVIS_DROPHILITED = (8), + LVIS_FOCUSED = (1), + LVIS_SELECTED = (2), + LVIS_OVERLAYMASK = (3840), + LVIS_STATEIMAGEMASK = (61440), +} +const { +wchar* LPSTR_TEXTCALLBACKW = cast(LPWSTR)(-(1)); +char* LPSTR_TEXTCALLBACKA = cast(LPSTR)(-(1)); +char* LPSTR_TEXTCALLBACK = (LPSTR_TEXTCALLBACKA); +} +enum : DWORD { + LVIF_TEXT = (1), + LVIF_IMAGE = (2), + LVIF_PARAM = (4), + LVIF_STATE = (8), + LVIF_DI_SETITEM = (4096), + LVNI_ABOVE = (256), + LVNI_ALL = (0), + LVNI_BELOW = (512), + LVNI_TOLEFT = (1024), + LVNI_TORIGHT = (2048), + LVNI_CUT = (4), + LVNI_DROPHILITED = (8), + LVNI_FOCUSED = (1), + LVNI_SELECTED = (2), + LVFI_PARAM = (1), + LVFI_PARTIAL = (8), + LVFI_STRING = (2), + LVFI_WRAP = (32), + LVFI_NEARESTXY = (64), + LVHT_ABOVE = (8), + LVHT_BELOW = (16), + LVHT_NOWHERE = (1), + LVHT_ONITEMICON = (2), + LVHT_ONITEMLABEL = (4), + LVHT_ONITEMSTATEICON = (8), + LVHT_TOLEFT = (64), + LVHT_TORIGHT = (32), + LVCF_FMT = (1), + LVCF_SUBITEM = (8), + LVCF_TEXT = (4), + LVCF_WIDTH = (2), + LVCFMT_CENTER = (2), + LVCFMT_LEFT = (0), + LVCFMT_RIGHT = (1), + LVIR_BOUNDS = (0), + LVIR_ICON = (1), + LVIR_LABEL = (2), + LVIR_SELECTBOUNDS = (3), + LVA_ALIGNLEFT = (1), + LVA_ALIGNTOP = (2), + LVA_DEFAULT = (0), + LVA_SNAPTOGRID = (5), + LVSCW_AUTOSIZE = -((1)), + LVSCW_AUTOSIZE_USEHEADER = -((2)), + TVS_DISABLEDRAGDROP = (16), + TVS_EDITLABELS = (8), + TVS_HASBUTTONS = (1), + TVS_HASLINES = (2), + TVS_LINESATROOT = (4), + TVS_SHOWSELALWAYS = (32), + TVIS_BOLD = (16), + TVIS_CUT = (4), + TVIS_DROPHILITED = (8), + TVIS_EXPANDED = (32), + TVIS_EXPANDEDONCE = (64), + TVIS_FOCUSED = (1), + TVIS_OVERLAYMASK = (3840), + TVIS_SELECTED = (2), + TVIS_STATEIMAGEMASK = (61440), + TVIS_USERMASK = (61440), + TVIF_CHILDREN = (64), + TVIF_HANDLE = (16), + TVIF_IMAGE = (2), + TVIF_PARAM = (4), + TVIF_SELECTEDIMAGE = (32), + TVIF_STATE = (8), + TVIF_TEXT = (1), + I_CHILDRENCALLBACK = -((1)), + I_IMAGECALLBACK = -((1)), +} + +struct TREEITEM +{ +} + +alias TREEITEM* HTREEITEM; +alias TREEITEM TTREEITEM; +alias TREEITEM* PTREEITEM; +enum : DWORD { + TVI_ROOT = (0xFFFF0000), + TVI_FIRST = (0xFFFF0001), + TVI_LAST = (0xFFFF0002), + TVI_SORT = (0xFFFF0003), + TVHT_ABOVE = (256), + TVHT_BELOW = (512), + TVHT_NOWHERE = (1), + TVHT_ONITEM = (70), + TVHT_ONITEMBUTTON = (16), + TVHT_ONITEMICON = (2), + TVHT_ONITEMINDENT = (8), + TVHT_ONITEMLABEL = (4), + TVHT_ONITEMRIGHT = (32), + TVHT_ONITEMSTATEICON = (64), + TVHT_TOLEFT = (2048), + TVHT_TORIGHT = (1024), + TVE_COLLAPSE = (1), + TVE_COLLAPSERESET = (32768), + TVE_EXPAND = (2), + TVE_TOGGLE = (3), + TVSIL_NORMAL = (0), + TVSIL_STATE = (2), + TVGN_CARET = (9), + TVGN_CHILD = (4), + TVGN_DROPHILITE = (8), + TVGN_FIRSTVISIBLE = (5), + TVGN_NEXT = (1), + TVGN_NEXTVISIBLE = (6), + TVGN_PARENT = (3), + TVGN_PREVIOUS = (2), + TVGN_PREVIOUSVISIBLE = (7), + TVGN_ROOT = (0), + TVC_BYKEYBOARD = (2), + TVC_BYMOUSE = (1), + TVC_UNKNOWN = (0), + TCS_BUTTONS = (256), + TCS_FIXEDWIDTH = (1024), + TCS_FOCUSNEVER = (32768), + TCS_FOCUSONBUTTONDOWN = (4096), + TCS_FORCEICONLEFT = (16), + TCS_FORCELABELLEFT = (32), + TCS_MULTILINE = (512), + TCS_OWNERDRAWFIXED = (8192), + TCS_RAGGEDRIGHT = (2048), + TCS_RIGHTJUSTIFY = (0), + TCS_SINGLELINE = (0), + TCS_TABS = (0), + TCS_TOOLTIPS = (16384), + TCIF_TEXT = (1), + TCIF_IMAGE = (2), + TCIF_PARAM = (8), + TCIF_RTLREADING = (4), + TCHT_NOWHERE = (1), + TCHT_ONITEM = (6), + TCHT_ONITEMICON = (2), + TCHT_ONITEMLABEL = (4), + ACS_AUTOPLAY = (4), + ACS_CENTER = (1), + ACS_TRANSPARENT = (2), + DIALOPTION_BILLING = (64), + DIALOPTION_QUIET = (128), + DIALOPTION_DIALTONE = (256), + MDMVOLFLAG_LOW = (1), + MDMVOLFLAG_MEDIUM = (2), + MDMVOLFLAG_HIGH = (4), + MDMVOL_LOW = (0), + MDMVOL_MEDIUM = (1), + MDMVOL_HIGH = (2), + MDMSPKRFLAG_OFF = (1), + MDMSPKRFLAG_DIAL = (2), + MDMSPKRFLAG_ON = (4), + MDMSPKRFLAG_CALLSETUP = (8), + MDMSPKR_OFF = (0), + MDMSPKR_DIAL = (1), + MDMSPKR_ON = (2), + MDMSPKR_CALLSETUP = (3), + MDM_BLIND_DIAL = (512), + MDM_CCITT_OVERRIDE = (64), + MDM_CELLULAR = (8), + MDM_COMPRESSION = (1), + MDM_ERROR_CONTROL = (2), + MDM_FLOWCONTROL_HARD = (16), + MDM_FLOWCONTROL_SOFT = (32), + MDM_FORCED_EC = (4), + MDM_SPEED_ADJUST = (128), + MDM_TONE_DIAL = (256), + MDM_V23_OVERRIDE = (1024), + LANG_BULGARIAN = (2), + LANG_CHINESE = (4), + LANG_CROATIAN = (26), + LANG_CZECH = (5), + LANG_DANISH = (6), + LANG_DUTCH = (19), + LANG_ENGLISH = (9), + LANG_FINNISH = (11), + LANG_FRENCH = (12), + LANG_GERMAN = (7), + LANG_GREEK = (8), + LANG_HUNGARIAN = (14), + LANG_ICELANDIC = (15), + LANG_ITALIAN = (16), + LANG_JAPANESE = (17), + LANG_KOREAN = (18), + LANG_NEUTRAL = (0), + LANG_NORWEGIAN = (20), + LANG_POLISH = (21), + LANG_PORTUGUESE = (22), + LANG_ROMANIAN = (24), + LANG_RUSSIAN = (25), + LANG_SLOVAK = (27), + LANG_SLOVENIAN = (36), + LANG_SPANISH = (10), + LANG_SWEDISH = (29), + LANG_TURKISH = (31), + SUBLANG_CHINESE_SIMPLIFIED = (2), + SUBLANG_CHINESE_TRADITIONAL = (1), + SUBLANG_CHINESE_HONGKONG = (3), + SUBLANG_CHINESE_SINGAPORE = (4), + SUBLANG_DEFAULT = (1), + SUBLANG_DUTCH = (1), + SUBLANG_DUTCH_BELGIAN = (2), + SUBLANG_ENGLISH_AUS = (3), + SUBLANG_ENGLISH_CAN = (4), + SUBLANG_ENGLISH_EIRE = (6), + SUBLANG_ENGLISH_NZ = (5), + SUBLANG_ENGLISH_UK = (2), + SUBLANG_ENGLISH_US = (1), + SUBLANG_FRENCH = (1), + SUBLANG_FRENCH_BELGIAN = (2), + SUBLANG_FRENCH_CANADIAN = (3), + SUBLANG_FRENCH_SWISS = (4), + SUBLANG_GERMAN = (1), + SUBLANG_GERMAN_AUSTRIAN = (3), + SUBLANG_GERMAN_SWISS = (2), + SUBLANG_ITALIAN = (1), + SUBLANG_ITALIAN_SWISS = (2), + SUBLANG_NEUTRAL = (0), + SUBLANG_NORWEGIAN_BOKMAL = (1), + SUBLANG_NORWEGIAN_NYNORSK = (2), + SUBLANG_PORTUGUESE = (2), + SUBLANG_PORTUGUESE_BRAZILIAN = (1), + SUBLANG_SPANISH = (1), + SUBLANG_SPANISH_MEXICAN = (2), + SUBLANG_SPANISH_MODERN = (3), + SUBLANG_SYS_DEFAULT = (2), + NLS_VALID_LOCALE_MASK = (1048575), + SORT_DEFAULT = (0), + SORT_JAPANESE_XJIS = (0), + SORT_JAPANESE_UNICODE = (1), + SORT_CHINESE_BIG5 = (0), + SORT_CHINESE_UNICODE = (1), + SORT_KOREAN_KSC = (0), + SORT_KOREAN_UNICODE = (1), + PROCESSOR_INTEL_386 = (386), + PROCESSOR_INTEL_486 = (486), + PROCESSOR_INTEL_PENTIUM = (586), + PROCESSOR_MIPS_R4000 = (4000), + PROCESSOR_ALPHA_21064 = (21064), + COMPRESSION_FORMAT_NONE = (0), + COMPRESSION_FORMAT_DEFAULT = (1), + COMPRESSION_FORMAT_LZNT1 = (2), + TAPE_DRIVE_COMPRESSION = (131072), + TAPE_DRIVE_ECC = (65536), + TAPE_DRIVE_ERASE_BOP_ONLY = (64), + TAPE_DRIVE_ERASE_LONG = (32), + TAPE_DRIVE_ERASE_IMMEDIATE = (128), + TAPE_DRIVE_ERASE_SHORT = (16), + TAPE_DRIVE_FIXED = (1), + TAPE_DRIVE_FIXED_BLOCK = (1024), + TAPE_DRIVE_INITIATOR = (4), + TAPE_DRIVE_PADDING = (262144), + TAPE_DRIVE_GET_ABSOLUTE_BLK = (1048576), + TAPE_DRIVE_GET_LOGICAL_BLK = (2097152), + TAPE_DRIVE_REPORT_SMKS = (524288), + TAPE_DRIVE_SELECT = (2), + TAPE_DRIVE_SET_EOT_WZ_SIZE = (4194304), + TAPE_DRIVE_TAPE_CAPACITY = (256), + TAPE_DRIVE_TAPE_REMAINING = (512), + TAPE_DRIVE_VARIABLE_BLOCK = (2048), + TAPE_DRIVE_WRITE_PROTECT = (4096), + TAPE_DRIVE_ABS_BLK_IMMED = -((2147475456)), + TAPE_DRIVE_ABSOLUTE_BLK = -((2147479552)), + TAPE_DRIVE_END_OF_DATA = -((2147418112)), + TAPE_DRIVE_FILEMARKS = -((2147221504)), + TAPE_DRIVE_LOAD_UNLOAD = -((2147483647)), + TAPE_DRIVE_LOAD_UNLD_IMMED = -((2147483616)), + TAPE_DRIVE_LOCK_UNLOCK = -((2147483644)), + TAPE_DRIVE_LOCK_UNLK_IMMED = -((2147483520)), + TAPE_DRIVE_LOG_BLK_IMMED = -((2147450880)), + TAPE_DRIVE_LOGICAL_BLK = -((2147467264)), + TAPE_DRIVE_RELATIVE_BLKS = -((2147352576)), + TAPE_DRIVE_REVERSE_POSITION = -((2143289344)), + TAPE_DRIVE_REWIND_IMMEDIATE = -((2147483640)), + TAPE_DRIVE_SEQUENTIAL_FMKS = -((2146959360)), + TAPE_DRIVE_SEQUENTIAL_SMKS = -((2145386496)), + TAPE_DRIVE_SET_BLOCK_SIZE = -((2147483632)), + TAPE_DRIVE_SET_COMPRESSION = -((2147483136)), + TAPE_DRIVE_SET_ECC = -((2147483392)), + TAPE_DRIVE_SET_PADDING = -((2147482624)), + TAPE_DRIVE_SET_REPORT_SMKS = -((2147481600)), + TAPE_DRIVE_SETMARKS = -((2146435072)), + TAPE_DRIVE_SPACE_IMMEDIATE = -((2139095040)), + TAPE_DRIVE_TENSION = -((2147483646)), + TAPE_DRIVE_TENSION_IMMED = -((2147483584)), + TAPE_DRIVE_WRITE_FILEMARKS = -((2113929216)), + TAPE_DRIVE_WRITE_LONG_FMKS = -((2013265920)), + TAPE_DRIVE_WRITE_MARK_IMMED = -((1879048192)), + TAPE_DRIVE_WRITE_SETMARKS = -((2130706432)), + TAPE_DRIVE_WRITE_SHORT_FMKS = -((2080374784)), + STANDARD_RIGHTS_REQUIRED = (0xf0000), + STANDARD_RIGHTS_WRITE = (0x20000), + STANDARD_RIGHTS_READ = (0x20000), + STANDARD_RIGHTS_EXECUTE = (0x20000), + STANDARD_RIGHTS_ALL = (0x1f0000), + SPECIFIC_RIGHTS_ALL = (0xffff), + MAXIMUM_ALLOWED = (0x2000000), + GENERIC_ALL = (0x10000000), + SECURITY_NULL_RID = (0), + SECURITY_WORLD_RID = (0), + SECURITY_LOCAL_RID = (0), + SECURITY_CREATOR_OWNER_RID = (0), + SECURITY_CREATOR_GROUP_RID = (0x1), + SECURITY_DIALUP_RID = (0x1), + SECURITY_NETWORK_RID = (0x2), + SECURITY_BATCH_RID = (0x3), + SECURITY_INTERACTIVE_RID = (0x4), + SECURITY_LOGON_IDS_RID = (0x5), + SECURITY_LOGON_IDS_RID_COUNT = (0x3), + SECURITY_SERVICE_RID = (0x6), + SECURITY_LOCAL_SYSTEM_RID = (0x12), + SECURITY_BUILTIN_DOMAIN_RID = (0x20), + DOMAIN_USER_RID_ADMIN = (0x1f4), + DOMAIN_USER_RID_GUEST = (0x1f5), + DOMAIN_GROUP_RID_ADMINS = (0x200), + DOMAIN_GROUP_RID_USERS = (0x201), + DOMAIN_ALIAS_RID_ADMINS = (0x220), + DOMAIN_ALIAS_RID_USERS = (0x221), + DOMAIN_ALIAS_RID_GUESTS = (0x222), + DOMAIN_ALIAS_RID_POWER_USERS = (0x223), + DOMAIN_ALIAS_RID_ACCOUNT_OPS = (0x224), + DOMAIN_ALIAS_RID_SYSTEM_OPS = (0x225), + DOMAIN_ALIAS_RID_PRINT_OPS = (0x226), + DOMAIN_ALIAS_RID_BACKUP_OPS = (0x227), + DOMAIN_ALIAS_RID_REPLICATOR = (0x228), + SE_GROUP_MANDATORY = (0x1), + SE_GROUP_ENABLED_BY_DEFAULT = (0x2), + SE_GROUP_ENABLED = (0x4), + SE_GROUP_OWNER = (0x8), + SE_GROUP_LOGON_ID = (0xc0000000), + ACL_REVISION = (2), + ACCESS_ALLOWED_ACE_TYPE = (0x0), + ACCESS_DENIED_ACE_TYPE = (0x1), + SYSTEM_AUDIT_ACE_TYPE = (0x2), + SYSTEM_ALARM_ACE_TYPE = (0x3), + OBJECT_INHERIT_ACE = (0x1), + CONTAINER_INHERIT_ACE = (0x2), + NO_PROPAGATE_INHERIT_ACE = (0x4), + INHERIT_ONLY_ACE = (0x8), + SUCCESSFUL_ACCESS_ACE_FLAG = (0x40), + FAILED_ACCESS_ACE_FLAG = (0x80), + SECURITY_DESCRIPTOR_MIN_LENGTH = (20), + SE_OWNER_DEFAULTED = (1), + SE_GROUP_DEFAULTED = (2), + SE_DACL_PRESENT = (4), + SE_DACL_DEFAULTED = (8), + SE_SACL_PRESENT = (16), + SE_SACL_DEFAULTED = (32), + SE_SELF_RELATIVE = (32768), + SE_PRIVILEGE_ENABLED_BY_DEFAULT = (0x1), + SE_PRIVILEGE_ENABLED = (0x2), + SE_PRIVILEGE_USED_FOR_ACCESS = (0x80000000), + PRIVILEGE_SET_ALL_NECESSARY = (0x1), + OFN_ALLOWMULTISELECT = (0x200), + OFN_CREATEPROMPT = (0x2000), + OFN_ENABLEHOOK = (0x20), + OFN_ENABLETEMPLATE = (0x40), + OFN_ENABLETEMPLATEHANDLE = (0x80), + OFN_EXPLORER = (0x80000), + OFN_EXTENSIONDIFFERENT = (0x400), + OFN_FILEMUSTEXIST = (0x1000), + OFN_HIDEREADONLY = (0x4), + OFN_LONGNAMES = (0x200000), + OFN_NOCHANGEDIR = (0x8), + OFN_NODEREFERENCELINKS = (0x100000), + OFN_NOLONGNAMES = (0x40000), + OFN_NONETWORKBUTTON = (0x20000), + OFN_NOREADONLYRETURN = (0x8000), + OFN_NOTESTFILECREATE = (0x10000), + OFN_NOVALIDATE = (0x100), + OFN_OVERWRITEPROMPT = (0x2), + OFN_PATHMUSTEXIST = (0x800), + OFN_READONLY = (0x1), + OFN_SHAREAWARE = (0x4000), + OFN_SHOWHELP = (0x10), + OFN_SHAREFALLTHROUGH = (0x2), + OFN_SHARENOWARN = (0x1), + OFN_SHAREWARN = (0), + CDN_INITDONE = (0xfffffda7), + CDN_SELCHANGE = (0xfffffda6), + CDN_FOLDERCHANGE = (0xfffffda5), + CDN_SHAREVIOLATION = (0xfffffda4), + CDN_HELP = (0xfffffda3), + CDN_FILEOK = (0xfffffda2), + CDN_TYPECHANGE = (0xfffffda1), + CDM_GETFILEPATH = (0x465), + CDM_GETFOLDERIDLIST = (0x467), + CDM_GETFOLDERPATH = (0x466), + CDM_GETSPEC = (0x464), + CDM_HIDECONTROL = (0x469), + CDM_SETCONTROLTEXT = (0x468), + CDM_SETDEFEXT = (0x46a), + CC_ENABLEHOOK = (0x10), + CC_ENABLETEMPLATE = (0x20), + CC_ENABLETEMPLATEHANDLE = (0x40), + CC_FULLOPEN = (0x2), + CC_PREVENTFULLOPEN = (0x4), + CC_RGBINIT = (0x1), + CC_SHOWHELP = (0x8), + CC_SOLIDCOLOR = (0x80), + FR_DIALOGTERM = (0x40), + FR_DOWN = (0x1), + FR_ENABLEHOOK = (0x100), + FR_ENABLETEMPLATE = (0x200), + FR_ENABLETEMPLATEHANDLE = (0x2000), + FR_FINDNEXT = (0x8), + FR_HIDEUPDOWN = (0x4000), + FR_HIDEMATCHCASE = (0x8000), + FR_HIDEWHOLEWORD = (0x10000), + FR_MATCHCASE = (0x4), + FR_NOMATCHCASE = (0x800), + FR_NOUPDOWN = (0x400), + FR_NOWHOLEWORD = (0x1000), + FR_REPLACE = (0x10), + FR_REPLACEALL = (0x20), + FR_SHOWHELP = (0x80), + FR_WHOLEWORD = (0x2), + CF_APPLY = (0x200), + CF_ANSIONLY = (0x400), + CF_BOTH = (0x3), + CF_TTONLY = (0x40000), + CF_EFFECTS = (0x100), + CF_ENABLEHOOK = (0x8), + CF_ENABLETEMPLATE = (0x10), + CF_ENABLETEMPLATEHANDLE = (0x20), + CF_FIXEDPITCHONLY = (0x4000), + CF_FORCEFONTEXIST = (0x10000), + CF_INITTOLOGFONTSTRUCT = (0x40), + CF_LIMITSIZE = (0x2000), + CF_NOOEMFONTS = (0x800), + CF_NOFACESEL = (0x80000), + CF_NOSCRIPTSEL = (0x800000), + CF_NOSTYLESEL = (0x100000), + CF_NOSIZESEL = (0x200000), + CF_NOSIMULATIONS = (0x1000), + CF_NOVECTORFONTS = (0x800), + CF_NOVERTFONTS = (0x1000000), + CF_PRINTERFONTS = (0x2), + CF_SCALABLEONLY = (0x20000), + CF_SCREENFONTS = (0x1), + CF_SCRIPTSONLY = (0x400), + CF_SELECTSCRIPT = (0x400000), + CF_SHOWHELP = (0x4), + CF_USESTYLE = (0x80), + CF_WYSIWYG = (0x8000), + BOLD_FONTTYPE = (0x100), + ITALIC_FONTTYPE = (0x200), + PRINTER_FONTTYPE = (0x4000), + REGULAR_FONTTYPE = (0x400), + SCREEN_FONTTYPE = (0x2000), + SIMULATED_FONTTYPE = (0x8000), +} +const { +char* COLOROKSTRINGW = ("commdlg_ColorOK"); +char* FILEOKSTRINGW = ("commdlg_FileNameOK"); +char* FINDMSGSTRINGW = ("commdlg_FindReplace"); +char* HELPMSGSTRINGW = ("commdlg_help"); +char* LBSELCHSTRINGW = ("commdlg_LBSelChangedNotify"); +char* SETRGBSTRINGW = ("commdlg_SetRGBColor"); +char* SHAREVISTRINGW = ("commdlg_ShareViolation"); +char* COLOROKSTRINGA = ("commdlg_ColorOK"); +char* FILEOKSTRINGA = ("commdlg_FileNameOK"); +char* FINDMSGSTRINGA = ("commdlg_FindReplace"); +char* HELPMSGSTRINGA = ("commdlg_help"); +char* LBSELCHSTRINGA = ("commdlg_LBSelChangedNotify"); +char* SETRGBSTRINGA = ("commdlg_SetRGBColor"); +char* SHAREVISTRINGA = ("commdlg_ShareViolation"); +char* COLOROKSTRING = (COLOROKSTRINGA); +char* FILEOKSTRING = (FILEOKSTRINGA); +char* FINDMSGSTRING = (FINDMSGSTRINGA); +char* HELPMSGSTRING = (HELPMSGSTRINGA); +char* LBSELCHSTRING = (LBSELCHSTRINGA); +char* SETRGBSTRING = (SETRGBSTRINGA); +char* SHAREVISTRING = (SHAREVISTRINGA); +} +enum : DWORD { + CD_LBSELCHANGE = (0), + CD_LBSELADD = (2), + CD_LBSELSUB = (1), + CD_LBSELNOITEMS = -((1)), + DN_DEFAULTPRN = (1), + PD_ALLPAGES = (0), + PD_COLLATE = (16), + PD_DISABLEPRINTTOFILE = (524288), + PD_ENABLEPRINTHOOK = (4096), + PD_ENABLEPRINTTEMPLATE = (16384), + PD_ENABLEPRINTTEMPLATEHANDLE = (65536), + PD_ENABLESETUPHOOK = (8192), + PD_ENABLESETUPTEMPLATE = (32768), + PD_ENABLESETUPTEMPLATEHANDLE = (131072), + PD_HIDEPRINTTOFILE = (1048576), + PD_NOPAGENUMS = (8), + PD_NOSELECTION = (4), + PD_NOWARNING = (128), + PD_PAGENUMS = (2), + PD_PRINTSETUP = (64), + PD_PRINTTOFILE = (32), + PD_RETURNDC = (256), + PD_RETURNDEFAULT = (1024), + PD_RETURNIC = (512), + PD_SELECTION = (1), + PD_SHOWHELP = (2048), + PD_USEDEVMODECOPIES = (262144), + PD_USEDEVMODECOPIESANDCOLLATE = (262144), + PSD_DEFAULTMINMARGINS = (0), + PSD_DISABLEMARGINS = (16), + PSD_DISABLEORIENTATION = (256), + PSD_DISABLEPAGEPAINTING = (524288), + PSD_DISABLEPAPER = (512), + PSD_DISABLEPRINTER = (32), + PSD_ENABLEPAGEPAINTHOOK = (262144), + PSD_ENABLEPAGESETUPHOOK = (8192), + PSD_ENABLEPAGESETUPTEMPLATE = (32768), + PSD_ENABLEPAGESETUPTEMPLATEHANDLE = (131072), + PSD_INHUNDREDTHSOFMILLIMETERS = (8), + PSD_INTHOUSANDTHSOFINCHES = (4), + PSD_INWININIINTLMEASURE = (0), + PSD_MARGINS = (2), + PSD_MINMARGINS = (1), + PSD_NOWARNING = (128), + PSD_RETURNDEFAULT = (1024), + PSD_SHOWHELP = (2048), + SW_OTHERUNZOOM = (4), + SW_OTHERZOOM = (2), + SW_PARENTCLOSING = (1), + SW_PARENTOPENING = (3), + VK_LBUTTON = (1), + VK_RBUTTON = (2), + VK_CANCEL = (3), + VK_MBUTTON = (4), + VK_BACK = (8), + VK_TAB = (9), + VK_CLEAR = (12), + VK_RETURN = (13), + VK_SHIFT = (16), + VK_CONTROL = (17), + VK_MENU = (18), + VK_PAUSE = (19), + VK_CAPITAL = (20), + VK_ESCAPE = (27), + VK_SPACE = (32), + VK_PRIOR = (33), + VK_NEXT = (34), + VK_END = (35), + VK_HOME = (36), + VK_LEFT = (37), + VK_UP = (38), + VK_RIGHT = (39), + VK_DOWN = (40), + VK_SELECT = (41), + VK_PRINT = (42), + VK_EXECUTE = (43), + VK_SNAPSHOT = (44), + VK_INSERT = (45), + VK_DELETE = (46), + VK_HELP = (47), + VK_0 = (48), + VK_1 = (49), + VK_2 = (50), + VK_3 = (51), + VK_4 = (52), + VK_5 = (53), + VK_6 = (54), + VK_7 = (55), + VK_8 = (56), + VK_9 = (57), + VK_A = (65), + VK_B = (66), + VK_C = (67), + VK_D = (68), + VK_E = (69), + VK_F = (70), + VK_G = (71), + VK_H = (72), + VK_I = (73), + VK_J = (74), + VK_K = (75), + VK_L = (76), + VK_M = (77), + VK_N = (78), + VK_O = (79), + VK_P = (80), + VK_Q = (81), + VK_R = (82), + VK_S = (83), + VK_T = (84), + VK_U = (85), + VK_V = (86), + VK_W = (87), + VK_X = (88), + VK_Y = (89), + VK_Z = (90), + VK_NUMPAD0 = (96), + VK_NUMPAD1 = (97), + VK_NUMPAD2 = (98), + VK_NUMPAD3 = (99), + VK_NUMPAD4 = (100), + VK_NUMPAD5 = (101), + VK_NUMPAD6 = (102), + VK_NUMPAD7 = (103), + VK_NUMPAD8 = (104), + VK_NUMPAD9 = (105), + VK_MULTIPLY = (106), + VK_ADD = (107), + VK_SEPARATOR = (108), + VK_SUBTRACT = (109), + VK_DECIMAL = (110), + VK_DIVIDE = (111), + VK_F1 = (112), + VK_F2 = (113), + VK_F3 = (114), + VK_F4 = (115), + VK_F5 = (116), + VK_F6 = (117), + VK_F7 = (118), + VK_F8 = (119), + VK_F9 = (120), + VK_F10 = (121), + VK_F11 = (122), + VK_F12 = (123), + VK_F13 = (124), + VK_F14 = (125), + VK_F15 = (126), + VK_F16 = (127), + VK_F17 = (128), + VK_F18 = (129), + VK_F19 = (130), + VK_F20 = (131), + VK_F21 = (132), + VK_F22 = (133), + VK_F23 = (134), + VK_F24 = (135), + VK_NUMLOCK = (144), + VK_SCROLL = (145), + VK_LSHIFT = (160), + VK_LCONTROL = (162), + VK_LMENU = (164), + VK_RSHIFT = (161), + VK_RCONTROL = (163), + VK_RMENU = (165), + VK_PROCESSKEY = (229), + KF_ALTDOWN = (8192), + KF_DLGMODE = (2048), + KF_EXTENDED = (256), + KF_MENUMODE = (4096), + KF_REPEAT = (16384), + KF_UP = (32768), + KL_NAMELENGTH = (9), + WA_ACTIVE = (1), + WA_CLICKACTIVE = (2), + WA_INACTIVE = (0), + PWR_CRITICALRESUME = (3), + PWR_SUSPENDREQUEST = (1), + PWR_SUSPENDRESUME = (2), + PWR_FAIL = -((1)), + PWR_OK = (1), + NF_QUERY = (3), + NF_REQUERY = (4), + NFR_ANSI = (1), + NFR_UNICODE = (2), + WMSZ_BOTTOM = (6), + WMSZ_BOTTOMLEFT = (7), + WMSZ_BOTTOMRIGHT = (8), + WMSZ_LEFT = (1), + WMSZ_RIGHT = (2), + WMSZ_TOP = (3), + WMSZ_TOPLEFT = (4), + WMSZ_TOPRIGHT = (5), + MA_ACTIVATE = (1), + MA_ACTIVATEANDEAT = (2), + MA_NOACTIVATE = (3), + MA_NOACTIVATEANDEAT = (4), + SIZE_MAXHIDE = (4), + SIZE_MAXIMIZED = (2), + SIZE_MAXSHOW = (3), + SIZE_MINIMIZED = (1), + SIZE_RESTORED = (0), + WVR_ALIGNTOP = (16), + WVR_ALIGNLEFT = (32), + WVR_ALIGNBOTTOM = (64), + WVR_ALIGNRIGHT = (128), + WVR_HREDRAW = (256), + WVR_VREDRAW = (512), + WVR_REDRAW = (768), + WVR_VALIDRECTS = (1024), + HTBOTTOM = (15), + HTBOTTOMLEFT = (16), + HTBOTTOMRIGHT = (17), + HTCAPTION = (2), + HTCLIENT = (1), + HTERROR = -((2)), + HTGROWBOX = (4), + HTHSCROLL = (6), + HTLEFT = (10), + HTMENU = (5), + HTNOWHERE = (0), + HTREDUCE = (8), + HTRIGHT = (11), + HTSIZE = (4), + HTSYSMENU = (3), + HTTOP = (12), + HTTOPLEFT = (13), + HTTOPRIGHT = (14), + HTTRANSPARENT = -((1)), + HTVSCROLL = (7), + HTZOOM = (9), + MK_CONTROL = (8), + MK_LBUTTON = (1), + MK_MBUTTON = (16), + MK_RBUTTON = (2), + MK_SHIFT = (4), + CS_BYTEALIGNCLIENT = (4096), + CS_BYTEALIGNWINDOW = (8192), + CS_CLASSDC = (64), + CS_DBLCLKS = (8), + CS_GLOBALCLASS = (16384), + CS_HREDRAW = (2), + CS_KEYCVTWINDOW = (4), + CS_NOCLOSE = (512), + CS_NOKEYCVT = (256), + CS_OWNDC = (32), + CS_PARENTDC = (128), + CS_SAVEBITS = (2048), + CS_VREDRAW = (1), + DLGWINDOWEXTRA = (30), + FALT = (16), + FCONTROL = (8), + FNOINVERT = (2), + FSHIFT = (4), + FVIRTKEY = (1), + MIIM_CHECKMARKS = (8), + MIIM_DATA = (32), + MIIM_ID = (2), + MIIM_STATE = (1), + MIIM_SUBMENU = (4), + MIIM_TYPE = (16), + MFT_BITMAP = (0x4), + MFT_MENUBARBREAK = (0x20), + MFT_MENUBREAK = (0x40), + MFT_OWNERDRAW = (0x100), + MFT_RADIOCHECK = (0x200), + MFT_RIGHTJUSTIFY = (0x4000), + MFT_SEPARATOR = (0x800), + MFT_STRING = (0), + MFS_CHECKED = (0x8), + MFS_DEFAULT = (0x1000), + MFS_DISABLED = (0x3), + MFS_ENABLED = (0), + MFS_GRAYED = (0x3), + MFS_HILITE = (0x80), + MFS_UNCHECKED = (0), + MFS_UNHILITE = (0), + SERKF_AVAILABLE = (2), + SERKF_INDICATOR = (4), + SERKF_SERIALKEYSON = (1), + FKF_AVAILABLE = (2), + FKF_CLICKON = (64), + FKF_FILTERKEYSON = (1), + FKF_HOTKEYACTIVE = (4), + FKF_HOTKEYSOUND = (16), + FKF_CONFIRMHOTKEY = (8), + FKF_INDICATOR = (32), + HELPINFO_MENUITEM = (2), + HELPINFO_WINDOW = (1), + PRF_CHECKVISIBLE = (0x1), + PRF_CHILDREN = (0x10), + PRF_CLIENT = (0x4), + PRF_ERASEBKGND = (0x8), + PRF_NONCLIENT = (0x2), + PRF_OWNED = (0x20), + HWND_DESKTOP = (0), + SC_CLOSE = (61536), + SC___FILE__HELP = (61824), + SC_DEFAULT = (61792), + SC_HOTKEY = (61776), + SC_HSCROLL = (61568), + SC_KEYMENU = (61696), + SC_MAXIMIZE = (61488), + SC_ZOOM = (61488), + SC_MINIMIZE = (61472), + SC_ICON = (61472), + SC_MONITORPOWER = (61808), + SC_MOUSEMENU = (61584), + SC_MOVE = (61456), + SC_NEXTWINDOW = (61504), + SC_PREVWINDOW = (61520), + SC_RESTORE = (61728), + SC_SCREENSAVE = (61760), + SC_SIZE = (61440), + SC_TASKLIST = (61744), + SC_VSCROLL = (61552), + DC_HASDEFID = (21323), + DLGC_BUTTON = (8192), + DLGC_DEFPUSHBUTTON = (16), + DLGC_HASSETSEL = (8), + DLGC_RADIOBUTTON = (64), + DLGC_STATIC = (256), + DLGC_UNDEFPUSHBUTTON = (32), + DLGC_WANTALLKEYS = (4), + DLGC_WANTARROWS = (1), + DLGC_WANTCHARS = (128), + DLGC_WANTMESSAGE = (4), + DLGC_WANTTAB = (2), + EC_LEFTMARGIN = (1), + EC_RIGHTMARGIN = (2), + EC_USEFONTINFO = (65535), + LB_ERR = -((1)), + LB_ERRSPACE = -((2)), + LB_OKAY = (0), + CB_ERR = -((1)), + CB_ERRSPACE = -((2)), + IMC_GETCANDIDATEPOS = (7), + IMC_GETCOMPOSITIONFONT = (9), + IMC_GETCOMPOSITIONWINDOW = (11), + IMC_GETSTATUSWINDOWPOS = (15), + IMC_CLOSESTATUSWINDOW = (33), + IMC_OPENSTATUSWINDOW = (34), + IMC_SETCANDIDATEPOS = (8), + IMC_SETCOMPOSITIONFONT = (10), + IMC_SETCOMPOSITIONWINDOW = (12), + IMC_SETSTATUSWINDOWPOS = (16), + IMN_CHANGECANDIDATE = (3), + IMN_CLOSECANDIDATE = (4), + IMN_CLOSESTATUSWINDOW = (1), + IMN_GUIDELINE = (13), + IMN_OPENCANDIDATE = (5), + IMN_OPENSTATUSWINDOW = (2), + IMN_SETCANDIDATEPOS = (9), + IMN_SETCOMPOSITIONFONT = (10), + IMN_SETCOMPOSITIONWINDOW = (11), + IMN_SETCONVERSIONMODE = (6), + IMN_SETOPENSTATUS = (8), + IMN_SETSENTENCEMODE = (7), + IMN_SETSTATUSWINDOWPOS = (12), + IMN_PRIVATE = (14), + SKF_AUDIBLEFEEDBACK = (64), + SKF_AVAILABLE = (2), + SKF_CONFIRMHOTKEY = (8), + SKF_HOTKEYACTIVE = (4), + SKF_HOTKEYSOUND = (16), + SKF_INDICATOR = (32), + SKF_STICKYKEYSON = (1), + SKF_TRISTATE = (128), + SKF_TWOKEYSOFF = (256), + MKF_AVAILABLE = (2), + MKF_CONFIRMHOTKEY = (8), + MKF_HOTKEYACTIVE = (4), + MKF_HOTKEYSOUND = (16), + MKF_INDICATOR = (32), + MKF_MOUSEKEYSON = (1), + MKF_MODIFIERS = (64), + MKF_REPLACENUMBERS = (128), + SSF_AVAILABLE = (2), + SSF_SOUNDSENTRYON = (1), + SSTF_BORDER = (2), + SSTF_CHARS = (1), + SSTF_DISPLAY = (3), + SSTF_NONE = (0), + SSGF_DISPLAY = (3), + SSGF_NONE = (0), + SSWF_CUSTOM = (4), + SSWF_DISPLAY = (3), + SSWF_NONE = (0), + SSWF_TITLE = (1), + SSWF_WINDOW = (2), + ATF_ONOFFFEEDBACK = (2), + ATF_TIMEOUTON = (1), + HCF_AVAILABLE = (2), + HCF_CONFIRMHOTKEY = (8), + HCF_HIGHCONTRASTON = (1), + HCF_HOTKEYACTIVE = (4), + HCF_HOTKEYAVAILABLE = (64), + HCF_HOTKEYSOUND = (16), + HCF_INDICATOR = (32), + TKF_AVAILABLE = (2), + TKF_CONFIRMHOTKEY = (8), + TKF_HOTKEYACTIVE = (4), + TKF_HOTKEYSOUND = (16), + TKF_TOGGLEKEYSON = (1), + PP_DISPLAYERRORS = (1), + RESOURCEDISPLAYTYPE_DOMAIN = (1), + RESOURCEDISPLAYTYPE_FILE = (4), + RESOURCEDISPLAYTYPE_GENERIC = (0), + RESOURCEDISPLAYTYPE_GROUP = (5), + RESOURCEDISPLAYTYPE_SERVER = (2), + RESOURCEDISPLAYTYPE_SHARE = (3), + CAPSLOCK_ON = (128), + ENHANCED_KEY = (256), + LEFT_ALT_PRESSED = (2), + LEFT_CTRL_PRESSED = (8), + NUMLOCK_ON = (32), + RIGHT_ALT_PRESSED = (1), + RIGHT_CTRL_PRESSED = (4), + SCROLLLOCK_ON = (64), + SHIFT_PRESSED = (16), + FROM_LEFT_1ST_BUTTON_PRESSED = (1), + RIGHTMOST_BUTTON_PRESSED = (2), + FROM_LEFT_2ND_BUTTON_PRESSED = (4), + FROM_LEFT_3RD_BUTTON_PRESSED = (8), + FROM_LEFT_4TH_BUTTON_PRESSED = (16), + DOUBLE_CLICK = (2), + MOUSE_MOVED = (1), + KEY_EVENT = (1), + _MOUSE_EVENT = (2), + cMOUSE_EVENT = (2), + WINDOW_BUFFER_SIZE_EVENT = (4), + MENU_EVENT = (8), + FOCUS_EVENT = (16), + BI_RGB = (0), + BI_RLE8 = (1), + BI_RLE4 = (2), + BI_BITFIELDS = (3), + PFD_DRAW_TO_WINDOW = (0x4), + PFD_DRAW_TO_BITMAP = (0x8), + PFD_SUPPORT_GDI = (0x10), + PFD_SUPPORT_OPENGL = (0x20), + PFD_DOUBLEBUFFER = (0x1), + PFD_STEREO = (0x2), + PFD_DOUBLEBUFFER_DONTCARE = (0x40000000), + PFD_STEREO_DONTCARE = (0x80000000), + PFD_TYPE_RGBA = (0), + PFD_TYPE_COLORINDEX = (1), + PFD_MAIN_PLANE = (0), + PFD_OVERLAY_PLANE = (1), + PFD_UNDERLAY_PLANE = -((1)), + WGL_FONT_LINES = (0), + WGL_FONT_POLYGONS = (1), + PFD_GENERIC_FORMAT = (0x40), + PFD_NEED_PALETTE = (0x80), + PFD_NEED_SYSTEM_PALETTE = (0x100), + PFD_SWAP_COPY = (0x400), + PFD_SWAP_EXCHANGE = (0x200), + TMPF_FIXED_PITCH = (0x1), + TMPF_VECTOR = (0x2), + TMPF_TRUETYPE = (0x4), + TMPF_DEVICE = (0x8), + SE_ERR_SHARE = (26), + SE_ERR_ASSOCINCOMPLETE = (27), + SE_ERR_DDETIMEOUT = (28), + SE_ERR_DDEFAIL = (29), + SE_ERR_DDEBUSY = (30), + SE_ERR_NOASSOC = (31), + XCLASS_BOOL = (0x1000), + XCLASS_DATA = (0x2000), + XCLASS_FLAGS = (0x4000), + XCLASS_MASK = (0xfc00), + XCLASS_NOTIFICATION = (0x8000), + XTYPF_NOBLOCK = (0x0002), + XTYP_ADVDATA = (0x4010), + XTYP_ADVREQ = (0x2022), + XTYP_ADVSTART = (0x1030), + XTYP_ADVSTOP = (0x8040), + XTYP_CONNECT = (0x1062), + XTYP_CONNECT_CONFIRM = (0x8072), + XTYP_DISCONNECT = (0x80c2), + XTYP_EXECUTE = (0x4050), + XTYP_POKE = (0x4090), + XTYP_REQUEST = (0x20b0), + XTYP_WILDCONNECT = (0x20E2), + XTYP_REGISTER = (0x80A2), + XTYP_ERROR = (0x8002), + XTYP_XACT_COMPLETE = (0x8080), + XTYP_UNREGISTER = (0x80D2), + DMLERR_DLL_USAGE = (0x4004), + DMLERR_INVALIDPARAMETER = (0x4006), + DMLERR_NOTPROCESSED = (0x4009), + DMLERR_POSTMSG_FAILED = (0x400c), + DMLERR_SERVER_DIED = (0x400e), + DMLERR_SYS_ERROR = (0x400f), + DMLERR_BUSY = (0x4001), + DMLERR_DATAACKTIMEOUT = (0x4002), + DMLERR_ADVACKTIMEOUT = (0x4000), + DMLERR_DLL_NOT_INITIALIZED = (0x4003), + DMLERR_LOW_MEMORY = (0x4007), + DMLERR_MEMORY_ERROR = (0x4008), + DMLERR_POKEACKTIMEOUT = (0x400b), + DMLERR_NO_CONV_ESTABLISHED = (0x400a), + DMLERR_REENTRANCY = (0x400d), + DMLERR_UNFOUND_QUEUE_ID = (0x4011), + DMLERR_UNADVACKTIMEOUT = (0x4010), + DMLERR_EXECACKTIMEOUT = (0x4005), + DDE_FACK = (0x8000), + DDE_FNOTPROCESSED = (0x0000), + DNS_REGISTER = (0x0001), + DNS_UNREGISTER = (0x0002), + CP_WINANSI = (1004), + CP_WINUNICODE = (1200), + APPCLASS_STANDARD = (0x00000000), + BKMODE_LAST = (2), + CTLCOLOR_MSGBOX = (0), + CTLCOLOR_EDIT = (1), + CTLCOLOR_LISTBOX = (2), + CTLCOLOR_BTN = (3), + CTLCOLOR_DLG = (4), + CTLCOLOR_SCROLLBAR = (5), + CTLCOLOR_STATIC = (6), + CTLCOLOR_MAX = (7), + META_SETMAPMODE = (0x0103), + META_SETWINDOWORG = (0x020B), + META_SETWINDOWEXT = (0x020C), + POLYFILL_LAST = (2), + STATUS_WAIT_0 = (0x00000000), + STATUS_ABANDONED_WAIT_0 = (0x00000080), + STATUS_USER_APC = (0x000000C0), + STATUS_TIMEOUT = (0x00000102), + STATUS_PENDING = (0x00000103), + STATUS_GUARD_PAGE_VIOLATION = (0x80000001), + STATUS_DATATYPE_MISALIGNMENT = (0x80000002), + STATUS_BREAKPOINT = (0x80000003), + STATUS_SINGLE_STEP = (0x80000004), + STATUS_IN_PAGE_ERROR = (0xC0000006), + STATUS_INVALID_HANDLE = (0xC0000008), + STATUS_ILLEGAL_INSTRUCTION = (0xC000001D), + STATUS_NONCONTINUABLE_EXCEPTION = (0xC0000025), + STATUS_INVALID_DISPOSITION = (0xC0000026), + STATUS_ARRAY_BOUNDS_EXCEEDED = (0xC000008C), + STATUS_FLOAT_DENORMAL_OPERAND = (0xC000008D), + STATUS_FLOAT_DIVIDE_BY_ZERO = (0xC000008E), + STATUS_FLOAT_INEXACT_RESULT = (0xC000008F), + STATUS_FLOAT_INVALID_OPERATION = (0xC0000090), + STATUS_FLOAT_OVERFLOW = (0xC0000091), + STATUS_FLOAT_STACK_CHECK = (0xC0000092), + STATUS_FLOAT_UNDERFLOW = (0xC0000093), + STATUS_INTEGER_DIVIDE_BY_ZERO = (0xC0000094), + STATUS_INTEGER_OVERFLOW = (0xC0000095), + STATUS_PRIVILEGED_INSTRUCTION = (0xC0000096), + STATUS_STACK_OVERFLOW = (0xC00000FD), + STATUS_CONTROL_C_EXIT = (0xC000013A), + PROCESSOR_ARCHITECTURE_INTEL = (0), + PROCESSOR_ARCHITECTURE_MIPS = (1), + PROCESSOR_ARCHITECTURE_ALPHA = (2), + PROCESSOR_ARCHITECTURE_PPC = (3), + SIZEFULLSCREEN = (SIZE_MAXIMIZED), + SIZENORMAL = (SIZE_RESTORED), + SIZEICONIC = (SIZE_MINIMIZED), + SIZE_OF_80387_REGISTERS = (80), + __FILE___i386 = (0x10000), + __FILE___CONTROL = (__FILE___i386) | (1), + __FILE___INTEGER = (__FILE___i386) | (2), + __FILE___SEGMENTS = (__FILE___i386) | (4), + __FILE___FLOATING_POINT = (__FILE___i386) | (8), + __FILE___DEBUG_REGISTERS = (__FILE___i386) | (0x10), + __FILE___FULL = ((__FILE___CONTROL) | (__FILE___INTEGER)) | (__FILE___SEGMENTS), + FLAG_TRACE_BIT = (0x100), + __FILE___DEBUGGER = (__FILE___FULL) | (__FILE___FLOATING_POINT), + FILTER_TEMP_DUPLICATE_ACCOUNT = (0x0001), + FILTER_NORMAL_ACCOUNT = (0x0002), + FILTER_INTERDOMAIN_TRUST_ACCOUNT = (0x0008), + FILTER_WORKSTATION_TRUST_ACCOUNT = (0x0010), + FILTER_SERVER_TRUST_ACCOUNT = (0x0020), + LOGON32_LOGON_INTERACTIVE = (0x02), + LOGON32_LOGON_BATCH = (0x04), + LOGON32_LOGON_SERVICE = (0x05), + LOGON32_PROVIDER_DEFAULT = (0x00), + LOGON32_PROVIDER_WINNT35 = (0x01), + QID_SYNC = (0xFFFFFFFF), + IMAGE_DOS_SIGNATURE = (0x5a4d), + IMAGE_NT_SIGNATURE = (0x4550), + SEVERITY_SUCCESS = (0), + SEVERITY_ERROR = (1), + VT_EMPTY = (0), + VT_NULL = (1), + VT_I2 = (2), + VT_I4 = (3), + VT_R4 = (4), + VT_R8 = (5), + VT_BSTR = (8), + VT_ERROR = (10), + VT_BOOL = (11), + VT_UI1 = (17), + VT_BYREF = (0x4000), + VT_RESERVED = (0x8000), + FACILITY_WINDOWS = (8), + FACILITY_STORAGE = (3), + FACILITY_RPC = (1), + FACILITY_SSPI = (9), + FACILITY_WIN32 = (7), + FACILITY_CONTROL = (10), + FACILITY_NULL = (0), + FACILITY_INTERNET = (12), + FACILITY_ITF = (4), + FACILITY_DISPATCH = (2), + FACILITY_CERT = (11), + ACM_OPENW = (1127), + ACM_OPENA = (1124), + ACM_OPEN = (ACM_OPENA), + ACM_PLAY = (1125), + ACM_STOP = (1126), + ACN_START = (1), + ACN_STOP = (2), + BM_CLICK = (245), + BM_GETCHECK = (240), + BM_GETIMAGE = (246), + BM_GETSTATE = (242), + BM_SETCHECK = (241), + BM_SETIMAGE = (247), + BM_SETSTATE = (243), + BM_SETSTYLE = (244), + BN_CLICKED = (0), + BN_DBLCLK = (5), + BN_DISABLE = (4), + BN_DOUBLECLICKED = (5), + BN_HILITE = (2), + BN_KILLFOCUS = (7), + BN_PAINT = (1), + BN_PUSHED = (2), + BN_SETFOCUS = (6), + BN_UNHILITE = (3), + BN_UNPUSHED = (3), + CB_ADDSTRING = (323), + CB_DELETESTRING = (324), + CB_DIR = (325), + CB_FINDSTRING = (332), + CB_FINDSTRINGEXACT = (344), + CB_GETCOUNT = (326), + CB_GETCURSEL = (327), + CB_GETDROPPEDCONTROLRECT = (338), + CB_GETDROPPEDSTATE = (343), + CB_GETDROPPEDWIDTH = (351), + CB_GETEDITSEL = (320), + CB_GETEXTENDEDUI = (342), + CB_GETHORIZONTALEXTENT = (349), + CB_GETITEMDATA = (336), + CB_GETITEMHEIGHT = (340), + CB_GETLBTEXT = (328), + CB_GETLBTEXTLEN = (329), + CB_GETLOCALE = (346), + CB_GETTOPINDEX = (347), + CB_INITSTORAGE = (353), + CB_INSERTSTRING = (330), + CB_LIMITTEXT = (321), + CB_RESETCONTENT = (331), + CB_SELECTSTRING = (333), + CB_SETCURSEL = (334), + CB_SETDROPPEDWIDTH = (352), + CB_SETEDITSEL = (322), + CB_SETEXTENDEDUI = (341), + CB_SETHORIZONTALEXTENT = (350), + CB_SETITEMDATA = (337), + CB_SETITEMHEIGHT = (339), + CB_SETLOCALE = (345), + CB_SETTOPINDEX = (348), + CB_SHOWDROPDOWN = (335), + CBN_CLOSEUP = (8), + CBN_DBLCLK = (2), + CBN_DROPDOWN = (7), + CBN_EDITCHANGE = (5), + CBN_EDITUPDATE = (6), + CBN_ERRSPACE = -((1)), + CBN_KILLFOCUS = (4), + CBN_SELCHANGE = (1), + CBN_SELENDCANCEL = (10), + CBN_SELENDOK = (9), + CBN_SETFOCUS = (3), + DL_BEGINDRAG = (1157), + DL_CANCELDRAG = (1160), + DL_DRAGGING = (1158), + DL_DROPPED = (1159), + DM_GETDEFID = (1024), + DM_REPOSITION = (1026), + DM_SETDEFID = (1025), + EM_CANPASTE = (1074), + EM_CANUNDO = (198), + EM_CHARFROMPOS = (215), + EM_DISPLAYBAND = (1075), + EM_EMPTYUNDOBUFFER = (205), + EM_EXGETSEL = (1076), + EM_EXLIMITTEXT = (1077), + EM_EXLINEFROMCHAR = (1078), + EM_EXSETSEL = (1079), + EM_FINDTEXT = (1080), + EM_FINDTEXTEX = (1103), + EM_FINDWORDBREAK = (1100), + EM_FMTLINES = (200), + EM_FORMATRANGE = (1081), + EM_GETCHARFORMAT = (1082), + EM_GETEVENTMASK = (1083), + EM_GETFIRSTVISIBLELINE = (206), + EM_GETHANDLE = (189), + EM_GETLIMITTEXT = (213), + EM_GETLINE = (196), + EM_GETLINECOUNT = (186), + EM_GETMARGINS = (212), + EM_GETMODIFY = (184), + EM_GETIMECOLOR = (1129), + EM_GETIMEOPTIONS = (1131), + EM_GETOPTIONS = (1102), + EM_GETOLEINTERFACE = (1084), + EM_GETPARAFORMAT = (1085), + EM_GETPASSWORDCHAR = (210), + EM_GETPUNCTUATION = (1125), + EM_GETRECT = (178), + EM_GETSEL = (176), + EM_GETSELTEXT = (1086), + EM_GETTEXTRANGE = (1099), + EM_GETTHUMB = (190), + EM_GETWORDBREAKPROC = (209), + EM_GETWORDBREAKPROCEX = (1104), + EM_GETWORDWRAPMODE = (1127), + EM_HIDESELECTION = (1087), + EM_LIMITTEXT = (197), + EM_LINEFROMCHAR = (201), + EM_LINEINDEX = (187), + EM_LINELENGTH = (193), + EM_LINESCROLL = (182), + EM_PASTESPECIAL = (1088), + EM_POSFROMCHAR = (214), + EM_REPLACESEL = (194), + EM_REQUESTRESIZE = (1089), + EM_SCROLL = (181), + EM_SCROLLCARET = (183), + EM_SELECTIONTYPE = (1090), + EM_SETBKGNDCOLOR = (1091), + EM_SETCHARFORMAT = (1092), + EM_SETEVENTMASK = (1093), + EM_SETHANDLE = (188), + EM_SETIMECOLOR = (1128), + EM_SETIMEOPTIONS = (1130), + EM_SETLIMITTEXT = (197), + EM_SETMARGINS = (211), + EM_SETMODIFY = (185), + EM_SETOLECALLBACK = (1094), + EM_SETOPTIONS = (1101), + EM_SETPARAFORMAT = (1095), + EM_SETPASSWORDCHAR = (204), + EM_SETPUNCTUATION = (1124), + EM_SETREADONLY = (207), + EM_SETRECT = (179), + EM_SETRECTNP = (180), + EM_SETSEL = (177), + EM_SETTABSTOPS = (203), + EM_SETTARGETDEVICE = (1096), + EM_SETWORDBREAKPROC = (208), + EM_SETWORDBREAKPROCEX = (1105), + EM_SETWORDWRAPMODE = (1126), + EM_STREAMIN = (1097), + EM_STREAMOUT = (1098), + EM_UNDO = (199), + EN_CHANGE = (768), + EN_CORRECTTEXT = (1797), + EN_DROPFILES = (1795), + EN_ERRSPACE = (1280), + EN_HSCROLL = (1537), + EN_IMECHANGE = (1799), + EN_KILLFOCUS = (512), + EN_MAXTEXT = (1281), + EN_MSGFILTER = (1792), + EN_OLEOPFAILED = (1801), + EN_PROTECTED = (1796), + EN_REQUESTRESIZE = (1793), + EN_SAVECLIPBOARD = (1800), + EN_SELCHANGE = (1794), + EN_SETFOCUS = (256), + EN_STOPNOUNDO = (1798), + EN_UPDATE = (1024), + EN_VSCROLL = (1538), + HDM_DELETEITEM = (4610), + HDM_GETITEMW = (4619), + HDM_INSERTITEMW = (4618), + HDM_SETITEMW = (4620), + HDM_GETITEMA = (4611), + HDM_INSERTITEMA = (4609), + HDM_SETITEMA = (4612), + HDM_GETITEM = (HDM_GETITEMA), + HDM_INSERTITEM = (HDM_INSERTITEMA), + HDM_SETITEM = (HDM_SETITEMA), + HDM_GETITEMCOUNT = (4608), + HDM_HITTEST = (4614), + HDM_LAYOUT = (4613), + HDN_BEGINTRACKW = -((326)), + HDN_DIVIDERDBLCLICKW = -((325)), + HDN_ENDTRACKW = -((327)), + HDN_ITEMCHANGEDW = -((321)), + HDN_ITEMCHANGINGW = -((320)), + HDN_ITEMCLICKW = -((322)), + HDN_ITEMDBLCLICKW = -((323)), + HDN_TRACKW = -((328)), + HDN_BEGINTRACKA = -((306)), + HDN_DIVIDERDBLCLICKA = -((305)), + HDN_ENDTRACKA = -((307)), + HDN_ITEMCHANGEDA = -((301)), + HDN_ITEMCHANGINGA = -((300)), + HDN_ITEMCLICKA = -((302)), + HDN_ITEMDBLCLICKA = -((303)), + HDN_TRACKA = -((308)), + HDN_BEGINTRACK = (HDN_BEGINTRACKA), + HDN_DIVIDERDBLCLICK = (HDN_DIVIDERDBLCLICKA), + HDN_ENDTRACK = (HDN_ENDTRACKA), + HDN_ITEMCHANGED = (HDN_ITEMCHANGEDA), + HDN_ITEMCHANGING = (HDN_ITEMCHANGINGA), + HDN_ITEMCLICK = (HDN_ITEMCLICKA), + HDN_ITEMDBLCLICK = (HDN_ITEMDBLCLICKA), + HDN_TRACK = (HDN_TRACKA), + HKM_GETHOTKEY = (1026), + HKM_SETHOTKEY = (1025), + HKM_SETRULES = (1027), + LB_ADDFILE = (406), + LB_ADDSTRING = (384), + LB_DELETESTRING = (386), + LB_DIR = (397), + LB_FINDSTRING = (399), + LB_FINDSTRINGEXACT = (418), + LB_GETANCHORINDEX = (413), + LB_GETCARETINDEX = (415), + LB_GETCOUNT = (395), + LB_GETCURSEL = (392), + LB_GETHORIZONTALEXTENT = (403), + LB_GETITEMDATA = (409), + LB_GETITEMHEIGHT = (417), + LB_GETITEMRECT = (408), + LB_GETLOCALE = (422), + LB_GETSEL = (391), + LB_GETSELCOUNT = (400), + LB_GETSELITEMS = (401), + LB_GETTEXT = (393), + LB_GETTEXTLEN = (394), + LB_GETTOPINDEX = (398), + LB_INITSTORAGE = (424), + LB_INSERTSTRING = (385), + LB_ITEMFROMPOINT = (425), + LB_RESETCONTENT = (388), + LB_SELECTSTRING = (396), + LB_SELITEMRANGE = (411), + LB_SELITEMRANGEEX = (387), + LB_SETANCHORINDEX = (412), + LB_SETCARETINDEX = (414), + LB_SETCOLUMNWIDTH = (405), + LB_SETCOUNT = (423), + LB_SETCURSEL = (390), + LB_SETHORIZONTALEXTENT = (404), + LB_SETITEMDATA = (410), + LB_SETITEMHEIGHT = (416), + LB_SETLOCALE = (421), + LB_SETSEL = (389), + LB_SETTABSTOPS = (402), + LB_SETTOPINDEX = (407), + LBN_DBLCLK = (2), + LBN_ERRSPACE = -((2)), + LBN_KILLFOCUS = (5), + LBN_SELCANCEL = (3), + LBN_SELCHANGE = (1), + LBN_SETFOCUS = (4), + LVM_ARRANGE = (4118), + LVM_CREATEDRAGIMAGE = (4129), + LVM_DELETEALLITEMS = (4105), + LVM_DELETECOLUMN = (4124), + LVM_DELETEITEM = (4104), + LVM_ENSUREVISIBLE = (4115), + LVM_GETBKCOLOR = (4096), + LVM_GETCALLBACKMASK = (4106), + LVM_GETCOLUMNWIDTH = (4125), + LVM_GETCOUNTPERPAGE = (4136), + LVM_GETEDITCONTROL = (4120), + LVM_GETIMAGELIST = (4098), + LVM_EDITLABELW = (4214), + LVM_FINDITEMW = (4179), + LVM_GETCOLUMNW = (4191), + LVM_GETISEARCHSTRINGW = (4213), + LVM_GETITEMW = (4171), + LVM_GETITEMTEXTW = (4211), + LVM_GETSTRINGWIDTHW = (4183), + LVM_INSERTCOLUMNW = (4193), + LVM_INSERTITEMW = (4173), + LVM_SETCOLUMNW = (4192), + LVM_SETITEMW = (4172), + LVM_SETITEMTEXTW = (4212), + LVM_EDITLABELA = (4119), + LVM_FINDITEMA = (4109), + LVM_GETCOLUMNA = (4121), + LVM_GETISEARCHSTRINGA = (4148), + LVM_GETITEMA = (4101), + LVM_GETITEMTEXTA = (4141), + LVM_GETSTRINGWIDTHA = (4113), + LVM_INSERTCOLUMNA = (4123), + LVM_INSERTITEMA = (4103), + LVM_SETCOLUMNA = (4122), + LVM_SETITEMA = (4102), + LVM_SETITEMTEXTA = (4142), + LVM_EDITLABEL = (LVM_EDITLABELA), + LVM_FINDITEM = (LVM_FINDITEMA), + LVM_GETCOLUMN = (LVM_GETCOLUMNA), + LVM_GETISEARCHSTRING = (LVM_GETISEARCHSTRINGA), + LVM_GETITEM = (LVM_GETITEMA), + LVM_GETITEMTEXT = (LVM_GETITEMTEXTA), + LVM_GETSTRINGWIDTH = (LVM_GETSTRINGWIDTHA), + LVM_INSERTCOLUMN = (LVM_INSERTCOLUMNA), + LVM_INSERTITEM = (LVM_INSERTITEMA), + LVM_SETCOLUMN = (LVM_SETCOLUMNA), + LVM_SETITEM = (LVM_SETITEMA), + LVM_SETITEMTEXT = (LVM_SETITEMTEXTA), + LVM_GETITEMCOUNT = (4100), + LVM_GETITEMPOSITION = (4112), + LVM_GETITEMRECT = (4110), + LVM_GETITEMSPACING = (4147), + LVM_GETITEMSTATE = (4140), + LVM_GETNEXTITEM = (4108), + LVM_GETORIGIN = (4137), + LVM_GETSELECTEDCOUNT = (4146), + LVM_GETTEXTBKCOLOR = (4133), + LVM_GETTEXTCOLOR = (4131), + LVM_GETTOPINDEX = (4135), + LVM_GETVIEWRECT = (4130), + LVM_HITTEST = (4114), + LVM_REDRAWITEMS = (4117), + LVM_SCROLL = (4116), + LVM_SETBKCOLOR = (4097), + LVM_SETCALLBACKMASK = (4107), + LVM_SETCOLUMNWIDTH = (4126), + LVM_SETIMAGELIST = (4099), + LVM_SETITEMCOUNT = (4143), + LVM_SETITEMPOSITION = (4111), + LVM_SETITEMPOSITION32 = (4145), + LVM_SETITEMSTATE = (4139), + LVM_SETTEXTBKCOLOR = (4134), + LVM_SETTEXTCOLOR = (4132), + LVM_SORTITEMS = (4144), + LVM_UPDATE = (4138), + LVN_BEGINDRAG = -((109)), + LVN_BEGINRDRAG = -((111)), + LVN_COLUMNCLICK = -((108)), + LVN_DELETEALLITEMS = -((104)), + LVN_DELETEITEM = -((103)), + LVN_BEGINLABELEDITW = -((175)), + LVN_ENDLABELEDITW = -((176)), + LVN_GETDISPINFOW = -((177)), + LVN_SETDISPINFOW = -((178)), + LVN_BEGINLABELEDITA = -((105)), + LVN_ENDLABELEDITA = -((106)), + LVN_GETDISPINFOA = -((150)), + LVN_SETDISPINFOA = -((151)), + LVN_BEGINLABELEDIT = (LVN_BEGINLABELEDITA), + LVN_ENDLABELEDIT = (LVN_ENDLABELEDITA), + LVN_GETDISPINFO = (LVN_GETDISPINFOA), + LVN_SETDISPINFO = (LVN_SETDISPINFOA), + LVN_INSERTITEM = -((102)), + LVN_ITEMCHANGED = -((101)), + LVN_ITEMCHANGING = -((100)), + LVN_KEYDOWN = -((155)), + NM_CLICK = -((2)), + NM_DBLCLK = -((3)), + NM_KILLFOCUS = -((8)), + NM_OUTOFMEMORY = -((1)), + NM_RCLICK = -((5)), + NM_RDBLCLK = -((6)), + NM_RETURN = -((4)), + NM_SETFOCUS = -((7)), + PBM_DELTAPOS = (1027), + PBM_SETPOS = (1026), + PBM_SETRANGE = (1025), + PBM_SETSTEP = (1028), + PBM_STEPIT = (1029), + PSM_ADDPAGE = (1127), + PSM_APPLY = (1134), + PSM_CANCELTOCLOSE = (1131), + PSM_CHANGED = (1128), + PSM_GETTABCONTROL = (1140), + PSM_GETCURRENTPAGEHWND = (1142), + PSM_ISDIALOGMESSAGE = (1141), + PSM_PRESSBUTTON = (1137), + PSM_QUERYSIBLINGS = (1132), + PSM_REBOOTSYSTEM = (1130), + PSM_REMOVEPAGE = (1126), + PSM_RESTARTWINDOWS = (1129), + PSM_SETCURSEL = (1125), + PSM_SETCURSELID = (1138), + PSM_SETFINISHTEXTW = (1145), + PSM_SETTITLEW = (1144), + PSM_SETFINISHTEXTA = (1139), + PSM_SETTITLEA = (1135), + PSM_SETFINISHTEXT = (PSM_SETFINISHTEXTA), + PSM_SETTITLE = (PSM_SETTITLEA), + PSM_SETWIZBUTTONS = (1136), + PSM_UNCHANGED = (1133), + PSN_APPLY = -((202)), + PSN_HELP = -((205)), + PSN_KILLACTIVE = -((201)), + PSN_QUERYCANCEL = -((209)), + PSN_RESET = -((203)), + PSN_SETACTIVE = -((200)), + PSN_WIZBACK = -((206)), + PSN_WIZFINISH = -((208)), + PSN_WIZNEXT = -((207)), + SB_GETBORDERS = (1031), + SB_GETPARTS = (1030), + SB_GETRECT = (1034), + SB_GETTEXTW = (1037), + SB_GETTEXTLENGTHW = (1036), + SB_SETTEXTW = (1035), + SB_GETTEXTA = (1026), + SB_GETTEXTLENGTHA = (1027), + SB_SETTEXTA = (1025), + SB_GETTEXT = (SB_GETTEXTA), + SB_GETTEXTLENGTH = (SB_GETTEXTLENGTHA), + SB_SETTEXT = (SB_SETTEXTA), + SB_SETMINHEIGHT = (1032), + SB_SETPARTS = (1028), + SB_SIMPLE = (1033), + SBM_ENABLE_ARROWS = (228), + SBM_GETPOS = (225), + SBM_GETRANGE = (227), + SBM_GETSCROLLINFO = (234), + SBM_SETPOS = (224), + SBM_SETRANGE = (226), + SBM_SETRANGEREDRAW = (230), + SBM_SETSCROLLINFO = (233), + STM_GETICON = (369), + STM_GETIMAGE = (371), + STM_SETICON = (368), + STM_SETIMAGE = (370), + STN_CLICKED = (0), + STN_DBLCLK = (1), + STN_DISABLE = (3), + STN_ENABLE = (2), + TB_ADDBITMAP = (1043), + TB_ADDBUTTONS = (1044), + TB_AUTOSIZE = (1057), + TB_BUTTONCOUNT = (1048), + TB_BUTTONSTRUCTSIZE = (1054), + TB_CHANGEBITMAP = (1067), + TB_CHECKBUTTON = (1026), + TB_COMMANDTOINDEX = (1049), + TB_CUSTOMIZE = (1051), + TB_DELETEBUTTON = (1046), + TB_ENABLEBUTTON = (1025), + TB_GETBITMAP = (1068), + TB_GETBITMAPFLAGS = (1065), + TB_GETBUTTON = (1047), + TB_ADDSTRINGW = (1101), + TB_GETBUTTONTEXTW = (1099), + TB_SAVERESTOREW = (1100), + TB_ADDSTRINGA = (1052), + TB_GETBUTTONTEXTA = (1069), + TB_SAVERESTOREA = (1050), + TB_ADDSTRING = (TB_ADDSTRINGA), + TB_GETBUTTONTEXT = (TB_GETBUTTONTEXTA), + TB_SAVERESTORE = (TB_SAVERESTOREA), + TB_GETITEMRECT = (1053), + TB_GETROWS = (1064), + TB_GETSTATE = (1042), + TB_GETTOOLTIPS = (1059), + TB_HIDEBUTTON = (1028), + TB_INDETERMINATE = (1029), + TB_INSERTBUTTON = (1045), + TB_ISBUTTONCHECKED = (1034), + TB_ISBUTTONENABLED = (1033), + TB_ISBUTTONHIDDEN = (1036), + TB_ISBUTTONINDETERMINATE = (1037), + TB_ISBUTTONPRESSED = (1035), + TB_PRESSBUTTON = (1027), + TB_SETBITMAPSIZE = (1056), + TB_SETBUTTONSIZE = (1055), + TB_SETCMDID = (1066), + TB_SETPARENT = (1061), + TB_SETROWS = (1063), + TB_SETSTATE = (1041), + TB_SETTOOLTIPS = (1060), + TBM_CLEARSEL = (1043), + TBM_CLEARTICS = (1033), + TBM_GETCHANNELRECT = (1050), + TBM_GETLINESIZE = (1048), + TBM_GETNUMTICS = (1040), + TBM_GETPAGESIZE = (1046), + TBM_GETPOS = (1024), + TBM_GETPTICS = (1038), + TBM_GETRANGEMAX = (1026), + TBM_GETRANGEMIN = (1025), + TBM_GETSELEND = (1042), + TBM_GETSELSTART = (1041), + TBM_GETTHUMBLENGTH = (1052), + TBM_GETTHUMBRECT = (1049), + TBM_GETTIC = (1027), + TBM_GETTICPOS = (1039), + TBM_SETLINESIZE = (1047), + TBM_SETPAGESIZE = (1045), + TBM_SETPOS = (1029), + TBM_SETRANGE = (1030), + TBM_SETRANGEMAX = (1032), + TBM_SETRANGEMIN = (1031), + TBM_SETSEL = (1034), + TBM_SETSELEND = (1036), + TBM_SETSELSTART = (1035), + TBM_SETTHUMBLENGTH = (1051), + TBM_SETTIC = (1028), + TBM_SETTICFREQ = (1044), + TBN_BEGINADJUST = -((703)), + TBN_BEGINDRAG = -((701)), + TBN_CUSTHELP = -((709)), + TBN_ENDADJUST = -((704)), + TBN_ENDDRAG = -((702)), + TBN_GETBUTTONINFOW = -((720)), + TBN_GETBUTTONINFOA = -((700)), + TBN_GETBUTTONINFO = (TBN_GETBUTTONINFOA), + TBN_QUERYDELETE = -((707)), + TBN_QUERYINSERT = -((706)), + TBN_RESET = -((705)), + TBN_TOOLBARCHANGE = -((708)), + TCM_ADJUSTRECT = (4904), + TCM_DELETEALLITEMS = (4873), + TCM_DELETEITEM = (4872), + TCM_GETCURFOCUS = (4911), + TCM_GETCURSEL = (4875), + TCM_GETIMAGELIST = (4866), + TCM_GETITEMW = (4924), + TCM_INSERTITEMW = (4926), + TCM_SETITEMW = (4925), + TCM_GETITEMA = (4869), + TCM_INSERTITEMA = (4871), + TCM_SETITEMA = (4870), + TCM_GETITEM = (TCM_GETITEMA), + TCM_INSERTITEM = (TCM_INSERTITEMA), + TCM_SETITEM = (TCM_SETITEMA), + TCM_GETITEMCOUNT = (4868), + TCM_GETITEMRECT = (4874), + TCM_GETROWCOUNT = (4908), + TCM_GETTOOLTIPS = (4909), + TCM_HITTEST = (4877), + TCM_REMOVEIMAGE = (4906), + TCM_SETCURFOCUS = (4912), + TCM_SETCURSEL = (4876), + TCM_SETIMAGELIST = (4867), + TCM_SETITEMEXTRA = (4878), + TCM_SETITEMSIZE = (4905), + TCM_SETPADDING = (4907), + TCM_SETTOOLTIPS = (4910), + TCN_KEYDOWN = -((550)), + TCN_SELCHANGE = -((551)), + TCN_SELCHANGING = -((552)), + TTM_ACTIVATE = (1025), + TTM_ADDTOOLW = (1074), + TTM_DELTOOLW = (1075), + TTM_ENUMTOOLSW = (1082), + TTM_GETCURRENTTOOLW = (1083), + TTM_GETTEXTW = (1080), + TTM_GETTOOLINFOW = (1077), + TTM_HITTESTW = (1079), + TTM_NEWTOOLRECTW = (1076), + TTM_SETTOOLINFOW = (1078), + TTM_UPDATETIPTEXTW = (1081), + TTM_ADDTOOLA = (1028), + TTM_DELTOOLA = (1029), + TTM_ENUMTOOLSA = (1038), + TTM_GETCURRENTTOOLA = (1039), + TTM_GETTEXTA = (1035), + TTM_GETTOOLINFOA = (1032), + TTM_HITTESTA = (1034), + TTM_NEWTOOLRECTA = (1030), + TTM_SETTOOLINFOA = (1033), + TTM_UPDATETIPTEXTA = (1036), + TTM_ADDTOOL = (TTM_ADDTOOLA), + TTM_DELTOOL = (TTM_DELTOOLA), + TTM_ENUMTOOLS = (TTM_ENUMTOOLSA), + TTM_GETCURRENTTOOL = (TTM_GETCURRENTTOOLA), + TTM_GETTEXT = (TTM_GETTEXTA), + TTM_GETTOOLINFO = (TTM_GETTOOLINFOA), + TTM_HITTEST = (TTM_HITTESTA), + TTM_NEWTOOLRECT = (TTM_NEWTOOLRECTA), + TTM_SETTOOLINFO = (TTM_SETTOOLINFOA), + TTM_UPDATETIPTEXT = (TTM_UPDATETIPTEXTA), + TTM_GETTOOLCOUNT = (1037), + TTM_RELAYEVENT = (1031), + TTM_SETDELAYTIME = (1027), + TTM_WINDOWFROMPOINT = (1040), + TTN_NEEDTEXTW = -((530)), + TTN_NEEDTEXTA = -((520)), + TTN_NEEDTEXT = (TTN_NEEDTEXTA), + TTN_POP = -((522)), + TTN_SHOW = -((521)), + TVM_CREATEDRAGIMAGE = (4370), + TVM_DELETEITEM = (4353), + TVM_ENDEDITLABELNOW = (4374), + TVM_ENSUREVISIBLE = (4372), + TVM_EXPAND = (4354), + TVM_GETCOUNT = (4357), + TVM_GETEDITCONTROL = (4367), + TVM_GETIMAGELIST = (4360), + TVM_GETINDENT = (4358), + TVM_GETITEMRECT = (4356), + TVM_GETNEXTITEM = (4362), + TVM_GETVISIBLECOUNT = (4368), + TVM_HITTEST = (4369), + TVM_EDITLABELW = (4417), + TVM_GETISEARCHSTRINGW = (4416), + TVM_GETITEMW = (4414), + TVM_INSERTITEMW = (4402), + TVM_SETITEMW = (4415), + TVM_EDITLABELA = (4366), + TVM_GETISEARCHSTRINGA = (4375), + TVM_GETITEMA = (4364), + TVM_INSERTITEMA = (4352), + TVM_SETITEMA = (4365), + TVM_EDITLABEL = (TVM_EDITLABELA), + TVM_GETISEARCHSTRING = (TVM_GETISEARCHSTRINGA), + TVM_GETITEM = (TVM_GETITEMA), + TVM_INSERTITEM = (TVM_INSERTITEMA), + TVM_SETITEM = (TVM_SETITEMA), + TVM_SELECTITEM = (4363), + TVM_SETIMAGELIST = (4361), + TVM_SETINDENT = (4359), + TVM_SORTCHILDREN = (4371), + TVM_SORTCHILDRENCB = (4373), + TVN_KEYDOWN = -((412)), + TVN_BEGINDRAGW = -((456)), + TVN_BEGINLABELEDITW = -((459)), + TVN_BEGINRDRAGW = -((457)), + TVN_DELETEITEMW = -((458)), + TVN_ENDLABELEDITW = -((460)), + TVN_GETDISPINFOW = -((452)), + TVN_ITEMEXPANDEDW = -((455)), + TVN_ITEMEXPANDINGW = -((454)), + TVN_SELCHANGEDW = -((451)), + TVN_SELCHANGINGW = -((450)), + TVN_SETDISPINFOW = -((453)), + TVN_BEGINDRAGA = -((407)), + TVN_BEGINLABELEDITA = -((410)), + TVN_BEGINRDRAGA = -((408)), + TVN_DELETEITEMA = -((409)), + TVN_ENDLABELEDITA = -((411)), + TVN_GETDISPINFOA = -((403)), + TVN_ITEMEXPANDEDA = -((406)), + TVN_ITEMEXPANDINGA = -((405)), + TVN_SELCHANGEDA = -((402)), + TVN_SELCHANGINGA = -((401)), + TVN_SETDISPINFOA = -((404)), + TVN_BEGINDRAG = (TVN_BEGINDRAGA), + TVN_BEGINLABELEDIT = (TVN_BEGINLABELEDITA), + TVN_BEGINRDRAG = (TVN_BEGINRDRAGA), + TVN_DELETEITEM = (TVN_DELETEITEMA), + TVN_ENDLABELEDIT = (TVN_ENDLABELEDITA), + TVN_GETDISPINFO = (TVN_GETDISPINFOA), + TVN_ITEMEXPANDED = (TVN_ITEMEXPANDEDA), + TVN_ITEMEXPANDING = (TVN_ITEMEXPANDINGA), + TVN_SELCHANGED = (TVN_SELCHANGEDA), + TVN_SELCHANGING = (TVN_SELCHANGINGA), + TVN_SETDISPINFO = (TVN_SETDISPINFOA), + UDM_GETACCEL = (1132), + UDM_GETBASE = (1134), + UDM_GETBUDDY = (1130), + UDM_GETPOS = (1128), + UDM_GETRANGE = (1126), + UDM_SETACCEL = (1131), + UDM_SETBASE = (1133), + UDM_SETBUDDY = (1129), + UDM_SETPOS = (1127), + UDM_SETRANGE = (1125), + UDN_DELTAPOS = -((722)), + WM_ACTIVATE = (6), + WM_ACTIVATEAPP = (28), + WM_ASKCBFORMATNAME = (780), + WM_CANCELJOURNAL = (75), + WM_CANCELMODE = (31), + WM_CAPTURECHANGED = (533), + WM_CHANGECBCHAIN = (781), + WM_CHAR = (258), + WM_CHARTOITEM = (47), + WM_CHILDACTIVATE = (34), + WM_CHOOSEFONT_GETLOGFONT = (1025), + WM_CHOOSEFONT_SETLOGFONT = (1125), + WM_CHOOSEFONT_SETFLAGS = (1126), + WM_CLEAR = (771), + WM_CLOSE = (16), + WM_COMMAND = (273), + WM_COMPACTING = (65), + WM_COMPAREITEM = (57), + WM___FILE__MENU = (123), + WM_COPY = (769), + WM_COPYDATA = (74), + WM_CREATE = (1), + WM_CTLCOLORBTN = (309), + WM_CTLCOLORDLG = (310), + WM_CTLCOLOREDIT = (307), + WM_CTLCOLORLISTBOX = (308), + WM_CTLCOLORMSGBOX = (306), + WM_CTLCOLORSCROLLBAR = (311), + WM_CTLCOLORSTATIC = (312), + WM_CUT = (768), + WM_DEADCHAR = (259), + WM_DELETEITEM = (45), + WM_DESTROY = (2), + WM_DESTROYCLIPBOARD = (775), + WM_DEVICECHANGE = (537), + WM_DEVMODECHANGE = (27), + WM_DISPLAYCHANGE = (126), + WM_DRAWCLIPBOARD = (776), + WM_DRAWITEM = (43), + WM_DROPFILES = (563), + WM_ENABLE = (10), + WM_ENDSESSION = (22), + WM_ENTERIDLE = (289), + WM_ENTERMENULOOP = (529), + WM_ENTERSIZEMOVE = (561), + WM_ERASEBKGND = (20), + WM_EXITMENULOOP = (530), + WM_EXITSIZEMOVE = (562), + WM_FONTCHANGE = (29), + WM_GETDLGCODE = (135), + WM_GETFONT = (49), + WM_GETHOTKEY = (51), + WM_GETICON = (127), + WM_GETMINMAXINFO = (36), + WM_GETTEXT = (13), + WM_GETTEXTLENGTH = (14), + WM_HELP = (83), + WM_HOTKEY = (786), + WM_HSCROLL = (276), + WM_HSCROLLCLIPBOARD = (782), + WM_ICONERASEBKGND = (39), + WM_IME_CHAR = (646), + WM_IME_COMPOSITION = (271), + WM_IME_COMPOSITIONFULL = (644), + WM_IME_CONTROL = (643), + WM_IME_ENDCOMPOSITION = (270), + WM_IME_KEYDOWN = (656), + WM_IME_KEYUP = (657), + WM_IME_NOTIFY = (642), + WM_IME_SELECT = (645), + WM_IME_SET__FILE__ = (641), + WM_IME_STARTCOMPOSITION = (269), + WM_INITDIALOG = (272), + WM_INITMENU = (278), + WM_INITMENUPOPUP = (279), + WM_INPUTLANGCHANGE = (81), + WM_INPUTLANGCHANGEREQUEST = (80), + WM_KEYDOWN = (256), + WM_KEYUP = (257), + WM_KILLFOCUS = (8), + WM_LBUTTONDBLCLK = (515), + WM_LBUTTONDOWN = (513), + WM_LBUTTONUP = (514), + WM_MBUTTONDBLCLK = (521), + WM_MBUTTONDOWN = (519), + WM_MBUTTONUP = (520), + WM_MDIACTIVATE = (546), + WM_MDICASCADE = (551), + WM_MDICREATE = (544), + WM_MDIDESTROY = (545), + WM_MDIGETACTIVE = (553), + WM_MDIICONARRANGE = (552), + WM_MDIMAXIMIZE = (549), + WM_MDINEXT = (548), + WM_MDIREFRESHMENU = (564), + WM_MDIRESTORE = (547), + WM_MDISETMENU = (560), + WM_MDITILE = (550), + WM_MEASUREITEM = (44), + WM_MENUCHAR = (288), + WM_MENUSELECT = (287), + WM_MOUSEACTIVATE = (33), + WM_MOUSEMOVE = (512), + WM_MOUSEWHEEL = 0x020A, + WM_MOVE = (3), + WM_MOVING = (534), + WM_NCACTIVATE = (134), + WM_NCCALCSIZE = (131), + WM_NCCREATE = (129), + WM_NCDESTROY = (130), + WM_NCHITTEST = (132), + WM_NCLBUTTONDBLCLK = (163), + WM_NCLBUTTONDOWN = (161), + WM_NCLBUTTONUP = (162), + WM_NCMBUTTONDBLCLK = (169), + WM_NCMBUTTONDOWN = (167), + WM_NCMBUTTONUP = (168), + WM_NCMOUSEMOVE = (160), + WM_NCPAINT = (133), + WM_NCRBUTTONDBLCLK = (166), + WM_NCRBUTTONDOWN = (164), + WM_NCRBUTTONUP = (165), + WM_NEXTDLGCTL = (40), + WM_NOTIFY = (78), + WM_NOTIFYFORMAT = (85), + WM_NULL = (0), + WM_PAINT = (15), + WM_PAINTCLIPBOARD = (777), + WM_PAINTICON = (38), + WM_PALETTECHANGED = (785), + WM_PALETTEISCHANGING = (784), + WM_PARENTNOTIFY = (528), + WM_PASTE = (770), + WM_PENWINFIRST = (896), + WM_PENWINLAST = (911), + WM_POWER = (72), + WM_POWERBROADCAST = (536), + WM_PRINT = (791), + WM_PRINTCLIENT = (792), + WM_PSD_ENVSTAMPRECT = (1029), + WM_PSD_FULLPAGERECT = (1025), + WM_PSD_GREEKTEXTRECT = (1028), + WM_PSD_MARGINRECT = (1027), + WM_PSD_MINMARGINRECT = (1026), + WM_PSD_PAGESETUPDLG = (1024), + WM_PSD_YAFULLPAGERECT = (1030), + WM_QUERYDRAGICON = (55), + WM_QUERYENDSESSION = (17), + WM_QUERYNEWPALETTE = (783), + WM_QUERYOPEN = (19), + WM_QUEUESYNC = (35), + WM_QUIT = (18), + WM_RBUTTONDBLCLK = (518), + WM_RBUTTONDOWN = (516), + WM_RBUTTONUP = (517), + WM_RENDERALLFORMATS = (774), + WM_RENDERFORMAT = (773), + WM_SETCURSOR = (32), + WM_SETFOCUS = (7), + WM_SETFONT = (48), + WM_SETHOTKEY = (50), + WM_SETICON = (128), + WM_SETREDRAW = (11), + WM_SETTEXT = (12), + WM_SETTINGCHANGE = (26), + WM_SHOWWINDOW = (24), + WM_SIZE = (5), + WM_SIZECLIPBOARD = (779), + WM_SIZING = (532), + WM_SPOOLERSTATUS = (42), + WM_STYLECHANGED = (125), + WM_STYLECHANGING = (124), + WM_SYSCHAR = (262), + WM_SYSCOLORCHANGE = (21), + WM_SYSCOMMAND = (274), + WM_SYSDEADCHAR = (263), + WM_SYSKEYDOWN = (260), + WM_SYSKEYUP = (261), + WM_TCARD = (82), + WM_TIMECHANGE = (30), + WM_TIMER = (275), + WM_UNDO = (772), + WM_USER = (1024), + WM_USERCHANGED = (84), + WM_VKEYTOITEM = (46), + WM_VSCROLL = (277), + WM_VSCROLLCLIPBOARD = (778), + WM_WINDOWPOSCHANGED = (71), + WM_WINDOWPOSCHANGING = (70), + WM_WININICHANGE = (26), + WM_KEYFIRST = (256), + WM_KEYLAST = (264), + WM_MOUSEFIRST = (512), + WM_MOUSELAST = (521), +} +struct VA_LIST +{ +} + + +struct ABC +{ + int abcA; + UINT abcB; + int abcC; +} + +alias ABC* LPABC; +alias ABC _ABC; +alias ABC TABC; +alias ABC* PABC; + +struct ABCFLOAT +{ + FLOAT abcfA; + FLOAT abcfB; + FLOAT abcfC; +} + +alias ABCFLOAT* LPABCFLOAT; +alias ABCFLOAT _ABCFLOAT; +alias ABCFLOAT TABCFLOAT; +alias ABCFLOAT* PABCFLOAT; + +struct ACCEL +{ + ubyte fVirt; + ushort key; + ushort cmd; +} + +alias ACCEL* LPACCEL; +alias ACCEL _ACCEL; +alias ACCEL TACCEL; +alias ACCEL* PACCEL; + +struct ACE_HEADER +{ + ubyte AceType; + ubyte AceFlags; + ushort AceSize; +} + +alias ACE_HEADER _ACE_HEADER; +alias ACE_HEADER TACE_HEADER; +alias ACE_HEADER* PACE_HEADER; +alias DWORD ACCESS_MASK; +alias ACCESS_MASK REGSAM; + +struct ACCESS_ALLOWED_ACE +{ + ACE_HEADER Header; + ACCESS_MASK Mask; + DWORD SidStart; +} + +alias ACCESS_ALLOWED_ACE _ACCESS_ALLOWED_ACE; +alias ACCESS_ALLOWED_ACE TACCESS_ALLOWED_ACE; +alias ACCESS_ALLOWED_ACE* PACCESS_ALLOWED_ACE; + +struct ACCESS_DENIED_ACE +{ + ACE_HEADER Header; + ACCESS_MASK Mask; + DWORD SidStart; +} + +alias ACCESS_DENIED_ACE _ACCESS_DENIED_ACE; +alias ACCESS_DENIED_ACE TACCESS_DENIED_ACE; + +struct ACCESSTIMEOUT +{ + UINT cbSize; + DWORD dwFlags; + DWORD iTimeOutMSec; +} + +alias ACCESSTIMEOUT _ACCESSTIMEOUT; +alias ACCESSTIMEOUT TACCESSTIMEOUT; +alias ACCESSTIMEOUT* PACCESSTIMEOUT; + +struct ACL +{ + ubyte AclRevision; + ubyte Sbz1; + ushort AclSize; + ushort AceCount; + ushort Sbz2; +} + +alias ACL* PACL; +alias ACL _ACL; +alias ACL TACL; + +struct ACL_REVISION_INFORMATION +{ + DWORD AclRevision; +} + +alias ACL_REVISION_INFORMATION _ACL_REVISION_INFORMATION; +alias ACL_REVISION_INFORMATION TACLREVISIONINFORMATION; +alias ACL_REVISION_INFORMATION* PACLREVISIONINFORMATION; + +struct ACL_SIZE_INFORMATION +{ + DWORD AceCount; + DWORD AclBytesInUse; + DWORD AclBytesFree; +} + +alias ACL_SIZE_INFORMATION _ACL_SIZE_INFORMATION; +alias ACL_SIZE_INFORMATION TACLSIZEINFORMATION; +alias ACL_SIZE_INFORMATION* PACLSIZEINFORMATION; + +struct ACTION_HEADER +{ + ULONG transport_id; + USHORT action_code; + USHORT reserved; +} + +alias ACTION_HEADER _ACTION_HEADER; +alias ACTION_HEADER TACTIONHEADER; +alias ACTION_HEADER* PACTIONHEADER; + +struct ADAPTER_STATUS +{ + UCHAR[1 + 5] adapter_address; + UCHAR rev_major; + UCHAR reserved0; + UCHAR adapter_type; + UCHAR rev_minor; + ushort duration; + ushort frmr_recv; + ushort frmr_xmit; + ushort iframe_recv_err; + ushort xmit_aborts; + DWORD xmit_success; + DWORD recv_success; + ushort iframe_xmit_err; + ushort recv_buff_unavail; + ushort t1_timeouts; + ushort ti_timeouts; + DWORD reserved1; + ushort free_ncbs; + ushort max_cfg_ncbs; + ushort max_ncbs; + ushort xmit_buf_unavail; + ushort max_dgram_size; + ushort pending_sess; + ushort max_cfg_sess; + ushort max_sess; + ushort max_sess_pkt_size; + ushort name_count; +} + +alias ADAPTER_STATUS _ADAPTER_STATUS; +alias ADAPTER_STATUS TADAPTERSTATUS; +alias ADAPTER_STATUS* PADAPTERSTATUS; + +struct ADDJOB_INFO_1 +{ + LPTSTR Path; + DWORD JobId; +} + +alias ADDJOB_INFO_1 _ADDJOB_INFO_1; +alias ADDJOB_INFO_1 TADDJOB_INFO_1; +alias ADDJOB_INFO_1* PADDJOB_INFO_1; + +struct ANIMATIONINFO +{ + UINT cbSize; + int iMinAnimate; +} + +alias ANIMATIONINFO* LPANIMATIONINFO; +alias ANIMATIONINFO _ANIMATIONINFO; +alias ANIMATIONINFO TANIMATIONINFO; +alias ANIMATIONINFO* PANIMATIONINFO; + +struct RECT +{ + LONG left; + LONG top; + LONG right; + LONG bottom; +} + +alias RECT* LPRECT; +alias RECT _RECT; +alias RECT TRECT; +alias RECT* PRECT; + +struct RECTL +{ + LONG left; + LONG top; + LONG right; + LONG bottom; +} + +alias RECTL _RECTL; +alias RECTL TRECTL; +alias RECTL* PRECTL; + +struct APPBARDATA +{ + DWORD cbSize; + HWND hWnd; + UINT uCallbackMessage; + UINT uEdge; + RECT rc; + LPARAM lParam; +} + +alias APPBARDATA _APPBARDATA; +alias APPBARDATA TAPPBARDATA; +alias APPBARDATA* PAPPBARDATA; + +struct BITMAP +{ + LONG bmType; + LONG bmWidth; + LONG bmHeight; + LONG bmWidthBytes; + ushort bmPlanes; + ushort bmBitsPixel; + LPVOID bmBits; +} + +alias BITMAP* PBITMAP; +alias BITMAP* NPBITMAP; +alias BITMAP* LPBITMAP; +alias BITMAP TAGBITMAP; +alias BITMAP TBITMAP; + +struct BITMAPCOREHEADER +{ + DWORD bcSize; + ushort bcWidth; + ushort bcHeight; + ushort bcPlanes; + ushort bcBitCount; +} + +alias BITMAPCOREHEADER TAGBITMAPCOREHEADER; +alias BITMAPCOREHEADER TBITMAPCOREHEADER; +alias BITMAPCOREHEADER* PBITMAPCOREHEADER; + +struct RGBTRIPLE +{ + ubyte rgbtBlue; + ubyte rgbtGreen; + ubyte rgbtRed; +} + +alias RGBTRIPLE TAGRGBTRIPLE; +alias RGBTRIPLE TRGBTRIPLE; +alias RGBTRIPLE* PRGBTRIPLE; + +struct BITMAPCOREINFO +{ + BITMAPCOREHEADER bmciHeader; + RGBTRIPLE[1 + 0] bmciColors; +} + +alias BITMAPCOREINFO* PBITMAPCOREINFO; +alias BITMAPCOREINFO* LPBITMAPCOREINFO; +alias BITMAPCOREINFO _BITMAPCOREINFO; +alias BITMAPCOREINFO TBITMAPCOREINFO; + +struct BITMAPINFOHEADER +{ + DWORD biSize; + LONG biWidth; + LONG biHeight; + ushort biPlanes; + ushort biBitCount; + DWORD biCompression; + DWORD biSizeImage; + LONG biXPelsPerMeter; + LONG biYPelsPerMeter; + DWORD biClrUsed; + DWORD biClrImportant; +} + +alias BITMAPINFOHEADER* LPBITMAPINFOHEADER; +alias BITMAPINFOHEADER TBITMAPINFOHEADER; +alias BITMAPINFOHEADER* PBITMAPINFOHEADER; + +struct RGBQUAD +{ + ubyte rgbBlue; + ubyte rgbGreen; + ubyte rgbRed; + ubyte rgbReserved; +} + +alias RGBQUAD TAGRGBQUAD; +alias RGBQUAD TRGBQUAD; +alias RGBQUAD* PRGBQUAD; + +struct BITMAPINFO +{ + BITMAPINFOHEADER bmiHeader; + RGBQUAD[1 + 0] bmiColors; +} + +alias BITMAPINFO* LPBITMAPINFO; +alias BITMAPINFO* PBITMAPINFO; +alias BITMAPINFO TBITMAPINFO; +alias int FXPT2DOT30; +alias FXPT2DOT30* LPFXPT2DOT30; +alias FXPT2DOT30 TPFXPT2DOT30; +alias FXPT2DOT30* PPFXPT2DOT30; + +struct CIEXYZ +{ + FXPT2DOT30 ciexyzX; + FXPT2DOT30 ciexyzY; + FXPT2DOT30 ciexyzZ; +} + +alias CIEXYZ TAGCIEXYZ; +alias CIEXYZ* LPCIEXYZ; +alias CIEXYZ TPCIEXYZ; +alias CIEXYZ* PCIEXYZ; + +struct CIEXYZTRIPLE +{ + CIEXYZ ciexyzRed; + CIEXYZ ciexyzGreen; + CIEXYZ ciexyzBlue; +} + +alias CIEXYZTRIPLE TAGCIEXYZTRIPLE; +alias CIEXYZTRIPLE* LPCIEXYZTRIPLE; +alias CIEXYZTRIPLE TCIEXYZTRIPLE; +alias CIEXYZTRIPLE* PCIEXYZTRIPLE; + +struct BITMAPV4HEADER +{ + DWORD bV4Size; + LONG bV4Width; + LONG bV4Height; + ushort bV4Planes; + ushort bV4BitCount; + DWORD bV4V4Compression; + DWORD bV4SizeImage; + LONG bV4XPelsPerMeter; + LONG bV4YPelsPerMeter; + DWORD bV4ClrUsed; + DWORD bV4ClrImportant; + DWORD bV4RedMask; + DWORD bV4GreenMask; + DWORD bV4BlueMask; + DWORD bV4AlphaMask; + DWORD bV4CSType; + CIEXYZTRIPLE bV4Endpoints; + DWORD bV4GammaRed; + DWORD bV4GammaGreen; + DWORD bV4GammaBlue; +} + +alias BITMAPV4HEADER* LPBITMAPV4HEADER; +alias BITMAPV4HEADER TBITMAPV4HEADER; +alias BITMAPV4HEADER* PBITMAPV4HEADER; + +align(1) struct BITMAPFILEHEADER +{ + ushort bfType; + DWORD bfSize; + ushort bfReserved1; + ushort bfReserved2; + DWORD bfOffBits; +} + + +struct BLOB +{ + ULONG cbSize; + ubyte* pBlobData; +} + +alias BLOB _BLOB; +alias BLOB TBLOB; +alias BLOB* PBLOB; + +struct SHITEMID +{ + USHORT cb; + ubyte[1 + 0] abID; +} + +alias SHITEMID* LPSHITEMID; +alias SHITEMID* LPCSHITEMID; +alias SHITEMID _SHITEMID; +alias SHITEMID TSHITEMID; +alias SHITEMID* PSHITEMID; + +struct ITEMIDLIST +{ + SHITEMID mkid; +} + +alias ITEMIDLIST* LPITEMIDLIST; +alias ITEMIDLIST* LPCITEMIDLIST; +alias ITEMIDLIST _ITEMIDLIST; +alias ITEMIDLIST TITEMIDLIST; +alias ITEMIDLIST* PITEMIDLIST; + +struct BROWSEINFO +{ + HWND hwndOwner; + LPCITEMIDLIST pidlRoot; + LPSTR pszDisplayName; + LPCSTR lpszTitle; + UINT ulFlags; + BFFCALLBACK lpfn; + LPARAM lParam; + int iImage; +} + +alias BROWSEINFO* LPBROWSEINFO; +alias BROWSEINFO _BROWSEINFO; +alias BROWSEINFO TBROWSEINFO; +alias BROWSEINFO* PBROWSEINFO; + +struct FILETIME +{ + DWORD dwLowDateTime; + DWORD dwHighDateTime; +} + +alias FILETIME* LPFILETIME; +alias FILETIME _FILETIME; +alias FILETIME TFILETIME; +alias FILETIME* PFILETIME; + +struct BY_HANDLE_FILE_INFORMATION +{ + DWORD dwFileAttributes; + FILETIME ftCreationTime; + FILETIME ftLastAccessTime; + FILETIME ftLastWriteTime; + DWORD dwVolumeSerialNumber; + DWORD nFileSizeHigh; + DWORD nFileSizeLow; + DWORD nNumberOfLinks; + DWORD nFileIndexHigh; + DWORD nFileIndexLow; +} + +alias BY_HANDLE_FILE_INFORMATION* LPBY_HANDLE_FILE_INFORMATION; +alias BY_HANDLE_FILE_INFORMATION _BY_HANDLE_FILE_INFORMATION; +alias BY_HANDLE_FILE_INFORMATION TBYHANDLEFILEINFORMATION; +alias BY_HANDLE_FILE_INFORMATION* PBYHANDLEFILEINFORMATION; + +struct FIXED +{ + ushort fract; + int value; +} + +alias FIXED _FIXED; +alias FIXED TFIXED; +alias FIXED* PFIXED; + +struct POINT +{ + LONG x; + LONG y; +} + +alias POINT* LPPOINT; +alias POINT TAGPOINT; +alias POINT TPOINT; +alias POINT* PPOINT; + +struct POINTFX +{ + FIXED x; + FIXED y; +} + +alias POINTFX TAGPOINTFX; +alias POINTFX TPOINTFX; +alias POINTFX* PPOINTFX; + +struct POINTL +{ + LONG x; + LONG y; +} + +alias POINTL _POINTL; +alias POINTL TPOINTL; +alias POINTL* PPOINTL; + +struct TSMALLPOINT +{ + byte X, Y; +} + + +struct POINTS +{ + SHORT x; + SHORT y; +} + +alias POINTS TAGPOINTS; +alias POINTS TPOINTS; +alias POINTS* PPOINTS; + +struct CANDIDATEFORM +{ + DWORD dwIndex; + DWORD dwStyle; + POINT ptCurrentPos; + RECT rcArea; +} + +alias CANDIDATEFORM* LPCANDIDATEFORM; +alias CANDIDATEFORM _TAGCANDIDATEFORM; +alias CANDIDATEFORM TCANDIDATEFORM; +alias CANDIDATEFORM* PCANDIDATEFORM; + +struct CANDIDATELIST +{ + DWORD dwSize; + DWORD dwStyle; + DWORD dwCount; + DWORD dwSelection; + DWORD dwPageStart; + DWORD dwPageSize; + DWORD[1 + 0] dwOffset; +} + +alias CANDIDATELIST* LPCANDIDATELIST; +alias CANDIDATELIST _TAGCANDIDATELIST; +alias CANDIDATELIST TCANDIDATELIST; +alias CANDIDATELIST* PCANDIDATELIST; + +struct CREATESTRUCT +{ + LPVOID lpCreateParams; + HINST hInstance; + HMENU hMenu; + HWND hwndParent; + int cy; + int cx; + int y; + int x; + LONG style; + LPCTSTR lpszName; + LPCTSTR lpszClass; + DWORD dwExStyle; +} + +alias CREATESTRUCT* LPCREATESTRUCT; +alias CREATESTRUCT TAGCREATESTRUCT; +alias CREATESTRUCT TCREATESTRUCT; +alias CREATESTRUCT* PCREATESTRUCT; + +struct CBT_CREATEWND +{ + LPCREATESTRUCT lpcs; + HWND hwndInsertAfter; +} + +alias CBT_CREATEWND TAGCBT_CREATEWND; +alias CBT_CREATEWND TCBT_CREATEWND; +alias CBT_CREATEWND* PCBT_CREATEWND; + +struct CBTACTIVATESTRUCT +{ + WINBOOL fMouse; + HWND hWndActive; +} + +alias CBTACTIVATESTRUCT TAGCBTACTIVATESTRUCT; +alias CBTACTIVATESTRUCT TCBTACTIVATESTRUCT; +alias CBTACTIVATESTRUCT* PCBTACTIVATESTRUCT; + +struct CHAR_INFO +{ + + union + { + struct + { + WCHAR UnicodeChar; + ushort Attributes; + } + struct + { + char AsciiChar; + } + } +} + +alias CHAR_INFO _CHAR_INFO; +alias CHAR_INFO TCHAR_INFO; +alias CHAR_INFO* PCHAR_INFO; + +struct CHARFORMAT +{ + UINT cbSize; + DWORD dwMask; + DWORD dwEffects; + LONG yHeight; + LONG yOffset; + COLORREF crTextColor; + ubyte bCharSet; + ubyte bPitchAndFamily; + TCHAR[1 + LF_FACESIZE-1] szFaceName; +} + +alias CHARFORMAT _CHARFORMAT; +alias CHARFORMAT TCHARFORMAT; +alias CHARFORMAT* PCHARFORMAT; + +struct CHARRANGE +{ + LONG cpMin; + LONG cpMax; +} + +alias CHARRANGE _CHARRANGE; +alias CHARRANGE TCHARRANGE; +alias CHARRANGE* PCHARRANGE; + +struct CHARSET +{ + DWORD[1 + 2] aflBlock; + DWORD flLang; +} + +alias CHARSET TAGCHARSET; +alias CHARSET TCHARSET; +alias CHARSET* PCHARSET; + +struct FONTSIGNATURE +{ + DWORD[1 + 3] fsUsb; + DWORD[1 + 1] fsCsb; +} + +alias FONTSIGNATURE* LPFONTSIGNATURE; +alias FONTSIGNATURE TAGFONTSIGNATURE; +alias FONTSIGNATURE TFONTSIGNATURE; +alias FONTSIGNATURE* PFONTSIGNATURE; + +struct CHARSETINFO +{ + UINT ciCharset; + UINT ciACP; + FONTSIGNATURE fs; +} + +alias CHARSETINFO* LPCHARSETINFO; +alias CHARSETINFO TCHARSETINFO; +alias CHARSETINFO* PCHARSETINFO; + +struct TCHOOSECOLOR +{ + DWORD lStructSize; + HWND hwndOwner; + HWND hInstance; + COLORREF rgbResult; + COLORREF* lpCustColors; + DWORD Flags; + LPARAM lCustData; + LPCCHOOKPROC lpfnHook; + LPCTSTR lpTemplateName; +} + +alias TCHOOSECOLOR* LPCHOOSECOLOR; +alias TCHOOSECOLOR* PCHOOSECOLOR; + +struct LOGFONT +{ + LONG lfHeight; + LONG lfWidth; + LONG lfEscapement; + LONG lfOrientation; + LONG lfWeight; + ubyte lfItalic; + ubyte lfUnderline; + ubyte lfStrikeOut; + ubyte lfCharSet; + ubyte lfOutPrecision; + ubyte lfClipPrecision; + ubyte lfQuality; + ubyte lfPitchAndFamily; + TCHAR[1 + LF_FACESIZE-1] lfFaceName; +} + +alias LOGFONT* LPLOGFONT; +alias LOGFONT TLOGFONT; +alias LOGFONT TLOGFONTA; +alias LOGFONT* PLOGFONT; + +struct LOGFONTW +{ + LONG lfHeight; + LONG lfWidth; + LONG lfEscapement; + LONG lfOrientation; + LONG lfWeight; + ubyte lfItalic; + ubyte lfUnderline; + ubyte lfStrikeOut; + ubyte lfCharSet; + ubyte lfOutPrecision; + ubyte lfClipPrecision; + ubyte lfQuality; + ubyte lfPitchAndFamily; + WCHAR lfFaceName[LF_FACESIZE]; +}; + +alias LOGFONTW* LPLOGFONTW; +alias LOGFONTW TLOGFONTW; +alias LOGFONTW TLOGFONTWA; +alias LOGFONTW* PLOGFONTW; + +struct TCHOOSEFONT +{ + DWORD lStructSize; + HWND hwndOwner; + HDC hDC; + LPLOGFONT lpLogFont; + INT iPointSize; + DWORD Flags; + DWORD rgbColors; + LPARAM lCustData; + LPCFHOOKPROC lpfnHook; + LPCTSTR lpTemplateName; + HINST hInstance; + LPTSTR lpszStyle; + ushort nFontType; + ushort ___MISSING_ALIGNMENT__; + INT nSizeMin; + INT nSizeMax; +} + +alias TCHOOSEFONT* LPCHOOSEFONT; +alias TCHOOSEFONT* PCHOOSEFONT; + +struct CIDA +{ + UINT cidl; + UINT[1 + 0] aoffset; +} + +alias CIDA* LPIDA; +alias CIDA _IDA; +alias CIDA TIDA; +alias CIDA* PIDA; + +struct CLIENTCREATESTRUCT +{ + HANDLE hWindowMenu; + UINT idFirstChild; +} + +alias CLIENTCREATESTRUCT* LPCLIENTCREATESTRUCT; +alias CLIENTCREATESTRUCT TAGCLIENTCREATESTRUCT; +alias CLIENTCREATESTRUCT TCLIENTCREATESTRUCT; +alias CLIENTCREATESTRUCT* PCLIENTCREATESTRUCT; + +struct CMINVOKECOMMANDINFO +{ + DWORD cbSize; + DWORD fMask; + HWND hwnd; + LPCSTR lpVerb; + LPCSTR lpParameters; + LPCSTR lpDirectory; + int nShow; + DWORD dwHotKey; + HANDLE hIcon; +} + +alias CMINVOKECOMMANDINFO* LPCMINVOKECOMMANDINFO; +alias CMINVOKECOMMANDINFO _CMINVOKECOMMANDINFO; +alias CMINVOKECOMMANDINFO TCMINVOKECOMMANDINFO; +alias CMINVOKECOMMANDINFO* PCMINVOKECOMMANDINFO; + +struct COLORADJUSTMENT +{ + ushort caSize; + ushort caFlags; + ushort caIlluminantIndex; + ushort caRedGamma; + ushort caGreenGamma; + ushort caBlueGamma; + ushort caReferenceBlack; + ushort caReferenceWhite; + SHORT caContrast; + SHORT caBrightness; + SHORT caColorfulness; + SHORT caRedGreenTint; +} + +alias COLORADJUSTMENT* LPCOLORADJUSTMENT; +alias COLORADJUSTMENT TAGCOLORADJUSTMENT; +alias COLORADJUSTMENT TCOLORADJUSTMENT; +alias COLORADJUSTMENT* PCOLORADJUSTMENT; + +struct COLORMAP +{ + COLORREF from; + COLORREF _to; +} + +alias COLORMAP* LPCOLORMAP; +alias COLORMAP _COLORMAP; +alias COLORMAP TCOLORMAP; +alias COLORMAP* PCOLORMAP; + +struct DCB +{ + DWORD DCBlength; + DWORD BaudRate; + int flag0; + ushort wReserved; + ushort XonLim; + ushort XoffLim; + ubyte ByteSize; + ubyte Parity; + ubyte StopBits; + char XonChar; + char XoffChar; + char ErrorChar; + char EofChar; + char EvtChar; + ushort wReserved1; +} + +alias DCB* LPDCB; +alias DCB _DCB; +alias DCB TDCB; +alias DCB* PDCB; +enum : DWORD { + bm_DCB_fBinary = (0x1), + bp_DCB_fBinary = (0), + bm_DCB_fParity = (0x2), + bp_DCB_fParity = (1), + bm_DCB_fOutxCtsFlow = (0x4), + bp_DCB_fOutxCtsFlow = (2), + bm_DCB_fOutxDsrFlow = (0x8), + bp_DCB_fOutxDsrFlow = (3), + bm_DCB_fDtrControl = (0x30), + bp_DCB_fDtrControl = (4), + bm_DCB_fDsrSensitivity = (0x40), + bp_DCB_fDsrSensitivity = (6), + bm_DCB_fTXContinueOnXoff = (0x80), + bp_DCB_fTXContinueOnXoff = (7), + bm_DCB_fOutX = (0x100), + bp_DCB_fOutX = (8), + bm_DCB_fInX = (0x200), + bp_DCB_fInX = (9), + bm_DCB_fErrorChar = (0x400), + bp_DCB_fErrorChar = (10), + bm_DCB_fNull = (0x800), + bp_DCB_fNull = (11), + bm_DCB_fRtsControl = (0x3000), + bp_DCB_fRtsControl = (12), + bm_DCB_fAbortOnError = (0x4000), + bp_DCB_fAbortOnError = (14), + bm_DCB_fDummy2 = (0xFFFF8000), + bp_DCB_fDummy2 = (15), +} + +struct COMMCONFIG +{ + DWORD dwSize; + ushort wVersion; + ushort wReserved; + DCB dcb; + DWORD dwProviderSubType; + DWORD dwProviderOffset; + DWORD dwProviderSize; + WCHAR[1 + 0] wcProviderData; +} + +alias COMMCONFIG* LPCOMMCONFIG; +alias COMMCONFIG _COMM_CONFIG; +alias COMMCONFIG TCOMMCONFIG; +alias COMMCONFIG* PCOMMCONFIG; + +struct COMMPROP +{ + ushort wPacketLength; + ushort wPacketVersion; + DWORD dwServiceMask; + DWORD dwReserved1; + DWORD dwMaxTxQueue; + DWORD dwMaxRxQueue; + DWORD dwMaxBaud; + DWORD dwProvSubType; + DWORD dwProvCapabilities; + DWORD dwSettableParams; + DWORD dwSettableBaud; + ushort wSettableData; + ushort wSettableStopParity; + DWORD dwCurrentTxQueue; + DWORD dwCurrentRxQueue; + DWORD dwProvSpec1; + DWORD dwProvSpec2; + WCHAR[1 + 0] wcProvChar; +} + +alias COMMPROP* LPCOMMPROP; +alias COMMPROP _COMMPROP; +alias COMMPROP TCOMMPROP; +alias COMMPROP* PCOMMPROP; + +struct COMMTIMEOUTS +{ + DWORD ReadIntervalTimeout; + DWORD ReadTotalTimeoutMultiplier; + DWORD ReadTotalTimeoutConstant; + DWORD WriteTotalTimeoutMultiplier; + DWORD WriteTotalTimeoutConstant; +} + +alias COMMTIMEOUTS* LPCOMMTIMEOUTS; +alias COMMTIMEOUTS _COMMTIMEOUTS; +alias COMMTIMEOUTS TCOMMTIMEOUTS; +alias COMMTIMEOUTS* PCOMMTIMEOUTS; + +struct COMPAREITEMSTRUCT +{ + UINT CtlType; + UINT CtlID; + HWND hwndItem; + UINT itemID1; + DWORD itemData1; + UINT itemID2; + DWORD itemData2; +} + +alias COMPAREITEMSTRUCT TAGCOMPAREITEMSTRUCT; +alias COMPAREITEMSTRUCT TCOMPAREITEMSTRUCT; +alias COMPAREITEMSTRUCT* PCOMPAREITEMSTRUCT; + +struct COMPCOLOR +{ + COLORREF crText; + COLORREF crBackground; + DWORD dwEffects; +} + +alias COMPCOLOR TCOMPCOLOR; +alias COMPCOLOR* PCOMPCOLOR; + +struct COMPOSITIONFORM +{ + DWORD dwStyle; + POINT ptCurrentPos; + RECT rcArea; +} + +alias COMPOSITIONFORM* LPCOMPOSITIONFORM; +alias COMPOSITIONFORM _TAGCOMPOSITIONFORM; +alias COMPOSITIONFORM TCOMPOSITIONFORM; +alias COMPOSITIONFORM* PCOMPOSITIONFORM; + +struct COMSTAT +{ + int flag0; + DWORD cbInQue; + DWORD cbOutQue; +} + +alias COMSTAT* LPCOMSTAT; +alias COMSTAT _COMSTAT; +alias COMSTAT TCOMSTAT; +alias COMSTAT* PCOMSTAT; +enum : DWORD { + bm_COMSTAT_fCtsHold = (0x1), + bp_COMSTAT_fCtsHold = (0), + bm_COMSTAT_fDsrHold = (0x2), + bp_COMSTAT_fDsrHold = (1), + bm_COMSTAT_fRlsdHold = (0x4), + bp_COMSTAT_fRlsdHold = (2), + bm_COMSTAT_fXoffHold = (0x8), + bp_COMSTAT_fXoffHold = (3), + bm_COMSTAT_fXoffSent = (0x10), + bp_COMSTAT_fXoffSent = (4), + bm_COMSTAT_fEof = (0x20), + bp_COMSTAT_fEof = (5), + bm_COMSTAT_fTxim = (0x40), + bp_COMSTAT_fTxim = (6), + bm_COMSTAT_fReserved = (0xFFFFFF80), + bp_COMSTAT_fReserved = (7), +} +struct CONSOLE_CURSOR_INFO +{ + DWORD dwSize; + WINBOOL bVisible; +} + +alias CONSOLE_CURSOR_INFO* PCONSOLE_CURSOR_INFO; +alias CONSOLE_CURSOR_INFO _CONSOLE_CURSOR_INFO; +alias CONSOLE_CURSOR_INFO TCONSOLECURSORINFO; +alias CONSOLE_CURSOR_INFO* PCONSOLECURSORINFO; +alias CONSOLE_CURSOR_INFO TCURSORINFO; + +struct COORD +{ + SHORT X; + SHORT Y; +} + +alias COORD _COORD; +alias COORD TCOORD; +alias COORD* PCOORD; + +struct SMALL_RECT +{ + SHORT Left; + SHORT Top; + SHORT Right; + SHORT Bottom; +} + +alias SMALL_RECT _SMALL_RECT; +alias SMALL_RECT TSMALL_RECT; +alias SMALL_RECT* PSMALL_RECT; + +align(1) struct CONSOLE_SCREEN_BUFFER_INFO +{ + COORD dwSize; + COORD dwCursorPosition; + ushort wAttributes; + SMALL_RECT srWindow; + COORD dwMaximumWindowSize; +} + +alias CONSOLE_SCREEN_BUFFER_INFO* PCONSOLE_SCREEN_BUFFER_INFO; +alias CONSOLE_SCREEN_BUFFER_INFO _CONSOLE_SCREEN_BUFFER_INFO; +alias CONSOLE_SCREEN_BUFFER_INFO TCONSOLESCREENBUFFERINFO; +alias CONSOLE_SCREEN_BUFFER_INFO* PCONSOLESCREENBUFFERINFO; + +struct FLOATING_SAVE_AREA +{ + DWORD ControlWord; + DWORD StatusWord; + DWORD TagWord; + DWORD ErrorOffset; + DWORD ErrorSelector; + DWORD DataOffset; + DWORD DataSelector; + ubyte[1 + 79] RegisterArea; + DWORD Cr0NpxState; +} + +alias FLOATING_SAVE_AREA _FLOATING_SAVE_AREA; +alias FLOATING_SAVE_AREA TFLOATINGSAVEAREA; +alias FLOATING_SAVE_AREA* PFLOATINGSAVEAREA; + +enum : DWORD +{ +// +// The following flags control the contents of the CONTEXT structure. +// + CONTEXT_i386 = 0x00010000, // this assumes that i386 and + CONTEXT_i486 = 0x00010000, // i486 have identical context records + + CONTEXT_CONTROL = (CONTEXT_i386 | 0x00000001), // SS:SP, CS:IP, FLAGS, BP + CONTEXT_INTEGER = (CONTEXT_i386 | 0x00000002), // AX, BX, CX, DX, SI, DI + CONTEXT_SEGMENTS = (CONTEXT_i386 | 0x00000004), // DS, ES, FS, GS + CONTEXT_FLOATING_POINT = (CONTEXT_i386 | 0x00000008), // 387 state + CONTEXT_DEBUG_REGISTERS = (CONTEXT_i386 | 0x00000010), // DB 0-3,6,7 + + CONTEXT_FULL = (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS), +} + +struct CONTEXT +{ + DWORD ContextFlags; + DWORD Dr0; + DWORD Dr1; + DWORD Dr2; + DWORD Dr3; + DWORD Dr6; + DWORD Dr7; + FLOATING_SAVE_AREA FloatSave; + DWORD SegGs; + DWORD SegFs; + DWORD SegEs; + DWORD SegDs; + DWORD Edi; + DWORD Esi; + DWORD Ebx; + DWORD Edx; + DWORD Ecx; + DWORD Eax; + DWORD Ebp; + DWORD Eip; + DWORD SegCs; + DWORD EFlags; + DWORD Esp; + DWORD SegSs; +} + +alias CONTEXT* LPCONTEXT; +alias CONTEXT _CONTEXT; +alias CONTEXT TCONTEXT; +alias CONTEXT* PCONTEXT; + +struct LIST_ENTRY +{ + _LIST_ENTRY* Flink; + _LIST_ENTRY* Blink; +} + +alias LIST_ENTRY _LIST_ENTRY; +alias LIST_ENTRY TLISTENTRY; +alias LIST_ENTRY* PLISTENTRY; + +struct CRITICAL_SECTION_DEBUG +{ + ushort _Type; + ushort CreatorBackTraceIndex; + _CRITICAL_SECTION* CriticalSection; + LIST_ENTRY ProcessLocksList; + DWORD EntryCount; + DWORD ContentionCount; + DWORD Depth; + PVOID[1 + 4] OwnerBackTrace; +} + +alias CRITICAL_SECTION_DEBUG* LPCRITICAL_SECTION_DEBUG; +alias CRITICAL_SECTION_DEBUG PCRITICAL_SECTION_DEBUG; +alias CRITICAL_SECTION_DEBUG _CRITICAL_SECTION_DEBUG; +alias CRITICAL_SECTION_DEBUG TCRITICALSECTIONDEBUG; +alias CRITICAL_SECTION_DEBUG* PCRITICALSECTIONDEBUG; + +struct CRITICAL_SECTION +{ + PCRITICAL_SECTION_DEBUG DebugInfo; + LONG LockCount; + LONG RecursionCount; + HANDLE OwningThread; + HANDLE LockSemaphore; + DWORD Reserved; +} + +alias CRITICAL_SECTION* LPCRITICAL_SECTION; +alias CRITICAL_SECTION* PCRITICAL_SECTION; +alias CRITICAL_SECTION _CRITICAL_SECTION; +alias CRITICAL_SECTION TCRITICALSECTION; +alias CRITICAL_SECTION* PCRITICALSECTION; + +struct SECURITY_QUALITY_OF_SERVICE +{ + DWORD Length; + SECURITY_IMPERSONATION_LEVEL ImpersonationLevel; + WINBOOL ContextTrackingMode; + ubyte EffectiveOnly; +} + +alias SECURITY_QUALITY_OF_SERVICE* PSECURITY_QUALITY_OF_SERVICE; +alias SECURITY_QUALITY_OF_SERVICE _SECURITY_QUALITY_OF_SERVICE; +alias SECURITY_QUALITY_OF_SERVICE TSECURITYQUALITYOFSERVICE; +alias SECURITY_QUALITY_OF_SERVICE* PSECURITYQUALITYOFSERVICE; + +struct CONVCONTEXT +{ + UINT cb; + UINT wFlags; + UINT wCountryID; + int iCodePage; + DWORD dwLangID; + DWORD dwSecurity; + SECURITY_QUALITY_OF_SERVICE qos; +} + +alias CONVCONTEXT TAGCONVCONTEXT; +alias CONVCONTEXT TCONVCONTEXT; +alias CONVCONTEXT* PCONVCONTEXT; + +struct CONVINFO +{ + DWORD cb; + DWORD hUser; + HCONV hConvPartner; + HSZ hszSvcPartner; + HSZ hszServiceReq; + HSZ hszTopic; + HSZ hszItem; + UINT wFmt; + UINT wType; + UINT wStatus; + UINT wConvst; + UINT wLastError; + HCONVLIST hConvList; + CONVCONTEXT ConvCtxt; + HWND _hwnd; + HWND hwndPartner; +} + +alias CONVINFO TAGCONVINFO; +alias CONVINFO TCONVINFO; +alias CONVINFO* PCONVINFO; + +struct COPYDATASTRUCT +{ + DWORD dwData; + DWORD cbData; + PVOID lpData; +} + +alias COPYDATASTRUCT TAGCOPYDATASTRUCT; +alias COPYDATASTRUCT TCOPYDATASTRUCT; +alias COPYDATASTRUCT* PCOPYDATASTRUCT; + +struct CPINFO +{ + UINT MaxCharSize; + ubyte[1 + MAX_DEFAULTCHAR-1] DefaultChar; + ubyte[1 + MAX_LEADBYTES-1] LeadByte; +} + +alias CPINFO* LPCPINFO; +alias CPINFO _CPINFO; +alias CPINFO TCPINFO; +alias CPINFO* PCPINFO; + +struct CPLINFO +{ + int idIcon; + int idName; + int idInfo; + LONG lData; +} + +alias CPLINFO TAGCPLINFO; +alias CPLINFO TCPLINFO; +alias CPLINFO* PCPLINFO; + +struct CREATE_PROCESS_DEBUG_INFO +{ + HANDLE hFile; + HANDLE hProcess; + HANDLE hThread; + LPVOID lpBaseOfImage; + DWORD dwDebugInfoFileOffset; + DWORD nDebugInfoSize; + LPVOID lpThreadLocalBase; + LPTHREAD_START_ROUTINE lpStartAddress; + LPVOID lpImageName; + ushort fUnicode; +} + +alias CREATE_PROCESS_DEBUG_INFO _CREATE_PROCESS_DEBUG_INFO; +alias CREATE_PROCESS_DEBUG_INFO TCREATEPROCESSDEBUGINFO; +alias CREATE_PROCESS_DEBUG_INFO* PCREATEPROCESSDEBUGINFO; + +struct CREATE_THREAD_DEBUG_INFO +{ + HANDLE hThread; + LPVOID lpThreadLocalBase; + LPTHREAD_START_ROUTINE lpStartAddress; +} + +alias CREATE_THREAD_DEBUG_INFO _CREATE_THREAD_DEBUG_INFO; +alias CREATE_THREAD_DEBUG_INFO TCREATETHREADDEBUGINFO; +alias CREATE_THREAD_DEBUG_INFO* PCREATETHREADDEBUGINFO; + +struct CURRENCYFMT +{ + UINT NumDigits; + UINT LeadingZero; + UINT Grouping; + LPTSTR lpDecimalSep; + LPTSTR lpThousandSep; + UINT NegativeOrder; + UINT PositiveOrder; + LPTSTR lpCurrencySymbol; +} + +alias CURRENCYFMT _CURRENCYFMT; +alias CURRENCYFMT TCURRENCYFMT; +alias CURRENCYFMT* PCURRENCYFMT; + +struct CURSORSHAPE +{ + int xHotSpot; + int yHotSpot; + int cx; + int cy; + int cbWidth; + ubyte Planes; + ubyte BitsPixel; +} + +alias CURSORSHAPE* LPCURSORSHAPE; +alias CURSORSHAPE TAGCURSORSHAPE; +alias CURSORSHAPE TCURSORSHAPE; +alias CURSORSHAPE* PCURSORSHAPE; + +struct CWPRETSTRUCT +{ + LRESULT lResult; + LPARAM lParam; + WPARAM wParam; + DWORD message; + HWND hwnd; +} + +alias CWPRETSTRUCT TAGCWPRETSTRUCT; +alias CWPRETSTRUCT TCWPRETSTRUCT; +alias CWPRETSTRUCT* PCWPRETSTRUCT; + +struct CWPSTRUCT +{ + LPARAM lParam; + WPARAM wParam; + UINT message; + HWND hwnd; +} + +alias CWPSTRUCT TAGCWPSTRUCT; +alias CWPSTRUCT TCWPSTRUCT; +alias CWPSTRUCT* PCWPSTRUCT; + +struct DATATYPES_INFO_1 +{ + LPTSTR pName; +} + +alias DATATYPES_INFO_1 _DATATYPES_INFO_1; +alias DATATYPES_INFO_1 TDATATYPESINFO1; +alias DATATYPES_INFO_1* PDATATYPESINFO1; + +struct DDEACK +{ + ushort flag0; +} + +alias DDEACK TDDEACK; +alias DDEACK* PDDEACK; +enum : DWORD { + bm_DDEACK_bAppReturnCode = (0xFF), + bp_DDEACK_bAppReturnCode = (0), + bm_DDEACK_reserved = (0x3F00), + bp_DDEACK_reserved = (8), + bm_DDEACK_fBusy = (0x4000), + bp_DDEACK_fBusy = (14), + bm_DDEACK_fAck = (0x8000), + bp_DDEACK_fAck = (15), +} + +struct DDEADVISE +{ + ushort flag0; + int cfFormat; +} + +alias DDEADVISE TDDEADVISE; +alias DDEADVISE* PDDEADVISE; +enum : DWORD { + bm_DDEADVISE_reserved = (0x3FFF), + bp_DDEADVISE_reserved = (0), + bm_DDEADVISE_fDeferUpd = (0x4000), + bp_DDEADVISE_fDeferUpd = (14), + bm_DDEADVISE_fAckReq = (0x8000), + bp_DDEADVISE_fAckReq = (15), +} + +struct DDEDATA +{ + ushort flag0; + int cfFormat; + ubyte[1 + 0] Value; +} + +alias DDEDATA* PDDEDATA; +enum : DWORD { + bm_DDEDATA_unused = (0xFFF), + bp_DDEDATA_unused = (0), + bm_DDEDATA_fResponse = (0x1000), + bp_DDEDATA_fResponse = (12), + bm_DDEDATA_fRelease = (0x2000), + bp_DDEDATA_fRelease = (13), + bm_DDEDATA_reserved = (0x4000), + bp_DDEDATA_reserved = (14), + bm_DDEDATA_fAckReq = (0x8000), + bp_DDEDATA_fAckReq = (15), +} + +struct DDELN +{ + ushort flag0; + int cfFormat; +} + +alias DDELN TDDELN; +alias DDELN* PDDELN; +enum : DWORD { + bm_DDELN_unused = (0x1FFF), + bp_DDELN_unused = (0), + bm_DDELN_fRelease = (0x2000), + bp_DDELN_fRelease = (13), + bm_DDELN_fDeferUpd = (0x4000), + bp_DDELN_fDeferUpd = (14), + bm_DDELN_fAckReq = (0x8000), + bp_DDELN_fAckReq = (15), +} + +struct DDEML_MSG_HOOK_DATA +{ + UINT uiLo; + UINT uiHi; + DWORD cbData; + DWORD[1 + 7] Data; +} + +alias DDEML_MSG_HOOK_DATA TAGDDEML_MSG_HOOK_DATA; +alias DDEML_MSG_HOOK_DATA TDDEMLMSGHOOKDATA; +alias DDEML_MSG_HOOK_DATA* PDDEMLMSGHOOKDATA; + +struct DDEPOKE +{ + ushort flag0; + int cfFormat; + ubyte[1 + 0] Value; +} + +alias DDEPOKE TDDEPOKE; +alias DDEPOKE* PDDEPOKE; +enum : DWORD { + bm_DDEPOKE_unused = (0x1FFF), + bp_DDEPOKE_unused = (0), + bm_DDEPOKE_fRelease = (0x2000), + bp_DDEPOKE_fRelease = (13), + bm_DDEPOKE_fReserved = (0xC000), + bp_DDEPOKE_fReserved = (14), +} +struct DDEUP +{ + ushort flag0; + int cfFormat; + ubyte[1 + 0] rgb; +} + +alias DDEUP TDDEUP; +alias DDEUP* PDDEUP; + +enum : DWORD { + bm_DDEUP_unused = (0xFFF), + bp_DDEUP_unused = (0), + bm_DDEUP_fAck = (0x1000), + bp_DDEUP_fAck = (12), + bm_DDEUP_fRelease = (0x2000), + bp_DDEUP_fRelease = (13), + bm_DDEUP_fReserved = (0x4000), + bp_DDEUP_fReserved = (14), + bm_DDEUP_fAckReq = (0x8000), + bp_DDEUP_fAckReq = (15), +} + +struct EXCEPTION_RECORD +{ + DWORD ExceptionCode; + DWORD ExceptionFlags; + _EXCEPTION_RECORD* ExceptionRecord; + PVOID ExceptionAddress; + DWORD NumberParameters; + DWORD[1 + EXCEPTION_MAXIMUM_PARAMETERS-1] ExceptionInformation; +} + +alias EXCEPTION_RECORD* PEXCEPTION_RECORD; +alias EXCEPTION_RECORD _EXCEPTION_RECORD; +alias EXCEPTION_RECORD TEXCEPTIONRECORD; +alias EXCEPTION_RECORD* PEXCEPTIONRECORD; + +struct EXCEPTION_DEBUG_INFO +{ + EXCEPTION_RECORD ExceptionRecord; + DWORD dwFirstChance; +} + +alias EXCEPTION_DEBUG_INFO* PEXCEPTION_DEBUG_INFO; +alias EXCEPTION_DEBUG_INFO _EXCEPTION_DEBUG_INFO; +alias EXCEPTION_DEBUG_INFO TEXCEPTIONDEBUGINFO; +alias EXCEPTION_DEBUG_INFO* PEXCEPTIONDEBUGINFO; + +struct EXIT_PROCESS_DEBUG_INFO +{ + DWORD dwExitCode; +} + +alias EXIT_PROCESS_DEBUG_INFO _EXIT_PROCESS_DEBUG_INFO; +alias EXIT_PROCESS_DEBUG_INFO TEXITPROCESSDEBUGINFO; +alias EXIT_PROCESS_DEBUG_INFO* PEXITPROCESSDEBUGINFO; + +struct EXIT_THREAD_DEBUG_INFO +{ + DWORD dwExitCode; +} + +alias EXIT_THREAD_DEBUG_INFO _EXIT_THREAD_DEBUG_INFO; +alias EXIT_THREAD_DEBUG_INFO TEXITTHREADDEBUGINFO; +alias EXIT_THREAD_DEBUG_INFO* PEXITTHREADDEBUGINFO; + +struct LOAD_DLL_DEBUG_INFO +{ + HANDLE hFile; + LPVOID lpBaseOfDll; + DWORD dwDebugInfoFileOffset; + DWORD nDebugInfoSize; + LPVOID lpImageName; + ushort fUnicode; +} + +alias LOAD_DLL_DEBUG_INFO _LOAD_DLL_DEBUG_INFO; +alias LOAD_DLL_DEBUG_INFO TLOADDLLDEBUGINFO; +alias LOAD_DLL_DEBUG_INFO* PLOADDLLDEBUGINFO; + +struct UNLOAD_DLL_DEBUG_INFO +{ + LPVOID lpBaseOfDll; +} + +alias UNLOAD_DLL_DEBUG_INFO _UNLOAD_DLL_DEBUG_INFO; +alias UNLOAD_DLL_DEBUG_INFO TUNLOADDLLDEBUGINFO; +alias UNLOAD_DLL_DEBUG_INFO* PUNLOADDLLDEBUGINFO; + +struct OUTPUT_DEBUG_STRING_INFO +{ + LPSTR lpDebugStringData; + ushort fUnicode; + ushort nDebugStringLength; +} + +alias OUTPUT_DEBUG_STRING_INFO _OUTPUT_DEBUG_STRING_INFO; +alias OUTPUT_DEBUG_STRING_INFO TOUTPUTDEBUGSTRINGINFO; +alias OUTPUT_DEBUG_STRING_INFO* POUTPUTDEBUGSTRINGINFO; + +struct RIP_INFO +{ + DWORD dwError; + DWORD dwType; +} + +alias RIP_INFO _RIP_INFO; +alias RIP_INFO TRIPINFO; +alias RIP_INFO* PRIPINFO; + +struct DEBUG_EVENT +{ + DWORD dwDebugEventCode; + DWORD dwProcessId; + DWORD dwThreadId; + + union + { + struct + { + EXCEPTION_DEBUG_INFO Exception; + } + struct + { + CREATE_THREAD_DEBUG_INFO CreateThread; + } + struct + { + CREATE_PROCESS_DEBUG_INFO CreateProcessInfo; + } + struct + { + EXIT_THREAD_DEBUG_INFO ExitThread; + } + struct + { + EXIT_PROCESS_DEBUG_INFO ExitProcess; + } + struct + { + LOAD_DLL_DEBUG_INFO LoadDll; + } + struct + { + UNLOAD_DLL_DEBUG_INFO UnloadDll; + } + struct + { + OUTPUT_DEBUG_STRING_INFO DebugString; + } + struct + { + RIP_INFO RipInfo; + } + } +} + +alias DEBUG_EVENT* LPDEBUG_EVENT; +alias DEBUG_EVENT _DEBUG_EVENT; +alias DEBUG_EVENT TDEBUGEVENT; +alias DEBUG_EVENT* PDEBUGEVENT; + +struct DEBUGHOOKINFO +{ + DWORD idThread; + DWORD idThreadInstaller; + LPARAM lParam; + WPARAM wParam; + int code; +} + +alias DEBUGHOOKINFO TAGDEBUGHOOKINFO; +alias DEBUGHOOKINFO TDEBUGHOOKINFO; +alias DEBUGHOOKINFO* PDEBUGHOOKINFO; + +struct DELETEITEMSTRUCT +{ + UINT CtlType; + UINT CtlID; + UINT itemID; + HWND hwndItem; + UINT itemData; +} + +alias DELETEITEMSTRUCT TAGDELETEITEMSTRUCT; +alias DELETEITEMSTRUCT TDELETEITEMSTRUCT; +alias DELETEITEMSTRUCT* PDELETEITEMSTRUCT; + +struct DEV_BROADCAST_HDR +{ + ULONG dbch_size; + ULONG dbch_devicetype; + ULONG dbch_reserved; +} + +alias DEV_BROADCAST_HDR* PDEV_BROADCAST_HDR; +alias DEV_BROADCAST_HDR _DEV_BROADCAST_HDR; +alias DEV_BROADCAST_HDR TDEVBROADCASTHDR; +alias DEV_BROADCAST_HDR* PDEVBROADCASTHDR; + +struct DEV_BROADCAST_OEM +{ + ULONG dbco_size; + ULONG dbco_devicetype; + ULONG dbco_reserved; + ULONG dbco_identifier; + ULONG dbco_suppfunc; +} + +alias DEV_BROADCAST_OEM* PDEV_BROADCAST_OEM; +alias DEV_BROADCAST_OEM _DEV_BROADCAST_OEM; +alias DEV_BROADCAST_OEM TDEVBROADCASTOEM; +alias DEV_BROADCAST_OEM* PDEVBROADCASTOEM; + +struct DEV_BROADCAST_PORT +{ + ULONG dbcp_size; + ULONG dbcp_devicetype; + ULONG dbcp_reserved; + char[1 + 0] dbcp_name; +} + +alias DEV_BROADCAST_PORT* PDEV_BROADCAST_PORT; +alias DEV_BROADCAST_PORT _DEV_BROADCAST_PORT; +alias DEV_BROADCAST_PORT TDEVBROADCASTPORT; +alias DEV_BROADCAST_PORT* PDEVBROADCASTPORT; + +struct _DEV_BROADCAST_USERDEFINED +{ + _DEV_BROADCAST_HDR dbud_dbh; + char[1 + 0] dbud_szName; + ubyte[1 + 0] dbud_rgbUserDefined; +} + +alias _DEV_BROADCAST_USERDEFINED TDEVBROADCASTUSERDEFINED; +alias _DEV_BROADCAST_USERDEFINED* PDEVBROADCASTUSERDEFINED; + +struct DEV_BROADCAST_VOLUME +{ + ULONG dbcv_size; + ULONG dbcv_devicetype; + ULONG dbcv_reserved; + ULONG dbcv_unitmask; + USHORT dbcv_flags; +} + +alias DEV_BROADCAST_VOLUME* PDEV_BROADCAST_VOLUME; +alias DEV_BROADCAST_VOLUME _DEV_BROADCAST_VOLUME; +alias DEV_BROADCAST_VOLUME TDEVBROADCASTVOLUME; +alias DEV_BROADCAST_VOLUME* PDEVBROADCASTVOLUME; + +struct DEVMODE +{ + BCHAR[1 + CCHDEVICENAME-1] dmDeviceName; + ushort dmSpecVersion; + ushort dmDriverVersion; + ushort dmSize; + ushort dmDriverExtra; + DWORD dmFields; + int dmOrientation; + int dmPaperSize; + int dmPaperLength; + int dmPaperWidth; + int dmScale; + int dmCopies; + int dmDefaultSource; + int dmPrintQuality; + int dmColor; + int dmDuplex; + int dmYResolution; + int dmTTOption; + int dmCollate; + BCHAR[1 + CCHFORMNAME-1] dmFormName; + ushort dmLogPixels; + DWORD dmBitsPerPel; + DWORD dmPelsWidth; + DWORD dmPelsHeight; + DWORD dmDisplayFlags; + DWORD dmDisplayFrequency; + DWORD dmICMMethod; + DWORD dmICMIntent; + DWORD dmMediaType; + DWORD dmDitherType; + DWORD dmICCManufacturer; + DWORD dmICCModel; +} + +alias DEVMODE* LPDEVMODE; +alias DEVMODE _DEVICEMODE; +alias DEVMODE DEVICEMODE; +alias DEVMODE TDEVICEMODE; +alias DEVMODE TDEVICEMODEA; +alias DEVMODE TDEVMODE; +alias DEVMODE* PDEVMODE; + +struct DEVNAMES +{ + ushort wDriverOffset; + ushort wDeviceOffset; + ushort wOutputOffset; + ushort wDefault; +} + +alias DEVNAMES* LPDEVNAMES; +alias DEVNAMES TAGDEVNAMES; +alias DEVNAMES TDEVNAMES; +alias DEVNAMES* PDEVNAMES; + +struct DIBSECTION +{ + BITMAP dsBm; + BITMAPINFOHEADER dsBmih; + DWORD[1 + 2] dsBitfields; + HANDLE dshSection; + DWORD dsOffset; +} + +alias DIBSECTION TAGDIBSECTION; +alias DIBSECTION TDIBSECTION; +alias DIBSECTION* PDIBSECTION; + +union LARGE_INTEGER +{ + struct + { + DWORD LowPart; + LONG HighPart; + }; + struct u + { + DWORD LowPart; + LONG HighPart; + }; + LONGLONG QuadPart; +}; + +alias LARGE_INTEGER* PLARGE_INTEGER; +alias LARGE_INTEGER _LARGE_INTEGER; +alias LARGE_INTEGER TLARGEINTEGER; +alias LARGE_INTEGER* PLARGEINTEGER; + +struct DISK_GEOMETRY +{ + LARGE_INTEGER Cylinders; + MEDIA_TYPE MediaType; + DWORD TracksPerCylinder; + DWORD SectorsPerTrack; + DWORD BytesPerSector; +} + +alias DISK_GEOMETRY _DISK_GEOMETRY; +alias DISK_GEOMETRY TDISKGEOMETRY; +alias DISK_GEOMETRY* PDISKGEOMETRY; + +struct DISK_PERFORMANCE +{ + LARGE_INTEGER BytesRead; + LARGE_INTEGER BytesWritten; + LARGE_INTEGER ReadTime; + LARGE_INTEGER WriteTime; + DWORD ReadCount; + DWORD WriteCount; + DWORD QueueDepth; +} + +alias DISK_PERFORMANCE _DISK_PERFORMANCE; +alias DISK_PERFORMANCE TDISKPERFORMANCE; +alias DISK_PERFORMANCE* PDISKPERFORMANCE; + +align(1) struct DLGITEMTEMPLATE +{ + DWORD style; + DWORD dwExtendedStyle; + int x; + int y; + int cx; + int cy; + ushort id; +} + +alias DLGITEMTEMPLATE* LPDLGITEMTEMPLATE; +alias DLGITEMTEMPLATE TDLGITEMTEMPLATE; +alias DLGITEMTEMPLATE* PDLGITEMTEMPLATE; + +align(1) struct DLGTEMPLATE +{ + DWORD style; + DWORD dwExtendedStyle; + ushort cdit; + int x; + int y; + int cx; + int cy; +} + +alias DLGTEMPLATE* LPDLGTEMPLATE; +alias DLGTEMPLATE* LPCDLGTEMPLATE; +alias DLGTEMPLATE TDLGTEMPLATE; +alias DLGTEMPLATE* PDLGTEMPLATE; + +struct DOC_INFO_1 +{ + LPTSTR pDocName; + LPTSTR pOutputFile; + LPTSTR pDatatype; +} + +alias DOC_INFO_1 _DOC_INFO_1; +alias DOC_INFO_1 TDOCINFO1; +alias DOC_INFO_1* PDOCINFO1; + +struct DOC_INFO_2 +{ + LPTSTR pDocName; + LPTSTR pOutputFile; + LPTSTR pDatatype; + DWORD dwMode; + DWORD JobId; +} + +alias DOC_INFO_2 _DOC_INFO_2; +alias DOC_INFO_2 TDOCINFO2; +alias DOC_INFO_2* PDOCINFO2; + +struct DOCINFO +{ + int cbSize; + LPCTSTR lpszDocName; + LPCTSTR lpszOutput; + LPCTSTR lpszDatatype; + DWORD fwType; +} + +alias DOCINFO TDOCINFO; +alias DOCINFO TDOCINFOA; +alias DOCINFO* PDOCINFO; + +struct DRAGLISTINFO +{ + UINT uNotification; + HWND hWnd; + POINT ptCursor; +} + +alias DRAGLISTINFO* LPDRAGLISTINFO; +alias DRAGLISTINFO TDRAGLISTINFO; +alias DRAGLISTINFO* PDRAGLISTINFO; + +struct DRAWITEMSTRUCT +{ + UINT CtlType; + UINT CtlID; + UINT itemID; + UINT itemAction; + UINT itemState; + HWND hwndItem; + HDC hDC; + RECT rcItem; + DWORD itemData; +} + +alias DRAWITEMSTRUCT* LPDRAWITEMSTRUCT; +alias DRAWITEMSTRUCT TAGDRAWITEMSTRUCT; +alias DRAWITEMSTRUCT TDRAWITEMSTRUCT; +alias DRAWITEMSTRUCT* PDRAWITEMSTRUCT; + +struct DRAWTEXTPARAMS +{ + UINT cbSize; + int iTabLength; + int iLeftMargin; + int iRightMargin; + UINT uiLengthDrawn; +} + +alias DRAWTEXTPARAMS* LPDRAWTEXTPARAMS; +alias DRAWTEXTPARAMS TDRAWTEXTPARAMS; +alias DRAWTEXTPARAMS* PDRAWTEXTPARAMS; + +struct PARTITION_INFORMATION +{ + ubyte PartitionType; + ubyte BootIndicator; + ubyte RecognizedPartition; + ubyte RewritePartition; + LARGE_INTEGER StartingOffset; + LARGE_INTEGER PartitionLength; + LARGE_INTEGER HiddenSectors; +} + +alias PARTITION_INFORMATION _PARTITION_INFORMATION; +alias PARTITION_INFORMATION TPARTITIONINFORMATION; +alias PARTITION_INFORMATION* PPARTITIONINFORMATION; + +struct DRIVE_LAYOUT_INFORMATION +{ + DWORD PartitionCount; + DWORD Signature; + PARTITION_INFORMATION[1 + 0] PartitionEntry; +} + +alias DRIVE_LAYOUT_INFORMATION _DRIVE_LAYOUT_INFORMATION; +alias DRIVE_LAYOUT_INFORMATION TDRIVELAYOUTINFORMATION; +alias DRIVE_LAYOUT_INFORMATION* PDRIVELAYOUTINFORMATION; + +struct DRIVER_INFO_1 +{ + LPTSTR pName; +} + +alias DRIVER_INFO_1 _DRIVER_INFO_1; +alias DRIVER_INFO_1 TDRIVERINFO1; +alias DRIVER_INFO_1* PDRIVERINFO1; + +struct DRIVER_INFO_2 +{ + DWORD cVersion; + LPTSTR pName; + LPTSTR pEnvironment; + LPTSTR pDriverPath; + LPTSTR pDataFile; + LPTSTR pConfigFile; +} + +alias DRIVER_INFO_2 _DRIVER_INFO_2; +alias DRIVER_INFO_2 TDRIVERINFO2; +alias DRIVER_INFO_2* PDRIVERINFO2; + +struct DRIVER_INFO_3 +{ + DWORD cVersion; + LPTSTR pName; + LPTSTR pEnvironment; + LPTSTR pDriverPath; + LPTSTR pDataFile; + LPTSTR pConfigFile; + LPTSTR pHelpFile; + LPTSTR pDependentFiles; + LPTSTR pMonitorName; + LPTSTR pDefaultDataType; +} + +alias DRIVER_INFO_3 _DRIVER_INFO_3; +alias DRIVER_INFO_3 TDRIVERINFO3; +alias DRIVER_INFO_3* PDRIVERINFO3; + +struct EDITSTREAM +{ + DWORD dwCookie; + DWORD dwError; + EDITSTREAMCALLBACK pfnCallback; +} + +alias EDITSTREAM _EDITSTREAM; +alias EDITSTREAM TEDITSTREAM; +alias EDITSTREAM* PEDITSTREAM; + +struct EMR +{ + DWORD iType; + DWORD nSize; +} + +alias EMR TAGEMR; +alias EMR TEMR; +alias EMR* PEMR; + +struct EMRANGLEARC +{ + EMR emr; + POINTL ptlCenter; + DWORD nRadius; + FLOAT eStartAngle; + FLOAT eSweepAngle; +} + +alias EMRANGLEARC TAGEMRANGLEARC; +alias EMRANGLEARC TEMRANGLEARC; +alias EMRANGLEARC* PEMRANGLEARC; + +struct EMRARC +{ + EMR emr; + RECTL rclBox; + POINTL ptlStart; + POINTL ptlEnd; +} + +alias EMRARC TAGEMRARC; +alias EMRARC TEMRARC; +alias EMRARC* PEMRARC; +alias EMRARC EMRARCTO; +alias EMRARC TEMRARCTO; +alias EMRARC* PEMRARCTO; +alias EMRARC EMRCHORD; +alias EMRARC TEMRCHORD; +alias EMRARC* PEMRCHORD; +alias EMRARC EMRPIE; +alias EMRARC TEMRPIE; +alias EMRARC* PEMRPIE; + +struct XFORM +{ + FLOAT eM11; + FLOAT eM12; + FLOAT eM21; + FLOAT eM22; + FLOAT eDx; + FLOAT eDy; +} + +alias XFORM* LPXFORM; +alias XFORM _XFORM; +alias XFORM TXFORM; +alias XFORM* PXFORM; + +struct EMRBITBLT +{ + EMR emr; + RECTL rclBounds; + LONG xDest; + LONG yDest; + LONG cxDest; + LONG cyDest; + DWORD dwRop; + LONG xSrc; + LONG ySrc; + XFORM xformSrc; + COLORREF crBkColorSrc; + DWORD iUsageSrc; + DWORD offBmiSrc; + DWORD offBitsSrc; + DWORD cbBitsSrc; +} + +alias EMRBITBLT TAGEMRBITBLT; +alias EMRBITBLT TEMRBITBLT; +alias EMRBITBLT* PEMRBITBLT; + +struct LOGBRUSH +{ + UINT lbStyle; + COLORREF lbColor; + LONG lbHatch; +} + +alias LOGBRUSH TAGLOGBRUSH; +alias LOGBRUSH TLOGBRUSH; +alias LOGBRUSH* PLOGBRUSH; + +struct EMRCREATEBRUSHINDIRECT +{ + EMR emr; + DWORD ihBrush; + LOGBRUSH lb; +} + +alias EMRCREATEBRUSHINDIRECT TAGEMRCREATEBRUSHINDIRECT; +alias EMRCREATEBRUSHINDIRECT TEMRCREATEBRUSHINDIRECT; +alias EMRCREATEBRUSHINDIRECT* PEMRCREATEBRUSHINDIRECT; +alias LONG LCSCSTYPE; +alias LONG LCSGAMUTMATCH; + +struct LOGCOLORSPACE +{ + DWORD lcsSignature; + DWORD lcsVersion; + DWORD lcsSize; + LCSCSTYPE lcsCSType; + LCSGAMUTMATCH lcsIntent; + CIEXYZTRIPLE lcsEndpoints; + DWORD lcsGammaRed; + DWORD lcsGammaGreen; + DWORD lcsGammaBlue; + TCHAR[1 + MAX_PATH-1] lcsFilename; +} + +alias LOGCOLORSPACE* LPLOGCOLORSPACE; +alias LOGCOLORSPACE TAGLOGCOLORSPACE; +alias LOGCOLORSPACE TLOGCOLORSPACE; +alias LOGCOLORSPACE TLOGCOLORSPACEA; +alias LOGCOLORSPACE* PLOGCOLORSPACE; + +struct EMRCREATECOLORSPACE +{ + EMR emr; + DWORD ihCS; + LOGCOLORSPACE lcs; +} + +alias EMRCREATECOLORSPACE TAGEMRCREATECOLORSPACE; +alias EMRCREATECOLORSPACE TEMRCREATECOLORSPACE; +alias EMRCREATECOLORSPACE* PEMRCREATECOLORSPACE; + +struct EMRCREATEDIBPATTERNBRUSHPT +{ + EMR emr; + DWORD ihBrush; + DWORD iUsage; + DWORD offBmi; + DWORD cbBmi; + DWORD offBits; + DWORD cbBits; +} + +alias EMRCREATEDIBPATTERNBRUSHPT TAGEMRCREATEDIBPATTERNBRUSHPT; +alias EMRCREATEDIBPATTERNBRUSHPT TEMRCREATEDIBPATTERNBRUSHPT; +alias EMRCREATEDIBPATTERNBRUSHPT PEMRCREATEDIBPATTERNBRUSHPT; + +struct EMRCREATEMONOBRUSH +{ + EMR emr; + DWORD ihBrush; + DWORD iUsage; + DWORD offBmi; + DWORD cbBmi; + DWORD offBits; + DWORD cbBits; +} + +alias EMRCREATEMONOBRUSH TAGEMRCREATEMONOBRUSH; +alias EMRCREATEMONOBRUSH TEMRCREATEMONOBRUSH; +alias EMRCREATEMONOBRUSH* PEMRCREATEMONOBRUSH; + +struct PALETTEENTRY +{ + ubyte peRed; + ubyte peGreen; + ubyte peBlue; + ubyte peFlags; +} + +alias PALETTEENTRY* LPPALETTEENTRY; +alias PALETTEENTRY TAGPALETTEENTRY; +alias PALETTEENTRY TPALETTEENTRY; +alias PALETTEENTRY* PPALETTEENTRY; + +struct LOGPALETTE +{ + ushort palVersion; + ushort palNumEntries; + PALETTEENTRY[1 + 0] palPalEntry; +} + +alias LOGPALETTE* LPLOGPALETTE; +alias LOGPALETTE TAGLOGPALETTE; +alias LOGPALETTE TLOGPALETTE; +alias LOGPALETTE* PLOGPALETTE; + +struct EMRCREATEPALETTE +{ + EMR emr; + DWORD ihPal; + LOGPALETTE lgpl; +} + +alias EMRCREATEPALETTE TAGEMRCREATEPALETTE; +alias EMRCREATEPALETTE TEMRCREATEPALETTE; +alias EMRCREATEPALETTE* PEMRCREATEPALETTE; + +struct LOGPEN +{ + UINT lopnStyle; + POINT lopnWidth; + COLORREF lopnColor; +} + +alias LOGPEN TAGLOGPEN; +alias LOGPEN TLOGPEN; +alias LOGPEN* PLOGPEN; + +struct EMRCREATEPEN +{ + EMR emr; + DWORD ihPen; + LOGPEN lopn; +} + +alias EMRCREATEPEN TAGEMRCREATEPEN; +alias EMRCREATEPEN TEMRCREATEPEN; +alias EMRCREATEPEN* PEMRCREATEPEN; + +struct EMRELLIPSE +{ + EMR emr; + RECTL rclBox; +} + +alias EMRELLIPSE TAGEMRELLIPSE; +alias EMRELLIPSE TEMRELLIPSE; +alias EMRELLIPSE* PEMRELLIPSE; +alias EMRELLIPSE EMRRECTANGLE; +alias EMRELLIPSE TEMRRECTANGLE; +alias EMRELLIPSE* PEMRRECTANGLE; + +struct EMREOF +{ + EMR emr; + DWORD nPalEntries; + DWORD offPalEntries; + DWORD nSizeLast; +} + +alias EMREOF TAGEMREOF; +alias EMREOF TEMREOF; +alias EMREOF* PEMREOF; + +struct EMREXCLUDECLIPRECT +{ + EMR emr; + RECTL rclClip; +} + +alias EMREXCLUDECLIPRECT TAGEMREXCLUDECLIPRECT; +alias EMREXCLUDECLIPRECT TEMREXCLUDECLIPRECT; +alias EMREXCLUDECLIPRECT* PEMREXCLUDECLIPRECT; +alias EMREXCLUDECLIPRECT EMRINTERSECTCLIPRECT; +alias EMREXCLUDECLIPRECT TEMRINTERSECTCLIPRECT; +alias EMREXCLUDECLIPRECT* PEMRINTERSECTCLIPRECT; + +struct PANOSE +{ + ubyte bFamilyType; + ubyte bSerifStyle; + ubyte bWeight; + ubyte bProportion; + ubyte bContrast; + ubyte bStrokeVariation; + ubyte bArmStyle; + ubyte bLetterform; + ubyte bMidline; + ubyte bXHeight; +} + +alias PANOSE TAGPANOSE; +alias PANOSE TPANOSE; +alias PANOSE* PPANOSE; + +struct EXTLOGFONT +{ + LOGFONT elfLogFont; + BCHAR[1 + LF_FULLFACESIZE-1] elfFullName; + BCHAR[1 + LF_FACESIZE-1] elfStyle; + DWORD elfVersion; + DWORD elfStyleSize; + DWORD elfMatch; + DWORD elfReserved; + ubyte[1 + ELF_VENDOR_SIZE-1] elfVendorId; + DWORD elfCulture; + PANOSE elfPanose; +} + +alias EXTLOGFONT TAGEXTLOGFONT; +alias EXTLOGFONT TEXTLOGFONT; +alias EXTLOGFONT* PEXTLOGFONT; + +struct EMREXTCREATEFONTINDIRECTW +{ + EMR emr; + DWORD ihFont; + EXTLOGFONT elfw; +} + +alias EMREXTCREATEFONTINDIRECTW TAGEMREXTCREATEFONTINDIRECTW; +alias EMREXTCREATEFONTINDIRECTW TEMREXTCREATEFONTINDIRECTW; +alias EMREXTCREATEFONTINDIRECTW* PEMREXTCREATEFONTINDIRECTW; + +struct EXTLOGPEN +{ + UINT elpPenStyle; + UINT elpWidth; + UINT elpBrushStyle; + COLORREF elpColor; + LONG elpHatch; + DWORD elpNumEntries; + DWORD[1 + 0] elpStyleEntry; +} + +alias EXTLOGPEN TAGEXTLOGPEN; +alias EXTLOGPEN TEXTLOGPEN; +alias EXTLOGPEN* PEXTLOGPEN; + +struct EMREXTCREATEPEN +{ + EMR emr; + DWORD ihPen; + DWORD offBmi; + DWORD cbBmi; + DWORD offBits; + DWORD cbBits; + EXTLOGPEN elp; +} + +alias EMREXTCREATEPEN TAGEMREXTCREATEPEN; +alias EMREXTCREATEPEN TEMREXTCREATEPEN; +alias EMREXTCREATEPEN* PEMREXTCREATEPEN; + +struct EMREXTFLOODFILL +{ + EMR emr; + POINTL ptlStart; + COLORREF crColor; + DWORD iMode; +} + +alias EMREXTFLOODFILL TAGEMREXTFLOODFILL; +alias EMREXTFLOODFILL TEMREXTFLOODFILL; +alias EMREXTFLOODFILL* PEMREXTFLOODFILL; + +struct EMREXTSELECTCLIPRGN +{ + EMR emr; + DWORD cbRgnData; + DWORD iMode; + ubyte[1 + 0] RgnData; +} + +alias EMREXTSELECTCLIPRGN TAGEMREXTSELECTCLIPRGN; +alias EMREXTSELECTCLIPRGN TEMREXTSELECTCLIPRGN; +alias EMREXTSELECTCLIPRGN* PEMREXTSELECTCLIPRGN; + +struct EMRTEXT +{ + POINTL ptlReference; + DWORD nChars; + DWORD offString; + DWORD fOptions; + RECTL rcl; + DWORD offDx; +} + +alias EMRTEXT TAGEMRTEXT; +alias EMRTEXT TEMRTEXT; +alias EMRTEXT* PEMRTEXT; + +struct EMREXTTEXTOUTA +{ + EMR emr; + RECTL rclBounds; + DWORD iGraphicsMode; + FLOAT exScale; + FLOAT eyScale; + EMRTEXT emrtext; +} + +alias EMREXTTEXTOUTA TAGEMREXTTEXTOUTA; +alias EMREXTTEXTOUTA TEMREXTTEXTOUTA; +alias EMREXTTEXTOUTA* PEMREXTTEXTOUTA; +alias EMREXTTEXTOUTA EMREXTTEXTOUTW; +alias EMREXTTEXTOUTA TEMREXTTEXTOUTW; +alias EMREXTTEXTOUTA* PEMREXTTEXTOUTW; + +struct EMRFILLPATH +{ + EMR emr; + RECTL rclBounds; +} + +alias EMRFILLPATH TAGEMRFILLPATH; +alias EMRFILLPATH TEMRFILLPATH; +alias EMRFILLPATH* PEMRFILLPATH; +alias EMRFILLPATH EMRSTROKEANDFILLPATH; +alias EMRFILLPATH TEMRSTROKEANDFILLPATH; +alias EMRFILLPATH* PEMRSTROKEANDFILLPATH; +alias EMRFILLPATH EMRSTROKEPATH; +alias EMRFILLPATH TEMRSTROKEPATH; +alias EMRFILLPATH* PEMRSTROKEPATH; + +struct EMRFILLRGN +{ + EMR emr; + RECTL rclBounds; + DWORD cbRgnData; + DWORD ihBrush; + ubyte[1 + 0] RgnData; +} + +alias EMRFILLRGN TAGEMRFILLRGN; +alias EMRFILLRGN TEMRFILLRGN; +alias EMRFILLRGN* PEMRFILLRGN; + +struct EMRFORMAT +{ + DWORD dSignature; + DWORD nVersion; + DWORD cbData; + DWORD offData; +} + +alias EMRFORMAT TAGEMRFORMAT; +alias EMRFORMAT TEMRFORMAT; +alias EMRFORMAT* PEMRFORMAT; + +struct SIZE +{ + LONG cx; + LONG cy; +} + +alias SIZE* LPSIZE; +alias SIZE TAGSIZE; +alias SIZE TSIZE; +alias SIZE* PSIZE; +alias SIZE SIZEL; +alias SIZE TSIZEL; +alias SIZE* PSIZEL; +alias SIZE* LPSIZEL; + +struct EMRFRAMERGN +{ + EMR emr; + RECTL rclBounds; + DWORD cbRgnData; + DWORD ihBrush; + SIZEL szlStroke; + ubyte[1 + 0] RgnData; +} + +alias EMRFRAMERGN TAGEMRFRAMERGN; +alias EMRFRAMERGN TEMRFRAMERGN; +alias EMRFRAMERGN* PEMRFRAMERGN; + +struct EMRGDICOMMENT +{ + EMR emr; + DWORD cbData; + ubyte[1 + 0] Data; +} + +alias EMRGDICOMMENT TAGEMRGDICOMMENT; +alias EMRGDICOMMENT TEMRGDICOMMENT; +alias EMRGDICOMMENT* PEMRGDICOMMENT; + +struct EMRINVERTRGN +{ + EMR emr; + RECTL rclBounds; + DWORD cbRgnData; + ubyte[1 + 0] RgnData; +} + +alias EMRINVERTRGN TAGEMRINVERTRGN; +alias EMRINVERTRGN TEMRINVERTRGN; +alias EMRINVERTRGN* PEMRINVERTRGN; +alias EMRINVERTRGN EMRPAINTRGN; +alias EMRINVERTRGN TEMRPAINTRGN; +alias EMRINVERTRGN* PEMRPAINTRGN; + +struct EMRLINETO +{ + EMR emr; + POINTL ptl; +} + +alias EMRLINETO TAGEMRLINETO; +alias EMRLINETO TEMRLINETO; +alias EMRLINETO* PEMRLINETO; +alias EMRLINETO EMRMOVETOEX; +alias EMRLINETO TEMRMOVETOEX; +alias EMRLINETO* PEMRMOVETOEX; + +struct EMRMASKBLT +{ + EMR emr; + RECTL rclBounds; + LONG xDest; + LONG yDest; + LONG cxDest; + LONG cyDest; + DWORD dwRop; + LONG xSrc; + LONG ySrc; + XFORM xformSrc; + COLORREF crBkColorSrc; + DWORD iUsageSrc; + DWORD offBmiSrc; + DWORD cbBmiSrc; + DWORD offBitsSrc; + DWORD cbBitsSrc; + LONG xMask; + LONG yMask; + DWORD iUsageMask; + DWORD offBmiMask; + DWORD cbBmiMask; + DWORD offBitsMask; + DWORD cbBitsMask; +} + +alias EMRMASKBLT TAGEMRMASKBLT; +alias EMRMASKBLT TEMRMASKBLT; +alias EMRMASKBLT* PEMRMASKBLT; + +struct EMRMODIFYWORLDTRANSFORM +{ + EMR emr; + XFORM xform; + DWORD iMode; +} + +alias EMRMODIFYWORLDTRANSFORM TAGEMRMODIFYWORLDTRANSFORM; +alias EMRMODIFYWORLDTRANSFORM TEMRMODIFYWORLDTRANSFORM; +alias EMRMODIFYWORLDTRANSFORM PEMRMODIFYWORLDTRANSFORM; + +struct EMROFFSETCLIPRGN +{ + EMR emr; + POINTL ptlOffset; +} + +alias EMROFFSETCLIPRGN TAGEMROFFSETCLIPRGN; +alias EMROFFSETCLIPRGN TEMROFFSETCLIPRGN; +alias EMROFFSETCLIPRGN* PEMROFFSETCLIPRGN; + +struct EMRPLGBLT +{ + EMR emr; + RECTL rclBounds; + POINTL[1 + 2] aptlDest; + LONG xSrc; + LONG ySrc; + LONG cxSrc; + LONG cySrc; + XFORM xformSrc; + COLORREF crBkColorSrc; + DWORD iUsageSrc; + DWORD offBmiSrc; + DWORD cbBmiSrc; + DWORD offBitsSrc; + DWORD cbBitsSrc; + LONG xMask; + LONG yMask; + DWORD iUsageMask; + DWORD offBmiMask; + DWORD cbBmiMask; + DWORD offBitsMask; + DWORD cbBitsMask; +} + +alias EMRPLGBLT TAGEMRPLGBLT; +alias EMRPLGBLT TEMRPLGBLT; +alias EMRPLGBLT* PEMRPLGBLT; + +struct EMRPOLYDRAW +{ + EMR emr; + RECTL rclBounds; + DWORD cptl; + POINTL[1 + 0] aptl; + ubyte[1 + 0] abTypes; +} + +alias EMRPOLYDRAW TAGEMRPOLYDRAW; +alias EMRPOLYDRAW TEMRPOLYDRAW; +alias EMRPOLYDRAW* PEMRPOLYDRAW; + +struct EMRPOLYDRAW16 +{ + EMR emr; + RECTL rclBounds; + DWORD cpts; + POINTS[1 + 0] apts; + ubyte[1 + 0] abTypes; +} + +alias EMRPOLYDRAW16 TAGEMRPOLYDRAW16; +alias EMRPOLYDRAW16 TEMRPOLYDRAW16; +alias EMRPOLYDRAW16* PEMRPOLYDRAW16; + +struct EMRPOLYLINE +{ + EMR emr; + RECTL rclBounds; + DWORD cptl; + POINTL[1 + 0] aptl; +} + +alias EMRPOLYLINE TAGEMRPOLYLINE; +alias EMRPOLYLINE TEMRPOLYLINE; +alias EMRPOLYLINE* PEMRPOLYLINE; +alias EMRPOLYLINE EMRPOLYBEZIER; +alias EMRPOLYLINE TEMRPOLYBEZIER; +alias EMRPOLYLINE* PEMRPOLYBEZIER; +alias EMRPOLYLINE EMRPOLYGON; +alias EMRPOLYLINE TEMRPOLYGON; +alias EMRPOLYLINE* PEMRPOLYGON; +alias EMRPOLYLINE EMRPOLYBEZIERTO; +alias EMRPOLYLINE TEMRPOLYBEZIERTO; +alias EMRPOLYLINE* PEMRPOLYBEZIERTO; +alias EMRPOLYLINE EMRPOLYLINETO; +alias EMRPOLYLINE TEMRPOLYLINETO; +alias EMRPOLYLINE* PEMRPOLYLINETO; + +struct EMRPOLYLINE16 +{ + EMR emr; + RECTL rclBounds; + DWORD cpts; + POINTL[1 + 0] apts; +} + +alias EMRPOLYLINE16 TAGEMRPOLYLINE16; +alias EMRPOLYLINE16 TEMRPOLYLINE16; +alias EMRPOLYLINE16* PEMRPOLYLINE16; +alias EMRPOLYLINE16 EMRPOLYBEZIER16; +alias EMRPOLYLINE16 TEMRPOLYBEZIER16; +alias EMRPOLYLINE16* PEMRPOLYBEZIER16; +alias EMRPOLYLINE16 EMRPOLYGON16; +alias EMRPOLYLINE16 TEMRPOLYGON16; +alias EMRPOLYLINE16* PEMRPOLYGON16; +alias EMRPOLYLINE16 EMRPOLYBEZIERTO16; +alias EMRPOLYLINE16 TEMRPOLYBEZIERTO16; +alias EMRPOLYLINE16* PEMRPOLYBEZIERTO16; +alias EMRPOLYLINE16 EMRPOLYLINETO16; +alias EMRPOLYLINE16 TEMRPOLYLINETO16; +alias EMRPOLYLINE16* PEMRPOLYLINETO16; + +struct EMRPOLYPOLYLINE +{ + EMR emr; + RECTL rclBounds; + DWORD nPolys; + DWORD cptl; + DWORD[1 + 0] aPolyCounts; + POINTL[1 + 0] aptl; +} + +alias EMRPOLYPOLYLINE TAGEMRPOLYPOLYLINE; +alias EMRPOLYPOLYLINE TEMRPOLYPOLYLINE; +alias EMRPOLYPOLYLINE* PEMRPOLYPOLYLINE; +alias EMRPOLYPOLYLINE EMRPOLYPOLYGON; +alias EMRPOLYPOLYLINE TEMRPOLYPOLYGON; +alias EMRPOLYPOLYLINE* PEMRPOLYPOLYGON; + +struct EMRPOLYPOLYLINE16 +{ + EMR emr; + RECTL rclBounds; + DWORD nPolys; + DWORD cpts; + DWORD[1 + 0] aPolyCounts; + POINTS[1 + 0] apts; +} + +alias EMRPOLYPOLYLINE16 TAGEMRPOLYPOLYLINE16; +alias EMRPOLYPOLYLINE16 TEMRPOLYPOLYLINE16; +alias EMRPOLYPOLYLINE16* PEMRPOLYPOLYLINE16; +alias EMRPOLYPOLYLINE16 EMRPOLYPOLYGON16; +alias EMRPOLYPOLYLINE16 TEMRPOLYPOLYGON16; +alias EMRPOLYPOLYLINE16* PEMRPOLYPOLYGON16; + +struct EMRPOLYTEXTOUTA +{ + EMR emr; + RECTL rclBounds; + DWORD iGraphicsMode; + FLOAT exScale; + FLOAT eyScale; + LONG cStrings; + EMRTEXT[1 + 0] aemrtext; +} + +alias EMRPOLYTEXTOUTA TAGEMRPOLYTEXTOUTA; +alias EMRPOLYTEXTOUTA TEMRPOLYTEXTOUTA; +alias EMRPOLYTEXTOUTA* PEMRPOLYTEXTOUTA; +alias EMRPOLYTEXTOUTA EMRPOLYTEXTOUTW; +alias EMRPOLYTEXTOUTA TEMRPOLYTEXTOUTW; +alias EMRPOLYTEXTOUTA* PEMRPOLYTEXTOUTW; + +struct EMRRESIZEPALETTE +{ + EMR emr; + DWORD ihPal; + DWORD cEntries; +} + +alias EMRRESIZEPALETTE TAGEMRRESIZEPALETTE; +alias EMRRESIZEPALETTE TEMRRESIZEPALETTE; +alias EMRRESIZEPALETTE* PEMRRESIZEPALETTE; + +struct EMRRESTOREDC +{ + EMR emr; + LONG iRelative; +} + +alias EMRRESTOREDC TAGEMRRESTOREDC; +alias EMRRESTOREDC TEMRRESTOREDC; +alias EMRRESTOREDC* PEMRRESTOREDC; + +struct EMRROUNDRECT +{ + EMR emr; + RECTL rclBox; + SIZEL szlCorner; +} + +alias EMRROUNDRECT TAGEMRROUNDRECT; +alias EMRROUNDRECT TEMRROUNDRECT; +alias EMRROUNDRECT* PEMRROUNDRECT; + +struct EMRSCALEVIEWPORTEXTEX +{ + EMR emr; + LONG xNum; + LONG xDenom; + LONG yNum; + LONG yDenom; +} + +alias EMRSCALEVIEWPORTEXTEX TAGEMRSCALEVIEWPORTEXTEX; +alias EMRSCALEVIEWPORTEXTEX TEMRSCALEVIEWPORTEXTEX; +alias EMRSCALEVIEWPORTEXTEX* PEMRSCALEVIEWPORTEXTEX; +alias EMRSCALEVIEWPORTEXTEX EMRSCALEWINDOWEXTEX; +alias EMRSCALEVIEWPORTEXTEX TEMRSCALEWINDOWEXTEX; +alias EMRSCALEVIEWPORTEXTEX* PEMRSCALEWINDOWEXTEX; + +struct EMRSELECTCOLORSPACE +{ + EMR emr; + DWORD ihCS; +} + +alias EMRSELECTCOLORSPACE TAGEMRSELECTCOLORSPACE; +alias EMRSELECTCOLORSPACE TEMRSELECTCOLORSPACE; +alias EMRSELECTCOLORSPACE* PEMRSELECTCOLORSPACE; +alias EMRSELECTCOLORSPACE EMRDELETECOLORSPACE; +alias EMRSELECTCOLORSPACE TEMRDELETECOLORSPACE; +alias EMRSELECTCOLORSPACE* PEMRDELETECOLORSPACE; + +struct EMRSELECTOBJECT +{ + EMR emr; + DWORD ihObject; +} + +alias EMRSELECTOBJECT TAGEMRSELECTOBJECT; +alias EMRSELECTOBJECT TEMRSELECTOBJECT; +alias EMRSELECTOBJECT* PEMRSELECTOBJECT; +alias EMRSELECTOBJECT EMRDELETEOBJECT; +alias EMRSELECTOBJECT TEMRDELETEOBJECT; +alias EMRSELECTOBJECT* PEMRDELETEOBJECT; + +struct EMRSELECTPALETTE +{ + EMR emr; + DWORD ihPal; +} + +alias EMRSELECTPALETTE TAGEMRSELECTPALETTE; +alias EMRSELECTPALETTE TEMRSELECTPALETTE; +alias EMRSELECTPALETTE* PEMRSELECTPALETTE; + +struct EMRSETARCDIRECTION +{ + EMR emr; + DWORD iArcDirection; +} + +alias EMRSETARCDIRECTION TAGEMRSETARCDIRECTION; +alias EMRSETARCDIRECTION TEMRSETARCDIRECTION; +alias EMRSETARCDIRECTION* PEMRSETARCDIRECTION; + +struct EMRSETBKCOLOR +{ + EMR emr; + COLORREF crColor; +} + +alias EMRSETBKCOLOR TAGEMRSETTEXTCOLOR; +alias EMRSETBKCOLOR TEMRSETBKCOLOR; +alias EMRSETBKCOLOR* PEMRSETBKCOLOR; +alias EMRSETBKCOLOR EMRSETTEXTCOLOR; +alias EMRSETBKCOLOR TEMRSETTEXTCOLOR; +alias EMRSETBKCOLOR* PEMRSETTEXTCOLOR; + +struct EMRSETCOLORADJUSTMENT +{ + EMR emr; + COLORADJUSTMENT ColorAdjustment; +} + +alias EMRSETCOLORADJUSTMENT TAGEMRSETCOLORADJUSTMENT; +alias EMRSETCOLORADJUSTMENT TEMRSETCOLORADJUSTMENT; +alias EMRSETCOLORADJUSTMENT* PEMRSETCOLORADJUSTMENT; + +struct EMRSETDIBITSTODEVICE +{ + EMR emr; + RECTL rclBounds; + LONG xDest; + LONG yDest; + LONG xSrc; + LONG ySrc; + LONG cxSrc; + LONG cySrc; + DWORD offBmiSrc; + DWORD cbBmiSrc; + DWORD offBitsSrc; + DWORD cbBitsSrc; + DWORD iUsageSrc; + DWORD iStartScan; + DWORD cScans; +} + +alias EMRSETDIBITSTODEVICE TAGEMRSETDIBITSTODEVICE; +alias EMRSETDIBITSTODEVICE TEMRSETDIBITSTODEVICE; +alias EMRSETDIBITSTODEVICE* PEMRSETDIBITSTODEVICE; + +struct EMRSETMAPPERFLAGS +{ + EMR emr; + DWORD dwFlags; +} + +alias EMRSETMAPPERFLAGS TAGEMRSETMAPPERFLAGS; +alias EMRSETMAPPERFLAGS TEMRSETMAPPERFLAGS; +alias EMRSETMAPPERFLAGS* PEMRSETMAPPERFLAGS; + +struct EMRSETMITERLIMIT +{ + EMR emr; + FLOAT eMiterLimit; +} + +alias EMRSETMITERLIMIT TAGEMRSETMITERLIMIT; +alias EMRSETMITERLIMIT TEMRSETMITERLIMIT; +alias EMRSETMITERLIMIT* PEMRSETMITERLIMIT; + +struct EMRSETPALETTEENTRIES +{ + EMR emr; + DWORD ihPal; + DWORD iStart; + DWORD cEntries; + PALETTEENTRY[1 + 0] aPalEntries; +} + +alias EMRSETPALETTEENTRIES TAGEMRSETPALETTEENTRIES; +alias EMRSETPALETTEENTRIES TEMRSETPALETTEENTRIES; +alias EMRSETPALETTEENTRIES* PEMRSETPALETTEENTRIES; + +struct EMRSETPIXELV +{ + EMR emr; + POINTL ptlPixel; + COLORREF crColor; +} + +alias EMRSETPIXELV TAGEMRSETPIXELV; +alias EMRSETPIXELV TEMRSETPIXELV; +alias EMRSETPIXELV* PEMRSETPIXELV; + +struct EMRSETVIEWPORTEXTEX +{ + EMR emr; + SIZEL szlExtent; +} + +alias EMRSETVIEWPORTEXTEX TAGEMRSETVIEWPORTEXTEX; +alias EMRSETVIEWPORTEXTEX TEMRSETVIEWPORTEXTEX; +alias EMRSETVIEWPORTEXTEX* PEMRSETVIEWPORTEXTEX; +alias EMRSETVIEWPORTEXTEX EMRSETWINDOWEXTEX; +alias EMRSETVIEWPORTEXTEX TEMRSETWINDOWEXTEX; +alias EMRSETVIEWPORTEXTEX* PEMRSETWINDOWEXTEX; + +struct EMRSETVIEWPORTORGEX +{ + EMR emr; + POINTL ptlOrigin; +} + +alias EMRSETVIEWPORTORGEX TAGEMRSETVIEWPORTORGEX; +alias EMRSETVIEWPORTORGEX TEMRSETVIEWPORTORGEX; +alias EMRSETVIEWPORTORGEX* PEMRSETVIEWPORTORGEX; +alias EMRSETVIEWPORTORGEX EMRSETWINDOWORGEX; +alias EMRSETVIEWPORTORGEX TEMRSETWINDOWORGEX; +alias EMRSETVIEWPORTORGEX* PEMRSETWINDOWORGEX; +alias EMRSETVIEWPORTORGEX EMRSETBRUSHORGEX; +alias EMRSETVIEWPORTORGEX TEMRSETBRUSHORGEX; +alias EMRSETVIEWPORTORGEX* PEMRSETBRUSHORGEX; + +struct EMRSETWORLDTRANSFORM +{ + EMR emr; + XFORM xform; +} + +alias EMRSETWORLDTRANSFORM TAGEMRSETWORLDTRANSFORM; +alias EMRSETWORLDTRANSFORM TEMRSETWORLDTRANSFORM; +alias EMRSETWORLDTRANSFORM* PEMRSETWORLDTRANSFORM; + +struct EMRSTRETCHBLT +{ + EMR emr; + RECTL rclBounds; + LONG xDest; + LONG yDest; + LONG cxDest; + LONG cyDest; + DWORD dwRop; + LONG xSrc; + LONG ySrc; + XFORM xformSrc; + COLORREF crBkColorSrc; + DWORD iUsageSrc; + DWORD offBmiSrc; + DWORD cbBmiSrc; + DWORD offBitsSrc; + DWORD cbBitsSrc; + LONG cxSrc; + LONG cySrc; +} + +alias EMRSTRETCHBLT TAGEMRSTRETCHBLT; +alias EMRSTRETCHBLT TEMRSTRETCHBLT; +alias EMRSTRETCHBLT* PEMRSTRETCHBLT; + +struct EMRSTRETCHDIBITS +{ + EMR emr; + RECTL rclBounds; + LONG xDest; + LONG yDest; + LONG xSrc; + LONG ySrc; + LONG cxSrc; + LONG cySrc; + DWORD offBmiSrc; + DWORD cbBmiSrc; + DWORD offBitsSrc; + DWORD cbBitsSrc; + DWORD iUsageSrc; + DWORD dwRop; + LONG cxDest; + LONG cyDest; +} + +alias EMRSTRETCHDIBITS TAGEMRSTRETCHDIBITS; +alias EMRSTRETCHDIBITS TEMRSTRETCHDIBITS; +alias EMRSTRETCHDIBITS* PEMRSTRETCHDIBITS; + +struct EMRABORTPATH +{ + EMR emr; +} + +alias EMRABORTPATH TEMRABORTPATH; +alias EMRABORTPATH* PEMRABORTPATH; +alias EMRABORTPATH TAGABORTPATH; +alias EMRABORTPATH TABORTPATH; +alias EMRABORTPATH EMRBEGINPATH; +alias EMRABORTPATH TEMRBEGINPATH; +alias EMRABORTPATH* PEMRBEGINPATH; +alias EMRABORTPATH EMRENDPATH; +alias EMRABORTPATH TEMRENDPATH; +alias EMRABORTPATH* PEMRENDPATH; +alias EMRABORTPATH EMRCLOSEFIGURE; +alias EMRABORTPATH TEMRCLOSEFIGURE; +alias EMRABORTPATH* PEMRCLOSEFIGURE; +alias EMRABORTPATH EMRFLATTENPATH; +alias EMRABORTPATH TEMRFLATTENPATH; +alias EMRABORTPATH* PEMRFLATTENPATH; +alias EMRABORTPATH EMRWIDENPATH; +alias EMRABORTPATH TEMRWIDENPATH; +alias EMRABORTPATH* PEMRWIDENPATH; +alias EMRABORTPATH EMRSETMETARGN; +alias EMRABORTPATH TEMRSETMETARGN; +alias EMRABORTPATH* PEMRSETMETARGN; +alias EMRABORTPATH EMRSAVEDC; +alias EMRABORTPATH TEMRSAVEDC; +alias EMRABORTPATH* PEMRSAVEDC; +alias EMRABORTPATH EMRREALIZEPALETTE; +alias EMRABORTPATH TEMRREALIZEPALETTE; +alias EMRABORTPATH* PEMRREALIZEPALETTE; + +struct EMRSELECTCLIPPATH +{ + EMR emr; + DWORD iMode; +} + +alias EMRSELECTCLIPPATH TAGEMRSELECTCLIPPATH; +alias EMRSELECTCLIPPATH TEMRSELECTCLIPPATH; +alias EMRSELECTCLIPPATH* PEMRSELECTCLIPPATH; +alias EMRSELECTCLIPPATH EMRSETBKMODE; +alias EMRSELECTCLIPPATH TEMRSETBKMODE; +alias EMRSELECTCLIPPATH* PEMRSETBKMODE; +alias EMRSELECTCLIPPATH EMRSETMAPMODE; +alias EMRSELECTCLIPPATH TEMRSETMAPMODE; +alias EMRSELECTCLIPPATH* PEMRSETMAPMODE; +alias EMRSELECTCLIPPATH EMRSETPOLYFILLMODE; +alias EMRSELECTCLIPPATH TEMRSETPOLYFILLMODE; +alias EMRSELECTCLIPPATH* PEMRSETPOLYFILLMODE; +alias EMRSELECTCLIPPATH EMRSETROP2; +alias EMRSELECTCLIPPATH TEMRSETROP2; +alias EMRSELECTCLIPPATH* PEMRSETROP2; +alias EMRSELECTCLIPPATH EMRSETSTRETCHBLTMODE; +alias EMRSELECTCLIPPATH TEMRSETSTRETCHBLTMODE; +alias EMRSELECTCLIPPATH* PEMRSETSTRETCHBLTMODE; +alias EMRSELECTCLIPPATH EMRSETTEXTALIGN; +alias EMRSELECTCLIPPATH TEMRSETTEXTALIGN; +alias EMRSELECTCLIPPATH* PEMRSETTEXTALIGN; +alias EMRSELECTCLIPPATH EMRENABLEICM; +alias EMRSELECTCLIPPATH TEMRENABLEICM; +alias EMRSELECTCLIPPATH* PEMRENABLEICM; + +struct NMHDR +{ + HWND hwndFrom; + UINT idFrom; + UINT code; +} + +alias NMHDR TAGNMHDR; +alias NMHDR TNMHDR; +alias NMHDR* PNMHDR; + +struct ENCORRECTTEXT +{ + NMHDR nmhdr; + CHARRANGE chrg; + ushort seltyp; +} + +alias ENCORRECTTEXT _ENCORRECTTEXT; +alias ENCORRECTTEXT TENCORRECTTEXT; +alias ENCORRECTTEXT* PENCORRECTTEXT; + +struct ENDROPFILES +{ + NMHDR nmhdr; + HANDLE hDrop; + LONG cp; + WINBOOL fProtected; +} + +alias ENDROPFILES _ENDROPFILES; +alias ENDROPFILES TENDROPFILES; +alias ENDROPFILES* PENDROPFILES; + +struct ENSAVECLIPBOARD +{ + NMHDR nmhdr; + LONG cObjectCount; + LONG cch; +} + +alias ENSAVECLIPBOARD TENSAVECLIPBOARD; +alias ENSAVECLIPBOARD* PENSAVECLIPBOARD; + +struct ENOLEOPFAILED +{ + NMHDR nmhdr; + LONG iob; + LONG lOper; + HRESULT hr; +} + +alias ENOLEOPFAILED TENOLEOPFAILED; +alias ENOLEOPFAILED* PENOLEOPFAILED; + +struct ENHMETAHEADER +{ + DWORD iType; + DWORD nSize; + RECTL rclBounds; + RECTL rclFrame; + DWORD dSignature; + DWORD nVersion; + DWORD nBytes; + DWORD nRecords; + ushort nHandles; + ushort sReserved; + DWORD nDescription; + DWORD offDescription; + DWORD nPalEntries; + SIZEL szlDevice; + SIZEL szlMillimeters; +} + +alias ENHMETAHEADER* LPENHMETAHEADER; +alias ENHMETAHEADER TAGENHMETAHEADER; +alias ENHMETAHEADER TENHMETAHEADER; +alias ENHMETAHEADER* PENHMETAHEADER; + +struct ENHMETARECORD +{ + DWORD iType; + DWORD nSize; + DWORD[1 + 0] dParm; +} + +alias ENHMETARECORD* LPENHMETARECORD; +alias ENHMETARECORD TAGENHMETARECORD; +alias ENHMETARECORD TENHMETARECORD; +alias ENHMETARECORD* PENHMETARECORD; + +struct ENPROTECTED +{ + NMHDR nmhdr; + UINT msg; + WPARAM wParam; + LPARAM lParam; + CHARRANGE chrg; +} + +alias ENPROTECTED _ENPROTECTED; +alias ENPROTECTED TENPROTECTED; +alias ENPROTECTED* PENPROTECTED; + +struct SERVICE_STATUS +{ + DWORD dwServiceType; + DWORD dwCurrentState; + DWORD dwControlsAccepted; + DWORD dwWin32ExitCode; + DWORD dwServiceSpecificExitCode; + DWORD dwCheckPoint; + DWORD dwWaitHint; +} + +alias SERVICE_STATUS* LPSERVICE_STATUS; +alias SERVICE_STATUS _SERVICE_STATUS; +alias SERVICE_STATUS TSERVICESTATUS; +alias SERVICE_STATUS* PSERVICESTATUS; + +struct ENUM_SERVICE_STATUS +{ + LPTSTR lpServiceName; + LPTSTR lpDisplayName; + SERVICE_STATUS ServiceStatus; +} + +alias ENUM_SERVICE_STATUS* LPENUM_SERVICE_STATUS; +alias ENUM_SERVICE_STATUS _ENUM_SERVICE_STATUS; +alias ENUM_SERVICE_STATUS TENUMSERVICESTATUS; +alias ENUM_SERVICE_STATUS* PENUMSERVICESTATUS; + +struct ENUMLOGFONT +{ + LOGFONT elfLogFont; + BCHAR[1 + LF_FULLFACESIZE-1] elfFullName; + BCHAR[1 + LF_FACESIZE-1] elfStyle; +} + +alias ENUMLOGFONT TAGENUMLOGFONT; +alias ENUMLOGFONT TENUMLOGFONT; +alias ENUMLOGFONT* PENUMLOGFONT; + +struct ENUMLOGFONTEX +{ + LOGFONT elfLogFont; + BCHAR[1 + LF_FULLFACESIZE-1] elfFullName; + BCHAR[1 + LF_FACESIZE-1] elfStyle; + BCHAR[1 + LF_FACESIZE-1] elfScript; +} + +alias ENUMLOGFONTEX TAGENUMLOGFONTEX; +alias ENUMLOGFONTEX TENUMLOGFONTEX; +alias ENUMLOGFONTEX* PENUMLOGFONTEX; + +struct EVENTLOGRECORD +{ + DWORD Length; + DWORD Reserved; + DWORD RecordNumber; + DWORD TimeGenerated; + DWORD TimeWritten; + DWORD EventID; + ushort EventType; + ushort NumStrings; + ushort EventCategory; + ushort ReservedFlags; + DWORD ClosingRecordNumber; + DWORD StringOffset; + DWORD UserSidLength; + DWORD UserSidOffset; + DWORD DataLength; + DWORD DataOffset; +} + +alias EVENTLOGRECORD _EVENTLOGRECORD; +alias EVENTLOGRECORD TEVENTLOGRECORD; +alias EVENTLOGRECORD* PEVENTLOGRECORD; + +struct EVENTMSG +{ + UINT message; + UINT paramL; + UINT paramH; + DWORD time; + HWND hwnd; +} + +alias EVENTMSG TAGEVENTMSG; +alias EVENTMSG TEVENTMSG; +alias EVENTMSG* PEVENTMSG; + +struct EXCEPTION_POINTERS +{ + PEXCEPTION_RECORD ExceptionRecord; + PCONTEXT ContextRecord; +} + +alias EXCEPTION_POINTERS* LPEXCEPTION_POINTERS; +alias EXCEPTION_POINTERS* PEXCEPTION_POINTERS; +alias EXCEPTION_POINTERS _EXCEPTION_POINTERS; +alias EXCEPTION_POINTERS TEXCEPTIONPOINTERS; +alias EXCEPTION_POINTERS* PEXCEPTIONPOINTERS; + +struct EXT_BUTTON +{ + ushort idCommand; + ushort idsHelp; + ushort fsStyle; +} + +alias EXT_BUTTON* LPEXT_BUTTON; +alias EXT_BUTTON _EXT_BUTTON; +alias EXT_BUTTON TEXTBUTTON; +alias EXT_BUTTON* PEXTBUTTON; + +struct FILTERKEYS +{ + UINT cbSize; + DWORD dwFlags; + DWORD iWaitMSec; + DWORD iDelayMSec; + DWORD iRepeatMSec; + DWORD iBounceMSec; +} + +alias FILTERKEYS TAGFILTERKEYS; +alias FILTERKEYS TFILTERKEYS; +alias FILTERKEYS* PFILTERKEYS; + +struct FIND_NAME_BUFFER +{ + UCHAR length; + UCHAR access_control; + UCHAR frame_control; + UCHAR[1 + 5] destination_addr; + UCHAR[1 + 5] source_addr; + UCHAR[1 + 17] routing_info; +} + +alias FIND_NAME_BUFFER _FIND_NAME_BUFFER; +alias FIND_NAME_BUFFER TFINDNAMEBUFFER; +alias FIND_NAME_BUFFER* PFINDNAMEBUFFER; + +struct FIND_NAME_HEADER +{ + ushort node_count; + UCHAR reserved; + UCHAR unique_group; +} + +alias FIND_NAME_HEADER _FIND_NAME_HEADER; +alias FIND_NAME_HEADER TFINDNAMEHEADER; +alias FIND_NAME_HEADER* PFINDNAMEHEADER; + +struct FINDREPLACE +{ + DWORD lStructSize; + HWND hwndOwner; + HINST hInstance; + DWORD Flags; + LPTSTR lpstrFindWhat; + LPTSTR lpstrReplaceWith; + ushort wFindWhatLen; + ushort wReplaceWithLen; + LPARAM lCustData; + LPFRHOOKPROC lpfnHook; + LPCTSTR lpTemplateName; +} + +alias FINDREPLACE* LPFINDREPLACE; +alias FINDREPLACE TFINDREPLACE; +alias FINDREPLACE* PFINDREPLACE; + +struct TFINDTEXT +{ + CHARRANGE chrg; + LPSTR lpstrText; +} + +alias TFINDTEXT _FINDTEXT; +alias TFINDTEXT* PFINDTEXT; + +struct FINDTEXTEX +{ + CHARRANGE chrg; + LPSTR lpstrText; + CHARRANGE chrgText; +} + +alias FINDTEXTEX _FINDTEXTEX; +alias FINDTEXTEX TFINDTEXTEX; +alias FINDTEXTEX* PFINDTEXTEX; + +struct FMS_GETDRIVEINFO +{ + DWORD dwTotalSpace; + DWORD dwFreeSpace; + TCHAR[1 + 259] szPath; + TCHAR[1 + 13] szVolume; + TCHAR[1 + 127] szShare; +} + +alias FMS_GETDRIVEINFO _FMS_GETDRIVEINFO; +alias FMS_GETDRIVEINFO TFMSGETDRIVEINFO; +alias FMS_GETDRIVEINFO* PFMSGETDRIVEINFO; + +struct FMS_GETFILESEL +{ + FILETIME ftTime; + DWORD dwSize; + ubyte bAttr; + TCHAR[1 + 259] szName; +} + +alias FMS_GETFILESEL _FMS_GETFILESEL; +alias FMS_GETFILESEL TFMSGETFILESEL; +alias FMS_GETFILESEL* PFMSGETFILESEL; + +struct FMS_LOAD +{ + DWORD dwSize; + TCHAR[1 + MENU_TEXT_LEN-1] szMenuName; + HMENU hMenu; + UINT wMenuDelta; +} + +alias FMS_LOAD _FMS_LOAD; +alias FMS_LOAD TFMSLOAD; +alias FMS_LOAD* PFMSLOAD; + +struct FMS_TOOLBARLOAD +{ + DWORD dwSize; + LPEXT_BUTTON lpButtons; + ushort cButtons; + ushort cBitmaps; + ushort idBitmap; + HBITMAP hBitmap; +} + +alias FMS_TOOLBARLOAD _FMS_TOOLBARLOAD; +alias FMS_TOOLBARLOAD TFMSTOOLBARLOAD; +alias FMS_TOOLBARLOAD* PFMSTOOLBARLOAD; + +struct FOCUS_EVENT_RECORD +{ + WINBOOL bSetFocus; +} + +alias FOCUS_EVENT_RECORD _FOCUS_EVENT_RECORD; +alias FOCUS_EVENT_RECORD TFOCUSEVENTRECORD; +alias FOCUS_EVENT_RECORD* PFOCUSEVENTRECORD; + +struct FORM_INFO_1 +{ + DWORD Flags; + LPTSTR pName; + SIZEL Size; + RECTL ImageableArea; +} + +alias FORM_INFO_1 _FORM_INFO_1; +alias FORM_INFO_1 TFORMINFO1; +alias FORM_INFO_1* PFORMINFO1; + +struct FORMAT_PARAMETERS +{ + MEDIA_TYPE MediaType; + DWORD StartCylinderNumber; + DWORD EndCylinderNumber; + DWORD StartHeadNumber; + DWORD EndHeadNumber; +} + +alias FORMAT_PARAMETERS _FORMAT_PARAMETERS; +alias FORMAT_PARAMETERS TFORMATPARAMETERS; +alias FORMAT_PARAMETERS* PFORMATPARAMETERS; + +struct FORMATRANGE +{ + HDC _hdc; + HDC hdcTarget; + RECT rc; + RECT rcPage; + CHARRANGE chrg; +} + +alias FORMATRANGE _FORMATRANGE; +alias FORMATRANGE TFORMATRANGE; +alias FORMATRANGE* PFORMATRANGE; + +struct GCP_RESULTS +{ + DWORD lStructSize; + LPTSTR lpOutString; + UINT* lpOrder; + INT* lpDx; + INT* lpCaretPos; + LPTSTR lpClass; + UINT* lpGlyphs; + UINT nGlyphs; + UINT nMaxFit; +} + +alias GCP_RESULTS* LPGCP_RESULTS; +alias GCP_RESULTS TAGGCP_RESULTS; +alias GCP_RESULTS TGCPRESULTS; +alias GCP_RESULTS* PGCPRESULTS; + +struct GENERIC_MAPPING +{ + ACCESS_MASK GenericRead; + ACCESS_MASK GenericWrite; + ACCESS_MASK GenericExecute; + ACCESS_MASK GenericAll; +} + +alias GENERIC_MAPPING* PGENERIC_MAPPING; +alias GENERIC_MAPPING _GENERIC_MAPPING; +alias GENERIC_MAPPING TGENERICMAPPING; +alias GENERIC_MAPPING* PGENERICMAPPING; + +struct GLYPHMETRICS +{ + UINT gmBlackBoxX; + UINT gmBlackBoxY; + POINT gmptGlyphOrigin; + int gmCellIncX; + int gmCellIncY; +} + +alias GLYPHMETRICS* LPGLYPHMETRICS; +alias GLYPHMETRICS _GLYPHMETRICS; +alias GLYPHMETRICS TGLYPHMETRICS; +alias GLYPHMETRICS* PGLYPHMETRICS; + +struct HANDLETABLE +{ + HGDIOBJ[1 + 0] objectHandle; +} + +alias HANDLETABLE TAGHANDLETABLE; +alias HANDLETABLE THANDLETABLE; +alias HANDLETABLE* LPHANDLETABLE; + +struct HD_HITTESTINFO +{ + POINT pt; + UINT flags; + int iItem; +} + +alias HD_HITTESTINFO _HD_HITTESTINFO; +alias HD_HITTESTINFO THDHITTESTINFO; +alias HD_HITTESTINFO* PHDHITTESTINFO; + +struct HD_ITEM +{ + UINT mask; + int cxy; + LPTSTR pszText; + HBITMAP hbm; + int cchTextMax; + int fmt; + LPARAM lParam; +} + +alias HD_ITEM _HD_ITEM; +alias HD_ITEM THDITEM; +alias HD_ITEM* PHDITEM; + +struct WINDOWPOS +{ + HWND _hwnd; + HWND hwndInsertAfter; + int x; + int y; + int cx; + int cy; + UINT flags; +} + +alias WINDOWPOS* LPWINDOWPOS; +alias WINDOWPOS _WINDOWPOS; +alias WINDOWPOS TWINDOWPOS; +alias WINDOWPOS* PWINDOWPOS; + +struct HD_LAYOUT +{ + RECT* prc; + WINDOWPOS* pwpos; +} + +alias HD_LAYOUT _HD_LAYOUT; +alias HD_LAYOUT THDLAYOUT; +alias HD_LAYOUT* PHDLAYOUT; + +struct HD_NOTIFY +{ + NMHDR hdr; + int iItem; + int iButton; + HD_ITEM* pitem; +} + +alias HD_NOTIFY _HD_NOTIFY; +alias HD_NOTIFY THDNOTIFY; +alias HD_NOTIFY* PHDNOTIFY; + +struct HELPINFO +{ + UINT cbSize; + int iContextType; + int iCtrlId; + HANDLE hItemHandle; + DWORD dwContextId; + POINT MousePos; +} + +alias HELPINFO* LPHELPINFO; +alias HELPINFO TAGHELPINFO; +alias HELPINFO THELPINFO; +alias HELPINFO* PHELPINFO; + +struct HELPWININFO +{ + int wStructSize; + int x; + int y; + int dx; + int dy; + int wMax; + TCHAR[1 + 1] rgchMember; +} + +alias HELPWININFO THELPWININFO; +alias HELPWININFO* PHELPWININFO; + +struct HIGHCONTRAST +{ + UINT cbSize; + DWORD dwFlags; + LPTSTR lpszDefaultScheme; +} + +alias HIGHCONTRAST* LPHIGHCONTRAST; +alias HIGHCONTRAST TAGHIGHCONTRAST; +alias HIGHCONTRAST THIGHCONTRAST; +alias HIGHCONTRAST* PHIGHCONTRAST; + +struct HSZPAIR +{ + HSZ hszSvc; + HSZ hszTopic; +} + +alias HSZPAIR TAGHSZPAIR; +alias HSZPAIR THSZPAIR; +alias HSZPAIR* PHSZPAIR; + +struct ICONINFO +{ + WINBOOL fIcon; + DWORD xHotspot; + DWORD yHotspot; + HBITMAP hbmMask; + HBITMAP hbmColor; +} + +alias ICONINFO _ICONINFO; +alias ICONINFO TICONINFO; +alias ICONINFO* PICONINFO; + +struct ICONMETRICS +{ + UINT cbSize; + int iHorzSpacing; + int iVertSpacing; + int iTitleWrap; + LOGFONT lfFont; +} + +alias ICONMETRICS* LPICONMETRICS; +alias ICONMETRICS TAGICONMETRICS; +alias ICONMETRICS TICONMETRICS; +alias ICONMETRICS* PICONMETRICS; + +struct IMAGEINFO +{ + HBITMAP hbmImage; + HBITMAP hbmMask; + int Unused1; + int Unused2; + RECT rcImage; +} + +alias IMAGEINFO _IMAGEINFO; +alias IMAGEINFO TIMAGEINFO; +alias IMAGEINFO* PIMAGEINFO; + +align(1) struct KEY_EVENT_RECORD +{ + WINBOOL bKeyDown; + ushort wRepeatCount; + ushort wVirtualKeyCode; + ushort wVirtualScanCode; + + union + { + struct + { + WCHAR UnicodeChar; + DWORD dwControlKeyState; + } + struct + { + char AsciiChar; + } + } +} + +alias KEY_EVENT_RECORD _KEY_EVENT_RECORD; +alias KEY_EVENT_RECORD TKEYEVENTRECORD; +alias KEY_EVENT_RECORD* PKEYEVENTRECORD; + +struct MOUSE_EVENT_RECORD +{ + COORD dwMousePosition; + DWORD dwButtonState; + DWORD dwControlKeyState; + DWORD dwEventFlags; +} + +alias MOUSE_EVENT_RECORD _MOUSE_EVENT_RECORD; +alias MOUSE_EVENT_RECORD TMOUSEEVENTRECORD; +alias MOUSE_EVENT_RECORD* PMOUSEEVENTRECORD; + +struct WINDOW_BUFFER_SIZE_RECORD +{ + COORD dwSize; +} + +alias WINDOW_BUFFER_SIZE_RECORD _WINDOW_BUFFER_SIZE_RECORD; +alias WINDOW_BUFFER_SIZE_RECORD TWINDOWBUFFERSIZERECORD; +alias WINDOW_BUFFER_SIZE_RECORD* PWINDOWBUFFERSIZERECORD; + +struct MENU_EVENT_RECORD +{ + UINT dwCommandId; +} + +alias MENU_EVENT_RECORD* PMENU_EVENT_RECORD; +alias MENU_EVENT_RECORD _MENU_EVENT_RECORD; +alias MENU_EVENT_RECORD TMENUEVENTRECORD; +alias MENU_EVENT_RECORD* PMENUEVENTRECORD; + +struct INPUT_RECORD +{ + ushort EventType; + + union + { + struct + { + KEY_EVENT_RECORD KeyEvent; + } + struct + { + MOUSE_EVENT_RECORD MouseEvent; + } + struct + { + WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent; + } + struct + { + MENU_EVENT_RECORD MenuEvent; + } + struct + { + FOCUS_EVENT_RECORD FocusEvent; + } + } +} + +alias INPUT_RECORD* PINPUT_RECORD; +alias INPUT_RECORD _INPUT_RECORD; +alias INPUT_RECORD TINPUTRECORD; +alias INPUT_RECORD* PINPUTRECORD; + +struct SYSTEMTIME +{ + ushort wYear; + ushort wMonth; + ushort wDayOfWeek; + ushort wDay; + ushort wHour; + ushort wMinute; + ushort wSecond; + ushort wMilliseconds; +} + +alias SYSTEMTIME* LPSYSTEMTIME; +alias SYSTEMTIME _SYSTEMTIME; +alias SYSTEMTIME TSYSTEMTIME; +alias SYSTEMTIME* PSYSTEMTIME; + +struct JOB_INFO_1 +{ + DWORD JobId; + LPTSTR pPrinterName; + LPTSTR pMachineName; + LPTSTR pUserName; + LPTSTR pDocument; + LPTSTR pDatatype; + LPTSTR pStatus; + DWORD Status; + DWORD Priority; + DWORD Position; + DWORD TotalPages; + DWORD PagesPrinted; + SYSTEMTIME Submitted; +} + +alias JOB_INFO_1 _JOB_INFO_1; +alias JOB_INFO_1 TJOBINFO1; +alias JOB_INFO_1* PJOBINFO1; + +struct SID_IDENTIFIER_AUTHORITY +{ + ubyte[1 + 5] Value; +} + +alias SID_IDENTIFIER_AUTHORITY* LPSID_IDENTIFIER_AUTHORITY; +alias SID_IDENTIFIER_AUTHORITY* PSID_IDENTIFIER_AUTHORITY; +alias SID_IDENTIFIER_AUTHORITY _SID_IDENTIFIER_AUTHORITY; +alias SID_IDENTIFIER_AUTHORITY TSIDIDENTIFIERAUTHORITY; +alias SID_IDENTIFIER_AUTHORITY* PSIDIDENTIFIERAUTHORITY; + +struct SID +{ + ubyte Revision; + ubyte SubAuthorityCount; + SID_IDENTIFIER_AUTHORITY IdentifierAuthority; + DWORD[1 + ANYSIZE_ARRAY-1] SubAuthority; +} + +alias SID _SID; +alias SID TSID; +alias SID* PSID; +alias ushort SECURITY_DESCRIPTOR_CONTROL; +alias SECURITY_DESCRIPTOR_CONTROL* PSECURITY_DESCRIPTOR_CONTROL; +alias SECURITY_DESCRIPTOR_CONTROL TSECURITYDESCRIPTORCONTROL; +alias SECURITY_DESCRIPTOR_CONTROL* PSECURITYDESCRIPTORCONTROL; + +struct SECURITY_DESCRIPTOR +{ + ubyte Revision; + ubyte Sbz1; + SECURITY_DESCRIPTOR_CONTROL Control; + PSID Owner; + PSID Group; + PACL Sacl; + PACL Dacl; +} + +alias SECURITY_DESCRIPTOR* PSECURITY_DESCRIPTOR; +alias SECURITY_DESCRIPTOR _SECURITY_DESCRIPTOR; +alias SECURITY_DESCRIPTOR TSECURITYDESCRIPTOR; +alias SECURITY_DESCRIPTOR* PSECURITYDESCRIPTOR; + +struct JOB_INFO_2 +{ + DWORD JobId; + LPTSTR pPrinterName; + LPTSTR pMachineName; + LPTSTR pUserName; + LPTSTR pDocument; + LPTSTR pNotifyName; + LPTSTR pDatatype; + LPTSTR pPrintProcessor; + LPTSTR pParameters; + LPTSTR pDriverName; + LPDEVMODE pDevMode; + LPTSTR pStatus; + PSECURITY_DESCRIPTOR pSecurityDescriptor; + DWORD Status; + DWORD Priority; + DWORD Position; + DWORD StartTime; + DWORD UntilTime; + DWORD TotalPages; + DWORD Size; + SYSTEMTIME Submitted; + DWORD Time; + DWORD PagesPrinted; +} + +alias JOB_INFO_2 _JOB_INFO_2; +alias JOB_INFO_2 TJOBINFO2; +alias JOB_INFO_2* PJOBINFO2; + +struct KERNINGPAIR +{ + ushort wFirst; + ushort wSecond; + int iKernAmount; +} + +alias KERNINGPAIR* LPKERNINGPAIR; +alias KERNINGPAIR TAGKERNINGPAIR; +alias KERNINGPAIR TKERNINGPAIR; +alias KERNINGPAIR* PKERNINGPAIR; + +struct LANA_ENUM +{ + UCHAR length; + UCHAR[1 + MAX_LANA-1] lana; +} + +alias LANA_ENUM _LANA_ENUM; +alias LANA_ENUM TLANAENUM; +alias LANA_ENUM* PLANAENUM; + +struct LDT_ENTRY +{ + ushort LimitLow; + ushort BaseLow; + + union + { + struct + { + ubyte BaseMid; + ubyte Flags1; + ubyte Flags2; + ubyte BaseHi; + } + struct + { + int flag0; + } + } +} + +alias LDT_ENTRY* LPLDT_ENTRY; +alias LDT_ENTRY* PLDT_ENTRY; +alias LDT_ENTRY _LDT_ENTRY; +alias LDT_ENTRY TLDTENTRY; +alias LDT_ENTRY* PLDTENTRY; +enum : DWORD { + bm_LDT_ENTRY_BaseMid = (0xFF), + bp_LDT_ENTRY_BaseMid = (0), + bm_LDT_ENTRY_Type = (0x1F00), + bp_LDT_ENTRY_Type = (8), + bm_LDT_ENTRY_Dpl = (0x6000), + bp_LDT_ENTRY_Dpl = (13), + bm_LDT_ENTRY_Pres = (0x8000), + bp_LDT_ENTRY_Pres = (15), + bm_LDT_ENTRY_LimitHi = (0xF0000), + bp_LDT_ENTRY_LimitHi = (16), + bm_LDT_ENTRY_Sys = (0x100000), + bp_LDT_ENTRY_Sys = (20), + bm_LDT_ENTRY_Reserved_0 = (0x200000), + bp_LDT_ENTRY_Reserved_0 = (21), + bm_LDT_ENTRY_Default_Big = (0x400000), + bp_LDT_ENTRY_Default_Big = (22), + bm_LDT_ENTRY_Granularity = (0x800000), + bp_LDT_ENTRY_Granularity = (23), + bm_LDT_ENTRY_BaseHi = (0xFF000000), + bp_LDT_ENTRY_BaseHi = (24), +} + +struct LOCALESIGNATURE +{ + DWORD[1 + 3] lsUsb; + DWORD[1 + 1] lsCsbDefault; + DWORD[1 + 1] lsCsbSupported; +} + +alias LOCALESIGNATURE TAGLOCALESIGNATURE; +alias LOCALESIGNATURE TLOCALESIGNATURE; +alias LOCALESIGNATURE* PLOCALESIGNATURE; + +struct LOCALGROUP_MEMBERS_INFO_0 +{ + PSID lgrmi0_sid; +} + +alias LOCALGROUP_MEMBERS_INFO_0 _LOCALGROUP_MEMBERS_INFO_0; +alias LOCALGROUP_MEMBERS_INFO_0 TLOCALGROUPMEMBERSINFO0; +alias LOCALGROUP_MEMBERS_INFO_0* PLOCALGROUPMEMBERSINFO0; + +struct LOCALGROUP_MEMBERS_INFO_3 +{ + LPWSTR lgrmi3_domainandname; +} + +alias LOCALGROUP_MEMBERS_INFO_3 _LOCALGROUP_MEMBERS_INFO_3; +alias LOCALGROUP_MEMBERS_INFO_3 TLOCALGROUPMEMBERSINFO3; +alias LOCALGROUP_MEMBERS_INFO_3* PLOCALGROUPMEMBERSINFO3; +alias int FXPT16DOT16; +alias FXPT16DOT16* LPFXPT16DOT16; +alias FXPT16DOT16 TFXPT16DOT16; +alias FXPT16DOT16* PFXPT16DOT16; +alias LARGE_INTEGER LUID; +alias LUID TLUID; +alias LUID* PLUID; + +struct LUID_AND_ATTRIBUTES +{ + LUID Luid; + DWORD Attributes; +} + +alias LUID_AND_ATTRIBUTES _LUID_AND_ATTRIBUTES; +alias LUID_AND_ATTRIBUTES TLUIDANDATTRIBUTES; +alias LUID_AND_ATTRIBUTES* PLUIDANDATTRIBUTES; +alias LUID_AND_ATTRIBUTES[1 + ANYSIZE_ARRAY-1] LUID_AND_ATTRIBUTES_ARRAY; +alias LUID_AND_ATTRIBUTES_ARRAY* PLUID_AND_ATTRIBUTES_ARRAY; +alias LUID_AND_ATTRIBUTES_ARRAY TLUIDANDATTRIBUTESARRAY; +alias LUID_AND_ATTRIBUTES_ARRAY* PLUIDANDATTRIBUTESARRAY; + +struct LV_COLUMN +{ + UINT mask; + int fmt; + int cx; + LPTSTR pszText; + int cchTextMax; + int iSubItem; +} + +alias LV_COLUMN _LV_COLUMN; +alias LV_COLUMN TLVCOLUMN; +alias LV_COLUMN* PLVCOLUMN; + +struct LV_ITEM +{ + UINT mask; + int iItem; + int iSubItem; + UINT state; + UINT stateMask; + LPTSTR pszText; + int cchTextMax; + int iImage; + LPARAM lParam; +} + +alias LV_ITEM _LV_ITEM; +alias LV_ITEM TLVITEM; +alias LV_ITEM* PLVITEM; + +struct LV_DISPINFO +{ + NMHDR hdr; + LV_ITEM item; +} + +alias LV_DISPINFO TAGLV_DISPINFO; +alias LV_DISPINFO TLVDISPINFO; +alias LV_DISPINFO* PLVDISPINFO; + +struct LV_FINDINFO +{ + UINT flags; + LPCTSTR psz; + LPARAM lParam; + POINT pt; + UINT vkDirection; +} + +alias LV_FINDINFO _LV_FINDINFO; +alias LV_FINDINFO TLVFINDINFO; +alias LV_FINDINFO* PLVFINDINFO; + +struct LV_HITTESTINFO +{ + POINT pt; + UINT flags; + int iItem; +} + +alias LV_HITTESTINFO _LV_HITTESTINFO; +alias LV_HITTESTINFO TLVHITTESTINFO; +alias LV_HITTESTINFO* PLVHITTESTINFO; + +struct LV_KEYDOWN +{ + NMHDR hdr; + ushort wVKey; + UINT flags; +} + +alias LV_KEYDOWN TAGLV_KEYDOWN; +alias LV_KEYDOWN TLVKEYDOWN; +alias LV_KEYDOWN* PLVKEYDOWN; + +struct MAT2 +{ + FIXED eM11; + FIXED eM12; + FIXED eM21; + FIXED eM22; +} + +alias MAT2 _MAT2; +alias MAT2 TMAT2; +alias MAT2* PMAT2; + +struct MDICREATESTRUCT +{ + LPCTSTR szClass; + LPCTSTR szTitle; + HANDLE hOwner; + int x; + int y; + int cx; + int cy; + DWORD style; + LPARAM lParam; +} + +alias MDICREATESTRUCT* LPMDICREATESTRUCT; +alias MDICREATESTRUCT TAGMDICREATESTRUCT; +alias MDICREATESTRUCT TMDICREATESTRUCT; +alias MDICREATESTRUCT* PMDICREATESTRUCT; + +struct MEASUREITEMSTRUCT +{ + UINT CtlType; + UINT CtlID; + UINT itemID; + UINT itemWidth; + UINT itemHeight; + DWORD itemData; +} + +alias MEASUREITEMSTRUCT* LPMEASUREITEMSTRUCT; +alias MEASUREITEMSTRUCT TAGMEASUREITEMSTRUCT; +alias MEASUREITEMSTRUCT TMEASUREITEMSTRUCT; +alias MEASUREITEMSTRUCT* PMEASUREITEMSTRUCT; + +struct MEMORY_BASIC_INFORMATION +{ + PVOID BaseAddress; + PVOID AllocationBase; + DWORD AllocationProtect; + DWORD RegionSize; + DWORD State; + DWORD Protect; + DWORD _Type; +} + +alias MEMORY_BASIC_INFORMATION* PMEMORY_BASIC_INFORMATION; +alias MEMORY_BASIC_INFORMATION _MEMORY_BASIC_INFORMATION; +alias MEMORY_BASIC_INFORMATION TMEMORYBASICINFORMATION; +alias MEMORY_BASIC_INFORMATION* PMEMORYBASICINFORMATION; + +struct MEMORYSTATUS +{ + DWORD dwLength; + DWORD dwMemoryLoad; + DWORD dwTotalPhys; + DWORD dwAvailPhys; + DWORD dwTotalPageFile; + DWORD dwAvailPageFile; + DWORD dwTotalVirtual; + DWORD dwAvailVirtual; +} + +alias MEMORYSTATUS* LPMEMORYSTATUS; +alias MEMORYSTATUS _MEMORYSTATUS; +alias MEMORYSTATUS TMEMORYSTATUS; +alias MEMORYSTATUS* PMEMORYSTATUS; + +struct MENUEX_TEMPLATE_HEADER +{ + ushort wVersion; + ushort wOffset; + DWORD dwHelpId; +} + +alias MENUEX_TEMPLATE_HEADER TMENUXTEMPLATEHEADER; +alias MENUEX_TEMPLATE_HEADER* PMENUXTEMPLATEHEADER; + +struct MENUEX_TEMPLATE_ITEM +{ + DWORD dwType; + DWORD dwState; + UINT uId; + ubyte bResInfo; + WCHAR[1 + 0] szText; + DWORD dwHelpId; +} + +alias MENUEX_TEMPLATE_ITEM TMENUEXTEMPLATEITEM; +alias MENUEX_TEMPLATE_ITEM* PMENUEXTEMPLATEITEM; + +struct MENUITEMINFO +{ + UINT cbSize; + UINT fMask; + UINT fType; + UINT fState; + UINT wID; + HMENU hSubMenu; + HBITMAP hbmpChecked; + HBITMAP hbmpUnchecked; + DWORD dwItemData; + LPTSTR dwTypeData; + UINT cch; +} + +alias MENUITEMINFO* LPMENUITEMINFO; +alias MENUITEMINFO* LPCMENUITEMINFO; +alias MENUITEMINFO TAGMENUITEMINFO; +alias MENUITEMINFO TMENUITEMINFO; +alias MENUITEMINFO TMENUITEMINFOA; +alias MENUITEMINFO* PMENUITEMINFO; + +struct MENUITEMTEMPLATE +{ + ushort mtOption; + ushort mtID; + WCHAR[1 + 0] mtString; +} + +alias MENUITEMTEMPLATE TMENUITEMTEMPLATE; +alias MENUITEMTEMPLATE* PMENUITEMTEMPLATE; + +struct MENUITEMTEMPLATEHEADER +{ + ushort versionNumber; + ushort offset; +} + +alias MENUITEMTEMPLATEHEADER TMENUITEMTEMPLATEHEADER; +alias MENUITEMTEMPLATEHEADER* PMENUITEMTEMPLATEHEADER; + +struct MENUTEMPLATE +{ +} + +alias MENUTEMPLATE* LPMENUTEMPLATE; +alias MENUTEMPLATE TMENUTEMPLATE; +alias MENUTEMPLATE* PMENUTEMPLATE; + +struct METAFILEPICT +{ + LONG mm; + LONG xExt; + LONG yExt; + HMETAFILE hMF; +} + +alias METAFILEPICT* LPMETAFILEPICT; +alias METAFILEPICT TAGMETAFILEPICT; +alias METAFILEPICT TMETAFILEPICT; +alias METAFILEPICT* PMETAFILEPICT; + +align(1) struct METAHEADER +{ + ushort mtType; + ushort mtHeaderSize; + ushort mtVersion; + DWORD mtSize; + ushort mtNoObjects; + DWORD mtMaxRecord; + ushort mtNoParameters; +} + +alias METAHEADER TAGMETAHEADER; +alias METAHEADER TMETAHEADER; +alias METAHEADER* PMETAHEADER; + +struct METARECORD +{ + DWORD rdSize; + ushort rdFunction; + ushort[1 + 0] rdParm; +} + +alias METARECORD* LPMETARECORD; +alias METARECORD TAGMETARECORD; +alias METARECORD TMETARECORD; +alias METARECORD* PMETARECORD; + +struct MINIMIZEDMETRICS +{ + UINT cbSize; + int iWidth; + int iHorzGap; + int iVertGap; + int iArrange; +} + +alias MINIMIZEDMETRICS* LPMINIMIZEDMETRICS; +alias MINIMIZEDMETRICS TAGMINIMIZEDMETRICS; +alias MINIMIZEDMETRICS TMINIMIZEDMETRICS; +alias MINIMIZEDMETRICS* PMINIMIZEDMETRICS; + +struct MINMAXINFO +{ + POINT ptReserved; + POINT ptMaxSize; + POINT ptMaxPosition; + POINT ptMinTrackSize; + POINT ptMaxTrackSize; +} + +alias MINMAXINFO TAGMINMAXINFO; +alias MINMAXINFO TMINMAXINFO; +alias MINMAXINFO* PMINMAXINFO; + +struct MODEMDEVCAPS +{ + DWORD dwActualSize; + DWORD dwRequiredSize; + DWORD dwDevSpecificOffset; + DWORD dwDevSpecificSize; + DWORD dwModemProviderVersion; + DWORD dwModemManufacturerOffset; + DWORD dwModemManufacturerSize; + DWORD dwModemModelOffset; + DWORD dwModemModelSize; + DWORD dwModemVersionOffset; + DWORD dwModemVersionSize; + DWORD dwDialOptions; + DWORD dwCallSetupFailTimer; + DWORD dwInactivityTimeout; + DWORD dwSpeakerVolume; + DWORD dwSpeakerMode; + DWORD dwModemOptions; + DWORD dwMaxDTERate; + DWORD dwMaxDCERate; + ubyte[1 + 0] abVariablePortion; +} + +alias MODEMDEVCAPS* LPMODEMDEVCAPS; +alias MODEMDEVCAPS TMODEMDEVCAPS; +alias MODEMDEVCAPS* PMODEMDEVCAPS; +alias MODEMDEVCAPS MODEMDEVCAPS_TAG; + +struct MODEMSETTINGS +{ + DWORD dwActualSize; + DWORD dwRequiredSize; + DWORD dwDevSpecificOffset; + DWORD dwDevSpecificSize; + DWORD dwCallSetupFailTimer; + DWORD dwInactivityTimeout; + DWORD dwSpeakerVolume; + DWORD dwSpeakerMode; + DWORD dwPreferredModemOptions; + DWORD dwNegotiatedModemOptions; + DWORD dwNegotiatedDCERate; + ubyte[1 + 0] abVariablePortion; +} + +alias MODEMSETTINGS* LPMODEMSETTINGS; +alias MODEMSETTINGS TMODEMSETTINGS; +alias MODEMSETTINGS* PMODEMSETTINGS; +alias MODEMSETTINGS MODEMSETTINGS_TAG; + +struct MONCBSTRUCT +{ + UINT cb; + DWORD dwTime; + HANDLE hTask; + DWORD dwRet; + UINT wType; + UINT wFmt; + HCONV hConv; + HSZ hsz1; + HSZ hsz2; + HDDEDATA hData; + DWORD dwData1; + DWORD dwData2; + CONVCONTEXT cc; + DWORD cbData; + DWORD[1 + 7] Data; +} + +alias MONCBSTRUCT TAGMONCBSTRUCT; +alias MONCBSTRUCT TMONCBSTRUCT; +alias MONCBSTRUCT* PMONCBSTRUCT; + +struct MONCONVSTRUCT +{ + UINT cb; + WINBOOL fConnect; + DWORD dwTime; + HANDLE hTask; + HSZ hszSvc; + HSZ hszTopic; + HCONV hConvClient; + HCONV hConvServer; +} + +alias MONCONVSTRUCT TAGMONCONVSTRUCT; +alias MONCONVSTRUCT TMONCONVSTRUCT; +alias MONCONVSTRUCT* PMONCONVSTRUCT; + +struct MONERRSTRUCT +{ + UINT cb; + UINT wLastError; + DWORD dwTime; + HANDLE hTask; +} + +alias MONERRSTRUCT TAGMONERRSTRUCT; +alias MONERRSTRUCT TMONERRSTRUCT; +alias MONERRSTRUCT* PMONERRSTRUCT; + +struct MONHSZSTRUCT +{ + UINT cb; + WINBOOL fsAction; + DWORD dwTime; + HSZ hsz; + HANDLE hTask; + TCHAR[1 + 0] str; +} + +alias MONHSZSTRUCT TAGMONHSZSTRUCT; +alias MONHSZSTRUCT TMONHSZSTRUCT; +alias MONHSZSTRUCT* PMONHSZSTRUCT; + +struct MONITOR_INFO_1 +{ + LPTSTR pName; +} + +alias MONITOR_INFO_1 _MONITOR_INFO_1; +alias MONITOR_INFO_1 TMONITORINFO1; +alias MONITOR_INFO_1* PMONITORINFO1; + +struct MONITOR_INFO_2 +{ + LPTSTR pName; + LPTSTR pEnvironment; + LPTSTR pDLLName; +} + +alias MONITOR_INFO_2 _MONITOR_INFO_2; +alias MONITOR_INFO_2 TMONITORINFO2; +alias MONITOR_INFO_2* PMONITORINFO2; + +struct MONLINKSTRUCT +{ + UINT cb; + DWORD dwTime; + HANDLE hTask; + WINBOOL fEstablished; + WINBOOL fNoData; + HSZ hszSvc; + HSZ hszTopic; + HSZ hszItem; + UINT wFmt; + WINBOOL fServer; + HCONV hConvServer; + HCONV hConvClient; +} + +alias MONLINKSTRUCT TAGMONLINKSTRUCT; +alias MONLINKSTRUCT TMONLINKSTRUCT; +alias MONLINKSTRUCT* PMONLINKSTRUCT; + +struct MONMSGSTRUCT +{ + UINT cb; + HWND hwndTo; + DWORD dwTime; + HANDLE hTask; + UINT wMsg; + WPARAM wParam; + LPARAM lParam; + DDEML_MSG_HOOK_DATA dmhd; +} + +alias MONMSGSTRUCT TAGMONMSGSTRUCT; +alias MONMSGSTRUCT TMONMSGSTRUCT; +alias MONMSGSTRUCT* PMONMSGSTRUCT; + +struct MOUSEHOOKSTRUCT +{ + POINT pt; + HWND hwnd; + UINT wHitTestCode; + DWORD dwExtraInfo; +} + +alias MOUSEHOOKSTRUCT* LPMOUSEHOOKSTRUCT; +alias MOUSEHOOKSTRUCT TAGMOUSEHOOKSTRUCT; +alias MOUSEHOOKSTRUCT TMOUSEHOOKSTRUCT; +alias MOUSEHOOKSTRUCT* PMOUSEHOOKSTRUCT; + +struct MOUSEKEYS +{ + DWORD cbSize; + DWORD dwFlags; + DWORD iMaxSpeed; + DWORD iTimeToMaxSpeed; + DWORD iCtrlSpeed; + DWORD dwReserved1; + DWORD dwReserved2; +} + +alias MOUSEKEYS TMOUSEKEYS; +alias MOUSEKEYS* PMOUSEKEYS; + +struct MSG +{ + HWND hwnd; + UINT message; + WPARAM wParam; + LPARAM lParam; + DWORD time; + POINT pt; +} + +alias MSG* LPMSG; +alias MSG TAGMSG; +alias MSG TMSG; +alias MSG* PMSG; +extern(Windows){ +alias void (*MSGBOXCALLBACK)(LPHELPINFO); +} +alias MSGBOXCALLBACK TMSGBOXCALLBACK; + +struct MSGBOXPARAMS +{ + UINT cbSize; + HWND hwndOwner; + HINST hInstance; + LPCSTR lpszText; + LPCSTR lpszCaption; + DWORD dwStyle; + LPCSTR lpszIcon; + DWORD dwContextHelpId; + MSGBOXCALLBACK lpfnMsgBoxCallback; + DWORD dwLanguageId; +} + +alias MSGBOXPARAMS* LPMSGBOXPARAMS; +alias MSGBOXPARAMS TMSGBOXPARAMS; +alias MSGBOXPARAMS TMSGBOXPARAMSA; +alias MSGBOXPARAMS* PMSGBOXPARAMS; + +struct MSGFILTER +{ + NMHDR nmhdr; + UINT msg; + WPARAM wParam; + LPARAM lParam; +} + +alias MSGFILTER _MSGFILTER; +alias MSGFILTER TMSGFILTER; +alias MSGFILTER* PMSGFILTER; + +struct MULTIKEYHELP +{ + DWORD mkSize; + TCHAR mkKeylist; + TCHAR[1 + 0] szKeyphrase; +} + +alias MULTIKEYHELP TAGMULTIKEYHELP; +alias MULTIKEYHELP TMULTIKEYHELP; +alias MULTIKEYHELP* PMULTIKEYHELP; + +struct NAME_BUFFER +{ + UCHAR[1 + NCBNAMSZ-1] name; + UCHAR name_num; + UCHAR name_flags; +} + +alias NAME_BUFFER _NAME_BUFFER; +alias NAME_BUFFER TNAMEBUFFER; +alias NAME_BUFFER* PNAMEBUFFER; +alias _NCB* P_NCB; + +struct NCB +{ + UCHAR ncb_command; + UCHAR ncb_retcode; + UCHAR ncb_lsn; + UCHAR ncb_num; + PUCHAR ncb_buffer; + ushort ncb_length; + UCHAR[1 + NCBNAMSZ-1] ncb_callname; + UCHAR[1 + NCBNAMSZ-1] ncb_name; + UCHAR ncb_rto; + UCHAR ncb_sto; + POINTER ncb_post; + UCHAR ncb_lana_num; + UCHAR ncb_cmd_cplt; + UCHAR[1 + 9] ncb_reserve; + HANDLE ncb_event; +} + +alias NCB _NCB; +alias NCB TNCB; +alias NCB* PNCB; + +struct NCCALCSIZE_PARAMS +{ + RECT[1 + 2] rgrc; + PWINDOWPOS lppos; +} + +alias NCCALCSIZE_PARAMS _NCCALCSIZE_PARAMS; +alias NCCALCSIZE_PARAMS TNCCALCSIZEPARAMS; +alias NCCALCSIZE_PARAMS* PNCCALCSIZEPARAMS; + +struct NDDESHAREINFO +{ + LONG lRevision; + LPTSTR lpszShareName; + LONG lShareType; + LPTSTR lpszAppTopicList; + LONG fSharedFlag; + LONG fService; + LONG fStartAppFlag; + LONG nCmdShow; + LONG[1 + 1] qModifyId; + LONG cNumItems; + LPTSTR lpszItemList; +} + +alias NDDESHAREINFO _NDDESHAREINFO; +alias NDDESHAREINFO TNDDESHAREINFO; +alias NDDESHAREINFO* PNDDESHAREINFO; + +struct NETRESOURCE +{ + DWORD dwScope; + DWORD dwType; + DWORD dwDisplayType; + DWORD dwUsage; + LPTSTR lpLocalName; + LPTSTR lpRemoteName; + LPTSTR lpComment; + LPTSTR lpProvider; +} + +alias NETRESOURCE* LPNETRESOURCE; +alias NETRESOURCE _NETRESOURCE; +alias NETRESOURCE TNETRESOURCE; +alias NETRESOURCE TNETRESOURCEA; +alias NETRESOURCE* PNETRESOURCE; +alias NETRESOURCE* PNETRESOURCEA; + +struct NEWCPLINFO +{ + DWORD dwSize; + DWORD dwFlags; + DWORD dwHelpContext; + LONG lData; + HICON hIcon; + TCHAR[1 + 31] szName; + TCHAR[1 + 63] szInfo; + TCHAR[1 + 127] szHelpFile; +} + +alias NEWCPLINFO TAGNEWCPLINFO; +alias NEWCPLINFO TNEWCPLINFO; +alias NEWCPLINFO* PNEWCPLINFO; + +struct NEWTEXTMETRIC +{ + LONG tmHeight; + LONG tmAscent; + LONG tmDescent; + LONG tmInternalLeading; + LONG tmExternalLeading; + LONG tmAveCharWidth; + LONG tmMaxCharWidth; + LONG tmWeight; + LONG tmOverhang; + LONG tmDigitizedAspectX; + LONG tmDigitizedAspectY; + BCHAR tmFirstChar; + BCHAR tmLastChar; + BCHAR tmDefaultChar; + BCHAR tmBreakChar; + ubyte tmItalic; + ubyte tmUnderlined; + ubyte tmStruckOut; + ubyte tmPitchAndFamily; + ubyte tmCharSet; + DWORD ntmFlags; + UINT ntmSizeEM; + UINT ntmCellHeight; + UINT ntmAvgWidth; +} + +alias NEWTEXTMETRIC TAGNEWTEXTMETRIC; +alias NEWTEXTMETRIC TNEWTEXTMETRIC; +alias NEWTEXTMETRIC* PNEWTEXTMETRIC; + +struct NEWTEXTMETRICEX +{ + NEWTEXTMETRIC ntmentm; + FONTSIGNATURE ntmeFontSignature; +} + +alias NEWTEXTMETRICEX TAGNEWTEXTMETRICEX; +alias NEWTEXTMETRICEX TNEWTEXTMETRICEX; +alias NEWTEXTMETRICEX* PNEWTEXTMETRICEX; + +struct NM_LISTVIEW +{ + NMHDR hdr; + int iItem; + int iSubItem; + UINT uNewState; + UINT uOldState; + UINT uChanged; + POINT ptAction; + LPARAM lParam; +} + +alias NM_LISTVIEW TAGNM_LISTVIEW; +alias NM_LISTVIEW TNMLISTVIEW; +alias NM_LISTVIEW* PNMLISTVIEW; + +struct TV_ITEM +{ + UINT mask; + HTREEITEM hItem; + UINT state; + UINT stateMask; + LPTSTR pszText; + int cchTextMax; + int iImage; + int iSelectedImage; + int cChildren; + LPARAM lParam; +} + +alias TV_ITEM* LPTV_ITEM; +alias TV_ITEM _TV_ITEM; +alias TV_ITEM TTVITEM; +alias TV_ITEM* PTVITEM; + +struct NM_TREEVIEW +{ + NMHDR hdr; + UINT action; + TV_ITEM itemOld; + TV_ITEM itemNew; + POINT ptDrag; +} + +alias NM_TREEVIEW* LPNM_TREEVIEW; +alias NM_TREEVIEW _NM_TREEVIEW; +alias NM_TREEVIEW TNMTREEVIEW; +alias NM_TREEVIEW* PNMTREEVIEW; + +struct NM_UPDOWNW +{ + NMHDR hdr; + int iPos; + int iDelta; +} + +alias NM_UPDOWNW _NM_UPDOWN; +alias NM_UPDOWNW TNMUPDOWN; +alias NM_UPDOWNW* PNMUPDOWN; + +struct NONCLIENTMETRICS +{ + UINT cbSize; + int iBorderWidth; + int iScrollWidth; + int iScrollHeight; + int iCaptionWidth; + int iCaptionHeight; + LOGFONT lfCaptionFont; + int iSmCaptionWidth; + int iSmCaptionHeight; + LOGFONT lfSmCaptionFont; + int iMenuWidth; + int iMenuHeight; + LOGFONT lfMenuFont; + LOGFONT lfStatusFont; + LOGFONT lfMessageFont; +} + +alias NONCLIENTMETRICS* LPNONCLIENTMETRICS; +alias NONCLIENTMETRICS TAGNONCLIENTMETRICS; +alias NONCLIENTMETRICS TNONCLIENTMETRICS; +alias NONCLIENTMETRICS* PNONCLIENTMETRICS; + +struct SERVICE_ADDRESS +{ + DWORD dwAddressType; + DWORD dwAddressFlags; + DWORD dwAddressLength; + DWORD dwPrincipalLength; + ubyte* lpAddress; + ubyte* lpPrincipal; +} + +alias SERVICE_ADDRESS _SERVICE_ADDRESS; +alias SERVICE_ADDRESS TSERVICEADDRESS; +alias SERVICE_ADDRESS* PSERVICEADDRESS; + +struct SERVICE_ADDRESSES +{ + DWORD dwAddressCount; + SERVICE_ADDRESS[1 + 0] Addresses; +} + +alias SERVICE_ADDRESSES* LPSERVICE_ADDRESSES; +alias SERVICE_ADDRESSES _SERVICE_ADDRESSES; +alias SERVICE_ADDRESSES TSERVICEADDRESSES; +alias SERVICE_ADDRESSES* PSERVICEADDRESSES; + +align(1) struct __GUID +{ + + union + { + struct + { + uint Data1; + ushort Data2; + ushort Data3; + ubyte[1 + 7] Data4; + } + struct + { + uint D1; + ushort D2; + ushort D3; + ubyte[1 + 7] D4; + } + } +} + +alias __GUID* LPGUID; +alias __GUID _GUID; +alias __GUID TGUID; +alias __GUID* PGUID; +alias __GUID __CLSID; +alias __CLSID* LPCLSID; +alias __CLSID TCLSID; +alias __CLSID* PCLSID; + +struct SERVICE_INFO +{ + LPGUID lpServiceType; + LPTSTR lpServiceName; + LPTSTR lpComment; + LPTSTR lpLocale; + DWORD dwDisplayHint; + DWORD dwVersion; + DWORD dwTime; + LPTSTR lpMachineName; + LPSERVICE_ADDRESSES lpServiceAddress; + BLOB ServiceSpecificInfo; +} + +alias SERVICE_INFO _SERVICE_INFO; +alias SERVICE_INFO TSERVICEINFO; +alias SERVICE_INFO* PSERVICEINFO; + +struct NS_SERVICE_INFO +{ + DWORD dwNameSpace; + SERVICE_INFO ServiceInfo; +} + +alias NS_SERVICE_INFO _NS_SERVICE_INFO; +alias NS_SERVICE_INFO TNSSERVICEINFO; +alias NS_SERVICE_INFO* PNSSERVICEINFO; + +struct NUMBERFMT +{ + UINT NumDigits; + UINT LeadingZero; + UINT Grouping; + LPTSTR lpDecimalSep; + LPTSTR lpThousandSep; + UINT NegativeOrder; +} + +alias NUMBERFMT _NUMBERFMT; +alias NUMBERFMT TNUMBERFMT; +alias NUMBERFMT* PNUMBERFMT; + +struct OFSTRUCT +{ + ubyte cBytes; + ubyte fFixedDisk; + ushort nErrCode; + ushort Reserved1; + ushort Reserved2; + char[1 + OFS_MAXPATHNAME-1] szPathName; +} + +alias OFSTRUCT* LPOFSTRUCT; +alias OFSTRUCT _OFSTRUCT; +alias OFSTRUCT TOFSTRUCT; +alias OFSTRUCT* POFSTRUCT; + +struct OPENFILENAME +{ + DWORD lStructSize; + HWND hwndOwner; + HINST hInstance; + LPCTSTR lpstrFilter; + LPTSTR lpstrCustomFilter; + DWORD nMaxCustFilter; + DWORD nFilterIndex; + LPTSTR lpstrFile; + DWORD nMaxFile; + LPTSTR lpstrFileTitle; + DWORD nMaxFileTitle; + LPCTSTR lpstrInitialDir; + LPCTSTR lpstrTitle; + DWORD Flags; + ushort nFileOffset; + ushort nFileExtension; + LPCTSTR lpstrDefExt; + DWORD lCustData; + LPOFNHOOKPROC lpfnHook; + LPCTSTR lpTemplateName; +} + +alias OPENFILENAME* LPOPENFILENAME; +alias OPENFILENAME TOPENFILENAME; +alias OPENFILENAME* POPENFILENAME; +alias OPENFILENAME TAGOFN; +alias OPENFILENAME TOFN; +alias OPENFILENAME* POFN; + +struct OFNOTIFY +{ + NMHDR hdr; + LPOPENFILENAME lpOFN; + LPTSTR pszFile; +} + +alias OFNOTIFY* LPOFNOTIFY; +alias OFNOTIFY _OFNOTIFY; +alias OFNOTIFY TOFNOTIFY; +alias OFNOTIFY* POFNOTIFY; + +struct OSVERSIONINFO +{ + DWORD dwOSVersionInfoSize; + DWORD dwMajorVersion; + DWORD dwMinorVersion; + DWORD dwBuildNumber; + DWORD dwPlatformId; + TCHAR[1 + 127] szCSDVersion; +} + +alias OSVERSIONINFO* LPOSVERSIONINFO; +alias OSVERSIONINFO _OSVERSIONINFO; +alias OSVERSIONINFO TOSVERSIONINFO; +alias OSVERSIONINFO* POSVERSIONINFO; + +struct TEXTMETRIC +{ + LONG tmHeight; + LONG tmAscent; + LONG tmDescent; + LONG tmInternalLeading; + LONG tmExternalLeading; + LONG tmAveCharWidth; + LONG tmMaxCharWidth; + LONG tmWeight; + LONG tmOverhang; + LONG tmDigitizedAspectX; + LONG tmDigitizedAspectY; + BCHAR tmFirstChar; + BCHAR tmLastChar; + BCHAR tmDefaultChar; + BCHAR tmBreakChar; + ubyte tmItalic; + ubyte tmUnderlined; + ubyte tmStruckOut; + ubyte tmPitchAndFamily; + ubyte tmCharSet; +} + +alias TEXTMETRIC* LPTEXTMETRIC; +alias TEXTMETRIC TAGTEXTMETRIC; +alias TEXTMETRIC TTEXTMETRIC; +alias TEXTMETRIC* PTEXTMETRIC; + +struct OUTLINETEXTMETRIC +{ + UINT otmSize; + TEXTMETRIC otmTextMetrics; + ubyte otmFiller; + PANOSE otmPanoseNumber; + UINT otmfsSelection; + UINT otmfsType; + int otmsCharSlopeRise; + int otmsCharSlopeRun; + int otmItalicAngle; + UINT otmEMSquare; + int otmAscent; + int otmDescent; + UINT otmLineGap; + UINT otmsCapEmHeight; + UINT otmsXHeight; + RECT otmrcFontBox; + int otmMacAscent; + int otmMacDescent; + UINT otmMacLineGap; + UINT otmusMinimumPPEM; + POINT otmptSubscriptSize; + POINT otmptSubscriptOffset; + POINT otmptSuperscriptSize; + POINT otmptSuperscriptOffset; + UINT otmsStrikeoutSize; + int otmsStrikeoutPosition; + int otmsUnderscoreSize; + int otmsUnderscorePosition; + PSTR otmpFamilyName; + PSTR otmpFaceName; + PSTR otmpStyleName; + PSTR otmpFullName; +} + +alias OUTLINETEXTMETRIC* LPOUTLINETEXTMETRIC; +alias OUTLINETEXTMETRIC _OUTLINETEXTMETRIC; +alias OUTLINETEXTMETRIC TOUTLINETEXTMETRIC; +alias OUTLINETEXTMETRIC* POUTLINETEXTMETRIC; + +struct OVERLAPPED +{ + DWORD Internal; + DWORD InternalHigh; + DWORD Offset; + DWORD OffsetHigh; + HANDLE hEvent; +} + +alias OVERLAPPED* LPOVERLAPPED; +alias OVERLAPPED _OVERLAPPED; +alias OVERLAPPED TOVERLAPPED; +alias OVERLAPPED* POVERLAPPED; + +struct TPAGESETUPDLG +{ + DWORD lStructSize; + HWND hwndOwner; + HGLOBAL hDevMode; + HGLOBAL hDevNames; + DWORD Flags; + POINT ptPaperSize; + RECT rtMinMargin; + RECT rtMargin; + HINST hInstance; + LPARAM lCustData; + LPPAGESETUPHOOK lpfnPageSetupHook; + LPPAGEPAINTHOOK lpfnPagePaintHook; + LPCTSTR lpPageSetupTemplateName; + HGLOBAL hPageSetupTemplate; +} + +alias TPAGESETUPDLG* LPPAGESETUPDLG; +alias TPAGESETUPDLG* PPAGESETUPDLG; +alias TPAGESETUPDLG TAGPSD; +alias TPAGESETUPDLG TPSD; +alias TPAGESETUPDLG* PPSD; + +struct PAINTSTRUCT +{ + HDC hdc; + WINBOOL fErase; + RECT rcPaint; + WINBOOL fRestore; + WINBOOL fIncUpdate; + ubyte[1 + 31] rgbReserved; +} + +alias PAINTSTRUCT* LPPAINTSTRUCT; +alias PAINTSTRUCT TAGPAINTSTRUCT; +alias PAINTSTRUCT TPAINTSTRUCT; +alias PAINTSTRUCT* PPAINTSTRUCT; + +struct PARAFORMAT +{ + UINT cbSize; + DWORD dwMask; + ushort wNumbering; + ushort wReserved; + LONG dxStartIndent; + LONG dxRightIndent; + LONG dxOffset; + ushort wAlignment; + SHORT cTabCount; + LONG[1 + MAX_TAB_STOPS-1] rgxTabs; +} + +alias PARAFORMAT _PARAFORMAT; +alias PARAFORMAT TPARAFORMAT; +alias PARAFORMAT* PPARAFORMAT; + +struct PERF_COUNTER_BLOCK +{ + DWORD ByteLength; +} + +alias PERF_COUNTER_BLOCK _PERF_COUNTER_BLOCK; +alias PERF_COUNTER_BLOCK TPERFCOUNTERBLOCK; +alias PERF_COUNTER_BLOCK* PPERFCOUNTERBLOCK; + +struct PERF_COUNTER_DEFINITION +{ + DWORD ByteLength; + DWORD CounterNameTitleIndex; + LPWSTR CounterNameTitle; + DWORD CounterHelpTitleIndex; + LPWSTR CounterHelpTitle; + DWORD DefaultScale; + DWORD DetailLevel; + DWORD CounterType; + DWORD CounterSize; + DWORD CounterOffset; +} + +alias PERF_COUNTER_DEFINITION _PERF_COUNTER_DEFINITION; +alias PERF_COUNTER_DEFINITION TPERFCOUNTERDEFINITION; +alias PERF_COUNTER_DEFINITION* PPERFCOUNTERDEFINITION; + +struct PERF_DATA_BLOCK +{ + WCHAR[1 + 3] Signature; + DWORD LittleEndian; + DWORD Version; + DWORD Revision; + DWORD TotalByteLength; + DWORD HeaderLength; + DWORD NumObjectTypes; + DWORD DefaultObject; + SYSTEMTIME SystemTime; + LARGE_INTEGER PerfTime; + LARGE_INTEGER PerfFreq; + LARGE_INTEGER PerfTime100nSec; + DWORD SystemNameLength; + DWORD SystemNameOffset; +} + +alias PERF_DATA_BLOCK _PERF_DATA_BLOCK; +alias PERF_DATA_BLOCK TPERFDATABLOCK; +alias PERF_DATA_BLOCK* PPERFDATABLOCK; + +struct PERF_INSTANCE_DEFINITION +{ + DWORD ByteLength; + DWORD ParentObjectTitleIndex; + DWORD ParentObjectInstance; + DWORD UniqueID; + DWORD NameOffset; + DWORD NameLength; +} + +alias PERF_INSTANCE_DEFINITION _PERF_INSTANCE_DEFINITION; +alias PERF_INSTANCE_DEFINITION TPERFINSTANCEDEFINITION; +alias PERF_INSTANCE_DEFINITION PPERFINSTANCEDEFINITION; + +struct PERF_OBJECT_TYPE +{ + DWORD TotalByteLength; + DWORD DefinitionLength; + DWORD HeaderLength; + DWORD ObjectNameTitleIndex; + LPWSTR ObjectNameTitle; + DWORD ObjectHelpTitleIndex; + LPWSTR ObjectHelpTitle; + DWORD DetailLevel; + DWORD NumCounters; + DWORD DefaultCounter; + DWORD NumInstances; + DWORD CodePage; + LARGE_INTEGER PerfTime; + LARGE_INTEGER PerfFreq; +} + +alias PERF_OBJECT_TYPE _PERF_OBJECT_TYPE; +alias PERF_OBJECT_TYPE TPERFOBJECTTYPE; +alias PERF_OBJECT_TYPE* PPERFOBJECTTYPE; + +struct POLYTEXT +{ + int x; + int y; + UINT n; + LPCTSTR lpstr; + UINT uiFlags; + RECT rcl; + int* pdx; +} + +alias POLYTEXT _POLYTEXT; +alias POLYTEXT TPOLYTEXT; +alias POLYTEXT* PPOLYTEXT; + +struct PORT_INFO_1 +{ + LPTSTR pName; +} + +alias PORT_INFO_1 _PORT_INFO_1; +alias PORT_INFO_1 TPORTINFO1; +alias PORT_INFO_1* PPORTINFO1; + +struct PORT_INFO_2 +{ + LPSTR pPortName; + LPSTR pMonitorName; + LPSTR pDescription; + DWORD fPortType; + DWORD Reserved; +} + +alias PORT_INFO_2 _PORT_INFO_2; +alias PORT_INFO_2 TPORTINFO2; +alias PORT_INFO_2* PPORTINFO2; + +struct PREVENT_MEDIA_REMOVAL +{ + ubyte PreventMediaRemoval; +} + +alias PREVENT_MEDIA_REMOVAL _PREVENT_MEDIA_REMOVAL; +alias PREVENT_MEDIA_REMOVAL TPREVENTMEDIAREMOVAL; +alias PREVENT_MEDIA_REMOVAL* PPREVENTMEDIAREMOVAL; + +align(1) struct TPRINTDLG +{ + DWORD lStructSize; + HWND hwndOwner; + HANDLE hDevMode; + HANDLE hDevNames; + HDC hDC; + DWORD Flags; + ushort nFromPage; + ushort nToPage; + ushort nMinPage; + ushort nMaxPage; + ushort nCopies; + HINST hInstance; + DWORD lCustData; + LPPRINTHOOKPROC lpfnPrintHook; + LPSETUPHOOKPROC lpfnSetupHook; + LPCTSTR lpPrintTemplateName; + LPCTSTR lpSetupTemplateName; + HANDLE hPrintTemplate; + HANDLE hSetupTemplate; +} + +alias TPRINTDLG* LPPRINTDLG; +alias TPRINTDLG* PPRINTDLG; +alias TPRINTDLG TAGPD; +alias TPRINTDLG TPD; +alias TPRINTDLG* PPD; + +struct PRINTER_DEFAULTS +{ + LPTSTR pDatatype; + LPDEVMODE pDevMode; + ACCESS_MASK DesiredAccess; +} + +alias PRINTER_DEFAULTS _PRINTER_DEFAULTS; +alias PRINTER_DEFAULTS TPRINTERDEFAULTS; +alias PRINTER_DEFAULTS* PPRINTERDEFAULTS; + +struct PRINTER_INFO_1 +{ + DWORD Flags; + LPTSTR pDescription; + LPTSTR pName; + LPTSTR pComment; +} + +alias PRINTER_INFO_1* LPPRINTER_INFO_1; +alias PRINTER_INFO_1* PPRINTER_INFO_1; +alias PRINTER_INFO_1 _PRINTER_INFO_1; +alias PRINTER_INFO_1 TPRINTERINFO1; +alias PRINTER_INFO_1* PPRINTERINFO1; + +struct PRINTER_INFO_2 +{ + LPTSTR pServerName; + LPTSTR pPrinterName; + LPTSTR pShareName; + LPTSTR pPortName; + LPTSTR pDriverName; + LPTSTR pComment; + LPTSTR pLocation; + LPDEVMODE pDevMode; + LPTSTR pSepFile; + LPTSTR pPrintProcessor; + LPTSTR pDatatype; + LPTSTR pParameters; + PSECURITY_DESCRIPTOR pSecurityDescriptor; + DWORD Attributes; + DWORD Priority; + DWORD DefaultPriority; + DWORD StartTime; + DWORD UntilTime; + DWORD Status; + DWORD cJobs; + DWORD AveragePPM; +} + +alias PRINTER_INFO_2 _PRINTER_INFO_2; +alias PRINTER_INFO_2 TPRINTERINFO2; +alias PRINTER_INFO_2* PPRINTERINFO2; + +struct PRINTER_INFO_3 +{ + PSECURITY_DESCRIPTOR pSecurityDescriptor; +} + +alias PRINTER_INFO_3 _PRINTER_INFO_3; +alias PRINTER_INFO_3 TPRINTERINFO3; +alias PRINTER_INFO_3* PPRINTERINFO3; + +struct PRINTER_INFO_4 +{ + LPTSTR pPrinterName; + LPTSTR pServerName; + DWORD Attributes; +} + +alias PRINTER_INFO_4 _PRINTER_INFO_4; +alias PRINTER_INFO_4 TPRINTERINFO4; +alias PRINTER_INFO_4* PPRINTERINFO4; + +struct PRINTER_INFO_5 +{ + LPTSTR pPrinterName; + LPTSTR pPortName; + DWORD Attributes; + DWORD DeviceNotSelectedTimeout; + DWORD TransmissionRetryTimeout; +} + +alias PRINTER_INFO_5 _PRINTER_INFO_5; +alias PRINTER_INFO_5 TPRINTERINFO5; +alias PRINTER_INFO_5* PPRINTERINFO5; + +struct PRINTER_NOTIFY_INFO_DATA +{ + ushort _Type; + ushort Field; + DWORD Reserved; + DWORD Id; + + union + { + struct + { + DWORD[1 + 1] adwData; + } + struct + { + DWORD cbBuf; + LPVOID pBuf; + } + } +} + +alias PRINTER_NOTIFY_INFO_DATA _PRINTER_NOTIFY_INFO_DATA; +alias PRINTER_NOTIFY_INFO_DATA TPRINTERNOTIFYINFODATA; +alias PRINTER_NOTIFY_INFO_DATA* PPRINTERNOTIFYINFODATA; + +struct PRINTER_NOTIFY_INFO +{ + DWORD Version; + DWORD Flags; + DWORD Count; + PRINTER_NOTIFY_INFO_DATA[1 + 0] aData; +} + +alias PRINTER_NOTIFY_INFO _PRINTER_NOTIFY_INFO; +alias PRINTER_NOTIFY_INFO TPRINTERNOTIFYINFO; +alias PRINTER_NOTIFY_INFO* PPRINTERNOTIFYINFO; + +struct PRINTER_NOTIFY_OPTIONS_TYPE +{ + ushort _Type; + ushort Reserved0; + DWORD Reserved1; + DWORD Reserved2; + DWORD Count; + PWORD pFields; +} + +alias PRINTER_NOTIFY_OPTIONS_TYPE* PPRINTER_NOTIFY_OPTIONS_TYPE; +alias PRINTER_NOTIFY_OPTIONS_TYPE _PRINTER_NOTIFY_OPTIONS_TYPE; +alias PRINTER_NOTIFY_OPTIONS_TYPE TPRINTERNOTIFYOPTIONSTYPE; +alias PRINTER_NOTIFY_OPTIONS_TYPE* PPRINTERNOTIFYOPTIONSTYPE; + +struct PRINTER_NOTIFY_OPTIONS +{ + DWORD Version; + DWORD Flags; + DWORD Count; + PPRINTER_NOTIFY_OPTIONS_TYPE pTypes; +} + +alias PRINTER_NOTIFY_OPTIONS _PRINTER_NOTIFY_OPTIONS; +alias PRINTER_NOTIFY_OPTIONS TPRINTERNOTIFYOPTIONS; +alias PRINTER_NOTIFY_OPTIONS* PPRINTERNOTIFYOPTIONS; + +struct PRINTPROCESSOR_INFO_1 +{ + LPTSTR pName; +} + +alias PRINTPROCESSOR_INFO_1 _PRINTPROCESSOR_INFO_1; +alias PRINTPROCESSOR_INFO_1 TPRINTPROCESSORINFO1; +alias PRINTPROCESSOR_INFO_1* PPRINTPROCESSORINFO1; + +struct PRIVILEGE_SET +{ + DWORD PrivilegeCount; + DWORD Control; + LUID_AND_ATTRIBUTES[1 + ANYSIZE_ARRAY-1] Privilege; +} + +alias PRIVILEGE_SET* LPPRIVILEGE_SET; +alias PRIVILEGE_SET* PPRIVILEGE_SET; +alias PRIVILEGE_SET _PRIVILEGE_SET; +alias PRIVILEGE_SET TPRIVILEGESET; +alias PRIVILEGE_SET* PPRIVILEGESET; + +struct PROCESS_HEAPENTRY +{ + PVOID lpData; + DWORD cbData; + ubyte cbOverhead; + ubyte iRegionIndex; + ushort wFlags; + DWORD dwCommittedSize; + DWORD dwUnCommittedSize; + LPVOID lpFirstBlock; + LPVOID lpLastBlock; + HANDLE hMem; +} + +alias PROCESS_HEAPENTRY* LPPROCESS_HEAP_ENTRY; +alias PROCESS_HEAPENTRY _PROCESS_HEAP_ENTRY; +alias PROCESS_HEAPENTRY TPROCESSHEAPENTRY; +alias PROCESS_HEAPENTRY* PPROCESSHEAPENTRY; + +struct PROCESS_INFORMATION +{ + HANDLE hProcess; + HANDLE hThread; + DWORD dwProcessId; + DWORD dwThreadId; +} + +alias PROCESS_INFORMATION* LPPROCESS_INFORMATION; +alias PROCESS_INFORMATION _PROCESS_INFORMATION; +alias PROCESS_INFORMATION TPROCESSINFORMATION; +alias PROCESS_INFORMATION* PPROCESSINFORMATION; +extern(Windows){alias UINT (*LPFNPSPCALLBACK)(HWND, UINT, LPVOID);} +alias LPFNPSPCALLBACK TFNPSPCALLBACK; + +struct PROPSHEETPAGE_U1 +{ + + union + { + struct + { + LPCTSTR pszTemplate; + } + struct + { + LPCDLGTEMPLATE pResource; + } + } +} + + +struct PROPSHEETPAGE_U2 +{ + + union + { + struct + { + HICON hIcon; + } + struct + { + LPCTSTR pszIcon; + } + } +} + + +struct PROPSHEETPAGE +{ + DWORD dwSize; + DWORD dwFlags; + HINST hInstance; + PROPSHEETPAGE_U1 u1; + PROPSHEETPAGE_U2 u2; + LPCTSTR pszTitle; + DLGPROC pfnDlgProc; + LPARAM lParam; + LPFNPSPCALLBACK pfnCallback; + UINT* pcRefParent; +} + +alias PROPSHEETPAGE* LPPROPSHEETPAGE; +alias PROPSHEETPAGE* LPCPROPSHEETPAGE; +alias PROPSHEETPAGE _PROPSHEETPAGE; +alias PROPSHEETPAGE TPROPSHEETPAGE; +alias PROPSHEETPAGE* PPROPSHEETPAGE; + +struct EMPTYRECORD +{ +} + +alias EMPTYRECORD* HPROPSHEETPAGE; + +struct PROPSHEETHEADER_U1 +{ + + union + { + struct + { + HICON hIcon; + } + struct + { + LPCTSTR pszIcon; + } + } +} + + +struct PROPSHEETHEADER_U2 +{ + + union + { + struct + { + UINT nStartPage; + } + struct + { + LPCTSTR pStartPage; + } + } +} + + +struct PROPSHEETHEADER_U3 +{ + + union + { + struct + { + LPCPROPSHEETPAGE ppsp; + } + struct + { + HPROPSHEETPAGE* phpage; + } + } +} + + +struct PROPSHEETHEADER +{ + DWORD dwSize; + DWORD dwFlags; + HWND hwndParent; + HINST hInstance; + PROPSHEETHEADER_U1 u1; + LPCTSTR pszCaption; + UINT nPages; + PROPSHEETHEADER_U2 u2; + PROPSHEETHEADER_U3 u3; + PFNPROPSHEETCALLBACK pfnCallback; +} + +alias PROPSHEETHEADER* LPPROPSHEETHEADER; +alias PROPSHEETHEADER* LPCPROPSHEETHEADER; +alias PROPSHEETHEADER _PROPSHEETHEADER; +alias PROPSHEETHEADER TPROPSHEETHEADER; +alias PROPSHEETHEADER* PPROPSHEETHEADER; +extern(Windows){ +alias WINBOOL (*LPFNADDPROPSHEETPAGE)(HPROPSHEETPAGE, LPARAM); +alias WINBOOL (*LPFNADDPROPSHEETPAGES)(LPVOID, LPFNADDPROPSHEETPAGE, LPARAM); +} +alias LPFNADDPROPSHEETPAGE TFNADDPROPSHEETPAGE; +alias LPFNADDPROPSHEETPAGES TFNADDPROPSHEETPAGES; + +struct PROTOCOL_INFO +{ + DWORD dwServiceFlags; + INT iAddressFamily; + INT iMaxSockAddr; + INT iMinSockAddr; + INT iSocketType; + INT iProtocol; + DWORD dwMessageSize; + LPTSTR lpProtocol; +} + +alias PROTOCOL_INFO _PROTOCOL_INFO; +alias PROTOCOL_INFO TPROTOCOLINFO; +alias PROTOCOL_INFO* PPROTOCOLINFO; + +struct PROVIDOR_INFO_1 +{ + LPTSTR pName; + LPTSTR pEnvironment; + LPTSTR pDLLName; +} + +alias PROVIDOR_INFO_1 _PROVIDOR_INFO_1; +alias PROVIDOR_INFO_1 TPROVIDORINFO1; +alias PROVIDOR_INFO_1* PPROVIDORINFO1; + +struct PSHNOTIFY +{ + NMHDR hdr; + LPARAM lParam; +} + +alias PSHNOTIFY* LPPSHNOTIFY; +alias PSHNOTIFY _PSHNOTIFY; +alias PSHNOTIFY TPSHNOTIFY; +alias PSHNOTIFY* PPSHNOTIFY; + +struct PUNCTUATION +{ + UINT iSize; + LPSTR szPunctuation; +} + +alias PUNCTUATION _PUNCTUATION; +alias PUNCTUATION TPUNCTUATION; +alias PUNCTUATION* PPUNCTUATION; + +struct QUERY_SERVICE_CONFIG +{ + DWORD dwServiceType; + DWORD dwStartType; + DWORD dwErrorControl; + LPTSTR lpBinaryPathName; + LPTSTR lpLoadOrderGroup; + DWORD dwTagId; + LPTSTR lpDependencies; + LPTSTR lpServiceStartName; + LPTSTR lpDisplayName; +} + +alias QUERY_SERVICE_CONFIG* LPQUERY_SERVICE_CONFIG; +alias QUERY_SERVICE_CONFIG _QUERY_SERVICE_CONFIG; +alias QUERY_SERVICE_CONFIG TQUERYSERVICECONFIG; +alias QUERY_SERVICE_CONFIG* PQUERYSERVICECONFIG; + +struct QUERY_SERVICE_LOCK_STATUS +{ + DWORD fIsLocked; + LPTSTR lpLockOwner; + DWORD dwLockDuration; +} + +alias QUERY_SERVICE_LOCK_STATUS* LPQUERY_SERVICE_LOCK_STATUS; +alias QUERY_SERVICE_LOCK_STATUS _QUERY_SERVICE_LOCK_STATUS; +alias QUERY_SERVICE_LOCK_STATUS TQUERYSERVICELOCKSTATUS; +alias QUERY_SERVICE_LOCK_STATUS* PQUERYSERVICELOCKSTATUS; + +struct RASAMB +{ + DWORD dwSize; + DWORD dwError; + TCHAR[1 + NETBIOS_NAME_LEN+1-1] szNetBiosError; + ubyte bLana; +} + +alias RASAMB _RASAMB; +alias RASAMB TRASAMB; +alias RASAMB* PRASAMB; + +struct RASCONN +{ + DWORD dwSize; + HRASCONN hrasconn; + TCHAR[1 + RAS_MaxEntryName+1-1] szEntryName; + char[1 + RAS_MaxDeviceType+1-1] szDeviceType; + char[1 + RAS_MaxDeviceName+1-1] szDeviceName; +} + +alias RASCONN _RASCONN; +alias RASCONN TRASCONN; +alias RASCONN* PRASCONN; + +struct RASCONNSTATUS +{ + DWORD dwSize; + RASCONNSTATE rasconnstate; + DWORD dwError; + TCHAR[1 + RAS_MaxDeviceType+1-1] szDeviceType; + TCHAR[1 + RAS_MaxDeviceName+1-1] szDeviceName; +} + +alias RASCONNSTATUS _RASCONNSTATUS; +alias RASCONNSTATUS TRASCONNSTATUS; +alias RASCONNSTATUS* PRASCONNSTATUS; + +struct RASDIALEXTENSIONS +{ + DWORD dwSize; + DWORD dwfOptions; + HWND hwndParent; + DWORD reserved; +} + +alias RASDIALEXTENSIONS _RASDIALEXTENSIONS; +alias RASDIALEXTENSIONS TRASDIALEXTENSIONS; +alias RASDIALEXTENSIONS* PRASDIALEXTENSIONS; + +struct RASDIALPARAMS +{ + DWORD dwSize; + TCHAR[1 + RAS_MaxEntryName+1-1] szEntryName; + TCHAR[1 + RAS_MaxPhoneNumber+1-1] szPhoneNumber; + TCHAR[1 + (RAS_MaxCallbackNumber+1)-1] szCallbackNumber; + TCHAR[1 + (UNLEN+1)-1] szUserName; + TCHAR[1 + (PWLEN+1)-1] szPassword; + TCHAR[1 + (DNLEN+1)-1] szDomain; +} + +alias RASDIALPARAMS _RASDIALPARAMS; +alias RASDIALPARAMS TRASDIALPARAMS; +alias RASDIALPARAMS* PRASDIALPARAMS; + +struct RASENTRYNAME +{ + DWORD dwSize; + TCHAR[1 + (RAS_MaxEntryName+1)-1] szEntryName; +} + +alias RASENTRYNAME _RASENTRYNAME; +alias RASENTRYNAME TRASENTRYNAME; +alias RASENTRYNAME* PRASENTRYNAME; + +struct RASPPPIP +{ + DWORD dwSize; + DWORD dwError; + TCHAR[1 + (RAS_MaxIpAddress+1)-1] szIpAddress; +} + +alias RASPPPIP _RASPPPIP; +alias RASPPPIP TRASPPPIP; +alias RASPPPIP* PRASPPPIP; + +struct RASPPPIPX +{ + DWORD dwSize; + DWORD dwError; + TCHAR[1 + (RAS_MaxIpxAddress+1)-1] szIpxAddress; +} + +alias RASPPPIPX _RASPPPIPX; +alias RASPPPIPX TRASPPPIPX; +alias RASPPPIPX* PRASPPPIPX; + +struct RASPPPNBF +{ + DWORD dwSize; + DWORD dwError; + DWORD dwNetBiosError; + TCHAR[1 + (NETBIOS_NAME_LEN+1)-1] szNetBiosError; + TCHAR[1 + (NETBIOS_NAME_LEN+1)-1] szWorkstationName; + ubyte bLana; +} + +alias RASPPPNBF _RASPPPNBF; +alias RASPPPNBF TRASPPPNBF; +alias RASPPPNBF* PRASPPPNBF; + +struct RASTERIZER_STATUS +{ + int nSize; + int wFlags; + int nLanguageID; +} + +alias RASTERIZER_STATUS* LPRASTERIZER_STATUS; +alias RASTERIZER_STATUS _RASTERIZER_STATUS; +alias RASTERIZER_STATUS TRASTERIZERSTATUS; +alias RASTERIZER_STATUS* PRASTERIZERSTATUS; + +struct REASSIGN_BLOCKS +{ + ushort Reserved; + ushort Count; + DWORD[1 + 0] BlockNumber; +} + +alias REASSIGN_BLOCKS _REASSIGN_BLOCKS; +alias REASSIGN_BLOCKS TREASSIGNBLOCKS; +alias REASSIGN_BLOCKS* PREASSIGNBLOCKS; + +struct REMOTE_NAME_INFO +{ + LPTSTR lpUniversalName; + LPTSTR lpConnectionName; + LPTSTR lpRemainingPath; +} + +alias REMOTE_NAME_INFO _REMOTE_NAME_INFO; +alias REMOTE_NAME_INFO TREMOTENAMEINFO; +alias REMOTE_NAME_INFO* PREMOTENAMEINFO; + +struct REPASTESPECIAL +{ + DWORD dwAspect; + DWORD dwParam; +} + +alias REPASTESPECIAL _REPASTESPECIAL; +alias REPASTESPECIAL TREPASTESPECIAL; +alias REPASTESPECIAL* PREPASTESPECIAL; + +struct REQRESIZE +{ + NMHDR nmhdr; + RECT rc; +} + +alias REQRESIZE _REQRESIZE; +alias REQRESIZE TREQRESIZE; +alias REQRESIZE* PREQRESIZE; + +struct RGNDATAHEADER +{ + DWORD dwSize; + DWORD iType; + DWORD nCount; + DWORD nRgnSize; + RECT rcBound; +} + +alias RGNDATAHEADER _RGNDATAHEADER; +alias RGNDATAHEADER TRGNDATAHEADER; +alias RGNDATAHEADER* PRGNDATAHEADER; + +struct RGNDATA +{ + RGNDATAHEADER rdh; + char[1 + 0] Buffer; +} + +alias RGNDATA* LPRGNDATA; +alias RGNDATA _RGNDATA; +alias RGNDATA TRGNDATA; +alias RGNDATA* PRGNDATA; + +struct SCROLLINFO +{ + UINT cbSize; + UINT fMask; + int nMin; + int nMax; + UINT nPage; + int nPos; + int nTrackPos; +} + +alias SCROLLINFO* LPSCROLLINFO; +alias SCROLLINFO* LPCSCROLLINFO; +alias SCROLLINFO TAGSCROLLINFO; +alias SCROLLINFO TSCROLLINFO; +alias SCROLLINFO* PSCROLLINFO; + +struct SECURITY_ATTRIBUTES +{ + DWORD nLength; + LPVOID lpSecurityDescriptor; + WINBOOL bInheritHandle; +} + +alias SECURITY_ATTRIBUTES* LPSECURITY_ATTRIBUTES; +alias SECURITY_ATTRIBUTES _SECURITY_ATTRIBUTES; +alias SECURITY_ATTRIBUTES TSECURITYATTRIBUTES; +alias SECURITY_ATTRIBUTES* PSECURITYATTRIBUTES; +alias DWORD SECURITY_INFORMATION; +alias SECURITY_INFORMATION* PSECURITY_INFORMATION; +alias SECURITY_INFORMATION TSECURITYINFORMATION; +alias SECURITY_INFORMATION* PSECURITYINFORMATION; + +struct SELCHANGE +{ + NMHDR nmhdr; + CHARRANGE chrg; + ushort seltyp; +} + +alias SELCHANGE _SELCHANGE; +alias SELCHANGE TSELCHANGE; +alias SELCHANGE* PSELCHANGE; + +struct SERIALKEYS +{ + DWORD cbSize; + DWORD dwFlags; + LPSTR lpszActivePort; + LPSTR lpszPort; + DWORD iBaudRate; + DWORD iPortState; +} + +alias SERIALKEYS* LPSERIALKEYS; +alias SERIALKEYS TAGSERIALKEYS; +alias SERIALKEYS TSERIALKEYS; +alias SERIALKEYS* PSERIALKEYS; + +struct SERVICE_TABLE_ENTRY +{ + LPTSTR lpServiceName; + LPSERVICE_MAIN_FUNCTION lpServiceProc; +} + +alias SERVICE_TABLE_ENTRY* LPSERVICE_TABLE_ENTRY; +alias SERVICE_TABLE_ENTRY _SERVICE_TABLE_ENTRY; +alias SERVICE_TABLE_ENTRY TSERVICETABLEENTRY; +alias SERVICE_TABLE_ENTRY* PSERVICETABLEENTRY; + +struct SERVICE_TYPE_VALUE_ABS +{ + DWORD dwNameSpace; + DWORD dwValueType; + DWORD dwValueSize; + LPTSTR lpValueName; + PVOID lpValue; +} + +alias SERVICE_TYPE_VALUE_ABS _SERVICE_TYPE_VALUE_ABS; +alias SERVICE_TYPE_VALUE_ABS TSERVICETYPEVALUEABS; +alias SERVICE_TYPE_VALUE_ABS* PSERVICETYPEVALUEABS; + +struct SERVICE_TYPE_INFO_ABS +{ + LPTSTR lpTypeName; + DWORD dwValueCount; + SERVICE_TYPE_VALUE_ABS[1 + 0] Values; +} + +alias SERVICE_TYPE_INFO_ABS _SERVICE_TYPE_INFO_ABS; +alias SERVICE_TYPE_INFO_ABS TSERVICETYPEINFOABS; +alias SERVICE_TYPE_INFO_ABS* PSERVICETYPEINFOABS; + +struct SESSION_BUFFER +{ + UCHAR lsn; + UCHAR state; + UCHAR[1 + NCBNAMSZ-1] local_name; + UCHAR[1 + NCBNAMSZ-1] remote_name; + UCHAR rcvs_outstanding; + UCHAR sends_outstanding; +} + +alias SESSION_BUFFER _SESSION_BUFFER; +alias SESSION_BUFFER TSESSIONBUFFER; +alias SESSION_BUFFER* PSESSIONBUFFER; + +struct SESSION_HEADER +{ + UCHAR sess_name; + UCHAR num_sess; + UCHAR rcv_dg_outstanding; + UCHAR rcv_any_outstanding; +} + +alias SESSION_HEADER _SESSION_HEADER; +alias SESSION_HEADER TSESSIONHEADER; +alias SESSION_HEADER* PSESSIONHEADER; + +struct SET_PARTITION_INFORMATION +{ + ubyte PartitionType; +} + +alias SET_PARTITION_INFORMATION _SET_PARTITION_INFORMATION; +alias SET_PARTITION_INFORMATION TSETPARTITIONINFORMATION; +alias SET_PARTITION_INFORMATION* PSETPARTITIONINFORMATION; +alias int SHCONTF; +enum { SHCONTF_FOLDERS = 32, SHCONTF_NONFOLDERS = 64, SHCONTF_INCLUDEHIDDEN = 128, }; +alias SHCONTF TAGSHCONTF; +alias SHCONTF TSHCONTF; + +struct SHFILEINFO +{ + HICON hIcon; + int iIcon; + DWORD dwAttributes; + char[1 + MAX_PATH-1] szDisplayName; + char[1 + 79] szTypeName; +} + +alias SHFILEINFO _SHFILEINFO; +alias SHFILEINFO TSHFILEINFO; +alias SHFILEINFO* PSHFILEINFO; +alias ushort FILEOP_FLAGS; +alias FILEOP_FLAGS TFILEOPFLAGS; +alias FILEOP_FLAGS* PFILEOPFLAGS; + +struct SHFILEOPSTRUCT +{ + HWND hwnd; + UINT wFunc; + LPCSTR pFrom; + LPCSTR pTo; + FILEOP_FLAGS fFlags; + WINBOOL fAnyOperationsAborted; + LPVOID hNameMappings; + LPCSTR lpszProgressTitle; +} + +alias SHFILEOPSTRUCT* LPSHFILEOPSTRUCT; +alias SHFILEOPSTRUCT _SHFILEOPSTRUCT; +alias SHFILEOPSTRUCT TSHFILEOPSTRUCT; +alias SHFILEOPSTRUCT* PSHFILEOPSTRUCT; +alias int SHGNO; +enum { SHGDN_NORMAL = 0, SHGDN_INFOLDER = 1, SHGDN_FORPARSING = 0x8000, }; +alias SHGNO TAGSHGDN; +alias SHGNO TSHGDN; + +struct SHNAMEMAPPING +{ + LPSTR pszOldPath; + LPSTR pszNewPath; + int cchOldPath; + int cchNewPath; +} + +alias SHNAMEMAPPING* LPSHNAMEMAPPING; +alias SHNAMEMAPPING _SHNAMEMAPPING; +alias SHNAMEMAPPING TSHNAMEMAPPING; +alias SHNAMEMAPPING* PSHNAMEMAPPING; + +struct SID_AND_ATTRIBUTES +{ + PSID Sid; + DWORD Attributes; +} + +alias SID_AND_ATTRIBUTES _SID_AND_ATTRIBUTES; +alias SID_AND_ATTRIBUTES TSIDANDATTRIBUTES; +alias SID_AND_ATTRIBUTES* PSIDANDATTRIBUTES; +alias SID_AND_ATTRIBUTES[1 + ANYSIZE_ARRAY-1] SID_AND_ATTRIBUTES_ARRAY; +alias SID_AND_ATTRIBUTES_ARRAY* PSID_AND_ATTRIBUTES_ARRAY; +alias SID_AND_ATTRIBUTES_ARRAY TSIDANDATTRIBUTESARRAY; +alias SID_AND_ATTRIBUTES_ARRAY* PSIDANDATTRIBUTESARRAY; + +struct SINGLE_LIST_ENTRY +{ + _SINGLE_LIST_ENTRY* Next; +} + +alias SINGLE_LIST_ENTRY _SINGLE_LIST_ENTRY; +alias SINGLE_LIST_ENTRY TSINGLELISTENTRY; +alias SINGLE_LIST_ENTRY* PSINGLELISTENTRY; + +struct SOUNDSENTRY +{ + UINT cbSize; + DWORD dwFlags; + DWORD iFSTextEffect; + DWORD iFSTextEffectMSec; + DWORD iFSTextEffectColorBits; + DWORD iFSGrafEffect; + DWORD iFSGrafEffectMSec; + DWORD iFSGrafEffectColor; + DWORD iWindowsEffect; + DWORD iWindowsEffectMSec; + LPTSTR lpszWindowsEffectDLL; + DWORD iWindowsEffectOrdinal; +} + +alias SOUNDSENTRY* LPSOUNDSENTRY; +alias SOUNDSENTRY TAGSOUNDSENTRY; +alias SOUNDSENTRY TSOUNDSENTRY; +alias SOUNDSENTRY* PSOUNDSENTRY; + +struct STARTUPINFO +{ + DWORD cb; + LPTSTR lpReserved; + LPTSTR lpDesktop; + LPTSTR lpTitle; + DWORD dwX; + DWORD dwY; + DWORD dwXSize; + DWORD dwYSize; + DWORD dwXCountChars; + DWORD dwYCountChars; + DWORD dwFillAttribute; + DWORD dwFlags; + ushort wShowWindow; + ushort cbReserved2; + LPBYTE lpReserved2; + HANDLE hStdInput; + HANDLE hStdOutput; + HANDLE hStdError; +} + +alias STARTUPINFO* LPSTARTUPINFO; +alias STARTUPINFO _STARTUPINFO; +alias STARTUPINFO TSTARTUPINFO; +alias STARTUPINFO* PSTARTUPINFO; + +struct STICKYKEYS +{ + DWORD cbSize; + DWORD dwFlags; +} + +alias STICKYKEYS* LPSTICKYKEYS; +alias STICKYKEYS TAGSTICKYKEYS; +alias STICKYKEYS TSTICKYKEYS; +alias STICKYKEYS* PSTICKYKEYS; + +struct STRRET +{ + UINT uType; + + union + { + struct + { + LPWSTR pOleStr; + } + struct + { + UINT uOffset; + } + struct + { + char[1 + MAX_PATH-1] cStr; + } + } +} + +alias STRRET* LPSTRRET; +alias STRRET _STRRET; +alias STRRET TSTRRET; +alias STRRET* PSTRRET; + +struct STYLEBUF +{ + DWORD dwStyle; + char[1 + 31] szDescription; +} + +alias STYLEBUF* LPSTYLEBUF; +alias STYLEBUF _TAGSTYLEBUF; +alias STYLEBUF TSTYLEBUF; +alias STYLEBUF* PSTYLEBUF; + +struct STYLESTRUCT +{ + DWORD styleOld; + DWORD styleNew; +} + +alias STYLESTRUCT* LPSTYLESTRUCT; +alias STYLESTRUCT TAGSTYLESTRUCT; +alias STYLESTRUCT TSTYLESTRUCT; +alias STYLESTRUCT* PSTYLESTRUCT; + +struct SYSTEM_AUDIT_ACE +{ + ACE_HEADER Header; + ACCESS_MASK Mask; + DWORD SidStart; +} + +alias SYSTEM_AUDIT_ACE _SYSTEM_AUDIT_ACE; +alias SYSTEM_AUDIT_ACE TSYSTEMAUDITACE; +alias SYSTEM_AUDIT_ACE* PSYSTEMAUDITACE; + +struct SYSTEM_INFO_U +{ + + union + { + struct + { + DWORD dwOemId; + } + struct + { + ushort wProcessorArchitecture; + ushort wReserved; + } + } +} + + +struct SYSTEM_INFO +{ + SYSTEM_INFO_U u; + DWORD dwPageSize; + LPVOID lpMinimumApplicationAddress; + LPVOID lpMaximumApplicationAddress; + DWORD dwActiveProcessorMask; + DWORD dwNumberOfProcessors; + DWORD dwProcessorType; + DWORD dwAllocationGranularity; + ushort wProcessorLevel; + ushort wProcessorRevision; +} + +alias SYSTEM_INFO* LPSYSTEM_INFO; +alias SYSTEM_INFO _SYSTEM_INFO; +alias SYSTEM_INFO TSYSTEMINFO; +alias SYSTEM_INFO* PSYSTEMINFO; + +struct SYSTEM_POWER_STATUS +{ + ubyte ACLineStatus; + ubyte BatteryFlag; + ubyte BatteryLifePercent; + ubyte Reserved1; + DWORD BatteryLifeTime; + DWORD BatteryFullLifeTime; +} + +alias SYSTEM_POWER_STATUS _SYSTEM_POWER_STATUS; +alias SYSTEM_POWER_STATUS TSYSTEMPOWERSTATUS; +alias SYSTEM_POWER_STATUS* PSYSTEMPOWERSTATUS; +alias EMPTYRECORD* LPSYSTEM_POWER_STATUS; + +struct TAPE_ERASE +{ + ULONG _Type; +} + +alias TAPE_ERASE _TAPE_ERASE; +alias TAPE_ERASE TTAPEERASE; +alias TAPE_ERASE* PTAPEERASE; + +struct TAPE_GET_DRIVE_PARAMETERS +{ + ubyte ECC; + ubyte Compression; + ubyte DataPadding; + ubyte ReportSetmarks; + ULONG DefaultBlockSize; + ULONG MaximumBlockSize; + ULONG MinimumBlockSize; + ULONG MaximumPartitionCount; + ULONG FeaturesLow; + ULONG FeaturesHigh; + ULONG EOTWarningZoneSize; +} + +alias TAPE_GET_DRIVE_PARAMETERS _TAPE_GET_DRIVE_PARAMETERS; +alias TAPE_GET_DRIVE_PARAMETERS TTAPEGETDRIVEPARAMETERS; +alias TAPE_GET_DRIVE_PARAMETERS* PTAPEGETDRIVEPARAMETERS; + +struct TAPE_GET_MEDIA_PARAMETERS +{ + LARGE_INTEGER Capacity; + LARGE_INTEGER Remaining; + DWORD BlockSize; + DWORD PartitionCount; + ubyte WriteProtected; +} + +alias TAPE_GET_MEDIA_PARAMETERS _TAPE_GET_MEDIA_PARAMETERS; +alias TAPE_GET_MEDIA_PARAMETERS TTAPEGETMEDIAPARAMETERS; +alias TAPE_GET_MEDIA_PARAMETERS* PTAPEGETMEDIAPARAMETERS; + +struct TAPE_GET_POSITION +{ + ULONG _Type; + ULONG Partition; + ULONG OffsetLow; + ULONG OffsetHigh; +} + +alias TAPE_GET_POSITION _TAPE_GET_POSITION; +alias TAPE_GET_POSITION TTAPEGETPOSITION; +alias TAPE_GET_POSITION* PTAPEGETPOSITION; + +struct TAPE_PREPARE +{ + ULONG Operation; +} + +alias TAPE_PREPARE _TAPE_PREPARE; +alias TAPE_PREPARE TTAPEPREPARE; +alias TAPE_PREPARE* PTAPEPREPARE; + +struct TAPE_SET_DRIVE_PARAMETERS +{ + ubyte ECC; + ubyte Compression; + ubyte DataPadding; + ubyte ReportSetmarks; + ULONG EOTWarningZoneSize; +} + +alias TAPE_SET_DRIVE_PARAMETERS _TAPE_SET_DRIVE_PARAMETERS; +alias TAPE_SET_DRIVE_PARAMETERS TTAPESETDRIVEPARAMETERS; +alias TAPE_SET_DRIVE_PARAMETERS* PTAPESETDRIVEPARAMETERS; + +struct TAPE_SET_MEDIA_PARAMETERS +{ + ULONG BlockSize; +} + +alias TAPE_SET_MEDIA_PARAMETERS _TAPE_SET_MEDIA_PARAMETERS; +alias TAPE_SET_MEDIA_PARAMETERS TTAPESETMEDIAPARAMETERS; +alias TAPE_SET_MEDIA_PARAMETERS* PTAPESETMEDIAPARAMETERS; + +struct TAPE_SET_POSITION +{ + ULONG Method; + ULONG Partition; + ULONG OffsetLow; + ULONG OffsetHigh; +} + +alias TAPE_SET_POSITION _TAPE_SET_POSITION; +alias TAPE_SET_POSITION TTAPESETPOSITION; +alias TAPE_SET_POSITION* PTAPESETPOSITION; + +struct TAPE_WRITE_MARKS +{ + ULONG _Type; + ULONG Count; +} + +alias TAPE_WRITE_MARKS _TAPE_WRITE_MARKS; +alias TAPE_WRITE_MARKS TTAPEWRITEMARKS; +alias TAPE_WRITE_MARKS* PTAPEWRITEMARKS; + +struct TBADDBITMAP +{ + HINST hInst; + UINT nID; +} + +alias TBADDBITMAP* LPTBADDBITMAP; +alias TBADDBITMAP TTBADDBITMAP; +alias TBADDBITMAP* PTBADDBITMAP; + +struct TBBUTTON +{ + int iBitmap; + int idCommand; + ubyte fsState; + ubyte fsStyle; + DWORD dwData; + int iString; +} + +alias TBBUTTON* LPTBBUTTON; +alias TBBUTTON* LPCTBBUTTON; +alias TBBUTTON _TBBUTTON; +alias TBBUTTON TTBBUTTON; +alias TBBUTTON* PTBBUTTON; + +struct TBNOTIFY +{ + NMHDR hdr; + int iItem; + TBBUTTON tbButton; + int cchText; + LPTSTR pszText; +} + +alias TBNOTIFY* LPTBNOTIFY; +alias TBNOTIFY TTBNOTIFY; +alias TBNOTIFY* PTBNOTIFY; + +struct TBSAVEPARAMS +{ + HKEY hkr; + LPCTSTR pszSubKey; + LPCTSTR pszValueName; +} + +alias TBSAVEPARAMS TTBSAVEPARAMS; +alias TBSAVEPARAMS* PTBSAVEPARAMS; + +struct TC_HITTESTINFO +{ + POINT pt; + UINT flags; +} + +alias TC_HITTESTINFO _TC_HITTESTINFO; +alias TC_HITTESTINFO TTCHITTESTINFO; +alias TC_HITTESTINFO* PTCHITTESTINFO; + +struct TC_ITEM +{ + UINT mask; + UINT lpReserved1; + UINT lpReserved2; + LPTSTR pszText; + int cchTextMax; + int iImage; + LPARAM lParam; +} + +alias TC_ITEM _TC_ITEM; +alias TC_ITEM TTCITEM; +alias TC_ITEM* PTCITEM; + +struct TC_ITEMHEADER +{ + UINT mask; + UINT lpReserved1; + UINT lpReserved2; + LPTSTR pszText; + int cchTextMax; + int iImage; +} + +alias TC_ITEMHEADER _TC_ITEMHEADER; +alias TC_ITEMHEADER TTCITEMHEADER; +alias TC_ITEMHEADER* PTCITEMHEADER; + +struct TC_KEYDOWN +{ + NMHDR hdr; + ushort wVKey; + UINT flags; +} + +alias TC_KEYDOWN _TC_KEYDOWN; +alias TC_KEYDOWN TTCKEYDOWN; +alias TC_KEYDOWN* PTCKEYDOWN; + +struct TEXTRANGE +{ + CHARRANGE chrg; + LPSTR lpstrText; +} + +alias TEXTRANGE _TEXTRANGE; +alias TEXTRANGE TTEXTRANGE; +alias TEXTRANGE* PTEXTRANGE; + +struct TIME_ZONE_INFORMATION +{ + LONG Bias; + WCHAR[1 + 31] StandardName; + SYSTEMTIME StandardDate; + LONG StandardBias; + WCHAR[1 + 31] DaylightName; + SYSTEMTIME DaylightDate; + LONG DaylightBias; +} + +alias TIME_ZONE_INFORMATION* LPTIME_ZONE_INFORMATION; +alias TIME_ZONE_INFORMATION _TIME_ZONE_INFORMATION; +alias TIME_ZONE_INFORMATION TTIMEZONEINFORMATION; +alias TIME_ZONE_INFORMATION* PTIMEZONEINFORMATION; + +struct TOGGLEKEYS +{ + DWORD cbSize; + DWORD dwFlags; +} + +alias TOGGLEKEYS TAGTOGGLEKEYS; +alias TOGGLEKEYS TTOGGLEKEYS; +alias TOGGLEKEYS* PTOGGLEKEYS; + +struct TOKEN_SOURCE +{ + char[1 + 7] SourceName; + LUID SourceIdentifier; +} + +alias TOKEN_SOURCE _TOKEN_SOURCE; +alias TOKEN_SOURCE TTOKENSOURCE; +alias TOKEN_SOURCE* PTOKENSOURCE; + +struct TOKEN_CONTROL +{ + LUID TokenId; + LUID AuthenticationId; + LUID ModifiedId; + TOKEN_SOURCE TokenSource; +} + +alias TOKEN_CONTROL _TOKEN_CONTROL; +alias TOKEN_CONTROL TTOKENCONTROL; +alias TOKEN_CONTROL* PTOKENCONTROL; + +struct TOKEN_DEFAULT_DACL +{ + PACL DefaultDacl; +} + +alias TOKEN_DEFAULT_DACL _TOKEN_DEFAULT_DACL; +alias TOKEN_DEFAULT_DACL TTOKENDEFAULTDACL; +alias TOKEN_DEFAULT_DACL* PTOKENDEFAULTDACL; + +struct TOKEN_GROUPS +{ + DWORD GroupCount; + SID_AND_ATTRIBUTES[1 + ANYSIZE_ARRAY-1] Groups; +} + +alias TOKEN_GROUPS* PTOKEN_GROUPS; +alias TOKEN_GROUPS* LPTOKEN_GROUPS; +alias TOKEN_GROUPS _TOKEN_GROUPS; +alias TOKEN_GROUPS TTOKENGROUPS; +alias TOKEN_GROUPS* PTOKENGROUPS; + +struct TOKEN_OWNER +{ + PSID Owner; +} + +alias TOKEN_OWNER _TOKEN_OWNER; +alias TOKEN_OWNER TTOKENOWNER; +alias TOKEN_OWNER* PTOKENOWNER; + +struct TOKEN_PRIMARY_GROUP +{ + PSID PrimaryGroup; +} + +alias TOKEN_PRIMARY_GROUP _TOKEN_PRIMARY_GROUP; +alias TOKEN_PRIMARY_GROUP TTOKENPRIMARYGROUP; +alias TOKEN_PRIMARY_GROUP* PTOKENPRIMARYGROUP; + +struct TOKEN_PRIVILEGES +{ + DWORD PrivilegeCount; + LUID_AND_ATTRIBUTES[1 + ANYSIZE_ARRAY-1] Privileges; +} + +alias TOKEN_PRIVILEGES* PTOKEN_PRIVILEGES; +alias TOKEN_PRIVILEGES* LPTOKEN_PRIVILEGES; +alias TOKEN_PRIVILEGES _TOKEN_PRIVILEGES; +alias TOKEN_PRIVILEGES TTOKENPRIVILEGES; +alias TOKEN_PRIVILEGES* PTOKENPRIVILEGES; + +struct TOKEN_STATISTICS +{ + LUID TokenId; + LUID AuthenticationId; + LARGE_INTEGER ExpirationTime; + TOKEN_TYPE TokenType; + SECURITY_IMPERSONATION_LEVEL ImpersonationLevel; + DWORD DynamicCharged; + DWORD DynamicAvailable; + DWORD GroupCount; + DWORD PrivilegeCount; + LUID ModifiedId; +} + +alias TOKEN_STATISTICS _TOKEN_STATISTICS; +alias TOKEN_STATISTICS TTOKENSTATISTICS; +alias TOKEN_STATISTICS* PTOKENSTATISTICS; + +struct TOKEN_USER +{ + SID_AND_ATTRIBUTES User; +} + +alias TOKEN_USER _TOKEN_USER; +alias TOKEN_USER TTOKENUSER; +alias TOKEN_USER* PTOKENUSER; + +struct TOOLINFO +{ + UINT cbSize; + UINT uFlags; + HWND hwnd; + UINT uId; + RECT rect; + HINST hinst; + LPTSTR lpszText; +} + +alias TOOLINFO* LPTOOLINFO; +alias TOOLINFO TTOOLINFO; +alias TOOLINFO* PTOOLINFO; + +struct TOOLTIPTEXT +{ + NMHDR hdr; + LPTSTR lpszText; + char[1 + 79] szText; + HINST hinst; + UINT uFlags; +} + +alias TOOLTIPTEXT* LPTOOLTIPTEXT; +alias TOOLTIPTEXT TTOOLTIPTEXT; +alias TOOLTIPTEXT* PTOOLTIPTEXT; + +struct TPMPARAMS +{ + UINT cbSize; + RECT rcExclude; +} + +alias TPMPARAMS* LPTPMPARAMS; +alias TPMPARAMS TAGTPMPARAMS; +alias TPMPARAMS TTPMPARAMS; +alias TPMPARAMS* PTPMPARAMS; + +struct TRANSMIT_FILE_BUFFERS +{ + PVOID Head; + DWORD HeadLength; + PVOID Tail; + DWORD TailLength; +} + +alias TRANSMIT_FILE_BUFFERS _TRANSMIT_FILE_BUFFERS; +alias TRANSMIT_FILE_BUFFERS TTRANSMITFILEBUFFERS; +alias TRANSMIT_FILE_BUFFERS* PTRANSMITFILEBUFFERS; + +struct TTHITTESTINFO +{ + HWND hwnd; + POINT pt; + TOOLINFO ti; +} + +alias TTHITTESTINFO* LPHITTESTINFO; +alias TTHITTESTINFO _TT_HITTESTINFO; +alias TTHITTESTINFO TTTHITTESTINFO; +alias TTHITTESTINFO* PTTHITTESTINFO; + +struct TTPOLYCURVE +{ + ushort wType; + ushort cpfx; + POINTFX[1 + 0] apfx; +} + +alias TTPOLYCURVE* LPTTPOLYCURVE; +alias TTPOLYCURVE TAGTTPOLYCURVE; +alias TTPOLYCURVE TTTPOLYCURVE; +alias TTPOLYCURVE* PTTPOLYCURVE; + +struct TTPOLYGONHEADER +{ + DWORD cb; + DWORD dwType; + POINTFX pfxStart; +} + +alias TTPOLYGONHEADER* LPTTPOLYGONHEADER; +alias TTPOLYGONHEADER _TTPOLYGONHEADER; +alias TTPOLYGONHEADER TTTPOLYGONHEADER; +alias TTPOLYGONHEADER* PTTPOLYGONHEADER; + +struct TV_DISPINFO +{ + NMHDR hdr; + TV_ITEM item; +} + +alias TV_DISPINFO _TV_DISPINFO; +alias TV_DISPINFO TTVDISPINFO; +alias TV_DISPINFO* PTVDISPINFO; + +struct TV_HITTESTINFO +{ + POINT pt; + UINT flags; + HTREEITEM hItem; +} + +alias TV_HITTESTINFO* LPTV_HITTESTINFO; +alias TV_HITTESTINFO _TVHITTESTINFO; +alias TV_HITTESTINFO TTVHITTESTINFO; +alias TV_HITTESTINFO* PTVHITTESTINFO; + +struct TV_INSERTSTRUCT +{ + HTREEITEM hParent; + HTREEITEM hInsertAfter; + TV_ITEM item; +} + +alias TV_INSERTSTRUCT* LPTV_INSERTSTRUCT; +alias TV_INSERTSTRUCT _TV_INSERTSTRUCT; +alias TV_INSERTSTRUCT TTVINSERTSTRUCT; +alias TV_INSERTSTRUCT* PTVINSERTSTRUCT; + +struct TV_KEYDOWN +{ + NMHDR hdr; + ushort wVKey; + UINT flags; +} + +alias TV_KEYDOWN _TV_KEYDOWN; +alias TV_KEYDOWN TTVKEYDOWN; +alias TV_KEYDOWN* PTVKEYDOWN; + +struct TV_SORTCB +{ + HTREEITEM hParent; + PFNTVCOMPARE lpfnCompare; + LPARAM lParam; +} + +alias TV_SORTCB* LPTV_SORTCB; +alias TV_SORTCB _TV_SORTCB; +alias TV_SORTCB TTVSORTCB; +alias TV_SORTCB* PTVSORTCB; + +struct UDACCEL +{ + UINT nSec; + UINT nInc; +} + +alias UDACCEL TUDACCEL; +alias UDACCEL* PUDACCEL; + +struct ULARGE_INTEGER +{ + DWORD LowPart; + DWORD HighPart; +} + +alias ULARGE_INTEGER* PULARGE_INTEGER; +alias ULARGE_INTEGER _ULARGE_INTEGER; +alias ULARGE_INTEGER TULARGEINTEGER; +alias ULARGE_INTEGER* PULARGEINTEGER; + +struct UNIVERSAL_NAME_INFO +{ + LPTSTR lpUniversalName; +} + +alias UNIVERSAL_NAME_INFO _UNIVERSAL_NAME_INFO; +alias UNIVERSAL_NAME_INFO TUNIVERSALNAMEINFO; +alias UNIVERSAL_NAME_INFO* PUNIVERSALNAMEINFO; + +struct USEROBJECTFLAGS +{ + WINBOOL fInherit; + WINBOOL fReserved; + DWORD dwFlags; +} + +alias USEROBJECTFLAGS TAGUSEROBJECTFLAGS; +alias USEROBJECTFLAGS TUSEROBJECTFLAGS; +alias USEROBJECTFLAGS* PUSEROBJECTFLAGS; + +struct VALENT +{ + LPTSTR ve_valuename; + DWORD ve_valuelen; + DWORD ve_valueptr; + DWORD ve_type; +} + +alias VALENT TVALENT; +alias VALENT* PVALENT; +alias VALENT VALUE_ENT; +alias VALENT TVALUE_ENT; +alias VALENT* PVALUE_ENT; + +struct VERIFY_INFORMATION +{ + LARGE_INTEGER StartingOffset; + DWORD Length; +} + +alias VERIFY_INFORMATION _VERIFY_INFORMATION; +alias VERIFY_INFORMATION TVERIFYINFORMATION; +alias VERIFY_INFORMATION* PVERIFYINFORMATION; + +struct VS_FIXEDFILEINFO +{ + DWORD dwSignature; + DWORD dwStrucVersion; + DWORD dwFileVersionMS; + DWORD dwFileVersionLS; + DWORD dwProductVersionMS; + DWORD dwProductVersionLS; + DWORD dwFileFlagsMask; + DWORD dwFileFlags; + DWORD dwFileOS; + DWORD dwFileType; + DWORD dwFileSubtype; + DWORD dwFileDateMS; + DWORD dwFileDateLS; +} + +alias VS_FIXEDFILEINFO _VS_FIXEDFILEINFO; +alias VS_FIXEDFILEINFO TVSFIXEDFILEINFO; +alias VS_FIXEDFILEINFO* PVSFIXEDFILEINFO; + +struct WIN32_FIND_DATA +{ + DWORD dwFileAttributes; + FILETIME ftCreationTime; + FILETIME ftLastAccessTime; + FILETIME ftLastWriteTime; + DWORD nFileSizeHigh; + DWORD nFileSizeLow; + DWORD dwReserved0; + DWORD dwReserved1; + TCHAR[1 + MAX_PATH-1] cFileName; + TCHAR[1 + 13] cAlternateFileName; +} + +alias WIN32_FIND_DATA* LPWIN32_FIND_DATA; +alias WIN32_FIND_DATA* PWIN32_FIND_DATA; +alias WIN32_FIND_DATA _WIN32_FIND_DATA; +alias WIN32_FIND_DATA TWIN32FINDDATA; +alias WIN32_FIND_DATA TWIN32FINDDATAA; +alias WIN32_FIND_DATA* PWIN32FINDDATA; + +struct WIN32_FIND_DATAW { + DWORD dwFileAttributes; + FILETIME ftCreationTime; + FILETIME ftLastAccessTime; + FILETIME ftLastWriteTime; + DWORD nFileSizeHigh; + DWORD nFileSizeLow; + DWORD dwReserved0; + DWORD dwReserved1; + WCHAR cFileName[MAX_PATH]; + WCHAR cAlternateFileName[14]; +} + +alias WIN32_FIND_DATAW* LPWIN32_FIND_DATAW; +alias WIN32_FIND_DATAW* PWIN32_FIND_DATAW; + +struct WIN32_FILE_ATTRIBUTE_DATA { + DWORD dwFileAttributes; + FILETIME ftCreationTime; + FILETIME ftLastAccessTime; + FILETIME ftLastWriteTime; + DWORD nFileSizeHigh; + DWORD nFileSizeLow; +} + +enum { + GetFileInfoLevelStandard, + GetFileInfoLevelMax +} + +struct WIN32_STREAM_ID +{ + DWORD dwStreamId; + DWORD dwStreamAttributes; + LARGE_INTEGER Size; + DWORD dwStreamNameSize; + WCHAR* cStreamName; +} + +alias WIN32_STREAM_ID _WIN32_STREAM_ID; +alias WIN32_STREAM_ID TWIN32STREAMID; +alias WIN32_STREAM_ID* PWIN32STREAMID; + +struct WINDOWPLACEMENT +{ + UINT length; + UINT flags; + UINT showCmd; + POINT ptMinPosition; + POINT ptMaxPosition; + RECT rcNormalPosition; +} + +alias WINDOWPLACEMENT _WINDOWPLACEMENT; +alias WINDOWPLACEMENT TWINDOWPLACEMENT; +alias WINDOWPLACEMENT* PWINDOWPLACEMENT; + +struct WNDCLASS +{ + UINT style; + WNDPROC lpfnWndProc; + int cbClsExtra; + int cbWndExtra; + HANDLE hInstance; + HICON hIcon; + HCURSOR hCursor; + HBRUSH hbrBackground; + LPCTSTR lpszMenuName; + LPCTSTR lpszClassName; +} + +alias WNDCLASS* LPWNDCLASS; +alias WNDCLASS _WNDCLASS; +alias WNDCLASS TWNDCLASS; +alias WNDCLASS TWNDCLASSA; +alias WNDCLASS* PWNDCLASS; + +struct WNDCLASSEX +{ + UINT cbSize; + UINT style; + WNDPROC lpfnWndProc; + int cbClsExtra; + int cbWndExtra; + HANDLE hInstance; + HICON hIcon; + HCURSOR hCursor; + HBRUSH hbrBackground; + LPCTSTR lpszMenuName; + LPCTSTR lpszClassName; + HANDLE hIconSm; +} + +alias WNDCLASSEX* LPWNDCLASSEX; +alias WNDCLASSEX _WNDCLASSEX; +alias WNDCLASSEX TWNDCLASSEX; +alias WNDCLASSEX TWNDCLASSEXA; +alias WNDCLASSEX* PWNDCLASSEX; + +struct CONNECTDLGSTRUCT +{ + DWORD cbStructure; + HWND hwndOwner; + LPNETRESOURCE lpConnRes; + DWORD dwFlags; + DWORD dwDevNum; +} + +alias CONNECTDLGSTRUCT* LPCONNECTDLGSTRUCT; +alias CONNECTDLGSTRUCT _CONNECTDLGSTRUCT; +alias CONNECTDLGSTRUCT TCONNECTDLGSTRUCT; +alias CONNECTDLGSTRUCT* PCONNECTDLGSTRUCT; + +struct DISCDLGSTRUCT +{ + DWORD cbStructure; + HWND hwndOwner; + LPTSTR lpLocalName; + LPTSTR lpRemoteName; + DWORD dwFlags; +} + +alias DISCDLGSTRUCT* LPDISCDLGSTRUCT; +alias DISCDLGSTRUCT _DISCDLGSTRUCT; +alias DISCDLGSTRUCT TDISCDLGSTRUCT; +alias DISCDLGSTRUCT TDISCDLGSTRUCTA; +alias DISCDLGSTRUCT* PDISCDLGSTRUCT; + +struct NETINFOSTRUCT +{ + DWORD cbStructure; + DWORD dwProviderVersion; + DWORD dwStatus; + DWORD dwCharacteristics; + DWORD dwHandle; + ushort wNetType; + DWORD dwPrinters; + DWORD dwDrives; +} + +alias NETINFOSTRUCT* LPNETINFOSTRUCT; +alias NETINFOSTRUCT _NETINFOSTRUCT; +alias NETINFOSTRUCT TNETINFOSTRUCT; +alias NETINFOSTRUCT* PNETINFOSTRUCT; + +struct NETCONNECTINFOSTRUCT +{ + DWORD cbStructure; + DWORD dwFlags; + DWORD dwSpeed; + DWORD dwDelay; + DWORD dwOptDataSize; +} + +alias NETCONNECTINFOSTRUCT* LPNETCONNECTINFOSTRUCT; +alias NETCONNECTINFOSTRUCT _NETCONNECTINFOSTRUCT; +alias NETCONNECTINFOSTRUCT TNETCONNECTINFOSTRUCT; +alias NETCONNECTINFOSTRUCT* PNETCONNECTINFOSTRUCT; +extern(Windows){ +alias int (*ENUMMETAFILEPROC)(HDC, HANDLETABLE, METARECORD, int, LPARAM); +alias int (*ENHMETAFILEPROC)(HDC, HANDLETABLE, ENHMETARECORD, int, LPARAM); +alias int (*ENUMFONTSPROC)(LPLOGFONT, LPTEXTMETRIC, DWORD, LPARAM); +alias int (*FONTENUMPROC)(ENUMLOGFONT*, NEWTEXTMETRIC*, int, LPARAM); +alias int (*FONTENUMEXPROC)(ENUMLOGFONTEX*, NEWTEXTMETRICEX*, int, LPARAM); +alias void (*LPOVERLAPPED_COMPLETION_ROUTINE)(DWORD, DWORD); +} + +struct POINTFLOAT +{ + FLOAT x; + FLOAT y; +} + +alias POINTFLOAT _POINTFLOAT; +alias POINTFLOAT TPOINTFLOAT; +alias POINTFLOAT* PPOINTFLOAT; + +struct GLYPHMETRICSFLOAT +{ + FLOAT gmfBlackBoxX; + FLOAT gmfBlackBoxY; + POINTFLOAT gmfptGlyphOrigin; + FLOAT gmfCellIncX; + FLOAT gmfCellIncY; +} + +alias GLYPHMETRICSFLOAT* LPGLYPHMETRICSFLOAT; +alias GLYPHMETRICSFLOAT _GLYPHMETRICSFLOAT; +alias GLYPHMETRICSFLOAT TGLYPHMETRICSFLOAT; +alias GLYPHMETRICSFLOAT* PGLYPHMETRICSFLOAT; + +struct LAYERPLANEDESCRIPTOR +{ + ushort nSize; + ushort nVersion; + DWORD dwFlags; + ubyte iPixelType; + ubyte cColorBits; + ubyte cRedBits; + ubyte cRedShift; + ubyte cGreenBits; + ubyte cGreenShift; + ubyte cBlueBits; + ubyte cBlueShift; + ubyte cAlphaBits; + ubyte cAlphaShift; + ubyte cAccumBits; + ubyte cAccumRedBits; + ubyte cAccumGreenBits; + ubyte cAccumBlueBits; + ubyte cAccumAlphaBits; + ubyte cDepthBits; + ubyte cStencilBits; + ubyte cAuxBuffers; + ubyte iLayerPlane; + ubyte bReserved; + COLORREF crTransparent; +} + +alias LAYERPLANEDESCRIPTOR* LPLAYERPLANEDESCRIPTOR; +alias LAYERPLANEDESCRIPTOR TAGLAYERPLANEDESCRIPTOR; +alias LAYERPLANEDESCRIPTOR TLAYERPLANEDESCRIPTOR; +alias LAYERPLANEDESCRIPTOR* PLAYERPLANEDESCRIPTOR; + +struct PIXELFORMATDESCRIPTOR +{ + ushort nSize; + ushort nVersion; + DWORD dwFlags; + ubyte iPixelType; + ubyte cColorBits; + ubyte cRedBits; + ubyte cRedShift; + ubyte cGreenBits; + ubyte cGreenShift; + ubyte cBlueBits; + ubyte cBlueShift; + ubyte cAlphaBits; + ubyte cAlphaShift; + ubyte cAccumBits; + ubyte cAccumRedBits; + ubyte cAccumGreenBits; + ubyte cAccumBlueBits; + ubyte cAccumAlphaBits; + ubyte cDepthBits; + ubyte cStencilBits; + ubyte cAuxBuffers; + ubyte iLayerType; + ubyte bReserved; + DWORD dwLayerMask; + DWORD dwVisibleMask; + DWORD dwDamageMask; +} + +alias PIXELFORMATDESCRIPTOR* LPPIXELFORMATDESCRIPTOR; +alias PIXELFORMATDESCRIPTOR TAGPIXELFORMATDESCRIPTOR; +alias PIXELFORMATDESCRIPTOR TPIXELFORMATDESCRIPTOR; +alias PIXELFORMATDESCRIPTOR* PPIXELFORMATDESCRIPTOR; + +struct USER_INFO_2 +{ + LPWSTR usri2_name; + LPWSTR usri2_password; + DWORD usri2_password_age; + DWORD usri2_priv; + LPWSTR usri2_home_dir; + LPWSTR usri2_comment; + DWORD usri2_flags; + LPWSTR usri2_script_path; + DWORD usri2_auth_flags; + LPWSTR usri2_full_name; + LPWSTR usri2_usr_comment; + LPWSTR usri2_parms; + LPWSTR usri2_workstations; + DWORD usri2_last_logon; + DWORD usri2_last_logoff; + DWORD usri2_acct_expires; + DWORD usri2_max_storage; + DWORD usri2_units_per_week; + PBYTE usri2_logon_hours; + DWORD usri2_bad_pw_count; + DWORD usri2_num_logons; + LPWSTR usri2_logon_server; + DWORD usri2_country_code; + DWORD usri2_code_page; +} + +alias USER_INFO_2* PUSER_INFO_2; +alias USER_INFO_2* LPUSER_INFO_2; +alias USER_INFO_2 TUSERINFO2; +alias USER_INFO_2* PUSERINFO2; + +struct USER_INFO_0 +{ + LPWSTR usri0_name; +} + +alias USER_INFO_0* PUSER_INFO_0; +alias USER_INFO_0* LPUSER_INFO_0; +alias USER_INFO_0 TUSERINFO0; +alias USER_INFO_0* PUSERINFO0; + +struct USER_INFO_3 +{ + LPWSTR usri3_name; + LPWSTR usri3_password; + DWORD usri3_password_age; + DWORD usri3_priv; + LPWSTR usri3_home_dir; + LPWSTR usri3_comment; + DWORD usri3_flags; + LPWSTR usri3_script_path; + DWORD usri3_auth_flags; + LPWSTR usri3_full_name; + LPWSTR usri3_usr_comment; + LPWSTR usri3_parms; + LPWSTR usri3_workstations; + DWORD usri3_last_logon; + DWORD usri3_last_logoff; + DWORD usri3_acct_expires; + DWORD usri3_max_storage; + DWORD usri3_units_per_week; + PBYTE usri3_logon_hours; + DWORD usri3_bad_pw_count; + DWORD usri3_num_logons; + LPWSTR usri3_logon_server; + DWORD usri3_country_code; + DWORD usri3_code_page; + DWORD usri3_user_id; + DWORD usri3_primary_group_id; + LPWSTR usri3_profile; + LPWSTR usri3_home_dir_drive; + DWORD usri3_password_expired; +} + +alias USER_INFO_3* PUSER_INFO_3; +alias USER_INFO_3* LPUSER_INFO_3; +alias USER_INFO_3 TUSERINFO3; +alias USER_INFO_3* PUSERINFO3; + +struct GROUP_INFO_2 +{ + LPWSTR grpi2_name; + LPWSTR grpi2_comment; + DWORD grpi2_group_id; + DWORD grpi2_attributes; +} + +alias GROUP_INFO_2* PGROUP_INFO_2; +alias GROUP_INFO_2 TGROUPINFO2; +alias GROUP_INFO_2* PGROUPINFO2; + +struct LOCALGROUP_INFO_0 +{ + LPWSTR lgrpi0_name; +} + +alias LOCALGROUP_INFO_0* PLOCALGROUP_INFO_0; +alias LOCALGROUP_INFO_0* LPLOCALGROUP_INFO_0; +alias LOCALGROUP_INFO_0 TLOCALGROUPINFO0; +alias LOCALGROUP_INFO_0* PLOCALGROUPINFO0; + +struct IMAGE_DOS_HEADER +{ + ushort e_magic; + ushort e_cblp; + ushort e_cp; + ushort e_crlc; + ushort e_cparhdr; + ushort e_minalloc; + ushort e_maxalloc; + ushort e_ss; + ushort e_sp; + ushort e_csum; + ushort e_ip; + ushort e_cs; + ushort e_lfarlc; + ushort e_ovno; + ushort[1 + 3] e_res; + ushort e_oemid; + ushort e_oeminfo; + ushort[1 + 9] e_res2; + LONG e_lfanew; +} + +alias IMAGE_DOS_HEADER* PIMAGE_DOS_HEADER; +alias IMAGE_DOS_HEADER TIMAGEDOSHEADER; +alias IMAGE_DOS_HEADER* PIMAGEDOSHEADER; +alias ushort TVARTYPE; +alias TVARIANT* PVARIANT; + +struct TVARIANT +{ + TVARTYPE vt; + ushort wReserved1; + ushort wReserved2; + ushort wReserved3; + + union + { + struct + { + ubyte bVal; + } + struct + { + byte iVal; + } + struct + { + int lVal; + } + struct + { + float fltVal; + } + struct + { + double dblVal; + } + struct + { + ushort vbool; + } + struct + { + HRESULT scode; + } + struct + { + ubyte* pbVal; + } + struct + { + byte* piVal; + } + struct + { + int* plVal; + } + struct + { + float* pfltVal; + } + struct + { + double* pdblVal; + } + struct + { + ushort* pbool; + } + struct + { + HRESULT* pscode; + } + struct + { + POINTER byRef; + } + } +} + +alias TVARIANT VARIANT; +alias int MMRESULT; +alias TWAVEFORMATEX* PWAVEFORMATEX; + +align(1) struct TWAVEFORMATEX +{ + ushort wFormatTag; + ushort nChannels; + DWORD nSamplesPerSec; + DWORD nAvgBytesPerSec; + ushort nBlockAlign; + ushort wBitsPerSample; + ushort cbSize; +} + +alias CRITICAL_SECTION TRTLCRITICALSECTION; +alias PCRITICAL_SECTION PRTLCRITICALSECTION; +alias PGUID PIID; +alias TGUID TIID; +alias HANDLE THANDLE; +alias TSMALLRECT* PSMALLRECT; +alias SMALL_RECT TSMALLRECT; +alias TCHARINFO* PCHARINFO; +alias _CHAR_INFO TCHARINFO; +alias POINTER TFARPROC; +alias POINTER TFNDLGPROC; +alias POINTER TFNTHREADSTARTROUTINE; + +struct _OBJECT_TYPE_LIST +{ + ushort Level; + ushort Sbz; + PGUID ObjectType; +} + +alias _OBJECT_TYPE_LIST TOBJECTTYPELIST; +alias TOBJECTTYPELIST* POBJECTTYPELIST; +alias _OBJECT_TYPE_LIST OBJECT_TYPE_LIST; +alias DWORD AUDIT_EVENT_TYPE; + +align(1) struct _BLENDFUNCTION +{ + ubyte BlendOp; + ubyte BlendFlags; + ubyte SourceConstantAlpha; + ubyte AlphaFormat; +} + +alias _BLENDFUNCTION TBLENDFUNCTION; +alias TBLENDFUNCTION* PBLENDFUNCTION; +alias _BLENDFUNCTION BLENDFUNCTION; + +alias HANDLE HMONITOR; + +struct tagMONITORINFOEX +{ + DWORD cbSize; + RECT rcMonitor; + RECT rcWork; + DWORD dwFlags; + TCHAR szDevice[CCHDEVICENAME]; +} +alias tagMONITORINFOEX MONITORINFOEX; +alias MONITORINFOEX* LPMONITORINFOEX; + +struct tagMONITORINFO +{ + DWORD cbSize; + RECT rcMonitor; + RECT rcWork; + DWORD dwFlags; +} +alias tagMONITORINFO MONITORINFO; +alias MONITORINFO* LPMONITORINFO; + +struct WINDOWINFO +{ + DWORD cbSize; + RECT rcWindow; + RECT rcClient; + DWORD dwStyle; + DWORD dwExStyle; + DWORD dwWindowStatus; + UINT cxWindowBorders; + UINT cyWindowBorders; + ATOM atomWindowType; + short wCreatorVersion; +}; +alias WINDOWINFO* PWINDOWINFO; +alias WINDOWINFO* LPWINDOWINFO; + +/* +int S_OK = (0x00000000); +int S_FALSE = (0x00000001); +int NOERROR = (0); +int E_UNEXPECTED = (DWORD)((0x8000FFFF)); +int E_NOTIMPL = (DWORD)((0x80004001)); +int E_OUTOFMEMORY = (DWORD)((0x8007000E)); +int E_INVALIDARG = (DWORD)((0x80070057)); +int E_NOINTERFACE = (DWORD)((0x80004002)); +int E_POINTER = (DWORD)((0x80004003)); +int E_HANDLE = (DWORD)((0x80070006)); +int E_ABORT = (DWORD)((0x80004004)); +int E_FAIL = (DWORD)((0x80004005)); +int E_ACCESSDENIED = (DWORD)((0x80070005)); +int E_PENDING = (DWORD)((0x8000000A)); +int CO_E_INIT_TLS = (DWORD)((0x80004006)); +int CO_E_INIT_MEMORY_ALLOCATOR = (DWORD)((0x80004008)); +int CO_E_INIT_CLASS_CACHE = (DWORD)((0x80004009)); +int CO_E_INIT_RPC_CHANNEL = (DWORD)((0x8000400A)); +int CO_E_INIT_TLS_SET_CHANNEL_CONTROL = (DWORD)((0x8000400B)); +int CO_E_INIT_TLS_CHANNEL_CONTROL = (DWORD)((0x8000400C)); +int CO_E_INIT_UNACCEPTED_USER_ALLOCATOR = (DWORD)((0x8000400D)); +int CO_E_INIT_SCM_MUTEX_EXISTS = (DWORD)((0x8000400E)); +int CO_E_INIT_SCM_FILE_MAPPING_EXISTS = (DWORD)((0x8000400F)); +int CO_E_INIT_SCM_MAP_VIEW_OF_FILE = (DWORD)((0x80004010)); +int CO_E_INIT_SCM_EXEC_FAILURE = (DWORD)((0x80004011)); +int CO_E_INIT_ONLY_SINGLE_THREADED = (DWORD)((0x80004012)); +int CO_E_CANT_REMOTE = (DWORD)((0x80004013)); +int CO_E_BAD_SERVER_NAME = (DWORD)((0x80004014)); +int CO_E_WRONG_SERVER_IDENTITY = (DWORD)((0x80004015)); +int CO_E_OLE1DDE_DISABLED = (DWORD)((0x80004016)); +int CO_E_RUNAS_SYNTAX = (DWORD)((0x80004017)); +int CO_E_CREATEPROCESS_FAILURE = (DWORD)((0x80004018)); +int CO_E_RUNAS_CREATEPROCESS_FAILURE = (DWORD)((0x80004019)); +int CO_E_RUNAS_LOGON_FAILURE = (DWORD)((0x8000401A)); +int CO_E_LAUNCH_PERMSSION_DENIED = (DWORD)((0x8000401B)); +int CO_E_START_SERVICE_FAILURE = (DWORD)((0x8000401C)); +int CO_E_REMOTE_COMMUNICATION_FAILURE = (DWORD)((0x8000401D)); +int CO_E_SERVER_START_TIMEOUT = (DWORD)((0x8000401E)); +int CO_E_CLSREG_INCONSISTENT = (DWORD)((0x8000401F)); +int CO_E_IIDREG_INCONSISTENT = (DWORD)((0x80004020)); +int CO_E_NOT_SUPPORTED = (DWORD)((0x80004021)); +int CO_E_FIRST = (DWORD)((0x800401F0)); +int CO_E_LAST = (DWORD)((0x800401FF)); +int CO_S_FIRST = (0x401F0); +int CO_E_NOTINITIALIZED = (DWORD)((0x800401F0)); +int CO_E_ALREADYINITIALIZED = (DWORD)((0x800401F1)); +int CO_E_CANTDETERMINECLASS = (DWORD)((0x800401F2)); +int CO_E_CLASSSTRING = (DWORD)((0x800401F3)); +int CO_E_IIDSTRING = (DWORD)((0x800401F4)); +int CO_E_APPNOTFOUND = (DWORD)((0x800401F5)); +int CO_E_APPSINGLEUSE = (DWORD)((0x800401F6)); +int CO_E_ERRORINAPP = (DWORD)((0x800401F7)); +int CO_E_DLLNOTFOUND = (DWORD)((0x800401F8)); +int CO_E_ERRORINDLL = (DWORD)((0x800401F9)); +int CO_E_WRONGOSFORAPP = (DWORD)((0x800401FA)); +int CO_E_OBJNOTREG = (DWORD)((0x800401FB)); +int CO_E_OBJISREG = (DWORD)((0x800401FC)); +int CO_E_OBJNOTCONNECTED = (DWORD)((0x800401FD)); +int CO_E_APPDIDNTREG = (DWORD)((0x800401FE)); +int CO_E_RELEASED = (DWORD)((0x800401FF)); +*/ \ No newline at end of file diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/sys/win32/UserGdi.di --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/sys/win32/UserGdi.di Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,1748 @@ +module tango.sys.win32.UserGdi; + +/* + Module: Windows Functions + Author: Trevor Parscal +*/ + +/+ Imports +/ +public +{ + import tango.sys.win32.Types; +} + +/+ Functions +/ +extern(Windows) +{ + BOOL GetWindowInfo(HWND, PWINDOWINFO); + BOOL EnumDisplayMonitors(HDC, RECT*, MONITORENUMPROC, LPARAM); + BOOL GetMonitorInfoA(HMONITOR, LPMONITORINFO); + WINBOOL GetBinaryTypeA(LPCSTR, LPDWORD); + DWORD GetShortPathNameA(LPCSTR, LPSTR, DWORD); + LPSTR GetEnvironmentStringsA(); + WINBOOL FreeEnvironmentStringsA(LPSTR); + DWORD FormatMessageA(DWORD, LPCVOID, DWORD, DWORD, LPSTR, DWORD, VA_LIST*); + HANDLE CreateMailslotA(LPCSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES); + int lstrcmpA(LPCSTR, LPCSTR); + int lstrcmpiA(LPCSTR, LPCSTR); + LPSTR lstrcpynA(LPSTR, LPCSTR, int); + LPSTR lstrcpyA(LPSTR, LPCSTR); + LPSTR lstrcatA(LPSTR, LPCSTR); + int lstrlenA(LPCSTR); + HANDLE CreateMutexA(LPSECURITY_ATTRIBUTES, WINBOOL, LPCSTR); + HANDLE OpenMutexA(DWORD, WINBOOL, LPCSTR); + HANDLE CreateEventA(LPSECURITY_ATTRIBUTES, WINBOOL, WINBOOL, LPCSTR); + HANDLE OpenEventA(DWORD, WINBOOL, LPCSTR); + HANDLE CreateSemaphoreA(LPSECURITY_ATTRIBUTES, LONG, LONG, LPCSTR); + HANDLE OpenSemaphoreA(DWORD, WINBOOL, LPCSTR); + HANDLE CreateFileMappingA(HANDLE, LPSECURITY_ATTRIBUTES, DWORD, DWORD, DWORD, LPCSTR); + HANDLE OpenFileMappingA(DWORD, WINBOOL, LPCSTR); + DWORD GetLogicalDriveStringsA(DWORD, LPSTR); + HINST LoadLibraryA(LPCSTR); + HINST LoadLibraryExA(LPCSTR, HANDLE, DWORD); + DWORD GetModuleFileNameA(HINST, LPSTR, DWORD); + HMODULE GetModuleHandleA(LPCSTR); + void FatalAppExitA(UINT); + LPSTR GetCommandLineA(); + DWORD GetEnvironmentVariableA(LPCSTR, LPSTR, DWORD); + WINBOOL SetEnvironmentVariableA(LPCSTR, LPCSTR); + DWORD ExpandEnvironmentStringsA(LPCSTR, LPSTR, DWORD); + void OutputDebugStringA(LPCSTR); + HRSRC FindResourceA(HINST, LPCSTR, LPCSTR); + HRSRC FindResourceExA(HINST, LPCSTR, LPCSTR, ushort); + WINBOOL EnumResourceTypesA(HINST, ENUMRESTYPEPROC, LONG); + WINBOOL EnumResourceNamesA(HINST, LPCSTR, ENUMRESNAMEPROC, LONG); + WINBOOL EnumResourceLanguagesA(HINST, LPCSTR, LPCSTR, ENUMRESLANGPROC, LONG); + HANDLE BeginUpdateResourceA(LPCSTR, WINBOOL); + WINBOOL UpdateResourceA(HANDLE, LPCSTR, LPCSTR, ushort, LPVOID, DWORD); + WINBOOL EndUpdateResourceA(HANDLE, WINBOOL); + ATOM GlobalAddAtomA(LPCSTR); + ATOM GlobalFindAtomA(LPCSTR); + UINT GlobalGetAtomNameA(ATOM, LPSTR, int); + ATOM AddAtomA(LPCSTR); + ATOM FindAtomA(LPCSTR); + UINT GetAtomNameA(ATOM, LPSTR, int); + UINT GetProfileIntA(LPCSTR, LPCSTR, INT); + DWORD GetProfileStringA(LPCSTR, LPCSTR, LPCSTR, LPSTR, DWORD); + WINBOOL WriteProfileStringA(LPCSTR, LPCSTR, LPCSTR); + DWORD GetProfileSectionA(LPCSTR, LPSTR, DWORD); + WINBOOL WriteProfileSectionA(LPCSTR, LPCSTR); + UINT GetPrivateProfileIntA(LPCSTR, LPCSTR, INT, LPCSTR); + DWORD GetPrivateProfileStringA(LPCSTR, LPCSTR, LPCSTR, LPSTR, DWORD, LPCSTR); + WINBOOL WritePrivateProfileStringA(LPCSTR, LPCSTR, LPCSTR, LPCSTR); + DWORD GetPrivateProfileSectionA(LPCSTR, LPSTR, DWORD, LPCSTR); + WINBOOL WritePrivateProfileSectionA(LPCSTR, LPCSTR, LPCSTR); + UINT GetDriveTypeA(LPCSTR); + UINT GetSystemDirectoryA(LPSTR, UINT); + DWORD GetTempPathA(DWORD, LPSTR); + UINT GetTempFileNameA(LPCSTR, LPCSTR, UINT, LPSTR); + UINT GetWindowsDirectoryA(LPSTR, UINT); + WINBOOL SetCurrentDirectoryA(LPCSTR); + DWORD GetCurrentDirectoryA(DWORD, LPSTR); + WINBOOL GetDiskFreeSpaceA(LPCSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD); + WINBOOL CreateDirectoryA(LPCSTR, LPSECURITY_ATTRIBUTES); + WINBOOL CreateDirectoryExA(LPCSTR, LPCSTR, LPSECURITY_ATTRIBUTES); + WINBOOL RemoveDirectoryA(LPCSTR); + DWORD GetFullPathNameA(LPCSTR, DWORD, LPSTR, LPSTR*); + WINBOOL DefineDosDeviceA(DWORD, LPCSTR, LPCSTR); + DWORD QueryDosDeviceA(LPCSTR, LPSTR, DWORD); + HANDLE CreateFileA(LPCSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE); + WINBOOL SetFileAttributesA(LPCSTR, DWORD); + DWORD GetFileAttributesA(LPCSTR); + BOOL GetFileAttributesExA(LPCSTR, DWORD, WIN32_FILE_ATTRIBUTE_DATA*); + DWORD GetCompressedFileSizeA(LPCSTR, LPDWORD); + WINBOOL DeleteFileA(LPCSTR); + DWORD SearchPathA(LPCSTR, LPCSTR, LPCSTR, DWORD, LPSTR, LPSTR); + WINBOOL CopyFileA(LPCSTR, LPCSTR, WINBOOL); + WINBOOL MoveFileA(LPCSTR, LPCSTR); + WINBOOL MoveFileExA(LPCSTR, LPCSTR, DWORD); + HANDLE CreateNamedPipeA(LPCSTR, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPSECURITY_ATTRIBUTES); + WINBOOL GetNamedPipeHandleStateA(HANDLE, LPDWORD, LPDWORD, LPDWORD, LPDWORD, LPSTR, DWORD); + WINBOOL CallNamedPipeA(LPCSTR, LPVOID, DWORD, LPVOID, DWORD, LPDWORD, DWORD); + WINBOOL WaitNamedPipeA(LPCSTR, DWORD); + WINBOOL SetVolumeLabelA(LPCSTR, LPCSTR); + WINBOOL GetVolumeInformationA(LPCSTR, LPSTR, DWORD, LPDWORD, LPDWORD, LPDWORD, LPSTR, DWORD); + WINBOOL ClearEventLogA(HANDLE, LPCSTR); + WINBOOL BackupEventLogA(HANDLE, LPCSTR); + HANDLE OpenEventLogA(LPCSTR, LPCSTR); + HANDLE RegisterEventSourceA(LPCSTR, LPCSTR); + HANDLE OpenBackupEventLogA(LPCSTR, LPCSTR); + WINBOOL ReadEventLogA(HANDLE, DWORD, DWORD, LPVOID, DWORD, LPDWORD, LPDWORD); + WINBOOL ReportEventA(HANDLE, ushort, ushort, DWORD, PSID, ushort, DWORD, LPCSTR*, LPVOID); + WINBOOL AccessCheckAndAuditAlarmA(LPCSTR, LPVOID, LPSTR, LPSTR, PSECURITY_DESCRIPTOR, DWORD, PGENERIC_MAPPING, WINBOOL, LPDWORD, LPBOOL, LPBOOL); + WINBOOL ObjectOpenAuditAlarmA(LPCSTR, LPVOID, LPSTR, LPSTR, PSECURITY_DESCRIPTOR, HANDLE, DWORD, DWORD, PPRIVILEGE_SET, WINBOOL, WINBOOL, LPBOOL); + WINBOOL ObjectPrivilegeAuditAlarmA(LPCSTR, LPVOID, HANDLE, DWORD, PPRIVILEGE_SET, WINBOOL); + WINBOOL ObjectCloseAuditAlarmA(LPCSTR, LPVOID, WINBOOL); + WINBOOL PrivilegedServiceAuditAlarmA(LPCSTR, LPCSTR, HANDLE, PPRIVILEGE_SET, WINBOOL); + WINBOOL SetFileSecurityA(LPCSTR, SECURITY_INFORMATION, PSECURITY_DESCRIPTOR); + WINBOOL GetFileSecurityA(LPCSTR, SECURITY_INFORMATION, PSECURITY_DESCRIPTOR, DWORD, LPDWORD); + HANDLE FindFirstChangeNotificationA(LPCSTR, WINBOOL, DWORD); + WINBOOL IsBadStringPtrA(LPCSTR, UINT); + WINBOOL LookupAccountSidA(LPCSTR, PSID, LPSTR, LPDWORD, LPSTR, LPDWORD, PSID_NAME_USE); + WINBOOL LookupAccountNameA(LPCSTR, LPCSTR, PSID, LPDWORD, LPSTR, LPDWORD, PSID_NAME_USE); + WINBOOL LookupPrivilegeValueA(LPCSTR, LPCSTR, PLUID); + WINBOOL LookupPrivilegeNameA(LPCSTR, PLUID, LPSTR, LPDWORD); + WINBOOL LookupPrivilegeDisplayNameA(LPCSTR, LPCSTR, LPSTR, LPDWORD, LPDWORD); + WINBOOL BuildCommDCBA(LPCSTR, LPDCB); + WINBOOL BuildCommDCBAndTimeoutsA(LPCSTR, LPDCB, LPCOMMTIMEOUTS); + WINBOOL CommConfigDialogA(LPCSTR, HWND, LPCOMMCONFIG); + WINBOOL GetDefaultCommConfigA(LPCSTR, LPCOMMCONFIG, LPDWORD); + WINBOOL SetDefaultCommConfigA(LPCSTR, LPCOMMCONFIG, DWORD); + WINBOOL GetComputerNameA(LPSTR, LPDWORD); + WINBOOL SetComputerNameA(LPCSTR); + WINBOOL GetUserNameA(LPSTR, LPDWORD); + int wvsprintfA(LPSTR, LPCSTR, VA_LIST*); + HKL LoadKeyboardLayoutA(LPCSTR, UINT); + WINBOOL GetKeyboardLayoutNameA(LPSTR); + HDESK CreateDesktopA(LPSTR, LPSTR, LPDEVMODE, DWORD, DWORD, LPSECURITY_ATTRIBUTES); + HDESK OpenDesktopA(LPSTR, DWORD, WINBOOL, DWORD); + WINBOOL EnumDesktopsA(HWINSTA, DESKTOPENUMPROC, LPARAM); + HWINSTA CreateWindowStationA(LPSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES); + HWINSTA OpenWindowStationA(LPSTR, WINBOOL, DWORD); + WINBOOL EnumWindowStationsA(ENUMWINDOWSTATIONPROC, LPARAM); + WINBOOL GetUserObjectInformationA(HANDLE, int, PVOID, DWORD, LPDWORD); + WINBOOL SetUserObjectInformationA(HANDLE, int, PVOID, DWORD); + UINT RegisterWindowMessageA(LPCSTR); + WINBOOL GetMessageA(LPMSG, HWND, UINT, UINT); + LONG DispatchMessageA(LPMSG); + WINBOOL PeekMessageA(LPMSG, HWND, UINT, UINT, UINT); + LRESULT SendMessageA(HWND, UINT, WPARAM, LPARAM); + LRESULT SendMessageTimeoutA(HWND, UINT, WPARAM, LPARAM, UINT, UINT, LPDWORD); + WINBOOL SendNotifyMessageA(HWND, UINT, WPARAM, LPARAM); + WINBOOL SendMessageCallbackA(HWND, UINT, WPARAM, LPARAM, SENDASYNCPROC, DWORD); + WINBOOL PostMessageA(HWND, UINT, WPARAM, LPARAM); + WINBOOL PostThreadMessageA(DWORD, UINT, WPARAM, LPARAM); + LRESULT DefWindowProcA(HWND, UINT, WPARAM, LPARAM); + LRESULT CallWindowProcA(WNDPROC, HWND, UINT, WPARAM, LPARAM); + ATOM RegisterClassA(LPWNDCLASS); + WINBOOL UnregisterClassA(LPCSTR, HINST); + WINBOOL GetClassInfoA(HINST, LPCSTR, LPWNDCLASS); + ATOM RegisterClassExA(LPWNDCLASSEX); + WINBOOL GetClassInfoExA(HINST, LPCSTR, LPWNDCLASSEX); + HWND CreateWindowExA(DWORD, LPCSTR, LPCSTR, DWORD, int, int, int, int, HWND, HMENU, HINST, LPVOID); + HWND CreateDialogParamA(HINST, LPCSTR, HWND, DLGPROC, LPARAM); + HWND CreateDialogIndirectParamA(HINST, LPCDLGTEMPLATE, HWND, DLGPROC, LPARAM); + int DialogBoxParamA(HINST, LPCSTR, HWND, DLGPROC, LPARAM); + int DialogBoxIndirectParamA(HINST, LPCDLGTEMPLATE, HWND, DLGPROC, LPARAM); + WINBOOL SetDlgItemTextA(HWND, int, LPCSTR); + UINT GetDlgItemTextA(HWND, int, LPSTR, int); + LONG SendDlgItemMessageA(HWND, int, UINT, WPARAM, LPARAM); + LRESULT DefDlgProcA(HWND, UINT, WPARAM, LPARAM); + WINBOOL CallMsgFilterA(LPMSG, int); + UINT RegisterClipboardFormatA(LPCSTR); + int GetClipboardFormatNameA(UINT, LPSTR, int); + WINBOOL CharToOemA(LPCSTR, LPSTR); + WINBOOL OemToCharA(LPCSTR, LPSTR); + WINBOOL CharToOemBuffA(LPCSTR, LPSTR, DWORD); + WINBOOL OemToCharBuffA(LPCSTR, LPSTR, DWORD); + LPSTR CharUpperA(LPSTR); + DWORD CharUpperBuffA(LPSTR, DWORD); + LPSTR CharLowerA(LPSTR); + DWORD CharLowerBuffA(LPSTR, DWORD); + LPSTR CharNextA(LPCSTR); + LPSTR CharPrevA(LPCSTR, LPCSTR); + WINBOOL IsCharAlphaA(char); + WINBOOL IsCharAlphaNumericA(char); + WINBOOL IsCharUpperA(char); + WINBOOL IsCharLowerA(char); + int GetKeyNameTextA(LONG, LPSTR, int); + SHORT VkKeyScanA(char); + SHORT VkKeyScanExA(char, HKL); + UINT MapVirtualKeyA(UINT, UINT); + UINT MapVirtualKeyExA(UINT, UINT, HKL); + HACCEL LoadAcceleratorsA(HINST, LPCSTR); + HACCEL CreateAcceleratorTableA(LPACCEL, int); + int CopyAcceleratorTableA(HACCEL, LPACCEL, int); + int TranslateAcceleratorA(HWND, HACCEL, LPMSG); + HMENU LoadMenuA(HINST, LPCSTR); + HMENU LoadMenuIndirectA(LPMENUTEMPLATE); + WINBOOL ChangeMenuA(HMENU, UINT, LPCSTR, UINT, UINT); + int GetMenuStringA(HMENU, UINT, LPSTR, int, UINT); + WINBOOL InsertMenuA(HMENU, UINT, UINT, UINT, LPCSTR); + WINBOOL AppendMenuA(HMENU, UINT, UINT, LPCSTR); + WINBOOL ModifyMenuA(HMENU, UINT, UINT, UINT, LPCSTR); + WINBOOL InsertMenuItemA(HMENU, UINT, WINBOOL, LPCMENUITEMINFO); + WINBOOL GetMenuItemInfoA(HMENU, UINT, WINBOOL, LPMENUITEMINFO); + WINBOOL SetMenuItemInfoA(HMENU, UINT, WINBOOL, LPCMENUITEMINFO); + int DrawTextA(HDC, LPCSTR, int, LPRECT, UINT); + int DrawTextExA(HDC, LPSTR, int, LPRECT, UINT, LPDRAWTEXTPARAMS); + WINBOOL GrayStringA(HDC, HBRUSH, GRAYSTRINGPROC, LPARAM, int, int, int, int, int); + WINBOOL DrawStateA(HDC, HBRUSH, DRAWSTATEPROC, LPARAM, WPARAM, int, int, int, int, UINT); + LONG TabbedTextOutA(HDC, int, int, LPCSTR, int, int, LPINT, int); + DWORD GetTabbedTextExtentA(HDC, LPCSTR, int, int, LPINT); + WINBOOL SetPropA(HWND, LPCSTR, HANDLE); + HANDLE GetPropA(HWND, LPCSTR); + HANDLE RemovePropA(HWND, LPCSTR); + int EnumPropsExA(HWND, PROPENUMPROCEX, LPARAM); + int EnumPropsA(HWND, PROPENUMPROC); + WINBOOL SetWindowTextA(HWND, LPCSTR); + int GetWindowTextA(HWND, LPSTR, int); + int GetWindowTextLengthA(HWND); + int MessageBoxA(HWND, LPCSTR, LPCSTR, UINT); + int MessageBoxExA(HWND, LPCSTR, LPCSTR, UINT, ushort); + int MessageBoxIndirectA(LPMSGBOXPARAMS); + LONG GetWindowLongA(HWND, int); + LONG SetWindowLongA(HWND, int, LONG); + DWORD GetClassLongA(HWND, int); + DWORD SetClassLongA(HWND, int, LONG); + HWND FindWindowA(LPCSTR, LPCSTR); + HWND FindWindowExA(HWND, HWND, LPCSTR, LPCSTR); + int GetClassNameA(HWND, LPSTR, int); + HHOOK SetWindowsHookExA(int, HOOKPROC, HINST, DWORD); + HBITMAP LoadBitmapA(HINST, LPCSTR); + HCURSOR LoadCursorA(HINST, LPCSTR); + HCURSOR LoadCursorFromFileA(LPCSTR); + HICON LoadIconA(HINST, LPCSTR); + HANDLE LoadImageA(HINST, LPCSTR, UINT, int, int, UINT); + int LoadStringA(HINST, UINT, LPSTR, int); + WINBOOL IsDialogMessageA(HWND, LPMSG); + int DlgDirListA(HWND, LPSTR, int, int, UINT); + WINBOOL DlgDirSelectExA(HWND, LPSTR, int, int); + int DlgDirListComboBoxA(HWND, LPSTR, int, int, UINT); + WINBOOL DlgDirSelectComboBoxExA(HWND, LPSTR, int, int); + LRESULT DefFrameProcA(HWND, HWND, UINT, WPARAM, LPARAM); + LRESULT DefMDIChildProcA(HWND, UINT, WPARAM, LPARAM); + HWND CreateMDIWindowA(LPSTR, LPSTR, DWORD, int, int, int, int, HWND, HINST, LPARAM); + WINBOOL WinHelpA(HWND, LPCSTR, UINT, DWORD); + LONG ChangeDisplaySettingsA(LPDEVMODE, DWORD); + WINBOOL EnumDisplaySettingsA(LPCSTR, DWORD, LPDEVMODE); + WINBOOL SystemParametersInfoA(UINT, UINT, PVOID, UINT); + int AddFontResourceA(LPCSTR); + HMETAFILE CopyMetaFileA(HMETAFILE, LPCSTR); + HFONT CreateFontIndirectA(LPLOGFONT); + HDC CreateICA(LPCSTR, LPCSTR, LPCSTR, LPDEVMODE); + HDC CreateMetaFileA(LPCSTR); + WINBOOL CreateScalableFontResourceA(DWORD, LPCSTR, LPCSTR, LPCSTR); + int EnumFontFamiliesExA(HDC, LPLOGFONT, FONTENUMEXPROC, LPARAM, DWORD); + int EnumFontFamiliesA(HDC, LPCSTR, FONTENUMPROC, LPARAM); + int EnumFontsA(HDC, LPCSTR, ENUMFONTSPROC, LPARAM); + WINBOOL GetCharWidthA(HDC, UINT, UINT, LPINT); + WINBOOL GetCharWidth32A(HDC, UINT, UINT, LPINT); + WINBOOL GetCharWidthFloatA(HDC, UINT, UINT, PFLOAT); + WINBOOL GetCharABCWidthsA(HDC, UINT, UINT, LPABC); + WINBOOL GetCharABCWidthsFloatA(HDC, UINT, UINT, LPABCFLOAT); + DWORD GetGlyphOutlineA(HDC, UINT, UINT, LPGLYPHMETRICS, DWORD, LPVOID, PMAT2); + HMETAFILE GetMetaFileA(LPCSTR); + UINT GetOutlineTextMetricsA(HDC, UINT, LPOUTLINETEXTMETRIC); + WINBOOL GetTextExtentPointA(HDC, LPCSTR, int, LPSIZE); + WINBOOL GetTextExtentPoint32A(HDC, LPCSTR, int, LPSIZE); + WINBOOL GetTextExtentExPointA(HDC, LPCSTR, int, int, LPINT, LPINT, LPSIZE); + DWORD GetCharacterPlacementA(HDC, LPCSTR, int, int, LPGCP_RESULTS, DWORD); + HDC ResetDCA(HDC, LPDEVMODE); + WINBOOL RemoveFontResourceA(LPCSTR); + HENHMETAFILE CopyEnhMetaFileA(HENHMETAFILE, LPCSTR); + HDC CreateEnhMetaFileA(HDC, LPCSTR, LPRECT, LPCSTR); + HENHMETAFILE GetEnhMetaFileA(LPCSTR); + UINT GetEnhMetaFileDescriptionA(HENHMETAFILE, UINT, LPSTR); + WINBOOL GetTextMetricsA(HDC, LPTEXTMETRIC); + int StartDocA(HDC, PDOCINFO); + int GetObjectA(HGDIOBJ, int, LPVOID); + WINBOOL TextOutA(HDC, int, int, LPCSTR, int); + WINBOOL ExtTextOutA(HDC, int, int, UINT, LPRECT, LPCSTR, UINT, LPINT); + WINBOOL PolyTextOutA(HDC, PPOLYTEXT, int); + int GetTextFaceA(HDC, int, LPSTR); + DWORD GetKerningPairsA(HDC, DWORD, LPKERNINGPAIR); + HCOLORSPACE CreateColorSpaceA(LPLOGCOLORSPACE); + WINBOOL GetLogColorSpaceA(HCOLORSPACE, LPLOGCOLORSPACE, DWORD); + WINBOOL GetICMProfileA(HDC, DWORD, LPSTR); + WINBOOL SetICMProfileA(HDC, LPSTR); + WINBOOL UpdateICMRegKeyA(DWORD, DWORD, LPSTR, UINT); + int EnumICMProfilesA(HDC, ICMENUMPROC, LPARAM); + int PropertySheetA(LPCPROPSHEETHEADER); + HIMAGELIST ImageList_LoadImageA(HINST, LPCSTR, int, int, COLORREF, UINT, UINT); + HWND CreateStatusWindowA(LONG, LPCSTR, HWND, UINT); + void DrawStatusTextA(HDC, LPRECT, LPCSTR); + WINBOOL GetOpenFileNameA(LPOPENFILENAME); + WINBOOL GetSaveFileNameA(LPOPENFILENAME); + int GetFileTitleA(LPCSTR, LPSTR, ushort); + WINBOOL ChooseColorA(LPCHOOSECOLOR); + HWND FindTextA(LPFINDREPLACE); + HWND ReplaceTextA(LPFINDREPLACE); + WINBOOL ChooseFontA(LPCHOOSEFONT); + WINBOOL PrintDlgA(LPPRINTDLG); + WINBOOL PageSetupDlgA(LPPAGESETUPDLG); + WINBOOL CreateProcessA(LPCSTR, LPSTR, LPSECURITY_ATTRIBUTES, LPSECURITY_ATTRIBUTES, WINBOOL, DWORD, LPVOID, LPCSTR, LPSTARTUPINFO, LPPROCESS_INFORMATION); + void GetStartupInfoA(LPSTARTUPINFO); + HANDLE FindFirstFileA(LPCSTR, LPWIN32_FIND_DATA); + WINBOOL FindNextFileA(HANDLE, LPWIN32_FIND_DATA); + WINBOOL GetVersionExA(LPOSVERSIONINFO); + HDC CreateDCA(LPCSTR, LPCSTR, LPCSTR, PDEVMODE); + DWORD VerInstallFileA(DWORD, LPSTR, LPSTR, LPSTR, LPSTR, LPSTR, LPSTR, PUINT); + DWORD GetFileVersionInfoSizeA(LPSTR, LPDWORD); + WINBOOL GetFileVersionInfoA(LPSTR, DWORD, DWORD, LPVOID); + DWORD VerLanguageNameA(DWORD, LPSTR, DWORD); + WINBOOL VerQueryValueA(LPVOID, LPSTR, LPVOID, PUINT); + DWORD VerFindFileA(DWORD, LPSTR, LPSTR, LPSTR, LPSTR, PUINT, LPSTR, PUINT); + LONG RegConnectRegistryA(LPSTR, HKEY, PHKEY); + LONG RegCreateKeyA(HKEY, LPCSTR, PHKEY); + LONG RegCreateKeyExA(HKEY, LPCSTR, DWORD, LPSTR, DWORD, REGSAM, LPSECURITY_ATTRIBUTES, PHKEY, LPDWORD); + LONG RegDeleteKeyA(HKEY, LPCSTR); + LONG RegDeleteValueA(HKEY, LPCSTR); + LONG RegEnumKeyA(HKEY, DWORD, LPSTR, DWORD); + LONG RegEnumKeyExA(HKEY, DWORD, LPSTR, LPDWORD, LPDWORD, LPSTR, LPDWORD, PFILETIME); + LONG RegEnumValueA(HKEY, DWORD, LPSTR, LPDWORD, LPDWORD, LPDWORD, LPBYTE, LPDWORD); + LONG RegLoadKeyA(HKEY, LPCSTR, LPCSTR); + LONG RegOpenKeyA(HKEY, LPCSTR, PHKEY); + LONG RegOpenKeyExA(HKEY, LPCSTR, DWORD, REGSAM, PHKEY); + LONG RegQueryInfoKeyA(HKEY, LPSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD, LPDWORD, LPDWORD, LPDWORD, LPDWORD, LPDWORD, PFILETIME); + LONG RegQueryValueA(HKEY, LPCSTR, LPSTR, PLONG); + LONG RegQueryMultipleValuesA(HKEY, PVALENT, DWORD, LPSTR, LPDWORD); + LONG RegQueryValueExA(HKEY, LPCSTR, LPDWORD, LPDWORD, LPBYTE, LPDWORD); + LONG RegReplaceKeyA(HKEY, LPCSTR, LPCSTR, LPCSTR); + LONG RegRestoreKeyA(HKEY, LPCSTR, DWORD); + LONG RegSaveKeyA(HKEY, LPCSTR, LPSECURITY_ATTRIBUTES); + LONG RegSetValueA(HKEY, LPCSTR, DWORD, LPCSTR, DWORD); + LONG RegSetValueExA(HKEY, LPCSTR, DWORD, DWORD, LPBYTE, DWORD); + LONG RegUnLoadKeyA(HKEY, LPCSTR); + WINBOOL InitiateSystemShutdownA(LPSTR, LPSTR, DWORD, WINBOOL, WINBOOL); + WINBOOL AbortSystemShutdownA(LPSTR); + int CompareStringA(LCID, DWORD, LPCSTR, int, LPCSTR, int); + int LCMapStringA(LCID, DWORD, LPCSTR, int, LPSTR, int); + int GetLocaleInfoA(LCID, LCTYPE, LPSTR, int); + WINBOOL SetLocaleInfoA(LCID, LCTYPE, LPCSTR); + int GetTimeFormatA(LCID, DWORD, LPSYSTEMTIME, LPCSTR, LPSTR, int); + int GetDateFormatA(LCID, DWORD, LPSYSTEMTIME, LPCSTR, LPSTR, int); + int GetNumberFormatA(LCID, DWORD, LPCSTR, PNUMBERFMT, LPSTR, int); + int GetCurrencyFormatA(LCID, DWORD, LPCSTR, PCURRENCYFMT, LPSTR, int); + WINBOOL EnumCalendarInfoA(CALINFO_ENUMPROC, LCID, CALID, CALTYPE); + WINBOOL EnumTimeFormatsA(TIMEFMT_ENUMPROC, LCID, DWORD); + WINBOOL EnumDateFormatsA(DATEFMT_ENUMPROC, LCID, DWORD); + WINBOOL GetStringTypeExA(LCID, DWORD, LPCSTR, int, LPWORD); + WINBOOL GetStringTypeA(LCID, DWORD, LPCSTR, int, LPWORD); + int FoldStringA(DWORD, LPCSTR, int, LPSTR, int); + WINBOOL EnumSystemLocalesA(LOCALE_ENUMPROC, DWORD); + WINBOOL EnumSystemCodePagesA(CODEPAGE_ENUMPROC, DWORD); + WINBOOL PeekConsoleInputA(HANDLE, PINPUTRECORD, DWORD, LPDWORD); + WINBOOL ReadConsoleInputA(HANDLE, PINPUTRECORD, DWORD, LPDWORD); + WINBOOL WriteConsoleInputA(HANDLE, PINPUTRECORD, DWORD, LPDWORD); + WINBOOL ReadConsoleOutputA(HANDLE, PCHAR_INFO, COORD, COORD, PSMALL_RECT); + WINBOOL WriteConsoleOutputA(HANDLE, PCHAR_INFO, COORD, COORD, PSMALL_RECT); + WINBOOL ReadConsoleOutputCharacterA(HANDLE, LPSTR, DWORD, COORD, LPDWORD); + WINBOOL WriteConsoleOutputCharacterA(HANDLE, LPCSTR, DWORD, COORD, LPDWORD); + WINBOOL FillConsoleOutputCharacterA(HANDLE, char, DWORD, COORD, LPDWORD); + WINBOOL ScrollConsoleScreenBufferA(HANDLE, PSMALL_RECT, PSMALL_RECT, COORD, PCHAR_INFO); + DWORD GetConsoleTitleA(LPSTR, DWORD); + WINBOOL SetConsoleTitleA(LPCSTR); + WINBOOL ReadConsoleA(HANDLE, LPVOID, DWORD, LPDWORD, LPVOID); + WINBOOL WriteConsoleA(HANDLE, POINTER, DWORD, LPDWORD, LPVOID); + DWORD WNetAddConnectionA(LPCSTR, LPCSTR, LPCSTR); + DWORD WNetAddConnection2A(LPNETRESOURCE, LPCSTR, LPCSTR, DWORD); + DWORD WNetAddConnection3A(HWND, LPNETRESOURCE, LPCSTR, LPCSTR, DWORD); + DWORD WNetCancelConnectionA(LPCSTR, WINBOOL); + DWORD WNetCancelConnection2A(LPCSTR, DWORD, WINBOOL); + DWORD WNetGetConnectionA(LPCSTR, LPSTR, LPDWORD); + DWORD WNetUseConnectionA(HWND, LPNETRESOURCE, LPCSTR, LPCSTR, DWORD, LPSTR, LPDWORD, LPDWORD); + DWORD WNetSetConnectionA(LPCSTR, DWORD, LPVOID); + DWORD WNetConnectionDialog1A(LPCONNECTDLGSTRUCT); + DWORD WNetDisconnectDialog1A(LPDISCDLGSTRUCT); + DWORD WNetOpenEnumA(DWORD, DWORD, DWORD, LPNETRESOURCE, LPHANDLE); + DWORD WNetEnumResourceA(HANDLE, LPDWORD, LPVOID, LPDWORD); + DWORD WNetGetUniversalNameA(LPCSTR, DWORD, LPVOID, LPDWORD); + DWORD WNetGetUserA(LPCSTR, LPSTR, LPDWORD); + DWORD WNetGetProviderNameA(DWORD, LPSTR, LPDWORD); + DWORD WNetGetNetworkInformationA(LPCSTR, LPNETINFOSTRUCT); + DWORD WNetGetLastErrorA(LPDWORD, LPSTR, DWORD, LPSTR, DWORD); + DWORD MultinetGetConnectionPerformanceA(LPNETRESOURCE, LPNETCONNECTINFOSTRUCT); + WINBOOL ChangeServiceConfigA(SC_HANDLE, DWORD, DWORD, DWORD, LPCSTR, LPCSTR, LPDWORD, LPCSTR, LPCSTR, LPCSTR, LPCSTR); + SC_HANDLE CreateServiceA(SC_HANDLE, LPCSTR, LPCSTR, DWORD, DWORD, DWORD, DWORD, LPCSTR, LPCSTR, LPDWORD, LPCSTR, LPCSTR, LPCSTR); + WINBOOL EnumDependentServicesA(SC_HANDLE, DWORD, LPENUM_SERVICE_STATUS, DWORD, LPDWORD, LPDWORD); + WINBOOL EnumServicesStatusA(SC_HANDLE, DWORD, DWORD, LPENUM_SERVICE_STATUS, DWORD, LPDWORD, LPDWORD, LPDWORD); + WINBOOL GetServiceKeyNameA(SC_HANDLE, LPCSTR, LPSTR, LPDWORD); + WINBOOL GetServiceDisplayNameA(SC_HANDLE, LPCSTR, LPSTR, LPDWORD); + SC_HANDLE OpenSCManagerA(LPCSTR, LPCSTR, DWORD); + SC_HANDLE OpenServiceA(SC_HANDLE, LPCSTR, DWORD); + WINBOOL QueryServiceConfigA(SC_HANDLE, LPQUERY_SERVICE_CONFIG, DWORD, LPDWORD); + WINBOOL QueryServiceLockStatusA(SC_HANDLE, LPQUERY_SERVICE_LOCK_STATUS, DWORD, LPDWORD); + SERVICE_STATUS_HANDLE RegisterServiceCtrlHandlerA(LPCSTR, LPHANDLER_FUNCTION); + WINBOOL StartServiceCtrlDispatcherA(LPSERVICE_TABLE_ENTRY); + WINBOOL StartServiceA(SC_HANDLE, DWORD, LPCSTR); + uint DragQueryFileA(HDROP, uint, PCHAR, uint); + HICON ExtractAssociatedIconA(HINST, PCHAR, LPWORD); + HICON ExtractIconA(HINST, PCHAR, uint); + HINST FindExecutableA(PCHAR, PCHAR, PCHAR); + int ShellAboutA(HWND, PCHAR, PCHAR, HICON); + HINST ShellExecuteA(HWND, PCHAR, PCHAR, PCHAR, PCHAR, int); + HSZ DdeCreateStringHandleA(DWORD, PCHAR, int); + UINT DdeInitializeA(LPDWORD, PFNCALLBACK, DWORD, DWORD); + DWORD DdeQueryStringA(DWORD, HSZ, PCHAR, DWORD, int); + WINBOOL LogonUserA(LPSTR, LPSTR, LPSTR, DWORD, DWORD, PHANDLE); + WINBOOL CreateProcessAsUserA(HANDLE, LPCTSTR, LPTSTR, LPSECURITY_ATTRIBUTES, LPSECURITY_ATTRIBUTES, WINBOOL, DWORD, LPVOID, LPCTSTR, LPSTARTUPINFO, LPPROCESS_INFORMATION); + WINBOOL GetBinaryTypeW(LPCWSTR, LPDWORD); + DWORD GetShortPathNameW(LPCWSTR, LPWSTR, DWORD); + LPWSTR GetEnvironmentStringsW(); + WINBOOL FreeEnvironmentStringsW(LPWSTR); + DWORD FormatMessageW(DWORD, LPCVOID, DWORD, DWORD, LPWSTR, DWORD, VA_LIST*); + HANDLE CreateMailslotW(LPCWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES); + int lstrcmpW(LPCWSTR, LPCWSTR); + int lstrcmpiW(LPCWSTR, LPCWSTR); + LPWSTR lstrcpynW(LPWSTR, LPCWSTR, int); + LPWSTR lstrcpyW(LPWSTR, LPCWSTR); + LPWSTR lstrcatW(LPWSTR, LPCWSTR); + int lstrlenW(LPCWSTR); + HANDLE CreateMutexW(LPSECURITY_ATTRIBUTES, WINBOOL, LPCWSTR); + HANDLE OpenMutexW(DWORD, WINBOOL, LPCWSTR); + HANDLE CreateEventW(LPSECURITY_ATTRIBUTES, WINBOOL, WINBOOL, LPCWSTR); + HANDLE OpenEventW(DWORD, WINBOOL, LPCWSTR); + HANDLE CreateSemaphoreW(LPSECURITY_ATTRIBUTES, LONG, LONG, LPCWSTR); + HANDLE OpenSemaphoreW(DWORD, WINBOOL, LPCWSTR); + HANDLE CreateFileMappingW(HANDLE, LPSECURITY_ATTRIBUTES, DWORD, DWORD, DWORD, LPCWSTR); + HANDLE OpenFileMappingW(DWORD, WINBOOL, LPCWSTR); + DWORD GetLogicalDriveStringsW(DWORD, LPWSTR); + HINST LoadLibraryW(LPCWSTR); + HINST LoadLibraryExW(LPCWSTR, HANDLE, DWORD); + DWORD GetModuleFileNameW(HINST, LPWSTR, DWORD); + HMODULE GetModuleHandleW(LPCWSTR); + void FatalAppExitW(UINT); + LPWSTR GetCommandLineW(); + DWORD GetEnvironmentVariableW(LPCWSTR, LPWSTR, DWORD); + WINBOOL SetEnvironmentVariableW(LPCWSTR, LPCWSTR); + DWORD ExpandEnvironmentStringsW(LPCWSTR, LPWSTR, DWORD); + void OutputDebugStringW(LPCWSTR); + HRSRC FindResourceW(HINST, LPCWSTR, LPCWSTR); + HRSRC FindResourceExW(HINST, LPCWSTR, LPCWSTR, ushort); + WINBOOL EnumResourceTypesW(HINST, ENUMRESTYPEPROC, LONG); + WINBOOL EnumResourceNamesW(HINST, LPCWSTR, ENUMRESNAMEPROC, LONG); + WINBOOL EnumResourceLanguagesW(HINST, LPCWSTR, LPCWSTR, ENUMRESLANGPROC, LONG); + HANDLE BeginUpdateResourceW(LPCWSTR, WINBOOL); + WINBOOL UpdateResourceW(HANDLE, LPCWSTR, LPCWSTR, ushort, LPVOID, DWORD); + WINBOOL EndUpdateResourceW(HANDLE, WINBOOL); + ATOM GlobalAddAtomW(LPCWSTR); + ATOM GlobalFindAtomW(LPCWSTR); + UINT GlobalGetAtomNameW(ATOM, LPWSTR, int); + ATOM AddAtomW(LPCWSTR); + ATOM FindAtomW(LPCWSTR); + UINT GetAtomNameW(ATOM, LPWSTR, int); + UINT GetProfileIntW(LPCWSTR, LPCWSTR, INT); + DWORD GetProfileStringW(LPCWSTR, LPCWSTR, LPCWSTR, LPWSTR, DWORD); + WINBOOL WriteProfileStringW(LPCWSTR, LPCWSTR, LPCWSTR); + DWORD GetProfileSectionW(LPCWSTR, LPWSTR, DWORD); + WINBOOL WriteProfileSectionW(LPCWSTR, LPCWSTR); + UINT GetPrivateProfileIntW(LPCWSTR, LPCWSTR, INT, LPCWSTR); + DWORD GetPrivateProfileStringW(LPCWSTR, LPCWSTR, LPCWSTR, LPWSTR, DWORD, LPCWSTR); + WINBOOL WritePrivateProfileStringW(LPCWSTR, LPCWSTR, LPCWSTR, LPCWSTR); + DWORD GetPrivateProfileSectionW(LPCWSTR, LPWSTR, DWORD, LPCWSTR); + WINBOOL WritePrivateProfileSectionW(LPCWSTR, LPCWSTR, LPCWSTR); + UINT GetDriveTypeW(LPCWSTR); + UINT GetSystemDirectoryW(LPWSTR, UINT); + DWORD GetTempPathW(DWORD, LPWSTR); + UINT GetTempFileNameW(LPCWSTR, LPCWSTR, UINT, LPWSTR); + UINT GetWindowsDirectoryW(LPWSTR, UINT); + WINBOOL SetCurrentDirectoryW(LPCWSTR); + DWORD GetCurrentDirectoryW(DWORD, LPWSTR); + WINBOOL GetDiskFreeSpaceW(LPCWSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD); + WINBOOL CreateDirectoryW(LPCWSTR, LPSECURITY_ATTRIBUTES); + WINBOOL CreateDirectoryExW(LPCWSTR, LPCWSTR, LPSECURITY_ATTRIBUTES); + WINBOOL RemoveDirectoryW(LPCWSTR); + DWORD GetFullPathNameW(LPCWSTR, DWORD, LPWSTR, LPWSTR*); + WINBOOL DefineDosDeviceW(DWORD, LPCWSTR, LPCWSTR); + DWORD QueryDosDeviceW(LPCWSTR, LPWSTR, DWORD); + HANDLE CreateFileW(LPCWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE); + WINBOOL SetFileAttributesW(LPCWSTR, DWORD); + DWORD GetFileAttributesW(LPCWSTR); + BOOL GetFileAttributesExW(LPCWSTR, DWORD, WIN32_FILE_ATTRIBUTE_DATA*); + DWORD GetCompressedFileSizeW(LPCWSTR, LPDWORD); + WINBOOL DeleteFileW(LPCWSTR); + DWORD SearchPathW(LPCWSTR, LPCWSTR, LPCWSTR, DWORD, LPWSTR, LPWSTR); + WINBOOL CopyFileW(LPCWSTR, LPCWSTR, WINBOOL); + WINBOOL MoveFileW(LPCWSTR, LPCWSTR); + WINBOOL MoveFileExW(LPCWSTR, LPCWSTR, DWORD); + HANDLE CreateNamedPipeW(LPCWSTR, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPSECURITY_ATTRIBUTES); + WINBOOL GetNamedPipeHandleStateW(HANDLE, LPDWORD, LPDWORD, LPDWORD, LPDWORD, LPWSTR, DWORD); + WINBOOL CallNamedPipeW(LPCWSTR, LPVOID, DWORD, LPVOID, DWORD, LPDWORD, DWORD); + WINBOOL WaitNamedPipeW(LPCWSTR, DWORD); + WINBOOL SetVolumeLabelW(LPCWSTR, LPCWSTR); + WINBOOL GetVolumeInformationW(LPCWSTR, LPWSTR, DWORD, LPDWORD, LPDWORD, LPDWORD, LPWSTR, DWORD); + WINBOOL ClearEventLogW(HANDLE, LPCWSTR); + WINBOOL BackupEventLogW(HANDLE, LPCWSTR); + HANDLE OpenEventLogW(LPCWSTR, LPCWSTR); + HANDLE RegisterEventSourceW(LPCWSTR, LPCWSTR); + HANDLE OpenBackupEventLogW(LPCWSTR, LPCWSTR); + WINBOOL ReadEventLogW(HANDLE, DWORD, DWORD, LPVOID, DWORD, LPDWORD, LPDWORD); + WINBOOL ReportEventW(HANDLE, ushort, ushort, DWORD, PSID, ushort, DWORD, LPCWSTR*, LPVOID); + WINBOOL AccessCheckAndAuditAlarmW(LPCWSTR, LPVOID, LPWSTR, LPWSTR, PSECURITY_DESCRIPTOR, DWORD, PGENERIC_MAPPING, WINBOOL, LPDWORD, LPBOOL, LPBOOL); + WINBOOL ObjectOpenAuditAlarmW(LPCWSTR, LPVOID, LPWSTR, LPWSTR, PSECURITY_DESCRIPTOR, HANDLE, DWORD, DWORD, PPRIVILEGE_SET, WINBOOL, WINBOOL, LPBOOL); + WINBOOL ObjectPrivilegeAuditAlarmW(LPCWSTR, LPVOID, HANDLE, DWORD, PPRIVILEGE_SET, WINBOOL); + WINBOOL ObjectCloseAuditAlarmW(LPCWSTR, LPVOID, WINBOOL); + WINBOOL PrivilegedServiceAuditAlarmW(LPCWSTR, LPCWSTR, HANDLE, PPRIVILEGE_SET, WINBOOL); + WINBOOL SetFileSecurityW(LPCWSTR, SECURITY_INFORMATION, PSECURITY_DESCRIPTOR); + WINBOOL GetFileSecurityW(LPCWSTR, SECURITY_INFORMATION, PSECURITY_DESCRIPTOR, DWORD, LPDWORD); + HANDLE FindFirstChangeNotificationW(LPCWSTR, WINBOOL, DWORD); + WINBOOL IsBadStringPtrW(LPCWSTR, UINT); + WINBOOL LookupAccountSidW(LPCWSTR, PSID, LPWSTR, LPDWORD, LPWSTR, LPDWORD, PSID_NAME_USE); + WINBOOL LookupAccountNameW(LPCWSTR, LPCWSTR, PSID, LPDWORD, LPWSTR, LPDWORD, PSID_NAME_USE); + WINBOOL LookupPrivilegeValueW(LPCWSTR, LPCWSTR, PLUID); + WINBOOL LookupPrivilegeNameW(LPCWSTR, PLUID, LPWSTR, LPDWORD); + WINBOOL LookupPrivilegeDisplayNameW(LPCWSTR, LPCWSTR, LPWSTR, LPDWORD, LPDWORD); + WINBOOL BuildCommDCBW(LPCWSTR, LPDCB); + WINBOOL BuildCommDCBAndTimeoutsW(LPCWSTR, LPDCB, LPCOMMTIMEOUTS); + WINBOOL CommConfigDialogW(LPCWSTR, HWND, LPCOMMCONFIG); + WINBOOL GetDefaultCommConfigW(LPCWSTR, LPCOMMCONFIG, LPDWORD); + WINBOOL SetDefaultCommConfigW(LPCWSTR, LPCOMMCONFIG, DWORD); + WINBOOL GetComputerNameW(LPWSTR, LPDWORD); + WINBOOL SetComputerNameW(LPCWSTR); + WINBOOL GetUserNameW(LPWSTR, LPDWORD); + int wvsprintfW(LPWSTR, LPCWSTR, VA_LIST*); + HKL LoadKeyboardLayoutW(LPCWSTR, UINT); + WINBOOL GetKeyboardLayoutNameW(LPWSTR); + HDESK CreateDesktopW(LPWSTR, LPWSTR, LPDEVMODE, DWORD, DWORD, LPSECURITY_ATTRIBUTES); + HDESK OpenDesktopW(LPWSTR, DWORD, WINBOOL, DWORD); + WINBOOL EnumDesktopsW(HWINSTA, DESKTOPENUMPROC, LPARAM); + HWINSTA CreateWindowStationW(LPWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES); + HWINSTA OpenWindowStationW(LPWSTR, WINBOOL, DWORD); + WINBOOL EnumWindowStationsW(ENUMWINDOWSTATIONPROC, LPARAM); + WINBOOL GetUserObjectInformationW(HANDLE, int, PVOID, DWORD, LPDWORD); + WINBOOL SetUserObjectInformationW(HANDLE, int, PVOID, DWORD); + UINT RegisterWindowMessageW(LPCWSTR); + WINBOOL GetMessageW(LPMSG, HWND, UINT, UINT); + LONG DispatchMessageW(LPMSG); + WINBOOL PeekMessageW(LPMSG, HWND, UINT, UINT, UINT); + LRESULT SendMessageW(HWND, UINT, WPARAM, LPARAM); + LRESULT SendMessageTimeoutW(HWND, UINT, WPARAM, LPARAM, UINT, UINT, LPDWORD); + WINBOOL SendNotifyMessageW(HWND, UINT, WPARAM, LPARAM); + WINBOOL SendMessageCallbackW(HWND, UINT, WPARAM, LPARAM, SENDASYNCPROC, DWORD); + WINBOOL PostMessageW(HWND, UINT, WPARAM, LPARAM); + WINBOOL PostThreadMessageW(DWORD, UINT, WPARAM, LPARAM); + LRESULT DefWindowProcW(HWND, UINT, WPARAM, LPARAM); + LRESULT CallWindowProcW(WNDPROC, HWND, UINT, WPARAM, LPARAM); + ATOM RegisterClassW(LPWNDCLASS); + WINBOOL UnregisterClassW(LPCWSTR, HINST); + WINBOOL GetClassInfoW(HINST, LPCWSTR, LPWNDCLASS); + ATOM RegisterClassExW(LPWNDCLASSEX); + WINBOOL GetClassInfoExW(HINST, LPCWSTR, LPWNDCLASSEX); + HWND CreateWindowExW(DWORD, LPCWSTR, LPCWSTR, DWORD, int, int, int, int, HWND, HMENU, HINST, LPVOID); + HWND CreateDialogParamW(HINST, LPCWSTR, HWND, DLGPROC, LPARAM); + HWND CreateDialogIndirectParamW(HINST, LPCDLGTEMPLATE, HWND, DLGPROC, LPARAM); + int DialogBoxParamW(HINST, LPCWSTR, HWND, DLGPROC, LPARAM); + int DialogBoxIndirectParamW(HINST, LPCDLGTEMPLATE, HWND, DLGPROC, LPARAM); + WINBOOL SetDlgItemTextW(HWND, int, LPCWSTR); + UINT GetDlgItemTextW(HWND, int, LPWSTR, int); + LONG SendDlgItemMessageW(HWND, int, UINT, WPARAM, LPARAM); + LRESULT DefDlgProcW(HWND, UINT, WPARAM, LPARAM); + WINBOOL CallMsgFilterW(LPMSG, int); + UINT RegisterClipboardFormatW(LPCWSTR); + int GetClipboardFormatNameW(UINT, LPWSTR, int); + WINBOOL CharToOemW(LPCWSTR, LPSTR); + WINBOOL OemToCharW(LPCSTR, LPWSTR); + WINBOOL CharToOemBuffW(LPCWSTR, LPSTR, DWORD); + WINBOOL OemToCharBuffW(LPCSTR, LPWSTR, DWORD); + LPWSTR CharUpperW(LPWSTR); + DWORD CharUpperBuffW(LPWSTR, DWORD); + LPWSTR CharLowerW(LPWSTR); + DWORD CharLowerBuffW(LPWSTR, DWORD); + LPWSTR CharNextW(LPCWSTR); + LPWSTR CharPrevW(LPCWSTR, LPCWSTR); + WINBOOL IsCharAlphaW(WCHAR); + WINBOOL IsCharAlphaNumericW(WCHAR); + WINBOOL IsCharUpperW(WCHAR); + WINBOOL IsCharLowerW(WCHAR); + int GetKeyNameTextW(LONG, LPWSTR, int); + SHORT VkKeyScanW(WCHAR); + SHORT VkKeyScanExW(WCHAR, HKL); + UINT MapVirtualKeyW(UINT, UINT); + UINT MapVirtualKeyExW(UINT, UINT, HKL); + HACCEL LoadAcceleratorsW(HINST, LPCWSTR); + HACCEL CreateAcceleratorTableW(LPACCEL, int); + int CopyAcceleratorTableW(HACCEL, LPACCEL, int); + int TranslateAcceleratorW(HWND, HACCEL, LPMSG); + HMENU LoadMenuW(HINST, LPCWSTR); + HMENU LoadMenuIndirectW(LPMENUTEMPLATE); + WINBOOL ChangeMenuW(HMENU, UINT, LPCWSTR, UINT, UINT); + int GetMenuStringW(HMENU, UINT, LPWSTR, int, UINT); + WINBOOL InsertMenuW(HMENU, UINT, UINT, UINT, LPCWSTR); + WINBOOL AppendMenuW(HMENU, UINT, UINT, LPCWSTR); + WINBOOL ModifyMenuW(HMENU, UINT, UINT, UINT, LPCWSTR); + WINBOOL InsertMenuItemW(HMENU, UINT, WINBOOL, LPCMENUITEMINFO); + WINBOOL GetMenuItemInfoW(HMENU, UINT, WINBOOL, LPMENUITEMINFO); + WINBOOL SetMenuItemInfoW(HMENU, UINT, WINBOOL, LPCMENUITEMINFO); + int DrawTextW(HDC, LPCWSTR, int, LPRECT, UINT); + int DrawTextExW(HDC, LPWSTR, int, LPRECT, UINT, LPDRAWTEXTPARAMS); + WINBOOL GrayStringW(HDC, HBRUSH, GRAYSTRINGPROC, LPARAM, int, int, int, int, int); + WINBOOL DrawStateW(HDC, HBRUSH, DRAWSTATEPROC, LPARAM, WPARAM, int, int, int, int, UINT); + LONG TabbedTextOutW(HDC, int, int, LPCWSTR, int, int, LPINT, int); + DWORD GetTabbedTextExtentW(HDC, LPCWSTR, int, int, LPINT); + WINBOOL SetPropW(HWND, LPCWSTR, HANDLE); + HANDLE GetPropW(HWND, LPCWSTR); + HANDLE RemovePropW(HWND, LPCWSTR); + int EnumPropsExW(HWND, PROPENUMPROCEX, LPARAM); + int EnumPropsW(HWND, PROPENUMPROC); + WINBOOL SetWindowTextW(HWND, LPCWSTR); + int GetWindowTextW(HWND, LPWSTR, int); + int GetWindowTextLengthW(HWND); + int MessageBoxW(HWND, LPCWSTR, LPCWSTR, UINT); + int MessageBoxExW(HWND, LPCWSTR, LPCWSTR, UINT, ushort); + int MessageBoxIndirectW(LPMSGBOXPARAMS); + LONG GetWindowLongW(HWND, int); + LONG SetWindowLongW(HWND, int, LONG); + DWORD GetClassLongW(HWND, int); + DWORD SetClassLongW(HWND, int, LONG); + HWND FindWindowW(LPCWSTR, LPCWSTR); + HWND FindWindowExW(HWND, HWND, LPCWSTR, LPCWSTR); + int GetClassNameW(HWND, LPWSTR, int); + HHOOK SetWindowsHookExW(int, HOOKPROC, HINST, DWORD); + HBITMAP LoadBitmapW(HINST, LPCWSTR); + HCURSOR LoadCursorW(HINST, LPCWSTR); + HCURSOR LoadCursorFromFileW(LPCWSTR); + HICON LoadIconW(HINST, LPCWSTR); + HANDLE LoadImageW(HINST, LPCWSTR, UINT, int, int, UINT); + int LoadStringW(HINST, UINT, LPWSTR, int); + WINBOOL IsDialogMessageW(HWND, LPMSG); + int DlgDirListW(HWND, LPWSTR, int, int, UINT); + WINBOOL DlgDirSelectExW(HWND, LPWSTR, int, int); + int DlgDirListComboBoxW(HWND, LPWSTR, int, int, UINT); + WINBOOL DlgDirSelectComboBoxExW(HWND, LPWSTR, int, int); + LRESULT DefFrameProcW(HWND, HWND, UINT, WPARAM, LPARAM); + LRESULT DefMDIChildProcW(HWND, UINT, WPARAM, LPARAM); + HWND CreateMDIWindowW(LPWSTR, LPWSTR, DWORD, int, int, int, int, HWND, HINST, LPARAM); + WINBOOL WinHelpW(HWND, LPCWSTR, UINT, DWORD); + LONG ChangeDisplaySettingsW(LPDEVMODE, DWORD); + WINBOOL EnumDisplaySettingsW(LPCWSTR, DWORD, LPDEVMODE); + WINBOOL SystemParametersInfoW(UINT, UINT, PVOID, UINT); + int AddFontResourceW(LPCWSTR); + HMETAFILE CopyMetaFileW(HMETAFILE, LPCWSTR); + HFONT CreateFontIndirectW(PLOGFONT); + HFONT CreateFontW(int, int, int, int, int, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPCWSTR); + HDC CreateICW(LPCWSTR, LPCWSTR, LPCWSTR, LPDEVMODE); + HDC CreateMetaFileW(LPCWSTR); + WINBOOL CreateScalableFontResourceW(DWORD, LPCWSTR, LPCWSTR, LPCWSTR); + int EnumFontFamiliesExW(HDC, LPLOGFONT, FONTENUMEXPROC, LPARAM, DWORD); + int EnumFontFamiliesW(HDC, LPCWSTR, FONTENUMPROC, LPARAM); + int EnumFontsW(HDC, LPCWSTR, ENUMFONTSPROC, LPARAM); + WINBOOL GetCharWidthW(HDC, UINT, UINT, LPINT); + WINBOOL GetCharWidth32W(HDC, UINT, UINT, LPINT); + WINBOOL GetCharWidthFloatW(HDC, UINT, UINT, PFLOAT); + WINBOOL GetCharABCWidthsW(HDC, UINT, UINT, LPABC); + WINBOOL GetCharABCWidthsFloatW(HDC, UINT, UINT, LPABCFLOAT); + DWORD GetGlyphOutlineW(HDC, UINT, UINT, LPGLYPHMETRICS, DWORD, LPVOID, PMAT2); + HMETAFILE GetMetaFileW(LPCWSTR); + UINT GetOutlineTextMetricsW(HDC, UINT, LPOUTLINETEXTMETRIC); + WINBOOL GetTextExtentPointW(HDC, LPCWSTR, int, LPSIZE); + WINBOOL GetTextExtentPoint32W(HDC, LPCWSTR, int, LPSIZE); + WINBOOL GetTextExtentExPointW(HDC, LPCWSTR, int, int, LPINT, LPINT, LPSIZE); + DWORD GetCharacterPlacementW(HDC, LPCWSTR, int, int, LPGCP_RESULTS, DWORD); + HDC ResetDCW(HDC, LPDEVMODE); + WINBOOL RemoveFontResourceW(LPCWSTR); + HENHMETAFILE CopyEnhMetaFileW(HENHMETAFILE, LPCWSTR); + HDC CreateEnhMetaFileW(HDC, LPCWSTR, LPRECT, LPCWSTR); + HENHMETAFILE GetEnhMetaFileW(LPCWSTR); + UINT GetEnhMetaFileDescriptionW(HENHMETAFILE, UINT, LPWSTR); + WINBOOL GetTextMetricsW(HDC, LPTEXTMETRIC); + int StartDocW(HDC, PDOCINFO); + int GetObjectW(HGDIOBJ, int, LPVOID); + WINBOOL TextOutW(HDC, int, int, LPCWSTR, int); + WINBOOL ExtTextOutW(HDC, int, int, UINT, LPRECT, LPCWSTR, UINT, LPINT); + WINBOOL PolyTextOutW(HDC, PPOLYTEXT, int); + int GetTextFaceW(HDC, int, LPWSTR); + DWORD GetKerningPairsW(HDC, DWORD, LPKERNINGPAIR); + WINBOOL GetLogColorSpaceW(HCOLORSPACE, LPLOGCOLORSPACE, DWORD); + HCOLORSPACE CreateColorSpaceW(LPLOGCOLORSPACE); + WINBOOL GetICMProfileW(HDC, DWORD, LPWSTR); + WINBOOL SetICMProfileW(HDC, LPWSTR); + WINBOOL UpdateICMRegKeyW(DWORD, DWORD, LPWSTR, UINT); + int EnumICMProfilesW(HDC, ICMENUMPROC, LPARAM); + HPROPSHEETPAGE CreatePropertySheetPageW(LPCPROPSHEETPAGE); + int PropertySheetW(LPCPROPSHEETHEADER); + HIMAGELIST ImageList_LoadImageW(HINST, LPCWSTR, int, int, COLORREF, UINT, UINT); + HWND CreateStatusWindowW(LONG, LPCWSTR, HWND, UINT); + void DrawStatusTextW(HDC, LPRECT, LPCWSTR); + WINBOOL GetOpenFileNameW(LPOPENFILENAME); + WINBOOL GetSaveFileNameW(LPOPENFILENAME); + int GetFileTitleW(LPCWSTR, LPWSTR, ushort); + WINBOOL ChooseColorW(LPCHOOSECOLOR); + HWND ReplaceTextW(LPFINDREPLACE); + WINBOOL ChooseFontW(LPCHOOSEFONT); + HWND FindTextW(LPFINDREPLACE); + WINBOOL PrintDlgW(LPPRINTDLG); + WINBOOL PageSetupDlgW(LPPAGESETUPDLG); + WINBOOL CreateProcessW(LPCWSTR, LPWSTR, LPSECURITY_ATTRIBUTES, LPSECURITY_ATTRIBUTES, WINBOOL, DWORD, LPVOID, LPCWSTR, LPSTARTUPINFO, LPPROCESS_INFORMATION); + void GetStartupInfoW(LPSTARTUPINFO); + HANDLE FindFirstFileW(LPCWSTR, LPWIN32_FIND_DATAW); + WINBOOL FindNextFileW(HANDLE, LPWIN32_FIND_DATAW); + WINBOOL GetVersionExW(LPOSVERSIONINFO); + HDC CreateDCW(LPCWSTR, LPCWSTR, LPCWSTR, PDEVMODE); + HFONT CreateFontA(int, int, int, int, int, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPCSTR); + DWORD VerInstallFileW(DWORD, LPWSTR, LPWSTR, LPWSTR, LPWSTR, LPWSTR, LPWSTR, PUINT); + DWORD GetFileVersionInfoSizeW(LPWSTR, LPDWORD); + WINBOOL GetFileVersionInfoW(LPWSTR, DWORD, DWORD, LPVOID); + DWORD VerLanguageNameW(DWORD, LPWSTR, DWORD); + WINBOOL VerQueryValueW(LPVOID, LPWSTR, LPVOID, PUINT); + DWORD VerFindFileW(DWORD, LPWSTR, LPWSTR, LPWSTR, LPWSTR, PUINT, LPWSTR, PUINT); + LONG RegSetValueExW(HKEY, LPCWSTR, DWORD, DWORD, LPBYTE, DWORD); + LONG RegUnLoadKeyW(HKEY, LPCWSTR); + WINBOOL InitiateSystemShutdownW(LPWSTR, LPWSTR, DWORD, WINBOOL, WINBOOL); + WINBOOL AbortSystemShutdownW(LPWSTR); + LONG RegRestoreKeyW(HKEY, LPCWSTR, DWORD); + LONG RegSaveKeyW(HKEY, LPCWSTR, LPSECURITY_ATTRIBUTES); + LONG RegSetValueW(HKEY, LPCWSTR, DWORD, LPCWSTR, DWORD); + LONG RegQueryValueW(HKEY, LPCWSTR, LPWSTR, PLONG); + LONG RegQueryMultipleValuesW(HKEY, PVALENT, DWORD, LPWSTR, LPDWORD); + LONG RegQueryValueExW(HKEY, LPCWSTR, LPDWORD, LPDWORD, LPBYTE, LPDWORD); + LONG RegReplaceKeyW(HKEY, LPCWSTR, LPCWSTR, LPCWSTR); + LONG RegConnectRegistryW(LPWSTR, HKEY, PHKEY); + LONG RegCreateKeyW(HKEY, LPCWSTR, PHKEY); + LONG RegCreateKeyExW(HKEY, LPCWSTR, DWORD, LPWSTR, DWORD, REGSAM, LPSECURITY_ATTRIBUTES, PHKEY, LPDWORD); + LONG RegDeleteKeyW(HKEY, LPCWSTR); + LONG RegDeleteValueW(HKEY, LPCWSTR); + LONG RegEnumKeyW(HKEY, DWORD, LPWSTR, DWORD); + LONG RegEnumKeyExW(HKEY, DWORD, LPWSTR, LPDWORD, LPDWORD, LPWSTR, LPDWORD, PFILETIME); + LONG RegEnumValueW(HKEY, DWORD, LPWSTR, LPDWORD, LPDWORD, LPDWORD, LPBYTE, LPDWORD); + LONG RegLoadKeyW(HKEY, LPCWSTR, LPCWSTR); + LONG RegOpenKeyW(HKEY, LPCWSTR, PHKEY); + LONG RegOpenKeyExW(HKEY, LPCWSTR, DWORD, REGSAM, PHKEY); + LONG RegQueryInfoKeyW(HKEY, LPWSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD, LPDWORD, LPDWORD, LPDWORD, LPDWORD, LPDWORD, PFILETIME); + int CompareStringW(LCID, DWORD, LPCWSTR, int, LPCWSTR, int); + int LCMapStringW(LCID, DWORD, LPCWSTR, int, LPWSTR, int); + int GetLocaleInfoW(LCID, LCTYPE, LPWSTR, int); + WINBOOL SetLocaleInfoW(LCID, LCTYPE, LPCWSTR); + int GetTimeFormatW(LCID, DWORD, LPSYSTEMTIME, LPCWSTR, LPWSTR, int); + int GetDateFormatW(LCID, DWORD, LPSYSTEMTIME, LPCWSTR, LPWSTR, int); + int GetNumberFormatW(LCID, DWORD, LPCWSTR, PNUMBERFMT, LPWSTR, int); + int GetCurrencyFormatW(LCID, DWORD, LPCWSTR, PCURRENCYFMT, LPWSTR, int); + WINBOOL EnumCalendarInfoW(CALINFO_ENUMPROC, LCID, CALID, CALTYPE); + WINBOOL EnumTimeFormatsW(TIMEFMT_ENUMPROC, LCID, DWORD); + WINBOOL EnumDateFormatsW(DATEFMT_ENUMPROC, LCID, DWORD); + WINBOOL GetStringTypeExW(LCID, DWORD, LPCWSTR, int, LPWORD); + WINBOOL GetStringTypeW(DWORD, LPCWSTR, int, LPWORD); + int FoldStringW(DWORD, LPCWSTR, int, LPWSTR, int); + WINBOOL EnumSystemLocalesW(LOCALE_ENUMPROC, DWORD); + WINBOOL EnumSystemCodePagesW(CODEPAGE_ENUMPROC, DWORD); + WINBOOL PeekConsoleInputW(HANDLE, PINPUTRECORD, DWORD, LPDWORD); + WINBOOL ReadConsoleInputW(HANDLE, PINPUTRECORD, DWORD, LPDWORD); + WINBOOL WriteConsoleInputW(HANDLE, PINPUTRECORD, DWORD, LPDWORD); + WINBOOL ReadConsoleOutputW(HANDLE, PCHAR_INFO, COORD, COORD, PSMALL_RECT); + WINBOOL WriteConsoleOutputW(HANDLE, PCHAR_INFO, COORD, COORD, PSMALL_RECT); + WINBOOL ReadConsoleOutputCharacterW(HANDLE, LPWSTR, DWORD, COORD, LPDWORD); + WINBOOL WriteConsoleOutputCharacterW(HANDLE, LPCWSTR, DWORD, COORD, LPDWORD); + WINBOOL FillConsoleOutputCharacterW(HANDLE, WCHAR, DWORD, COORD, LPDWORD); + WINBOOL ScrollConsoleScreenBufferW(HANDLE, PSMALL_RECT, PSMALL_RECT, COORD, PCHAR_INFO); + DWORD GetConsoleTitleW(LPWSTR, DWORD); + WINBOOL SetConsoleTitleW(LPCWSTR); + WINBOOL ReadConsoleW(HANDLE, LPVOID, DWORD, LPDWORD, LPVOID); + WINBOOL WriteConsoleW(HANDLE, POINTER, DWORD, LPDWORD, LPVOID); + DWORD WNetAddConnectionW(LPCWSTR, LPCWSTR, LPCWSTR); + DWORD WNetAddConnection2W(LPNETRESOURCE, LPCWSTR, LPCWSTR, DWORD); + DWORD WNetAddConnection3W(HWND, LPNETRESOURCE, LPCWSTR, LPCWSTR, DWORD); + DWORD WNetCancelConnectionW(LPCWSTR, WINBOOL); + DWORD WNetCancelConnection2W(LPCWSTR, DWORD, WINBOOL); + DWORD WNetGetConnectionW(LPCWSTR, LPWSTR, LPDWORD); + DWORD WNetUseConnectionW(HWND, LPNETRESOURCE, LPCWSTR, LPCWSTR, DWORD, LPWSTR, LPDWORD, LPDWORD); + DWORD WNetSetConnectionW(LPCWSTR, DWORD, LPVOID); + DWORD WNetConnectionDialog1W(LPCONNECTDLGSTRUCT); + DWORD WNetDisconnectDialog1W(LPDISCDLGSTRUCT); + DWORD WNetOpenEnumW(DWORD, DWORD, DWORD, LPNETRESOURCE, LPHANDLE); + DWORD WNetEnumResourceW(HANDLE, LPDWORD, LPVOID, LPDWORD); + DWORD WNetGetUniversalNameW(LPCWSTR, DWORD, LPVOID, LPDWORD); + DWORD WNetGetUserW(LPCWSTR, LPWSTR, LPDWORD); + DWORD WNetGetProviderNameW(DWORD, LPWSTR, LPDWORD); + DWORD WNetGetNetworkInformationW(LPCWSTR, LPNETINFOSTRUCT); + DWORD WNetGetLastErrorW(LPDWORD, LPWSTR, DWORD, LPWSTR, DWORD); + DWORD MultinetGetConnectionPerformanceW(LPNETRESOURCE, LPNETCONNECTINFOSTRUCT); + WINBOOL ChangeServiceConfigW(SC_HANDLE, DWORD, DWORD, DWORD, LPCWSTR, LPCWSTR, LPDWORD, LPCWSTR, LPCWSTR, LPCWSTR, LPCWSTR); + SC_HANDLE CreateServiceW(SC_HANDLE, LPCWSTR, LPCWSTR, DWORD, DWORD, DWORD, DWORD, LPCWSTR, LPCWSTR, LPDWORD, LPCWSTR, LPCWSTR, LPCWSTR); + WINBOOL EnumDependentServicesW(SC_HANDLE, DWORD, LPENUM_SERVICE_STATUS, DWORD, LPDWORD, LPDWORD); + WINBOOL EnumServicesStatusW(SC_HANDLE, DWORD, DWORD, LPENUM_SERVICE_STATUS, DWORD, LPDWORD, LPDWORD, LPDWORD); + WINBOOL GetServiceKeyNameW(SC_HANDLE, LPCWSTR, LPWSTR, LPDWORD); + WINBOOL GetServiceDisplayNameW(SC_HANDLE, LPCWSTR, LPWSTR, LPDWORD); + SC_HANDLE OpenSCManagerW(LPCWSTR, LPCWSTR, DWORD); + SC_HANDLE OpenServiceW(SC_HANDLE, LPCWSTR, DWORD); + WINBOOL QueryServiceConfigW(SC_HANDLE, LPQUERY_SERVICE_CONFIG, DWORD, LPDWORD); + WINBOOL QueryServiceLockStatusW(SC_HANDLE, LPQUERY_SERVICE_LOCK_STATUS, DWORD, LPDWORD); + SERVICE_STATUS_HANDLE RegisterServiceCtrlHandlerW(LPCWSTR, LPHANDLER_FUNCTION); + WINBOOL StartServiceCtrlDispatcherW(LPSERVICE_TABLE_ENTRY); + WINBOOL StartServiceW(SC_HANDLE, DWORD, LPCWSTR); + uint DragQueryFileW(HDROP, uint, LPCWSTR, uint); + HICON ExtractAssociatedIconW(HINST, LPCWSTR, LPWORD); + HICON ExtractIconW(HINST, LPCWSTR, uint); + HINST FindExecutableW(LPCWSTR, LPCWSTR, LPCWSTR); + int ShellAboutW(HWND, LPCWSTR, LPCWSTR, HICON); + HINST ShellExecuteW(HWND, LPCWSTR, LPCWSTR, LPCWSTR, LPCWSTR, int); + HSZ DdeCreateStringHandleW(DWORD, LPCWSTR, int); + UINT DdeInitializeW(LPDWORD, PFNCALLBACK, DWORD, DWORD); + DWORD DdeQueryStringW(DWORD, HSZ, LPCWSTR, DWORD, int); + WINBOOL LogonUserW(LPWSTR, LPWSTR, LPWSTR, DWORD, DWORD, PHANDLE); + WINBOOL CreateProcessAsUserW(HANDLE, LPCWSTR, LPWSTR, LPSECURITY_ATTRIBUTES, LPSECURITY_ATTRIBUTES, WINBOOL, DWORD, LPVOID, LPCWSTR, LPSTARTUPINFO, LPPROCESS_INFORMATION); + WINBOOL AccessCheck(PSECURITY_DESCRIPTOR, HANDLE, DWORD, PGENERIC_MAPPING, PPRIVILEGE_SET, LPDWORD, LPDWORD, LPBOOL); + LONG InterlockedIncrement(LPLONG); + LONG InterlockedDecrement(LPLONG); + LONG InterlockedExchange(LPLONG, LONG); + WINBOOL FreeResource(HGLOBAL); + LPVOID LockResource(HGLOBAL); + WINBOOL FreeLibrary(HINST); + void FreeLibraryAndExitThread(HMODULE, DWORD); + WINBOOL DisableThreadLibraryCalls(HMODULE); + FARPROC GetProcAddress(HINST, LPCSTR); + DWORD GetVersion(); + HGLOBAL GlobalAlloc(UINT, DWORD); + HGLOBAL GlobalReAlloc(HGLOBAL, DWORD, UINT); + DWORD GlobalSize(HGLOBAL); + UINT GlobalFlags(HGLOBAL); + LPVOID GlobalLock(HGLOBAL); + HGLOBAL GlobalHandle(LPCVOID); + WINBOOL GlobalUnlock(HGLOBAL); + HGLOBAL GlobalFree(HGLOBAL); + UINT GlobalCompact(DWORD); + void GlobalFix(HGLOBAL); + void GlobalUnfix(HGLOBAL); + LPVOID GlobalWire(HGLOBAL); + WINBOOL GlobalUnWire(HGLOBAL); + void GlobalMemoryStatus(LPMEMORYSTATUS); + HLOCAL LocalAlloc(UINT, UINT); + HLOCAL LocalReAlloc(HLOCAL, UINT, UINT); + LPVOID LocalLock(HLOCAL); + HLOCAL LocalHandle(LPCVOID); + WINBOOL LocalUnlock(HLOCAL); + UINT LocalSize(HLOCAL); + UINT LocalFlags(HLOCAL); + HLOCAL LocalFree(HLOCAL); + UINT LocalShrink(HLOCAL, UINT); + UINT LocalCompact(UINT); + WINBOOL FlushInstructionCache(HANDLE, LPCVOID, DWORD); + LPVOID VirtualAlloc(LPVOID, DWORD, DWORD, DWORD); + WINBOOL VirtualFree(LPVOID, DWORD, DWORD); + WINBOOL VirtualProtect(LPVOID, DWORD, DWORD, PDWORD); + DWORD VirtualQuery(LPCVOID, PMEMORY_BASIC_INFORMATION, DWORD); + WINBOOL VirtualProtectEx(HANDLE, LPVOID, DWORD, DWORD, PDWORD); + DWORD VirtualQueryEx(HANDLE, LPCVOID, PMEMORY_BASIC_INFORMATION, DWORD); + HANDLE HeapCreate(DWORD, DWORD, DWORD); + WINBOOL HeapDestroy(HANDLE); + LPVOID HeapAlloc(HANDLE, DWORD, DWORD); + LPVOID HeapReAlloc(HANDLE, DWORD, LPVOID, DWORD); + WINBOOL HeapFree(HANDLE, DWORD, LPVOID); + DWORD HeapSize(HANDLE, DWORD, LPCVOID); + WINBOOL HeapValidate(HANDLE, DWORD, LPCVOID); + UINT HeapCompact(HANDLE, DWORD); + HANDLE GetProcessHeap(); + DWORD GetProcessHeaps(DWORD, PHANDLE); + WINBOOL HeapLock(HANDLE); + WINBOOL HeapUnlock(HANDLE); + WINBOOL HeapWalk(HANDLE, LPPROCESS_HEAP_ENTRY); + WINBOOL GetProcessAffinityMask(HANDLE, LPDWORD, LPDWORD); + WINBOOL GetProcessTimes(HANDLE, LPFILETIME, LPFILETIME, LPFILETIME, LPFILETIME); + WINBOOL GetProcessWorkingSetSize(HANDLE, LPDWORD, LPDWORD); + WINBOOL SetProcessWorkingSetSize(HANDLE, DWORD, DWORD); + HANDLE OpenProcess(DWORD, WINBOOL, DWORD); + HANDLE GetCurrentProcess(); + DWORD GetCurrentProcessId(); + void ExitProcess(UINT); + WINBOOL TerminateProcess(HANDLE, UINT); + WINBOOL GetExitCodeProcess(HANDLE, LPDWORD); + void FatalExit(int); + void RaiseException(DWORD, DWORD, DWORD); + LONG UnhandledExceptionFilter(EMPTYRECORD*); + HANDLE CreateRemoteThread(HANDLE, LPSECURITY_ATTRIBUTES, DWORD, LPTHREAD_START_ROUTINE, LPVOID, DWORD, LPDWORD); + HANDLE GetCurrentThread(); + DWORD GetCurrentThreadId(); + DWORD SetThreadAffinityMask(HANDLE, DWORD); + WINBOOL SetThreadPriority(HANDLE, int); + int GetThreadPriority(HANDLE); + WINBOOL GetThreadTimes(HANDLE, LPFILETIME, LPFILETIME, LPFILETIME, LPFILETIME); + void ExitThread(DWORD); + WINBOOL TerminateThread(HANDLE, DWORD); + WINBOOL GetExitCodeThread(HANDLE, LPDWORD); + WINBOOL GetThreadSelectorEntry(HANDLE, DWORD, LPLDT_ENTRY); + DWORD GetLastError(); + void SetLastError(DWORD); + HANDLE CreateIoCompletionPort(HANDLE, HANDLE, DWORD, DWORD); + UINT SetErrorMode(UINT); + WINBOOL ReadProcessMemory(HANDLE, LPCVOID, LPVOID, DWORD, LPDWORD); + WINBOOL WriteProcessMemory(HANDLE, LPVOID, LPVOID, DWORD, LPDWORD); + WINBOOL GetThreadContext(HANDLE, LPCONTEXT); + DWORD SuspendThread(HANDLE); + DWORD ResumeThread(HANDLE); + void DebugBreak(); + WINBOOL WaitForDebugEvent(LPDEBUG_EVENT, DWORD); + WINBOOL ContinueDebugEvent(DWORD, DWORD, DWORD); + WINBOOL DebugActiveProcess(DWORD); + void InitializeCriticalSection(LPCRITICAL_SECTION); + void EnterCriticalSection(LPCRITICAL_SECTION); + WINBOOL TryEnterCriticalSection(LPCRITICAL_SECTION); + void LeaveCriticalSection(LPCRITICAL_SECTION); + void DeleteCriticalSection(LPCRITICAL_SECTION); + WINBOOL SetEvent(HANDLE); + WINBOOL ResetEvent(HANDLE); + WINBOOL PulseEvent(HANDLE); + WINBOOL ReleaseSemaphore(HANDLE, LONG, LPLONG); + WINBOOL ReleaseMutex(HANDLE); + DWORD WaitForSingleObject(HANDLE, DWORD); + DWORD WaitForMultipleObjects(DWORD, HANDLE*, WINBOOL, DWORD); + void Sleep(DWORD); + HGLOBAL LoadResource(HINST, HRSRC); + DWORD SizeofResource(HINST, HRSRC); + ATOM GlobalDeleteAtom(ATOM); + WINBOOL InitAtomTable(DWORD); + ATOM DeleteAtom(ATOM); + UINT SetHandleCount(UINT); + DWORD GetLogicalDrives(); + WINBOOL LockFile(HANDLE, DWORD, DWORD, DWORD, DWORD); + WINBOOL UnlockFile(HANDLE, DWORD, DWORD, DWORD, DWORD); + WINBOOL LockFileEx(HANDLE, DWORD, DWORD, DWORD, DWORD, LPOVERLAPPED); + WINBOOL UnlockFileEx(HANDLE, DWORD, DWORD, DWORD, LPOVERLAPPED); + WINBOOL GetFileInformationByHandle(HANDLE, LPBY_HANDLE_FILE_INFORMATION); + DWORD GetFileType(HANDLE); + DWORD GetFileSize(HANDLE, LPDWORD); + HANDLE GetStdHandle(DWORD); + WINBOOL SetStdHandle(DWORD, HANDLE); + WINBOOL FlushFileBuffers(HANDLE); + WINBOOL DeviceIoControl(HANDLE, DWORD, LPVOID, DWORD, LPVOID, DWORD, LPDWORD, LPOVERLAPPED); + WINBOOL SetEndOfFile(HANDLE); + DWORD SetFilePointer(HANDLE, LONG, PLONG, DWORD); + WINBOOL FindClose(HANDLE); + WINBOOL GetFileTime(HANDLE, LPFILETIME, LPFILETIME, LPFILETIME); + WINBOOL SetFileTime(HANDLE, FILETIME*, FILETIME*, FILETIME*); + WINBOOL CloseHandle(HANDLE); + WINBOOL DuplicateHandle(HANDLE, HANDLE, HANDLE, LPHANDLE, DWORD, WINBOOL, DWORD); + WINBOOL GetHandleInformation(HANDLE, LPDWORD); + WINBOOL SetHandleInformation(HANDLE, DWORD, DWORD); + DWORD LoadModule(LPCSTR, LPVOID); + UINT WinExec(LPCSTR, UINT); + WINBOOL ClearCommBreak(HANDLE); + WINBOOL ClearCommError(HANDLE, LPDWORD, LPCOMSTAT); + WINBOOL SetupComm(HANDLE, DWORD, DWORD); + WINBOOL EscapeCommFunction(HANDLE, DWORD); + WINBOOL GetCommConfig(HANDLE, LPCOMMCONFIG, LPDWORD); + WINBOOL GetCommProperties(HANDLE, LPCOMMPROP); + WINBOOL GetCommModemStatus(HANDLE, PDWORD); + WINBOOL GetCommState(HANDLE, PDCB); + WINBOOL GetCommTimeouts(HANDLE, PCOMMTIMEOUTS); + WINBOOL PurgeComm(HANDLE, DWORD); + WINBOOL SetCommBreak(HANDLE); + WINBOOL SetCommConfig(HANDLE, LPCOMMCONFIG, DWORD); + WINBOOL SetCommMask(HANDLE, DWORD); + WINBOOL SetCommState(HANDLE, TDCB*); + WINBOOL SetCommTimeouts(HANDLE, TCOMMTIMEOUTS*); + WINBOOL TransmitCommChar(HANDLE, char); + WINBOOL WaitCommEvent(HANDLE, LPDWORD, LPOVERLAPPED); + DWORD SetTapePosition(HANDLE, DWORD, DWORD, DWORD, DWORD, WINBOOL); + DWORD GetTapePosition(HANDLE, DWORD, LPDWORD, LPDWORD, LPDWORD); + DWORD PrepareTape(HANDLE, DWORD, WINBOOL); + DWORD EraseTape(HANDLE, DWORD, WINBOOL); + DWORD CreateTapePartition(HANDLE, DWORD, DWORD, DWORD); + DWORD WriteTapemark(HANDLE, DWORD, DWORD, WINBOOL); + DWORD GetTapeStatus(HANDLE); + DWORD GetTapeParameters(HANDLE, DWORD, LPDWORD, LPVOID); + DWORD SetTapeParameters(HANDLE, DWORD, LPVOID); + WINBOOL Beep(DWORD, DWORD); + int MulDiv(int, int, int); + void GetSystemTime(LPSYSTEMTIME); + void GetSystemTimeAsFileTime(FILETIME*); + WINBOOL SetSystemTime(SYSTEMTIME*); + void GetLocalTime(LPSYSTEMTIME); + WINBOOL SetLocalTime(SYSTEMTIME*); + void GetSystemInfo(LPSYSTEM_INFO); + WINBOOL SystemTimeToTzSpecificLocalTime(LPTIME_ZONE_INFORMATION, LPSYSTEMTIME, LPSYSTEMTIME); + DWORD GetTimeZoneInformation(LPTIME_ZONE_INFORMATION); + WINBOOL SetTimeZoneInformation(TIME_ZONE_INFORMATION*); + WINBOOL SystemTimeToFileTime(SYSTEMTIME*, LPFILETIME); + WINBOOL FileTimeToLocalFileTime(FILETIME*, LPFILETIME); + WINBOOL LocalFileTimeToFileTime(FILETIME*, LPFILETIME); + WINBOOL FileTimeToSystemTime(FILETIME*, LPSYSTEMTIME); + LONG CompareFileTime(FILETIME*, FILETIME*); + WINBOOL FileTimeToDosDateTime(FILETIME*, LPWORD, LPWORD); + WINBOOL DosDateTimeToFileTime(ushort, ushort, LPFILETIME); + DWORD GetTickCount(); + WINBOOL SetSystemTimeAdjustment(DWORD, WINBOOL); + WINBOOL GetSystemTimeAdjustment(PDWORD, PDWORD, PWINBOOL); + WINBOOL CreatePipe(PHANDLE, PHANDLE, LPSECURITY_ATTRIBUTES, DWORD); + WINBOOL ConnectNamedPipe(HANDLE, LPOVERLAPPED); + WINBOOL DisconnectNamedPipe(HANDLE); + WINBOOL SetNamedPipeHandleState(HANDLE, LPDWORD, LPDWORD, LPDWORD); + WINBOOL GetNamedPipeInfo(HANDLE, LPDWORD, LPDWORD, LPDWORD, LPDWORD); + WINBOOL PeekNamedPipe(HANDLE, LPVOID, DWORD, LPDWORD, LPDWORD, LPDWORD); + WINBOOL TransactNamedPipe(HANDLE, LPVOID, DWORD, LPVOID, DWORD, LPDWORD, LPOVERLAPPED); + WINBOOL GetMailslotInfo(HANDLE, LPDWORD, LPDWORD, LPDWORD, LPDWORD); + WINBOOL SetMailslotInfo(HANDLE, DWORD); + LPVOID MapViewOfFile(HANDLE, DWORD, DWORD, DWORD, DWORD); + WINBOOL FlushViewOfFile(LPCVOID, DWORD); + WINBOOL UnmapViewOfFile(LPVOID); + HFILE OpenFile(LPCSTR, LPOFSTRUCT, UINT); + HFILE _lopen(LPCSTR, int); + HFILE _lcreat(LPCSTR, int); + UINT _lread(HFILE, LPVOID, UINT); + UINT _lwrite(HFILE, LPCSTR, UINT); + int _hread(HFILE, LPVOID, int); + int _hwrite(HFILE, LPCSTR, int); + HFILE _lclose(HFILE); + LONG _llseek(HFILE, LONG, int); + WINBOOL IsTextUnicode(LPVOID, int, LPINT); + DWORD TlsAlloc(); + LPVOID TlsGetValue(DWORD); + WINBOOL TlsSetValue(DWORD, LPVOID); + WINBOOL TlsFree(DWORD); + DWORD SleepEx(DWORD, WINBOOL); + DWORD WaitForSingleObjectEx(HANDLE, DWORD, WINBOOL); + DWORD WaitForMultipleObjectsEx(DWORD, HANDLE*, WINBOOL, DWORD, WINBOOL); + WINBOOL ReadFileEx(HANDLE, LPVOID, DWORD, LPOVERLAPPED, LPOVERLAPPED_COMPLETION_ROUTINE); + WINBOOL WriteFileEx(HANDLE, LPCVOID, DWORD, LPOVERLAPPED, LPOVERLAPPED_COMPLETION_ROUTINE); + WINBOOL BackupRead(HANDLE, LPBYTE, DWORD, LPDWORD, WINBOOL, WINBOOL, LPVOID*); + WINBOOL BackupSeek(HANDLE, DWORD, DWORD, LPDWORD, LPDWORD, LPVOID*); + WINBOOL BackupWrite(HANDLE, LPBYTE, DWORD, LPDWORD, WINBOOL, WINBOOL, LPVOID*); + WINBOOL SetProcessShutdownParameters(DWORD, DWORD); + WINBOOL GetProcessShutdownParameters(LPDWORD, LPDWORD); + void SetFileApisToOEM(); + void SetFileApisToANSI(); + WINBOOL AreFileApisANSI(); + WINBOOL CloseEventLog(HANDLE); + WINBOOL DeregisterEventSource(HANDLE); + WINBOOL NotifyChangeEventLog(HANDLE, HANDLE); + WINBOOL GetNumberOfEventLogRecords(HANDLE, PDWORD); + WINBOOL GetOldestEventLogRecord(HANDLE, PDWORD); + WINBOOL DuplicateToken(HANDLE, SECURITY_IMPERSONATION_LEVEL, PHANDLE); + WINBOOL GetKernelObjectSecurity(HANDLE, SECURITY_INFORMATION, PSECURITY_DESCRIPTOR, DWORD, LPDWORD); + WINBOOL ImpersonateNamedPipeClient(HANDLE); + WINBOOL ImpersonateLoggedOnUser(HANDLE); + WINBOOL ImpersonateSelf(SECURITY_IMPERSONATION_LEVEL); + WINBOOL RevertToSelf(); + WINBOOL SetThreadToken(PHANDLE, HANDLE); + WINBOOL OpenProcessToken(HANDLE, DWORD, PHANDLE); + WINBOOL OpenThreadToken(HANDLE, DWORD, WINBOOL, PHANDLE); + WINBOOL GetTokenInformation(HANDLE, TOKEN_INFORMATION_CLASS, LPVOID, DWORD, PDWORD); + WINBOOL SetTokenInformation(HANDLE, TOKEN_INFORMATION_CLASS, LPVOID, DWORD); + WINBOOL AdjustTokenPrivileges(HANDLE, WINBOOL, PTOKEN_PRIVILEGES, DWORD, PTOKEN_PRIVILEGES, PDWORD); + WINBOOL AdjustTokenGroups(HANDLE, WINBOOL, PTOKEN_GROUPS, DWORD, PTOKEN_GROUPS, PDWORD); + WINBOOL PrivilegeCheck(HANDLE, PPRIVILEGE_SET, LPBOOL); + WINBOOL IsValidSid(PSID); + WINBOOL EqualSid(PSID, PSID); + WINBOOL EqualPrefixSid(PSID, PSID); + DWORD GetSidLengthRequired(UCHAR); + WINBOOL AllocateAndInitializeSid(PSID_IDENTIFIER_AUTHORITY, ubyte, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, PSID*); + PVOID FreeSid(PSID); + WINBOOL InitializeSid(PSID, PSID_IDENTIFIER_AUTHORITY, ubyte); + PSID_IDENTIFIER_AUTHORITY GetSidIdentifierAuthority(PSID); + PDWORD GetSidSubAuthority(PSID, DWORD); + PUCHAR GetSidSubAuthorityCount(PSID); + DWORD GetLengthSid(PSID); + WINBOOL CopySid(DWORD, PSID, PSID); + WINBOOL AreAllAccessesGranted(DWORD, DWORD); + WINBOOL AreAnyAccessesGranted(DWORD, DWORD); + void MapGenericMask(PDWORD); + WINBOOL IsValidAcl(PACL); + WINBOOL InitializeAcl(PACL, DWORD, DWORD); + WINBOOL GetAclInformation(PACL, LPVOID, DWORD, ACL_INFORMATION_CLASS); + WINBOOL SetAclInformation(PACL, LPVOID, DWORD, ACL_INFORMATION_CLASS); + WINBOOL AddAce(PACL, DWORD, DWORD, LPVOID, DWORD); + WINBOOL DeleteAce(PACL, DWORD); + WINBOOL GetAce(PACL, DWORD, LPVOID*); + WINBOOL AddAccessAllowedAce(PACL, DWORD, DWORD, PSID); + WINBOOL AddAccessDeniedAce(PACL, DWORD, DWORD, PSID); + WINBOOL AddAuditAccessAce(PACL, DWORD, DWORD, PSID, WINBOOL, WINBOOL); + WINBOOL FindFirstFreeAce(PACL, LPVOID*); + WINBOOL InitializeSecurityDescriptor(PSECURITY_DESCRIPTOR, DWORD); + WINBOOL IsValidSecurityDescriptor(PSECURITY_DESCRIPTOR); + DWORD GetSecurityDescriptorLength(PSECURITY_DESCRIPTOR); + WINBOOL GetSecurityDescriptorControl(PSECURITY_DESCRIPTOR, PSECURITY_DESCRIPTOR_CONTROL, LPDWORD); + WINBOOL SetSecurityDescriptorDacl(PSECURITY_DESCRIPTOR, WINBOOL, PACL, WINBOOL); + WINBOOL GetSecurityDescriptorDacl(PSECURITY_DESCRIPTOR, LPBOOL, PACL*, LPBOOL); + WINBOOL SetSecurityDescriptorSacl(PSECURITY_DESCRIPTOR, WINBOOL, PACL, WINBOOL); + WINBOOL GetSecurityDescriptorSacl(PSECURITY_DESCRIPTOR, LPBOOL, PACL*, LPBOOL); + WINBOOL SetSecurityDescriptorOwner(PSECURITY_DESCRIPTOR, PSID, WINBOOL); + WINBOOL GetSecurityDescriptorOwner(PSECURITY_DESCRIPTOR, PSID*, LPBOOL); + WINBOOL SetSecurityDescriptorGroup(PSECURITY_DESCRIPTOR, PSID, WINBOOL); + WINBOOL GetSecurityDescriptorGroup(PSECURITY_DESCRIPTOR, PSID*, LPBOOL); + WINBOOL CreatePrivateObjectSecurity(PSECURITY_DESCRIPTOR, PSECURITY_DESCRIPTOR, PSECURITY_DESCRIPTOR*, WINBOOL, HANDLE, PGENERIC_MAPPING); + WINBOOL SetPrivateObjectSecurity(SECURITY_INFORMATION, PSECURITY_DESCRIPTOR, PSECURITY_DESCRIPTOR*, PGENERIC_MAPPING, HANDLE); + WINBOOL GetPrivateObjectSecurity(PSECURITY_DESCRIPTOR, SECURITY_INFORMATION, PSECURITY_DESCRIPTOR, DWORD, PDWORD); + WINBOOL DestroyPrivateObjectSecurity(PSECURITY_DESCRIPTOR); + WINBOOL MakeSelfRelativeSD(PSECURITY_DESCRIPTOR, PSECURITY_DESCRIPTOR, LPDWORD); + WINBOOL MakeAbsoluteSD(PSECURITY_DESCRIPTOR, PSECURITY_DESCRIPTOR, LPDWORD, PACL, LPDWORD, PACL, LPDWORD, PSID, LPDWORD, PSID, LPDWORD); + WINBOOL SetKernelObjectSecurity(HANDLE, SECURITY_INFORMATION, PSECURITY_DESCRIPTOR); + WINBOOL FindNextChangeNotification(HANDLE); + WINBOOL FindCloseChangeNotification(HANDLE); + WINBOOL VirtualLock(LPVOID, DWORD); + WINBOOL VirtualUnlock(LPVOID, DWORD); + LPVOID MapViewOfFileEx(HANDLE, DWORD, DWORD, DWORD, DWORD, LPVOID); + WINBOOL SetPriorityClass(HANDLE, DWORD); + DWORD GetPriorityClass(HANDLE); + WINBOOL IsBadReadPtr(POINTER, UINT); + WINBOOL IsBadWritePtr(LPVOID, UINT); + WINBOOL IsBadHugeReadPtr(POINTER, UINT); + WINBOOL IsBadHugeWritePtr(LPVOID, UINT); + WINBOOL IsBadCodePtr(FARPROC); + WINBOOL AllocateLocallyUniqueId(PLUID); + WINBOOL QueryPerformanceCounter(PLARGE_INTEGER); + WINBOOL QueryPerformanceFrequency(PLARGE_INTEGER); + WINBOOL ActivateKeyboardLayout(HKL, UINT); + WINBOOL UnloadKeyboardLayout(HKL); + int GetKeyboardLayoutList(int, HKL*); + HKL GetKeyboardLayout(DWORD); + HDESK OpenInputDesktop(DWORD, WINBOOL, DWORD); + WINBOOL EnumDesktopWindows(HDESK, ENUMWINDOWSPROC, LPARAM); + WINBOOL SwitchDesktop(HDESK); + WINBOOL SetThreadDesktop(HDESK); + WINBOOL CloseDesktop(HDESK); + HDESK GetThreadDesktop(DWORD); + WINBOOL CloseWindowStation(HWINSTA); + WINBOOL SetProcessWindowStation(HWINSTA); + HWINSTA GetProcessWindowStation(); + WINBOOL SetUserObjectSecurity(HANDLE, PSECURITY_INFORMATION, PSECURITY_DESCRIPTOR); + WINBOOL GetUserObjectSecurity(HANDLE, PSECURITY_INFORMATION, PSECURITY_DESCRIPTOR, DWORD, LPDWORD); + WINBOOL TranslateMessage(LPMSG); + WINBOOL SetMessageQueue(int); + WINBOOL RegisterHotKey(HWND, int, UINT, UINT); + WINBOOL UnregisterHotKey(HWND, int); + WINBOOL ExitWindowsEx(UINT, DWORD); + WINBOOL SwapMouseButton(WINBOOL); + DWORD GetMessagePos(); + LONG GetMessageTime(); + LONG GetMessageExtraInfo(); + LPARAM SetMessageExtraInfo(LPARAM); + int BroadcastSystemMessage(DWORD, LPDWORD, UINT, WPARAM, LPARAM); + WINBOOL AttachThreadInput(DWORD, DWORD, WINBOOL); + WINBOOL ReplyMessage(LRESULT); + WINBOOL WaitMessage(); + DWORD WaitForInputIdle(HANDLE, DWORD); + void PostQuitMessage(int); + WINBOOL InSendMessage(); + UINT GetDoubleClickTime(); + WINBOOL SetDoubleClickTime(UINT); + WINBOOL IsWindow(HWND); + WINBOOL IsMenu(HMENU); + WINBOOL IsChild(HWND, HWND); + WINBOOL DestroyWindow(HWND); + WINBOOL ShowWindow(HWND, int); + WINBOOL ShowWindowAsync(HWND, int); + WINBOOL FlashWindow(HWND, WINBOOL); + WINBOOL ShowOwnedPopups(HWND, WINBOOL); + WINBOOL OpenIcon(HWND); + WINBOOL CloseWindow(HWND); + WINBOOL MoveWindow(HWND, int, int, int, int, WINBOOL); + WINBOOL SetWindowPos(HWND, HWND, int, int, int, int, UINT); + WINBOOL GetWindowPlacement(HWND, WINDOWPLACEMENT*); + WINBOOL SetWindowPlacement(HWND, WINDOWPLACEMENT*); + HDWP BeginDeferWindowPos(int); + HDWP DeferWindowPos(HDWP, HWND, HWND, int, int, int, int, UINT); + WINBOOL EndDeferWindowPos(HDWP); + WINBOOL IsWindowVisible(HWND); + WINBOOL IsIconic(HWND); + WINBOOL AnyPopup(); + WINBOOL BringWindowToTop(HWND); + WINBOOL IsZoomed(HWND); + WINBOOL EndDialog(HWND, int); + HWND GetDlgItem(HWND, int); + WINBOOL SetDlgItemInt(HWND, int, UINT, WINBOOL); + UINT GetDlgItemInt(HWND, int, WINBOOL*, WINBOOL); + WINBOOL CheckDlgButton(HWND, int, UINT); + WINBOOL CheckRadioButton(HWND, int, int, int); + UINT IsDlgButtonChecked(HWND, int); + HWND GetNextDlgGroupItem(HWND, HWND, WINBOOL); + HWND GetNextDlgTabItem(HWND, HWND, WINBOOL); + int GetDlgCtrlID(HWND); + int GetDialogBaseUnits(); + WINBOOL OpenClipboard(HWND); + WINBOOL CloseClipboard(); + HWND GetClipboardOwner(); + HWND SetClipboardViewer(HWND); + HWND GetClipboardViewer(); + WINBOOL ChangeClipboardChain(HWND, HWND); + HANDLE SetClipboardData(UINT, HANDLE); + HANDLE GetClipboardData(UINT); + int CountClipboardFormats(); + UINT EnumClipboardFormats(UINT); + WINBOOL EmptyClipboard(); + WINBOOL IsClipboardFormatAvailable(UINT); + int GetPriorityClipboardFormat(UINT*, int); + HWND GetOpenClipboardWindow(); + LPSTR CharNextExA(ushort, LPCSTR, DWORD); + LPSTR CharPrevExA(ushort, LPCSTR, LPCSTR, DWORD); + HWND SetFocus(HWND); + HWND GetActiveWindow(); + HWND GetFocus(); + UINT GetKBCodePage(); + SHORT GetKeyState(int); + SHORT GetAsyncKeyState(int); + WINBOOL GetKeyboardState(PBYTE); + WINBOOL SetKeyboardState(LPBYTE); + int GetKeyboardType(int); + int ToAscii(UINT, UINT, PBYTE, LPWORD, UINT); + int ToAsciiEx(UINT, UINT, PBYTE, LPWORD, UINT, HKL); + int ToUnicode(UINT, UINT, PBYTE, LPWSTR, int, UINT); + DWORD OemKeyScan(ushort); + void keybd_event(ubyte, ubyte, DWORD); + void mouse_event(DWORD, DWORD, DWORD, DWORD); + WINBOOL GetInputState(); + DWORD GetQueueStatus(UINT); + HWND GetCapture(); + HWND SetCapture(HWND); + WINBOOL ReleaseCapture(); + DWORD MsgWaitForMultipleObjects(DWORD, LPHANDLE, WINBOOL, DWORD, DWORD); + UINT SetTimer(HWND, UINT, UINT, TIMERPROC); + WINBOOL KillTimer(HWND, UINT); + WINBOOL IsWindowUnicode(HWND); + WINBOOL EnableWindow(HWND, WINBOOL); + WINBOOL IsWindowEnabled(HWND); + WINBOOL DestroyAcceleratorTable(HACCEL); + int GetSystemMetrics(int); + HMENU GetMenu(HWND); + WINBOOL SetMenu(HWND, HMENU); + WINBOOL HiliteMenuItem(HWND, HMENU, UINT, UINT); + UINT GetMenuState(HMENU, UINT, UINT); + WINBOOL DrawMenuBar(HWND); + HMENU GetSystemMenu(HWND, WINBOOL); + HMENU CreateMenu(); + HMENU CreatePopupMenu(); + WINBOOL DestroyMenu(HMENU); + DWORD CheckMenuItem(HMENU, UINT, UINT); + WINBOOL EnableMenuItem(HMENU, UINT, UINT); + HMENU GetSubMenu(HMENU, int); + UINT GetMenuItemID(HMENU, int); + int GetMenuItemCount(HMENU); + WINBOOL RemoveMenu(HMENU, UINT, UINT); + WINBOOL DeleteMenu(HMENU, UINT, UINT); + WINBOOL SetMenuItemBitmaps(HMENU, UINT, UINT, HBITMAP, HBITMAP); + LONG GetMenuCheckMarkDimensions(); + WINBOOL TrackPopupMenu(HMENU, UINT, int, int, int, HWND, RECT*); + UINT GetMenuDefaultItem(HMENU, UINT, UINT); + WINBOOL SetMenuDefaultItem(HMENU, UINT, UINT); + WINBOOL GetMenuItemRect(HWND, HMENU, UINT, LPRECT); + int MenuItemFromPoint(HWND, HMENU, POINT); + DWORD DragObject(HWND, HWND, UINT, DWORD, HCURSOR); + WINBOOL DragDetect(HWND, POINT); + WINBOOL DrawIcon(HDC, int, int, HICON); + WINBOOL UpdateWindow(HWND); + HWND SetActiveWindow(HWND); + HWND GetForegroundWindow(); + WINBOOL PaintDesktop(HDC); + WINBOOL SetForegroundWindow(HWND); + HWND WindowFromDC(HDC); + HDC GetDC(HWND); + HDC GetDCEx(HWND, HRGN, DWORD); + HDC GetWindowDC(HWND); + int ReleaseDC(HWND, HDC); + HDC BeginPaint(HWND, LPPAINTSTRUCT); + WINBOOL EndPaint(HWND, LPPAINTSTRUCT); + WINBOOL GetUpdateRect(HWND, LPRECT, WINBOOL); + int GetUpdateRgn(HWND, HRGN, WINBOOL); + int SetWindowRgn(HWND, HRGN, WINBOOL); + int GetWindowRgn(HWND, HRGN); + int ExcludeUpdateRgn(HDC, HWND); + WINBOOL InvalidateRect(HWND, RECT*, WINBOOL); + WINBOOL ValidateRect(HWND, RECT*); + WINBOOL InvalidateRgn(HWND, HRGN, WINBOOL); + WINBOOL ValidateRgn(HWND, HRGN); + WINBOOL RedrawWindow(HWND, RECT*, HRGN, UINT); + WINBOOL LockWindowUpdate(HWND); + WINBOOL ScrollWindow(HWND, int, int, RECT*, RECT*); + WINBOOL ScrollDC(HDC, int, int, RECT*, RECT*, HRGN, LPRECT); + int ScrollWindowEx(HWND, int, int, RECT*, RECT*, HRGN, LPRECT, UINT); + int SetScrollPos(HWND, int, int, WINBOOL); + int GetScrollPos(HWND, int); + WINBOOL SetScrollRange(HWND, int, int, int, WINBOOL); + WINBOOL GetScrollRange(HWND, int, LPINT, LPINT); + WINBOOL ShowScrollBar(HWND, int, WINBOOL); + WINBOOL EnableScrollBar(HWND, UINT, UINT); + WINBOOL GetClientRect(HWND, LPRECT); + WINBOOL GetWindowRect(HWND, LPRECT); + WINBOOL AdjustWindowRect(LPRECT, DWORD, WINBOOL); + WINBOOL AdjustWindowRectEx(LPRECT, DWORD, WINBOOL, DWORD); + WINBOOL SetWindowContextHelpId(HWND, DWORD); + DWORD GetWindowContextHelpId(HWND); + WINBOOL SetMenuContextHelpId(HMENU, DWORD); + DWORD GetMenuContextHelpId(HMENU); + WINBOOL MessageBeep(UINT); + int ShowCursor(WINBOOL); + WINBOOL SetCursorPos(int, int); + HCURSOR SetCursor(HCURSOR); + WINBOOL GetCursorPos(LPPOINT); + WINBOOL ClipCursor(RECT*); + WINBOOL GetClipCursor(LPRECT); + HCURSOR GetCursor(); + WINBOOL CreateCaret(HWND, HBITMAP, int, int); + UINT GetCaretBlinkTime(); + WINBOOL SetCaretBlinkTime(UINT); + WINBOOL DestroyCaret(); + WINBOOL HideCaret(HWND); + WINBOOL ShowCaret(HWND); + WINBOOL SetCaretPos(int, int); + WINBOOL GetCaretPos(LPPOINT); + WINBOOL ClientToScreen(HWND, LPPOINT); + WINBOOL ScreenToClient(HWND, LPPOINT); + int MapWindowPoints(HWND, HWND, LPPOINT, UINT); + HWND WindowFromPoint(POINT); + HWND ChildWindowFromPoint(HWND, POINT); + DWORD GetSysColor(int); + HBRUSH GetSysColorBrush(int); + WINBOOL SetSysColors(int, WINT*, COLORREF*); + WINBOOL DrawFocusRect(HDC, RECT*); + int FillRect(HDC, RECT*, HBRUSH); + int FrameRect(HDC, RECT*, HBRUSH); + WINBOOL InvertRect(HDC, RECT*); + WINBOOL SetRect(LPRECT, int, int, int, int); + WINBOOL SetRectEmpty(LPRECT); + WINBOOL CopyRect(LPRECT, RECT*); + WINBOOL InflateRect(LPRECT, int, int); + WINBOOL IntersectRect(LPRECT, RECT*, RECT*); + WINBOOL UnionRect(LPRECT, RECT*, RECT*); + WINBOOL SubtractRect(LPRECT, RECT*, RECT*); + WINBOOL OffsetRect(LPRECT, int, int); + WINBOOL IsRectEmpty(RECT*); + WINBOOL EqualRect(RECT*, RECT*); + WINBOOL PtInRect(RECT*, POINT); + ushort GetWindowWord(HWND, int); + ushort SetWindowWord(HWND, int, ushort); + ushort GetClassWord(HWND, int); + ushort SetClassWord(HWND, int, ushort); + HWND GetDesktopWindow(); + HWND GetParent(HWND); + HWND SetParent(HWND, HWND); + WINBOOL EnumChildWindows(HWND, ENUMWINDOWSPROC, LPARAM); + WINBOOL EnumWindows(ENUMWINDOWSPROC, LPARAM); + WINBOOL EnumThreadWindows(DWORD, ENUMWINDOWSPROC, LPARAM); + HWND GetTopWindow(HWND); + DWORD GetWindowThreadProcessId(HWND, LPDWORD); + HWND GetLastActivePopup(HWND); + HWND GetWindow(HWND, UINT); + WINBOOL UnhookWindowsHook(int, HOOKPROC); + WINBOOL UnhookWindowsHookEx(HHOOK); + LRESULT CallNextHookEx(HHOOK, int, WPARAM, LPARAM); + WINBOOL CheckMenuRadioItem(HMENU, UINT, UINT, UINT, UINT); + HCURSOR CreateCursor(HINST, int, int, int, int, POINTER, POINTER); + WINBOOL DestroyCursor(HCURSOR); + WINBOOL SetSystemCursor(HCURSOR, DWORD); + HICON CreateIcon(HINST, int, int, ubyte, ubyte, ubyte*, ubyte*); + WINBOOL DestroyIcon(HICON); + int LookupIconIdFromDirectory(PBYTE, WINBOOL); + int LookupIconIdFromDirectoryEx(PBYTE, WINBOOL, int, int, UINT); + HICON CreateIconFromResource(PBYTE, DWORD, WINBOOL, DWORD); + HICON CreateIconFromResourceEx(PBYTE, DWORD, WINBOOL, DWORD, int, int, UINT); + HICON CopyImage(HANDLE, UINT, int, int, UINT); + HICON CreateIconIndirect(PICONINFO); + HICON CopyIcon(HICON); + WINBOOL GetIconInfo(HICON, PICONINFO); + WINBOOL MapDialogRect(HWND, LPRECT); + int SetScrollInfo(HWND, int, LPCSCROLLINFO, WINBOOL); + WINBOOL GetScrollInfo(HWND, int, LPSCROLLINFO); + WINBOOL TranslateMDISysAccel(HWND, LPMSG); + UINT ArrangeIconicWindows(HWND); + ushort TileWindows(HWND, UINT, RECT*, UINT, HWND*); + ushort CascadeWindows(HWND, UINT, RECT*, UINT, HWND*); + void SetLastErrorEx(DWORD); + void SetDebugErrorLevel(DWORD); + WINBOOL DrawEdge(HDC, LPRECT, UINT, UINT); + WINBOOL DrawFrameControl(HDC, LPRECT, UINT, UINT); + WINBOOL DrawCaption(HWND, HDC, RECT*, UINT); + WINBOOL DrawAnimatedRects(HWND, int, RECT*, RECT*); + WINBOOL TrackPopupMenuEx(HMENU, UINT, int, int, HWND, LPTPMPARAMS); + HWND ChildWindowFromPointEx(HWND, POINT, UINT); + WINBOOL DrawIconEx(HDC, int, int, HICON, int, int, UINT, HBRUSH, UINT); + WINBOOL AnimatePalette(HPALETTE, UINT, UINT, PALETTEENTRY*); + WINBOOL Arc(HDC, int, int, int, int, int, int, int, int); + WINBOOL BitBlt(HDC, int, int, int, int, HDC, int, int, DWORD); + WINBOOL CancelDC(HDC); + WINBOOL Chord(HDC, int, int, int, int, int, int, int, int); + HMETAFILE CloseMetaFile(HDC); + int CombineRgn(HRGN, HRGN, HRGN, int); + HBITMAP CreateBitmap(int, int, UINT, UINT, POINTER); + HBITMAP CreateBitmapIndirect(BITMAP*); + HBRUSH CreateBrushIndirect(LOGBRUSH*); + HBITMAP CreateCompatibleBitmap(HDC, int, int); + HBITMAP CreateDiscardableBitmap(HDC, int, int); + HDC CreateCompatibleDC(HDC); + HBITMAP CreateDIBitmap(HDC, BITMAPINFOHEADER*, DWORD, POINTER, BITMAPINFO*, UINT); + HBRUSH CreateDIBPatternBrush(HGLOBAL, UINT); + HBRUSH CreateDIBPatternBrushPt(POINTER, UINT); + HRGN CreateEllipticRgn(int, int, int, int); + HRGN CreateEllipticRgnIndirect(RECT*); + HBRUSH CreateHatchBrush(int, COLORREF); + HPALETTE CreatePalette(LOGPALETTE*); + HPEN CreatePen(int, int, COLORREF); + HPEN CreatePenIndirect(LOGPEN*); + HRGN CreatePolyPolygonRgn(POINT*, WINT*, int, int); + HBRUSH CreatePatternBrush(HBITMAP); + HRGN CreateRectRgn(int, int, int, int); + HRGN CreateRectRgnIndirect(RECT*); + HRGN CreateRoundRectRgn(int, int, int, int, int, int); + HBRUSH CreateSolidBrush(COLORREF); + WINBOOL DeleteDC(HDC); + WINBOOL DeleteMetaFile(HMETAFILE); + WINBOOL DeleteObject(HGDIOBJ); + int DrawEscape(HDC, int, int, LPCSTR); + WINBOOL Ellipse(HDC, int, int, int, int); + int EnumObjects(HDC, int, ENUMOBJECTSPROC, LPARAM); + WINBOOL EqualRgn(HRGN, HRGN); + int Escape(HDC, int, int, LPCSTR, LPVOID); + int ExtEscape(HDC, int, int, LPCSTR, int, LPSTR); + int ExcludeClipRect(HDC, int, int, int, int); + HRGN ExtCreateRegion(XFORM*, DWORD, RGNDATA*); + WINBOOL ExtFloodFill(HDC, int, int, COLORREF, UINT); + WINBOOL FillRgn(HDC, HRGN, HBRUSH); + WINBOOL FloodFill(HDC, int, int, COLORREF); + WINBOOL FrameRgn(HDC, HRGN, HBRUSH, int, int); + int GetROP2(HDC); + WINBOOL GetAspectRatioFilterEx(HDC, LPSIZE); + COLORREF GetBkColor(HDC); + int GetBkMode(HDC); + LONG GetBitmapBits(HBITMAP, LONG, LPVOID); + WINBOOL GetBitmapDimensionEx(HBITMAP, LPSIZE); + UINT GetBoundsRect(HDC, LPRECT, UINT); + WINBOOL GetBrushOrgEx(HDC, LPPOINT); + int GetClipBox(HDC, LPRECT); + int GetClipRgn(HDC, HRGN); + int GetMetaRgn(HDC, HRGN); + HGDIOBJ GetCurrentObject(HDC, UINT); + WINBOOL GetCurrentPositionEx(HDC, LPPOINT); + int GetDeviceCaps(HDC, int); + int GetDIBits(HDC, HBITMAP, UINT, UINT, LPVOID, LPBITMAPINFO, UINT); + DWORD GetFontData(HDC, DWORD, DWORD, LPVOID, DWORD); + int GetGraphicsMode(HDC); + int GetMapMode(HDC); + UINT GetMetaFileBitsEx(HMETAFILE, UINT, LPVOID); + COLORREF GetNearestColor(HDC, COLORREF); + UINT GetNearestPaletteIndex(HPALETTE, COLORREF); + DWORD GetObjectType(HGDIOBJ); + UINT GetPaletteEntries(HPALETTE, UINT, UINT, LPPALETTEENTRY); + COLORREF GetPixel(HDC, int, int); + int GetPixelFormat(HDC); + int GetPolyFillMode(HDC); + WINBOOL GetRasterizerCaps(LPRASTERIZER_STATUS, UINT); + DWORD GetRegionData(HRGN, DWORD, LPRGNDATA); + int GetRgnBox(HRGN, LPRECT); + HGDIOBJ GetStockObject(int); + int GetStretchBltMode(HDC); + UINT GetSystemPaletteEntries(HDC, UINT, UINT, LPPALETTEENTRY); + UINT GetSystemPaletteUse(HDC); + int GetTextCharacterExtra(HDC); + UINT GetTextAlign(HDC); + COLORREF GetTextColor(HDC); + int GetTextCharset(HDC); + int GetTextCharsetInfo(HDC, LPFONTSIGNATURE, DWORD); + WINBOOL TranslateCharsetInfo(DWORD*, LPCHARSETINFO, DWORD); + DWORD GetFontLanguageInfo(HDC); + WINBOOL GetViewportExtEx(HDC, LPSIZE); + WINBOOL GetViewportOrgEx(HDC, LPPOINT); + WINBOOL GetWindowExtEx(HDC, LPSIZE); + WINBOOL GetWindowOrgEx(HDC, LPPOINT); + int IntersectClipRect(HDC, int, int, int, int); + WINBOOL InvertRgn(HDC, HRGN); + WINBOOL LineDDA(int, int, int, int, LINEDDAPROC, LPARAM); + WINBOOL LineTo(HDC, int, int); + WINBOOL MaskBlt(HDC, int, int, int, int, HDC, int, int, HBITMAP, int, int, DWORD); + WINBOOL PlgBlt(HDC, POINT*, HDC, int, int, int, int, HBITMAP, int, int); + int OffsetClipRgn(HDC, int, int); + int OffsetRgn(HRGN, int, int); + WINBOOL PatBlt(HDC, int, int, int, int, DWORD); + WINBOOL Pie(HDC, int, int, int, int, int, int, int, int); + WINBOOL PlayMetaFile(HDC, HMETAFILE); + WINBOOL PaintRgn(HDC, HRGN); + WINBOOL PolyPolygon(HDC, POINT*, WINT*, int); + WINBOOL PtInRegion(HRGN, int, int); + WINBOOL PtVisible(HDC, int, int); + WINBOOL RectInRegion(HRGN, RECT*); + WINBOOL RectVisible(HDC, RECT*); + WINBOOL Rectangle(HDC, int, int, int, int); + WINBOOL RestoreDC(HDC, int); + UINT RealizePalette(HDC); + WINBOOL RoundRect(HDC, int, int, int, int, int, int); + WINBOOL ResizePalette(HPALETTE, UINT); + int SaveDC(HDC); + int SelectClipRgn(HDC, HRGN); + int ExtSelectClipRgn(HDC, HRGN, int); + int SetMetaRgn(HDC); + HGDIOBJ SelectObject(HDC, HGDIOBJ); + HPALETTE SelectPalette(HDC, HPALETTE, WINBOOL); + COLORREF SetBkColor(HDC, COLORREF); + int SetBkMode(HDC, int); + LONG SetBitmapBits(HBITMAP, DWORD, POINTER); + UINT SetBoundsRect(HDC, RECT*, UINT); + int SetDIBits(HDC, HBITMAP, UINT, UINT, POINTER, PBITMAPINFO, UINT); + int SetDIBitsToDevice(HDC, int, int, DWORD, DWORD, int, int, UINT, UINT, POINTER, BITMAPINFO*, UINT); + DWORD SetMapperFlags(HDC, DWORD); + int SetGraphicsMode(HDC, int); + int SetMapMode(HDC, int); + HMETAFILE SetMetaFileBitsEx(UINT, ubyte*); + UINT SetPaletteEntries(HPALETTE, UINT, UINT, PALETTEENTRY*); + COLORREF SetPixel(HDC, int, int, COLORREF); + WINBOOL SetPixelV(HDC, int, int, COLORREF); + int SetPolyFillMode(HDC, int); + WINBOOL StretchBlt(HDC, int, int, int, int, HDC, int, int, int, int, DWORD); + WINBOOL SetRectRgn(HRGN, int, int, int, int); + int StretchDIBits(HDC, int, int, int, int, int, int, int, int, POINTER, BITMAPINFO*, UINT, DWORD); + int SetROP2(HDC, int); + int SetStretchBltMode(HDC, int); + UINT SetSystemPaletteUse(HDC, UINT); + int SetTextCharacterExtra(HDC, int); + COLORREF SetTextColor(HDC, COLORREF); + UINT SetTextAlign(HDC, UINT); + WINBOOL SetTextJustification(HDC, int, int); + WINBOOL UpdateColors(HDC); + WINBOOL PlayMetaFileRecord(HDC, LPHANDLETABLE, LPMETARECORD, UINT); + WINBOOL EnumMetaFile(HDC, HMETAFILE, ENUMMETAFILEPROC, LPARAM); + HENHMETAFILE CloseEnhMetaFile(HDC); + WINBOOL DeleteEnhMetaFile(HENHMETAFILE); + WINBOOL EnumEnhMetaFile(HDC, HENHMETAFILE, ENHMETAFILEPROC, LPVOID, RECT*); + UINT GetEnhMetaFileHeader(HENHMETAFILE, UINT, LPENHMETAHEADER); + UINT GetEnhMetaFilePaletteEntries(HENHMETAFILE, UINT, LPPALETTEENTRY); + UINT GetWinMetaFileBits(HENHMETAFILE, UINT, LPBYTE, WINT, HDC); + WINBOOL PlayEnhMetaFile(HDC, HENHMETAFILE, RECT*); + WINBOOL PlayEnhMetaFileRecord(HDC, LPHANDLETABLE, ENHMETARECORD*, UINT); + HENHMETAFILE SetEnhMetaFileBits(UINT, ubyte*); + HENHMETAFILE SetWinMetaFileBits(UINT, ubyte*, HDC, METAFILEPICT*); + WINBOOL GdiComment(HDC, UINT, ubyte*); + WINBOOL AngleArc(HDC, int, int, DWORD, FLOAT, FLOAT); + WINBOOL PolyPolyline(HDC, POINT*, DWORD*, DWORD); + WINBOOL GetWorldTransform(HDC, LPXFORM); + WINBOOL SetWorldTransform(HDC, XFORM*); + WINBOOL ModifyWorldTransform(HDC, XFORM*, DWORD); + WINBOOL CombineTransform(LPXFORM, XFORM*, XFORM*); + HBITMAP CreateDIBSection(HDC, BITMAPINFO*, UINT, POINTER*, HANDLE, DWORD); + UINT GetDIBColorTable(HDC, UINT, UINT, RGBQUAD*); + UINT SetDIBColorTable(HDC, UINT, UINT, RGBQUAD*); + WINBOOL SetColorAdjustment(HDC, COLORADJUSTMENT*); + WINBOOL GetColorAdjustment(HDC, LPCOLORADJUSTMENT); + HPALETTE CreateHalftonePalette(HDC); + int EndDoc(HDC); + int StartPage(HDC); + int EndPage(HDC); + int AbortDoc(HDC); + int SetAbortProc(HDC, TABORTPROC); + WINBOOL ArcTo(HDC, int, int, int, int, int, int, int, int); + WINBOOL BeginPath(HDC); + WINBOOL CloseFigure(HDC); + WINBOOL EndPath(HDC); + WINBOOL FillPath(HDC); + WINBOOL FlattenPath(HDC); + int GetPath(HDC, LPPOINT, LPBYTE, int); + HRGN PathToRegion(HDC); + WINBOOL PolyDraw(HDC, POINT*, ubyte*, int); + WINBOOL SelectClipPath(HDC, int); + int SetArcDirection(HDC, int); + WINBOOL SetMiterLimit(HDC, FLOAT, PFLOAT); + WINBOOL StrokeAndFillPath(HDC); + WINBOOL StrokePath(HDC); + WINBOOL WidenPath(HDC); + HPEN ExtCreatePen(DWORD, DWORD, LOGBRUSH*, DWORD, DWORD*); + WINBOOL GetMiterLimit(HDC, PFLOAT); + int GetArcDirection(HDC); + WINBOOL MoveToEx(HDC, int, int, LPPOINT); + HRGN CreatePolygonRgn(POINT*, int, int); + WINBOOL DPtoLP(HDC, LPPOINT, int); + WINBOOL LPtoDP(HDC, LPPOINT, int); + WINBOOL Polygon(HDC, POINT*, int); + WINBOOL Polyline(HDC, POINT*, int); + WINBOOL PolyBezier(HDC, POINT*, DWORD); + WINBOOL PolyBezierTo(HDC, POINT*, DWORD); + WINBOOL PolylineTo(HDC, POINT*, DWORD); + WINBOOL SetViewportExtEx(HDC, int, int, LPSIZE); + WINBOOL SetViewportOrgEx(HDC, int, int, LPPOINT); + WINBOOL SetWindowExtEx(HDC, int, int, LPSIZE); + WINBOOL SetWindowOrgEx(HDC, int, int, LPPOINT); + WINBOOL OffsetViewportOrgEx(HDC, int, int, LPPOINT); + WINBOOL OffsetWindowOrgEx(HDC, int, int, LPPOINT); + WINBOOL ScaleViewportExtEx(HDC, int, int, int, int, LPSIZE); + WINBOOL ScaleWindowExtEx(HDC, int, int, int, int, LPSIZE); + WINBOOL SetBitmapDimensionEx(HBITMAP, int, int, LPSIZE); + WINBOOL SetBrushOrgEx(HDC, int, int, LPPOINT); + WINBOOL GetDCOrgEx(HDC, LPPOINT); + WINBOOL FixBrushOrgEx(HDC, int, int, LPPOINT); + WINBOOL UnrealizeObject(HGDIOBJ); + WINBOOL GdiFlush(); + DWORD GdiSetBatchLimit(DWORD); + DWORD GdiGetBatchLimit(); + int SetICMMode(HDC, int); + WINBOOL CheckColorsInGamut(HDC, LPVOID, LPVOID, DWORD); + HANDLE GetColorSpace(HDC); + WINBOOL SetColorSpace(HDC, HCOLORSPACE); + WINBOOL DeleteColorSpace(HCOLORSPACE); + WINBOOL GetDeviceGammaRamp(HDC, LPVOID); + WINBOOL SetDeviceGammaRamp(HDC, LPVOID); + WINBOOL ColorMatchToTarget(HDC, HDC, DWORD); + HPROPSHEETPAGE CreatePropertySheetPageA(LPCPROPSHEETPAGE); + WINBOOL DestroyPropertySheetPage(HPROPSHEETPAGE); + void InitCommonControls(); + HIMAGELIST ImageList_Create(int, int, UINT, int, int); + WINBOOL ImageList_Destroy(HIMAGELIST); + int ImageList_GetImageCount(HIMAGELIST); + int ImageList_Add(HIMAGELIST, HBITMAP, HBITMAP); + int ImageList_ReplaceIcon(HIMAGELIST, int, HICON); + COLORREF ImageList_SetBkColor(HIMAGELIST, COLORREF); + COLORREF ImageList_GetBkColor(HIMAGELIST); + WINBOOL ImageList_SetOverlayImage(HIMAGELIST, int, int); + WINBOOL ImageList_Draw(HIMAGELIST, int, HDC, int, int, UINT); + WINBOOL ImageList_Replace(HIMAGELIST, int, HBITMAP, HBITMAP); + int ImageList_AddMasked(HIMAGELIST, HBITMAP, COLORREF); + WINBOOL ImageList_DrawEx(HIMAGELIST, int, HDC, int, int, int, int, COLORREF, COLORREF, UINT); + WINBOOL ImageList_Remove(HIMAGELIST, int); + HICON ImageList_GetIcon(HIMAGELIST, int, UINT); + WINBOOL ImageList_BeginDrag(HIMAGELIST, int, int, int); + void ImageList_EndDrag(); + WINBOOL ImageList_DragEnter(HWND, int, int); + WINBOOL ImageList_DragLeave(HWND); + WINBOOL ImageList_DragMove(int, int); + WINBOOL ImageList_SetDragCursorImage(HIMAGELIST, int, int, int); + WINBOOL ImageList_DragShowNolock(WINBOOL); + HIMAGELIST ImageList_GetDragImage(POINT*, POINT*); + WINBOOL ImageList_GetIconSize(HIMAGELIST, int*, int*); + WINBOOL ImageList_SetIconSize(HIMAGELIST, int, int); + WINBOOL ImageList_GetImageInfo(HIMAGELIST, int, IMAGEINFO*); + HIMAGELIST ImageList_Merge(HIMAGELIST, int, HIMAGELIST, int, int, int); + HWND CreateToolbarEx(HWND, DWORD, UINT, int, HINST, UINT, LPCTBBUTTON, int, int, int, int, int, UINT); + HBITMAP CreateMappedBitmap(HINST, int, UINT, LPCOLORMAP, int); + void MenuHelp(UINT, WPARAM, LPARAM, HMENU, HINST, HWND); + WINBOOL ShowHideMenuCtl(HWND, UINT, LPINT); + void GetEffectiveClientRect(HWND, LPRECT); + WINBOOL MakeDragList(HWND); + void DrawInsert(HWND, HWND); + int LBItemFromPt(HWND, POINT, WINBOOL); + HWND CreateUpDownControl(DWORD, int, int, int, int, HWND, int, HINST, HWND, int, int, int); + LONG RegCloseKey(HKEY); + LONG RegSetKeySecurity(HKEY, SECURITY_INFORMATION, PSECURITY_DESCRIPTOR); + LONG RegFlushKey(HKEY); + LONG RegGetKeySecurity(HKEY, SECURITY_INFORMATION, PSECURITY_DESCRIPTOR, LPDWORD); + LONG RegNotifyChangeKeyValue(HKEY, WINBOOL, DWORD, HANDLE, WINBOOL); + WINBOOL IsValidCodePage(UINT); + UINT GetACP(); + UINT GetOEMCP(); + WINBOOL GetCPInfo(UINT, LPCPINFO); + WINBOOL IsDBCSLeadByte(ubyte); + WINBOOL IsDBCSLeadByteEx(UINT, ubyte); + int MultiByteToWideChar(UINT, DWORD, LPCSTR, int, LPWSTR, int); + int WideCharToMultiByte(UINT, DWORD, LPCWSTR, int, LPSTR, int, LPCSTR, LPBOOL); + WINBOOL IsValidLocale(LCID, DWORD); + LCID ConvertDefaultLocale(LCID); + LCID GetThreadLocale(); + WINBOOL SetThreadLocale(LCID); + LANGID GetSystemDefaultLangID(); + LANGID GetUserDefaultLangID(); + LCID GetSystemDefaultLCID(); + LCID GetUserDefaultLCID(); + WINBOOL ReadConsoleOutputAttribute(HANDLE, LPWORD, DWORD, COORD, LPDWORD); + WINBOOL WriteConsoleOutputAttribute(HANDLE, ushort*, DWORD, COORD, LPDWORD); + WINBOOL FillConsoleOutputAttribute(HANDLE, ushort, DWORD, COORD, LPDWORD); + WINBOOL GetConsoleMode(HANDLE, LPDWORD); + WINBOOL GetNumberOfConsoleInputEvents(HANDLE, PDWORD); + WINBOOL GetConsoleScreenBufferInfo(HANDLE, PCONSOLE_SCREEN_BUFFER_INFO); + COORD GetLargestConsoleWindowSize(HANDLE); + WINBOOL GetConsoleCursorInfo(HANDLE, PCONSOLE_CURSOR_INFO); + WINBOOL GetNumberOfConsoleMouseButtons(LPDWORD); + WINBOOL SetConsoleMode(HANDLE, DWORD); + WINBOOL SetConsoleActiveScreenBuffer(HANDLE); + WINBOOL FlushConsoleInputBuffer(HANDLE); + WINBOOL SetConsoleScreenBufferSize(HANDLE, COORD); + WINBOOL SetConsoleCursorPosition(HANDLE, COORD); + WINBOOL SetConsoleCursorInfo(HANDLE, PCONSOLE_CURSOR_INFO); + WINBOOL SetConsoleWindowInfo(HANDLE, WINBOOL, SMALL_RECT*); + WINBOOL SetConsoleTextAttribute(HANDLE, ushort); + WINBOOL SetConsoleCtrlHandler(PHANDLER_ROUTINE, WINBOOL); + WINBOOL GenerateConsoleCtrlEvent(DWORD, DWORD); + WINBOOL AllocConsole(); + WINBOOL FreeConsole(); + HANDLE CreateConsoleScreenBuffer(DWORD, DWORD, SECURITY_ATTRIBUTES*, DWORD, LPVOID); + UINT GetConsoleCP(); + WINBOOL SetConsoleCP(UINT); + UINT GetConsoleOutputCP(); + WINBOOL SetConsoleOutputCP(UINT); + DWORD WNetConnectionDialog(HWND, DWORD); + DWORD WNetDisconnectDialog(HWND, DWORD); + DWORD WNetCloseEnum(HANDLE); + WINBOOL CloseServiceHandle(SC_HANDLE); + WINBOOL ControlService(SC_HANDLE, DWORD, LPSERVICE_STATUS); + WINBOOL DeleteService(SC_HANDLE); + SC_LOCK LockServiceDatabase(SC_HANDLE); + WINBOOL NotifyBootConfigStatus(WINBOOL); + WINBOOL QueryServiceObjectSecurity(SC_HANDLE, SECURITY_INFORMATION, PSECURITY_DESCRIPTOR, DWORD, LPDWORD); + WINBOOL QueryServiceStatus(SC_HANDLE, LPSERVICE_STATUS); + WINBOOL SetServiceObjectSecurity(SC_HANDLE, SECURITY_INFORMATION, PSECURITY_DESCRIPTOR); + WINBOOL SetServiceStatus(SERVICE_STATUS_HANDLE, LPSERVICE_STATUS); + WINBOOL UnlockServiceDatabase(SC_LOCK); + int ChoosePixelFormat(HDC, PIXELFORMATDESCRIPTOR*); + int DescribePixelFormat(HDC, int, UINT, LPPIXELFORMATDESCRIPTOR); + WINBOOL SetPixelFormat(HDC, int, PPIXELFORMATDESCRIPTOR); + WINBOOL SwapBuffers(HDC); + WINBOOL DragQueryPoint(HDROP, LPPOINT); + void DragFinish(HDROP); + void DragAcceptFiles(HWND, BOOL); + HICON DuplicateIcon(HINST, HICON); + BOOL DdeAbandonTransaction(DWORD, HCONV, DWORD); + PBYTE DdeAccessData(HDDEDATA, PDWORD); + HDDEDATA DdeAddData(HDDEDATA, PBYTE, DWORD, DWORD); + HDDEDATA DdeClientTransaction(PBYTE, DWORD, HCONV, HSZ, UINT, UINT, DWORD, PDWORD); + int DdeCmpStringHandles(HSZ, HSZ); + HCONV DdeConnect(DWORD, HSZ, HSZ, CONVCONTEXT*); + HCONVLIST DdeConnectList(DWORD, HSZ, HSZ, HCONVLIST, PCONVCONTEXT); + HDDEDATA DdeCreateDataHandle(DWORD, LPBYTE, DWORD, DWORD, HSZ, UINT, UINT); + WINBOOL DdeDisconnect(HCONV); + BOOL DdeDisconnectList(HCONVLIST); + BOOL DdeEnableCallback(DWORD, HCONV, UINT); + WINBOOL DdeFreeDataHandle(HDDEDATA); + WINBOOL DdeFreeStringHandle(DWORD, HSZ); + DWORD DdeGetData(HDDEDATA, ubyte*, DWORD, DWORD); + UINT DdeGetLastError(DWORD); + BOOL DdeImpersonateClient(HCONV); + BOOL DdeKeepStringHandle(DWORD, HSZ); + HDDEDATA DdeNameService(DWORD, HSZ, HSZ, UINT); + WINBOOL DdePostAdvise(DWORD, HSZ, HSZ); + UINT DdeQueryConvInfo(HCONV, DWORD, PCONVINFO); + HCONV DdeQueryNextServer(HCONVLIST, HCONV); + HCONV DdeReconnect(HCONV); + BOOL DdeSetUserHandle(HCONV, DWORD, DWORD); + BOOL DdeUnaccessData(HDDEDATA); + WINBOOL DdeUninitialize(DWORD); + void SHAddToRecentDocs(UINT); + LPITEMIDLIST SHBrowseForFolder(LPBROWSEINFO); + void SHChangeNotify(LONG, UINT, LPCVOID); + int SHFileOperation(LPSHFILEOPSTRUCT); + void SHFreeNameMappings(HANDLE); + DWORD SHGetFileInfo(LPCTSTR, DWORD, SHFILEINFO*, UINT, UINT); + WINBOOL SHGetPathFromIDList(LPCITEMIDLIST, LPTSTR); + HRESULT SHGetSpecialFolderLocation(HWND, int, LPITEMIDLIST*); + THANDLE CreateThread(POINTER, DWORD, TFNTHREADSTARTROUTINE, POINTER, DWORD, DWORD*); + BOOL DdeSetQualityOfService(HWND, TSECURITYQUALITYOFSERVICE*, PSECURITYQUALITYOFSERVICE); + BOOL GetCommMask(THANDLE, DWORD*); + BOOL GetDiskFreeSpaceExA(LPCSTR, void*, void*, PLARGEINTEGER); + BOOL GetDiskFreeSpaceExW(LPWSTR, void*, void*, PLARGEINTEGER); + DWORD GetKerningPairs(HDC, DWORD, void*); + BOOL GetOverlappedResult(THANDLE, TOVERLAPPED*, DWORD*, BOOL); + BOOL GetQueuedCompletionStatus(THANDLE, DWORD*, DWORD*, POVERLAPPED*, DWORD); + BOOL GetSystemPowerStatus(TSYSTEMPOWERSTATUS*); + BOOL ReadFile(THANDLE, void*, DWORD, DWORD*, POVERLAPPED); + BOOL SetThreadContext(THANDLE, TCONTEXT*); + BOOL wglDescribeLayerPlane(HDC, int, int, uint, TLAYERPLANEDESCRIPTOR*); + int wglGetLayerPaletteEntries(HDC, int, int, int, void*); + int wglSetLayerPaletteEntries(HDC, int, int, int, void*); + DWORD WNetGetResourceParentA(PNETRESOURCEA, POINTER, DWORD*); + BOOL WriteFile(THANDLE, void*, DWORD, DWORD*, POVERLAPPED); + + BOOL CancelWaitableTimer(HANDLE hTimer); + HANDLE OpenWaitableTimerA(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCSTR lpTimerName); + HANDLE OpenWaitableTimerW(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCWSTR lpTimerName); + HANDLE CreateWaitableTimerA(LPSECURITY_ATTRIBUTES lpTimerAttributes, BOOL bManualReset, LPCSTR lpTimerName); + HANDLE CreateWaitableTimerW(LPSECURITY_ATTRIBUTES lpTimerAttributes, BOOL bManualReset, LPCWSTR lpTimerName); + BOOL SetWaitableTimer(HANDLE hTimer, LARGE_INTEGER* pDueTime, LONG lPeriod, PTIMERAPCROUTINE pfnCompletionRoutine, LPVOID lpArgToCompletionRoutine, BOOL fResume); +} \ No newline at end of file diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/text/Ascii.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/text/Ascii.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,141 @@ +/******************************************************************************* + + copyright: Copyright (c) 2006 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Dec 2006: Initial release + + author: Kris + + + Placeholder for a selection of ASCII utilities. These generally will + not work with utf8, and cannot be easily extended to utf16 or utf32 + +*******************************************************************************/ + +module tango.text.Ascii; + +version (Win32) + { + private extern (C) int memicmp (char *, char *, uint); + private extern (C) int memcmp (char *, char *, uint); + } + +version (Posix) + { + private extern (C) int memcmp (char *, char *, uint); + private extern (C) int strncasecmp (char *, char*, uint); + private alias strncasecmp memicmp; + } + +/****************************************************************************** + + Convert to lowercase. Returns the converted content in dst, + performing an in-place conversion if dst is null + +******************************************************************************/ + +char[] toLower (char[] src, char[] dst = null) +{ + if (dst.ptr) + { + assert (dst.length >= src.length); + dst[0 .. src.length] = src [0 .. $]; + } + else + dst = src; + + foreach (inout c; dst) + if (c>= 'A' && c <= 'Z') + c = c + 32; + return dst [0 .. src.length]; +} + +/****************************************************************************** + + Convert to uppercase. Returns the converted content in dst, + performing an in-place conversion if dst is null + +******************************************************************************/ + +char[] toUpper (char[] src, char[] dst = null) +{ + if (dst.ptr) + { + assert (dst.length >= src.length); + dst[0 .. src.length] = src [0 .. $]; + } + else + dst = src; + + foreach (inout c; dst) + if (c>= 'a' && c <= 'z') + c = c - 32; + return dst[0 .. src.length]; +} + +/****************************************************************************** + + Compare two char[] ignoring case. Returns 0 if equal + +******************************************************************************/ + +int icompare (char[] s1, char[] s2) +{ + auto len = s1.length; + if (s2.length < len) + len = s2.length; + + auto result = memicmp (s1.ptr, s2.ptr, len); + + if (result is 0) + result = s1.length - s2.length; + return result; +} + + +/****************************************************************************** + + Compare two char[] with case. Returns 0 if equal + +******************************************************************************/ + +int compare (char[] s1, char[] s2) +{ + auto len = s1.length; + if (s2.length < len) + len = s2.length; + + auto result = memcmp (s1.ptr, s2.ptr, len); + + if (result is 0) + result = s1.length - s2.length; + return result; +} + + + +/****************************************************************************** + +******************************************************************************/ + +debug (UnitTest) +{ +// void main(){} + + unittest + { + char[20] tmp; + + assert (toLower("1bac", tmp) == "1bac"); + assert (toLower("1BAC", tmp) == "1bac"); + assert (toUpper("1bac", tmp) == "1BAC"); + assert (toUpper("1BAC", tmp) == "1BAC"); + assert (icompare ("ABC", "abc") is 0); + assert (icompare ("abc", "abc") is 0); + assert (icompare ("abcd", "abc") > 0); + assert (icompare ("abc", "abcd") < 0); + assert (icompare ("ACC", "abc") > 0); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/text/Properties.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/text/Properties.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,150 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: May 2004 + + author: Kris + +*******************************************************************************/ + +module tango.text.Properties; + +private import tango.io.Buffer, + tango.io.FilePath, + tango.io.FileConst, + tango.io.FileConduit; + +private import Text = tango.text.Util; + +private import tango.text.stream.LineIterator; + +/******************************************************************************* + + Provides load facilities for a properties file. That is, a file + or other medium containing lines of text with a name=value layout. + +*******************************************************************************/ + +class Properties(T) +{ + /*********************************************************************** + + Load properties from the named file, and pass each of them + to the provided delegate. + + ***********************************************************************/ + + static void load (FilePath path, void delegate (T[] name, T[] value) dg) + { + auto fc = new FileConduit (path); + scope (exit) + fc.close; + + load (fc, dg); + } + + /*********************************************************************** + + Load properties from the provided buffer, and pass them to + the specified delegate. + + We use an iterator to sweep text lines, and extract lValue + and rValue pairs from each one, The expected file format is + as follows: + + --- + x = y + abc = 123 + x.y.z = this is a single property + + # this is a comment line + --- + + ***********************************************************************/ + + static void load (InputStream stream, void delegate (T[] name, T[] value) dg) + { + foreach (line; new LineIterator!(T) (stream)) + { + auto text = Text.trim (line); + + // comments require '#' as the first non-whitespace char + if (text.length && (text[0] != '#')) + { + // find the '=' char + auto i = Text.locate (text, '='); + + // ignore if not found ... + if (i < text.length) + dg (Text.trim (text[0 .. i]), Text.trim (text[i+1 .. $])); + } + } + } + + /*********************************************************************** + + Write properties to the provided filepath + + ***********************************************************************/ + + static void save (FilePath path, T[][T[]] properties) + { + auto fc = new FileConduit (path, FileConduit.WriteCreate); + scope (exit) + fc.close; + save (fc, properties); + } + + /*********************************************************************** + + Write properties to the provided stream + + ***********************************************************************/ + + static void save (OutputStream stream, T[][T[]] properties) + { + const T[] equals = " = "; + version (Win32) + const T[] NL = "\r\n"; + version (Posix) + const T[] NL = "\n"; + + auto b = cast(Buffered) stream; + auto emit = b ? b.buffer : new Buffer (stream.conduit); + foreach (key, value; properties) + emit (key) (equals) (value) (NL); + emit.flush; + } +} + + +debug (Properties) +{ + import tango.io.Buffer; + import tango.io.Console; + + void main() + { + char[][char[]] aa; + aa ["foo"] = "something"; + aa ["bar"] = "something else"; + aa ["wumpus"] = ""; + + // write associative-array to a buffer; could use a file + auto props = new Properties!(char); + auto buffer = new Buffer (256); + props.save (buffer, aa); + + // reset and repopulate AA from the buffer + aa = null; + props.load (buffer, (char[] name, char[] value){aa[name] = value;}); + + // display result + foreach (name, value; aa) + Cout (name) (" = ") (value).newline; + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/text/Regex.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/text/Regex.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,3697 @@ + +// Regular Expressions + +/* + * Copyright (C) 2000-2005 by Digital Mars, www.digitalmars.com + * Written by Walter Bright + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * o The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * o Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * o This notice may not be removed or altered from any source + * distribution. + */ + +/* + * Modified by Sean Kelly for use with Tango. + */ + +/********************************************** + * $(LINK2 http://www.digitalmars.com/ctg/regular.html, Regular expressions) + * are a powerful method of string pattern matching. + * The regular expression + * language used is the same as that commonly used, however, some of the very + * advanced forms may behave slightly differently. + * + * In the following guide, $(I pattern)[] refers to a + * $(LINK2 http://www.digitalmars.com/ctg/regular.html, regular expression). + * The $(I attributes)[] refers to + a string controlling the interpretation + of the regular expression. + It consists of a sequence of one or more + of the following characters: + + + + $(TR $(TH Attribute) $(TH Action)) + + $(TD $(B g)) + $(TD global; repeat over the whole input string) + + + $(TD $(B i)) + $(TD case insensitive) + + + $(TD $(B m)) + $(TD treat as multiple lines separated by newlines) + +
Attribute Characters
+ * + * The $(I format)[] string has the formatting characters: + * + * + + $(TR $(TH Format) $(TH Replaced With)) + $(TR + $(TD $(B $$)) $(TD $) + ) + $(TR + $(TD $(B $&)) $(TD The matched substring.) + ) + $(TR + $(TD $(B $`)) $(TD The portion of string that precedes the matched substring.) + ) + $(TR + $(TD $(B $')) $(TD The portion of string that follows the matched substring.) + ) + $(TR + $(TD $(B $(DOLLAR))$(I n)) $(TD The $(I n)th capture, where $(I n) + is a single digit 1-9 + and $$(I n) is not followed by a decimal digit.) + ) + $(TR + $(TD $(B $(DOLLAR))$(I nn)) $(TD The $(I nn)th capture, where $(I nn) + is a two-digit decimal + number 01-99. + If $(I nn)th capture is undefined or more than the number + of parenthesized subexpressions, use the empty + string instead.) + ) +
Formatting Characters
+ + * Any other $ are left as is. + * + * References: + * $(LINK2 http://en.wikipedia.org/wiki/Regular_expressions, Wikipedia) + * Macros: + * WIKI = StdRegexp + * DOLLAR = $ + */ + +/* + Escape sequences: + + \nnn starts out a 1, 2 or 3 digit octal sequence, + where n is an octal digit. If nnn is larger than + 0377, then the 3rd digit is not part of the sequence + and is not consumed. + For maximal portability, use exactly 3 digits. + + \xXX starts out a 1 or 2 digit hex sequence. X + is a hex character. If the first character after the \x + is not a hex character, the value of the sequence is 'x' + and the XX are not consumed. + For maximal portability, use exactly 2 digits. + + \uUUUU is a unicode sequence. There are exactly + 4 hex characters after the \u, if any are not, then + the value of the sequence is 'u', and the UUUU are not + consumed. + + Character classes: + + [a-b], where a is greater than b, will produce + an error. + + References: + + http://www.unicode.org/unicode/reports/tr18/ + */ + +module tango.text.Regex; + +//debug = Regex; + +private +{ + import tango.stdc.string; + import tango.stdc.stdio; + import tango.stdc.ctype; + import tango.stdc.stdlib; // for alloca + + import tango.core.BitArray; + import tango.core.Vararg; +} + +/** Regular expression to extract an _email address */ +const char[] email = + r"[a-zA-Z]([.]?([[a-zA-Z0-9_]-]+)*)?@([[a-zA-Z0-9_]\-_]+\.)+[a-zA-Z]{2,6}"; + +/** Regular expression to extract a _url */ +const char[] url = r"(([h|H][t|T]|[f|F])[t|T][p|P]([s|S]?)\:\/\/|~/|/)?([\w]+:\w+@)?(([a-zA-Z]{1}([\w\-]+\.)+([\w]{2,5}))(:[\d]{1,5})?)?((/?\w+/)+|/?)(\w+\.[\w]{3,4})?([,]\w+)*((\?\w+=\w+)?(&\w+=\w+)*([,]\w*)*)?"; + +/************************************ + * One of these gets thrown on compilation errors + */ + +class RegexException : Exception +{ + this(char[] msg) + { + super(msg); + } +} + +struct regmatch_t +{ + int rm_so; // index of start of match + int rm_eo; // index past end of match +} + +private alias char rchar; // so we can make a wchar version + +/****************************************************** + * Search string for matches with regular expression + * pattern with attributes. + * Replace each match with string generated from format. + * Params: + * string = String to search. + * pattern = Regular expression pattern. + * format = Replacement string format. + * attributes = Regular expression attributes. + * Returns: + * the resulting string + * Example: + * Replace the letters 'a' with the letters 'ZZ'. + * --- + * s = "Strap a rocket engine on a chicken." + * sub(s, "a", "ZZ") // result: StrZZp a rocket engine on a chicken. + * sub(s, "a", "ZZ", "g") // result: StrZZp ZZ rocket engine on ZZ chicken. + * --- + * The replacement format can reference the matches using + * the $&, $$, $', $`, $0 .. $99 notation: + * --- + * sub(s, "[ar]", "[$&]", "g") // result: St[r][a]p [a] [r]ocket engine on [a] chi + * --- + */ + +char[] sub(char[] string, char[] pattern, char[] format, char[] attributes = null) +{ + auto r = new Regex(pattern, attributes); + auto result = r.replace(string, format); + delete r; + return result; +} + +debug( UnitTest ) +{ + unittest + { + debug(Regex) printf("Regex.sub.unittest\n"); + + char[] r = sub("hello", "ll", "ss"); + assert(r == "hesso"); + } +} + +/******************************************************* + * Search string for matches with regular expression + * pattern with attributes. + * Pass each match to delegate dg. + * Replace each match with the return value from dg. + * Params: + * string = String to search. + * pattern = Regular expression pattern. + * dg = Delegate + * attributes = Regular expression attributes. + * Returns: the resulting string. + * Example: + * Capitalize the letters 'a' and 'r': + * --- + * s = "Strap a rocket engine on a chicken."; + * sub(s, "[ar]", + * delegate char[] (Regex m) + * { + * return toupper(m.match(0)); + * }, + * "g"); // result: StRAp A Rocket engine on A chicken. + * --- + */ + +char[] sub(char[] string, char[] pattern, char[] delegate(Regex) dg, char[] attributes = null) +{ + auto r = new Regex(pattern, attributes); + rchar[] result; + int lastindex; + int offset; + + result = string; + lastindex = 0; + offset = 0; + while (r.test(string, lastindex)) + { + int so = r.pmatch[0].rm_so; + int eo = r.pmatch[0].rm_eo; + + rchar[] replacement = dg(r); +/+ + + TODO: Add std.string.replace so this may be used. + + + // Optimize by using std.string.replace if possible - Dave Fladebo + rchar[] slice = result[offset + so .. offset + eo]; + if (r.attributes & Regex.REA.global && // global, so replace all + !(r.attributes & Regex.REA.ignoreCase) && // not ignoring case + !(r.attributes & Regex.REA.multiline) && // not multiline + pattern == slice) // simple pattern (exact match, no special characters) + { + debug(Regex) + printf("pattern: %.*s, slice: %.*s, replacement: %.*s\n", + cast(int) pattern.length, pattern.ptr, + cast(int) (eo-so), result.ptr + offset, + cast(int) replacement.length, replacement.ptr); + result = std.string.replace(result,slice,replacement); + break; + } ++/ + result = replaceSlice(result, result[offset + so .. offset + eo], replacement); + + if (r.attributes & Regex.REA.global) + { + offset += replacement.length - (eo - so); + + if (lastindex == eo) + lastindex++; // always consume some source + else + lastindex = eo; + } + else + break; + } + delete r; + + return result; +} + +debug( UnitTest ) +{ + unittest + { + debug(Regex) printf("Regex.sub.unittest\n"); + + char[] foo(Regex r) { return "ss"; } + + char[] r = sub("hello", "ll", delegate char[](Regex r) { return "ss"; }); + assert(r == "hesso"); + } +} + + +/************************************************* + * Search string[] for first match with pattern[] with attributes[]. + * Params: + * string = String to search. + * pattern = Regular expression pattern. + * attributes = Regular expression attributes. + * Returns: + * index into string[] of match if found, -1 if no match. + * Example: + * --- + * auto s = "abcabcabab"; + * tango.text.Regex.find(s, "b"); // match, returns 1 + * tango.text.Regex.find(s, "f"); // no match, returns -1 + * --- + */ + +int find(rchar[] string, char[] pattern, char[] attributes = null) +{ + int i = -1; + + auto r = new Regex(pattern, attributes); + if (r.test(string)) + { + i = r.pmatch[0].rm_so; + } + delete r; + return i; +} + +debug( UnitTest ) +{ + unittest + { + debug(Regex) printf("Regex.find.unittest\n"); + + int i; + i = find("xabcy", "abc"); + assert(i == 1); + i = find("cba", "abc"); + assert(i == -1); + } +} + + + +/************************************************* + * Search string[] for last match with pattern[] with attributes[]. + * Params: + * string = String to search. + * pattern = Regular expression pattern. + * attributes = Regular expression attributes. + * Returns: + * index into string[] of match if found, -1 if no match. + * Example: + * --- + * auto s = "abcabcabab"; + * tango.text.Regex.find(s, "b"); // match, returns 9 + * tango.text.Regex.find(s, "f"); // no match, returns -1 + * --- + */ + +int rfind(rchar[] string, char[] pattern, char[] attributes = null) +{ + int i = -1; + int lastindex = 0; + + auto r = new Regex(pattern, attributes); + while (r.test(string, lastindex)) + { int eo = r.pmatch[0].rm_eo; + i = r.pmatch[0].rm_so; + if (lastindex == eo) + lastindex++; // always consume some source + else + lastindex = eo; + } + delete r; + return i; +} + +debug( UnitTest ) +{ + unittest + { + int i; + + debug(Regex) printf("Regex.rfind.unittest\n"); + i = rfind("abcdefcdef", "c"); + assert(i == 6); + i = rfind("abcdefcdef", "cd"); + assert(i == 6); + i = rfind("abcdefcdef", "x"); + assert(i == -1); + i = rfind("abcdefcdef", "xy"); + assert(i == -1); + i = rfind("abcdefcdef", ""); + assert(i == 10); + } +} + + +/******************************************** + * Split string[] into an array of strings, using the regular + * expression pattern[] with attributes[] as the separator. + * Params: + * string = String to search. + * pattern = Regular expression pattern. + * attributes = Regular expression attributes. + * Returns: + * array of slices into string[] + * Example: + * --- + * foreach (s; split("abcabcabab", "C.", "i")) + * { + * writefln("s = '%s'", s); + * } + * // Prints: + * // s = 'ab' + * // s = 'b' + * // s = 'bab' + * --- + */ + +char[][] split(char[] string, char[] pattern, char[] attributes = null) +{ + auto r = new Regex(pattern, attributes); + auto result = r.split(string); + delete r; + return result; +} + +debug( UnitTest ) +{ + unittest + { + debug(Regex) printf("Regex.split.unittest()\n"); + char[][] result; + + result = split("ab", "a*"); + assert(result.length == 2); + assert(result[0] == ""); + assert(result[1] == "b"); + } +} + +/**************************************************** + * Search string[] for first match with pattern[] with attributes[]. + * Params: + * string = String to search. + * pattern = Regular expression pattern. + * attributes = Regular expression attributes. + * Returns: + * corresponding Regex if found, null if not. + * Example: + * --- + * import tango.stdc.stdio; + * import tango.text.Regex; + * + * void main() + * { + * if (auto m = tango.text.Regex.search("abcdef", "c")) + * { + * writefln("%s[%s]%s", m.pre, m.match(0), m.post); + * } + * } + * // Prints: + * // ab[c]def + * --- + */ + +Regex search(char[] string, char[] pattern, char[] attributes = null) +{ + auto r = new Regex(pattern, attributes); + + if (r.test(string)) + { + } + else + { delete r; + r = null; + } + return r; +} + +/* ********************************* Regex ******************************** */ + +/***************************** + * Regex is a class to handle regular expressions. + * + * It is the core foundation for adding powerful string pattern matching + * capabilities to programs like grep, text editors, awk, sed, etc. + */ +class Regex +{ + /***** + * Construct a Regex object. Compile pattern + * with attributes into + * an internal form for fast execution. + * Params: + * pattern = regular expression + * attributes = _attributes + * Throws: RegexException if there are any compilation errors. + * Example: + * Declare two variables and assign to them a Regex object: + * --- + * auto r = new Regex("pattern"); + * auto s = new Regex(r"p[1-5]\s*"); + * --- + */ + public this(rchar[] pattern, rchar[] attributes = null) + { + pmatch = (&gmatch)[0 .. 1]; + compile(pattern, attributes); + } + + /***** + * Generate instance of Regex. + * Params: + * pattern = regular expression + * attributes = _attributes + * Throws: RegexException if there are any compilation errors. + * Example: + * Declare two variables and assign to them a Regex object: + * --- + * auto r = Regex("pattern"); + * auto s = Regex(r"p[1-5]\s*"); + */ + public static Regex opCall(rchar[] pattern, rchar[] attributes = null) + { + return new Regex(pattern, attributes); + } + + /************************************ + * Set up for start of foreach loop. + * Returns: + * search() returns instance of Regex set up to _search string[]. + * Example: + * --- + * import tango.stdc.stdio; + * import tango.text.Regex; + * + * void main() + * { + * foreach(m; Regex("ab").search("abcabcabab")) + * { + * writefln("%s[%s]%s", m.pre, m.match(0), m.post); + * } + * } + * // Prints: + * // [ab]cabcabab + * // abc[ab]cabab + * // abcabc[ab]ab + * // abcabcab[ab] + * --- + */ + + public Regex search(rchar[] string) + { + input = string; + pmatch[0].rm_eo = 0; + return this; + } + + /** ditto */ + public int opApply(int delegate(inout Regex) dg) + { + int result; + Regex r = this; + + while (test()) + { + result = dg(r); + if (result) + break; + } + + return result; + } + + /****************** + * Retrieve match n. + * + * n==0 means the matched substring, n>0 means the + * n'th parenthesized subexpression. + * if n is larger than the number of parenthesized subexpressions, + * null is returned. + */ + public char[] match(size_t n) + { + if (n >= pmatch.length) + return null; + else + { size_t rm_so, rm_eo; + rm_so = pmatch[n].rm_so; + rm_eo = pmatch[n].rm_eo; + if (rm_so == rm_eo) + return null; + return input[rm_so .. rm_eo]; + } + } + + /******************* + * Return the slice of the input that precedes the matched substring. + */ + public char[] pre() + { + return input[0 .. pmatch[0].rm_so]; + } + + /******************* + * Return the slice of the input that follows the matched substring. + */ + public char[] post() + { + return input[pmatch[0].rm_eo .. $]; + } + + uint re_nsub; // number of parenthesized subexpression matches + regmatch_t[] pmatch; // array [re_nsub + 1] + + rchar[] input; // the string to search + + // per instance: + + rchar[] pattern; // source text of the regular expression + + rchar[] flags; // source text of the attributes parameter + + int errors; + + uint attributes; + + enum REA + { + global = 1, // has the g attribute + ignoreCase = 2, // has the i attribute + multiline = 4, // if treat as multiple lines separated + // by newlines, or as a single line + dotmatchlf = 8, // if . matches \n + } + + +private: + size_t src; // current source index in input[] + size_t src_start; // starting index for match in input[] + size_t p; // position of parser in pattern[] + regmatch_t gmatch; // match for the entire regular expression + // (serves as storage for pmatch[0]) + + ubyte[] program; // pattern[] compiled into regular expression program + OutBuffer buf; + + + + +/******************************************/ + +// Opcodes + +enum : ubyte +{ + REend, // end of program + REchar, // single character + REichar, // single character, case insensitive + REdchar, // single UCS character + REidchar, // single wide character, case insensitive + REanychar, // any character + REanystar, // ".*" + REstring, // string of characters + REistring, // string of characters, case insensitive + REtestbit, // any in bitmap, non-consuming + REbit, // any in the bit map + REnotbit, // any not in the bit map + RErange, // any in the string + REnotrange, // any not in the string + REor, // a | b + REplus, // 1 or more + REstar, // 0 or more + REquest, // 0 or 1 + REnm, // n..m + REnmq, // n..m, non-greedy version + REbol, // beginning of line + REeol, // end of line + REparen, // parenthesized subexpression + REgoto, // goto offset + + REwordboundary, + REnotwordboundary, + REdigit, + REnotdigit, + REspace, + REnotspace, + REword, + REnotword, + REbackref, +} + +// BUG: should this include '$'? +private int isword(dchar c) { return isalnum(c) || c == '_'; } + +private uint inf = ~0u; + +/* ******************************** + * Throws RegexException on error + */ + +public void compile(rchar[] pattern, rchar[] attributes) +{ + //printf("Regex.compile('%.*s', '%.*s')\n", pattern, attributes); + + this.attributes = 0; + foreach (rchar c; attributes) + { REA att; + + switch (c) + { + case 'g': att = REA.global; break; + case 'i': att = REA.ignoreCase; break; + case 'm': att = REA.multiline; break; + default: + error("unrecognized attribute"); + return; + } + if (this.attributes & att) + { error("redundant attribute"); + return; + } + this.attributes |= att; + } + + input = null; + + this.pattern = pattern; + this.flags = attributes; + + uint oldre_nsub = re_nsub; + re_nsub = 0; + errors = 0; + + buf = new OutBuffer(); + buf.reserve(pattern.length * 8); + p = 0; + parseRegexp(); + if (p < pattern.length) + { error("unmatched ')'"); + } + optimize(); + program = buf.data; + buf.data = null; + delete buf; + + if (re_nsub > oldre_nsub) + { + if (pmatch.ptr is &gmatch) + pmatch = null; + pmatch.length = re_nsub + 1; + } + pmatch[0].rm_so = 0; + pmatch[0].rm_eo = 0; +} + +/******************************************** + * Split string[] into an array of strings, using the regular + * expression as the separator. + * Returns: + * array of slices into string[] + */ + +public rchar[][] split(rchar[] string) +{ + debug(Regex) printf("Regex.split()\n"); + + rchar[][] result; + + if (string.length) + { + int p = 0; + int q; + for (q = p; q != string.length;) + { + if (test(string, q)) + { int e; + + q = pmatch[0].rm_so; + e = pmatch[0].rm_eo; + if (e != p) + { + result ~= string[p .. q]; + for (int i = 1; i < pmatch.length; i++) + { + int so = pmatch[i].rm_so; + int eo = pmatch[i].rm_eo; + if (so == eo) + { so = 0; // -1 gives array bounds error + eo = 0; + } + result ~= string[so .. eo]; + } + q = p = e; + continue; + } + } + q++; + } + result ~= string[p .. string.length]; + } + else if (!test(string)) + result ~= string; + return result; +} + +debug( UnitTest ) +{ + unittest + { + debug(Regex) printf("Regex.split.unittest()\n"); + + auto r = new Regex("a*?", null); + rchar[][] result; + rchar[] j; + int i; + + result = r.split("ab"); + + assert(result.length == 2); + i = cmp(result[0], "a"); + assert(i == 0); + i = cmp(result[1], "b"); + assert(i == 0); + + r = new Regex("a*", null); + result = r.split("ab"); + assert(result.length == 2); + i = cmp(result[0], ""); + assert(i == 0); + i = cmp(result[1], "b"); + assert(i == 0); + + r = new Regex("<(\\/)?([^<>]+)>", null); + result = r.split("afontbarhello"); + + for (i = 0; i < result.length; i++) + { + //debug(Regex) printf("result[%d] = '%.*s'\n", i, result[i]); + } + + j = join(result, ","); + //printf("j = '%.*s'\n", j); + i = cmp(j, "a,,b,font,/,b,bar,,TAG,hello,/,TAG,"); + assert(i == 0); + + r = new Regex("a[bc]", null); + result = r.match("123ab"); + j = join(result, ","); + i = cmp(j, "ab"); + assert(i == 0); + + result = r.match("ac"); + j = join(result, ","); + i = cmp(j, "ac"); + assert(i == 0); + } +} + +/************************************************* + * Search string[] for match with regular expression. + * Returns: + * index of match if successful, -1 if not found + */ + +public int find(rchar[] string) +{ + int i; + + i = test(string); + if (i) + i = pmatch[0].rm_so; + else + i = -1; // no match + return i; +} + +//deprecated alias find search; + +debug( UnitTest ) +{ + unittest + { + debug(Regex) printf("Regex.find.unittest()\n"); + + int i; + Regex r = new Regex("abc", null); + i = r.find("xabcy"); + assert(i == 1); + i = r.find("cba"); + assert(i == -1); + } +} + + +/************************************************* + * Search string[] for match. + * Returns: + * If global attribute, return same value as exec(string). + * If not global attribute, return array of all matches. + */ + +public rchar[][] match(rchar[] string) +{ + rchar[][] result; + + if (attributes & REA.global) + { + int lastindex = 0; + + while (test(string, lastindex)) + { int eo = pmatch[0].rm_eo; + + result ~= input[pmatch[0].rm_so .. eo]; + if (lastindex == eo) + lastindex++; // always consume some source + else + lastindex = eo; + } + } + else + { + result = exec(string); + } + return result; +} + +debug( UnitTest ) +{ + unittest + { + debug(Regex) printf("Regex.match.unittest()\n"); + + int i; + rchar[][] result; + rchar[] j; + Regex r; + + r = new Regex("a[bc]", null); + result = r.match("1ab2ac3"); + j = join(result, ","); + i = cmp(j, "ab"); + assert(i == 0); + + r = new Regex("a[bc]", "g"); + result = r.match("1ab2ac3"); + j = join(result, ","); + i = cmp(j, "ab,ac"); + assert(i == 0); + } +} + +/************************************************* + * Find regular expression matches in string[]. Replace those matches + * with a new _string composed of format[] merged with the result of the + * matches. + * If global, replace all matches. Otherwise, replace first match. + * Returns: the new _string + */ + +public rchar[] replace(rchar[] string, rchar[] format) +{ + rchar[] result; + int lastindex; + int offset; + + result = string; + lastindex = 0; + offset = 0; + for (;;) + { + if (!test(string, lastindex)) + break; + + int so = pmatch[0].rm_so; + int eo = pmatch[0].rm_eo; + + rchar[] replacement = replace(format); +/+ + + TODO: Add std.string.replace so this may be used. + + + // Optimize by using std.string.replace if possible - Dave Fladebo + rchar[] slice = result[offset + so .. offset + eo]; + if (attributes & REA.global && // global, so replace all + !(attributes & REA.ignoreCase) && // not ignoring case + !(attributes & REA.multiline) && // not multiline + pattern == slice && // simple pattern (exact match, no special characters) + format == replacement) // simple format, not $ formats + { + debug(Regex) + printf("pattern: %.*s, slice: %.*s, format: %.*s, replacement: %.*s\n", + cast(int) pattern.length, pattern.ptr, + cast(int) (eo-so), result.ptr + offset, + cast(int) format.length, format.ptr, + cast(int) replacement.length, replacement.ptr); + result = std.string.replace(result,slice,replacement); + break; + } ++/ + result = replaceSlice(result, result[offset + so .. offset + eo], replacement); + + if (attributes & REA.global) + { + offset += replacement.length - (eo - so); + + if (lastindex == eo) + lastindex++; // always consume some source + else + lastindex = eo; + } + else + break; + } + + return result; +} + +debug( UnitTest ) +{ + unittest + { + debug(Regex) printf("Regex.replace.unittest()\n"); + + int i; + rchar[] result; + Regex r; + + r = new Regex("a[bc]", "g"); + result = r.replace("1ab2ac3", "x$&y"); + i = cmp(result, "1xaby2xacy3"); + assert(i == 0); + } +} + +/************************************************* + * Search string[] for match. + * Returns: + * array of slices into string[] representing matches + */ + +public rchar[][] exec(rchar[] string) +{ + debug(Regex) printf("Regex.exec(string = '%.*s')\n", + cast(int) string.length, string.ptr); + input = string; + pmatch[0].rm_so = 0; + pmatch[0].rm_eo = 0; + return exec(); +} + +/************************************************* + * Pick up where last exec(string) or exec() left off, + * searching string[] for next match. + * Returns: + * array of slices into string[] representing matches + */ + +public rchar[][] exec() +{ + if (!test()) + return null; + + auto result = new rchar[][pmatch.length]; + for (int i = 0; i < pmatch.length; i++) + { + if (pmatch[i].rm_so == pmatch[i].rm_eo) + result[i] = null; + else + result[i] = input[pmatch[i].rm_so .. pmatch[i].rm_eo]; + } + + return result; +} + +/************************************************ + * Search string[] for match. + * Returns: 0 for no match, !=0 for match + */ + +public int test(rchar[] string) +{ + return test(string, 0 /*pmatch[0].rm_eo*/); +} + +/************************************************ + * Pick up where last test(string) or test() left off, and search again. + * Returns: 0 for no match, !=0 for match + */ + +public int test() +{ + return test(input, pmatch[0].rm_eo); +} + +/************************************************ + * Test string[] starting at startindex against regular expression. + * Returns: 0 for no match, !=0 for match + */ + +public int test(char[] string, int startindex) +{ + char firstc; + uint si; + + input = string; + debug (Regex) printf("Regex.test(input[] = '%.*s', startindex = %d)\n", input, startindex); + pmatch[0].rm_so = 0; + pmatch[0].rm_eo = 0; + if (startindex < 0 || startindex > input.length) + { + return 0; // fail + } + //debug(Regex) printProgram(program); + + // First character optimization + firstc = 0; + if (program[0] == REchar) + { + firstc = program[1]; + if (attributes & REA.ignoreCase && isalpha(firstc)) + firstc = 0; + } + + for (si = startindex; ; si++) + { + if (firstc) + { + if (si == input.length) + break; // no match + if (input[si] != firstc) + { + si++; + if (!chr(si, firstc)) // if first character not found + break; // no match + } + } + for (int i = 0; i < re_nsub + 1; i++) + { + pmatch[i].rm_so = -1; + pmatch[i].rm_eo = -1; + } + src_start = src = si; + if (trymatch(0, program.length)) + { + pmatch[0].rm_so = si; + pmatch[0].rm_eo = src; + //debug(Regex) printf("start = %d, end = %d\n", gmatch.rm_so, gmatch.rm_eo); + return 1; + } + // If possible match must start at beginning, we are done + if (program[0] == REbol || program[0] == REanystar) + { + if (attributes & REA.multiline) + { + // Scan for the next \n + if (!chr(si, '\n')) + break; // no match if '\n' not found + } + else + break; + } + if (si == input.length) + break; + //debug(Regex) printf("Starting new try: '%.*s'\n", input[si + 1 .. input.length]); + } + return 0; // no match +} + +int chr(inout uint si, rchar c) +{ + for (; si < input.length; si++) + { + if (input[si] == c) + return 1; + } + return 0; +} + + +void printProgram(ubyte[] prog) +{ + debug(Regex) + { + uint pc; + uint len; + uint n; + uint m; + ushort *pu; + uint *puint; + ubyte[] s; + + printf("printProgram()\n"); + for (pc = 0; pc < prog.length; ) + { + printf("%3d: ", pc); + + //printf("prog[pc] = %d, REchar = %d, REnmq = %d\n", prog[pc], REchar, REnmq); + switch (prog[pc]) + { + case REchar: + printf("\tREchar '%c'\n", prog[pc + 1]); + pc += 1 + char.sizeof; + break; + + case REichar: + printf("\tREichar '%c'\n", prog[pc + 1]); + pc += 1 + char.sizeof; + break; + + case REdchar: + printf("\tREdchar '%c'\n", *cast(dchar *)&prog[pc + 1]); + pc += 1 + dchar.sizeof; + break; + + case REidchar: + printf("\tREidchar '%c'\n", *cast(dchar *)&prog[pc + 1]); + pc += 1 + dchar.sizeof; + break; + + case REanychar: + printf("\tREanychar\n"); + pc++; + break; + + case REstring: + len = *cast(uint *)&prog[pc + 1]; + s = (&prog[pc + 1 + uint.sizeof])[0 .. len]; + printf("\tREstring x%x, '%.*s'\n", len, + cast(int) s.length, s.ptr); + pc += 1 + uint.sizeof + len * rchar.sizeof; + break; + + case REistring: + len = *cast(uint *)&prog[pc + 1]; + s = (&prog[pc + 1 + uint.sizeof])[0 .. len]; + printf("\tREistring x%x, '%.*s'\n", len, + cast(int) s.length, s.ptr); + pc += 1 + uint.sizeof + len * rchar.sizeof; + break; + + case REtestbit: + pu = cast(ushort *)&prog[pc + 1]; + printf("\tREtestbit %d, %d\n", pu[0], pu[1]); + len = pu[1]; + pc += 1 + 2 * ushort.sizeof + len; + break; + + case REbit: + pu = cast(ushort *)&prog[pc + 1]; + len = pu[1]; + printf("\tREbit cmax=%02x, len=%d:", pu[0], len); + for (n = 0; n < len; n++) + printf(" %02x", prog[pc + 1 + 2 * ushort.sizeof + n]); + printf("\n"); + pc += 1 + 2 * ushort.sizeof + len; + break; + + case REnotbit: + pu = cast(ushort *)&prog[pc + 1]; + printf("\tREnotbit %d, %d\n", pu[0], pu[1]); + len = pu[1]; + pc += 1 + 2 * ushort.sizeof + len; + break; + + case RErange: + len = *cast(uint *)&prog[pc + 1]; + printf("\tRErange %d\n", len); + // BUG: REAignoreCase? + pc += 1 + uint.sizeof + len; + break; + + case REnotrange: + len = *cast(uint *)&prog[pc + 1]; + printf("\tREnotrange %d\n", len); + // BUG: REAignoreCase? + pc += 1 + uint.sizeof + len; + break; + + case REbol: + printf("\tREbol\n"); + pc++; + break; + + case REeol: + printf("\tREeol\n"); + pc++; + break; + + case REor: + len = *cast(uint *)&prog[pc + 1]; + printf("\tREor %d, pc=>%d\n", len, pc + 1 + uint.sizeof + len); + pc += 1 + uint.sizeof; + break; + + case REgoto: + len = *cast(uint *)&prog[pc + 1]; + printf("\tREgoto %d, pc=>%d\n", len, pc + 1 + uint.sizeof + len); + pc += 1 + uint.sizeof; + break; + + case REanystar: + printf("\tREanystar\n"); + pc++; + break; + + case REnm: + case REnmq: + // len, n, m, () + puint = cast(uint *)&prog[pc + 1]; + len = puint[0]; + n = puint[1]; + m = puint[2]; + printf("\tREnm%s len=%d, n=%u, m=%u, pc=>%d\n", + (prog[pc] == REnmq) ? cast(char*)"q" : cast(char*)" ", + len, n, m, pc + 1 + uint.sizeof * 3 + len); + pc += 1 + uint.sizeof * 3; + break; + + case REparen: + // len, n, () + puint = cast(uint *)&prog[pc + 1]; + len = puint[0]; + n = puint[1]; + printf("\tREparen len=%d n=%d, pc=>%d\n", len, n, pc + 1 + uint.sizeof * 2 + len); + pc += 1 + uint.sizeof * 2; + break; + + case REend: + printf("\tREend\n"); + return; + + case REwordboundary: + printf("\tREwordboundary\n"); + pc++; + break; + + case REnotwordboundary: + printf("\tREnotwordboundary\n"); + pc++; + break; + + case REdigit: + printf("\tREdigit\n"); + pc++; + break; + + case REnotdigit: + printf("\tREnotdigit\n"); + pc++; + break; + + case REspace: + printf("\tREspace\n"); + pc++; + break; + + case REnotspace: + printf("\tREnotspace\n"); + pc++; + break; + + case REword: + printf("\tREword\n"); + pc++; + break; + + case REnotword: + printf("\tREnotword\n"); + pc++; + break; + + case REbackref: + printf("\tREbackref %d\n", prog[1]); + pc += 2; + break; + + default: + assert(0); + } + } + } +} + + +/************************************************** + * Match input against a section of the program[]. + * Returns: + * 1 if successful match + * 0 no match + */ + +int trymatch(int pc, int pcend) +{ int srcsave; + uint len; + uint n; + uint m; + uint count; + uint pop; + uint ss; + regmatch_t *psave; + uint c1; + uint c2; + ushort* pu; + uint* puint; + + debug(Regex) + { + char[] s = input[src .. input.length]; + printf("Regex.trymatch(pc = %d, src = '%.*s', pcend = %d)\n", + pc, cast(int) s.length, s.ptr, pcend); + } + srcsave = src; + psave = null; + for (;;) + { + if (pc == pcend) // if done matching + { debug(regex) printf("\tprogend\n"); + return 1; + } + + //printf("\top = %d\n", program[pc]); + switch (program[pc]) + { + case REchar: + if (src == input.length) + goto Lnomatch; + debug(Regex) printf("\tREchar '%c', src = '%c'\n", program[pc + 1], input[src]); + if (program[pc + 1] != input[src]) + goto Lnomatch; + src++; + pc += 1 + char.sizeof; + break; + + case REichar: + if (src == input.length) + goto Lnomatch; + debug(Regex) printf("\tREichar '%c', src = '%c'\n", program[pc + 1], input[src]); + c1 = program[pc + 1]; + c2 = input[src]; + if (c1 != c2) + { + if (islower(cast(rchar)c2)) + c2 = toupper(cast(rchar)c2); + else + goto Lnomatch; + if (c1 != c2) + goto Lnomatch; + } + src++; + pc += 1 + char.sizeof; + break; + + case REdchar: + debug(Regex) printf("\tREdchar '%c', src = '%c'\n", *(cast(dchar *)&program[pc + 1]), input[src]); + if (src == input.length) + goto Lnomatch; + if (*(cast(dchar *)&program[pc + 1]) != input[src]) + goto Lnomatch; + src++; + pc += 1 + dchar.sizeof; + break; + + case REidchar: + debug(Regex) printf("\tREidchar '%c', src = '%c'\n", *(cast(dchar *)&program[pc + 1]), input[src]); + if (src == input.length) + goto Lnomatch; + c1 = *(cast(dchar *)&program[pc + 1]); + c2 = input[src]; + if (c1 != c2) + { + if (islower(cast(rchar)c2)) + c2 = toupper(cast(rchar)c2); + else + goto Lnomatch; + if (c1 != c2) + goto Lnomatch; + } + src++; + pc += 1 + dchar.sizeof; + break; + + case REanychar: + debug(Regex) printf("\tREanychar\n"); + if (src == input.length) + goto Lnomatch; + if (!(attributes & REA.dotmatchlf) && input[src] == cast(rchar)'\n') + goto Lnomatch; + src++; + pc++; + break; + + case REstring: + len = *cast(uint *)&program[pc + 1]; + debug(Regex) + { + char[] s = (&program[pc + 1 + uint.sizeof])[0 .. len]; + printf("\tREstring x%x, '%.*s'\n", len, + cast(int) s.length, s.ptr); + } + if (src + len > input.length) + goto Lnomatch; + if (memcmp(&program[pc + 1 + uint.sizeof], &input[src], len * rchar.sizeof)) + goto Lnomatch; + src += len; + pc += 1 + uint.sizeof + len * rchar.sizeof; + break; + + case REistring: + len = *cast(uint *)&program[pc + 1]; + debug(Regex) + { + char[] s = (&program[pc + 1 + uint.sizeof])[0 .. len]; + printf("\tREistring x%x, '%.*s'\n", len, + cast(int) s.length, s.ptr); + } + if (src + len > input.length) + goto Lnomatch; + version (Win32) + { + if (memicmp(cast(char*)&program[pc + 1 + uint.sizeof], &input[src], len * rchar.sizeof)) + goto Lnomatch; + } + else + { + if (icmp((cast(char*)&program[pc + 1 + uint.sizeof])[0..len], + input[src .. src + len])) + goto Lnomatch; + } + src += len; + pc += 1 + uint.sizeof + len * rchar.sizeof; + break; + + case REtestbit: + pu = (cast(ushort *)&program[pc + 1]); + debug(Regex) printf("\tREtestbit %d, %d, '%c', x%02x\n", + pu[0], pu[1], input[src], input[src]); + if (src == input.length) + goto Lnomatch; + len = pu[1]; + c1 = input[src]; + //printf("[x%02x]=x%02x, x%02x\n", c1 >> 3, ((&program[pc + 1 + 4])[c1 >> 3] ), (1 << (c1 & 7))); + if (c1 <= pu[0] && + !((&(program[pc + 1 + 4]))[c1 >> 3] & (1 << (c1 & 7)))) + goto Lnomatch; + pc += 1 + 2 * ushort.sizeof + len; + break; + + case REbit: + pu = (cast(ushort *)&program[pc + 1]); + debug(Regex) printf("\tREbit %d, %d, '%c'\n", + pu[0], pu[1], input[src]); + if (src == input.length) + goto Lnomatch; + len = pu[1]; + c1 = input[src]; + if (c1 > pu[0]) + goto Lnomatch; + if (!((&program[pc + 1 + 4])[c1 >> 3] & (1 << (c1 & 7)))) + goto Lnomatch; + src++; + pc += 1 + 2 * ushort.sizeof + len; + break; + + case REnotbit: + pu = (cast(ushort *)&program[pc + 1]); + debug(Regex) printf("\tREnotbit %d, %d, '%c'\n", + pu[0], pu[1], input[src]); + if (src == input.length) + goto Lnomatch; + len = pu[1]; + c1 = input[src]; + if (c1 <= pu[0] && + ((&program[pc + 1 + 4])[c1 >> 3] & (1 << (c1 & 7)))) + goto Lnomatch; + src++; + pc += 1 + 2 * ushort.sizeof + len; + break; + + case RErange: + len = *cast(uint *)&program[pc + 1]; + debug(Regex) printf("\tRErange %d\n", len); + if (src == input.length) + goto Lnomatch; + // BUG: REA.ignoreCase? + if (memchr(cast(char*)&program[pc + 1 + uint.sizeof], input[src], len) == null) + goto Lnomatch; + src++; + pc += 1 + uint.sizeof + len; + break; + + case REnotrange: + len = *cast(uint *)&program[pc + 1]; + debug(Regex) printf("\tREnotrange %d\n", len); + if (src == input.length) + goto Lnomatch; + // BUG: REA.ignoreCase? + if (memchr(cast(char*)&program[pc + 1 + uint.sizeof], input[src], len) != null) + goto Lnomatch; + src++; + pc += 1 + uint.sizeof + len; + break; + + case REbol: + debug(Regex) printf("\tREbol\n"); + if (src == 0) + { + } + else if (attributes & REA.multiline) + { + if (input[src - 1] != '\n') + goto Lnomatch; + } + else + goto Lnomatch; + pc++; + break; + + case REeol: + debug(Regex) printf("\tREeol\n"); + if (src == input.length) + { + } + else if (attributes & REA.multiline && input[src] == '\n') + src++; + else + goto Lnomatch; + pc++; + break; + + case REor: + len = (cast(uint *)&program[pc + 1])[0]; + debug(Regex) printf("\tREor %d\n", len); + pop = pc + 1 + uint.sizeof; + ss = src; + if (trymatch(pop, pcend)) + { + if (pcend != program.length) + { int s; + + s = src; + if (trymatch(pcend, program.length)) + { debug(Regex) printf("\tfirst operand matched\n"); + src = s; + return 1; + } + else + { + // If second branch doesn't match to end, take first anyway + src = ss; + if (!trymatch(pop + len, program.length)) + { + debug(Regex) printf("\tfirst operand matched\n"); + src = s; + return 1; + } + } + src = ss; + } + else + { debug(Regex) printf("\tfirst operand matched\n"); + return 1; + } + } + pc = pop + len; // proceed with 2nd branch + break; + + case REgoto: + debug(Regex) printf("\tREgoto\n"); + len = (cast(uint *)&program[pc + 1])[0]; + pc += 1 + uint.sizeof + len; + break; + + case REanystar: + debug(Regex) printf("\tREanystar\n"); + pc++; + for (;;) + { int s1; + int s2; + + s1 = src; + if (src == input.length) + break; + if (!(attributes & REA.dotmatchlf) && input[src] == '\n') + break; + src++; + s2 = src; + + // If no match after consumption, but it + // did match before, then no match + if (!trymatch(pc, program.length)) + { + src = s1; + // BUG: should we save/restore pmatch[]? + if (trymatch(pc, program.length)) + { + src = s1; // no match + break; + } + } + src = s2; + } + break; + + case REnm: + case REnmq: + // len, n, m, () + puint = cast(uint *)&program[pc + 1]; + len = puint[0]; + n = puint[1]; + m = puint[2]; + debug(Regex) printf("\tREnm%s len=%d, n=%u, m=%u\n", (program[pc] == REnmq) ? cast(char*)"q" : cast(char*)"", len, n, m); + pop = pc + 1 + uint.sizeof * 3; + for (count = 0; count < n; count++) + { + if (!trymatch(pop, pop + len)) + goto Lnomatch; + } + if (!psave && count < m) + { + //version (Win32) + psave = cast(regmatch_t *)alloca((re_nsub + 1) * regmatch_t.sizeof); + //else + //psave = new regmatch_t[re_nsub + 1]; + } + if (program[pc] == REnmq) // if minimal munch + { + for (; count < m; count++) + { int s1; + + memcpy(psave, pmatch.ptr, (re_nsub + 1) * regmatch_t.sizeof); + s1 = src; + + if (trymatch(pop + len, program.length)) + { + src = s1; + memcpy(pmatch.ptr, psave, (re_nsub + 1) * regmatch_t.sizeof); + break; + } + + if (!trymatch(pop, pop + len)) + { debug(Regex) printf("\tdoesn't match subexpression\n"); + break; + } + + // If source is not consumed, don't + // infinite loop on the match + if (s1 == src) + { debug(Regex) printf("\tsource is not consumed\n"); + break; + } + } + } + else // maximal munch + { + for (; count < m; count++) + { int s1; + int s2; + + memcpy(psave, pmatch.ptr, (re_nsub + 1) * regmatch_t.sizeof); + s1 = src; + if (!trymatch(pop, pop + len)) + { debug(Regex) printf("\tdoesn't match subexpression\n"); + break; + } + s2 = src; + + // If source is not consumed, don't + // infinite loop on the match + if (s1 == s2) + { debug(Regex) printf("\tsource is not consumed\n"); + break; + } + + // If no match after consumption, but it + // did match before, then no match + if (!trymatch(pop + len, program.length)) + { + src = s1; + if (trymatch(pop + len, program.length)) + { + src = s1; // no match + memcpy(pmatch.ptr, psave, (re_nsub + 1) * regmatch_t.sizeof); + break; + } + } + src = s2; + } + } + debug(Regex) printf("\tREnm len=%d, n=%u, m=%u, DONE count=%d\n", len, n, m, count); + pc = pop + len; + break; + + case REparen: + // len, () + debug(Regex) printf("\tREparen\n"); + puint = cast(uint *)&program[pc + 1]; + len = puint[0]; + n = puint[1]; + pop = pc + 1 + uint.sizeof * 2; + ss = src; + if (!trymatch(pop, pop + len)) + goto Lnomatch; + pmatch[n + 1].rm_so = ss; + pmatch[n + 1].rm_eo = src; + pc = pop + len; + break; + + case REend: + debug(Regex) printf("\tREend\n"); + return 1; // successful match + + case REwordboundary: + debug(Regex) printf("\tREwordboundary\n"); + if (src > 0 && src < input.length) + { + c1 = input[src - 1]; + c2 = input[src]; + if (!( + (isword(cast(rchar)c1) && !isword(cast(rchar)c2)) || + (!isword(cast(rchar)c1) && isword(cast(rchar)c2)) + ) + ) + goto Lnomatch; + } + pc++; + break; + + case REnotwordboundary: + debug(Regex) printf("\tREnotwordboundary\n"); + if (src == 0 || src == input.length) + goto Lnomatch; + c1 = input[src - 1]; + c2 = input[src]; + if ( + (isword(cast(rchar)c1) && !isword(cast(rchar)c2)) || + (!isword(cast(rchar)c1) && isword(cast(rchar)c2)) + ) + goto Lnomatch; + pc++; + break; + + case REdigit: + debug(Regex) printf("\tREdigit\n"); + if (src == input.length) + goto Lnomatch; + if (!isdigit(input[src])) + goto Lnomatch; + src++; + pc++; + break; + + case REnotdigit: + debug(Regex) printf("\tREnotdigit\n"); + if (src == input.length) + goto Lnomatch; + if (isdigit(input[src])) + goto Lnomatch; + src++; + pc++; + break; + + case REspace: + debug(Regex) printf("\tREspace\n"); + if (src == input.length) + goto Lnomatch; + if (!isspace(input[src])) + goto Lnomatch; + src++; + pc++; + break; + + case REnotspace: + debug(Regex) printf("\tREnotspace\n"); + if (src == input.length) + goto Lnomatch; + if (isspace(input[src])) + goto Lnomatch; + src++; + pc++; + break; + + case REword: + debug(Regex) printf("\tREword\n"); + if (src == input.length) + goto Lnomatch; + if (!isword(input[src])) + goto Lnomatch; + src++; + pc++; + break; + + case REnotword: + debug(Regex) printf("\tREnotword\n"); + if (src == input.length) + goto Lnomatch; + if (isword(input[src])) + goto Lnomatch; + src++; + pc++; + break; + + case REbackref: + { + n = program[pc + 1]; + debug(Regex) printf("\tREbackref %d\n", n); + + int so = pmatch[n + 1].rm_so; + int eo = pmatch[n + 1].rm_eo; + len = eo - so; + if (src + len > input.length) + goto Lnomatch; + else if (attributes & REA.ignoreCase) + { + if (icmp(input[src .. src + len], input[so .. eo])) + goto Lnomatch; + } + else if (memcmp(&input[src], &input[so], len * rchar.sizeof)) + goto Lnomatch; + src += len; + pc += 2; + break; + } + + default: + assert(0); + } + } + +Lnomatch: + debug(Regex) printf("\tnomatch pc=%d\n", pc); + src = srcsave; + return 0; +} + +/* =================== Compiler ================== */ + +int parseRegexp() +{ uint offset; + uint gotooffset; + uint len1; + uint len2; + + //printf("parseRegexp() '%.*s'\n", pattern[p .. pattern.length]); + offset = buf.offset; + for (;;) + { + assert(p <= pattern.length); + if (p == pattern.length) + { buf.write(REend); + return 1; + } + switch (pattern[p]) + { + case ')': + return 1; + + case '|': + p++; + gotooffset = buf.offset; + buf.write(REgoto); + buf.write(cast(uint)0); + len1 = buf.offset - offset; + buf.spread(offset, 1 + uint.sizeof); + gotooffset += 1 + uint.sizeof; + parseRegexp(); + len2 = buf.offset - (gotooffset + 1 + uint.sizeof); + buf.data[offset] = REor; + (cast(uint *)&buf.data[offset + 1])[0] = len1; + (cast(uint *)&buf.data[gotooffset + 1])[0] = len2; + break; + + default: + parsePiece(); + break; + } + } + assert(0); +} + +int parsePiece() +{ uint offset; + uint len; + uint n; + uint m; + ubyte op; + int plength = pattern.length; + + //printf("parsePiece() '%.*s'\n", pattern[p .. pattern.length]); + offset = buf.offset; + parseAtom(); + if (p == plength) + return 1; + switch (pattern[p]) + { + case '*': + // Special optimization: replace .* with REanystar + if (buf.offset - offset == 1 && + buf.data[offset] == REanychar && + p + 1 < plength && + pattern[p + 1] != '?') + { + buf.data[offset] = REanystar; + p++; + break; + } + + n = 0; + m = inf; + goto Lnm; + + case '+': + n = 1; + m = inf; + goto Lnm; + + case '?': + n = 0; + m = 1; + goto Lnm; + + case '{': // {n} {n,} {n,m} + p++; + if (p == plength || !isdigit(pattern[p])) + goto Lerr; + n = 0; + do + { + // BUG: handle overflow + n = n * 10 + pattern[p] - '0'; + p++; + if (p == plength) + goto Lerr; + } while (isdigit(pattern[p])); + if (pattern[p] == '}') // {n} + { m = n; + goto Lnm; + } + if (pattern[p] != ',') + goto Lerr; + p++; + if (p == plength) + goto Lerr; + if (pattern[p] == /*{*/ '}') // {n,} + { m = inf; + goto Lnm; + } + if (!isdigit(pattern[p])) + goto Lerr; + m = 0; // {n,m} + do + { + // BUG: handle overflow + m = m * 10 + pattern[p] - '0'; + p++; + if (p == plength) + goto Lerr; + } while (isdigit(pattern[p])); + if (pattern[p] != /*{*/ '}') + goto Lerr; + goto Lnm; + + Lnm: + p++; + op = REnm; + if (p < plength && pattern[p] == '?') + { op = REnmq; // minimal munch version + p++; + } + len = buf.offset - offset; + buf.spread(offset, 1 + uint.sizeof * 3); + buf.data[offset] = op; + uint* puint = cast(uint *)&buf.data[offset + 1]; + puint[0] = len; + puint[1] = n; + puint[2] = m; + break; + + default: + break; + } + return 1; + +Lerr: + error("badly formed {n,m}"); + assert(0); +} + +int parseAtom() +{ ubyte op; + uint offset; + rchar c; + + //printf("parseAtom() '%.*s'\n", pattern[p .. pattern.length]); + if (p < pattern.length) + { + c = pattern[p]; + switch (c) + { + case '*': + case '+': + case '?': + error("*+? not allowed in atom"); + p++; + return 0; + + case '(': + p++; + buf.write(REparen); + offset = buf.offset; + buf.write(cast(uint)0); // reserve space for length + buf.write(re_nsub); + re_nsub++; + parseRegexp(); + *cast(uint *)&buf.data[offset] = + buf.offset - (offset + uint.sizeof * 2); + if (p == pattern.length || pattern[p] != ')') + { + error("')' expected"); + return 0; + } + p++; + break; + + case '[': + if (!parseRange()) + return 0; + break; + + case '.': + p++; + buf.write(REanychar); + break; + + case '^': + p++; + buf.write(REbol); + break; + + case '$': + p++; + buf.write(REeol); + break; + + case '\\': + p++; + if (p == pattern.length) + { error("no character past '\\'"); + return 0; + } + c = pattern[p]; + switch (c) + { + case 'b': op = REwordboundary; goto Lop; + case 'B': op = REnotwordboundary; goto Lop; + case 'd': op = REdigit; goto Lop; + case 'D': op = REnotdigit; goto Lop; + case 's': op = REspace; goto Lop; + case 'S': op = REnotspace; goto Lop; + case 'w': op = REword; goto Lop; + case 'W': op = REnotword; goto Lop; + + Lop: + buf.write(op); + p++; + break; + + case 'f': + case 'n': + case 'r': + case 't': + case 'v': + case 'c': + case 'x': + case 'u': + case '0': + c = cast(char)escape(); + goto Lbyte; + + case '1': case '2': case '3': + case '4': case '5': case '6': + case '7': case '8': case '9': + c -= '1'; + if (c < re_nsub) + { buf.write(REbackref); + buf.write(cast(ubyte)c); + } + else + { error("no matching back reference"); + return 0; + } + p++; + break; + + default: + p++; + goto Lbyte; + } + break; + + default: + p++; + Lbyte: + op = REchar; + if (attributes & REA.ignoreCase) + { + if (isalpha(c)) + { + op = REichar; + c = cast(char)toupper(c); + } + } + if (op == REchar && c <= 0xFF) + { + // Look ahead and see if we can make this into + // an REstring + int q; + int len; + + for (q = p; q < pattern.length; ++q) + { rchar qc = pattern[q]; + + switch (qc) + { + case '{': + case '*': + case '+': + case '?': + if (q == p) + goto Lchar; + q--; + break; + + case '(': case ')': + case '|': + case '[': case ']': + case '.': case '^': + case '$': case '\\': + case '}': + break; + + default: + continue; + } + break; + } + len = q - p; + if (len > 0) + { + debug(Regex) printf("writing string len %d, c = '%c', pattern[p] = '%c'\n", len+1, c, pattern[p]); + buf.reserve(5 + (1 + len) * rchar.sizeof); + buf.write((attributes & REA.ignoreCase) ? REistring : REstring); + buf.write(len + 1); + buf.write(c); + buf.write(pattern[p .. p + len]); + p = q; + break; + } + } + if (c >= 0x80) + { + // Convert to dchar opcode + op = (op == REchar) ? REdchar : REidchar; + buf.write(op); + buf.write(c); + } + else + { + Lchar: + debug(Regex) printf("It's an REchar '%c'\n", c); + buf.write(op); + buf.write(cast(char)c); + } + break; + } + } + return 1; +} + +private: +class Range +{ + uint maxc; + uint maxb; + OutBuffer buf; + ubyte* base; + BitArray bits; + + this(OutBuffer buf) + { + this.buf = buf; + if (buf.data.length) + this.base = &buf.data[buf.offset]; + } + + void setbitmax(uint u) + { uint b; + + //printf("setbitmax(x%x), maxc = x%x\n", u, maxc); + if (u > maxc) + { + maxc = u; + b = u / 8; + if (b >= maxb) + { uint u2; + + u2 = base ? base - &buf.data[0] : 0; + buf.fill0(b - maxb + 1); + base = &buf.data[u2]; + maxb = b + 1; + //bits = (cast(bit*)this.base)[0 .. maxc + 1]; + bits.ptr = cast(uint*)this.base; + } + bits.len = maxc + 1; + } + } + + void setbit2(uint u) + { + setbitmax(u + 1); + //printf("setbit2 [x%02x] |= x%02x\n", u >> 3, 1 << (u & 7)); + bits[u] = 1; + } + +} + +int parseRange() +{ ubyte op; + int c; + int c2; + uint i; + uint cmax; + uint offset; + + cmax = 0x7F; + p++; + op = REbit; + if (p == pattern.length) + goto Lerr; + if (pattern[p] == '^') + { p++; + op = REnotbit; + if (p == pattern.length) + goto Lerr; + } + buf.write(op); + offset = buf.offset; + buf.write(cast(uint)0); // reserve space for length + buf.reserve(128 / 8); + auto r = new Range(buf); + if (op == REnotbit) + r.setbit2(0); + switch (pattern[p]) + { + case ']': + case '-': + c = pattern[p]; + p++; + r.setbit2(c); + break; + + default: + break; + } + + enum RS { start, rliteral, dash }; + RS rs; + + rs = RS.start; + for (;;) + { + if (p == pattern.length) + goto Lerr; + switch (pattern[p]) + { + case ']': + switch (rs) + { case RS.dash: + r.setbit2('-'); + case RS.rliteral: + r.setbit2(c); + break; + case RS.start: + break; + default: + assert(0); + } + p++; + break; + + case '\\': + p++; + r.setbitmax(cmax); + if (p == pattern.length) + goto Lerr; + switch (pattern[p]) + { + case 'd': + for (i = '0'; i <= '9'; i++) + r.bits[i] = 1; + goto Lrs; + + case 'D': + for (i = 1; i < '0'; i++) + r.bits[i] = 1; + for (i = '9' + 1; i <= cmax; i++) + r.bits[i] = 1; + goto Lrs; + + case 's': + for (i = 0; i <= cmax; i++) + if (isspace(i)) + r.bits[i] = 1; + goto Lrs; + + case 'S': + for (i = 1; i <= cmax; i++) + if (!isspace(i)) + r.bits[i] = 1; + goto Lrs; + + case 'w': + for (i = 0; i <= cmax; i++) + if (isword(cast(rchar)i)) + r.bits[i] = 1; + goto Lrs; + + case 'W': + for (i = 1; i <= cmax; i++) + if (!isword(cast(rchar)i)) + r.bits[i] = 1; + goto Lrs; + + Lrs: + switch (rs) + { case RS.dash: + r.setbit2('-'); + case RS.rliteral: + r.setbit2(c); + break; + default: + break; + } + rs = RS.start; + continue; + + default: + break; + } + c2 = escape(); + goto Lrange; + + case '-': + p++; + if (rs == RS.start) + goto Lrange; + else if (rs == RS.rliteral) + rs = RS.dash; + else if (rs == RS.dash) + { + r.setbit2(c); + r.setbit2('-'); + rs = RS.start; + } + continue; + + default: + c2 = pattern[p]; + p++; + Lrange: + switch (rs) + { case RS.rliteral: + r.setbit2(c); + case RS.start: + c = c2; + rs = RS.rliteral; + break; + + case RS.dash: + if (c > c2) + { error("inverted range in character class"); + return 0; + } + r.setbitmax(c2); + //printf("c = %x, c2 = %x\n",c,c2); + for (; c <= c2; c++) + r.bits[c] = 1; + rs = RS.start; + break; + + default: + assert(0); + } + continue; + } + break; + } + if (attributes & REA.ignoreCase) + { + // BUG: what about dchar? + r.setbitmax(0x7F); + for (c = 'a'; c <= 'z'; c++) + { + if (r.bits[c]) + r.bits[c + 'A' - 'a'] = 1; + else if (r.bits[c + 'A' - 'a']) + r.bits[c] = 1; + } + } + //printf("maxc = %d, maxb = %d\n",r.maxc,r.maxb); + (cast(ushort *)&buf.data[offset])[0] = cast(ushort)r.maxc; + (cast(ushort *)&buf.data[offset])[1] = cast(ushort)r.maxb; + return 1; + +Lerr: + error("invalid range"); + return 0; +} + +void error(char[] msg) +{ + errors++; + debug(Regex) printf("error: %.*s\n", cast(int) msg.length, msg.ptr); +//assert(0); +//*(char*)0=0; + throw new RegexException(msg); +} + +// p is following the \ char +int escape() +in +{ + assert(p < pattern.length); +} +body +{ int c; + int i; + rchar tc; + + c = pattern[p]; // none of the cases are multibyte + switch (c) + { + case 'b': c = '\b'; break; + case 'f': c = '\f'; break; + case 'n': c = '\n'; break; + case 'r': c = '\r'; break; + case 't': c = '\t'; break; + case 'v': c = '\v'; break; + + // BUG: Perl does \a and \e too, should we? + + case 'c': + ++p; + if (p == pattern.length) + goto Lretc; + c = pattern[p]; + // Note: we are deliberately not allowing dchar letters + if (!(('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z'))) + { + Lcerr: + error("letter expected following \\c"); + return 0; + } + c &= 0x1F; + break; + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + c -= '0'; + for (i = 0; i < 2; i++) + { + p++; + if (p == pattern.length) + goto Lretc; + tc = pattern[p]; + if ('0' <= tc && tc <= '7') + { c = c * 8 + (tc - '0'); + // Treat overflow as if last + // digit was not an octal digit + if (c >= 0xFF) + { c >>= 3; + return c; + } + } + else + return c; + } + break; + + case 'x': + c = 0; + for (i = 0; i < 2; i++) + { + p++; + if (p == pattern.length) + goto Lretc; + tc = pattern[p]; + if ('0' <= tc && tc <= '9') + c = c * 16 + (tc - '0'); + else if ('a' <= tc && tc <= 'f') + c = c * 16 + (tc - 'a' + 10); + else if ('A' <= tc && tc <= 'F') + c = c * 16 + (tc - 'A' + 10); + else if (i == 0) // if no hex digits after \x + { + // Not a valid \xXX sequence + return 'x'; + } + else + return c; + } + break; + + case 'u': + c = 0; + for (i = 0; i < 4; i++) + { + p++; + if (p == pattern.length) + goto Lretc; + tc = pattern[p]; + if ('0' <= tc && tc <= '9') + c = c * 16 + (tc - '0'); + else if ('a' <= tc && tc <= 'f') + c = c * 16 + (tc - 'a' + 10); + else if ('A' <= tc && tc <= 'F') + c = c * 16 + (tc - 'A' + 10); + else + { + // Not a valid \uXXXX sequence + p -= i; + return 'u'; + } + } + break; + + default: + break; + } + p++; +Lretc: + return c; +} + +/* ==================== optimizer ======================= */ + +void optimize() +{ ubyte[] prog; + + debug(Regex) printf("Regex.optimize()\n"); + prog = buf.toBytes(); + for (size_t i = 0; 1;) + { + //printf("\tprog[%d] = %d, %d\n", i, prog[i], REstring); + switch (prog[i]) + { + case REend: + case REanychar: + case REanystar: + case REbackref: + case REeol: + case REchar: + case REichar: + case REdchar: + case REidchar: + case REstring: + case REistring: + case REtestbit: + case REbit: + case REnotbit: + case RErange: + case REnotrange: + case REwordboundary: + case REnotwordboundary: + case REdigit: + case REnotdigit: + case REspace: + case REnotspace: + case REword: + case REnotword: + return; + + case REbol: + i++; + continue; + + case REor: + case REnm: + case REnmq: + case REparen: + case REgoto: + { + auto bitbuf = new OutBuffer; + auto r = new Range(bitbuf); + uint offset; + + offset = i; + if (starrchars(r, prog[i .. prog.length])) + { + debug(Regex) printf("\tfilter built\n"); + buf.spread(offset, 1 + 4 + r.maxb); + buf.data[offset] = REtestbit; + (cast(ushort *)&buf.data[offset + 1])[0] = cast(ushort)r.maxc; + (cast(ushort *)&buf.data[offset + 1])[1] = cast(ushort)r.maxb; + i = offset + 1 + 4; + buf.data[i .. i + r.maxb] = r.base[0 .. r.maxb]; + } + return; + } + default: + assert(0); + } + } +} + +///////////////////////////////////////// +// OR the leading character bits into r. +// Limit the character range from 0..7F, +// trymatch() will allow through anything over maxc. +// Return 1 if success, 0 if we can't build a filter or +// if there is no point to one. + +int starrchars(Range r, ubyte[] prog) +{ rchar c; + uint maxc; + uint maxb; + uint len; + uint b; + uint n; + uint m; + ubyte* pop; + + //printf("Regex.starrchars(prog = %p, progend = %p)\n", prog, progend); + for (size_t i = 0; i < prog.length;) + { + switch (prog[i]) + { + case REchar: + c = prog[i + 1]; + if (c <= 0x7F) + r.setbit2(c); + return 1; + + case REichar: + c = prog[i + 1]; + if (c <= 0x7F) + { r.setbit2(c); + r.setbit2(tolower(cast(rchar)c)); + } + return 1; + + case REdchar: + case REidchar: + return 1; + + case REanychar: + return 0; // no point + + case REstring: + len = *cast(uint *)&prog[i + 1]; + assert(len); + c = *cast(rchar *)&prog[i + 1 + uint.sizeof]; + debug(Regex) printf("\tREstring %d, '%c'\n", len, c); + if (c <= 0x7F) + r.setbit2(c); + return 1; + + case REistring: + len = *cast(uint *)&prog[i + 1]; + assert(len); + c = *cast(rchar *)&prog[i + 1 + uint.sizeof]; + debug(Regex) printf("\tREistring %d, '%c'\n", len, c); + if (c <= 0x7F) + { r.setbit2(toupper(cast(rchar)c)); + r.setbit2(tolower(cast(rchar)c)); + } + return 1; + + case REtestbit: + case REbit: + maxc = (cast(ushort *)&prog[i + 1])[0]; + maxb = (cast(ushort *)&prog[i + 1])[1]; + if (maxc <= 0x7F) + r.setbitmax(maxc); + else + maxb = r.maxb; + for (b = 0; b < maxb; b++) + r.base[b] |= prog[i + 1 + 4 + b]; + return 1; + + case REnotbit: + maxc = (cast(ushort *)&prog[i + 1])[0]; + maxb = (cast(ushort *)&prog[i + 1])[1]; + if (maxc <= 0x7F) + r.setbitmax(maxc); + else + maxb = r.maxb; + for (b = 0; b < maxb; b++) + r.base[b] |= ~prog[i + 1 + 4 + b]; + return 1; + + case REbol: + case REeol: + return 0; + + case REor: + len = (cast(uint *)&prog[i + 1])[0]; + return starrchars(r, prog[i + 1 + uint.sizeof .. prog.length]) && + starrchars(r, prog[i + 1 + uint.sizeof + len .. prog.length]); + + case REgoto: + len = (cast(uint *)&prog[i + 1])[0]; + i += 1 + uint.sizeof + len; + break; + + case REanystar: + return 0; + + case REnm: + case REnmq: + // len, n, m, () + len = (cast(uint *)&prog[i + 1])[0]; + n = (cast(uint *)&prog[i + 1])[1]; + m = (cast(uint *)&prog[i + 1])[2]; + pop = &prog[i + 1 + uint.sizeof * 3]; + if (!starrchars(r, pop[0 .. len])) + return 0; + if (n) + return 1; + i += 1 + uint.sizeof * 3 + len; + break; + + case REparen: + // len, () + len = (cast(uint *)&prog[i + 1])[0]; + n = (cast(uint *)&prog[i + 1])[1]; + pop = &prog[0] + i + 1 + uint.sizeof * 2; + return starrchars(r, pop[0 .. len]); + + case REend: + return 0; + + case REwordboundary: + case REnotwordboundary: + return 0; + + case REdigit: + r.setbitmax('9'); + for (c = '0'; c <= '9'; c++) + r.bits[c] = 1; + return 1; + + case REnotdigit: + r.setbitmax(0x7F); + for (c = 0; c <= '0'; c++) + r.bits[c] = 1; + for (c = '9' + 1; c <= r.maxc; c++) + r.bits[c] = 1; + return 1; + + case REspace: + r.setbitmax(0x7F); + for (c = 0; c <= r.maxc; c++) + if (isspace(c)) + r.bits[c] = 1; + return 1; + + case REnotspace: + r.setbitmax(0x7F); + for (c = 0; c <= r.maxc; c++) + if (!isspace(c)) + r.bits[c] = 1; + return 1; + + case REword: + r.setbitmax(0x7F); + for (c = 0; c <= r.maxc; c++) + if (isword(cast(rchar)c)) + r.bits[c] = 1; + return 1; + + case REnotword: + r.setbitmax(0x7F); + for (c = 0; c <= r.maxc; c++) + if (!isword(cast(rchar)c)) + r.bits[c] = 1; + return 1; + + case REbackref: + return 0; + + default: + assert(0); + } + } + return 1; +} + +/* ==================== replace ======================= */ + +/*********************** + * After a match is found with test(), this function + * will take the match results and, using the format + * string, generate and return a new string. + */ + +public rchar[] replace(rchar[] format) +{ + return replace3(format, input, pmatch[0 .. re_nsub + 1]); +} + +// Static version that doesn't require a Regex object to be created + +public static rchar[] replace3(rchar[] format, rchar[] input, regmatch_t[] pmatch) +{ + rchar[] result; + uint c2; + int rm_so; + int rm_eo; + int i; + +// printf("replace3(format = '%.*s', input = '%.*s')\n", format, input); + result.length = format.length; + result.length = 0; + for (size_t f = 0; f < format.length; f++) + { + auto c = format[f]; + L1: + if (c != '$') + { + result ~= c; + continue; + } + ++f; + if (f == format.length) + { + result ~= '$'; + break; + } + c = format[f]; + switch (c) + { + case '&': + rm_so = pmatch[0].rm_so; + rm_eo = pmatch[0].rm_eo; + goto Lstring; + + case '`': + rm_so = 0; + rm_eo = pmatch[0].rm_so; + goto Lstring; + + case '\'': + rm_so = pmatch[0].rm_eo; + rm_eo = input.length; + goto Lstring; + + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + i = c - '0'; + if (f + 1 == format.length) + { + if (i == 0) + { + result ~= '$'; + result ~= c; + continue; + } + } + else + { + c2 = format[f + 1]; + if (c2 >= '0' && c2 <= '9') + { i = (c - '0') * 10 + (c2 - '0'); + f++; + } + if (i == 0) + { + result ~= '$'; + result ~= c; + c = cast(char)c2; + goto L1; + } + } + + if (i < pmatch.length) + { rm_so = pmatch[i].rm_so; + rm_eo = pmatch[i].rm_eo; + goto Lstring; + } + break; + + Lstring: + if (rm_so != rm_eo) + result ~= input[rm_so .. rm_eo]; + break; + + default: + result ~= '$'; + result ~= c; + break; + } + } + return result; +} + +/************************************ + * Like replace(char[] format), but uses old style formatting: + + + + + + + +
Format + Description +
& + replace with the match +
\n + replace with the nth parenthesized match, n is 1..9 +
\c + replace with char c. +
+ */ + +public rchar[] replaceOld(rchar[] format) +{ + rchar[] result; + +//printf("replace: this = %p so = %d, eo = %d\n", this, pmatch[0].rm_so, pmatch[0].rm_eo); +//printf("3input = '%.*s'\n", input); + result.length = format.length; + result.length = 0; + for (size_t i; i < format.length; i++) + { + auto c = format[i]; + switch (c) + { + case '&': +//printf("match = '%.*s'\n", input[pmatch[0].rm_so .. pmatch[0].rm_eo]); + result ~= input[pmatch[0].rm_so .. pmatch[0].rm_eo]; + break; + + case '\\': + if (i + 1 < format.length) + { + c = format[++i]; + if (c >= '1' && c <= '9') + { uint j; + + j = c - '0'; + if (j <= re_nsub && pmatch[j].rm_so != pmatch[j].rm_eo) + result ~= input[pmatch[j].rm_so .. pmatch[j].rm_eo]; + break; + } + } + result ~= c; + break; + + default: + result ~= c; + break; + } + } + return result; +} + +} + +debug( UnitTest ) +{ + unittest + { // Created and placed in public domain by Don Clugston + + auto m = search("aBC r s", `bc\x20r[\40]s`, "i"); + assert(m.pre=="a"); + assert(m.match(0)=="BC r s"); + auto m2 = search("7xxyxxx", `^\d([a-z]{2})\D\1`); + assert(m2.match(0)=="7xxyxx"); + // Just check the parsing. + auto m3 = search("dcbxx", `ca|b[\d\]\D\s\S\w-\W]`); + auto m4 = search("xy", `[^\ca-\xFa\r\n\b\f\t\v\0123]{2,485}$`); + auto m5 = search("xxx", `^^\r\n\b{13,}\f{4}\t\v\u02aF3a\w\W`); + auto m6 = search("xxy", `.*y`); + assert(m6.match(0)=="xxy"); + auto m7 = search("QWDEfGH", "(ca|b|defg)+", "i"); + assert(m7.match(0)=="DEfG"); + auto m8 = search("dcbxx", `a?\B\s\S`); + auto m9 = search("dcbxx", `[-w]`); + auto m10 = search("dcbsfd", `aB[c-fW]dB|\d|\D|\u012356|\w|\W|\s|\S`, "i"); + auto m11 = search("dcbsfd", `[]a-]`); + m.replaceOld(`a&b\1c`); + m.replace(`a$&b$'$1c`); + } +} + +// +// NOTE: This code is being included temporarily until Regex can be modified +// so as not to require it. +// +private +{ + import tango.core.Memory; // for OutBuffer + extern (C) int memicmp(char *, char *, uint); + + + /********************************** + * Compare two strings. cmp is case sensitive, icmp is case insensitive. + * Returns: + * + *
< 0 s1 < s2 + *
= 0 s1 == s2 + *
> 0 s1 > s2 + *
+ */ + int cmp(char[] s1, char[] s2) + { + size_t len = s1.length; + int result; + + //printf("cmp('%.*s', '%.*s')\n", s1, s2); + if (s2.length < len) + len = s2.length; + result = memcmp(s1.ptr, s2.ptr, len); + if (result == 0) + result = cast(int)s1.length - cast(int)s2.length; + return result; + } + + /********************************* + * ditto + */ + int icmp(char[] s1, char[] s2) + { + size_t len = s1.length; + int result; + + if (s2.length < len) + len = s2.length; + version (Win32) + { + result = memicmp(s1.ptr, s2.ptr, len); + } + version (linux) + { + for (size_t i = 0; i < len; i++) + { + if (s1[i] != s2[i]) + { + char c1 = s1[i]; + char c2 = s2[i]; + + if (c1 >= 'A' && c1 <= 'Z') + c1 += cast(int)'a' - cast(int)'A'; + if (c2 >= 'A' && c2 <= 'Z') + c2 += cast(int)'a' - cast(int)'A'; + result = cast(int)c1 - cast(int)c2; + if (result) + break; + } + } + } + if (result == 0) + result = cast(int)s1.length - cast(int)s2.length; + return result; + } + + debug( UnitTest ) + { + unittest + { + int result; + + debug(string) printf("string.cmp.unittest\n"); + result = cmp("abc", "abc"); + assert(result == 0); + result = cmp(null, null); + assert(result == 0); + result = cmp("", ""); + assert(result == 0); + result = cmp("abc", "abcd"); + assert(result < 0); + result = cmp("abcd", "abc"); + assert(result > 0); + result = cmp("abc", "abd"); + assert(result < 0); + result = cmp("bbc", "abc"); + assert(result > 0); + } + } + + /********************************* + * Convert array of chars s[] to a C-style 0 terminated string. + */ + char* toStringz(char[] s) + in + { + } + out (result) + { + if (result) + { assert(strlen(result) == s.length); + assert(memcmp(result, s.ptr, s.length) == 0); + } + } + body + { + char[] copy; + + if (s.length == 0) + return ""; + + /+ Unfortunately, this isn't reliable. + We could make this work if string literals are put + in read-only memory and we test if s[] is pointing into + that. + + /* Peek past end of s[], if it's 0, no conversion necessary. + * Note that the compiler will put a 0 past the end of static + * strings, and the storage allocator will put a 0 past the end + * of newly allocated char[]'s. + */ + char* p = &s[0] + s.length; + if (*p == 0) + return s; + +/ + + // Need to make a copy + copy = new char[s.length + 1]; + copy[0..s.length] = s; + copy[s.length] = 0; + return copy.ptr; + } + + debug( UnitTest ) + { + unittest + { + debug(string) printf("string.toStringz.unittest\n"); + + char* p = toStringz("foo"); + assert(strlen(p) == 3); + char foo[] = "abbzxyzzy"; + p = toStringz(foo[3..5]); + assert(strlen(p) == 2); + + char[] test = ""; + p = toStringz(test); + assert(*p == 0); + } + } + + /***************************** + * Return a _string that is string[] with slice[] replaced by replacement[]. + */ + char[] replaceSlice(char[] string, char[] slice, char[] replacement) + in + { + // Verify that slice[] really is a slice of string[] + int so = cast(char*)slice - cast(char*)string; + assert(so >= 0); + //printf("string.length = %d, so = %d, slice.length = %d\n", string.length, so, slice.length); + assert(string.length >= so + slice.length); + } + body + { + char[] result; + int so = cast(char*)slice - cast(char*)string; + + result.length = string.length - slice.length + replacement.length; + + result[0 .. so] = string[0 .. so]; + result[so .. so + replacement.length] = replacement; + result[so + replacement.length .. result.length] = string[so + slice.length .. string.length]; + + return result; + } + + debug( UnitTest ) + { + unittest + { + debug(string) printf("string.replaceSlice.unittest\n"); + + char[] string = "hello"; + char[] slice = string[2 .. 4]; + + char[] r = replaceSlice(string, slice, "bar"); + int i; + i = cmp(r, "hebaro"); + assert(i == 0); + } + } + + // NOTE: join is used for unittests only! + + /******************************************** + * Concatenate all the strings in words[] together into one + * string; use sep[] as the separator. + */ + char[] join(char[][] words, char[] sep) + { + size_t len; + uint seplen; + uint i; + uint j; + char[] result; + + if (words.length) + { + len = 0; + for (i = 0; i < words.length; i++) + len += words[i].length; + + seplen = sep.length; + len += (words.length - 1) * seplen; + + result = new char[len]; + + i = 0; + while (true) + { + uint wlen = words[i].length; + + result[j .. j + wlen] = words[i]; + j += wlen; + i++; + if (i >= words.length) + break; + result[j .. j + seplen] = sep; + j += seplen; + } + assert(j == len); + } + return result; + } + + debug( UnitTest ) + { + unittest + { + debug(string) printf("string.join.unittest\n"); + + char[] word1 = "peter"; + char[] word2 = "paul"; + char[] word3 = "jerry"; + char[][3] words; + char[] r; + int i; + + words[0] = word1; + words[1] = word2; + words[2] = word3; + r = join(words, ","); + i = cmp(r, "peter,paul,jerry"); + assert(i == 0); + } + } + + /********************************************* + * OutBuffer provides a way to build up an array of bytes out + * of raw data. It is useful for things like preparing an + * array of bytes to write out to a file. + * OutBuffer's byte order is the format native to the computer. + * To control the byte order (endianness), use a class derived + * from OutBuffer. + */ + + class OutBuffer + { + ubyte data[]; + uint offset; + + invariant + { + //printf("this = %p, offset = %x, data.length = %u\n", this, offset, data.length); + assert(offset <= data.length); + } + + this() + { + //printf("in OutBuffer constructor\n"); + } + + /********************************* + * Convert to array of bytes. + */ + + ubyte[] toBytes() { return data[0 .. offset]; } + + /*********************************** + * Preallocate nbytes more to the size of the internal buffer. + * + * This is a + * speed optimization, a good guess at the maximum size of the resulting + * buffer will improve performance by eliminating reallocations and copying. + */ + + + void reserve(uint nbytes) + in + { + assert(offset + nbytes >= offset); + } + out + { + assert(offset + nbytes <= data.length); + assert(data.length <= GC.sizeOf(data.ptr)); + } + body + { + //c.stdio.printf("OutBuffer.reserve: length = %d, offset = %d, nbytes = %d\n", data.length, offset, nbytes); + if (data.length < offset + nbytes) + { + data.length = (offset + nbytes) * 2; + GC.clrAttr(data.ptr, GC.BlkAttr.NO_SCAN); + } + } + + /************************************* + * Append data to the internal buffer. + */ + + void write(ubyte[] bytes) + { + reserve(bytes.length); + data[offset .. offset + bytes.length] = bytes; + offset += bytes.length; + } + + void write(ubyte b) /// ditto + { + reserve(ubyte.sizeof); + this.data[offset] = b; + offset += ubyte.sizeof; + } + + void write(byte b) { write(cast(ubyte)b); } /// ditto + void write(char c) { write(cast(ubyte)c); } /// ditto + + void write(ushort w) /// ditto + { + reserve(ushort.sizeof); + *cast(ushort *)&data[offset] = w; + offset += ushort.sizeof; + } + + void write(short s) { write(cast(ushort)s); } /// ditto + + void write(wchar c) /// ditto + { + reserve(wchar.sizeof); + *cast(wchar *)&data[offset] = c; + offset += wchar.sizeof; + } + + void write(uint w) /// ditto + { + reserve(uint.sizeof); + *cast(uint *)&data[offset] = w; + offset += uint.sizeof; + } + + void write(int i) { write(cast(uint)i); } /// ditto + + void write(ulong l) /// ditto + { + reserve(ulong.sizeof); + *cast(ulong *)&data[offset] = l; + offset += ulong.sizeof; + } + + void write(long l) { write(cast(ulong)l); } /// ditto + + void write(float f) /// ditto + { + reserve(float.sizeof); + *cast(float *)&data[offset] = f; + offset += float.sizeof; + } + + void write(double f) /// ditto + { + reserve(double.sizeof); + *cast(double *)&data[offset] = f; + offset += double.sizeof; + } + + void write(real f) /// ditto + { + reserve(real.sizeof); + *cast(real *)&data[offset] = f; + offset += real.sizeof; + } + + void write(char[] s) /// ditto + { + write(cast(ubyte[])s); + } + + void write(OutBuffer buf) /// ditto + { + write(buf.toBytes()); + } + + /**************************************** + * Append nbytes of 0 to the internal buffer. + */ + + void fill0(uint nbytes) + { + reserve(nbytes); + data[offset .. offset + nbytes] = 0; + offset += nbytes; + } + + /********************************** + * 0-fill to align on power of 2 boundary. + */ + + void alignSize(uint alignsize) + in + { + assert(alignsize && (alignsize & (alignsize - 1)) == 0); + } + out + { + assert((offset & (alignsize - 1)) == 0); + } + body + { uint nbytes; + + nbytes = offset & (alignsize - 1); + if (nbytes) + fill0(alignsize - nbytes); + } + + /**************************************** + * Optimize common special case alignSize(2) + */ + + void align2() + { + if (offset & 1) + write(cast(byte)0); + } + + /**************************************** + * Optimize common special case alignSize(4) + */ + + void align4() + { + if (offset & 3) + { uint nbytes = (4 - offset) & 3; + fill0(nbytes); + } + } + + /************************************** + * Convert internal buffer to array of chars. + */ + + char[] toString() + { + //printf("OutBuffer.toString()\n"); + return cast(char[])data[0 .. offset]; + } + + /***************************************** + * Append output of C's vprintf() to internal buffer. + */ + + void vprintf(char[] format, va_list args) + { + char[128] buffer; + char* p; + char* f; + uint psize; + int count; + + f = toStringz(format); + p = buffer.ptr; + psize = buffer.length; + for (;;) + { + version(Win32) + { + count = _vsnprintf(p,psize,f,args); + if (count != -1) + break; + psize *= 2; + p = cast(char *) alloca(psize); // buffer too small, try again with larger size + } + version(linux) + { + count = vsnprintf(p,psize,f,args); + if (count == -1) + psize *= 2; + else if (count >= psize) + psize = count + 1; + else + break; + /+ + if (p != buffer) + c.stdlib.free(p); + p = (char *) c.stdlib.malloc(psize); // buffer too small, try again with larger size + +/ + p = cast(char *) alloca(psize); // buffer too small, try again with larger size + } + } + write(p[0 .. count]); + /+ + version (linux) + { + if (p != buffer) + c.stdlib.free(p); + } + +/ + } + + /***************************************** + * Append output of C's printf() to internal buffer. + */ + + void printf(char[] format, ...) + { + va_list ap; + ap = cast(va_list)&format; + ap += format.sizeof; + vprintf(format, ap); + } + + /***************************************** + * At offset index into buffer, create nbytes of space by shifting upwards + * all data past index. + */ + + void spread(uint index, uint nbytes) + in + { + assert(index <= offset); + } + body + { + reserve(nbytes); + + // This is an overlapping copy - should use memmove() + for (uint i = offset; i > index; ) + { + --i; + data[i + nbytes] = data[i]; + } + offset += nbytes; + } + } + + debug( UnitTest ) + { + unittest + { + //printf("Starting OutBuffer test\n"); + + OutBuffer buf = new OutBuffer(); + + //printf("buf = %p\n", buf); + //printf("buf.offset = %x\n", buf.offset); + assert(buf.offset == 0); + buf.write("hello"); + buf.write(cast(byte)0x20); + buf.write("world"); + buf.printf(" %d", 6); + //printf("buf = '%.*s'\n", buf.toString()); + assert(cmp(buf.toString(), "hello world 6") == 0); + } + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/text/Text.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/text/Text.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,1396 @@ +/******************************************************************************* + + copyright: Copyright (c) 2005 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: December 2005 + + author: Kris + + + _Text is a class for storing and manipulating Unicode characters. + + _Text maintains a current "selection", controlled via the mark(), + select() and selectPrior() methods. Each of append(), prepend(), + replace() and remove() operate with respect to the selection. The + select() methods operate with respect to the current selection + also, providing a means of iterating across matched patterns. To + set a selection across the entire content, use the mark() method + with no arguments. + + Indexes and lengths of content always count code units, not code + points. This is similar to traditional ascii string handling, yet + indexing is rarely used in practice due to the selection idiom: + substring indexing is generally implied as opposed to manipulated + directly. This allows for a more streamlined model with regard to + surrogates. + + Strings support a range of functionality, from insert and removal + to utf encoding and decoding. There is also an immutable subset + called TextView, intended to simplify life in a multi-threaded + environment. However, TextView must expose the raw content as + needed and thus immutability depends to an extent upon so-called + "honour" of a callee. D does not enable immutability enforcement + at this time, but this class will be modified to support such a + feature when it arrives - via the slice() method. + + The class is templated for use with char[], wchar[], and dchar[], + and should migrate across encodings seamlessly. In particular, all + functions in tango.text.Util are compatible with _Text content in + any of the supported encodings. In future, this class will become + the principal gateway to the extensive ICU unicode library. + + Note that several common text operations can be constructed through + combining tango.text._Text with tango.text.Util e.g. lines of text + can be processed thusly: + --- + auto source = new Text!(char)("one\ntwo\nthree"); + + foreach (line; Util.lines(source.slice)) + // do something with line + --- + + Substituting patterns within text can be implemented simply and + rather efficiently: + --- + auto dst = new Text!(char); + + foreach (element; Util.patterns ("all cows eat grass", "eat", "chew")) + dst.append (element); + --- + + Speaking a bit like Yoda might be accomplished as follows: + --- + auto dst = new Text!(char); + + foreach (element; Util.delims ("all cows eat grass", " ")) + dst.prepend (element); + --- + + Below is an overview of the API and class hierarchy: + --- + class Text(T) : TextView!(T) + { + // set or reset the content + Text set (T[] chars, bool mutable=true); + Text set (TextView other, bool mutable=true); + + // retreive currently selected text + T[] selection (); + + // get the index and length of the current selection + Span selectionSpan (); + + // mark a selection + Text select (int start=0, int length=int.max); + + // move the selection around + bool select (T c); + bool select (T[] pattern); + bool select (TextView other); + bool selectPrior (T c); + bool selectPrior (T[] pattern); + bool selectPrior (TextView other); + + // append behind current selection + Text append (TextView other); + Text append (T[] text); + Text append (T chr, int count=1); + Text append (int value, options); + Text append (long value, options); + Text append (double value, options); + + // transcode behind current selection + Text encode (char[]); + Text encode (wchar[]); + Text encode (dchar[]); + + // insert before current selection + Text prepend (T[] text); + Text prepend (TextView other); + Text prepend (T chr, int count=1); + + // replace current selection + Text replace (T chr); + Text replace (T[] text); + Text replace (TextView other); + + // remove current selection + Text remove (); + + // clear content + Text clear (); + + // trim leading and trailing whitespace + Text trim (); + + // trim leading and trailing chr instances + Text strip (T chr); + + // truncate at point, or current selection + Text truncate (int point = int.max); + + // reserve some space for inserts/additions + Text reserve (int extra); + } + + class TextView(T) : UniText + { + // hash content + hash_t toHash (); + + // return length of content + uint length (); + + // compare content + bool equals (T[] text); + bool equals (TextView other); + bool ends (T[] text); + bool ends (TextView other); + bool starts (T[] text); + bool starts (TextView other); + int compare (T[] text); + int compare (TextView other); + int opEquals (Object other); + int opCmp (Object other); + + // copy content + T[] copy (T[] dst); + + // return content + T[] slice (); + + // return data type + typeinfo encoding (); + + // replace the comparison algorithm + Comparator comparator (Comparator other); + } + + class UniText + { + // convert content + abstract char[] toString (char[] dst = null); + abstract wchar[] toString16 (wchar[] dst = null); + abstract dchar[] toString32 (dchar[] dst = null); + } + --- + +*******************************************************************************/ + +module tango.text.Text; + +private import Util = tango.text.Util; + +private import Utf = tango.text.convert.Utf; + +private import Float = tango.text.convert.Float; + +private import Integer = tango.text.convert.Integer; + +/******************************************************************************* + +*******************************************************************************/ + +private extern (C) void memmove (void* dst, void* src, uint bytes); + + +/******************************************************************************* + + The mutable Text class actually implements the full API, whereas + the superclasses are purely abstract (could be interfaces instead). + +*******************************************************************************/ + +class Text(T) : TextView!(T) +{ + public alias set opAssign; + public alias append opCatAssign; + private alias TextView!(T) TextViewT; + + private T[] content; + private bool mutable; + private Comparator comparator_; + private uint selectPoint, + selectLength, + contentLength; + + /*********************************************************************** + + Selection span + + ***********************************************************************/ + + public struct Span + { + uint begin, /// index of selection point + length; /// length of selection + } + + /*********************************************************************** + + Create an empty Text with the specified available + space + + ***********************************************************************/ + + this (uint space = 0) + { + content.length = space; + this.comparator_ = &simpleComparator; + } + + /*********************************************************************** + + Create a Text upon the provided content. If said + content is immutable (read-only) then you might consider + setting the 'copy' parameter to false. Doing so will + avoid allocating heap-space for the content until it is + modified via Text methods. This can be useful when + wrapping an array "temporarily" with a stack-based Text + + ***********************************************************************/ + + this (T[] content, bool copy = true) + { + set (content, copy); + this.comparator_ = &simpleComparator; + } + + /*********************************************************************** + + Create a Text via the content of another. If said + content is immutable (read-only) then you might consider + setting the 'copy' parameter to false. Doing so will avoid + allocating heap-space for the content until it is modified + via Text methods. This can be useful when wrapping an array + temporarily with a stack-based Text + + ***********************************************************************/ + + this (TextViewT other, bool copy = true) + { + this (other.slice, copy); + } + + /*********************************************************************** + + Set the content to the provided array. Parameter 'copy' + specifies whether the given array is likely to change. If + not, the array is aliased until such time it is altered via + this class. This can be useful when wrapping an array + "temporarily" with a stack-based Text + + ***********************************************************************/ + + final Text set (T[] chars, bool copy = true) + { + if ((this.mutable = copy) is true) + content = chars.dup; + else + content = chars; + + return select (0, contentLength = chars.length); + } + + /*********************************************************************** + + Replace the content of this Text. If the new content + is immutable (read-only) then you might consider setting the + 'copy' parameter to false. Doing so will avoid allocating + heap-space for the content until it is modified via one of + these methods. This can be useful when wrapping an array + "temporarily" with a stack-based Text + + ***********************************************************************/ + + final Text set (TextViewT other, bool copy = true) + { + return set (other.slice, copy); + } + + /*********************************************************************** + + Explicitly set the current selection + + ***********************************************************************/ + + final Text select (int start=0, int length=int.max) + { + pinIndices (start, length); + selectPoint = start; + selectLength = length; + return this; + } + + /*********************************************************************** + + Return the currently selected content + + ***********************************************************************/ + + final T[] selection () + { + return slice [selectPoint .. selectPoint+selectLength]; + } + + /*********************************************************************** + + Return the index and length of the current selection + + ***********************************************************************/ + + final Span selectionSpan () + { + Span span; + span.begin = selectPoint; + span.length = selectLength; + return span; + } + + /*********************************************************************** + + Find and select the next occurrence of a BMP code point + in a string. Returns true if found, false otherwise + + ***********************************************************************/ + + final bool select (T c) + { + auto s = slice(); + auto x = Util.locate (s, c, selectPoint); + if (x < s.length) + { + select (x, 1); + return true; + } + return false; + } + + /*********************************************************************** + + Find and select the next substring occurrence. Returns + true if found, false otherwise + + ***********************************************************************/ + + final bool select (TextViewT other) + { + return select (other.slice); + } + + /*********************************************************************** + + Find and select the next substring occurrence. Returns + true if found, false otherwise + + ***********************************************************************/ + + final bool select (T[] chars) + { + auto s = slice(); + auto x = Util.locatePattern (s, chars, selectPoint); + if (x < s.length) + { + select (x, chars.length); + return true; + } + return false; + } + + /*********************************************************************** + + Find and select a prior occurrence of a BMP code point + in a string. Returns true if found, false otherwise + + ***********************************************************************/ + + final bool selectPrior (T c) + { + auto s = slice(); + auto x = Util.locatePrior (s, c, selectPoint); + if (x < s.length) + { + select (x, 1); + return true; + } + return false; + } + + /*********************************************************************** + + Find and select a prior substring occurrence. Returns + true if found, false otherwise + + ***********************************************************************/ + + final bool selectPrior (TextViewT other) + { + return selectPrior (other.slice); + } + + /*********************************************************************** + + Find and select a prior substring occurrence. Returns + true if found, false otherwise + + ***********************************************************************/ + + final bool selectPrior (T[] chars) + { + auto s = slice(); + auto x = Util.locatePatternPrior (s, chars, selectPoint); + if (x < s.length) + { + select (x, chars.length); + return true; + } + return false; + } + + /*********************************************************************** + + Append text to this Text + + ***********************************************************************/ + + final Text append (TextViewT other) + { + return append (other.slice); + } + + /*********************************************************************** + + Append text to this Text + + ***********************************************************************/ + + final Text append (T[] chars) + { + return append (chars.ptr, chars.length); + } + + /*********************************************************************** + + Append a count of characters to this Text + + ***********************************************************************/ + + final Text append (T chr, int count=1) + { + uint point = selectPoint + selectLength; + expand (point, count); + return set (chr, point, count); + } + + /*********************************************************************** + + Append an integer to this Text + + ***********************************************************************/ + + final Text append (int v, Integer.Style fmt=Integer.Style.Signed) + { + return append (cast(long) v, fmt); + } + + /*********************************************************************** + + Append a long to this Text + + ***********************************************************************/ + + final Text append (long v, Integer.Style fmt=Integer.Style.Signed) + { + T[64] tmp = void; + return append (Integer.format(tmp, v, fmt)); + } + + /*********************************************************************** + + Append a double to this Text + + ***********************************************************************/ + + final Text append (double v, uint decimals=2, int e=10) + { + T[64] tmp = void; + return append (Float.format(tmp, v, decimals, e)); + } + + /*********************************************************************** + + Insert characters into this Text + + ***********************************************************************/ + + final Text prepend (T chr, int count=1) + { + expand (selectPoint, count); + return set (chr, selectPoint, count); + } + + /*********************************************************************** + + Insert text into this Text + + ***********************************************************************/ + + final Text prepend (T[] other) + { + expand (selectPoint, other.length); + content[selectPoint..selectPoint+other.length] = other; + return this; + } + + /*********************************************************************** + + Insert another Text into this Text + + ***********************************************************************/ + + final Text prepend (TextViewT other) + { + return prepend (other.slice); + } + + /*********************************************************************** + + Append encoded text at the current selection point. The text + is converted as necessary to the appropritate utf encoding. + + ***********************************************************************/ + + final Text encode (char[] s) + { + T[1024] tmp = void; + + static if (is (T == char)) + return append(s); + + static if (is (T == wchar)) + return append (Utf.toString16(s, tmp)); + + static if (is (T == dchar)) + return append (Utf.toString32(s, tmp)); + } + + /// ditto + final Text encode (wchar[] s) + { + T[1024] tmp = void; + + static if (is (T == char)) + return append (Utf.toString(s, tmp)); + + static if (is (T == wchar)) + return append (s); + + static if (is (T == dchar)) + return append (Utf.toString32(s, tmp)); + } + + /// ditto + final Text encode (dchar[] s) + { + T[1024] tmp = void; + + static if (is (T == char)) + return append (Utf.toString(s, tmp)); + + static if (is (T == wchar)) + return append (Utf.toString16(s, tmp)); + + static if (is (T == dchar)) + return append (s); + } + + /// ditto + final Text encode (Object o) + { + return encode (o.toString); + } + + /*********************************************************************** + + Replace a section of this Text with the specified + character + + ***********************************************************************/ + + final Text replace (T chr) + { + return set (chr, selectPoint, selectLength); + } + + /*********************************************************************** + + Replace a section of this Text with the specified + array + + ***********************************************************************/ + + final Text replace (T[] chars) + { + int chunk = chars.length - selectLength; + if (chunk >= 0) + expand (selectPoint, chunk); + else + remove (selectPoint, -chunk); + + content [selectPoint .. selectPoint+chars.length] = chars; + return select (selectPoint, chars.length); + } + + /*********************************************************************** + + Replace a section of this Text with another + + ***********************************************************************/ + + final Text replace (TextViewT other) + { + return replace (other.slice); + } + + /*********************************************************************** + + Remove the selection from this Text and reset the + selection to zero length + + ***********************************************************************/ + + final Text remove () + { + remove (selectPoint, selectLength); + return select (selectPoint, 0); + } + + /*********************************************************************** + + Remove the selection from this Text + + ***********************************************************************/ + + private Text remove (int start, int count) + { + pinIndices (start, count); + if (count > 0) + { + if (! mutable) + realloc (); + + uint i = start + count; + memmove (content.ptr+start, content.ptr+i, (contentLength-i) * T.sizeof); + contentLength -= count; + } + return this; + } + + /*********************************************************************** + + Truncate this string at an optional index. Default behaviour + is to truncate at the current append point. Current selection + is moved to the truncation point, with length 0 + + ***********************************************************************/ + + final Text truncate (int index = int.max) + { + if (index is int.max) + index = selectPoint + selectLength; + + pinIndex (index); + return select (contentLength = index, 0); + } + + /*********************************************************************** + + Clear the string content + + ***********************************************************************/ + + final Text clear () + { + return select (contentLength = 0, 0); + } + + /*********************************************************************** + + Remove leading and trailing whitespace from this Text, + and reset the selection to the trimmed content + + ***********************************************************************/ + + final Text trim () + { + content = Util.trim (slice); + select (0, contentLength = content.length); + return this; + } + + /*********************************************************************** + + Remove leading and trailing matches from this Text, + and reset the selection to the stripped content + + ***********************************************************************/ + + final Text strip (T matches) + { + content = Util.strip (slice, matches); + select (0, contentLength = content.length); + return this; + } + + /*********************************************************************** + + Reserve some extra room + + ***********************************************************************/ + + final Text reserve (uint extra) + { + realloc (extra); + return this; + } + + + + /* ======================== TextView methods ======================== */ + + + + /*********************************************************************** + + Get the encoding type + + ***********************************************************************/ + + final TypeInfo encoding() + { + return typeid(T); + } + + /*********************************************************************** + + Set the comparator delegate. Where other is null, we behave + as a getter only + + ***********************************************************************/ + + final Comparator comparator (Comparator other) + { + auto tmp = comparator_; + if (other) + comparator_ = other; + return tmp; + } + + /*********************************************************************** + + Hash this Text + + ***********************************************************************/ + + override hash_t toHash () + { + return Util.jhash (cast(ubyte*) content.ptr, contentLength * T.sizeof); + } + + /*********************************************************************** + + Return the length of the valid content + + ***********************************************************************/ + + final uint length () + { + return contentLength; + } + + /*********************************************************************** + + Is this Text equal to another? + + ***********************************************************************/ + + final bool equals (TextViewT other) + { + if (other is this) + return true; + return equals (other.slice); + } + + /*********************************************************************** + + Is this Text equal to the provided text? + + ***********************************************************************/ + + final bool equals (T[] other) + { + if (other.length == contentLength) + return Util.matching (other.ptr, content.ptr, contentLength); + return false; + } + + /*********************************************************************** + + Does this Text end with another? + + ***********************************************************************/ + + final bool ends (TextViewT other) + { + return ends (other.slice); + } + + /*********************************************************************** + + Does this Text end with the specified string? + + ***********************************************************************/ + + final bool ends (T[] chars) + { + if (chars.length <= contentLength) + return Util.matching (content.ptr+(contentLength-chars.length), chars.ptr, chars.length); + return false; + } + + /*********************************************************************** + + Does this Text start with another? + + ***********************************************************************/ + + final bool starts (TextViewT other) + { + return starts (other.slice); + } + + /*********************************************************************** + + Does this Text start with the specified string? + + ***********************************************************************/ + + final bool starts (T[] chars) + { + if (chars.length <= contentLength) + return Util.matching (content.ptr, chars.ptr, chars.length); + return false; + } + + /*********************************************************************** + + Compare this Text start with another. Returns 0 if the + content matches, less than zero if this Text is "less" + than the other, or greater than zero where this Text + is "bigger". + + ***********************************************************************/ + + final int compare (TextViewT other) + { + if (other is this) + return 0; + + return compare (other.slice); + } + + /*********************************************************************** + + Compare this Text start with an array. Returns 0 if the + content matches, less than zero if this Text is "less" + than the other, or greater than zero where this Text + is "bigger". + + ***********************************************************************/ + + final int compare (T[] chars) + { + return comparator_ (slice, chars); + } + + /*********************************************************************** + + Return content from this Text + + A slice of dst is returned, representing a copy of the + content. The slice is clipped to the minimum of either + the length of the provided array, or the length of the + content minus the stipulated start point + + ***********************************************************************/ + + final T[] copy (T[] dst) + { + uint i = contentLength; + if (i > dst.length) + i = dst.length; + + return dst [0 .. i] = content [0 .. i]; + } + + /*********************************************************************** + + Return an alias to the content of this TextView. Note + that you are bound by honour to leave this content wholly + unmolested. D surely needs some way to enforce immutability + upon array references + + ***********************************************************************/ + + final T[] slice () + { + return content [0 .. contentLength]; + } + + /*********************************************************************** + + Convert to the UniText types. The optional argument + dst will be resized as required to house the conversion. + To minimize heap allocation during subsequent conversions, + apply the following pattern: + --- + _Text string; + + wchar[] buffer; + wchar[] result = string.utf16 (buffer); + + if (result.length > buffer.length) + buffer = result; + --- + You can also provide a buffer from the stack, but the output + will be moved to the heap if said buffer is not large enough + + ***********************************************************************/ + + final char[] toString (char[] dst = null) + { + static if (is (T == char)) + return slice(); + + static if (is (T == wchar)) + return Utf.toString (slice, dst); + + static if (is (T == dchar)) + return Utf.toString (slice, dst); + } + + /// ditto + final wchar[] toString16 (wchar[] dst = null) + { + static if (is (T == char)) + return Utf.toString16 (slice, dst); + + static if (is (T == wchar)) + return slice; + + static if (is (T == dchar)) + return Utf.toString16 (slice, dst); + } + + /// ditto + final dchar[] toString32 (dchar[] dst = null) + { + static if (is (T == char)) + return Utf.toString32 (slice, dst); + + static if (is (T == wchar)) + return Utf.toString32 (slice, dst); + + static if (is (T == dchar)) + return slice; + } + + /*********************************************************************** + + Compare this Text to another. We compare against other + Strings only. Literals and other objects are not supported + + ***********************************************************************/ + + override int opCmp (Object o) + { + auto other = cast (TextViewT) o; + + if (other is null) + return -1; + + return compare (other); + } + + /*********************************************************************** + + Is this Text equal to the text of something else? + + ***********************************************************************/ + + override int opEquals (Object o) + { + auto other = cast (TextViewT) o; + + if (other) + return equals (other); + + // this can become expensive ... + char[1024] tmp = void; + return this.toString(tmp) == o.toString; + } + + /// ditto + final int opEquals (T[] s) + { + return slice == s; + } + + /*********************************************************************** + + Pin the given index to a valid position. + + ***********************************************************************/ + + private void pinIndex (inout int x) + { + if (x > contentLength) + x = contentLength; + } + + /*********************************************************************** + + Pin the given index and length to a valid position. + + ***********************************************************************/ + + private void pinIndices (inout int start, inout int length) + { + if (start > contentLength) + start = contentLength; + + if (length > (contentLength - start)) + length = contentLength - start; + } + + /*********************************************************************** + + Compare two arrays. Returns 0 if the content matches, less + than zero if A is "less" than B, or greater than zero where + A is "bigger". Where the substrings match, the shorter is + considered "less". + + ***********************************************************************/ + + private int simpleComparator (T[] a, T[] b) + { + uint i = a.length; + if (b.length < i) + i = b.length; + + for (int j, k; j < i; ++j) + if ((k = a[j] - b[j]) != 0) + return k; + + return a.length - b.length; + } + + /*********************************************************************** + + Make room available to insert or append something + + ***********************************************************************/ + + private void expand (uint index, uint count) + { + if (!mutable || (contentLength + count) > content.length) + realloc (count); + + memmove (content.ptr+index+count, content.ptr+index, (contentLength - index) * T.sizeof); + selectLength += count; + contentLength += count; + } + + /*********************************************************************** + + Replace a section of this Text with the specified + character + + ***********************************************************************/ + + private Text set (T chr, uint start, uint count) + { + content [start..start+count] = chr; + return this; + } + + /*********************************************************************** + + Allocate memory due to a change in the content. We handle + the distinction between mutable and immutable here. + + ***********************************************************************/ + + private void realloc (uint count = 0) + { + uint size = (content.length + count + 127) & ~127; + + if (mutable) + content.length = size; + else + { + mutable = true; + T[] x = content; + content = new T[size]; + if (contentLength) + content[0..contentLength] = x; + } + } + + /*********************************************************************** + + Internal method to support Text appending + + ***********************************************************************/ + + private Text append (T* chars, uint count) + { + uint point = selectPoint + selectLength; + expand (point, count); + content[point .. point+count] = chars[0 .. count]; + return this; + } +} + + + +/******************************************************************************* + + Immutable string + +*******************************************************************************/ + +class TextView(T) : UniText +{ + public typedef int delegate (T[] a, T[] b) Comparator; + + /*********************************************************************** + + Return the length of the valid content + + ***********************************************************************/ + + abstract uint length (); + + /*********************************************************************** + + Is this Text equal to another? + + ***********************************************************************/ + + abstract bool equals (TextView other); + + /*********************************************************************** + + Is this Text equal to the the provided text? + + ***********************************************************************/ + + abstract bool equals (T[] other); + + /*********************************************************************** + + Does this Text end with another? + + ***********************************************************************/ + + abstract bool ends (TextView other); + + /*********************************************************************** + + Does this Text end with the specified string? + + ***********************************************************************/ + + abstract bool ends (T[] chars); + + /*********************************************************************** + + Does this Text start with another? + + ***********************************************************************/ + + abstract bool starts (TextView other); + + /*********************************************************************** + + Does this Text start with the specified string? + + ***********************************************************************/ + + abstract bool starts (T[] chars); + + /*********************************************************************** + + Compare this Text start with another. Returns 0 if the + content matches, less than zero if this Text is "less" + than the other, or greater than zero where this Text + is "bigger". + + ***********************************************************************/ + + abstract int compare (TextView other); + + /*********************************************************************** + + Compare this Text start with an array. Returns 0 if the + content matches, less than zero if this Text is "less" + than the other, or greater than zero where this Text + is "bigger". + + ***********************************************************************/ + + abstract int compare (T[] chars); + + /*********************************************************************** + + Return content from this Text. A slice of dst is + returned, representing a copy of the content. The + slice is clipped to the minimum of either the length + of the provided array, or the length of the content + minus the stipulated start point + + ***********************************************************************/ + + abstract T[] copy (T[] dst); + + /*********************************************************************** + + Compare this Text to another + + ***********************************************************************/ + + abstract int opCmp (Object o); + + /*********************************************************************** + + Is this Text equal to another? + + ***********************************************************************/ + + abstract int opEquals (Object other); + + /*********************************************************************** + + Is this Text equal to another? + + ***********************************************************************/ + + abstract int opEquals (T[] other); + + /*********************************************************************** + + Get the encoding type + + ***********************************************************************/ + + abstract TypeInfo encoding(); + + /*********************************************************************** + + Set the comparator delegate + + ***********************************************************************/ + + abstract Comparator comparator (Comparator other); + + /*********************************************************************** + + Hash this Text + + ***********************************************************************/ + + abstract hash_t toHash (); + + /*********************************************************************** + + Return an alias to the content of this TextView. Note + that you are bound by honour to leave this content wholly + unmolested. D surely needs some way to enforce immutability + upon array references + + ***********************************************************************/ + + abstract T[] slice (); +} + + +/******************************************************************************* + + A string abstraction that converts to anything + +*******************************************************************************/ + +class UniText +{ + abstract char[] toString (char[] dst = null); + + abstract wchar[] toString16 (wchar[] dst = null); + + abstract dchar[] toString32 (dchar[] dst = null); + + abstract TypeInfo encoding(); +} + + + +/******************************************************************************* + +*******************************************************************************/ + +debug (UnitTest) +{ + //void main() {} + unittest + { + auto s = new Text!(char); + s = "hello"; + + s.select ("hello"); + assert (s.selection == "hello"); + s.replace ("1"); + assert (s.selection == "1"); + assert (s == "1"); + + assert (s.clear == ""); + + assert (s.append(12345) == "12345"); + assert (s.selection == "12345"); + + //s.append ("fubar"); + s ~= "fubar"; + assert (s.selection == "12345fubar"); + assert (s.select('5')); + assert (s.selection == "5"); + assert (s.remove == "1234fubar"); + assert (s.select("fubar")); + assert (s.selection == "fubar"); + assert (s.select("wumpus") is false); + assert (s.selection == "fubar"); + + assert (s.clear.append(1.2345, 4) == "1.2345"); + + assert (s.clear.append(0xf0, Integer.Style.Binary) == "11110000"); + + assert (s.clear.encode("one"d).toString == "one"); + + assert (Util.splitLines(s.clear.append("a\nb").slice).length is 2); + + assert (s.select.replace("almost ") == "almost "); + foreach (element; Util.patterns ("all cows eat grass", "eat", "chew")) + s.append (element); + assert (s.selection == "almost all cows chew grass"); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/text/Unicode.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/text/Unicode.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,821 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Peter Triller. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: Sept 2007 + + authors: Peter + + Provides case mapping Functions for Unicode Strings. As of now it is + only 99 % complete, because it does not take into account Conditional + case mappings. This means the Greek Letter Sigma will not be correctly + case mapped at the end of a Word, and the Locales Lithuanian, Turkish + and Azeri are not taken into account during Case Mappings. This means + all in all around 12 Characters will not be mapped correctly under + some circumstances. + + ICU4j also does not handle these cases at the moment. + + Unittests are written against output from ICU4j + + This Module tries to minimize Memory allocation and usage. You can + always pass the output buffer that should be used to the case mapping + function, which will be resized if necessary. + +*******************************************************************************/ + +module tango.text.Unicode; + +private import tango.text.UnicodeData; +private import tango.text.convert.Utf; + + + +/** + * Converts an Utf8 String to Upper case + * + * Params: + * input = String to be case mapped + * output = this output buffer will be used unless too small + * Returns: the case mapped string + */ +deprecated char[] blockToUpper(char[] input, char[] output = null, dchar[] working = null) { + + // ?? How much preallocation ?? This is worst case allocation + if (working is null) + working.length = input.length; + + uint produced = 0; + uint ate; + uint oprod = 0; + foreach(dchar ch; input) { + // TODO Conditional Case Mapping + UnicodeData **d = (ch in unicodeData); + if(d !is null && ((*d).generalCategory & UnicodeData.GeneralCategory.SpecialMapping)) { + SpecialCaseData **s = (ch in specialCaseData); + debug { + assert(s !is null); + } + if((*s).upperCaseMapping !is null) { + // To speed up, use worst case for memory prealocation + // since the length of an UpperCaseMapping list is at most 4 + // Make sure no relocation is made in the toString Method + // better allocation algorithm ? + int len = (*s).upperCaseMapping.length; + if(produced + len >= working.length) + working.length = working.length + working.length / 2 + len; + oprod = produced; + produced += len; + working[oprod..produced] = (*s).upperCaseMapping; + continue; + } + } + // Make sure no relocation is made in the toString Method + if(produced + 1 >= output.length) + working.length = working.length + working.length / 2 + 1; + working[produced++] = d is null ? ch:(*d).simpleUpperCaseMapping; + } + return toString(working[0..produced],output); +} + + + +/** + * Converts an Utf8 String to Upper case + * + * Params: + * input = String to be case mapped + * output = this output buffer will be used unless too small + * Returns: the case mapped string + */ +char[] toUpper(char[] input, char[] output = null) { + + dchar[1] buf; + // assume most common case: String stays the same length + if (output.length < input.length) + output.length = input.length; + + uint produced = 0; + uint ate; + foreach(dchar ch; input) { + // TODO Conditional Case Mapping + UnicodeData **d = (ch in unicodeData); + if(d !is null && ((*d).generalCategory & UnicodeData.GeneralCategory.SpecialMapping)) { + SpecialCaseData **s = (ch in specialCaseData); + debug { + assert(s !is null); + } + if((*s).upperCaseMapping !is null) { + // To speed up, use worst case for memory prealocation + // since the length of an UpperCaseMapping list is at most 4 + // Make sure no relocation is made in the toString Method + // better allocation algorithm ? + if(produced + (*s).upperCaseMapping.length * 4 >= output.length) + output.length = output.length + output.length / 2 + (*s).upperCaseMapping.length * 4; + char[] res = toString((*s).upperCaseMapping, output[produced..output.length], &ate); + debug { + assert(ate == (*s).upperCaseMapping.length); + assert(res.ptr == output[produced..output.length].ptr); + } + produced += res.length; + continue; + } + } + // Make sure no relocation is made in the toString Method + if(produced + 4 >= output.length) + output.length = output.length + output.length / 2 + 4; + buf[0] = d is null ? ch:(*d).simpleUpperCaseMapping; + char[] res = toString(buf, output[produced..output.length], &ate); + debug { + assert(ate == 1); + assert(res.ptr == output[produced..output.length].ptr); + } + produced += res.length; + } + return output[0..produced]; +} + + +/** + * Converts an Utf16 String to Upper case + * + * Params: + * input = String to be case mapped + * output = this output buffer will be used unless too small + * Returns: the case mapped string + */ +wchar[] toUpper(wchar[] input, wchar[] output = null) { + + dchar[1] buf; + // assume most common case: String stays the same length + if (output.length < input.length) + output.length = input.length; + + uint produced = 0; + uint ate; + foreach(dchar ch; input) { + // TODO Conditional Case Mapping + UnicodeData **d = (ch in unicodeData); + if(d !is null && ((*d).generalCategory & UnicodeData.GeneralCategory.SpecialMapping)) { + SpecialCaseData **s = (ch in specialCaseData); + debug { + assert(s !is null); + } + if((*s).upperCaseMapping !is null) { + // To speed up, use worst case for memory prealocation + // Make sure no relocation is made in the toString16 Method + // better allocation algorithm ? + if(produced + (*s).upperCaseMapping.length * 2 >= output.length) + output.length = output.length + output.length / 2 + (*s).upperCaseMapping.length * 3; + wchar[] res = toString16((*s).upperCaseMapping, output[produced..output.length], &ate); + debug { + assert(ate == (*s).upperCaseMapping.length); + assert(res.ptr == output[produced..output.length].ptr); + } + produced += res.length; + continue; + } + } + // Make sure no relocation is made in the toString16 Method + if(produced + 4 >= output.length) + output.length = output.length + output.length / 2 + 3; + buf[0] = d is null ? ch:(*d).simpleUpperCaseMapping; + wchar[] res = toString16(buf, output[produced..output.length], &ate); + debug { + assert(ate == 1); + assert(res.ptr == output[produced..output.length].ptr); + } + produced += res.length; + } + return output[0..produced]; +} + +/** + * Converts an Utf32 String to Upper case + * + * Params: + * input = String to be case mapped + * output = this output buffer will be used unless too small + * Returns: the case mapped string + */ +dchar[] toUpper(dchar[] input, dchar[] output = null) { + + // assume most common case: String stays the same length + if (input.length > output.length) + output.length = input.length; + + uint produced = 0; + if (input.length) + foreach(dchar orig; input) { + // TODO Conditional Case Mapping + UnicodeData **d = (orig in unicodeData); + if(d !is null && ((*d).generalCategory & UnicodeData.GeneralCategory.SpecialMapping)) { + SpecialCaseData **s = (orig in specialCaseData); + debug { + assert(s !is null); + } + if((*s).upperCaseMapping !is null) { + // Better resize strategy ??? + if(produced + (*s).upperCaseMapping.length > output.length) + output.length = output.length + output.length / 2 + (*s).upperCaseMapping.length; + foreach(ch; (*s).upperCaseMapping) { + output[produced++] = ch; + } + } + continue; + } + if(produced >= output.length) + output.length = output.length + output.length / 2; + output[produced++] = d is null ? orig:(*d).simpleUpperCaseMapping; + } + return output[0..produced]; +} + + +/** + * Converts an Utf8 String to Lower case + * + * Params: + * input = String to be case mapped + * output = this output buffer will be used unless too small + * Returns: the case mapped string + */ +char[] toLower(char[] input, char[] output = null) { + + dchar[1] buf; + // assume most common case: String stays the same length + if (output.length < input.length) + output.length = input.length; + + uint produced = 0; + uint ate; + foreach(dchar ch; input) { + // TODO Conditional Case Mapping + UnicodeData **d = (ch in unicodeData); + if(d !is null && ((*d).generalCategory & UnicodeData.GeneralCategory.SpecialMapping)) { + SpecialCaseData **s = (ch in specialCaseData); + debug { + assert(s !is null); + } + if((*s).lowerCaseMapping !is null) { + // To speed up, use worst case for memory prealocation + // since the length of an LowerCaseMapping list is at most 4 + // Make sure no relocation is made in the toString Method + // better allocation algorithm ? + if(produced + (*s).lowerCaseMapping.length * 4 >= output.length) + output.length = output.length + output.length / 2 + (*s).lowerCaseMapping.length * 4; + char[] res = toString((*s).lowerCaseMapping, output[produced..output.length], &ate); + debug { + assert(ate == (*s).lowerCaseMapping.length); + assert(res.ptr == output[produced..output.length].ptr); + } + produced += res.length; + continue; + } + } + // Make sure no relocation is made in the toString Method + if(produced + 4 >= output.length) + output.length = output.length + output.length / 2 + 4; + buf[0] = d is null ? ch:(*d).simpleLowerCaseMapping; + char[] res = toString(buf, output[produced..output.length], &ate); + debug { + assert(ate == 1); + assert(res.ptr == output[produced..output.length].ptr); + } + produced += res.length; + } + return output[0..produced]; +} + + +/** + * Converts an Utf16 String to Lower case + * + * Params: + * input = String to be case mapped + * output = this output buffer will be used unless too small + * Returns: the case mapped string + */ +wchar[] toLower(wchar[] input, wchar[] output = null) { + + dchar[1] buf; + // assume most common case: String stays the same length + if (output.length < input.length) + output.length = input.length; + + uint produced = 0; + uint ate; + foreach(dchar ch; input) { + // TODO Conditional Case Mapping + UnicodeData **d = (ch in unicodeData); + if(d !is null && ((*d).generalCategory & UnicodeData.GeneralCategory.SpecialMapping)) { + SpecialCaseData **s = (ch in specialCaseData); + debug { + assert(s !is null); + } + if((*s).lowerCaseMapping !is null) { + // To speed up, use worst case for memory prealocation + // Make sure no relocation is made in the toString16 Method + // better allocation algorithm ? + if(produced + (*s).lowerCaseMapping.length * 2 >= output.length) + output.length = output.length + output.length / 2 + (*s).lowerCaseMapping.length * 3; + wchar[] res = toString16((*s).lowerCaseMapping, output[produced..output.length], &ate); + debug { + assert(ate == (*s).lowerCaseMapping.length); + assert(res.ptr == output[produced..output.length].ptr); + } + produced += res.length; + continue; + } + } + // Make sure no relocation is made in the toString16 Method + if(produced + 4 >= output.length) + output.length = output.length + output.length / 2 + 3; + buf[0] = d is null ? ch:(*d).simpleLowerCaseMapping; + wchar[] res = toString16(buf, output[produced..output.length], &ate); + debug { + assert(ate == 1); + assert(res.ptr == output[produced..output.length].ptr); + } + produced += res.length; + } + return output[0..produced]; +} + + +/** + * Converts an Utf32 String to Lower case + * + * Params: + * input = String to be case mapped + * output = this output buffer will be used unless too small + * Returns: the case mapped string + */ +dchar[] toLower(dchar[] input, dchar[] output = null) { + + // assume most common case: String stays the same length + if (input.length > output.length) + output.length = input.length; + + uint produced = 0; + if (input.length) + foreach(dchar orig; input) { + // TODO Conditional Case Mapping + UnicodeData **d = (orig in unicodeData); + if(d !is null && ((*d).generalCategory & UnicodeData.GeneralCategory.SpecialMapping)) { + SpecialCaseData **s = (orig in specialCaseData); + debug { + assert(s !is null); + } + if((*s).lowerCaseMapping !is null) { + // Better resize strategy ??? + if(produced + (*s).lowerCaseMapping.length > output.length) + output.length = output.length + output.length / 2 + (*s).lowerCaseMapping.length; + foreach(ch; (*s).lowerCaseMapping) { + output[produced++] = ch; + } + } + continue; + } + if(produced >= output.length) + output.length = output.length + output.length / 2; + output[produced++] = d is null ? orig:(*d).simpleLowerCaseMapping; + } + return output[0..produced]; +} + +/** + * Converts an Utf8 String to Folding case + * Folding case is used for case insensitive comparsions. + * + * Params: + * input = String to be case mapped + * output = this output buffer will be used unless too small + * Returns: the case mapped string + */ +char[] toFold(char[] input, char[] output = null) { + + dchar[1] buf; + // assume most common case: String stays the same length + if (output.length < input.length) + output.length = input.length; + + uint produced = 0; + uint ate; + foreach(dchar ch; input) { + FoldingCaseData **s = (ch in foldingCaseData); + if(s !is null) { + // To speed up, use worst case for memory prealocation + // since the length of an UpperCaseMapping list is at most 4 + // Make sure no relocation is made in the toString Method + // better allocation algorithm ? + if(produced + (*s).mapping.length * 4 >= output.length) + output.length = output.length + output.length / 2 + (*s).mapping.length * 4; + char[] res = toString((*s).mapping, output[produced..output.length], &ate); + debug { + assert(ate == (*s).mapping.length); + assert(res.ptr == output[produced..output.length].ptr); + } + produced += res.length; + continue; + } + // Make sure no relocation is made in the toString Method + if(produced + 4 >= output.length) + output.length = output.length + output.length / 2 + 4; + buf[0] = ch; + char[] res = toString(buf, output[produced..output.length], &ate); + debug { + assert(ate == 1); + assert(res.ptr == output[produced..output.length].ptr); + } + produced += res.length; + } + return output[0..produced]; +} + +/** + * Converts an Utf16 String to Folding case + * Folding case is used for case insensitive comparsions. + * + * Params: + * input = String to be case mapped + * output = this output buffer will be used unless too small + * Returns: the case mapped string + */ +wchar[] toFold(wchar[] input, wchar[] output = null) { + + dchar[1] buf; + // assume most common case: String stays the same length + if (output.length < input.length) + output.length = input.length; + + uint produced = 0; + uint ate; + foreach(dchar ch; input) { + FoldingCaseData **s = (ch in foldingCaseData); + if(s !is null) { + // To speed up, use worst case for memory prealocation + // Make sure no relocation is made in the toString16 Method + // better allocation algorithm ? + if(produced + (*s).mapping.length * 2 >= output.length) + output.length = output.length + output.length / 2 + (*s).mapping.length * 3; + wchar[] res = toString16((*s).mapping, output[produced..output.length], &ate); + debug { + assert(ate == (*s).mapping.length); + assert(res.ptr == output[produced..output.length].ptr); + } + produced += res.length; + continue; + } + // Make sure no relocation is made in the toString16 Method + if(produced + 4 >= output.length) + output.length = output.length + output.length / 2 + 3; + buf[0] = ch; + wchar[] res = toString16(buf, output[produced..output.length], &ate); + debug { + assert(ate == 1); + assert(res.ptr == output[produced..output.length].ptr); + } + produced += res.length; + } + return output[0..produced]; +} + +/** + * Converts an Utf32 String to Folding case + * Folding case is used for case insensitive comparsions. + * + * Params: + * input = String to be case mapped + * output = this output buffer will be used unless too small + * Returns: the case mapped string + */ +dchar[] toFold(dchar[] input, dchar[] output = null) { + + // assume most common case: String stays the same length + if (input.length > output.length) + output.length = input.length; + + uint produced = 0; + if (input.length) + foreach(dchar orig; input) { + FoldingCaseData **d = (orig in foldingCaseData); + if(d !is null ) { + // Better resize strategy ??? + if(produced + (*d).mapping.length > output.length) + output.length = output.length + output.length / 2 + (*d).mapping.length; + foreach(ch; (*d).mapping) { + output[produced++] = ch; + } + continue; + } + if(produced >= output.length) + output.length = output.length + output.length / 2; + output[produced++] = orig; + } + return output[0..produced]; +} + + +/** + * Determines if a character is a digit. It returns true for decimal + * digits only. + * + * Params: + * ch = the character to be inspected + */ +bool isDigit(dchar ch) { + UnicodeData **d = (ch in unicodeData); + return (d !is null) && ((*d).generalCategory & UnicodeData.GeneralCategory.Nd); +} + + +/** + * Determines if a character is a letter. + * + * Params: + * ch = the character to be inspected + */ +bool isLetter(int ch) { + UnicodeData **d = (ch in unicodeData); + return (d !is null) && ((*d).generalCategory & + ( UnicodeData.GeneralCategory.Lu + | UnicodeData.GeneralCategory.Ll + | UnicodeData.GeneralCategory.Lt + | UnicodeData.GeneralCategory.Lm + | UnicodeData.GeneralCategory.Lo)); +} + +/** + * Determines if a character is a letter or a + * decimal digit. + * + * Params: + * ch = the character to be inspected + */ +bool isLetterOrDigit(int ch) { + UnicodeData **d = (ch in unicodeData); + return (d !is null) && ((*d).generalCategory & + ( UnicodeData.GeneralCategory.Lu + | UnicodeData.GeneralCategory.Ll + | UnicodeData.GeneralCategory.Lt + | UnicodeData.GeneralCategory.Lm + | UnicodeData.GeneralCategory.Lo + | UnicodeData.GeneralCategory.Nd)); +} + +/** + * Determines if a character is a lower case letter. + * Params: + * ch = the character to be inspected + */ +bool isLower(dchar ch) { + UnicodeData **d = (ch in unicodeData); + return (d !is null) && ((*d).generalCategory & UnicodeData.GeneralCategory.Ll); +} + +/** + * Determines if a character is a title case letter. + * In case of combined letters, only the first is upper and the second is lower. + * Some of these special characters can be found in the croatian and greek language. + * See_Also: http://en.wikipedia.org/wiki/Capitalization + * Params: + * ch = the character to be inspected + */ +bool isTitle(dchar ch) { + UnicodeData **d = (ch in unicodeData); + return (d !is null) && ((*d).generalCategory & UnicodeData.GeneralCategory.Lt); +} + +/** + * Determines if a character is a upper case letter. + * Params: + * ch = the character to be inspected + */ +bool isUpper(dchar ch) { + UnicodeData **d = (ch in unicodeData); + return (d !is null) && ((*d).generalCategory & UnicodeData.GeneralCategory.Lu); +} + +/** + * Determines if a character is a Whitespace character. + * Whitespace characters are characters in the + * General Catetories Zs, Zl, Zp without the No Break + * spaces plus the control characters out of the ASCII + * range, that are used as spaces: + * TAB VT LF FF CR FS GS RS US NL + * + * WARNING: look at isSpace, maybe that function does + * more what you expect. + * + * Params: + * ch = the character to be inspected + */ +bool isWhitespace(dchar ch) { + if((ch >= 0x0009 && ch <= 0x000D) || (ch >= 0x001C && ch <= 0x001F)) + return true; + UnicodeData **d = (ch in unicodeData); + return (d !is null) && ((*d).generalCategory & + ( UnicodeData.GeneralCategory.Zs + | UnicodeData.GeneralCategory.Zl + | UnicodeData.GeneralCategory.Zp)) + && ch != 0x00A0 // NBSP + && ch != 0x202F // NARROW NBSP + && ch != 0xFEFF; // ZERO WIDTH NBSP +} + +/** + * Detemines if a character is a Space character as + * specified in the Unicode Standart. + * + * WARNING: look at isWhitepace, maybe that function does + * more what you expect. + * + * Params: + * ch = the character to be inspected + */ +bool isSpace(dchar ch) { + UnicodeData **d = (ch in unicodeData); + return (d !is null) && ((*d).generalCategory & + ( UnicodeData.GeneralCategory.Zs + | UnicodeData.GeneralCategory.Zl + | UnicodeData.GeneralCategory.Zp)); +} + + +/** + * Detemines if a character is a printable character as + * specified in the Unicode Standart. + * + * + * WARNING: look at isWhitepace, maybe that function does + * more what you expect. + * + * Params: + * ch = the character to be inspected + */ +bool isPrintable(dchar ch) { + UnicodeData **d = (ch in unicodeData); + return (d !is null) && ((*d).generalCategory & + ( UnicodeData.GeneralCategory.Cn + | UnicodeData.GeneralCategory.Cc + | UnicodeData.GeneralCategory.Cf + | UnicodeData.GeneralCategory.Co + | UnicodeData.GeneralCategory.Cs)); +} + +debug ( UnicodeTest ): + void main() {} + +debug (UnitTest) { + +unittest { + + + // 1) No Buffer passed, no resize, no SpecialCase + + char[] testString1utf8 = "\u00E4\u00F6\u00FC"; + wchar[] testString1utf16 = "\u00E4\u00F6\u00FC"; + dchar[] testString1utf32 = "\u00E4\u00F6\u00FC"; + char[] refString1utf8 = "\u00C4\u00D6\u00DC"; + wchar[] refString1utf16 = "\u00C4\u00D6\u00DC"; + dchar[] refString1utf32 = "\u00C4\u00D6\u00DC"; + char[] resultString1utf8 = toUpper(testString1utf8); + assert(resultString1utf8 == refString1utf8); + wchar[] resultString1utf16 = toUpper(testString1utf16); + assert(resultString1utf16 == refString1utf16); + dchar[] resultString1utf32 = toUpper(testString1utf32); + assert(resultString1utf32 == refString1utf32); + + // 2) Buffer passed, no resize, no SpecialCase + char[60] buffer1utf8; + wchar[30] buffer1utf16; + dchar[30] buffer1utf32; + resultString1utf8 = toUpper(testString1utf8,buffer1utf8); + assert(resultString1utf8.ptr == buffer1utf8.ptr); + assert(resultString1utf8 == refString1utf8); + resultString1utf16 = toUpper(testString1utf16,buffer1utf16); + assert(resultString1utf16.ptr == buffer1utf16.ptr); + assert(resultString1utf16 == refString1utf16); + resultString1utf32 = toUpper(testString1utf32,buffer1utf32); + assert(resultString1utf32.ptr == buffer1utf32.ptr); + assert(resultString1utf32 == refString1utf32); + + // 3/ Buffer passed, resize necessary, no Special case + + char[5] buffer2utf8; + wchar[2] buffer2utf16; + dchar[2] buffer2utf32; + resultString1utf8 = toUpper(testString1utf8,buffer2utf8); + assert(resultString1utf8.ptr != buffer2utf8.ptr); + assert(resultString1utf8 == refString1utf8); + resultString1utf16 = toUpper(testString1utf16,buffer2utf16); + assert(resultString1utf16.ptr != buffer2utf16.ptr); + assert(resultString1utf16 == refString1utf16); + resultString1utf32 = toUpper(testString1utf32,buffer2utf32); + assert(resultString1utf32.ptr != buffer2utf32.ptr); + assert(resultString1utf32 == refString1utf32); + + // 4) Buffer passed, resize necessary, extensive SpecialCase + + + char[] testString2utf8 = "\uFB03\uFB04\uFB05"; + wchar[] testString2utf16 = "\uFB03\uFB04\uFB05"; + dchar[] testString2utf32 = "\uFB03\uFB04\uFB05"; + char[] refString2utf8 = "\u0046\u0046\u0049\u0046\u0046\u004C\u0053\u0054"; + wchar[] refString2utf16 = "\u0046\u0046\u0049\u0046\u0046\u004C\u0053\u0054"; + dchar[] refString2utf32 = "\u0046\u0046\u0049\u0046\u0046\u004C\u0053\u0054"; + resultString1utf8 = toUpper(testString2utf8,buffer2utf8); + assert(resultString1utf8.ptr != buffer2utf8.ptr); + assert(resultString1utf8 == refString2utf8); + resultString1utf16 = toUpper(testString2utf16,buffer2utf16); + assert(resultString1utf16.ptr != buffer2utf16.ptr); + assert(resultString1utf16 == refString2utf16); + resultString1utf32 = toUpper(testString2utf32,buffer2utf32); + assert(resultString1utf32.ptr != buffer2utf32.ptr); + assert(resultString1utf32 == refString2utf32); + +} + + +unittest { + + + // 1) No Buffer passed, no resize, no SpecialCase + + char[] testString1utf8 = "\u00C4\u00D6\u00DC"; + wchar[] testString1utf16 = "\u00C4\u00D6\u00DC"; + dchar[] testString1utf32 = "\u00C4\u00D6\u00DC"; + char[] refString1utf8 = "\u00E4\u00F6\u00FC"; + wchar[] refString1utf16 = "\u00E4\u00F6\u00FC"; + dchar[] refString1utf32 = "\u00E4\u00F6\u00FC"; + char[] resultString1utf8 = toLower(testString1utf8); + assert(resultString1utf8 == refString1utf8); + wchar[] resultString1utf16 = toLower(testString1utf16); + assert(resultString1utf16 == refString1utf16); + dchar[] resultString1utf32 = toLower(testString1utf32); + assert(resultString1utf32 == refString1utf32); + + // 2) Buffer passed, no resize, no SpecialCase + char[60] buffer1utf8; + wchar[30] buffer1utf16; + dchar[30] buffer1utf32; + resultString1utf8 = toLower(testString1utf8,buffer1utf8); + assert(resultString1utf8.ptr == buffer1utf8.ptr); + assert(resultString1utf8 == refString1utf8); + resultString1utf16 = toLower(testString1utf16,buffer1utf16); + assert(resultString1utf16.ptr == buffer1utf16.ptr); + assert(resultString1utf16 == refString1utf16); + resultString1utf32 = toLower(testString1utf32,buffer1utf32); + assert(resultString1utf32.ptr == buffer1utf32.ptr); + assert(resultString1utf32 == refString1utf32); + + // 3/ Buffer passed, resize necessary, no Special case + + char[5] buffer2utf8; + wchar[2] buffer2utf16; + dchar[2] buffer2utf32; + resultString1utf8 = toLower(testString1utf8,buffer2utf8); + assert(resultString1utf8.ptr != buffer2utf8.ptr); + assert(resultString1utf8 == refString1utf8); + resultString1utf16 = toLower(testString1utf16,buffer2utf16); + assert(resultString1utf16.ptr != buffer2utf16.ptr); + assert(resultString1utf16 == refString1utf16); + resultString1utf32 = toLower(testString1utf32,buffer2utf32); + assert(resultString1utf32.ptr != buffer2utf32.ptr); + assert(resultString1utf32 == refString1utf32); + + // 4) Buffer passed, resize necessary, extensive SpecialCase + + char[] testString2utf8 = "\u0130\u0130\u0130"; + wchar[] testString2utf16 = "\u0130\u0130\u0130"; + dchar[] testString2utf32 = "\u0130\u0130\u0130"; + char[] refString2utf8 = "\u0069\u0307\u0069\u0307\u0069\u0307"; + wchar[] refString2utf16 = "\u0069\u0307\u0069\u0307\u0069\u0307"; + dchar[] refString2utf32 = "\u0069\u0307\u0069\u0307\u0069\u0307"; + resultString1utf8 = toLower(testString2utf8,buffer2utf8); + assert(resultString1utf8.ptr != buffer2utf8.ptr); + assert(resultString1utf8 == refString2utf8); + resultString1utf16 = toLower(testString2utf16,buffer2utf16); + assert(resultString1utf16.ptr != buffer2utf16.ptr); + assert(resultString1utf16 == refString2utf16); + resultString1utf32 = toLower(testString2utf32,buffer2utf32); + assert(resultString1utf32.ptr != buffer2utf32.ptr); + assert(resultString1utf32 == refString2utf32); +} + +unittest { + char[] testString1utf8 = "?!Mädchen \u0390\u0390,;"; + char[] testString2utf8 = "?!MÄDCHEN \u03B9\u0308\u0301\u03B9\u0308\u0301,;"; + assert(toFold(testString1utf8) == toFold(testString2utf8)); + wchar[] testString1utf16 = "?!Mädchen \u0390\u0390,;";; + wchar[] testString2utf16 = "?!MÄDCHEN \u03B9\u0308\u0301\u03B9\u0308\u0301,;"; + assert(toFold(testString1utf16) == toFold(testString2utf16)); + wchar[] testString1utf32 = "?!Mädchen \u0390\u0390,;"; + wchar[] testString2utf32 = "?!MÄDCHEN \u03B9\u0308\u0301\u03B9\u0308\u0301,;"; + assert(toFold(testString1utf32) == toFold(testString2utf32)); +} + +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/text/UnicodeData.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/text/UnicodeData.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,111183 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Peter Triller. All rights reserved + + license: BSD style: 513 545 544 513 0LICENSE) + + version: Initial release: Sept 2007 + + authors: Peter + + Contains the Unicode Data files converted to structs and simple + accessor functions. This file is generated by a Perl script. All + necessary changes should be made in the script, not in this file. + +*******************************************************************************/ + +module tango.text.UnicodeData; + +struct UnicodeData { + + enum GeneralCategory { + Lu = 1, // Letter, Uppercase + Ll = 1 << 1, // Letter, Lowercase + Lt = 1 << 2, // Letter, Titlecase + Lm = 1 << 3, // Letter, Modifier + Lo = 1 << 4, // Letter, Other + Mn = 1 << 5, // Mark, Nonspacing + Mc = 1 << 6, // Mark, Spacing Combining + Me = 1 << 7, // Mark, Enclosing + Nd = 1 << 8, // Number, Decimal Digit + Nl = 1 << 9, // Number, Letter + No = 1 << 10, // Number, Other + Pc = 1 << 11, // Punctuation, Connector + Pd = 1 << 12, // Punctuation, Dash + Ps = 1 << 13, // Punctuation, Open + Pe = 1 << 14, // Punctuation, Close + Pi = 1 << 15, // Punctuation, Initial quote (may behave like Ps or Pe depending on usage) + Pf = 1 << 16, // Punctuation, Final quote (may behave like Ps or Pe depending on usage) + Po = 1 << 17, // Punctuation, Other + Sm = 1 << 18, // Symbol, Math + Sc = 1 << 19, // Symbol, Currency + Sk = 1 << 20, // Symbol, Modifier + So = 1 << 21, // Symbol, Other + Zs = 1 << 22, // Separator, Space + Zl = 1 << 23, // Separator, Line + Zp = 1 << 24, // Separator, Paragraph + Cc = 1 << 25, // Other, Control + Cf = 1 << 26, // Other, Format + Cs = 1 << 27, // Other, Surrogate + Co = 1 << 28, // Other, Private Use + Cn = 1 << 29, // Other, Not Assigned (no characters in the file have this property) + SpecialMapping = 1 << 30 // Special Bit for detection of specialMappings + } + + + enum BidiClass { + L, // Left-to-Right + LRE, // Left-to-Right Embedding + LRO, // Left-to-Right Override + R, // Right-to-Left + AL, // Right-to-Left Arabic + RLE, // Right-to-Left Embedding + RLO, // Right-to-Left Override + PDF, // Pop Directional Format + EN, // European Number + ES, // European Number Separator + ET, // European Number Terminator + AN, // Arabic Number + CS, // Common Number Separator + NSM, // Non-Spacing Mark + BN, // Boundary Neutral + B, // Paragraph Separator + S, // Segment Separator + WS, // Whitespace + ON // Other Neutrals + } + + enum DecompositionType { + None, // Custom type signaling no Decomposition + Font, // A font variant (e.g. a blackletter form). + NoBreak, // A no-break version of a space or hyphen. + Initial, // An initial presentation form (Arabic). + Medial, // A medial presentation form (Arabic). + Final, // A final presentation form (Arabic). + Isolated, // An isolated presentation form (Arabic). + Circle, // An encircled form. + Super, // A superscript form. + Sub, // A subscript form. + Vertical, // A vertical layout presentation form. + Wide, // A wide (or zenkaku) compatibility character. + Narrow, // A narrow (or hankaku) compatibility character. + Small, // A small variant form (CNS compatibility). + Square, // A CJK squared font variant. + Fraction, // A vulgar fraction form. + Compat // Otherwise unspecified compatibility character. + } + + enum BidiMirrored { + Y, // Yes + N // No + } + + dchar code; + +// char[] name; + + GeneralCategory generalCategory; + +// short canonicalCombiningClass; + + //TODO the defaults are not yet set correctly + +// BidiClass bidiClass; + + //TODO end + +// DecompositionType decompositionType; + +// dchar[] decompositionMapping; + + + // TODO Check handling + +// int numeric_1; + +// int numeric_2; + +// double numeric_3; + + // TODO end + +// BidiMirrored bidiMirrored; + +// char[] unicode1Name; + +// char [] isoComment; + + dchar simpleUpperCaseMapping; + + dchar simpleLowerCaseMapping; + + dchar simpleTitleCaseMapping; + +} + +struct SpecialCaseData { + + dchar code; + + dchar[] upperCaseMapping; + + dchar[] lowerCaseMapping; + + dchar[] titleCaseMapping; + +} + +struct FoldingCaseData { + + dchar code; + + dchar[] mapping; + +} + +UnicodeData *unicodeData[dchar]; + +SpecialCaseData *specialCaseData[dchar]; + +FoldingCaseData *foldingCaseData[dchar]; + +private { + UnicodeData internalUnicodeData[] = [ + { code:0x0000 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0000 + ,simpleLowerCaseMapping:0x0000 + ,simpleTitleCaseMapping:0x0000 + }, + { code:0x0001 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0001 + ,simpleLowerCaseMapping:0x0001 + ,simpleTitleCaseMapping:0x0001 + }, + { code:0x0002 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0002 + ,simpleLowerCaseMapping:0x0002 + ,simpleTitleCaseMapping:0x0002 + }, + { code:0x0003 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0003 + ,simpleLowerCaseMapping:0x0003 + ,simpleTitleCaseMapping:0x0003 + }, + { code:0x0004 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0004 + ,simpleLowerCaseMapping:0x0004 + ,simpleTitleCaseMapping:0x0004 + }, + { code:0x0005 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0005 + ,simpleLowerCaseMapping:0x0005 + ,simpleTitleCaseMapping:0x0005 + }, + { code:0x0006 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0006 + ,simpleLowerCaseMapping:0x0006 + ,simpleTitleCaseMapping:0x0006 + }, + { code:0x0007 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0007 + ,simpleLowerCaseMapping:0x0007 + ,simpleTitleCaseMapping:0x0007 + }, + { code:0x0008 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0008 + ,simpleLowerCaseMapping:0x0008 + ,simpleTitleCaseMapping:0x0008 + }, + { code:0x0009 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0009 + ,simpleLowerCaseMapping:0x0009 + ,simpleTitleCaseMapping:0x0009 + }, + { code:0x000A + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x000A + ,simpleLowerCaseMapping:0x000A + ,simpleTitleCaseMapping:0x000A + }, + { code:0x000B + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x000B + ,simpleLowerCaseMapping:0x000B + ,simpleTitleCaseMapping:0x000B + }, + { code:0x000C + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x000C + ,simpleLowerCaseMapping:0x000C + ,simpleTitleCaseMapping:0x000C + }, + { code:0x000D + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x000D + ,simpleLowerCaseMapping:0x000D + ,simpleTitleCaseMapping:0x000D + }, + { code:0x000E + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x000E + ,simpleLowerCaseMapping:0x000E + ,simpleTitleCaseMapping:0x000E + }, + { code:0x000F + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x000F + ,simpleLowerCaseMapping:0x000F + ,simpleTitleCaseMapping:0x000F + }, + { code:0x0010 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0010 + ,simpleLowerCaseMapping:0x0010 + ,simpleTitleCaseMapping:0x0010 + }, + { code:0x0011 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0011 + ,simpleLowerCaseMapping:0x0011 + ,simpleTitleCaseMapping:0x0011 + }, + { code:0x0012 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0012 + ,simpleLowerCaseMapping:0x0012 + ,simpleTitleCaseMapping:0x0012 + }, + { code:0x0013 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0013 + ,simpleLowerCaseMapping:0x0013 + ,simpleTitleCaseMapping:0x0013 + }, + { code:0x0014 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0014 + ,simpleLowerCaseMapping:0x0014 + ,simpleTitleCaseMapping:0x0014 + }, + { code:0x0015 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0015 + ,simpleLowerCaseMapping:0x0015 + ,simpleTitleCaseMapping:0x0015 + }, + { code:0x0016 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0016 + ,simpleLowerCaseMapping:0x0016 + ,simpleTitleCaseMapping:0x0016 + }, + { code:0x0017 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0017 + ,simpleLowerCaseMapping:0x0017 + ,simpleTitleCaseMapping:0x0017 + }, + { code:0x0018 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0018 + ,simpleLowerCaseMapping:0x0018 + ,simpleTitleCaseMapping:0x0018 + }, + { code:0x0019 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0019 + ,simpleLowerCaseMapping:0x0019 + ,simpleTitleCaseMapping:0x0019 + }, + { code:0x001A + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x001A + ,simpleLowerCaseMapping:0x001A + ,simpleTitleCaseMapping:0x001A + }, + { code:0x001B + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x001B + ,simpleLowerCaseMapping:0x001B + ,simpleTitleCaseMapping:0x001B + }, + { code:0x001C + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x001C + ,simpleLowerCaseMapping:0x001C + ,simpleTitleCaseMapping:0x001C + }, + { code:0x001D + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x001D + ,simpleLowerCaseMapping:0x001D + ,simpleTitleCaseMapping:0x001D + }, + { code:0x001E + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x001E + ,simpleLowerCaseMapping:0x001E + ,simpleTitleCaseMapping:0x001E + }, + { code:0x001F + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x001F + ,simpleLowerCaseMapping:0x001F + ,simpleTitleCaseMapping:0x001F + }, + { code:0x0020 + ,generalCategory:UnicodeData.GeneralCategory.Zs + ,simpleUpperCaseMapping:0x0020 + ,simpleLowerCaseMapping:0x0020 + ,simpleTitleCaseMapping:0x0020 + }, + { code:0x0021 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0021 + ,simpleLowerCaseMapping:0x0021 + ,simpleTitleCaseMapping:0x0021 + }, + { code:0x0022 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0022 + ,simpleLowerCaseMapping:0x0022 + ,simpleTitleCaseMapping:0x0022 + }, + { code:0x0023 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0023 + ,simpleLowerCaseMapping:0x0023 + ,simpleTitleCaseMapping:0x0023 + }, + { code:0x0024 + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0x0024 + ,simpleLowerCaseMapping:0x0024 + ,simpleTitleCaseMapping:0x0024 + }, + { code:0x0025 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0025 + ,simpleLowerCaseMapping:0x0025 + ,simpleTitleCaseMapping:0x0025 + }, + { code:0x0026 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0026 + ,simpleLowerCaseMapping:0x0026 + ,simpleTitleCaseMapping:0x0026 + }, + { code:0x0027 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0027 + ,simpleLowerCaseMapping:0x0027 + ,simpleTitleCaseMapping:0x0027 + }, + { code:0x0028 + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x0028 + ,simpleLowerCaseMapping:0x0028 + ,simpleTitleCaseMapping:0x0028 + }, + { code:0x0029 + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x0029 + ,simpleLowerCaseMapping:0x0029 + ,simpleTitleCaseMapping:0x0029 + }, + { code:0x002A + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x002A + ,simpleLowerCaseMapping:0x002A + ,simpleTitleCaseMapping:0x002A + }, + { code:0x002B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x002B + ,simpleLowerCaseMapping:0x002B + ,simpleTitleCaseMapping:0x002B + }, + { code:0x002C + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x002C + ,simpleLowerCaseMapping:0x002C + ,simpleTitleCaseMapping:0x002C + }, + { code:0x002D + ,generalCategory:UnicodeData.GeneralCategory.Pd + ,simpleUpperCaseMapping:0x002D + ,simpleLowerCaseMapping:0x002D + ,simpleTitleCaseMapping:0x002D + }, + { code:0x002E + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x002E + ,simpleLowerCaseMapping:0x002E + ,simpleTitleCaseMapping:0x002E + }, + { code:0x002F + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x002F + ,simpleLowerCaseMapping:0x002F + ,simpleTitleCaseMapping:0x002F + }, + { code:0x0030 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0030 + ,simpleLowerCaseMapping:0x0030 + ,simpleTitleCaseMapping:0x0030 + }, + { code:0x0031 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0031 + ,simpleLowerCaseMapping:0x0031 + ,simpleTitleCaseMapping:0x0031 + }, + { code:0x0032 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0032 + ,simpleLowerCaseMapping:0x0032 + ,simpleTitleCaseMapping:0x0032 + }, + { code:0x0033 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0033 + ,simpleLowerCaseMapping:0x0033 + ,simpleTitleCaseMapping:0x0033 + }, + { code:0x0034 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0034 + ,simpleLowerCaseMapping:0x0034 + ,simpleTitleCaseMapping:0x0034 + }, + { code:0x0035 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0035 + ,simpleLowerCaseMapping:0x0035 + ,simpleTitleCaseMapping:0x0035 + }, + { code:0x0036 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0036 + ,simpleLowerCaseMapping:0x0036 + ,simpleTitleCaseMapping:0x0036 + }, + { code:0x0037 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0037 + ,simpleLowerCaseMapping:0x0037 + ,simpleTitleCaseMapping:0x0037 + }, + { code:0x0038 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0038 + ,simpleLowerCaseMapping:0x0038 + ,simpleTitleCaseMapping:0x0038 + }, + { code:0x0039 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0039 + ,simpleLowerCaseMapping:0x0039 + ,simpleTitleCaseMapping:0x0039 + }, + { code:0x003A + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x003A + ,simpleLowerCaseMapping:0x003A + ,simpleTitleCaseMapping:0x003A + }, + { code:0x003B + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x003B + ,simpleLowerCaseMapping:0x003B + ,simpleTitleCaseMapping:0x003B + }, + { code:0x003C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x003C + ,simpleLowerCaseMapping:0x003C + ,simpleTitleCaseMapping:0x003C + }, + { code:0x003D + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x003D + ,simpleLowerCaseMapping:0x003D + ,simpleTitleCaseMapping:0x003D + }, + { code:0x003E + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x003E + ,simpleLowerCaseMapping:0x003E + ,simpleTitleCaseMapping:0x003E + }, + { code:0x003F + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x003F + ,simpleLowerCaseMapping:0x003F + ,simpleTitleCaseMapping:0x003F + }, + { code:0x0040 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0040 + ,simpleLowerCaseMapping:0x0040 + ,simpleTitleCaseMapping:0x0040 + }, + { code:0x0041 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0041 + ,simpleLowerCaseMapping:0x0061 + ,simpleTitleCaseMapping:0x0041 + }, + { code:0x0042 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0042 + ,simpleLowerCaseMapping:0x0062 + ,simpleTitleCaseMapping:0x0042 + }, + { code:0x0043 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0043 + ,simpleLowerCaseMapping:0x0063 + ,simpleTitleCaseMapping:0x0043 + }, + { code:0x0044 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0044 + ,simpleLowerCaseMapping:0x0064 + ,simpleTitleCaseMapping:0x0044 + }, + { code:0x0045 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0045 + ,simpleLowerCaseMapping:0x0065 + ,simpleTitleCaseMapping:0x0045 + }, + { code:0x0046 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0046 + ,simpleLowerCaseMapping:0x0066 + ,simpleTitleCaseMapping:0x0046 + }, + { code:0x0047 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0047 + ,simpleLowerCaseMapping:0x0067 + ,simpleTitleCaseMapping:0x0047 + }, + { code:0x0048 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0048 + ,simpleLowerCaseMapping:0x0068 + ,simpleTitleCaseMapping:0x0048 + }, + { code:0x0049 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0049 + ,simpleLowerCaseMapping:0x0069 + ,simpleTitleCaseMapping:0x0049 + }, + { code:0x004A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x004A + ,simpleLowerCaseMapping:0x006A + ,simpleTitleCaseMapping:0x004A + }, + { code:0x004B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x004B + ,simpleLowerCaseMapping:0x006B + ,simpleTitleCaseMapping:0x004B + }, + { code:0x004C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x004C + ,simpleLowerCaseMapping:0x006C + ,simpleTitleCaseMapping:0x004C + }, + { code:0x004D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x004D + ,simpleLowerCaseMapping:0x006D + ,simpleTitleCaseMapping:0x004D + }, + { code:0x004E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x004E + ,simpleLowerCaseMapping:0x006E + ,simpleTitleCaseMapping:0x004E + }, + { code:0x004F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x004F + ,simpleLowerCaseMapping:0x006F + ,simpleTitleCaseMapping:0x004F + }, + { code:0x0050 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0050 + ,simpleLowerCaseMapping:0x0070 + ,simpleTitleCaseMapping:0x0050 + }, + { code:0x0051 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0051 + ,simpleLowerCaseMapping:0x0071 + ,simpleTitleCaseMapping:0x0051 + }, + { code:0x0052 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0052 + ,simpleLowerCaseMapping:0x0072 + ,simpleTitleCaseMapping:0x0052 + }, + { code:0x0053 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0053 + ,simpleLowerCaseMapping:0x0073 + ,simpleTitleCaseMapping:0x0053 + }, + { code:0x0054 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0054 + ,simpleLowerCaseMapping:0x0074 + ,simpleTitleCaseMapping:0x0054 + }, + { code:0x0055 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0055 + ,simpleLowerCaseMapping:0x0075 + ,simpleTitleCaseMapping:0x0055 + }, + { code:0x0056 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0056 + ,simpleLowerCaseMapping:0x0076 + ,simpleTitleCaseMapping:0x0056 + }, + { code:0x0057 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0057 + ,simpleLowerCaseMapping:0x0077 + ,simpleTitleCaseMapping:0x0057 + }, + { code:0x0058 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0058 + ,simpleLowerCaseMapping:0x0078 + ,simpleTitleCaseMapping:0x0058 + }, + { code:0x0059 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0059 + ,simpleLowerCaseMapping:0x0079 + ,simpleTitleCaseMapping:0x0059 + }, + { code:0x005A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x005A + ,simpleLowerCaseMapping:0x007A + ,simpleTitleCaseMapping:0x005A + }, + { code:0x005B + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x005B + ,simpleLowerCaseMapping:0x005B + ,simpleTitleCaseMapping:0x005B + }, + { code:0x005C + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x005C + ,simpleLowerCaseMapping:0x005C + ,simpleTitleCaseMapping:0x005C + }, + { code:0x005D + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x005D + ,simpleLowerCaseMapping:0x005D + ,simpleTitleCaseMapping:0x005D + }, + { code:0x005E + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x005E + ,simpleLowerCaseMapping:0x005E + ,simpleTitleCaseMapping:0x005E + }, + { code:0x005F + ,generalCategory:UnicodeData.GeneralCategory.Pc + ,simpleUpperCaseMapping:0x005F + ,simpleLowerCaseMapping:0x005F + ,simpleTitleCaseMapping:0x005F + }, + { code:0x0060 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x0060 + ,simpleLowerCaseMapping:0x0060 + ,simpleTitleCaseMapping:0x0060 + }, + { code:0x0061 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0041 + ,simpleLowerCaseMapping:0x0061 + ,simpleTitleCaseMapping:0x0041 + }, + { code:0x0062 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0042 + ,simpleLowerCaseMapping:0x0062 + ,simpleTitleCaseMapping:0x0042 + }, + { code:0x0063 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0043 + ,simpleLowerCaseMapping:0x0063 + ,simpleTitleCaseMapping:0x0043 + }, + { code:0x0064 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0044 + ,simpleLowerCaseMapping:0x0064 + ,simpleTitleCaseMapping:0x0044 + }, + { code:0x0065 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0045 + ,simpleLowerCaseMapping:0x0065 + ,simpleTitleCaseMapping:0x0045 + }, + { code:0x0066 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0046 + ,simpleLowerCaseMapping:0x0066 + ,simpleTitleCaseMapping:0x0046 + }, + { code:0x0067 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0047 + ,simpleLowerCaseMapping:0x0067 + ,simpleTitleCaseMapping:0x0047 + }, + { code:0x0068 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0048 + ,simpleLowerCaseMapping:0x0068 + ,simpleTitleCaseMapping:0x0048 + }, + { code:0x0069 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0049 + ,simpleLowerCaseMapping:0x0069 + ,simpleTitleCaseMapping:0x0049 + }, + { code:0x006A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x004A + ,simpleLowerCaseMapping:0x006A + ,simpleTitleCaseMapping:0x004A + }, + { code:0x006B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x004B + ,simpleLowerCaseMapping:0x006B + ,simpleTitleCaseMapping:0x004B + }, + { code:0x006C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x004C + ,simpleLowerCaseMapping:0x006C + ,simpleTitleCaseMapping:0x004C + }, + { code:0x006D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x004D + ,simpleLowerCaseMapping:0x006D + ,simpleTitleCaseMapping:0x004D + }, + { code:0x006E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x004E + ,simpleLowerCaseMapping:0x006E + ,simpleTitleCaseMapping:0x004E + }, + { code:0x006F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x004F + ,simpleLowerCaseMapping:0x006F + ,simpleTitleCaseMapping:0x004F + }, + { code:0x0070 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0050 + ,simpleLowerCaseMapping:0x0070 + ,simpleTitleCaseMapping:0x0050 + }, + { code:0x0071 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0051 + ,simpleLowerCaseMapping:0x0071 + ,simpleTitleCaseMapping:0x0051 + }, + { code:0x0072 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0052 + ,simpleLowerCaseMapping:0x0072 + ,simpleTitleCaseMapping:0x0052 + }, + { code:0x0073 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0053 + ,simpleLowerCaseMapping:0x0073 + ,simpleTitleCaseMapping:0x0053 + }, + { code:0x0074 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0054 + ,simpleLowerCaseMapping:0x0074 + ,simpleTitleCaseMapping:0x0054 + }, + { code:0x0075 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0055 + ,simpleLowerCaseMapping:0x0075 + ,simpleTitleCaseMapping:0x0055 + }, + { code:0x0076 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0056 + ,simpleLowerCaseMapping:0x0076 + ,simpleTitleCaseMapping:0x0056 + }, + { code:0x0077 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0057 + ,simpleLowerCaseMapping:0x0077 + ,simpleTitleCaseMapping:0x0057 + }, + { code:0x0078 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0058 + ,simpleLowerCaseMapping:0x0078 + ,simpleTitleCaseMapping:0x0058 + }, + { code:0x0079 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0059 + ,simpleLowerCaseMapping:0x0079 + ,simpleTitleCaseMapping:0x0059 + }, + { code:0x007A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x005A + ,simpleLowerCaseMapping:0x007A + ,simpleTitleCaseMapping:0x005A + }, + { code:0x007B + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x007B + ,simpleLowerCaseMapping:0x007B + ,simpleTitleCaseMapping:0x007B + }, + { code:0x007C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x007C + ,simpleLowerCaseMapping:0x007C + ,simpleTitleCaseMapping:0x007C + }, + { code:0x007D + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x007D + ,simpleLowerCaseMapping:0x007D + ,simpleTitleCaseMapping:0x007D + }, + { code:0x007E + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x007E + ,simpleLowerCaseMapping:0x007E + ,simpleTitleCaseMapping:0x007E + }, + { code:0x007F + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x007F + ,simpleLowerCaseMapping:0x007F + ,simpleTitleCaseMapping:0x007F + }, + { code:0x0080 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0080 + ,simpleLowerCaseMapping:0x0080 + ,simpleTitleCaseMapping:0x0080 + }, + { code:0x0081 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0081 + ,simpleLowerCaseMapping:0x0081 + ,simpleTitleCaseMapping:0x0081 + }, + { code:0x0082 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0082 + ,simpleLowerCaseMapping:0x0082 + ,simpleTitleCaseMapping:0x0082 + }, + { code:0x0083 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0083 + ,simpleLowerCaseMapping:0x0083 + ,simpleTitleCaseMapping:0x0083 + }, + { code:0x0084 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0084 + ,simpleLowerCaseMapping:0x0084 + ,simpleTitleCaseMapping:0x0084 + }, + { code:0x0085 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0085 + ,simpleLowerCaseMapping:0x0085 + ,simpleTitleCaseMapping:0x0085 + }, + { code:0x0086 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0086 + ,simpleLowerCaseMapping:0x0086 + ,simpleTitleCaseMapping:0x0086 + }, + { code:0x0087 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0087 + ,simpleLowerCaseMapping:0x0087 + ,simpleTitleCaseMapping:0x0087 + }, + { code:0x0088 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0088 + ,simpleLowerCaseMapping:0x0088 + ,simpleTitleCaseMapping:0x0088 + }, + { code:0x0089 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0089 + ,simpleLowerCaseMapping:0x0089 + ,simpleTitleCaseMapping:0x0089 + }, + { code:0x008A + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x008A + ,simpleLowerCaseMapping:0x008A + ,simpleTitleCaseMapping:0x008A + }, + { code:0x008B + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x008B + ,simpleLowerCaseMapping:0x008B + ,simpleTitleCaseMapping:0x008B + }, + { code:0x008C + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x008C + ,simpleLowerCaseMapping:0x008C + ,simpleTitleCaseMapping:0x008C + }, + { code:0x008D + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x008D + ,simpleLowerCaseMapping:0x008D + ,simpleTitleCaseMapping:0x008D + }, + { code:0x008E + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x008E + ,simpleLowerCaseMapping:0x008E + ,simpleTitleCaseMapping:0x008E + }, + { code:0x008F + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x008F + ,simpleLowerCaseMapping:0x008F + ,simpleTitleCaseMapping:0x008F + }, + { code:0x0090 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0090 + ,simpleLowerCaseMapping:0x0090 + ,simpleTitleCaseMapping:0x0090 + }, + { code:0x0091 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0091 + ,simpleLowerCaseMapping:0x0091 + ,simpleTitleCaseMapping:0x0091 + }, + { code:0x0092 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0092 + ,simpleLowerCaseMapping:0x0092 + ,simpleTitleCaseMapping:0x0092 + }, + { code:0x0093 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0093 + ,simpleLowerCaseMapping:0x0093 + ,simpleTitleCaseMapping:0x0093 + }, + { code:0x0094 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0094 + ,simpleLowerCaseMapping:0x0094 + ,simpleTitleCaseMapping:0x0094 + }, + { code:0x0095 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0095 + ,simpleLowerCaseMapping:0x0095 + ,simpleTitleCaseMapping:0x0095 + }, + { code:0x0096 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0096 + ,simpleLowerCaseMapping:0x0096 + ,simpleTitleCaseMapping:0x0096 + }, + { code:0x0097 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0097 + ,simpleLowerCaseMapping:0x0097 + ,simpleTitleCaseMapping:0x0097 + }, + { code:0x0098 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0098 + ,simpleLowerCaseMapping:0x0098 + ,simpleTitleCaseMapping:0x0098 + }, + { code:0x0099 + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x0099 + ,simpleLowerCaseMapping:0x0099 + ,simpleTitleCaseMapping:0x0099 + }, + { code:0x009A + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x009A + ,simpleLowerCaseMapping:0x009A + ,simpleTitleCaseMapping:0x009A + }, + { code:0x009B + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x009B + ,simpleLowerCaseMapping:0x009B + ,simpleTitleCaseMapping:0x009B + }, + { code:0x009C + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x009C + ,simpleLowerCaseMapping:0x009C + ,simpleTitleCaseMapping:0x009C + }, + { code:0x009D + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x009D + ,simpleLowerCaseMapping:0x009D + ,simpleTitleCaseMapping:0x009D + }, + { code:0x009E + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x009E + ,simpleLowerCaseMapping:0x009E + ,simpleTitleCaseMapping:0x009E + }, + { code:0x009F + ,generalCategory:UnicodeData.GeneralCategory.Cc + ,simpleUpperCaseMapping:0x009F + ,simpleLowerCaseMapping:0x009F + ,simpleTitleCaseMapping:0x009F + }, + { code:0x00A0 + ,generalCategory:UnicodeData.GeneralCategory.Zs + ,simpleUpperCaseMapping:0x00A0 + ,simpleLowerCaseMapping:0x00A0 + ,simpleTitleCaseMapping:0x00A0 + }, + { code:0x00A1 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x00A1 + ,simpleLowerCaseMapping:0x00A1 + ,simpleTitleCaseMapping:0x00A1 + }, + { code:0x00A2 + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0x00A2 + ,simpleLowerCaseMapping:0x00A2 + ,simpleTitleCaseMapping:0x00A2 + }, + { code:0x00A3 + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0x00A3 + ,simpleLowerCaseMapping:0x00A3 + ,simpleTitleCaseMapping:0x00A3 + }, + { code:0x00A4 + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0x00A4 + ,simpleLowerCaseMapping:0x00A4 + ,simpleTitleCaseMapping:0x00A4 + }, + { code:0x00A5 + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0x00A5 + ,simpleLowerCaseMapping:0x00A5 + ,simpleTitleCaseMapping:0x00A5 + }, + { code:0x00A6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x00A6 + ,simpleLowerCaseMapping:0x00A6 + ,simpleTitleCaseMapping:0x00A6 + }, + { code:0x00A7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x00A7 + ,simpleLowerCaseMapping:0x00A7 + ,simpleTitleCaseMapping:0x00A7 + }, + { code:0x00A8 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x00A8 + ,simpleLowerCaseMapping:0x00A8 + ,simpleTitleCaseMapping:0x00A8 + }, + { code:0x00A9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x00A9 + ,simpleLowerCaseMapping:0x00A9 + ,simpleTitleCaseMapping:0x00A9 + }, + { code:0x00AA + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x00AA + ,simpleLowerCaseMapping:0x00AA + ,simpleTitleCaseMapping:0x00AA + }, + { code:0x00AB + ,generalCategory:UnicodeData.GeneralCategory.Pi + ,simpleUpperCaseMapping:0x00AB + ,simpleLowerCaseMapping:0x00AB + ,simpleTitleCaseMapping:0x00AB + }, + { code:0x00AC + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x00AC + ,simpleLowerCaseMapping:0x00AC + ,simpleTitleCaseMapping:0x00AC + }, + { code:0x00AD + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x00AD + ,simpleLowerCaseMapping:0x00AD + ,simpleTitleCaseMapping:0x00AD + }, + { code:0x00AE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x00AE + ,simpleLowerCaseMapping:0x00AE + ,simpleTitleCaseMapping:0x00AE + }, + { code:0x00AF + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x00AF + ,simpleLowerCaseMapping:0x00AF + ,simpleTitleCaseMapping:0x00AF + }, + { code:0x00B0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x00B0 + ,simpleLowerCaseMapping:0x00B0 + ,simpleTitleCaseMapping:0x00B0 + }, + { code:0x00B1 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x00B1 + ,simpleLowerCaseMapping:0x00B1 + ,simpleTitleCaseMapping:0x00B1 + }, + { code:0x00B2 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x00B2 + ,simpleLowerCaseMapping:0x00B2 + ,simpleTitleCaseMapping:0x00B2 + }, + { code:0x00B3 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x00B3 + ,simpleLowerCaseMapping:0x00B3 + ,simpleTitleCaseMapping:0x00B3 + }, + { code:0x00B4 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x00B4 + ,simpleLowerCaseMapping:0x00B4 + ,simpleTitleCaseMapping:0x00B4 + }, + { code:0x00B5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x039C + ,simpleLowerCaseMapping:0x00B5 + ,simpleTitleCaseMapping:0x039C + }, + { code:0x00B6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x00B6 + ,simpleLowerCaseMapping:0x00B6 + ,simpleTitleCaseMapping:0x00B6 + }, + { code:0x00B7 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x00B7 + ,simpleLowerCaseMapping:0x00B7 + ,simpleTitleCaseMapping:0x00B7 + }, + { code:0x00B8 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x00B8 + ,simpleLowerCaseMapping:0x00B8 + ,simpleTitleCaseMapping:0x00B8 + }, + { code:0x00B9 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x00B9 + ,simpleLowerCaseMapping:0x00B9 + ,simpleTitleCaseMapping:0x00B9 + }, + { code:0x00BA + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x00BA + ,simpleLowerCaseMapping:0x00BA + ,simpleTitleCaseMapping:0x00BA + }, + { code:0x00BB + ,generalCategory:UnicodeData.GeneralCategory.Pf + ,simpleUpperCaseMapping:0x00BB + ,simpleLowerCaseMapping:0x00BB + ,simpleTitleCaseMapping:0x00BB + }, + { code:0x00BC + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x00BC + ,simpleLowerCaseMapping:0x00BC + ,simpleTitleCaseMapping:0x00BC + }, + { code:0x00BD + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x00BD + ,simpleLowerCaseMapping:0x00BD + ,simpleTitleCaseMapping:0x00BD + }, + { code:0x00BE + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x00BE + ,simpleLowerCaseMapping:0x00BE + ,simpleTitleCaseMapping:0x00BE + }, + { code:0x00BF + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x00BF + ,simpleLowerCaseMapping:0x00BF + ,simpleTitleCaseMapping:0x00BF + }, + { code:0x00C0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x00C0 + ,simpleLowerCaseMapping:0x00E0 + ,simpleTitleCaseMapping:0x00C0 + }, + { code:0x00C1 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x00C1 + ,simpleLowerCaseMapping:0x00E1 + ,simpleTitleCaseMapping:0x00C1 + }, + { code:0x00C2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x00C2 + ,simpleLowerCaseMapping:0x00E2 + ,simpleTitleCaseMapping:0x00C2 + }, + { code:0x00C3 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x00C3 + ,simpleLowerCaseMapping:0x00E3 + ,simpleTitleCaseMapping:0x00C3 + }, + { code:0x00C4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x00C4 + ,simpleLowerCaseMapping:0x00E4 + ,simpleTitleCaseMapping:0x00C4 + }, + { code:0x00C5 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x00C5 + ,simpleLowerCaseMapping:0x00E5 + ,simpleTitleCaseMapping:0x00C5 + }, + { code:0x00C6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x00C6 + ,simpleLowerCaseMapping:0x00E6 + ,simpleTitleCaseMapping:0x00C6 + }, + { code:0x00C7 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x00C7 + ,simpleLowerCaseMapping:0x00E7 + ,simpleTitleCaseMapping:0x00C7 + }, + { code:0x00C8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x00C8 + ,simpleLowerCaseMapping:0x00E8 + ,simpleTitleCaseMapping:0x00C8 + }, + { code:0x00C9 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x00C9 + ,simpleLowerCaseMapping:0x00E9 + ,simpleTitleCaseMapping:0x00C9 + }, + { code:0x00CA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x00CA + ,simpleLowerCaseMapping:0x00EA + ,simpleTitleCaseMapping:0x00CA + }, + { code:0x00CB + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x00CB + ,simpleLowerCaseMapping:0x00EB + ,simpleTitleCaseMapping:0x00CB + }, + { code:0x00CC + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x00CC + ,simpleLowerCaseMapping:0x00EC + ,simpleTitleCaseMapping:0x00CC + }, + { code:0x00CD + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x00CD + ,simpleLowerCaseMapping:0x00ED + ,simpleTitleCaseMapping:0x00CD + }, + { code:0x00CE + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x00CE + ,simpleLowerCaseMapping:0x00EE + ,simpleTitleCaseMapping:0x00CE + }, + { code:0x00CF + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x00CF + ,simpleLowerCaseMapping:0x00EF + ,simpleTitleCaseMapping:0x00CF + }, + { code:0x00D0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x00D0 + ,simpleLowerCaseMapping:0x00F0 + ,simpleTitleCaseMapping:0x00D0 + }, + { code:0x00D1 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x00D1 + ,simpleLowerCaseMapping:0x00F1 + ,simpleTitleCaseMapping:0x00D1 + }, + { code:0x00D2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x00D2 + ,simpleLowerCaseMapping:0x00F2 + ,simpleTitleCaseMapping:0x00D2 + }, + { code:0x00D3 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x00D3 + ,simpleLowerCaseMapping:0x00F3 + ,simpleTitleCaseMapping:0x00D3 + }, + { code:0x00D4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x00D4 + ,simpleLowerCaseMapping:0x00F4 + ,simpleTitleCaseMapping:0x00D4 + }, + { code:0x00D5 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x00D5 + ,simpleLowerCaseMapping:0x00F5 + ,simpleTitleCaseMapping:0x00D5 + }, + { code:0x00D6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x00D6 + ,simpleLowerCaseMapping:0x00F6 + ,simpleTitleCaseMapping:0x00D6 + }, + { code:0x00D7 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x00D7 + ,simpleLowerCaseMapping:0x00D7 + ,simpleTitleCaseMapping:0x00D7 + }, + { code:0x00D8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x00D8 + ,simpleLowerCaseMapping:0x00F8 + ,simpleTitleCaseMapping:0x00D8 + }, + { code:0x00D9 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x00D9 + ,simpleLowerCaseMapping:0x00F9 + ,simpleTitleCaseMapping:0x00D9 + }, + { code:0x00DA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x00DA + ,simpleLowerCaseMapping:0x00FA + ,simpleTitleCaseMapping:0x00DA + }, + { code:0x00DB + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x00DB + ,simpleLowerCaseMapping:0x00FB + ,simpleTitleCaseMapping:0x00DB + }, + { code:0x00DC + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x00DC + ,simpleLowerCaseMapping:0x00FC + ,simpleTitleCaseMapping:0x00DC + }, + { code:0x00DD + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x00DD + ,simpleLowerCaseMapping:0x00FD + ,simpleTitleCaseMapping:0x00DD + }, + { code:0x00DE + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x00DE + ,simpleLowerCaseMapping:0x00FE + ,simpleTitleCaseMapping:0x00DE + }, + { code:0x00DF + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x00DF + ,simpleLowerCaseMapping:0x00DF + ,simpleTitleCaseMapping:0x00DF + }, + { code:0x00E0 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x00C0 + ,simpleLowerCaseMapping:0x00E0 + ,simpleTitleCaseMapping:0x00C0 + }, + { code:0x00E1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x00C1 + ,simpleLowerCaseMapping:0x00E1 + ,simpleTitleCaseMapping:0x00C1 + }, + { code:0x00E2 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x00C2 + ,simpleLowerCaseMapping:0x00E2 + ,simpleTitleCaseMapping:0x00C2 + }, + { code:0x00E3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x00C3 + ,simpleLowerCaseMapping:0x00E3 + ,simpleTitleCaseMapping:0x00C3 + }, + { code:0x00E4 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x00C4 + ,simpleLowerCaseMapping:0x00E4 + ,simpleTitleCaseMapping:0x00C4 + }, + { code:0x00E5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x00C5 + ,simpleLowerCaseMapping:0x00E5 + ,simpleTitleCaseMapping:0x00C5 + }, + { code:0x00E6 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x00C6 + ,simpleLowerCaseMapping:0x00E6 + ,simpleTitleCaseMapping:0x00C6 + }, + { code:0x00E7 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x00C7 + ,simpleLowerCaseMapping:0x00E7 + ,simpleTitleCaseMapping:0x00C7 + }, + { code:0x00E8 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x00C8 + ,simpleLowerCaseMapping:0x00E8 + ,simpleTitleCaseMapping:0x00C8 + }, + { code:0x00E9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x00C9 + ,simpleLowerCaseMapping:0x00E9 + ,simpleTitleCaseMapping:0x00C9 + }, + { code:0x00EA + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x00CA + ,simpleLowerCaseMapping:0x00EA + ,simpleTitleCaseMapping:0x00CA + }, + { code:0x00EB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x00CB + ,simpleLowerCaseMapping:0x00EB + ,simpleTitleCaseMapping:0x00CB + }, + { code:0x00EC + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x00CC + ,simpleLowerCaseMapping:0x00EC + ,simpleTitleCaseMapping:0x00CC + }, + { code:0x00ED + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x00CD + ,simpleLowerCaseMapping:0x00ED + ,simpleTitleCaseMapping:0x00CD + }, + { code:0x00EE + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x00CE + ,simpleLowerCaseMapping:0x00EE + ,simpleTitleCaseMapping:0x00CE + }, + { code:0x00EF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x00CF + ,simpleLowerCaseMapping:0x00EF + ,simpleTitleCaseMapping:0x00CF + }, + { code:0x00F0 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x00D0 + ,simpleLowerCaseMapping:0x00F0 + ,simpleTitleCaseMapping:0x00D0 + }, + { code:0x00F1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x00D1 + ,simpleLowerCaseMapping:0x00F1 + ,simpleTitleCaseMapping:0x00D1 + }, + { code:0x00F2 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x00D2 + ,simpleLowerCaseMapping:0x00F2 + ,simpleTitleCaseMapping:0x00D2 + }, + { code:0x00F3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x00D3 + ,simpleLowerCaseMapping:0x00F3 + ,simpleTitleCaseMapping:0x00D3 + }, + { code:0x00F4 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x00D4 + ,simpleLowerCaseMapping:0x00F4 + ,simpleTitleCaseMapping:0x00D4 + }, + { code:0x00F5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x00D5 + ,simpleLowerCaseMapping:0x00F5 + ,simpleTitleCaseMapping:0x00D5 + }, + { code:0x00F6 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x00D6 + ,simpleLowerCaseMapping:0x00F6 + ,simpleTitleCaseMapping:0x00D6 + }, + { code:0x00F7 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x00F7 + ,simpleLowerCaseMapping:0x00F7 + ,simpleTitleCaseMapping:0x00F7 + }, + { code:0x00F8 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x00D8 + ,simpleLowerCaseMapping:0x00F8 + ,simpleTitleCaseMapping:0x00D8 + }, + { code:0x00F9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x00D9 + ,simpleLowerCaseMapping:0x00F9 + ,simpleTitleCaseMapping:0x00D9 + }, + { code:0x00FA + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x00DA + ,simpleLowerCaseMapping:0x00FA + ,simpleTitleCaseMapping:0x00DA + }, + { code:0x00FB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x00DB + ,simpleLowerCaseMapping:0x00FB + ,simpleTitleCaseMapping:0x00DB + }, + { code:0x00FC + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x00DC + ,simpleLowerCaseMapping:0x00FC + ,simpleTitleCaseMapping:0x00DC + }, + { code:0x00FD + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x00DD + ,simpleLowerCaseMapping:0x00FD + ,simpleTitleCaseMapping:0x00DD + }, + { code:0x00FE + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x00DE + ,simpleLowerCaseMapping:0x00FE + ,simpleTitleCaseMapping:0x00DE + }, + { code:0x00FF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0178 + ,simpleLowerCaseMapping:0x00FF + ,simpleTitleCaseMapping:0x0178 + }, + { code:0x0100 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0100 + ,simpleLowerCaseMapping:0x0101 + ,simpleTitleCaseMapping:0x0100 + }, + { code:0x0101 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0100 + ,simpleLowerCaseMapping:0x0101 + ,simpleTitleCaseMapping:0x0100 + }, + { code:0x0102 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0102 + ,simpleLowerCaseMapping:0x0103 + ,simpleTitleCaseMapping:0x0102 + }, + { code:0x0103 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0102 + ,simpleLowerCaseMapping:0x0103 + ,simpleTitleCaseMapping:0x0102 + }, + { code:0x0104 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0104 + ,simpleLowerCaseMapping:0x0105 + ,simpleTitleCaseMapping:0x0104 + }, + { code:0x0105 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0104 + ,simpleLowerCaseMapping:0x0105 + ,simpleTitleCaseMapping:0x0104 + }, + { code:0x0106 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0106 + ,simpleLowerCaseMapping:0x0107 + ,simpleTitleCaseMapping:0x0106 + }, + { code:0x0107 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0106 + ,simpleLowerCaseMapping:0x0107 + ,simpleTitleCaseMapping:0x0106 + }, + { code:0x0108 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0108 + ,simpleLowerCaseMapping:0x0109 + ,simpleTitleCaseMapping:0x0108 + }, + { code:0x0109 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0108 + ,simpleLowerCaseMapping:0x0109 + ,simpleTitleCaseMapping:0x0108 + }, + { code:0x010A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x010A + ,simpleLowerCaseMapping:0x010B + ,simpleTitleCaseMapping:0x010A + }, + { code:0x010B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x010A + ,simpleLowerCaseMapping:0x010B + ,simpleTitleCaseMapping:0x010A + }, + { code:0x010C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x010C + ,simpleLowerCaseMapping:0x010D + ,simpleTitleCaseMapping:0x010C + }, + { code:0x010D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x010C + ,simpleLowerCaseMapping:0x010D + ,simpleTitleCaseMapping:0x010C + }, + { code:0x010E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x010E + ,simpleLowerCaseMapping:0x010F + ,simpleTitleCaseMapping:0x010E + }, + { code:0x010F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x010E + ,simpleLowerCaseMapping:0x010F + ,simpleTitleCaseMapping:0x010E + }, + { code:0x0110 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0110 + ,simpleLowerCaseMapping:0x0111 + ,simpleTitleCaseMapping:0x0110 + }, + { code:0x0111 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0110 + ,simpleLowerCaseMapping:0x0111 + ,simpleTitleCaseMapping:0x0110 + }, + { code:0x0112 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0112 + ,simpleLowerCaseMapping:0x0113 + ,simpleTitleCaseMapping:0x0112 + }, + { code:0x0113 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0112 + ,simpleLowerCaseMapping:0x0113 + ,simpleTitleCaseMapping:0x0112 + }, + { code:0x0114 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0114 + ,simpleLowerCaseMapping:0x0115 + ,simpleTitleCaseMapping:0x0114 + }, + { code:0x0115 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0114 + ,simpleLowerCaseMapping:0x0115 + ,simpleTitleCaseMapping:0x0114 + }, + { code:0x0116 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0116 + ,simpleLowerCaseMapping:0x0117 + ,simpleTitleCaseMapping:0x0116 + }, + { code:0x0117 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0116 + ,simpleLowerCaseMapping:0x0117 + ,simpleTitleCaseMapping:0x0116 + }, + { code:0x0118 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0118 + ,simpleLowerCaseMapping:0x0119 + ,simpleTitleCaseMapping:0x0118 + }, + { code:0x0119 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0118 + ,simpleLowerCaseMapping:0x0119 + ,simpleTitleCaseMapping:0x0118 + }, + { code:0x011A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x011A + ,simpleLowerCaseMapping:0x011B + ,simpleTitleCaseMapping:0x011A + }, + { code:0x011B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x011A + ,simpleLowerCaseMapping:0x011B + ,simpleTitleCaseMapping:0x011A + }, + { code:0x011C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x011C + ,simpleLowerCaseMapping:0x011D + ,simpleTitleCaseMapping:0x011C + }, + { code:0x011D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x011C + ,simpleLowerCaseMapping:0x011D + ,simpleTitleCaseMapping:0x011C + }, + { code:0x011E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x011E + ,simpleLowerCaseMapping:0x011F + ,simpleTitleCaseMapping:0x011E + }, + { code:0x011F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x011E + ,simpleLowerCaseMapping:0x011F + ,simpleTitleCaseMapping:0x011E + }, + { code:0x0120 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0120 + ,simpleLowerCaseMapping:0x0121 + ,simpleTitleCaseMapping:0x0120 + }, + { code:0x0121 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0120 + ,simpleLowerCaseMapping:0x0121 + ,simpleTitleCaseMapping:0x0120 + }, + { code:0x0122 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0122 + ,simpleLowerCaseMapping:0x0123 + ,simpleTitleCaseMapping:0x0122 + }, + { code:0x0123 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0122 + ,simpleLowerCaseMapping:0x0123 + ,simpleTitleCaseMapping:0x0122 + }, + { code:0x0124 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0124 + ,simpleLowerCaseMapping:0x0125 + ,simpleTitleCaseMapping:0x0124 + }, + { code:0x0125 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0124 + ,simpleLowerCaseMapping:0x0125 + ,simpleTitleCaseMapping:0x0124 + }, + { code:0x0126 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0126 + ,simpleLowerCaseMapping:0x0127 + ,simpleTitleCaseMapping:0x0126 + }, + { code:0x0127 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0126 + ,simpleLowerCaseMapping:0x0127 + ,simpleTitleCaseMapping:0x0126 + }, + { code:0x0128 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0128 + ,simpleLowerCaseMapping:0x0129 + ,simpleTitleCaseMapping:0x0128 + }, + { code:0x0129 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0128 + ,simpleLowerCaseMapping:0x0129 + ,simpleTitleCaseMapping:0x0128 + }, + { code:0x012A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x012A + ,simpleLowerCaseMapping:0x012B + ,simpleTitleCaseMapping:0x012A + }, + { code:0x012B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x012A + ,simpleLowerCaseMapping:0x012B + ,simpleTitleCaseMapping:0x012A + }, + { code:0x012C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x012C + ,simpleLowerCaseMapping:0x012D + ,simpleTitleCaseMapping:0x012C + }, + { code:0x012D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x012C + ,simpleLowerCaseMapping:0x012D + ,simpleTitleCaseMapping:0x012C + }, + { code:0x012E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x012E + ,simpleLowerCaseMapping:0x012F + ,simpleTitleCaseMapping:0x012E + }, + { code:0x012F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x012E + ,simpleLowerCaseMapping:0x012F + ,simpleTitleCaseMapping:0x012E + }, + { code:0x0130 + ,generalCategory:UnicodeData.GeneralCategory.Lu | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x0130 + ,simpleLowerCaseMapping:0x0069 + ,simpleTitleCaseMapping:0x0130 + }, + { code:0x0131 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0049 + ,simpleLowerCaseMapping:0x0131 + ,simpleTitleCaseMapping:0x0049 + }, + { code:0x0132 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0132 + ,simpleLowerCaseMapping:0x0133 + ,simpleTitleCaseMapping:0x0132 + }, + { code:0x0133 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0132 + ,simpleLowerCaseMapping:0x0133 + ,simpleTitleCaseMapping:0x0132 + }, + { code:0x0134 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0134 + ,simpleLowerCaseMapping:0x0135 + ,simpleTitleCaseMapping:0x0134 + }, + { code:0x0135 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0134 + ,simpleLowerCaseMapping:0x0135 + ,simpleTitleCaseMapping:0x0134 + }, + { code:0x0136 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0136 + ,simpleLowerCaseMapping:0x0137 + ,simpleTitleCaseMapping:0x0136 + }, + { code:0x0137 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0136 + ,simpleLowerCaseMapping:0x0137 + ,simpleTitleCaseMapping:0x0136 + }, + { code:0x0138 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0138 + ,simpleLowerCaseMapping:0x0138 + ,simpleTitleCaseMapping:0x0138 + }, + { code:0x0139 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0139 + ,simpleLowerCaseMapping:0x013A + ,simpleTitleCaseMapping:0x0139 + }, + { code:0x013A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0139 + ,simpleLowerCaseMapping:0x013A + ,simpleTitleCaseMapping:0x0139 + }, + { code:0x013B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x013B + ,simpleLowerCaseMapping:0x013C + ,simpleTitleCaseMapping:0x013B + }, + { code:0x013C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x013B + ,simpleLowerCaseMapping:0x013C + ,simpleTitleCaseMapping:0x013B + }, + { code:0x013D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x013D + ,simpleLowerCaseMapping:0x013E + ,simpleTitleCaseMapping:0x013D + }, + { code:0x013E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x013D + ,simpleLowerCaseMapping:0x013E + ,simpleTitleCaseMapping:0x013D + }, + { code:0x013F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x013F + ,simpleLowerCaseMapping:0x0140 + ,simpleTitleCaseMapping:0x013F + }, + { code:0x0140 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x013F + ,simpleLowerCaseMapping:0x0140 + ,simpleTitleCaseMapping:0x013F + }, + { code:0x0141 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0141 + ,simpleLowerCaseMapping:0x0142 + ,simpleTitleCaseMapping:0x0141 + }, + { code:0x0142 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0141 + ,simpleLowerCaseMapping:0x0142 + ,simpleTitleCaseMapping:0x0141 + }, + { code:0x0143 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0143 + ,simpleLowerCaseMapping:0x0144 + ,simpleTitleCaseMapping:0x0143 + }, + { code:0x0144 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0143 + ,simpleLowerCaseMapping:0x0144 + ,simpleTitleCaseMapping:0x0143 + }, + { code:0x0145 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0145 + ,simpleLowerCaseMapping:0x0146 + ,simpleTitleCaseMapping:0x0145 + }, + { code:0x0146 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0145 + ,simpleLowerCaseMapping:0x0146 + ,simpleTitleCaseMapping:0x0145 + }, + { code:0x0147 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0147 + ,simpleLowerCaseMapping:0x0148 + ,simpleTitleCaseMapping:0x0147 + }, + { code:0x0148 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0147 + ,simpleLowerCaseMapping:0x0148 + ,simpleTitleCaseMapping:0x0147 + }, + { code:0x0149 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x0149 + ,simpleLowerCaseMapping:0x0149 + ,simpleTitleCaseMapping:0x0149 + }, + { code:0x014A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x014A + ,simpleLowerCaseMapping:0x014B + ,simpleTitleCaseMapping:0x014A + }, + { code:0x014B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x014A + ,simpleLowerCaseMapping:0x014B + ,simpleTitleCaseMapping:0x014A + }, + { code:0x014C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x014C + ,simpleLowerCaseMapping:0x014D + ,simpleTitleCaseMapping:0x014C + }, + { code:0x014D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x014C + ,simpleLowerCaseMapping:0x014D + ,simpleTitleCaseMapping:0x014C + }, + { code:0x014E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x014E + ,simpleLowerCaseMapping:0x014F + ,simpleTitleCaseMapping:0x014E + }, + { code:0x014F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x014E + ,simpleLowerCaseMapping:0x014F + ,simpleTitleCaseMapping:0x014E + }, + { code:0x0150 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0150 + ,simpleLowerCaseMapping:0x0151 + ,simpleTitleCaseMapping:0x0150 + }, + { code:0x0151 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0150 + ,simpleLowerCaseMapping:0x0151 + ,simpleTitleCaseMapping:0x0150 + }, + { code:0x0152 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0152 + ,simpleLowerCaseMapping:0x0153 + ,simpleTitleCaseMapping:0x0152 + }, + { code:0x0153 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0152 + ,simpleLowerCaseMapping:0x0153 + ,simpleTitleCaseMapping:0x0152 + }, + { code:0x0154 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0154 + ,simpleLowerCaseMapping:0x0155 + ,simpleTitleCaseMapping:0x0154 + }, + { code:0x0155 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0154 + ,simpleLowerCaseMapping:0x0155 + ,simpleTitleCaseMapping:0x0154 + }, + { code:0x0156 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0156 + ,simpleLowerCaseMapping:0x0157 + ,simpleTitleCaseMapping:0x0156 + }, + { code:0x0157 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0156 + ,simpleLowerCaseMapping:0x0157 + ,simpleTitleCaseMapping:0x0156 + }, + { code:0x0158 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0158 + ,simpleLowerCaseMapping:0x0159 + ,simpleTitleCaseMapping:0x0158 + }, + { code:0x0159 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0158 + ,simpleLowerCaseMapping:0x0159 + ,simpleTitleCaseMapping:0x0158 + }, + { code:0x015A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x015A + ,simpleLowerCaseMapping:0x015B + ,simpleTitleCaseMapping:0x015A + }, + { code:0x015B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x015A + ,simpleLowerCaseMapping:0x015B + ,simpleTitleCaseMapping:0x015A + }, + { code:0x015C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x015C + ,simpleLowerCaseMapping:0x015D + ,simpleTitleCaseMapping:0x015C + }, + { code:0x015D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x015C + ,simpleLowerCaseMapping:0x015D + ,simpleTitleCaseMapping:0x015C + }, + { code:0x015E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x015E + ,simpleLowerCaseMapping:0x015F + ,simpleTitleCaseMapping:0x015E + }, + { code:0x015F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x015E + ,simpleLowerCaseMapping:0x015F + ,simpleTitleCaseMapping:0x015E + }, + { code:0x0160 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0160 + ,simpleLowerCaseMapping:0x0161 + ,simpleTitleCaseMapping:0x0160 + }, + { code:0x0161 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0160 + ,simpleLowerCaseMapping:0x0161 + ,simpleTitleCaseMapping:0x0160 + }, + { code:0x0162 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0162 + ,simpleLowerCaseMapping:0x0163 + ,simpleTitleCaseMapping:0x0162 + }, + { code:0x0163 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0162 + ,simpleLowerCaseMapping:0x0163 + ,simpleTitleCaseMapping:0x0162 + }, + { code:0x0164 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0164 + ,simpleLowerCaseMapping:0x0165 + ,simpleTitleCaseMapping:0x0164 + }, + { code:0x0165 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0164 + ,simpleLowerCaseMapping:0x0165 + ,simpleTitleCaseMapping:0x0164 + }, + { code:0x0166 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0166 + ,simpleLowerCaseMapping:0x0167 + ,simpleTitleCaseMapping:0x0166 + }, + { code:0x0167 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0166 + ,simpleLowerCaseMapping:0x0167 + ,simpleTitleCaseMapping:0x0166 + }, + { code:0x0168 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0168 + ,simpleLowerCaseMapping:0x0169 + ,simpleTitleCaseMapping:0x0168 + }, + { code:0x0169 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0168 + ,simpleLowerCaseMapping:0x0169 + ,simpleTitleCaseMapping:0x0168 + }, + { code:0x016A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x016A + ,simpleLowerCaseMapping:0x016B + ,simpleTitleCaseMapping:0x016A + }, + { code:0x016B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x016A + ,simpleLowerCaseMapping:0x016B + ,simpleTitleCaseMapping:0x016A + }, + { code:0x016C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x016C + ,simpleLowerCaseMapping:0x016D + ,simpleTitleCaseMapping:0x016C + }, + { code:0x016D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x016C + ,simpleLowerCaseMapping:0x016D + ,simpleTitleCaseMapping:0x016C + }, + { code:0x016E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x016E + ,simpleLowerCaseMapping:0x016F + ,simpleTitleCaseMapping:0x016E + }, + { code:0x016F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x016E + ,simpleLowerCaseMapping:0x016F + ,simpleTitleCaseMapping:0x016E + }, + { code:0x0170 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0170 + ,simpleLowerCaseMapping:0x0171 + ,simpleTitleCaseMapping:0x0170 + }, + { code:0x0171 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0170 + ,simpleLowerCaseMapping:0x0171 + ,simpleTitleCaseMapping:0x0170 + }, + { code:0x0172 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0172 + ,simpleLowerCaseMapping:0x0173 + ,simpleTitleCaseMapping:0x0172 + }, + { code:0x0173 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0172 + ,simpleLowerCaseMapping:0x0173 + ,simpleTitleCaseMapping:0x0172 + }, + { code:0x0174 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0174 + ,simpleLowerCaseMapping:0x0175 + ,simpleTitleCaseMapping:0x0174 + }, + { code:0x0175 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0174 + ,simpleLowerCaseMapping:0x0175 + ,simpleTitleCaseMapping:0x0174 + }, + { code:0x0176 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0176 + ,simpleLowerCaseMapping:0x0177 + ,simpleTitleCaseMapping:0x0176 + }, + { code:0x0177 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0176 + ,simpleLowerCaseMapping:0x0177 + ,simpleTitleCaseMapping:0x0176 + }, + { code:0x0178 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0178 + ,simpleLowerCaseMapping:0x00FF + ,simpleTitleCaseMapping:0x0178 + }, + { code:0x0179 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0179 + ,simpleLowerCaseMapping:0x017A + ,simpleTitleCaseMapping:0x0179 + }, + { code:0x017A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0179 + ,simpleLowerCaseMapping:0x017A + ,simpleTitleCaseMapping:0x0179 + }, + { code:0x017B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x017B + ,simpleLowerCaseMapping:0x017C + ,simpleTitleCaseMapping:0x017B + }, + { code:0x017C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x017B + ,simpleLowerCaseMapping:0x017C + ,simpleTitleCaseMapping:0x017B + }, + { code:0x017D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x017D + ,simpleLowerCaseMapping:0x017E + ,simpleTitleCaseMapping:0x017D + }, + { code:0x017E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x017D + ,simpleLowerCaseMapping:0x017E + ,simpleTitleCaseMapping:0x017D + }, + { code:0x017F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0053 + ,simpleLowerCaseMapping:0x017F + ,simpleTitleCaseMapping:0x0053 + }, + { code:0x0180 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0243 + ,simpleLowerCaseMapping:0x0180 + ,simpleTitleCaseMapping:0x0243 + }, + { code:0x0181 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0181 + ,simpleLowerCaseMapping:0x0253 + ,simpleTitleCaseMapping:0x0181 + }, + { code:0x0182 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0182 + ,simpleLowerCaseMapping:0x0183 + ,simpleTitleCaseMapping:0x0182 + }, + { code:0x0183 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0182 + ,simpleLowerCaseMapping:0x0183 + ,simpleTitleCaseMapping:0x0182 + }, + { code:0x0184 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0184 + ,simpleLowerCaseMapping:0x0185 + ,simpleTitleCaseMapping:0x0184 + }, + { code:0x0185 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0184 + ,simpleLowerCaseMapping:0x0185 + ,simpleTitleCaseMapping:0x0184 + }, + { code:0x0186 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0186 + ,simpleLowerCaseMapping:0x0254 + ,simpleTitleCaseMapping:0x0186 + }, + { code:0x0187 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0187 + ,simpleLowerCaseMapping:0x0188 + ,simpleTitleCaseMapping:0x0187 + }, + { code:0x0188 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0187 + ,simpleLowerCaseMapping:0x0188 + ,simpleTitleCaseMapping:0x0187 + }, + { code:0x0189 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0189 + ,simpleLowerCaseMapping:0x0256 + ,simpleTitleCaseMapping:0x0189 + }, + { code:0x018A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x018A + ,simpleLowerCaseMapping:0x0257 + ,simpleTitleCaseMapping:0x018A + }, + { code:0x018B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x018B + ,simpleLowerCaseMapping:0x018C + ,simpleTitleCaseMapping:0x018B + }, + { code:0x018C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x018B + ,simpleLowerCaseMapping:0x018C + ,simpleTitleCaseMapping:0x018B + }, + { code:0x018D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x018D + ,simpleLowerCaseMapping:0x018D + ,simpleTitleCaseMapping:0x018D + }, + { code:0x018E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x018E + ,simpleLowerCaseMapping:0x01DD + ,simpleTitleCaseMapping:0x018E + }, + { code:0x018F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x018F + ,simpleLowerCaseMapping:0x0259 + ,simpleTitleCaseMapping:0x018F + }, + { code:0x0190 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0190 + ,simpleLowerCaseMapping:0x025B + ,simpleTitleCaseMapping:0x0190 + }, + { code:0x0191 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0191 + ,simpleLowerCaseMapping:0x0192 + ,simpleTitleCaseMapping:0x0191 + }, + { code:0x0192 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0191 + ,simpleLowerCaseMapping:0x0192 + ,simpleTitleCaseMapping:0x0191 + }, + { code:0x0193 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0193 + ,simpleLowerCaseMapping:0x0260 + ,simpleTitleCaseMapping:0x0193 + }, + { code:0x0194 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0194 + ,simpleLowerCaseMapping:0x0263 + ,simpleTitleCaseMapping:0x0194 + }, + { code:0x0195 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01F6 + ,simpleLowerCaseMapping:0x0195 + ,simpleTitleCaseMapping:0x01F6 + }, + { code:0x0196 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0196 + ,simpleLowerCaseMapping:0x0269 + ,simpleTitleCaseMapping:0x0196 + }, + { code:0x0197 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0197 + ,simpleLowerCaseMapping:0x0268 + ,simpleTitleCaseMapping:0x0197 + }, + { code:0x0198 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0198 + ,simpleLowerCaseMapping:0x0199 + ,simpleTitleCaseMapping:0x0198 + }, + { code:0x0199 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0198 + ,simpleLowerCaseMapping:0x0199 + ,simpleTitleCaseMapping:0x0198 + }, + { code:0x019A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x023D + ,simpleLowerCaseMapping:0x019A + ,simpleTitleCaseMapping:0x023D + }, + { code:0x019B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x019B + ,simpleLowerCaseMapping:0x019B + ,simpleTitleCaseMapping:0x019B + }, + { code:0x019C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x019C + ,simpleLowerCaseMapping:0x026F + ,simpleTitleCaseMapping:0x019C + }, + { code:0x019D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x019D + ,simpleLowerCaseMapping:0x0272 + ,simpleTitleCaseMapping:0x019D + }, + { code:0x019E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0220 + ,simpleLowerCaseMapping:0x019E + ,simpleTitleCaseMapping:0x0220 + }, + { code:0x019F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x019F + ,simpleLowerCaseMapping:0x0275 + ,simpleTitleCaseMapping:0x019F + }, + { code:0x01A0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01A0 + ,simpleLowerCaseMapping:0x01A1 + ,simpleTitleCaseMapping:0x01A0 + }, + { code:0x01A1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01A0 + ,simpleLowerCaseMapping:0x01A1 + ,simpleTitleCaseMapping:0x01A0 + }, + { code:0x01A2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01A2 + ,simpleLowerCaseMapping:0x01A3 + ,simpleTitleCaseMapping:0x01A2 + }, + { code:0x01A3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01A2 + ,simpleLowerCaseMapping:0x01A3 + ,simpleTitleCaseMapping:0x01A2 + }, + { code:0x01A4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01A4 + ,simpleLowerCaseMapping:0x01A5 + ,simpleTitleCaseMapping:0x01A4 + }, + { code:0x01A5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01A4 + ,simpleLowerCaseMapping:0x01A5 + ,simpleTitleCaseMapping:0x01A4 + }, + { code:0x01A6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01A6 + ,simpleLowerCaseMapping:0x0280 + ,simpleTitleCaseMapping:0x01A6 + }, + { code:0x01A7 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01A7 + ,simpleLowerCaseMapping:0x01A8 + ,simpleTitleCaseMapping:0x01A7 + }, + { code:0x01A8 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01A7 + ,simpleLowerCaseMapping:0x01A8 + ,simpleTitleCaseMapping:0x01A7 + }, + { code:0x01A9 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01A9 + ,simpleLowerCaseMapping:0x0283 + ,simpleTitleCaseMapping:0x01A9 + }, + { code:0x01AA + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01AA + ,simpleLowerCaseMapping:0x01AA + ,simpleTitleCaseMapping:0x01AA + }, + { code:0x01AB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01AB + ,simpleLowerCaseMapping:0x01AB + ,simpleTitleCaseMapping:0x01AB + }, + { code:0x01AC + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01AC + ,simpleLowerCaseMapping:0x01AD + ,simpleTitleCaseMapping:0x01AC + }, + { code:0x01AD + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01AC + ,simpleLowerCaseMapping:0x01AD + ,simpleTitleCaseMapping:0x01AC + }, + { code:0x01AE + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01AE + ,simpleLowerCaseMapping:0x0288 + ,simpleTitleCaseMapping:0x01AE + }, + { code:0x01AF + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01AF + ,simpleLowerCaseMapping:0x01B0 + ,simpleTitleCaseMapping:0x01AF + }, + { code:0x01B0 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01AF + ,simpleLowerCaseMapping:0x01B0 + ,simpleTitleCaseMapping:0x01AF + }, + { code:0x01B1 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01B1 + ,simpleLowerCaseMapping:0x028A + ,simpleTitleCaseMapping:0x01B1 + }, + { code:0x01B2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01B2 + ,simpleLowerCaseMapping:0x028B + ,simpleTitleCaseMapping:0x01B2 + }, + { code:0x01B3 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01B3 + ,simpleLowerCaseMapping:0x01B4 + ,simpleTitleCaseMapping:0x01B3 + }, + { code:0x01B4 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01B3 + ,simpleLowerCaseMapping:0x01B4 + ,simpleTitleCaseMapping:0x01B3 + }, + { code:0x01B5 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01B5 + ,simpleLowerCaseMapping:0x01B6 + ,simpleTitleCaseMapping:0x01B5 + }, + { code:0x01B6 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01B5 + ,simpleLowerCaseMapping:0x01B6 + ,simpleTitleCaseMapping:0x01B5 + }, + { code:0x01B7 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01B7 + ,simpleLowerCaseMapping:0x0292 + ,simpleTitleCaseMapping:0x01B7 + }, + { code:0x01B8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01B8 + ,simpleLowerCaseMapping:0x01B9 + ,simpleTitleCaseMapping:0x01B8 + }, + { code:0x01B9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01B8 + ,simpleLowerCaseMapping:0x01B9 + ,simpleTitleCaseMapping:0x01B8 + }, + { code:0x01BA + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01BA + ,simpleLowerCaseMapping:0x01BA + ,simpleTitleCaseMapping:0x01BA + }, + { code:0x01BB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x01BB + ,simpleLowerCaseMapping:0x01BB + ,simpleTitleCaseMapping:0x01BB + }, + { code:0x01BC + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01BC + ,simpleLowerCaseMapping:0x01BD + ,simpleTitleCaseMapping:0x01BC + }, + { code:0x01BD + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01BC + ,simpleLowerCaseMapping:0x01BD + ,simpleTitleCaseMapping:0x01BC + }, + { code:0x01BE + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01BE + ,simpleLowerCaseMapping:0x01BE + ,simpleTitleCaseMapping:0x01BE + }, + { code:0x01BF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01F7 + ,simpleLowerCaseMapping:0x01BF + ,simpleTitleCaseMapping:0x01F7 + }, + { code:0x01C0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x01C0 + ,simpleLowerCaseMapping:0x01C0 + ,simpleTitleCaseMapping:0x01C0 + }, + { code:0x01C1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x01C1 + ,simpleLowerCaseMapping:0x01C1 + ,simpleTitleCaseMapping:0x01C1 + }, + { code:0x01C2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x01C2 + ,simpleLowerCaseMapping:0x01C2 + ,simpleTitleCaseMapping:0x01C2 + }, + { code:0x01C3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x01C3 + ,simpleLowerCaseMapping:0x01C3 + ,simpleTitleCaseMapping:0x01C3 + }, + { code:0x01C4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01C4 + ,simpleLowerCaseMapping:0x01C6 + ,simpleTitleCaseMapping:0x01C5 + }, + { code:0x01C5 + ,generalCategory:UnicodeData.GeneralCategory.Lt + ,simpleUpperCaseMapping:0x01C4 + ,simpleLowerCaseMapping:0x01C6 + ,simpleTitleCaseMapping:0x01C5 + }, + { code:0x01C6 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01C4 + ,simpleLowerCaseMapping:0x01C6 + ,simpleTitleCaseMapping:0x01C5 + }, + { code:0x01C7 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01C7 + ,simpleLowerCaseMapping:0x01C9 + ,simpleTitleCaseMapping:0x01C8 + }, + { code:0x01C8 + ,generalCategory:UnicodeData.GeneralCategory.Lt + ,simpleUpperCaseMapping:0x01C7 + ,simpleLowerCaseMapping:0x01C9 + ,simpleTitleCaseMapping:0x01C8 + }, + { code:0x01C9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01C7 + ,simpleLowerCaseMapping:0x01C9 + ,simpleTitleCaseMapping:0x01C8 + }, + { code:0x01CA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01CA + ,simpleLowerCaseMapping:0x01CC + ,simpleTitleCaseMapping:0x01CB + }, + { code:0x01CB + ,generalCategory:UnicodeData.GeneralCategory.Lt + ,simpleUpperCaseMapping:0x01CA + ,simpleLowerCaseMapping:0x01CC + ,simpleTitleCaseMapping:0x01CB + }, + { code:0x01CC + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01CA + ,simpleLowerCaseMapping:0x01CC + ,simpleTitleCaseMapping:0x01CB + }, + { code:0x01CD + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01CD + ,simpleLowerCaseMapping:0x01CE + ,simpleTitleCaseMapping:0x01CD + }, + { code:0x01CE + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01CD + ,simpleLowerCaseMapping:0x01CE + ,simpleTitleCaseMapping:0x01CD + }, + { code:0x01CF + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01CF + ,simpleLowerCaseMapping:0x01D0 + ,simpleTitleCaseMapping:0x01CF + }, + { code:0x01D0 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01CF + ,simpleLowerCaseMapping:0x01D0 + ,simpleTitleCaseMapping:0x01CF + }, + { code:0x01D1 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01D1 + ,simpleLowerCaseMapping:0x01D2 + ,simpleTitleCaseMapping:0x01D1 + }, + { code:0x01D2 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01D1 + ,simpleLowerCaseMapping:0x01D2 + ,simpleTitleCaseMapping:0x01D1 + }, + { code:0x01D3 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01D3 + ,simpleLowerCaseMapping:0x01D4 + ,simpleTitleCaseMapping:0x01D3 + }, + { code:0x01D4 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01D3 + ,simpleLowerCaseMapping:0x01D4 + ,simpleTitleCaseMapping:0x01D3 + }, + { code:0x01D5 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01D5 + ,simpleLowerCaseMapping:0x01D6 + ,simpleTitleCaseMapping:0x01D5 + }, + { code:0x01D6 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01D5 + ,simpleLowerCaseMapping:0x01D6 + ,simpleTitleCaseMapping:0x01D5 + }, + { code:0x01D7 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01D7 + ,simpleLowerCaseMapping:0x01D8 + ,simpleTitleCaseMapping:0x01D7 + }, + { code:0x01D8 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01D7 + ,simpleLowerCaseMapping:0x01D8 + ,simpleTitleCaseMapping:0x01D7 + }, + { code:0x01D9 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01D9 + ,simpleLowerCaseMapping:0x01DA + ,simpleTitleCaseMapping:0x01D9 + }, + { code:0x01DA + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01D9 + ,simpleLowerCaseMapping:0x01DA + ,simpleTitleCaseMapping:0x01D9 + }, + { code:0x01DB + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01DB + ,simpleLowerCaseMapping:0x01DC + ,simpleTitleCaseMapping:0x01DB + }, + { code:0x01DC + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01DB + ,simpleLowerCaseMapping:0x01DC + ,simpleTitleCaseMapping:0x01DB + }, + { code:0x01DD + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x018E + ,simpleLowerCaseMapping:0x01DD + ,simpleTitleCaseMapping:0x018E + }, + { code:0x01DE + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01DE + ,simpleLowerCaseMapping:0x01DF + ,simpleTitleCaseMapping:0x01DE + }, + { code:0x01DF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01DE + ,simpleLowerCaseMapping:0x01DF + ,simpleTitleCaseMapping:0x01DE + }, + { code:0x01E0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01E0 + ,simpleLowerCaseMapping:0x01E1 + ,simpleTitleCaseMapping:0x01E0 + }, + { code:0x01E1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01E0 + ,simpleLowerCaseMapping:0x01E1 + ,simpleTitleCaseMapping:0x01E0 + }, + { code:0x01E2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01E2 + ,simpleLowerCaseMapping:0x01E3 + ,simpleTitleCaseMapping:0x01E2 + }, + { code:0x01E3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01E2 + ,simpleLowerCaseMapping:0x01E3 + ,simpleTitleCaseMapping:0x01E2 + }, + { code:0x01E4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01E4 + ,simpleLowerCaseMapping:0x01E5 + ,simpleTitleCaseMapping:0x01E4 + }, + { code:0x01E5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01E4 + ,simpleLowerCaseMapping:0x01E5 + ,simpleTitleCaseMapping:0x01E4 + }, + { code:0x01E6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01E6 + ,simpleLowerCaseMapping:0x01E7 + ,simpleTitleCaseMapping:0x01E6 + }, + { code:0x01E7 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01E6 + ,simpleLowerCaseMapping:0x01E7 + ,simpleTitleCaseMapping:0x01E6 + }, + { code:0x01E8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01E8 + ,simpleLowerCaseMapping:0x01E9 + ,simpleTitleCaseMapping:0x01E8 + }, + { code:0x01E9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01E8 + ,simpleLowerCaseMapping:0x01E9 + ,simpleTitleCaseMapping:0x01E8 + }, + { code:0x01EA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01EA + ,simpleLowerCaseMapping:0x01EB + ,simpleTitleCaseMapping:0x01EA + }, + { code:0x01EB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01EA + ,simpleLowerCaseMapping:0x01EB + ,simpleTitleCaseMapping:0x01EA + }, + { code:0x01EC + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01EC + ,simpleLowerCaseMapping:0x01ED + ,simpleTitleCaseMapping:0x01EC + }, + { code:0x01ED + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01EC + ,simpleLowerCaseMapping:0x01ED + ,simpleTitleCaseMapping:0x01EC + }, + { code:0x01EE + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01EE + ,simpleLowerCaseMapping:0x01EF + ,simpleTitleCaseMapping:0x01EE + }, + { code:0x01EF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01EE + ,simpleLowerCaseMapping:0x01EF + ,simpleTitleCaseMapping:0x01EE + }, + { code:0x01F0 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x01F0 + ,simpleLowerCaseMapping:0x01F0 + ,simpleTitleCaseMapping:0x01F0 + }, + { code:0x01F1 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01F1 + ,simpleLowerCaseMapping:0x01F3 + ,simpleTitleCaseMapping:0x01F2 + }, + { code:0x01F2 + ,generalCategory:UnicodeData.GeneralCategory.Lt + ,simpleUpperCaseMapping:0x01F1 + ,simpleLowerCaseMapping:0x01F3 + ,simpleTitleCaseMapping:0x01F2 + }, + { code:0x01F3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01F1 + ,simpleLowerCaseMapping:0x01F3 + ,simpleTitleCaseMapping:0x01F2 + }, + { code:0x01F4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01F4 + ,simpleLowerCaseMapping:0x01F5 + ,simpleTitleCaseMapping:0x01F4 + }, + { code:0x01F5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01F4 + ,simpleLowerCaseMapping:0x01F5 + ,simpleTitleCaseMapping:0x01F4 + }, + { code:0x01F6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01F6 + ,simpleLowerCaseMapping:0x0195 + ,simpleTitleCaseMapping:0x01F6 + }, + { code:0x01F7 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01F7 + ,simpleLowerCaseMapping:0x01BF + ,simpleTitleCaseMapping:0x01F7 + }, + { code:0x01F8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01F8 + ,simpleLowerCaseMapping:0x01F9 + ,simpleTitleCaseMapping:0x01F8 + }, + { code:0x01F9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01F8 + ,simpleLowerCaseMapping:0x01F9 + ,simpleTitleCaseMapping:0x01F8 + }, + { code:0x01FA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01FA + ,simpleLowerCaseMapping:0x01FB + ,simpleTitleCaseMapping:0x01FA + }, + { code:0x01FB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01FA + ,simpleLowerCaseMapping:0x01FB + ,simpleTitleCaseMapping:0x01FA + }, + { code:0x01FC + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01FC + ,simpleLowerCaseMapping:0x01FD + ,simpleTitleCaseMapping:0x01FC + }, + { code:0x01FD + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01FC + ,simpleLowerCaseMapping:0x01FD + ,simpleTitleCaseMapping:0x01FC + }, + { code:0x01FE + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x01FE + ,simpleLowerCaseMapping:0x01FF + ,simpleTitleCaseMapping:0x01FE + }, + { code:0x01FF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01FE + ,simpleLowerCaseMapping:0x01FF + ,simpleTitleCaseMapping:0x01FE + }, + { code:0x0200 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0200 + ,simpleLowerCaseMapping:0x0201 + ,simpleTitleCaseMapping:0x0200 + }, + { code:0x0201 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0200 + ,simpleLowerCaseMapping:0x0201 + ,simpleTitleCaseMapping:0x0200 + }, + { code:0x0202 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0202 + ,simpleLowerCaseMapping:0x0203 + ,simpleTitleCaseMapping:0x0202 + }, + { code:0x0203 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0202 + ,simpleLowerCaseMapping:0x0203 + ,simpleTitleCaseMapping:0x0202 + }, + { code:0x0204 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0204 + ,simpleLowerCaseMapping:0x0205 + ,simpleTitleCaseMapping:0x0204 + }, + { code:0x0205 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0204 + ,simpleLowerCaseMapping:0x0205 + ,simpleTitleCaseMapping:0x0204 + }, + { code:0x0206 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0206 + ,simpleLowerCaseMapping:0x0207 + ,simpleTitleCaseMapping:0x0206 + }, + { code:0x0207 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0206 + ,simpleLowerCaseMapping:0x0207 + ,simpleTitleCaseMapping:0x0206 + }, + { code:0x0208 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0208 + ,simpleLowerCaseMapping:0x0209 + ,simpleTitleCaseMapping:0x0208 + }, + { code:0x0209 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0208 + ,simpleLowerCaseMapping:0x0209 + ,simpleTitleCaseMapping:0x0208 + }, + { code:0x020A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x020A + ,simpleLowerCaseMapping:0x020B + ,simpleTitleCaseMapping:0x020A + }, + { code:0x020B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x020A + ,simpleLowerCaseMapping:0x020B + ,simpleTitleCaseMapping:0x020A + }, + { code:0x020C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x020C + ,simpleLowerCaseMapping:0x020D + ,simpleTitleCaseMapping:0x020C + }, + { code:0x020D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x020C + ,simpleLowerCaseMapping:0x020D + ,simpleTitleCaseMapping:0x020C + }, + { code:0x020E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x020E + ,simpleLowerCaseMapping:0x020F + ,simpleTitleCaseMapping:0x020E + }, + { code:0x020F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x020E + ,simpleLowerCaseMapping:0x020F + ,simpleTitleCaseMapping:0x020E + }, + { code:0x0210 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0210 + ,simpleLowerCaseMapping:0x0211 + ,simpleTitleCaseMapping:0x0210 + }, + { code:0x0211 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0210 + ,simpleLowerCaseMapping:0x0211 + ,simpleTitleCaseMapping:0x0210 + }, + { code:0x0212 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0212 + ,simpleLowerCaseMapping:0x0213 + ,simpleTitleCaseMapping:0x0212 + }, + { code:0x0213 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0212 + ,simpleLowerCaseMapping:0x0213 + ,simpleTitleCaseMapping:0x0212 + }, + { code:0x0214 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0214 + ,simpleLowerCaseMapping:0x0215 + ,simpleTitleCaseMapping:0x0214 + }, + { code:0x0215 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0214 + ,simpleLowerCaseMapping:0x0215 + ,simpleTitleCaseMapping:0x0214 + }, + { code:0x0216 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0216 + ,simpleLowerCaseMapping:0x0217 + ,simpleTitleCaseMapping:0x0216 + }, + { code:0x0217 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0216 + ,simpleLowerCaseMapping:0x0217 + ,simpleTitleCaseMapping:0x0216 + }, + { code:0x0218 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0218 + ,simpleLowerCaseMapping:0x0219 + ,simpleTitleCaseMapping:0x0218 + }, + { code:0x0219 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0218 + ,simpleLowerCaseMapping:0x0219 + ,simpleTitleCaseMapping:0x0218 + }, + { code:0x021A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x021A + ,simpleLowerCaseMapping:0x021B + ,simpleTitleCaseMapping:0x021A + }, + { code:0x021B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x021A + ,simpleLowerCaseMapping:0x021B + ,simpleTitleCaseMapping:0x021A + }, + { code:0x021C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x021C + ,simpleLowerCaseMapping:0x021D + ,simpleTitleCaseMapping:0x021C + }, + { code:0x021D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x021C + ,simpleLowerCaseMapping:0x021D + ,simpleTitleCaseMapping:0x021C + }, + { code:0x021E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x021E + ,simpleLowerCaseMapping:0x021F + ,simpleTitleCaseMapping:0x021E + }, + { code:0x021F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x021E + ,simpleLowerCaseMapping:0x021F + ,simpleTitleCaseMapping:0x021E + }, + { code:0x0220 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0220 + ,simpleLowerCaseMapping:0x019E + ,simpleTitleCaseMapping:0x0220 + }, + { code:0x0221 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0221 + ,simpleLowerCaseMapping:0x0221 + ,simpleTitleCaseMapping:0x0221 + }, + { code:0x0222 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0222 + ,simpleLowerCaseMapping:0x0223 + ,simpleTitleCaseMapping:0x0222 + }, + { code:0x0223 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0222 + ,simpleLowerCaseMapping:0x0223 + ,simpleTitleCaseMapping:0x0222 + }, + { code:0x0224 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0224 + ,simpleLowerCaseMapping:0x0225 + ,simpleTitleCaseMapping:0x0224 + }, + { code:0x0225 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0224 + ,simpleLowerCaseMapping:0x0225 + ,simpleTitleCaseMapping:0x0224 + }, + { code:0x0226 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0226 + ,simpleLowerCaseMapping:0x0227 + ,simpleTitleCaseMapping:0x0226 + }, + { code:0x0227 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0226 + ,simpleLowerCaseMapping:0x0227 + ,simpleTitleCaseMapping:0x0226 + }, + { code:0x0228 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0228 + ,simpleLowerCaseMapping:0x0229 + ,simpleTitleCaseMapping:0x0228 + }, + { code:0x0229 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0228 + ,simpleLowerCaseMapping:0x0229 + ,simpleTitleCaseMapping:0x0228 + }, + { code:0x022A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x022A + ,simpleLowerCaseMapping:0x022B + ,simpleTitleCaseMapping:0x022A + }, + { code:0x022B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x022A + ,simpleLowerCaseMapping:0x022B + ,simpleTitleCaseMapping:0x022A + }, + { code:0x022C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x022C + ,simpleLowerCaseMapping:0x022D + ,simpleTitleCaseMapping:0x022C + }, + { code:0x022D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x022C + ,simpleLowerCaseMapping:0x022D + ,simpleTitleCaseMapping:0x022C + }, + { code:0x022E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x022E + ,simpleLowerCaseMapping:0x022F + ,simpleTitleCaseMapping:0x022E + }, + { code:0x022F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x022E + ,simpleLowerCaseMapping:0x022F + ,simpleTitleCaseMapping:0x022E + }, + { code:0x0230 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0230 + ,simpleLowerCaseMapping:0x0231 + ,simpleTitleCaseMapping:0x0230 + }, + { code:0x0231 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0230 + ,simpleLowerCaseMapping:0x0231 + ,simpleTitleCaseMapping:0x0230 + }, + { code:0x0232 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0232 + ,simpleLowerCaseMapping:0x0233 + ,simpleTitleCaseMapping:0x0232 + }, + { code:0x0233 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0232 + ,simpleLowerCaseMapping:0x0233 + ,simpleTitleCaseMapping:0x0232 + }, + { code:0x0234 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0234 + ,simpleLowerCaseMapping:0x0234 + ,simpleTitleCaseMapping:0x0234 + }, + { code:0x0235 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0235 + ,simpleLowerCaseMapping:0x0235 + ,simpleTitleCaseMapping:0x0235 + }, + { code:0x0236 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0236 + ,simpleLowerCaseMapping:0x0236 + ,simpleTitleCaseMapping:0x0236 + }, + { code:0x0237 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0237 + ,simpleLowerCaseMapping:0x0237 + ,simpleTitleCaseMapping:0x0237 + }, + { code:0x0238 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0238 + ,simpleLowerCaseMapping:0x0238 + ,simpleTitleCaseMapping:0x0238 + }, + { code:0x0239 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0239 + ,simpleLowerCaseMapping:0x0239 + ,simpleTitleCaseMapping:0x0239 + }, + { code:0x023A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x023A + ,simpleLowerCaseMapping:0x2C65 + ,simpleTitleCaseMapping:0x023A + }, + { code:0x023B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x023B + ,simpleLowerCaseMapping:0x023C + ,simpleTitleCaseMapping:0x023B + }, + { code:0x023C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x023B + ,simpleLowerCaseMapping:0x023C + ,simpleTitleCaseMapping:0x023B + }, + { code:0x023D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x023D + ,simpleLowerCaseMapping:0x019A + ,simpleTitleCaseMapping:0x023D + }, + { code:0x023E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x023E + ,simpleLowerCaseMapping:0x2C66 + ,simpleTitleCaseMapping:0x023E + }, + { code:0x023F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x023F + ,simpleLowerCaseMapping:0x023F + ,simpleTitleCaseMapping:0x023F + }, + { code:0x0240 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0240 + ,simpleLowerCaseMapping:0x0240 + ,simpleTitleCaseMapping:0x0240 + }, + { code:0x0241 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0241 + ,simpleLowerCaseMapping:0x0242 + ,simpleTitleCaseMapping:0x0241 + }, + { code:0x0242 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0241 + ,simpleLowerCaseMapping:0x0242 + ,simpleTitleCaseMapping:0x0241 + }, + { code:0x0243 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0243 + ,simpleLowerCaseMapping:0x0180 + ,simpleTitleCaseMapping:0x0243 + }, + { code:0x0244 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0244 + ,simpleLowerCaseMapping:0x0289 + ,simpleTitleCaseMapping:0x0244 + }, + { code:0x0245 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0245 + ,simpleLowerCaseMapping:0x028C + ,simpleTitleCaseMapping:0x0245 + }, + { code:0x0246 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0246 + ,simpleLowerCaseMapping:0x0247 + ,simpleTitleCaseMapping:0x0246 + }, + { code:0x0247 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0246 + ,simpleLowerCaseMapping:0x0247 + ,simpleTitleCaseMapping:0x0246 + }, + { code:0x0248 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0248 + ,simpleLowerCaseMapping:0x0249 + ,simpleTitleCaseMapping:0x0248 + }, + { code:0x0249 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0248 + ,simpleLowerCaseMapping:0x0249 + ,simpleTitleCaseMapping:0x0248 + }, + { code:0x024A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x024A + ,simpleLowerCaseMapping:0x024B + ,simpleTitleCaseMapping:0x024A + }, + { code:0x024B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x024A + ,simpleLowerCaseMapping:0x024B + ,simpleTitleCaseMapping:0x024A + }, + { code:0x024C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x024C + ,simpleLowerCaseMapping:0x024D + ,simpleTitleCaseMapping:0x024C + }, + { code:0x024D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x024C + ,simpleLowerCaseMapping:0x024D + ,simpleTitleCaseMapping:0x024C + }, + { code:0x024E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x024E + ,simpleLowerCaseMapping:0x024F + ,simpleTitleCaseMapping:0x024E + }, + { code:0x024F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x024E + ,simpleLowerCaseMapping:0x024F + ,simpleTitleCaseMapping:0x024E + }, + { code:0x0250 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0250 + ,simpleLowerCaseMapping:0x0250 + ,simpleTitleCaseMapping:0x0250 + }, + { code:0x0251 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0251 + ,simpleLowerCaseMapping:0x0251 + ,simpleTitleCaseMapping:0x0251 + }, + { code:0x0252 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0252 + ,simpleLowerCaseMapping:0x0252 + ,simpleTitleCaseMapping:0x0252 + }, + { code:0x0253 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0181 + ,simpleLowerCaseMapping:0x0253 + ,simpleTitleCaseMapping:0x0181 + }, + { code:0x0254 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0186 + ,simpleLowerCaseMapping:0x0254 + ,simpleTitleCaseMapping:0x0186 + }, + { code:0x0255 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0255 + ,simpleLowerCaseMapping:0x0255 + ,simpleTitleCaseMapping:0x0255 + }, + { code:0x0256 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0189 + ,simpleLowerCaseMapping:0x0256 + ,simpleTitleCaseMapping:0x0189 + }, + { code:0x0257 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x018A + ,simpleLowerCaseMapping:0x0257 + ,simpleTitleCaseMapping:0x018A + }, + { code:0x0258 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0258 + ,simpleLowerCaseMapping:0x0258 + ,simpleTitleCaseMapping:0x0258 + }, + { code:0x0259 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x018F + ,simpleLowerCaseMapping:0x0259 + ,simpleTitleCaseMapping:0x018F + }, + { code:0x025A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x025A + ,simpleLowerCaseMapping:0x025A + ,simpleTitleCaseMapping:0x025A + }, + { code:0x025B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0190 + ,simpleLowerCaseMapping:0x025B + ,simpleTitleCaseMapping:0x0190 + }, + { code:0x025C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x025C + ,simpleLowerCaseMapping:0x025C + ,simpleTitleCaseMapping:0x025C + }, + { code:0x025D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x025D + ,simpleLowerCaseMapping:0x025D + ,simpleTitleCaseMapping:0x025D + }, + { code:0x025E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x025E + ,simpleLowerCaseMapping:0x025E + ,simpleTitleCaseMapping:0x025E + }, + { code:0x025F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x025F + ,simpleLowerCaseMapping:0x025F + ,simpleTitleCaseMapping:0x025F + }, + { code:0x0260 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0193 + ,simpleLowerCaseMapping:0x0260 + ,simpleTitleCaseMapping:0x0193 + }, + { code:0x0261 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0261 + ,simpleLowerCaseMapping:0x0261 + ,simpleTitleCaseMapping:0x0261 + }, + { code:0x0262 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0262 + ,simpleLowerCaseMapping:0x0262 + ,simpleTitleCaseMapping:0x0262 + }, + { code:0x0263 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0194 + ,simpleLowerCaseMapping:0x0263 + ,simpleTitleCaseMapping:0x0194 + }, + { code:0x0264 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0264 + ,simpleLowerCaseMapping:0x0264 + ,simpleTitleCaseMapping:0x0264 + }, + { code:0x0265 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0265 + ,simpleLowerCaseMapping:0x0265 + ,simpleTitleCaseMapping:0x0265 + }, + { code:0x0266 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0266 + ,simpleLowerCaseMapping:0x0266 + ,simpleTitleCaseMapping:0x0266 + }, + { code:0x0267 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0267 + ,simpleLowerCaseMapping:0x0267 + ,simpleTitleCaseMapping:0x0267 + }, + { code:0x0268 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0197 + ,simpleLowerCaseMapping:0x0268 + ,simpleTitleCaseMapping:0x0197 + }, + { code:0x0269 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0196 + ,simpleLowerCaseMapping:0x0269 + ,simpleTitleCaseMapping:0x0196 + }, + { code:0x026A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x026A + ,simpleLowerCaseMapping:0x026A + ,simpleTitleCaseMapping:0x026A + }, + { code:0x026B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C62 + ,simpleLowerCaseMapping:0x026B + ,simpleTitleCaseMapping:0x2C62 + }, + { code:0x026C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x026C + ,simpleLowerCaseMapping:0x026C + ,simpleTitleCaseMapping:0x026C + }, + { code:0x026D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x026D + ,simpleLowerCaseMapping:0x026D + ,simpleTitleCaseMapping:0x026D + }, + { code:0x026E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x026E + ,simpleLowerCaseMapping:0x026E + ,simpleTitleCaseMapping:0x026E + }, + { code:0x026F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x019C + ,simpleLowerCaseMapping:0x026F + ,simpleTitleCaseMapping:0x019C + }, + { code:0x0270 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0270 + ,simpleLowerCaseMapping:0x0270 + ,simpleTitleCaseMapping:0x0270 + }, + { code:0x0271 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0271 + ,simpleLowerCaseMapping:0x0271 + ,simpleTitleCaseMapping:0x0271 + }, + { code:0x0272 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x019D + ,simpleLowerCaseMapping:0x0272 + ,simpleTitleCaseMapping:0x019D + }, + { code:0x0273 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0273 + ,simpleLowerCaseMapping:0x0273 + ,simpleTitleCaseMapping:0x0273 + }, + { code:0x0274 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0274 + ,simpleLowerCaseMapping:0x0274 + ,simpleTitleCaseMapping:0x0274 + }, + { code:0x0275 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x019F + ,simpleLowerCaseMapping:0x0275 + ,simpleTitleCaseMapping:0x019F + }, + { code:0x0276 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0276 + ,simpleLowerCaseMapping:0x0276 + ,simpleTitleCaseMapping:0x0276 + }, + { code:0x0277 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0277 + ,simpleLowerCaseMapping:0x0277 + ,simpleTitleCaseMapping:0x0277 + }, + { code:0x0278 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0278 + ,simpleLowerCaseMapping:0x0278 + ,simpleTitleCaseMapping:0x0278 + }, + { code:0x0279 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0279 + ,simpleLowerCaseMapping:0x0279 + ,simpleTitleCaseMapping:0x0279 + }, + { code:0x027A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x027A + ,simpleLowerCaseMapping:0x027A + ,simpleTitleCaseMapping:0x027A + }, + { code:0x027B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x027B + ,simpleLowerCaseMapping:0x027B + ,simpleTitleCaseMapping:0x027B + }, + { code:0x027C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x027C + ,simpleLowerCaseMapping:0x027C + ,simpleTitleCaseMapping:0x027C + }, + { code:0x027D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C64 + ,simpleLowerCaseMapping:0x027D + ,simpleTitleCaseMapping:0x2C64 + }, + { code:0x027E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x027E + ,simpleLowerCaseMapping:0x027E + ,simpleTitleCaseMapping:0x027E + }, + { code:0x027F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x027F + ,simpleLowerCaseMapping:0x027F + ,simpleTitleCaseMapping:0x027F + }, + { code:0x0280 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01A6 + ,simpleLowerCaseMapping:0x0280 + ,simpleTitleCaseMapping:0x01A6 + }, + { code:0x0281 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0281 + ,simpleLowerCaseMapping:0x0281 + ,simpleTitleCaseMapping:0x0281 + }, + { code:0x0282 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0282 + ,simpleLowerCaseMapping:0x0282 + ,simpleTitleCaseMapping:0x0282 + }, + { code:0x0283 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01A9 + ,simpleLowerCaseMapping:0x0283 + ,simpleTitleCaseMapping:0x01A9 + }, + { code:0x0284 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0284 + ,simpleLowerCaseMapping:0x0284 + ,simpleTitleCaseMapping:0x0284 + }, + { code:0x0285 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0285 + ,simpleLowerCaseMapping:0x0285 + ,simpleTitleCaseMapping:0x0285 + }, + { code:0x0286 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0286 + ,simpleLowerCaseMapping:0x0286 + ,simpleTitleCaseMapping:0x0286 + }, + { code:0x0287 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0287 + ,simpleLowerCaseMapping:0x0287 + ,simpleTitleCaseMapping:0x0287 + }, + { code:0x0288 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01AE + ,simpleLowerCaseMapping:0x0288 + ,simpleTitleCaseMapping:0x01AE + }, + { code:0x0289 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0244 + ,simpleLowerCaseMapping:0x0289 + ,simpleTitleCaseMapping:0x0244 + }, + { code:0x028A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01B1 + ,simpleLowerCaseMapping:0x028A + ,simpleTitleCaseMapping:0x01B1 + }, + { code:0x028B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01B2 + ,simpleLowerCaseMapping:0x028B + ,simpleTitleCaseMapping:0x01B2 + }, + { code:0x028C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0245 + ,simpleLowerCaseMapping:0x028C + ,simpleTitleCaseMapping:0x0245 + }, + { code:0x028D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x028D + ,simpleLowerCaseMapping:0x028D + ,simpleTitleCaseMapping:0x028D + }, + { code:0x028E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x028E + ,simpleLowerCaseMapping:0x028E + ,simpleTitleCaseMapping:0x028E + }, + { code:0x028F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x028F + ,simpleLowerCaseMapping:0x028F + ,simpleTitleCaseMapping:0x028F + }, + { code:0x0290 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0290 + ,simpleLowerCaseMapping:0x0290 + ,simpleTitleCaseMapping:0x0290 + }, + { code:0x0291 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0291 + ,simpleLowerCaseMapping:0x0291 + ,simpleTitleCaseMapping:0x0291 + }, + { code:0x0292 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x01B7 + ,simpleLowerCaseMapping:0x0292 + ,simpleTitleCaseMapping:0x01B7 + }, + { code:0x0293 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0293 + ,simpleLowerCaseMapping:0x0293 + ,simpleTitleCaseMapping:0x0293 + }, + { code:0x0294 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0294 + ,simpleLowerCaseMapping:0x0294 + ,simpleTitleCaseMapping:0x0294 + }, + { code:0x0295 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0295 + ,simpleLowerCaseMapping:0x0295 + ,simpleTitleCaseMapping:0x0295 + }, + { code:0x0296 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0296 + ,simpleLowerCaseMapping:0x0296 + ,simpleTitleCaseMapping:0x0296 + }, + { code:0x0297 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0297 + ,simpleLowerCaseMapping:0x0297 + ,simpleTitleCaseMapping:0x0297 + }, + { code:0x0298 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0298 + ,simpleLowerCaseMapping:0x0298 + ,simpleTitleCaseMapping:0x0298 + }, + { code:0x0299 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0299 + ,simpleLowerCaseMapping:0x0299 + ,simpleTitleCaseMapping:0x0299 + }, + { code:0x029A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x029A + ,simpleLowerCaseMapping:0x029A + ,simpleTitleCaseMapping:0x029A + }, + { code:0x029B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x029B + ,simpleLowerCaseMapping:0x029B + ,simpleTitleCaseMapping:0x029B + }, + { code:0x029C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x029C + ,simpleLowerCaseMapping:0x029C + ,simpleTitleCaseMapping:0x029C + }, + { code:0x029D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x029D + ,simpleLowerCaseMapping:0x029D + ,simpleTitleCaseMapping:0x029D + }, + { code:0x029E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x029E + ,simpleLowerCaseMapping:0x029E + ,simpleTitleCaseMapping:0x029E + }, + { code:0x029F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x029F + ,simpleLowerCaseMapping:0x029F + ,simpleTitleCaseMapping:0x029F + }, + { code:0x02A0 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x02A0 + ,simpleLowerCaseMapping:0x02A0 + ,simpleTitleCaseMapping:0x02A0 + }, + { code:0x02A1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x02A1 + ,simpleLowerCaseMapping:0x02A1 + ,simpleTitleCaseMapping:0x02A1 + }, + { code:0x02A2 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x02A2 + ,simpleLowerCaseMapping:0x02A2 + ,simpleTitleCaseMapping:0x02A2 + }, + { code:0x02A3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x02A3 + ,simpleLowerCaseMapping:0x02A3 + ,simpleTitleCaseMapping:0x02A3 + }, + { code:0x02A4 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x02A4 + ,simpleLowerCaseMapping:0x02A4 + ,simpleTitleCaseMapping:0x02A4 + }, + { code:0x02A5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x02A5 + ,simpleLowerCaseMapping:0x02A5 + ,simpleTitleCaseMapping:0x02A5 + }, + { code:0x02A6 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x02A6 + ,simpleLowerCaseMapping:0x02A6 + ,simpleTitleCaseMapping:0x02A6 + }, + { code:0x02A7 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x02A7 + ,simpleLowerCaseMapping:0x02A7 + ,simpleTitleCaseMapping:0x02A7 + }, + { code:0x02A8 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x02A8 + ,simpleLowerCaseMapping:0x02A8 + ,simpleTitleCaseMapping:0x02A8 + }, + { code:0x02A9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x02A9 + ,simpleLowerCaseMapping:0x02A9 + ,simpleTitleCaseMapping:0x02A9 + }, + { code:0x02AA + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x02AA + ,simpleLowerCaseMapping:0x02AA + ,simpleTitleCaseMapping:0x02AA + }, + { code:0x02AB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x02AB + ,simpleLowerCaseMapping:0x02AB + ,simpleTitleCaseMapping:0x02AB + }, + { code:0x02AC + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x02AC + ,simpleLowerCaseMapping:0x02AC + ,simpleTitleCaseMapping:0x02AC + }, + { code:0x02AD + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x02AD + ,simpleLowerCaseMapping:0x02AD + ,simpleTitleCaseMapping:0x02AD + }, + { code:0x02AE + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x02AE + ,simpleLowerCaseMapping:0x02AE + ,simpleTitleCaseMapping:0x02AE + }, + { code:0x02AF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x02AF + ,simpleLowerCaseMapping:0x02AF + ,simpleTitleCaseMapping:0x02AF + }, + { code:0x02B0 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02B0 + ,simpleLowerCaseMapping:0x02B0 + ,simpleTitleCaseMapping:0x02B0 + }, + { code:0x02B1 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02B1 + ,simpleLowerCaseMapping:0x02B1 + ,simpleTitleCaseMapping:0x02B1 + }, + { code:0x02B2 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02B2 + ,simpleLowerCaseMapping:0x02B2 + ,simpleTitleCaseMapping:0x02B2 + }, + { code:0x02B3 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02B3 + ,simpleLowerCaseMapping:0x02B3 + ,simpleTitleCaseMapping:0x02B3 + }, + { code:0x02B4 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02B4 + ,simpleLowerCaseMapping:0x02B4 + ,simpleTitleCaseMapping:0x02B4 + }, + { code:0x02B5 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02B5 + ,simpleLowerCaseMapping:0x02B5 + ,simpleTitleCaseMapping:0x02B5 + }, + { code:0x02B6 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02B6 + ,simpleLowerCaseMapping:0x02B6 + ,simpleTitleCaseMapping:0x02B6 + }, + { code:0x02B7 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02B7 + ,simpleLowerCaseMapping:0x02B7 + ,simpleTitleCaseMapping:0x02B7 + }, + { code:0x02B8 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02B8 + ,simpleLowerCaseMapping:0x02B8 + ,simpleTitleCaseMapping:0x02B8 + }, + { code:0x02B9 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02B9 + ,simpleLowerCaseMapping:0x02B9 + ,simpleTitleCaseMapping:0x02B9 + }, + { code:0x02BA + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02BA + ,simpleLowerCaseMapping:0x02BA + ,simpleTitleCaseMapping:0x02BA + }, + { code:0x02BB + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02BB + ,simpleLowerCaseMapping:0x02BB + ,simpleTitleCaseMapping:0x02BB + }, + { code:0x02BC + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02BC + ,simpleLowerCaseMapping:0x02BC + ,simpleTitleCaseMapping:0x02BC + }, + { code:0x02BD + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02BD + ,simpleLowerCaseMapping:0x02BD + ,simpleTitleCaseMapping:0x02BD + }, + { code:0x02BE + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02BE + ,simpleLowerCaseMapping:0x02BE + ,simpleTitleCaseMapping:0x02BE + }, + { code:0x02BF + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02BF + ,simpleLowerCaseMapping:0x02BF + ,simpleTitleCaseMapping:0x02BF + }, + { code:0x02C0 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02C0 + ,simpleLowerCaseMapping:0x02C0 + ,simpleTitleCaseMapping:0x02C0 + }, + { code:0x02C1 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02C1 + ,simpleLowerCaseMapping:0x02C1 + ,simpleTitleCaseMapping:0x02C1 + }, + { code:0x02C2 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02C2 + ,simpleLowerCaseMapping:0x02C2 + ,simpleTitleCaseMapping:0x02C2 + }, + { code:0x02C3 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02C3 + ,simpleLowerCaseMapping:0x02C3 + ,simpleTitleCaseMapping:0x02C3 + }, + { code:0x02C4 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02C4 + ,simpleLowerCaseMapping:0x02C4 + ,simpleTitleCaseMapping:0x02C4 + }, + { code:0x02C5 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02C5 + ,simpleLowerCaseMapping:0x02C5 + ,simpleTitleCaseMapping:0x02C5 + }, + { code:0x02C6 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02C6 + ,simpleLowerCaseMapping:0x02C6 + ,simpleTitleCaseMapping:0x02C6 + }, + { code:0x02C7 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02C7 + ,simpleLowerCaseMapping:0x02C7 + ,simpleTitleCaseMapping:0x02C7 + }, + { code:0x02C8 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02C8 + ,simpleLowerCaseMapping:0x02C8 + ,simpleTitleCaseMapping:0x02C8 + }, + { code:0x02C9 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02C9 + ,simpleLowerCaseMapping:0x02C9 + ,simpleTitleCaseMapping:0x02C9 + }, + { code:0x02CA + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02CA + ,simpleLowerCaseMapping:0x02CA + ,simpleTitleCaseMapping:0x02CA + }, + { code:0x02CB + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02CB + ,simpleLowerCaseMapping:0x02CB + ,simpleTitleCaseMapping:0x02CB + }, + { code:0x02CC + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02CC + ,simpleLowerCaseMapping:0x02CC + ,simpleTitleCaseMapping:0x02CC + }, + { code:0x02CD + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02CD + ,simpleLowerCaseMapping:0x02CD + ,simpleTitleCaseMapping:0x02CD + }, + { code:0x02CE + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02CE + ,simpleLowerCaseMapping:0x02CE + ,simpleTitleCaseMapping:0x02CE + }, + { code:0x02CF + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02CF + ,simpleLowerCaseMapping:0x02CF + ,simpleTitleCaseMapping:0x02CF + }, + { code:0x02D0 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02D0 + ,simpleLowerCaseMapping:0x02D0 + ,simpleTitleCaseMapping:0x02D0 + }, + { code:0x02D1 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02D1 + ,simpleLowerCaseMapping:0x02D1 + ,simpleTitleCaseMapping:0x02D1 + }, + { code:0x02D2 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02D2 + ,simpleLowerCaseMapping:0x02D2 + ,simpleTitleCaseMapping:0x02D2 + }, + { code:0x02D3 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02D3 + ,simpleLowerCaseMapping:0x02D3 + ,simpleTitleCaseMapping:0x02D3 + }, + { code:0x02D4 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02D4 + ,simpleLowerCaseMapping:0x02D4 + ,simpleTitleCaseMapping:0x02D4 + }, + { code:0x02D5 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02D5 + ,simpleLowerCaseMapping:0x02D5 + ,simpleTitleCaseMapping:0x02D5 + }, + { code:0x02D6 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02D6 + ,simpleLowerCaseMapping:0x02D6 + ,simpleTitleCaseMapping:0x02D6 + }, + { code:0x02D7 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02D7 + ,simpleLowerCaseMapping:0x02D7 + ,simpleTitleCaseMapping:0x02D7 + }, + { code:0x02D8 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02D8 + ,simpleLowerCaseMapping:0x02D8 + ,simpleTitleCaseMapping:0x02D8 + }, + { code:0x02D9 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02D9 + ,simpleLowerCaseMapping:0x02D9 + ,simpleTitleCaseMapping:0x02D9 + }, + { code:0x02DA + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02DA + ,simpleLowerCaseMapping:0x02DA + ,simpleTitleCaseMapping:0x02DA + }, + { code:0x02DB + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02DB + ,simpleLowerCaseMapping:0x02DB + ,simpleTitleCaseMapping:0x02DB + }, + { code:0x02DC + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02DC + ,simpleLowerCaseMapping:0x02DC + ,simpleTitleCaseMapping:0x02DC + }, + { code:0x02DD + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02DD + ,simpleLowerCaseMapping:0x02DD + ,simpleTitleCaseMapping:0x02DD + }, + { code:0x02DE + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02DE + ,simpleLowerCaseMapping:0x02DE + ,simpleTitleCaseMapping:0x02DE + }, + { code:0x02DF + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02DF + ,simpleLowerCaseMapping:0x02DF + ,simpleTitleCaseMapping:0x02DF + }, + { code:0x02E0 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02E0 + ,simpleLowerCaseMapping:0x02E0 + ,simpleTitleCaseMapping:0x02E0 + }, + { code:0x02E1 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02E1 + ,simpleLowerCaseMapping:0x02E1 + ,simpleTitleCaseMapping:0x02E1 + }, + { code:0x02E2 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02E2 + ,simpleLowerCaseMapping:0x02E2 + ,simpleTitleCaseMapping:0x02E2 + }, + { code:0x02E3 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02E3 + ,simpleLowerCaseMapping:0x02E3 + ,simpleTitleCaseMapping:0x02E3 + }, + { code:0x02E4 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02E4 + ,simpleLowerCaseMapping:0x02E4 + ,simpleTitleCaseMapping:0x02E4 + }, + { code:0x02E5 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02E5 + ,simpleLowerCaseMapping:0x02E5 + ,simpleTitleCaseMapping:0x02E5 + }, + { code:0x02E6 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02E6 + ,simpleLowerCaseMapping:0x02E6 + ,simpleTitleCaseMapping:0x02E6 + }, + { code:0x02E7 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02E7 + ,simpleLowerCaseMapping:0x02E7 + ,simpleTitleCaseMapping:0x02E7 + }, + { code:0x02E8 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02E8 + ,simpleLowerCaseMapping:0x02E8 + ,simpleTitleCaseMapping:0x02E8 + }, + { code:0x02E9 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02E9 + ,simpleLowerCaseMapping:0x02E9 + ,simpleTitleCaseMapping:0x02E9 + }, + { code:0x02EA + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02EA + ,simpleLowerCaseMapping:0x02EA + ,simpleTitleCaseMapping:0x02EA + }, + { code:0x02EB + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02EB + ,simpleLowerCaseMapping:0x02EB + ,simpleTitleCaseMapping:0x02EB + }, + { code:0x02EC + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02EC + ,simpleLowerCaseMapping:0x02EC + ,simpleTitleCaseMapping:0x02EC + }, + { code:0x02ED + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02ED + ,simpleLowerCaseMapping:0x02ED + ,simpleTitleCaseMapping:0x02ED + }, + { code:0x02EE + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x02EE + ,simpleLowerCaseMapping:0x02EE + ,simpleTitleCaseMapping:0x02EE + }, + { code:0x02EF + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02EF + ,simpleLowerCaseMapping:0x02EF + ,simpleTitleCaseMapping:0x02EF + }, + { code:0x02F0 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02F0 + ,simpleLowerCaseMapping:0x02F0 + ,simpleTitleCaseMapping:0x02F0 + }, + { code:0x02F1 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02F1 + ,simpleLowerCaseMapping:0x02F1 + ,simpleTitleCaseMapping:0x02F1 + }, + { code:0x02F2 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02F2 + ,simpleLowerCaseMapping:0x02F2 + ,simpleTitleCaseMapping:0x02F2 + }, + { code:0x02F3 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02F3 + ,simpleLowerCaseMapping:0x02F3 + ,simpleTitleCaseMapping:0x02F3 + }, + { code:0x02F4 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02F4 + ,simpleLowerCaseMapping:0x02F4 + ,simpleTitleCaseMapping:0x02F4 + }, + { code:0x02F5 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02F5 + ,simpleLowerCaseMapping:0x02F5 + ,simpleTitleCaseMapping:0x02F5 + }, + { code:0x02F6 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02F6 + ,simpleLowerCaseMapping:0x02F6 + ,simpleTitleCaseMapping:0x02F6 + }, + { code:0x02F7 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02F7 + ,simpleLowerCaseMapping:0x02F7 + ,simpleTitleCaseMapping:0x02F7 + }, + { code:0x02F8 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02F8 + ,simpleLowerCaseMapping:0x02F8 + ,simpleTitleCaseMapping:0x02F8 + }, + { code:0x02F9 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02F9 + ,simpleLowerCaseMapping:0x02F9 + ,simpleTitleCaseMapping:0x02F9 + }, + { code:0x02FA + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02FA + ,simpleLowerCaseMapping:0x02FA + ,simpleTitleCaseMapping:0x02FA + }, + { code:0x02FB + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02FB + ,simpleLowerCaseMapping:0x02FB + ,simpleTitleCaseMapping:0x02FB + }, + { code:0x02FC + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02FC + ,simpleLowerCaseMapping:0x02FC + ,simpleTitleCaseMapping:0x02FC + }, + { code:0x02FD + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02FD + ,simpleLowerCaseMapping:0x02FD + ,simpleTitleCaseMapping:0x02FD + }, + { code:0x02FE + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02FE + ,simpleLowerCaseMapping:0x02FE + ,simpleTitleCaseMapping:0x02FE + }, + { code:0x02FF + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x02FF + ,simpleLowerCaseMapping:0x02FF + ,simpleTitleCaseMapping:0x02FF + }, + { code:0x0300 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0300 + ,simpleLowerCaseMapping:0x0300 + ,simpleTitleCaseMapping:0x0300 + }, + { code:0x0301 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0301 + ,simpleLowerCaseMapping:0x0301 + ,simpleTitleCaseMapping:0x0301 + }, + { code:0x0302 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0302 + ,simpleLowerCaseMapping:0x0302 + ,simpleTitleCaseMapping:0x0302 + }, + { code:0x0303 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0303 + ,simpleLowerCaseMapping:0x0303 + ,simpleTitleCaseMapping:0x0303 + }, + { code:0x0304 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0304 + ,simpleLowerCaseMapping:0x0304 + ,simpleTitleCaseMapping:0x0304 + }, + { code:0x0305 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0305 + ,simpleLowerCaseMapping:0x0305 + ,simpleTitleCaseMapping:0x0305 + }, + { code:0x0306 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0306 + ,simpleLowerCaseMapping:0x0306 + ,simpleTitleCaseMapping:0x0306 + }, + { code:0x0307 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0307 + ,simpleLowerCaseMapping:0x0307 + ,simpleTitleCaseMapping:0x0307 + }, + { code:0x0308 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0308 + ,simpleLowerCaseMapping:0x0308 + ,simpleTitleCaseMapping:0x0308 + }, + { code:0x0309 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0309 + ,simpleLowerCaseMapping:0x0309 + ,simpleTitleCaseMapping:0x0309 + }, + { code:0x030A + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x030A + ,simpleLowerCaseMapping:0x030A + ,simpleTitleCaseMapping:0x030A + }, + { code:0x030B + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x030B + ,simpleLowerCaseMapping:0x030B + ,simpleTitleCaseMapping:0x030B + }, + { code:0x030C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x030C + ,simpleLowerCaseMapping:0x030C + ,simpleTitleCaseMapping:0x030C + }, + { code:0x030D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x030D + ,simpleLowerCaseMapping:0x030D + ,simpleTitleCaseMapping:0x030D + }, + { code:0x030E + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x030E + ,simpleLowerCaseMapping:0x030E + ,simpleTitleCaseMapping:0x030E + }, + { code:0x030F + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x030F + ,simpleLowerCaseMapping:0x030F + ,simpleTitleCaseMapping:0x030F + }, + { code:0x0310 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0310 + ,simpleLowerCaseMapping:0x0310 + ,simpleTitleCaseMapping:0x0310 + }, + { code:0x0311 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0311 + ,simpleLowerCaseMapping:0x0311 + ,simpleTitleCaseMapping:0x0311 + }, + { code:0x0312 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0312 + ,simpleLowerCaseMapping:0x0312 + ,simpleTitleCaseMapping:0x0312 + }, + { code:0x0313 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0313 + ,simpleLowerCaseMapping:0x0313 + ,simpleTitleCaseMapping:0x0313 + }, + { code:0x0314 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0314 + ,simpleLowerCaseMapping:0x0314 + ,simpleTitleCaseMapping:0x0314 + }, + { code:0x0315 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0315 + ,simpleLowerCaseMapping:0x0315 + ,simpleTitleCaseMapping:0x0315 + }, + { code:0x0316 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0316 + ,simpleLowerCaseMapping:0x0316 + ,simpleTitleCaseMapping:0x0316 + }, + { code:0x0317 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0317 + ,simpleLowerCaseMapping:0x0317 + ,simpleTitleCaseMapping:0x0317 + }, + { code:0x0318 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0318 + ,simpleLowerCaseMapping:0x0318 + ,simpleTitleCaseMapping:0x0318 + }, + { code:0x0319 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0319 + ,simpleLowerCaseMapping:0x0319 + ,simpleTitleCaseMapping:0x0319 + }, + { code:0x031A + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x031A + ,simpleLowerCaseMapping:0x031A + ,simpleTitleCaseMapping:0x031A + }, + { code:0x031B + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x031B + ,simpleLowerCaseMapping:0x031B + ,simpleTitleCaseMapping:0x031B + }, + { code:0x031C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x031C + ,simpleLowerCaseMapping:0x031C + ,simpleTitleCaseMapping:0x031C + }, + { code:0x031D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x031D + ,simpleLowerCaseMapping:0x031D + ,simpleTitleCaseMapping:0x031D + }, + { code:0x031E + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x031E + ,simpleLowerCaseMapping:0x031E + ,simpleTitleCaseMapping:0x031E + }, + { code:0x031F + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x031F + ,simpleLowerCaseMapping:0x031F + ,simpleTitleCaseMapping:0x031F + }, + { code:0x0320 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0320 + ,simpleLowerCaseMapping:0x0320 + ,simpleTitleCaseMapping:0x0320 + }, + { code:0x0321 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0321 + ,simpleLowerCaseMapping:0x0321 + ,simpleTitleCaseMapping:0x0321 + }, + { code:0x0322 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0322 + ,simpleLowerCaseMapping:0x0322 + ,simpleTitleCaseMapping:0x0322 + }, + { code:0x0323 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0323 + ,simpleLowerCaseMapping:0x0323 + ,simpleTitleCaseMapping:0x0323 + }, + { code:0x0324 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0324 + ,simpleLowerCaseMapping:0x0324 + ,simpleTitleCaseMapping:0x0324 + }, + { code:0x0325 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0325 + ,simpleLowerCaseMapping:0x0325 + ,simpleTitleCaseMapping:0x0325 + }, + { code:0x0326 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0326 + ,simpleLowerCaseMapping:0x0326 + ,simpleTitleCaseMapping:0x0326 + }, + { code:0x0327 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0327 + ,simpleLowerCaseMapping:0x0327 + ,simpleTitleCaseMapping:0x0327 + }, + { code:0x0328 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0328 + ,simpleLowerCaseMapping:0x0328 + ,simpleTitleCaseMapping:0x0328 + }, + { code:0x0329 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0329 + ,simpleLowerCaseMapping:0x0329 + ,simpleTitleCaseMapping:0x0329 + }, + { code:0x032A + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x032A + ,simpleLowerCaseMapping:0x032A + ,simpleTitleCaseMapping:0x032A + }, + { code:0x032B + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x032B + ,simpleLowerCaseMapping:0x032B + ,simpleTitleCaseMapping:0x032B + }, + { code:0x032C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x032C + ,simpleLowerCaseMapping:0x032C + ,simpleTitleCaseMapping:0x032C + }, + { code:0x032D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x032D + ,simpleLowerCaseMapping:0x032D + ,simpleTitleCaseMapping:0x032D + }, + { code:0x032E + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x032E + ,simpleLowerCaseMapping:0x032E + ,simpleTitleCaseMapping:0x032E + }, + { code:0x032F + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x032F + ,simpleLowerCaseMapping:0x032F + ,simpleTitleCaseMapping:0x032F + }, + { code:0x0330 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0330 + ,simpleLowerCaseMapping:0x0330 + ,simpleTitleCaseMapping:0x0330 + }, + { code:0x0331 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0331 + ,simpleLowerCaseMapping:0x0331 + ,simpleTitleCaseMapping:0x0331 + }, + { code:0x0332 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0332 + ,simpleLowerCaseMapping:0x0332 + ,simpleTitleCaseMapping:0x0332 + }, + { code:0x0333 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0333 + ,simpleLowerCaseMapping:0x0333 + ,simpleTitleCaseMapping:0x0333 + }, + { code:0x0334 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0334 + ,simpleLowerCaseMapping:0x0334 + ,simpleTitleCaseMapping:0x0334 + }, + { code:0x0335 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0335 + ,simpleLowerCaseMapping:0x0335 + ,simpleTitleCaseMapping:0x0335 + }, + { code:0x0336 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0336 + ,simpleLowerCaseMapping:0x0336 + ,simpleTitleCaseMapping:0x0336 + }, + { code:0x0337 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0337 + ,simpleLowerCaseMapping:0x0337 + ,simpleTitleCaseMapping:0x0337 + }, + { code:0x0338 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0338 + ,simpleLowerCaseMapping:0x0338 + ,simpleTitleCaseMapping:0x0338 + }, + { code:0x0339 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0339 + ,simpleLowerCaseMapping:0x0339 + ,simpleTitleCaseMapping:0x0339 + }, + { code:0x033A + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x033A + ,simpleLowerCaseMapping:0x033A + ,simpleTitleCaseMapping:0x033A + }, + { code:0x033B + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x033B + ,simpleLowerCaseMapping:0x033B + ,simpleTitleCaseMapping:0x033B + }, + { code:0x033C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x033C + ,simpleLowerCaseMapping:0x033C + ,simpleTitleCaseMapping:0x033C + }, + { code:0x033D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x033D + ,simpleLowerCaseMapping:0x033D + ,simpleTitleCaseMapping:0x033D + }, + { code:0x033E + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x033E + ,simpleLowerCaseMapping:0x033E + ,simpleTitleCaseMapping:0x033E + }, + { code:0x033F + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x033F + ,simpleLowerCaseMapping:0x033F + ,simpleTitleCaseMapping:0x033F + }, + { code:0x0340 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0340 + ,simpleLowerCaseMapping:0x0340 + ,simpleTitleCaseMapping:0x0340 + }, + { code:0x0341 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0341 + ,simpleLowerCaseMapping:0x0341 + ,simpleTitleCaseMapping:0x0341 + }, + { code:0x0342 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0342 + ,simpleLowerCaseMapping:0x0342 + ,simpleTitleCaseMapping:0x0342 + }, + { code:0x0343 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0343 + ,simpleLowerCaseMapping:0x0343 + ,simpleTitleCaseMapping:0x0343 + }, + { code:0x0344 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0344 + ,simpleLowerCaseMapping:0x0344 + ,simpleTitleCaseMapping:0x0344 + }, + { code:0x0345 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0399 + ,simpleLowerCaseMapping:0x0345 + ,simpleTitleCaseMapping:0x0399 + }, + { code:0x0346 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0346 + ,simpleLowerCaseMapping:0x0346 + ,simpleTitleCaseMapping:0x0346 + }, + { code:0x0347 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0347 + ,simpleLowerCaseMapping:0x0347 + ,simpleTitleCaseMapping:0x0347 + }, + { code:0x0348 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0348 + ,simpleLowerCaseMapping:0x0348 + ,simpleTitleCaseMapping:0x0348 + }, + { code:0x0349 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0349 + ,simpleLowerCaseMapping:0x0349 + ,simpleTitleCaseMapping:0x0349 + }, + { code:0x034A + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x034A + ,simpleLowerCaseMapping:0x034A + ,simpleTitleCaseMapping:0x034A + }, + { code:0x034B + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x034B + ,simpleLowerCaseMapping:0x034B + ,simpleTitleCaseMapping:0x034B + }, + { code:0x034C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x034C + ,simpleLowerCaseMapping:0x034C + ,simpleTitleCaseMapping:0x034C + }, + { code:0x034D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x034D + ,simpleLowerCaseMapping:0x034D + ,simpleTitleCaseMapping:0x034D + }, + { code:0x034E + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x034E + ,simpleLowerCaseMapping:0x034E + ,simpleTitleCaseMapping:0x034E + }, + { code:0x034F + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x034F + ,simpleLowerCaseMapping:0x034F + ,simpleTitleCaseMapping:0x034F + }, + { code:0x0350 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0350 + ,simpleLowerCaseMapping:0x0350 + ,simpleTitleCaseMapping:0x0350 + }, + { code:0x0351 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0351 + ,simpleLowerCaseMapping:0x0351 + ,simpleTitleCaseMapping:0x0351 + }, + { code:0x0352 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0352 + ,simpleLowerCaseMapping:0x0352 + ,simpleTitleCaseMapping:0x0352 + }, + { code:0x0353 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0353 + ,simpleLowerCaseMapping:0x0353 + ,simpleTitleCaseMapping:0x0353 + }, + { code:0x0354 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0354 + ,simpleLowerCaseMapping:0x0354 + ,simpleTitleCaseMapping:0x0354 + }, + { code:0x0355 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0355 + ,simpleLowerCaseMapping:0x0355 + ,simpleTitleCaseMapping:0x0355 + }, + { code:0x0356 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0356 + ,simpleLowerCaseMapping:0x0356 + ,simpleTitleCaseMapping:0x0356 + }, + { code:0x0357 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0357 + ,simpleLowerCaseMapping:0x0357 + ,simpleTitleCaseMapping:0x0357 + }, + { code:0x0358 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0358 + ,simpleLowerCaseMapping:0x0358 + ,simpleTitleCaseMapping:0x0358 + }, + { code:0x0359 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0359 + ,simpleLowerCaseMapping:0x0359 + ,simpleTitleCaseMapping:0x0359 + }, + { code:0x035A + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x035A + ,simpleLowerCaseMapping:0x035A + ,simpleTitleCaseMapping:0x035A + }, + { code:0x035B + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x035B + ,simpleLowerCaseMapping:0x035B + ,simpleTitleCaseMapping:0x035B + }, + { code:0x035C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x035C + ,simpleLowerCaseMapping:0x035C + ,simpleTitleCaseMapping:0x035C + }, + { code:0x035D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x035D + ,simpleLowerCaseMapping:0x035D + ,simpleTitleCaseMapping:0x035D + }, + { code:0x035E + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x035E + ,simpleLowerCaseMapping:0x035E + ,simpleTitleCaseMapping:0x035E + }, + { code:0x035F + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x035F + ,simpleLowerCaseMapping:0x035F + ,simpleTitleCaseMapping:0x035F + }, + { code:0x0360 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0360 + ,simpleLowerCaseMapping:0x0360 + ,simpleTitleCaseMapping:0x0360 + }, + { code:0x0361 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0361 + ,simpleLowerCaseMapping:0x0361 + ,simpleTitleCaseMapping:0x0361 + }, + { code:0x0362 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0362 + ,simpleLowerCaseMapping:0x0362 + ,simpleTitleCaseMapping:0x0362 + }, + { code:0x0363 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0363 + ,simpleLowerCaseMapping:0x0363 + ,simpleTitleCaseMapping:0x0363 + }, + { code:0x0364 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0364 + ,simpleLowerCaseMapping:0x0364 + ,simpleTitleCaseMapping:0x0364 + }, + { code:0x0365 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0365 + ,simpleLowerCaseMapping:0x0365 + ,simpleTitleCaseMapping:0x0365 + }, + { code:0x0366 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0366 + ,simpleLowerCaseMapping:0x0366 + ,simpleTitleCaseMapping:0x0366 + }, + { code:0x0367 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0367 + ,simpleLowerCaseMapping:0x0367 + ,simpleTitleCaseMapping:0x0367 + }, + { code:0x0368 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0368 + ,simpleLowerCaseMapping:0x0368 + ,simpleTitleCaseMapping:0x0368 + }, + { code:0x0369 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0369 + ,simpleLowerCaseMapping:0x0369 + ,simpleTitleCaseMapping:0x0369 + }, + { code:0x036A + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x036A + ,simpleLowerCaseMapping:0x036A + ,simpleTitleCaseMapping:0x036A + }, + { code:0x036B + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x036B + ,simpleLowerCaseMapping:0x036B + ,simpleTitleCaseMapping:0x036B + }, + { code:0x036C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x036C + ,simpleLowerCaseMapping:0x036C + ,simpleTitleCaseMapping:0x036C + }, + { code:0x036D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x036D + ,simpleLowerCaseMapping:0x036D + ,simpleTitleCaseMapping:0x036D + }, + { code:0x036E + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x036E + ,simpleLowerCaseMapping:0x036E + ,simpleTitleCaseMapping:0x036E + }, + { code:0x036F + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x036F + ,simpleLowerCaseMapping:0x036F + ,simpleTitleCaseMapping:0x036F + }, + { code:0x0374 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x0374 + ,simpleLowerCaseMapping:0x0374 + ,simpleTitleCaseMapping:0x0374 + }, + { code:0x0375 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x0375 + ,simpleLowerCaseMapping:0x0375 + ,simpleTitleCaseMapping:0x0375 + }, + { code:0x037A + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x037A + ,simpleLowerCaseMapping:0x037A + ,simpleTitleCaseMapping:0x037A + }, + { code:0x037B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03FD + ,simpleLowerCaseMapping:0x037B + ,simpleTitleCaseMapping:0x03FD + }, + { code:0x037C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03FE + ,simpleLowerCaseMapping:0x037C + ,simpleTitleCaseMapping:0x03FE + }, + { code:0x037D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03FF + ,simpleLowerCaseMapping:0x037D + ,simpleTitleCaseMapping:0x03FF + }, + { code:0x037E + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x037E + ,simpleLowerCaseMapping:0x037E + ,simpleTitleCaseMapping:0x037E + }, + { code:0x0384 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x0384 + ,simpleLowerCaseMapping:0x0384 + ,simpleTitleCaseMapping:0x0384 + }, + { code:0x0385 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x0385 + ,simpleLowerCaseMapping:0x0385 + ,simpleTitleCaseMapping:0x0385 + }, + { code:0x0386 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0386 + ,simpleLowerCaseMapping:0x03AC + ,simpleTitleCaseMapping:0x0386 + }, + { code:0x0387 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0387 + ,simpleLowerCaseMapping:0x0387 + ,simpleTitleCaseMapping:0x0387 + }, + { code:0x0388 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0388 + ,simpleLowerCaseMapping:0x03AD + ,simpleTitleCaseMapping:0x0388 + }, + { code:0x0389 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0389 + ,simpleLowerCaseMapping:0x03AE + ,simpleTitleCaseMapping:0x0389 + }, + { code:0x038A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x038A + ,simpleLowerCaseMapping:0x03AF + ,simpleTitleCaseMapping:0x038A + }, + { code:0x038C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x038C + ,simpleLowerCaseMapping:0x03CC + ,simpleTitleCaseMapping:0x038C + }, + { code:0x038E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x038E + ,simpleLowerCaseMapping:0x03CD + ,simpleTitleCaseMapping:0x038E + }, + { code:0x038F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x038F + ,simpleLowerCaseMapping:0x03CE + ,simpleTitleCaseMapping:0x038F + }, + { code:0x0390 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x0390 + ,simpleLowerCaseMapping:0x0390 + ,simpleTitleCaseMapping:0x0390 + }, + { code:0x0391 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0391 + ,simpleLowerCaseMapping:0x03B1 + ,simpleTitleCaseMapping:0x0391 + }, + { code:0x0392 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0392 + ,simpleLowerCaseMapping:0x03B2 + ,simpleTitleCaseMapping:0x0392 + }, + { code:0x0393 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0393 + ,simpleLowerCaseMapping:0x03B3 + ,simpleTitleCaseMapping:0x0393 + }, + { code:0x0394 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0394 + ,simpleLowerCaseMapping:0x03B4 + ,simpleTitleCaseMapping:0x0394 + }, + { code:0x0395 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0395 + ,simpleLowerCaseMapping:0x03B5 + ,simpleTitleCaseMapping:0x0395 + }, + { code:0x0396 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0396 + ,simpleLowerCaseMapping:0x03B6 + ,simpleTitleCaseMapping:0x0396 + }, + { code:0x0397 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0397 + ,simpleLowerCaseMapping:0x03B7 + ,simpleTitleCaseMapping:0x0397 + }, + { code:0x0398 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0398 + ,simpleLowerCaseMapping:0x03B8 + ,simpleTitleCaseMapping:0x0398 + }, + { code:0x0399 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0399 + ,simpleLowerCaseMapping:0x03B9 + ,simpleTitleCaseMapping:0x0399 + }, + { code:0x039A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x039A + ,simpleLowerCaseMapping:0x03BA + ,simpleTitleCaseMapping:0x039A + }, + { code:0x039B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x039B + ,simpleLowerCaseMapping:0x03BB + ,simpleTitleCaseMapping:0x039B + }, + { code:0x039C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x039C + ,simpleLowerCaseMapping:0x03BC + ,simpleTitleCaseMapping:0x039C + }, + { code:0x039D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x039D + ,simpleLowerCaseMapping:0x03BD + ,simpleTitleCaseMapping:0x039D + }, + { code:0x039E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x039E + ,simpleLowerCaseMapping:0x03BE + ,simpleTitleCaseMapping:0x039E + }, + { code:0x039F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x039F + ,simpleLowerCaseMapping:0x03BF + ,simpleTitleCaseMapping:0x039F + }, + { code:0x03A0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x03A0 + ,simpleLowerCaseMapping:0x03C0 + ,simpleTitleCaseMapping:0x03A0 + }, + { code:0x03A1 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x03A1 + ,simpleLowerCaseMapping:0x03C1 + ,simpleTitleCaseMapping:0x03A1 + }, + { code:0x03A3 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x03A3 + ,simpleLowerCaseMapping:0x03C3 + ,simpleTitleCaseMapping:0x03A3 + }, + { code:0x03A4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x03A4 + ,simpleLowerCaseMapping:0x03C4 + ,simpleTitleCaseMapping:0x03A4 + }, + { code:0x03A5 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x03A5 + ,simpleLowerCaseMapping:0x03C5 + ,simpleTitleCaseMapping:0x03A5 + }, + { code:0x03A6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x03A6 + ,simpleLowerCaseMapping:0x03C6 + ,simpleTitleCaseMapping:0x03A6 + }, + { code:0x03A7 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x03A7 + ,simpleLowerCaseMapping:0x03C7 + ,simpleTitleCaseMapping:0x03A7 + }, + { code:0x03A8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x03A8 + ,simpleLowerCaseMapping:0x03C8 + ,simpleTitleCaseMapping:0x03A8 + }, + { code:0x03A9 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x03A9 + ,simpleLowerCaseMapping:0x03C9 + ,simpleTitleCaseMapping:0x03A9 + }, + { code:0x03AA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x03AA + ,simpleLowerCaseMapping:0x03CA + ,simpleTitleCaseMapping:0x03AA + }, + { code:0x03AB + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x03AB + ,simpleLowerCaseMapping:0x03CB + ,simpleTitleCaseMapping:0x03AB + }, + { code:0x03AC + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0386 + ,simpleLowerCaseMapping:0x03AC + ,simpleTitleCaseMapping:0x0386 + }, + { code:0x03AD + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0388 + ,simpleLowerCaseMapping:0x03AD + ,simpleTitleCaseMapping:0x0388 + }, + { code:0x03AE + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0389 + ,simpleLowerCaseMapping:0x03AE + ,simpleTitleCaseMapping:0x0389 + }, + { code:0x03AF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x038A + ,simpleLowerCaseMapping:0x03AF + ,simpleTitleCaseMapping:0x038A + }, + { code:0x03B0 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x03B0 + ,simpleLowerCaseMapping:0x03B0 + ,simpleTitleCaseMapping:0x03B0 + }, + { code:0x03B1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0391 + ,simpleLowerCaseMapping:0x03B1 + ,simpleTitleCaseMapping:0x0391 + }, + { code:0x03B2 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0392 + ,simpleLowerCaseMapping:0x03B2 + ,simpleTitleCaseMapping:0x0392 + }, + { code:0x03B3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0393 + ,simpleLowerCaseMapping:0x03B3 + ,simpleTitleCaseMapping:0x0393 + }, + { code:0x03B4 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0394 + ,simpleLowerCaseMapping:0x03B4 + ,simpleTitleCaseMapping:0x0394 + }, + { code:0x03B5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0395 + ,simpleLowerCaseMapping:0x03B5 + ,simpleTitleCaseMapping:0x0395 + }, + { code:0x03B6 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0396 + ,simpleLowerCaseMapping:0x03B6 + ,simpleTitleCaseMapping:0x0396 + }, + { code:0x03B7 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0397 + ,simpleLowerCaseMapping:0x03B7 + ,simpleTitleCaseMapping:0x0397 + }, + { code:0x03B8 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0398 + ,simpleLowerCaseMapping:0x03B8 + ,simpleTitleCaseMapping:0x0398 + }, + { code:0x03B9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0399 + ,simpleLowerCaseMapping:0x03B9 + ,simpleTitleCaseMapping:0x0399 + }, + { code:0x03BA + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x039A + ,simpleLowerCaseMapping:0x03BA + ,simpleTitleCaseMapping:0x039A + }, + { code:0x03BB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x039B + ,simpleLowerCaseMapping:0x03BB + ,simpleTitleCaseMapping:0x039B + }, + { code:0x03BC + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x039C + ,simpleLowerCaseMapping:0x03BC + ,simpleTitleCaseMapping:0x039C + }, + { code:0x03BD + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x039D + ,simpleLowerCaseMapping:0x03BD + ,simpleTitleCaseMapping:0x039D + }, + { code:0x03BE + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x039E + ,simpleLowerCaseMapping:0x03BE + ,simpleTitleCaseMapping:0x039E + }, + { code:0x03BF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x039F + ,simpleLowerCaseMapping:0x03BF + ,simpleTitleCaseMapping:0x039F + }, + { code:0x03C0 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03A0 + ,simpleLowerCaseMapping:0x03C0 + ,simpleTitleCaseMapping:0x03A0 + }, + { code:0x03C1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03A1 + ,simpleLowerCaseMapping:0x03C1 + ,simpleTitleCaseMapping:0x03A1 + }, + { code:0x03C2 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03A3 + ,simpleLowerCaseMapping:0x03C2 + ,simpleTitleCaseMapping:0x03A3 + }, + { code:0x03C3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03A3 + ,simpleLowerCaseMapping:0x03C3 + ,simpleTitleCaseMapping:0x03A3 + }, + { code:0x03C4 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03A4 + ,simpleLowerCaseMapping:0x03C4 + ,simpleTitleCaseMapping:0x03A4 + }, + { code:0x03C5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03A5 + ,simpleLowerCaseMapping:0x03C5 + ,simpleTitleCaseMapping:0x03A5 + }, + { code:0x03C6 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03A6 + ,simpleLowerCaseMapping:0x03C6 + ,simpleTitleCaseMapping:0x03A6 + }, + { code:0x03C7 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03A7 + ,simpleLowerCaseMapping:0x03C7 + ,simpleTitleCaseMapping:0x03A7 + }, + { code:0x03C8 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03A8 + ,simpleLowerCaseMapping:0x03C8 + ,simpleTitleCaseMapping:0x03A8 + }, + { code:0x03C9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03A9 + ,simpleLowerCaseMapping:0x03C9 + ,simpleTitleCaseMapping:0x03A9 + }, + { code:0x03CA + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03AA + ,simpleLowerCaseMapping:0x03CA + ,simpleTitleCaseMapping:0x03AA + }, + { code:0x03CB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03AB + ,simpleLowerCaseMapping:0x03CB + ,simpleTitleCaseMapping:0x03AB + }, + { code:0x03CC + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x038C + ,simpleLowerCaseMapping:0x03CC + ,simpleTitleCaseMapping:0x038C + }, + { code:0x03CD + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x038E + ,simpleLowerCaseMapping:0x03CD + ,simpleTitleCaseMapping:0x038E + }, + { code:0x03CE + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x038F + ,simpleLowerCaseMapping:0x03CE + ,simpleTitleCaseMapping:0x038F + }, + { code:0x03D0 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0392 + ,simpleLowerCaseMapping:0x03D0 + ,simpleTitleCaseMapping:0x0392 + }, + { code:0x03D1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0398 + ,simpleLowerCaseMapping:0x03D1 + ,simpleTitleCaseMapping:0x0398 + }, + { code:0x03D2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x03D2 + ,simpleLowerCaseMapping:0x03D2 + ,simpleTitleCaseMapping:0x03D2 + }, + { code:0x03D3 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x03D3 + ,simpleLowerCaseMapping:0x03D3 + ,simpleTitleCaseMapping:0x03D3 + }, + { code:0x03D4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x03D4 + ,simpleLowerCaseMapping:0x03D4 + ,simpleTitleCaseMapping:0x03D4 + }, + { code:0x03D5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03A6 + ,simpleLowerCaseMapping:0x03D5 + ,simpleTitleCaseMapping:0x03A6 + }, + { code:0x03D6 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03A0 + ,simpleLowerCaseMapping:0x03D6 + ,simpleTitleCaseMapping:0x03A0 + }, + { code:0x03D7 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03D7 + ,simpleLowerCaseMapping:0x03D7 + ,simpleTitleCaseMapping:0x03D7 + }, + { code:0x03D8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x03D8 + ,simpleLowerCaseMapping:0x03D9 + ,simpleTitleCaseMapping:0x03D8 + }, + { code:0x03D9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03D8 + ,simpleLowerCaseMapping:0x03D9 + ,simpleTitleCaseMapping:0x03D8 + }, + { code:0x03DA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x03DA + ,simpleLowerCaseMapping:0x03DB + ,simpleTitleCaseMapping:0x03DA + }, + { code:0x03DB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03DA + ,simpleLowerCaseMapping:0x03DB + ,simpleTitleCaseMapping:0x03DA + }, + { code:0x03DC + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x03DC + ,simpleLowerCaseMapping:0x03DD + ,simpleTitleCaseMapping:0x03DC + }, + { code:0x03DD + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03DC + ,simpleLowerCaseMapping:0x03DD + ,simpleTitleCaseMapping:0x03DC + }, + { code:0x03DE + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x03DE + ,simpleLowerCaseMapping:0x03DF + ,simpleTitleCaseMapping:0x03DE + }, + { code:0x03DF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03DE + ,simpleLowerCaseMapping:0x03DF + ,simpleTitleCaseMapping:0x03DE + }, + { code:0x03E0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x03E0 + ,simpleLowerCaseMapping:0x03E1 + ,simpleTitleCaseMapping:0x03E0 + }, + { code:0x03E1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03E0 + ,simpleLowerCaseMapping:0x03E1 + ,simpleTitleCaseMapping:0x03E0 + }, + { code:0x03E2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x03E2 + ,simpleLowerCaseMapping:0x03E3 + ,simpleTitleCaseMapping:0x03E2 + }, + { code:0x03E3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03E2 + ,simpleLowerCaseMapping:0x03E3 + ,simpleTitleCaseMapping:0x03E2 + }, + { code:0x03E4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x03E4 + ,simpleLowerCaseMapping:0x03E5 + ,simpleTitleCaseMapping:0x03E4 + }, + { code:0x03E5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03E4 + ,simpleLowerCaseMapping:0x03E5 + ,simpleTitleCaseMapping:0x03E4 + }, + { code:0x03E6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x03E6 + ,simpleLowerCaseMapping:0x03E7 + ,simpleTitleCaseMapping:0x03E6 + }, + { code:0x03E7 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03E6 + ,simpleLowerCaseMapping:0x03E7 + ,simpleTitleCaseMapping:0x03E6 + }, + { code:0x03E8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x03E8 + ,simpleLowerCaseMapping:0x03E9 + ,simpleTitleCaseMapping:0x03E8 + }, + { code:0x03E9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03E8 + ,simpleLowerCaseMapping:0x03E9 + ,simpleTitleCaseMapping:0x03E8 + }, + { code:0x03EA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x03EA + ,simpleLowerCaseMapping:0x03EB + ,simpleTitleCaseMapping:0x03EA + }, + { code:0x03EB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03EA + ,simpleLowerCaseMapping:0x03EB + ,simpleTitleCaseMapping:0x03EA + }, + { code:0x03EC + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x03EC + ,simpleLowerCaseMapping:0x03ED + ,simpleTitleCaseMapping:0x03EC + }, + { code:0x03ED + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03EC + ,simpleLowerCaseMapping:0x03ED + ,simpleTitleCaseMapping:0x03EC + }, + { code:0x03EE + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x03EE + ,simpleLowerCaseMapping:0x03EF + ,simpleTitleCaseMapping:0x03EE + }, + { code:0x03EF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03EE + ,simpleLowerCaseMapping:0x03EF + ,simpleTitleCaseMapping:0x03EE + }, + { code:0x03F0 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x039A + ,simpleLowerCaseMapping:0x03F0 + ,simpleTitleCaseMapping:0x039A + }, + { code:0x03F1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03A1 + ,simpleLowerCaseMapping:0x03F1 + ,simpleTitleCaseMapping:0x03A1 + }, + { code:0x03F2 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03F9 + ,simpleLowerCaseMapping:0x03F2 + ,simpleTitleCaseMapping:0x03F9 + }, + { code:0x03F3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03F3 + ,simpleLowerCaseMapping:0x03F3 + ,simpleTitleCaseMapping:0x03F3 + }, + { code:0x03F4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x03F4 + ,simpleLowerCaseMapping:0x03B8 + ,simpleTitleCaseMapping:0x03F4 + }, + { code:0x03F5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0395 + ,simpleLowerCaseMapping:0x03F5 + ,simpleTitleCaseMapping:0x0395 + }, + { code:0x03F6 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x03F6 + ,simpleLowerCaseMapping:0x03F6 + ,simpleTitleCaseMapping:0x03F6 + }, + { code:0x03F7 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x03F7 + ,simpleLowerCaseMapping:0x03F8 + ,simpleTitleCaseMapping:0x03F7 + }, + { code:0x03F8 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03F7 + ,simpleLowerCaseMapping:0x03F8 + ,simpleTitleCaseMapping:0x03F7 + }, + { code:0x03F9 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x03F9 + ,simpleLowerCaseMapping:0x03F2 + ,simpleTitleCaseMapping:0x03F9 + }, + { code:0x03FA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x03FA + ,simpleLowerCaseMapping:0x03FB + ,simpleTitleCaseMapping:0x03FA + }, + { code:0x03FB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03FA + ,simpleLowerCaseMapping:0x03FB + ,simpleTitleCaseMapping:0x03FA + }, + { code:0x03FC + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x03FC + ,simpleLowerCaseMapping:0x03FC + ,simpleTitleCaseMapping:0x03FC + }, + { code:0x03FD + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x03FD + ,simpleLowerCaseMapping:0x037B + ,simpleTitleCaseMapping:0x03FD + }, + { code:0x03FE + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x03FE + ,simpleLowerCaseMapping:0x037C + ,simpleTitleCaseMapping:0x03FE + }, + { code:0x03FF + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x03FF + ,simpleLowerCaseMapping:0x037D + ,simpleTitleCaseMapping:0x03FF + }, + { code:0x0400 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0400 + ,simpleLowerCaseMapping:0x0450 + ,simpleTitleCaseMapping:0x0400 + }, + { code:0x0401 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0401 + ,simpleLowerCaseMapping:0x0451 + ,simpleTitleCaseMapping:0x0401 + }, + { code:0x0402 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0402 + ,simpleLowerCaseMapping:0x0452 + ,simpleTitleCaseMapping:0x0402 + }, + { code:0x0403 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0403 + ,simpleLowerCaseMapping:0x0453 + ,simpleTitleCaseMapping:0x0403 + }, + { code:0x0404 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0404 + ,simpleLowerCaseMapping:0x0454 + ,simpleTitleCaseMapping:0x0404 + }, + { code:0x0405 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0405 + ,simpleLowerCaseMapping:0x0455 + ,simpleTitleCaseMapping:0x0405 + }, + { code:0x0406 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0406 + ,simpleLowerCaseMapping:0x0456 + ,simpleTitleCaseMapping:0x0406 + }, + { code:0x0407 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0407 + ,simpleLowerCaseMapping:0x0457 + ,simpleTitleCaseMapping:0x0407 + }, + { code:0x0408 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0408 + ,simpleLowerCaseMapping:0x0458 + ,simpleTitleCaseMapping:0x0408 + }, + { code:0x0409 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0409 + ,simpleLowerCaseMapping:0x0459 + ,simpleTitleCaseMapping:0x0409 + }, + { code:0x040A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x040A + ,simpleLowerCaseMapping:0x045A + ,simpleTitleCaseMapping:0x040A + }, + { code:0x040B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x040B + ,simpleLowerCaseMapping:0x045B + ,simpleTitleCaseMapping:0x040B + }, + { code:0x040C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x040C + ,simpleLowerCaseMapping:0x045C + ,simpleTitleCaseMapping:0x040C + }, + { code:0x040D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x040D + ,simpleLowerCaseMapping:0x045D + ,simpleTitleCaseMapping:0x040D + }, + { code:0x040E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x040E + ,simpleLowerCaseMapping:0x045E + ,simpleTitleCaseMapping:0x040E + }, + { code:0x040F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x040F + ,simpleLowerCaseMapping:0x045F + ,simpleTitleCaseMapping:0x040F + }, + { code:0x0410 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0410 + ,simpleLowerCaseMapping:0x0430 + ,simpleTitleCaseMapping:0x0410 + }, + { code:0x0411 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0411 + ,simpleLowerCaseMapping:0x0431 + ,simpleTitleCaseMapping:0x0411 + }, + { code:0x0412 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0412 + ,simpleLowerCaseMapping:0x0432 + ,simpleTitleCaseMapping:0x0412 + }, + { code:0x0413 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0413 + ,simpleLowerCaseMapping:0x0433 + ,simpleTitleCaseMapping:0x0413 + }, + { code:0x0414 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0414 + ,simpleLowerCaseMapping:0x0434 + ,simpleTitleCaseMapping:0x0414 + }, + { code:0x0415 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0415 + ,simpleLowerCaseMapping:0x0435 + ,simpleTitleCaseMapping:0x0415 + }, + { code:0x0416 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0416 + ,simpleLowerCaseMapping:0x0436 + ,simpleTitleCaseMapping:0x0416 + }, + { code:0x0417 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0417 + ,simpleLowerCaseMapping:0x0437 + ,simpleTitleCaseMapping:0x0417 + }, + { code:0x0418 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0418 + ,simpleLowerCaseMapping:0x0438 + ,simpleTitleCaseMapping:0x0418 + }, + { code:0x0419 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0419 + ,simpleLowerCaseMapping:0x0439 + ,simpleTitleCaseMapping:0x0419 + }, + { code:0x041A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x041A + ,simpleLowerCaseMapping:0x043A + ,simpleTitleCaseMapping:0x041A + }, + { code:0x041B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x041B + ,simpleLowerCaseMapping:0x043B + ,simpleTitleCaseMapping:0x041B + }, + { code:0x041C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x041C + ,simpleLowerCaseMapping:0x043C + ,simpleTitleCaseMapping:0x041C + }, + { code:0x041D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x041D + ,simpleLowerCaseMapping:0x043D + ,simpleTitleCaseMapping:0x041D + }, + { code:0x041E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x041E + ,simpleLowerCaseMapping:0x043E + ,simpleTitleCaseMapping:0x041E + }, + { code:0x041F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x041F + ,simpleLowerCaseMapping:0x043F + ,simpleTitleCaseMapping:0x041F + }, + { code:0x0420 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0420 + ,simpleLowerCaseMapping:0x0440 + ,simpleTitleCaseMapping:0x0420 + }, + { code:0x0421 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0421 + ,simpleLowerCaseMapping:0x0441 + ,simpleTitleCaseMapping:0x0421 + }, + { code:0x0422 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0422 + ,simpleLowerCaseMapping:0x0442 + ,simpleTitleCaseMapping:0x0422 + }, + { code:0x0423 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0423 + ,simpleLowerCaseMapping:0x0443 + ,simpleTitleCaseMapping:0x0423 + }, + { code:0x0424 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0424 + ,simpleLowerCaseMapping:0x0444 + ,simpleTitleCaseMapping:0x0424 + }, + { code:0x0425 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0425 + ,simpleLowerCaseMapping:0x0445 + ,simpleTitleCaseMapping:0x0425 + }, + { code:0x0426 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0426 + ,simpleLowerCaseMapping:0x0446 + ,simpleTitleCaseMapping:0x0426 + }, + { code:0x0427 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0427 + ,simpleLowerCaseMapping:0x0447 + ,simpleTitleCaseMapping:0x0427 + }, + { code:0x0428 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0428 + ,simpleLowerCaseMapping:0x0448 + ,simpleTitleCaseMapping:0x0428 + }, + { code:0x0429 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0429 + ,simpleLowerCaseMapping:0x0449 + ,simpleTitleCaseMapping:0x0429 + }, + { code:0x042A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x042A + ,simpleLowerCaseMapping:0x044A + ,simpleTitleCaseMapping:0x042A + }, + { code:0x042B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x042B + ,simpleLowerCaseMapping:0x044B + ,simpleTitleCaseMapping:0x042B + }, + { code:0x042C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x042C + ,simpleLowerCaseMapping:0x044C + ,simpleTitleCaseMapping:0x042C + }, + { code:0x042D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x042D + ,simpleLowerCaseMapping:0x044D + ,simpleTitleCaseMapping:0x042D + }, + { code:0x042E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x042E + ,simpleLowerCaseMapping:0x044E + ,simpleTitleCaseMapping:0x042E + }, + { code:0x042F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x042F + ,simpleLowerCaseMapping:0x044F + ,simpleTitleCaseMapping:0x042F + }, + { code:0x0430 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0410 + ,simpleLowerCaseMapping:0x0430 + ,simpleTitleCaseMapping:0x0410 + }, + { code:0x0431 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0411 + ,simpleLowerCaseMapping:0x0431 + ,simpleTitleCaseMapping:0x0411 + }, + { code:0x0432 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0412 + ,simpleLowerCaseMapping:0x0432 + ,simpleTitleCaseMapping:0x0412 + }, + { code:0x0433 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0413 + ,simpleLowerCaseMapping:0x0433 + ,simpleTitleCaseMapping:0x0413 + }, + { code:0x0434 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0414 + ,simpleLowerCaseMapping:0x0434 + ,simpleTitleCaseMapping:0x0414 + }, + { code:0x0435 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0415 + ,simpleLowerCaseMapping:0x0435 + ,simpleTitleCaseMapping:0x0415 + }, + { code:0x0436 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0416 + ,simpleLowerCaseMapping:0x0436 + ,simpleTitleCaseMapping:0x0416 + }, + { code:0x0437 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0417 + ,simpleLowerCaseMapping:0x0437 + ,simpleTitleCaseMapping:0x0417 + }, + { code:0x0438 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0418 + ,simpleLowerCaseMapping:0x0438 + ,simpleTitleCaseMapping:0x0418 + }, + { code:0x0439 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0419 + ,simpleLowerCaseMapping:0x0439 + ,simpleTitleCaseMapping:0x0419 + }, + { code:0x043A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x041A + ,simpleLowerCaseMapping:0x043A + ,simpleTitleCaseMapping:0x041A + }, + { code:0x043B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x041B + ,simpleLowerCaseMapping:0x043B + ,simpleTitleCaseMapping:0x041B + }, + { code:0x043C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x041C + ,simpleLowerCaseMapping:0x043C + ,simpleTitleCaseMapping:0x041C + }, + { code:0x043D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x041D + ,simpleLowerCaseMapping:0x043D + ,simpleTitleCaseMapping:0x041D + }, + { code:0x043E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x041E + ,simpleLowerCaseMapping:0x043E + ,simpleTitleCaseMapping:0x041E + }, + { code:0x043F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x041F + ,simpleLowerCaseMapping:0x043F + ,simpleTitleCaseMapping:0x041F + }, + { code:0x0440 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0420 + ,simpleLowerCaseMapping:0x0440 + ,simpleTitleCaseMapping:0x0420 + }, + { code:0x0441 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0421 + ,simpleLowerCaseMapping:0x0441 + ,simpleTitleCaseMapping:0x0421 + }, + { code:0x0442 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0422 + ,simpleLowerCaseMapping:0x0442 + ,simpleTitleCaseMapping:0x0422 + }, + { code:0x0443 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0423 + ,simpleLowerCaseMapping:0x0443 + ,simpleTitleCaseMapping:0x0423 + }, + { code:0x0444 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0424 + ,simpleLowerCaseMapping:0x0444 + ,simpleTitleCaseMapping:0x0424 + }, + { code:0x0445 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0425 + ,simpleLowerCaseMapping:0x0445 + ,simpleTitleCaseMapping:0x0425 + }, + { code:0x0446 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0426 + ,simpleLowerCaseMapping:0x0446 + ,simpleTitleCaseMapping:0x0426 + }, + { code:0x0447 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0427 + ,simpleLowerCaseMapping:0x0447 + ,simpleTitleCaseMapping:0x0427 + }, + { code:0x0448 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0428 + ,simpleLowerCaseMapping:0x0448 + ,simpleTitleCaseMapping:0x0428 + }, + { code:0x0449 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0429 + ,simpleLowerCaseMapping:0x0449 + ,simpleTitleCaseMapping:0x0429 + }, + { code:0x044A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x042A + ,simpleLowerCaseMapping:0x044A + ,simpleTitleCaseMapping:0x042A + }, + { code:0x044B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x042B + ,simpleLowerCaseMapping:0x044B + ,simpleTitleCaseMapping:0x042B + }, + { code:0x044C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x042C + ,simpleLowerCaseMapping:0x044C + ,simpleTitleCaseMapping:0x042C + }, + { code:0x044D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x042D + ,simpleLowerCaseMapping:0x044D + ,simpleTitleCaseMapping:0x042D + }, + { code:0x044E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x042E + ,simpleLowerCaseMapping:0x044E + ,simpleTitleCaseMapping:0x042E + }, + { code:0x044F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x042F + ,simpleLowerCaseMapping:0x044F + ,simpleTitleCaseMapping:0x042F + }, + { code:0x0450 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0400 + ,simpleLowerCaseMapping:0x0450 + ,simpleTitleCaseMapping:0x0400 + }, + { code:0x0451 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0401 + ,simpleLowerCaseMapping:0x0451 + ,simpleTitleCaseMapping:0x0401 + }, + { code:0x0452 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0402 + ,simpleLowerCaseMapping:0x0452 + ,simpleTitleCaseMapping:0x0402 + }, + { code:0x0453 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0403 + ,simpleLowerCaseMapping:0x0453 + ,simpleTitleCaseMapping:0x0403 + }, + { code:0x0454 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0404 + ,simpleLowerCaseMapping:0x0454 + ,simpleTitleCaseMapping:0x0404 + }, + { code:0x0455 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0405 + ,simpleLowerCaseMapping:0x0455 + ,simpleTitleCaseMapping:0x0405 + }, + { code:0x0456 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0406 + ,simpleLowerCaseMapping:0x0456 + ,simpleTitleCaseMapping:0x0406 + }, + { code:0x0457 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0407 + ,simpleLowerCaseMapping:0x0457 + ,simpleTitleCaseMapping:0x0407 + }, + { code:0x0458 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0408 + ,simpleLowerCaseMapping:0x0458 + ,simpleTitleCaseMapping:0x0408 + }, + { code:0x0459 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0409 + ,simpleLowerCaseMapping:0x0459 + ,simpleTitleCaseMapping:0x0409 + }, + { code:0x045A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x040A + ,simpleLowerCaseMapping:0x045A + ,simpleTitleCaseMapping:0x040A + }, + { code:0x045B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x040B + ,simpleLowerCaseMapping:0x045B + ,simpleTitleCaseMapping:0x040B + }, + { code:0x045C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x040C + ,simpleLowerCaseMapping:0x045C + ,simpleTitleCaseMapping:0x040C + }, + { code:0x045D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x040D + ,simpleLowerCaseMapping:0x045D + ,simpleTitleCaseMapping:0x040D + }, + { code:0x045E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x040E + ,simpleLowerCaseMapping:0x045E + ,simpleTitleCaseMapping:0x040E + }, + { code:0x045F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x040F + ,simpleLowerCaseMapping:0x045F + ,simpleTitleCaseMapping:0x040F + }, + { code:0x0460 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0460 + ,simpleLowerCaseMapping:0x0461 + ,simpleTitleCaseMapping:0x0460 + }, + { code:0x0461 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0460 + ,simpleLowerCaseMapping:0x0461 + ,simpleTitleCaseMapping:0x0460 + }, + { code:0x0462 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0462 + ,simpleLowerCaseMapping:0x0463 + ,simpleTitleCaseMapping:0x0462 + }, + { code:0x0463 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0462 + ,simpleLowerCaseMapping:0x0463 + ,simpleTitleCaseMapping:0x0462 + }, + { code:0x0464 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0464 + ,simpleLowerCaseMapping:0x0465 + ,simpleTitleCaseMapping:0x0464 + }, + { code:0x0465 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0464 + ,simpleLowerCaseMapping:0x0465 + ,simpleTitleCaseMapping:0x0464 + }, + { code:0x0466 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0466 + ,simpleLowerCaseMapping:0x0467 + ,simpleTitleCaseMapping:0x0466 + }, + { code:0x0467 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0466 + ,simpleLowerCaseMapping:0x0467 + ,simpleTitleCaseMapping:0x0466 + }, + { code:0x0468 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0468 + ,simpleLowerCaseMapping:0x0469 + ,simpleTitleCaseMapping:0x0468 + }, + { code:0x0469 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0468 + ,simpleLowerCaseMapping:0x0469 + ,simpleTitleCaseMapping:0x0468 + }, + { code:0x046A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x046A + ,simpleLowerCaseMapping:0x046B + ,simpleTitleCaseMapping:0x046A + }, + { code:0x046B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x046A + ,simpleLowerCaseMapping:0x046B + ,simpleTitleCaseMapping:0x046A + }, + { code:0x046C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x046C + ,simpleLowerCaseMapping:0x046D + ,simpleTitleCaseMapping:0x046C + }, + { code:0x046D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x046C + ,simpleLowerCaseMapping:0x046D + ,simpleTitleCaseMapping:0x046C + }, + { code:0x046E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x046E + ,simpleLowerCaseMapping:0x046F + ,simpleTitleCaseMapping:0x046E + }, + { code:0x046F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x046E + ,simpleLowerCaseMapping:0x046F + ,simpleTitleCaseMapping:0x046E + }, + { code:0x0470 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0470 + ,simpleLowerCaseMapping:0x0471 + ,simpleTitleCaseMapping:0x0470 + }, + { code:0x0471 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0470 + ,simpleLowerCaseMapping:0x0471 + ,simpleTitleCaseMapping:0x0470 + }, + { code:0x0472 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0472 + ,simpleLowerCaseMapping:0x0473 + ,simpleTitleCaseMapping:0x0472 + }, + { code:0x0473 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0472 + ,simpleLowerCaseMapping:0x0473 + ,simpleTitleCaseMapping:0x0472 + }, + { code:0x0474 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0474 + ,simpleLowerCaseMapping:0x0475 + ,simpleTitleCaseMapping:0x0474 + }, + { code:0x0475 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0474 + ,simpleLowerCaseMapping:0x0475 + ,simpleTitleCaseMapping:0x0474 + }, + { code:0x0476 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0476 + ,simpleLowerCaseMapping:0x0477 + ,simpleTitleCaseMapping:0x0476 + }, + { code:0x0477 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0476 + ,simpleLowerCaseMapping:0x0477 + ,simpleTitleCaseMapping:0x0476 + }, + { code:0x0478 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0478 + ,simpleLowerCaseMapping:0x0479 + ,simpleTitleCaseMapping:0x0478 + }, + { code:0x0479 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0478 + ,simpleLowerCaseMapping:0x0479 + ,simpleTitleCaseMapping:0x0478 + }, + { code:0x047A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x047A + ,simpleLowerCaseMapping:0x047B + ,simpleTitleCaseMapping:0x047A + }, + { code:0x047B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x047A + ,simpleLowerCaseMapping:0x047B + ,simpleTitleCaseMapping:0x047A + }, + { code:0x047C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x047C + ,simpleLowerCaseMapping:0x047D + ,simpleTitleCaseMapping:0x047C + }, + { code:0x047D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x047C + ,simpleLowerCaseMapping:0x047D + ,simpleTitleCaseMapping:0x047C + }, + { code:0x047E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x047E + ,simpleLowerCaseMapping:0x047F + ,simpleTitleCaseMapping:0x047E + }, + { code:0x047F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x047E + ,simpleLowerCaseMapping:0x047F + ,simpleTitleCaseMapping:0x047E + }, + { code:0x0480 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0480 + ,simpleLowerCaseMapping:0x0481 + ,simpleTitleCaseMapping:0x0480 + }, + { code:0x0481 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0480 + ,simpleLowerCaseMapping:0x0481 + ,simpleTitleCaseMapping:0x0480 + }, + { code:0x0482 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0482 + ,simpleLowerCaseMapping:0x0482 + ,simpleTitleCaseMapping:0x0482 + }, + { code:0x0483 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0483 + ,simpleLowerCaseMapping:0x0483 + ,simpleTitleCaseMapping:0x0483 + }, + { code:0x0484 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0484 + ,simpleLowerCaseMapping:0x0484 + ,simpleTitleCaseMapping:0x0484 + }, + { code:0x0485 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0485 + ,simpleLowerCaseMapping:0x0485 + ,simpleTitleCaseMapping:0x0485 + }, + { code:0x0486 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0486 + ,simpleLowerCaseMapping:0x0486 + ,simpleTitleCaseMapping:0x0486 + }, + { code:0x0488 + ,generalCategory:UnicodeData.GeneralCategory.Me + ,simpleUpperCaseMapping:0x0488 + ,simpleLowerCaseMapping:0x0488 + ,simpleTitleCaseMapping:0x0488 + }, + { code:0x0489 + ,generalCategory:UnicodeData.GeneralCategory.Me + ,simpleUpperCaseMapping:0x0489 + ,simpleLowerCaseMapping:0x0489 + ,simpleTitleCaseMapping:0x0489 + }, + { code:0x048A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x048A + ,simpleLowerCaseMapping:0x048B + ,simpleTitleCaseMapping:0x048A + }, + { code:0x048B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x048A + ,simpleLowerCaseMapping:0x048B + ,simpleTitleCaseMapping:0x048A + }, + { code:0x048C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x048C + ,simpleLowerCaseMapping:0x048D + ,simpleTitleCaseMapping:0x048C + }, + { code:0x048D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x048C + ,simpleLowerCaseMapping:0x048D + ,simpleTitleCaseMapping:0x048C + }, + { code:0x048E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x048E + ,simpleLowerCaseMapping:0x048F + ,simpleTitleCaseMapping:0x048E + }, + { code:0x048F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x048E + ,simpleLowerCaseMapping:0x048F + ,simpleTitleCaseMapping:0x048E + }, + { code:0x0490 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0490 + ,simpleLowerCaseMapping:0x0491 + ,simpleTitleCaseMapping:0x0490 + }, + { code:0x0491 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0490 + ,simpleLowerCaseMapping:0x0491 + ,simpleTitleCaseMapping:0x0490 + }, + { code:0x0492 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0492 + ,simpleLowerCaseMapping:0x0493 + ,simpleTitleCaseMapping:0x0492 + }, + { code:0x0493 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0492 + ,simpleLowerCaseMapping:0x0493 + ,simpleTitleCaseMapping:0x0492 + }, + { code:0x0494 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0494 + ,simpleLowerCaseMapping:0x0495 + ,simpleTitleCaseMapping:0x0494 + }, + { code:0x0495 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0494 + ,simpleLowerCaseMapping:0x0495 + ,simpleTitleCaseMapping:0x0494 + }, + { code:0x0496 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0496 + ,simpleLowerCaseMapping:0x0497 + ,simpleTitleCaseMapping:0x0496 + }, + { code:0x0497 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0496 + ,simpleLowerCaseMapping:0x0497 + ,simpleTitleCaseMapping:0x0496 + }, + { code:0x0498 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0498 + ,simpleLowerCaseMapping:0x0499 + ,simpleTitleCaseMapping:0x0498 + }, + { code:0x0499 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0498 + ,simpleLowerCaseMapping:0x0499 + ,simpleTitleCaseMapping:0x0498 + }, + { code:0x049A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x049A + ,simpleLowerCaseMapping:0x049B + ,simpleTitleCaseMapping:0x049A + }, + { code:0x049B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x049A + ,simpleLowerCaseMapping:0x049B + ,simpleTitleCaseMapping:0x049A + }, + { code:0x049C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x049C + ,simpleLowerCaseMapping:0x049D + ,simpleTitleCaseMapping:0x049C + }, + { code:0x049D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x049C + ,simpleLowerCaseMapping:0x049D + ,simpleTitleCaseMapping:0x049C + }, + { code:0x049E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x049E + ,simpleLowerCaseMapping:0x049F + ,simpleTitleCaseMapping:0x049E + }, + { code:0x049F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x049E + ,simpleLowerCaseMapping:0x049F + ,simpleTitleCaseMapping:0x049E + }, + { code:0x04A0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04A0 + ,simpleLowerCaseMapping:0x04A1 + ,simpleTitleCaseMapping:0x04A0 + }, + { code:0x04A1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04A0 + ,simpleLowerCaseMapping:0x04A1 + ,simpleTitleCaseMapping:0x04A0 + }, + { code:0x04A2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04A2 + ,simpleLowerCaseMapping:0x04A3 + ,simpleTitleCaseMapping:0x04A2 + }, + { code:0x04A3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04A2 + ,simpleLowerCaseMapping:0x04A3 + ,simpleTitleCaseMapping:0x04A2 + }, + { code:0x04A4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04A4 + ,simpleLowerCaseMapping:0x04A5 + ,simpleTitleCaseMapping:0x04A4 + }, + { code:0x04A5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04A4 + ,simpleLowerCaseMapping:0x04A5 + ,simpleTitleCaseMapping:0x04A4 + }, + { code:0x04A6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04A6 + ,simpleLowerCaseMapping:0x04A7 + ,simpleTitleCaseMapping:0x04A6 + }, + { code:0x04A7 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04A6 + ,simpleLowerCaseMapping:0x04A7 + ,simpleTitleCaseMapping:0x04A6 + }, + { code:0x04A8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04A8 + ,simpleLowerCaseMapping:0x04A9 + ,simpleTitleCaseMapping:0x04A8 + }, + { code:0x04A9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04A8 + ,simpleLowerCaseMapping:0x04A9 + ,simpleTitleCaseMapping:0x04A8 + }, + { code:0x04AA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04AA + ,simpleLowerCaseMapping:0x04AB + ,simpleTitleCaseMapping:0x04AA + }, + { code:0x04AB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04AA + ,simpleLowerCaseMapping:0x04AB + ,simpleTitleCaseMapping:0x04AA + }, + { code:0x04AC + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04AC + ,simpleLowerCaseMapping:0x04AD + ,simpleTitleCaseMapping:0x04AC + }, + { code:0x04AD + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04AC + ,simpleLowerCaseMapping:0x04AD + ,simpleTitleCaseMapping:0x04AC + }, + { code:0x04AE + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04AE + ,simpleLowerCaseMapping:0x04AF + ,simpleTitleCaseMapping:0x04AE + }, + { code:0x04AF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04AE + ,simpleLowerCaseMapping:0x04AF + ,simpleTitleCaseMapping:0x04AE + }, + { code:0x04B0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04B0 + ,simpleLowerCaseMapping:0x04B1 + ,simpleTitleCaseMapping:0x04B0 + }, + { code:0x04B1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04B0 + ,simpleLowerCaseMapping:0x04B1 + ,simpleTitleCaseMapping:0x04B0 + }, + { code:0x04B2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04B2 + ,simpleLowerCaseMapping:0x04B3 + ,simpleTitleCaseMapping:0x04B2 + }, + { code:0x04B3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04B2 + ,simpleLowerCaseMapping:0x04B3 + ,simpleTitleCaseMapping:0x04B2 + }, + { code:0x04B4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04B4 + ,simpleLowerCaseMapping:0x04B5 + ,simpleTitleCaseMapping:0x04B4 + }, + { code:0x04B5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04B4 + ,simpleLowerCaseMapping:0x04B5 + ,simpleTitleCaseMapping:0x04B4 + }, + { code:0x04B6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04B6 + ,simpleLowerCaseMapping:0x04B7 + ,simpleTitleCaseMapping:0x04B6 + }, + { code:0x04B7 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04B6 + ,simpleLowerCaseMapping:0x04B7 + ,simpleTitleCaseMapping:0x04B6 + }, + { code:0x04B8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04B8 + ,simpleLowerCaseMapping:0x04B9 + ,simpleTitleCaseMapping:0x04B8 + }, + { code:0x04B9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04B8 + ,simpleLowerCaseMapping:0x04B9 + ,simpleTitleCaseMapping:0x04B8 + }, + { code:0x04BA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04BA + ,simpleLowerCaseMapping:0x04BB + ,simpleTitleCaseMapping:0x04BA + }, + { code:0x04BB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04BA + ,simpleLowerCaseMapping:0x04BB + ,simpleTitleCaseMapping:0x04BA + }, + { code:0x04BC + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04BC + ,simpleLowerCaseMapping:0x04BD + ,simpleTitleCaseMapping:0x04BC + }, + { code:0x04BD + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04BC + ,simpleLowerCaseMapping:0x04BD + ,simpleTitleCaseMapping:0x04BC + }, + { code:0x04BE + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04BE + ,simpleLowerCaseMapping:0x04BF + ,simpleTitleCaseMapping:0x04BE + }, + { code:0x04BF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04BE + ,simpleLowerCaseMapping:0x04BF + ,simpleTitleCaseMapping:0x04BE + }, + { code:0x04C0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04C0 + ,simpleLowerCaseMapping:0x04CF + ,simpleTitleCaseMapping:0x04C0 + }, + { code:0x04C1 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04C1 + ,simpleLowerCaseMapping:0x04C2 + ,simpleTitleCaseMapping:0x04C1 + }, + { code:0x04C2 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04C1 + ,simpleLowerCaseMapping:0x04C2 + ,simpleTitleCaseMapping:0x04C1 + }, + { code:0x04C3 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04C3 + ,simpleLowerCaseMapping:0x04C4 + ,simpleTitleCaseMapping:0x04C3 + }, + { code:0x04C4 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04C3 + ,simpleLowerCaseMapping:0x04C4 + ,simpleTitleCaseMapping:0x04C3 + }, + { code:0x04C5 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04C5 + ,simpleLowerCaseMapping:0x04C6 + ,simpleTitleCaseMapping:0x04C5 + }, + { code:0x04C6 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04C5 + ,simpleLowerCaseMapping:0x04C6 + ,simpleTitleCaseMapping:0x04C5 + }, + { code:0x04C7 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04C7 + ,simpleLowerCaseMapping:0x04C8 + ,simpleTitleCaseMapping:0x04C7 + }, + { code:0x04C8 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04C7 + ,simpleLowerCaseMapping:0x04C8 + ,simpleTitleCaseMapping:0x04C7 + }, + { code:0x04C9 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04C9 + ,simpleLowerCaseMapping:0x04CA + ,simpleTitleCaseMapping:0x04C9 + }, + { code:0x04CA + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04C9 + ,simpleLowerCaseMapping:0x04CA + ,simpleTitleCaseMapping:0x04C9 + }, + { code:0x04CB + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04CB + ,simpleLowerCaseMapping:0x04CC + ,simpleTitleCaseMapping:0x04CB + }, + { code:0x04CC + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04CB + ,simpleLowerCaseMapping:0x04CC + ,simpleTitleCaseMapping:0x04CB + }, + { code:0x04CD + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04CD + ,simpleLowerCaseMapping:0x04CE + ,simpleTitleCaseMapping:0x04CD + }, + { code:0x04CE + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04CD + ,simpleLowerCaseMapping:0x04CE + ,simpleTitleCaseMapping:0x04CD + }, + { code:0x04CF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04C0 + ,simpleLowerCaseMapping:0x04CF + ,simpleTitleCaseMapping:0x04C0 + }, + { code:0x04D0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04D0 + ,simpleLowerCaseMapping:0x04D1 + ,simpleTitleCaseMapping:0x04D0 + }, + { code:0x04D1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04D0 + ,simpleLowerCaseMapping:0x04D1 + ,simpleTitleCaseMapping:0x04D0 + }, + { code:0x04D2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04D2 + ,simpleLowerCaseMapping:0x04D3 + ,simpleTitleCaseMapping:0x04D2 + }, + { code:0x04D3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04D2 + ,simpleLowerCaseMapping:0x04D3 + ,simpleTitleCaseMapping:0x04D2 + }, + { code:0x04D4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04D4 + ,simpleLowerCaseMapping:0x04D5 + ,simpleTitleCaseMapping:0x04D4 + }, + { code:0x04D5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04D4 + ,simpleLowerCaseMapping:0x04D5 + ,simpleTitleCaseMapping:0x04D4 + }, + { code:0x04D6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04D6 + ,simpleLowerCaseMapping:0x04D7 + ,simpleTitleCaseMapping:0x04D6 + }, + { code:0x04D7 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04D6 + ,simpleLowerCaseMapping:0x04D7 + ,simpleTitleCaseMapping:0x04D6 + }, + { code:0x04D8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04D8 + ,simpleLowerCaseMapping:0x04D9 + ,simpleTitleCaseMapping:0x04D8 + }, + { code:0x04D9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04D8 + ,simpleLowerCaseMapping:0x04D9 + ,simpleTitleCaseMapping:0x04D8 + }, + { code:0x04DA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04DA + ,simpleLowerCaseMapping:0x04DB + ,simpleTitleCaseMapping:0x04DA + }, + { code:0x04DB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04DA + ,simpleLowerCaseMapping:0x04DB + ,simpleTitleCaseMapping:0x04DA + }, + { code:0x04DC + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04DC + ,simpleLowerCaseMapping:0x04DD + ,simpleTitleCaseMapping:0x04DC + }, + { code:0x04DD + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04DC + ,simpleLowerCaseMapping:0x04DD + ,simpleTitleCaseMapping:0x04DC + }, + { code:0x04DE + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04DE + ,simpleLowerCaseMapping:0x04DF + ,simpleTitleCaseMapping:0x04DE + }, + { code:0x04DF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04DE + ,simpleLowerCaseMapping:0x04DF + ,simpleTitleCaseMapping:0x04DE + }, + { code:0x04E0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04E0 + ,simpleLowerCaseMapping:0x04E1 + ,simpleTitleCaseMapping:0x04E0 + }, + { code:0x04E1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04E0 + ,simpleLowerCaseMapping:0x04E1 + ,simpleTitleCaseMapping:0x04E0 + }, + { code:0x04E2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04E2 + ,simpleLowerCaseMapping:0x04E3 + ,simpleTitleCaseMapping:0x04E2 + }, + { code:0x04E3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04E2 + ,simpleLowerCaseMapping:0x04E3 + ,simpleTitleCaseMapping:0x04E2 + }, + { code:0x04E4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04E4 + ,simpleLowerCaseMapping:0x04E5 + ,simpleTitleCaseMapping:0x04E4 + }, + { code:0x04E5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04E4 + ,simpleLowerCaseMapping:0x04E5 + ,simpleTitleCaseMapping:0x04E4 + }, + { code:0x04E6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04E6 + ,simpleLowerCaseMapping:0x04E7 + ,simpleTitleCaseMapping:0x04E6 + }, + { code:0x04E7 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04E6 + ,simpleLowerCaseMapping:0x04E7 + ,simpleTitleCaseMapping:0x04E6 + }, + { code:0x04E8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04E8 + ,simpleLowerCaseMapping:0x04E9 + ,simpleTitleCaseMapping:0x04E8 + }, + { code:0x04E9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04E8 + ,simpleLowerCaseMapping:0x04E9 + ,simpleTitleCaseMapping:0x04E8 + }, + { code:0x04EA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04EA + ,simpleLowerCaseMapping:0x04EB + ,simpleTitleCaseMapping:0x04EA + }, + { code:0x04EB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04EA + ,simpleLowerCaseMapping:0x04EB + ,simpleTitleCaseMapping:0x04EA + }, + { code:0x04EC + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04EC + ,simpleLowerCaseMapping:0x04ED + ,simpleTitleCaseMapping:0x04EC + }, + { code:0x04ED + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04EC + ,simpleLowerCaseMapping:0x04ED + ,simpleTitleCaseMapping:0x04EC + }, + { code:0x04EE + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04EE + ,simpleLowerCaseMapping:0x04EF + ,simpleTitleCaseMapping:0x04EE + }, + { code:0x04EF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04EE + ,simpleLowerCaseMapping:0x04EF + ,simpleTitleCaseMapping:0x04EE + }, + { code:0x04F0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04F0 + ,simpleLowerCaseMapping:0x04F1 + ,simpleTitleCaseMapping:0x04F0 + }, + { code:0x04F1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04F0 + ,simpleLowerCaseMapping:0x04F1 + ,simpleTitleCaseMapping:0x04F0 + }, + { code:0x04F2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04F2 + ,simpleLowerCaseMapping:0x04F3 + ,simpleTitleCaseMapping:0x04F2 + }, + { code:0x04F3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04F2 + ,simpleLowerCaseMapping:0x04F3 + ,simpleTitleCaseMapping:0x04F2 + }, + { code:0x04F4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04F4 + ,simpleLowerCaseMapping:0x04F5 + ,simpleTitleCaseMapping:0x04F4 + }, + { code:0x04F5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04F4 + ,simpleLowerCaseMapping:0x04F5 + ,simpleTitleCaseMapping:0x04F4 + }, + { code:0x04F6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04F6 + ,simpleLowerCaseMapping:0x04F7 + ,simpleTitleCaseMapping:0x04F6 + }, + { code:0x04F7 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04F6 + ,simpleLowerCaseMapping:0x04F7 + ,simpleTitleCaseMapping:0x04F6 + }, + { code:0x04F8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04F8 + ,simpleLowerCaseMapping:0x04F9 + ,simpleTitleCaseMapping:0x04F8 + }, + { code:0x04F9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04F8 + ,simpleLowerCaseMapping:0x04F9 + ,simpleTitleCaseMapping:0x04F8 + }, + { code:0x04FA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04FA + ,simpleLowerCaseMapping:0x04FB + ,simpleTitleCaseMapping:0x04FA + }, + { code:0x04FB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04FA + ,simpleLowerCaseMapping:0x04FB + ,simpleTitleCaseMapping:0x04FA + }, + { code:0x04FC + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04FC + ,simpleLowerCaseMapping:0x04FD + ,simpleTitleCaseMapping:0x04FC + }, + { code:0x04FD + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04FC + ,simpleLowerCaseMapping:0x04FD + ,simpleTitleCaseMapping:0x04FC + }, + { code:0x04FE + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x04FE + ,simpleLowerCaseMapping:0x04FF + ,simpleTitleCaseMapping:0x04FE + }, + { code:0x04FF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x04FE + ,simpleLowerCaseMapping:0x04FF + ,simpleTitleCaseMapping:0x04FE + }, + { code:0x0500 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0500 + ,simpleLowerCaseMapping:0x0501 + ,simpleTitleCaseMapping:0x0500 + }, + { code:0x0501 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0500 + ,simpleLowerCaseMapping:0x0501 + ,simpleTitleCaseMapping:0x0500 + }, + { code:0x0502 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0502 + ,simpleLowerCaseMapping:0x0503 + ,simpleTitleCaseMapping:0x0502 + }, + { code:0x0503 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0502 + ,simpleLowerCaseMapping:0x0503 + ,simpleTitleCaseMapping:0x0502 + }, + { code:0x0504 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0504 + ,simpleLowerCaseMapping:0x0505 + ,simpleTitleCaseMapping:0x0504 + }, + { code:0x0505 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0504 + ,simpleLowerCaseMapping:0x0505 + ,simpleTitleCaseMapping:0x0504 + }, + { code:0x0506 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0506 + ,simpleLowerCaseMapping:0x0507 + ,simpleTitleCaseMapping:0x0506 + }, + { code:0x0507 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0506 + ,simpleLowerCaseMapping:0x0507 + ,simpleTitleCaseMapping:0x0506 + }, + { code:0x0508 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0508 + ,simpleLowerCaseMapping:0x0509 + ,simpleTitleCaseMapping:0x0508 + }, + { code:0x0509 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0508 + ,simpleLowerCaseMapping:0x0509 + ,simpleTitleCaseMapping:0x0508 + }, + { code:0x050A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x050A + ,simpleLowerCaseMapping:0x050B + ,simpleTitleCaseMapping:0x050A + }, + { code:0x050B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x050A + ,simpleLowerCaseMapping:0x050B + ,simpleTitleCaseMapping:0x050A + }, + { code:0x050C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x050C + ,simpleLowerCaseMapping:0x050D + ,simpleTitleCaseMapping:0x050C + }, + { code:0x050D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x050C + ,simpleLowerCaseMapping:0x050D + ,simpleTitleCaseMapping:0x050C + }, + { code:0x050E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x050E + ,simpleLowerCaseMapping:0x050F + ,simpleTitleCaseMapping:0x050E + }, + { code:0x050F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x050E + ,simpleLowerCaseMapping:0x050F + ,simpleTitleCaseMapping:0x050E + }, + { code:0x0510 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0510 + ,simpleLowerCaseMapping:0x0511 + ,simpleTitleCaseMapping:0x0510 + }, + { code:0x0511 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0510 + ,simpleLowerCaseMapping:0x0511 + ,simpleTitleCaseMapping:0x0510 + }, + { code:0x0512 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0512 + ,simpleLowerCaseMapping:0x0513 + ,simpleTitleCaseMapping:0x0512 + }, + { code:0x0513 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0512 + ,simpleLowerCaseMapping:0x0513 + ,simpleTitleCaseMapping:0x0512 + }, + { code:0x0531 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0531 + ,simpleLowerCaseMapping:0x0561 + ,simpleTitleCaseMapping:0x0531 + }, + { code:0x0532 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0532 + ,simpleLowerCaseMapping:0x0562 + ,simpleTitleCaseMapping:0x0532 + }, + { code:0x0533 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0533 + ,simpleLowerCaseMapping:0x0563 + ,simpleTitleCaseMapping:0x0533 + }, + { code:0x0534 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0534 + ,simpleLowerCaseMapping:0x0564 + ,simpleTitleCaseMapping:0x0534 + }, + { code:0x0535 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0535 + ,simpleLowerCaseMapping:0x0565 + ,simpleTitleCaseMapping:0x0535 + }, + { code:0x0536 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0536 + ,simpleLowerCaseMapping:0x0566 + ,simpleTitleCaseMapping:0x0536 + }, + { code:0x0537 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0537 + ,simpleLowerCaseMapping:0x0567 + ,simpleTitleCaseMapping:0x0537 + }, + { code:0x0538 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0538 + ,simpleLowerCaseMapping:0x0568 + ,simpleTitleCaseMapping:0x0538 + }, + { code:0x0539 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0539 + ,simpleLowerCaseMapping:0x0569 + ,simpleTitleCaseMapping:0x0539 + }, + { code:0x053A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x053A + ,simpleLowerCaseMapping:0x056A + ,simpleTitleCaseMapping:0x053A + }, + { code:0x053B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x053B + ,simpleLowerCaseMapping:0x056B + ,simpleTitleCaseMapping:0x053B + }, + { code:0x053C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x053C + ,simpleLowerCaseMapping:0x056C + ,simpleTitleCaseMapping:0x053C + }, + { code:0x053D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x053D + ,simpleLowerCaseMapping:0x056D + ,simpleTitleCaseMapping:0x053D + }, + { code:0x053E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x053E + ,simpleLowerCaseMapping:0x056E + ,simpleTitleCaseMapping:0x053E + }, + { code:0x053F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x053F + ,simpleLowerCaseMapping:0x056F + ,simpleTitleCaseMapping:0x053F + }, + { code:0x0540 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0540 + ,simpleLowerCaseMapping:0x0570 + ,simpleTitleCaseMapping:0x0540 + }, + { code:0x0541 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0541 + ,simpleLowerCaseMapping:0x0571 + ,simpleTitleCaseMapping:0x0541 + }, + { code:0x0542 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0542 + ,simpleLowerCaseMapping:0x0572 + ,simpleTitleCaseMapping:0x0542 + }, + { code:0x0543 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0543 + ,simpleLowerCaseMapping:0x0573 + ,simpleTitleCaseMapping:0x0543 + }, + { code:0x0544 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0544 + ,simpleLowerCaseMapping:0x0574 + ,simpleTitleCaseMapping:0x0544 + }, + { code:0x0545 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0545 + ,simpleLowerCaseMapping:0x0575 + ,simpleTitleCaseMapping:0x0545 + }, + { code:0x0546 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0546 + ,simpleLowerCaseMapping:0x0576 + ,simpleTitleCaseMapping:0x0546 + }, + { code:0x0547 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0547 + ,simpleLowerCaseMapping:0x0577 + ,simpleTitleCaseMapping:0x0547 + }, + { code:0x0548 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0548 + ,simpleLowerCaseMapping:0x0578 + ,simpleTitleCaseMapping:0x0548 + }, + { code:0x0549 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0549 + ,simpleLowerCaseMapping:0x0579 + ,simpleTitleCaseMapping:0x0549 + }, + { code:0x054A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x054A + ,simpleLowerCaseMapping:0x057A + ,simpleTitleCaseMapping:0x054A + }, + { code:0x054B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x054B + ,simpleLowerCaseMapping:0x057B + ,simpleTitleCaseMapping:0x054B + }, + { code:0x054C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x054C + ,simpleLowerCaseMapping:0x057C + ,simpleTitleCaseMapping:0x054C + }, + { code:0x054D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x054D + ,simpleLowerCaseMapping:0x057D + ,simpleTitleCaseMapping:0x054D + }, + { code:0x054E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x054E + ,simpleLowerCaseMapping:0x057E + ,simpleTitleCaseMapping:0x054E + }, + { code:0x054F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x054F + ,simpleLowerCaseMapping:0x057F + ,simpleTitleCaseMapping:0x054F + }, + { code:0x0550 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0550 + ,simpleLowerCaseMapping:0x0580 + ,simpleTitleCaseMapping:0x0550 + }, + { code:0x0551 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0551 + ,simpleLowerCaseMapping:0x0581 + ,simpleTitleCaseMapping:0x0551 + }, + { code:0x0552 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0552 + ,simpleLowerCaseMapping:0x0582 + ,simpleTitleCaseMapping:0x0552 + }, + { code:0x0553 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0553 + ,simpleLowerCaseMapping:0x0583 + ,simpleTitleCaseMapping:0x0553 + }, + { code:0x0554 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0554 + ,simpleLowerCaseMapping:0x0584 + ,simpleTitleCaseMapping:0x0554 + }, + { code:0x0555 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0555 + ,simpleLowerCaseMapping:0x0585 + ,simpleTitleCaseMapping:0x0555 + }, + { code:0x0556 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x0556 + ,simpleLowerCaseMapping:0x0586 + ,simpleTitleCaseMapping:0x0556 + }, + { code:0x0559 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x0559 + ,simpleLowerCaseMapping:0x0559 + ,simpleTitleCaseMapping:0x0559 + }, + { code:0x055A + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x055A + ,simpleLowerCaseMapping:0x055A + ,simpleTitleCaseMapping:0x055A + }, + { code:0x055B + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x055B + ,simpleLowerCaseMapping:0x055B + ,simpleTitleCaseMapping:0x055B + }, + { code:0x055C + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x055C + ,simpleLowerCaseMapping:0x055C + ,simpleTitleCaseMapping:0x055C + }, + { code:0x055D + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x055D + ,simpleLowerCaseMapping:0x055D + ,simpleTitleCaseMapping:0x055D + }, + { code:0x055E + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x055E + ,simpleLowerCaseMapping:0x055E + ,simpleTitleCaseMapping:0x055E + }, + { code:0x055F + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x055F + ,simpleLowerCaseMapping:0x055F + ,simpleTitleCaseMapping:0x055F + }, + { code:0x0561 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0531 + ,simpleLowerCaseMapping:0x0561 + ,simpleTitleCaseMapping:0x0531 + }, + { code:0x0562 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0532 + ,simpleLowerCaseMapping:0x0562 + ,simpleTitleCaseMapping:0x0532 + }, + { code:0x0563 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0533 + ,simpleLowerCaseMapping:0x0563 + ,simpleTitleCaseMapping:0x0533 + }, + { code:0x0564 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0534 + ,simpleLowerCaseMapping:0x0564 + ,simpleTitleCaseMapping:0x0534 + }, + { code:0x0565 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0535 + ,simpleLowerCaseMapping:0x0565 + ,simpleTitleCaseMapping:0x0535 + }, + { code:0x0566 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0536 + ,simpleLowerCaseMapping:0x0566 + ,simpleTitleCaseMapping:0x0536 + }, + { code:0x0567 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0537 + ,simpleLowerCaseMapping:0x0567 + ,simpleTitleCaseMapping:0x0537 + }, + { code:0x0568 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0538 + ,simpleLowerCaseMapping:0x0568 + ,simpleTitleCaseMapping:0x0538 + }, + { code:0x0569 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0539 + ,simpleLowerCaseMapping:0x0569 + ,simpleTitleCaseMapping:0x0539 + }, + { code:0x056A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x053A + ,simpleLowerCaseMapping:0x056A + ,simpleTitleCaseMapping:0x053A + }, + { code:0x056B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x053B + ,simpleLowerCaseMapping:0x056B + ,simpleTitleCaseMapping:0x053B + }, + { code:0x056C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x053C + ,simpleLowerCaseMapping:0x056C + ,simpleTitleCaseMapping:0x053C + }, + { code:0x056D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x053D + ,simpleLowerCaseMapping:0x056D + ,simpleTitleCaseMapping:0x053D + }, + { code:0x056E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x053E + ,simpleLowerCaseMapping:0x056E + ,simpleTitleCaseMapping:0x053E + }, + { code:0x056F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x053F + ,simpleLowerCaseMapping:0x056F + ,simpleTitleCaseMapping:0x053F + }, + { code:0x0570 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0540 + ,simpleLowerCaseMapping:0x0570 + ,simpleTitleCaseMapping:0x0540 + }, + { code:0x0571 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0541 + ,simpleLowerCaseMapping:0x0571 + ,simpleTitleCaseMapping:0x0541 + }, + { code:0x0572 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0542 + ,simpleLowerCaseMapping:0x0572 + ,simpleTitleCaseMapping:0x0542 + }, + { code:0x0573 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0543 + ,simpleLowerCaseMapping:0x0573 + ,simpleTitleCaseMapping:0x0543 + }, + { code:0x0574 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0544 + ,simpleLowerCaseMapping:0x0574 + ,simpleTitleCaseMapping:0x0544 + }, + { code:0x0575 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0545 + ,simpleLowerCaseMapping:0x0575 + ,simpleTitleCaseMapping:0x0545 + }, + { code:0x0576 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0546 + ,simpleLowerCaseMapping:0x0576 + ,simpleTitleCaseMapping:0x0546 + }, + { code:0x0577 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0547 + ,simpleLowerCaseMapping:0x0577 + ,simpleTitleCaseMapping:0x0547 + }, + { code:0x0578 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0548 + ,simpleLowerCaseMapping:0x0578 + ,simpleTitleCaseMapping:0x0548 + }, + { code:0x0579 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0549 + ,simpleLowerCaseMapping:0x0579 + ,simpleTitleCaseMapping:0x0549 + }, + { code:0x057A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x054A + ,simpleLowerCaseMapping:0x057A + ,simpleTitleCaseMapping:0x054A + }, + { code:0x057B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x054B + ,simpleLowerCaseMapping:0x057B + ,simpleTitleCaseMapping:0x054B + }, + { code:0x057C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x054C + ,simpleLowerCaseMapping:0x057C + ,simpleTitleCaseMapping:0x054C + }, + { code:0x057D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x054D + ,simpleLowerCaseMapping:0x057D + ,simpleTitleCaseMapping:0x054D + }, + { code:0x057E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x054E + ,simpleLowerCaseMapping:0x057E + ,simpleTitleCaseMapping:0x054E + }, + { code:0x057F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x054F + ,simpleLowerCaseMapping:0x057F + ,simpleTitleCaseMapping:0x054F + }, + { code:0x0580 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0550 + ,simpleLowerCaseMapping:0x0580 + ,simpleTitleCaseMapping:0x0550 + }, + { code:0x0581 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0551 + ,simpleLowerCaseMapping:0x0581 + ,simpleTitleCaseMapping:0x0551 + }, + { code:0x0582 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0552 + ,simpleLowerCaseMapping:0x0582 + ,simpleTitleCaseMapping:0x0552 + }, + { code:0x0583 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0553 + ,simpleLowerCaseMapping:0x0583 + ,simpleTitleCaseMapping:0x0553 + }, + { code:0x0584 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0554 + ,simpleLowerCaseMapping:0x0584 + ,simpleTitleCaseMapping:0x0554 + }, + { code:0x0585 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0555 + ,simpleLowerCaseMapping:0x0585 + ,simpleTitleCaseMapping:0x0555 + }, + { code:0x0586 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0556 + ,simpleLowerCaseMapping:0x0586 + ,simpleTitleCaseMapping:0x0556 + }, + { code:0x0587 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x0587 + ,simpleLowerCaseMapping:0x0587 + ,simpleTitleCaseMapping:0x0587 + }, + { code:0x0589 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0589 + ,simpleLowerCaseMapping:0x0589 + ,simpleTitleCaseMapping:0x0589 + }, + { code:0x058A + ,generalCategory:UnicodeData.GeneralCategory.Pd + ,simpleUpperCaseMapping:0x058A + ,simpleLowerCaseMapping:0x058A + ,simpleTitleCaseMapping:0x058A + }, + { code:0x0591 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0591 + ,simpleLowerCaseMapping:0x0591 + ,simpleTitleCaseMapping:0x0591 + }, + { code:0x0592 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0592 + ,simpleLowerCaseMapping:0x0592 + ,simpleTitleCaseMapping:0x0592 + }, + { code:0x0593 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0593 + ,simpleLowerCaseMapping:0x0593 + ,simpleTitleCaseMapping:0x0593 + }, + { code:0x0594 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0594 + ,simpleLowerCaseMapping:0x0594 + ,simpleTitleCaseMapping:0x0594 + }, + { code:0x0595 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0595 + ,simpleLowerCaseMapping:0x0595 + ,simpleTitleCaseMapping:0x0595 + }, + { code:0x0596 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0596 + ,simpleLowerCaseMapping:0x0596 + ,simpleTitleCaseMapping:0x0596 + }, + { code:0x0597 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0597 + ,simpleLowerCaseMapping:0x0597 + ,simpleTitleCaseMapping:0x0597 + }, + { code:0x0598 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0598 + ,simpleLowerCaseMapping:0x0598 + ,simpleTitleCaseMapping:0x0598 + }, + { code:0x0599 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0599 + ,simpleLowerCaseMapping:0x0599 + ,simpleTitleCaseMapping:0x0599 + }, + { code:0x059A + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x059A + ,simpleLowerCaseMapping:0x059A + ,simpleTitleCaseMapping:0x059A + }, + { code:0x059B + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x059B + ,simpleLowerCaseMapping:0x059B + ,simpleTitleCaseMapping:0x059B + }, + { code:0x059C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x059C + ,simpleLowerCaseMapping:0x059C + ,simpleTitleCaseMapping:0x059C + }, + { code:0x059D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x059D + ,simpleLowerCaseMapping:0x059D + ,simpleTitleCaseMapping:0x059D + }, + { code:0x059E + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x059E + ,simpleLowerCaseMapping:0x059E + ,simpleTitleCaseMapping:0x059E + }, + { code:0x059F + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x059F + ,simpleLowerCaseMapping:0x059F + ,simpleTitleCaseMapping:0x059F + }, + { code:0x05A0 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05A0 + ,simpleLowerCaseMapping:0x05A0 + ,simpleTitleCaseMapping:0x05A0 + }, + { code:0x05A1 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05A1 + ,simpleLowerCaseMapping:0x05A1 + ,simpleTitleCaseMapping:0x05A1 + }, + { code:0x05A2 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05A2 + ,simpleLowerCaseMapping:0x05A2 + ,simpleTitleCaseMapping:0x05A2 + }, + { code:0x05A3 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05A3 + ,simpleLowerCaseMapping:0x05A3 + ,simpleTitleCaseMapping:0x05A3 + }, + { code:0x05A4 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05A4 + ,simpleLowerCaseMapping:0x05A4 + ,simpleTitleCaseMapping:0x05A4 + }, + { code:0x05A5 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05A5 + ,simpleLowerCaseMapping:0x05A5 + ,simpleTitleCaseMapping:0x05A5 + }, + { code:0x05A6 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05A6 + ,simpleLowerCaseMapping:0x05A6 + ,simpleTitleCaseMapping:0x05A6 + }, + { code:0x05A7 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05A7 + ,simpleLowerCaseMapping:0x05A7 + ,simpleTitleCaseMapping:0x05A7 + }, + { code:0x05A8 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05A8 + ,simpleLowerCaseMapping:0x05A8 + ,simpleTitleCaseMapping:0x05A8 + }, + { code:0x05A9 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05A9 + ,simpleLowerCaseMapping:0x05A9 + ,simpleTitleCaseMapping:0x05A9 + }, + { code:0x05AA + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05AA + ,simpleLowerCaseMapping:0x05AA + ,simpleTitleCaseMapping:0x05AA + }, + { code:0x05AB + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05AB + ,simpleLowerCaseMapping:0x05AB + ,simpleTitleCaseMapping:0x05AB + }, + { code:0x05AC + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05AC + ,simpleLowerCaseMapping:0x05AC + ,simpleTitleCaseMapping:0x05AC + }, + { code:0x05AD + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05AD + ,simpleLowerCaseMapping:0x05AD + ,simpleTitleCaseMapping:0x05AD + }, + { code:0x05AE + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05AE + ,simpleLowerCaseMapping:0x05AE + ,simpleTitleCaseMapping:0x05AE + }, + { code:0x05AF + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05AF + ,simpleLowerCaseMapping:0x05AF + ,simpleTitleCaseMapping:0x05AF + }, + { code:0x05B0 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05B0 + ,simpleLowerCaseMapping:0x05B0 + ,simpleTitleCaseMapping:0x05B0 + }, + { code:0x05B1 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05B1 + ,simpleLowerCaseMapping:0x05B1 + ,simpleTitleCaseMapping:0x05B1 + }, + { code:0x05B2 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05B2 + ,simpleLowerCaseMapping:0x05B2 + ,simpleTitleCaseMapping:0x05B2 + }, + { code:0x05B3 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05B3 + ,simpleLowerCaseMapping:0x05B3 + ,simpleTitleCaseMapping:0x05B3 + }, + { code:0x05B4 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05B4 + ,simpleLowerCaseMapping:0x05B4 + ,simpleTitleCaseMapping:0x05B4 + }, + { code:0x05B5 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05B5 + ,simpleLowerCaseMapping:0x05B5 + ,simpleTitleCaseMapping:0x05B5 + }, + { code:0x05B6 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05B6 + ,simpleLowerCaseMapping:0x05B6 + ,simpleTitleCaseMapping:0x05B6 + }, + { code:0x05B7 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05B7 + ,simpleLowerCaseMapping:0x05B7 + ,simpleTitleCaseMapping:0x05B7 + }, + { code:0x05B8 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05B8 + ,simpleLowerCaseMapping:0x05B8 + ,simpleTitleCaseMapping:0x05B8 + }, + { code:0x05B9 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05B9 + ,simpleLowerCaseMapping:0x05B9 + ,simpleTitleCaseMapping:0x05B9 + }, + { code:0x05BA + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05BA + ,simpleLowerCaseMapping:0x05BA + ,simpleTitleCaseMapping:0x05BA + }, + { code:0x05BB + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05BB + ,simpleLowerCaseMapping:0x05BB + ,simpleTitleCaseMapping:0x05BB + }, + { code:0x05BC + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05BC + ,simpleLowerCaseMapping:0x05BC + ,simpleTitleCaseMapping:0x05BC + }, + { code:0x05BD + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05BD + ,simpleLowerCaseMapping:0x05BD + ,simpleTitleCaseMapping:0x05BD + }, + { code:0x05BE + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x05BE + ,simpleLowerCaseMapping:0x05BE + ,simpleTitleCaseMapping:0x05BE + }, + { code:0x05BF + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05BF + ,simpleLowerCaseMapping:0x05BF + ,simpleTitleCaseMapping:0x05BF + }, + { code:0x05C0 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x05C0 + ,simpleLowerCaseMapping:0x05C0 + ,simpleTitleCaseMapping:0x05C0 + }, + { code:0x05C1 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05C1 + ,simpleLowerCaseMapping:0x05C1 + ,simpleTitleCaseMapping:0x05C1 + }, + { code:0x05C2 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05C2 + ,simpleLowerCaseMapping:0x05C2 + ,simpleTitleCaseMapping:0x05C2 + }, + { code:0x05C3 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x05C3 + ,simpleLowerCaseMapping:0x05C3 + ,simpleTitleCaseMapping:0x05C3 + }, + { code:0x05C4 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05C4 + ,simpleLowerCaseMapping:0x05C4 + ,simpleTitleCaseMapping:0x05C4 + }, + { code:0x05C5 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05C5 + ,simpleLowerCaseMapping:0x05C5 + ,simpleTitleCaseMapping:0x05C5 + }, + { code:0x05C6 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x05C6 + ,simpleLowerCaseMapping:0x05C6 + ,simpleTitleCaseMapping:0x05C6 + }, + { code:0x05C7 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x05C7 + ,simpleLowerCaseMapping:0x05C7 + ,simpleTitleCaseMapping:0x05C7 + }, + { code:0x05D0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x05D0 + ,simpleLowerCaseMapping:0x05D0 + ,simpleTitleCaseMapping:0x05D0 + }, + { code:0x05D1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x05D1 + ,simpleLowerCaseMapping:0x05D1 + ,simpleTitleCaseMapping:0x05D1 + }, + { code:0x05D2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x05D2 + ,simpleLowerCaseMapping:0x05D2 + ,simpleTitleCaseMapping:0x05D2 + }, + { code:0x05D3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x05D3 + ,simpleLowerCaseMapping:0x05D3 + ,simpleTitleCaseMapping:0x05D3 + }, + { code:0x05D4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x05D4 + ,simpleLowerCaseMapping:0x05D4 + ,simpleTitleCaseMapping:0x05D4 + }, + { code:0x05D5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x05D5 + ,simpleLowerCaseMapping:0x05D5 + ,simpleTitleCaseMapping:0x05D5 + }, + { code:0x05D6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x05D6 + ,simpleLowerCaseMapping:0x05D6 + ,simpleTitleCaseMapping:0x05D6 + }, + { code:0x05D7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x05D7 + ,simpleLowerCaseMapping:0x05D7 + ,simpleTitleCaseMapping:0x05D7 + }, + { code:0x05D8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x05D8 + ,simpleLowerCaseMapping:0x05D8 + ,simpleTitleCaseMapping:0x05D8 + }, + { code:0x05D9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x05D9 + ,simpleLowerCaseMapping:0x05D9 + ,simpleTitleCaseMapping:0x05D9 + }, + { code:0x05DA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x05DA + ,simpleLowerCaseMapping:0x05DA + ,simpleTitleCaseMapping:0x05DA + }, + { code:0x05DB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x05DB + ,simpleLowerCaseMapping:0x05DB + ,simpleTitleCaseMapping:0x05DB + }, + { code:0x05DC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x05DC + ,simpleLowerCaseMapping:0x05DC + ,simpleTitleCaseMapping:0x05DC + }, + { code:0x05DD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x05DD + ,simpleLowerCaseMapping:0x05DD + ,simpleTitleCaseMapping:0x05DD + }, + { code:0x05DE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x05DE + ,simpleLowerCaseMapping:0x05DE + ,simpleTitleCaseMapping:0x05DE + }, + { code:0x05DF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x05DF + ,simpleLowerCaseMapping:0x05DF + ,simpleTitleCaseMapping:0x05DF + }, + { code:0x05E0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x05E0 + ,simpleLowerCaseMapping:0x05E0 + ,simpleTitleCaseMapping:0x05E0 + }, + { code:0x05E1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x05E1 + ,simpleLowerCaseMapping:0x05E1 + ,simpleTitleCaseMapping:0x05E1 + }, + { code:0x05E2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x05E2 + ,simpleLowerCaseMapping:0x05E2 + ,simpleTitleCaseMapping:0x05E2 + }, + { code:0x05E3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x05E3 + ,simpleLowerCaseMapping:0x05E3 + ,simpleTitleCaseMapping:0x05E3 + }, + { code:0x05E4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x05E4 + ,simpleLowerCaseMapping:0x05E4 + ,simpleTitleCaseMapping:0x05E4 + }, + { code:0x05E5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x05E5 + ,simpleLowerCaseMapping:0x05E5 + ,simpleTitleCaseMapping:0x05E5 + }, + { code:0x05E6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x05E6 + ,simpleLowerCaseMapping:0x05E6 + ,simpleTitleCaseMapping:0x05E6 + }, + { code:0x05E7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x05E7 + ,simpleLowerCaseMapping:0x05E7 + ,simpleTitleCaseMapping:0x05E7 + }, + { code:0x05E8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x05E8 + ,simpleLowerCaseMapping:0x05E8 + ,simpleTitleCaseMapping:0x05E8 + }, + { code:0x05E9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x05E9 + ,simpleLowerCaseMapping:0x05E9 + ,simpleTitleCaseMapping:0x05E9 + }, + { code:0x05EA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x05EA + ,simpleLowerCaseMapping:0x05EA + ,simpleTitleCaseMapping:0x05EA + }, + { code:0x05F0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x05F0 + ,simpleLowerCaseMapping:0x05F0 + ,simpleTitleCaseMapping:0x05F0 + }, + { code:0x05F1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x05F1 + ,simpleLowerCaseMapping:0x05F1 + ,simpleTitleCaseMapping:0x05F1 + }, + { code:0x05F2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x05F2 + ,simpleLowerCaseMapping:0x05F2 + ,simpleTitleCaseMapping:0x05F2 + }, + { code:0x05F3 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x05F3 + ,simpleLowerCaseMapping:0x05F3 + ,simpleTitleCaseMapping:0x05F3 + }, + { code:0x05F4 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x05F4 + ,simpleLowerCaseMapping:0x05F4 + ,simpleTitleCaseMapping:0x05F4 + }, + { code:0x0600 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x0600 + ,simpleLowerCaseMapping:0x0600 + ,simpleTitleCaseMapping:0x0600 + }, + { code:0x0601 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x0601 + ,simpleLowerCaseMapping:0x0601 + ,simpleTitleCaseMapping:0x0601 + }, + { code:0x0602 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x0602 + ,simpleLowerCaseMapping:0x0602 + ,simpleTitleCaseMapping:0x0602 + }, + { code:0x0603 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x0603 + ,simpleLowerCaseMapping:0x0603 + ,simpleTitleCaseMapping:0x0603 + }, + { code:0x060B + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0x060B + ,simpleLowerCaseMapping:0x060B + ,simpleTitleCaseMapping:0x060B + }, + { code:0x060C + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x060C + ,simpleLowerCaseMapping:0x060C + ,simpleTitleCaseMapping:0x060C + }, + { code:0x060D + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x060D + ,simpleLowerCaseMapping:0x060D + ,simpleTitleCaseMapping:0x060D + }, + { code:0x060E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x060E + ,simpleLowerCaseMapping:0x060E + ,simpleTitleCaseMapping:0x060E + }, + { code:0x060F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x060F + ,simpleLowerCaseMapping:0x060F + ,simpleTitleCaseMapping:0x060F + }, + { code:0x0610 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0610 + ,simpleLowerCaseMapping:0x0610 + ,simpleTitleCaseMapping:0x0610 + }, + { code:0x0611 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0611 + ,simpleLowerCaseMapping:0x0611 + ,simpleTitleCaseMapping:0x0611 + }, + { code:0x0612 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0612 + ,simpleLowerCaseMapping:0x0612 + ,simpleTitleCaseMapping:0x0612 + }, + { code:0x0613 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0613 + ,simpleLowerCaseMapping:0x0613 + ,simpleTitleCaseMapping:0x0613 + }, + { code:0x0614 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0614 + ,simpleLowerCaseMapping:0x0614 + ,simpleTitleCaseMapping:0x0614 + }, + { code:0x0615 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0615 + ,simpleLowerCaseMapping:0x0615 + ,simpleTitleCaseMapping:0x0615 + }, + { code:0x061B + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x061B + ,simpleLowerCaseMapping:0x061B + ,simpleTitleCaseMapping:0x061B + }, + { code:0x061E + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x061E + ,simpleLowerCaseMapping:0x061E + ,simpleTitleCaseMapping:0x061E + }, + { code:0x061F + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x061F + ,simpleLowerCaseMapping:0x061F + ,simpleTitleCaseMapping:0x061F + }, + { code:0x0621 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0621 + ,simpleLowerCaseMapping:0x0621 + ,simpleTitleCaseMapping:0x0621 + }, + { code:0x0622 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0622 + ,simpleLowerCaseMapping:0x0622 + ,simpleTitleCaseMapping:0x0622 + }, + { code:0x0623 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0623 + ,simpleLowerCaseMapping:0x0623 + ,simpleTitleCaseMapping:0x0623 + }, + { code:0x0624 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0624 + ,simpleLowerCaseMapping:0x0624 + ,simpleTitleCaseMapping:0x0624 + }, + { code:0x0625 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0625 + ,simpleLowerCaseMapping:0x0625 + ,simpleTitleCaseMapping:0x0625 + }, + { code:0x0626 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0626 + ,simpleLowerCaseMapping:0x0626 + ,simpleTitleCaseMapping:0x0626 + }, + { code:0x0627 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0627 + ,simpleLowerCaseMapping:0x0627 + ,simpleTitleCaseMapping:0x0627 + }, + { code:0x0628 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0628 + ,simpleLowerCaseMapping:0x0628 + ,simpleTitleCaseMapping:0x0628 + }, + { code:0x0629 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0629 + ,simpleLowerCaseMapping:0x0629 + ,simpleTitleCaseMapping:0x0629 + }, + { code:0x062A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x062A + ,simpleLowerCaseMapping:0x062A + ,simpleTitleCaseMapping:0x062A + }, + { code:0x062B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x062B + ,simpleLowerCaseMapping:0x062B + ,simpleTitleCaseMapping:0x062B + }, + { code:0x062C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x062C + ,simpleLowerCaseMapping:0x062C + ,simpleTitleCaseMapping:0x062C + }, + { code:0x062D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x062D + ,simpleLowerCaseMapping:0x062D + ,simpleTitleCaseMapping:0x062D + }, + { code:0x062E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x062E + ,simpleLowerCaseMapping:0x062E + ,simpleTitleCaseMapping:0x062E + }, + { code:0x062F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x062F + ,simpleLowerCaseMapping:0x062F + ,simpleTitleCaseMapping:0x062F + }, + { code:0x0630 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0630 + ,simpleLowerCaseMapping:0x0630 + ,simpleTitleCaseMapping:0x0630 + }, + { code:0x0631 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0631 + ,simpleLowerCaseMapping:0x0631 + ,simpleTitleCaseMapping:0x0631 + }, + { code:0x0632 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0632 + ,simpleLowerCaseMapping:0x0632 + ,simpleTitleCaseMapping:0x0632 + }, + { code:0x0633 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0633 + ,simpleLowerCaseMapping:0x0633 + ,simpleTitleCaseMapping:0x0633 + }, + { code:0x0634 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0634 + ,simpleLowerCaseMapping:0x0634 + ,simpleTitleCaseMapping:0x0634 + }, + { code:0x0635 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0635 + ,simpleLowerCaseMapping:0x0635 + ,simpleTitleCaseMapping:0x0635 + }, + { code:0x0636 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0636 + ,simpleLowerCaseMapping:0x0636 + ,simpleTitleCaseMapping:0x0636 + }, + { code:0x0637 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0637 + ,simpleLowerCaseMapping:0x0637 + ,simpleTitleCaseMapping:0x0637 + }, + { code:0x0638 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0638 + ,simpleLowerCaseMapping:0x0638 + ,simpleTitleCaseMapping:0x0638 + }, + { code:0x0639 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0639 + ,simpleLowerCaseMapping:0x0639 + ,simpleTitleCaseMapping:0x0639 + }, + { code:0x063A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x063A + ,simpleLowerCaseMapping:0x063A + ,simpleTitleCaseMapping:0x063A + }, + { code:0x0640 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x0640 + ,simpleLowerCaseMapping:0x0640 + ,simpleTitleCaseMapping:0x0640 + }, + { code:0x0641 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0641 + ,simpleLowerCaseMapping:0x0641 + ,simpleTitleCaseMapping:0x0641 + }, + { code:0x0642 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0642 + ,simpleLowerCaseMapping:0x0642 + ,simpleTitleCaseMapping:0x0642 + }, + { code:0x0643 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0643 + ,simpleLowerCaseMapping:0x0643 + ,simpleTitleCaseMapping:0x0643 + }, + { code:0x0644 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0644 + ,simpleLowerCaseMapping:0x0644 + ,simpleTitleCaseMapping:0x0644 + }, + { code:0x0645 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0645 + ,simpleLowerCaseMapping:0x0645 + ,simpleTitleCaseMapping:0x0645 + }, + { code:0x0646 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0646 + ,simpleLowerCaseMapping:0x0646 + ,simpleTitleCaseMapping:0x0646 + }, + { code:0x0647 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0647 + ,simpleLowerCaseMapping:0x0647 + ,simpleTitleCaseMapping:0x0647 + }, + { code:0x0648 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0648 + ,simpleLowerCaseMapping:0x0648 + ,simpleTitleCaseMapping:0x0648 + }, + { code:0x0649 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0649 + ,simpleLowerCaseMapping:0x0649 + ,simpleTitleCaseMapping:0x0649 + }, + { code:0x064A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x064A + ,simpleLowerCaseMapping:0x064A + ,simpleTitleCaseMapping:0x064A + }, + { code:0x064B + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x064B + ,simpleLowerCaseMapping:0x064B + ,simpleTitleCaseMapping:0x064B + }, + { code:0x064C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x064C + ,simpleLowerCaseMapping:0x064C + ,simpleTitleCaseMapping:0x064C + }, + { code:0x064D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x064D + ,simpleLowerCaseMapping:0x064D + ,simpleTitleCaseMapping:0x064D + }, + { code:0x064E + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x064E + ,simpleLowerCaseMapping:0x064E + ,simpleTitleCaseMapping:0x064E + }, + { code:0x064F + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x064F + ,simpleLowerCaseMapping:0x064F + ,simpleTitleCaseMapping:0x064F + }, + { code:0x0650 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0650 + ,simpleLowerCaseMapping:0x0650 + ,simpleTitleCaseMapping:0x0650 + }, + { code:0x0651 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0651 + ,simpleLowerCaseMapping:0x0651 + ,simpleTitleCaseMapping:0x0651 + }, + { code:0x0652 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0652 + ,simpleLowerCaseMapping:0x0652 + ,simpleTitleCaseMapping:0x0652 + }, + { code:0x0653 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0653 + ,simpleLowerCaseMapping:0x0653 + ,simpleTitleCaseMapping:0x0653 + }, + { code:0x0654 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0654 + ,simpleLowerCaseMapping:0x0654 + ,simpleTitleCaseMapping:0x0654 + }, + { code:0x0655 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0655 + ,simpleLowerCaseMapping:0x0655 + ,simpleTitleCaseMapping:0x0655 + }, + { code:0x0656 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0656 + ,simpleLowerCaseMapping:0x0656 + ,simpleTitleCaseMapping:0x0656 + }, + { code:0x0657 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0657 + ,simpleLowerCaseMapping:0x0657 + ,simpleTitleCaseMapping:0x0657 + }, + { code:0x0658 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0658 + ,simpleLowerCaseMapping:0x0658 + ,simpleTitleCaseMapping:0x0658 + }, + { code:0x0659 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0659 + ,simpleLowerCaseMapping:0x0659 + ,simpleTitleCaseMapping:0x0659 + }, + { code:0x065A + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x065A + ,simpleLowerCaseMapping:0x065A + ,simpleTitleCaseMapping:0x065A + }, + { code:0x065B + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x065B + ,simpleLowerCaseMapping:0x065B + ,simpleTitleCaseMapping:0x065B + }, + { code:0x065C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x065C + ,simpleLowerCaseMapping:0x065C + ,simpleTitleCaseMapping:0x065C + }, + { code:0x065D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x065D + ,simpleLowerCaseMapping:0x065D + ,simpleTitleCaseMapping:0x065D + }, + { code:0x065E + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x065E + ,simpleLowerCaseMapping:0x065E + ,simpleTitleCaseMapping:0x065E + }, + { code:0x0660 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0660 + ,simpleLowerCaseMapping:0x0660 + ,simpleTitleCaseMapping:0x0660 + }, + { code:0x0661 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0661 + ,simpleLowerCaseMapping:0x0661 + ,simpleTitleCaseMapping:0x0661 + }, + { code:0x0662 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0662 + ,simpleLowerCaseMapping:0x0662 + ,simpleTitleCaseMapping:0x0662 + }, + { code:0x0663 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0663 + ,simpleLowerCaseMapping:0x0663 + ,simpleTitleCaseMapping:0x0663 + }, + { code:0x0664 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0664 + ,simpleLowerCaseMapping:0x0664 + ,simpleTitleCaseMapping:0x0664 + }, + { code:0x0665 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0665 + ,simpleLowerCaseMapping:0x0665 + ,simpleTitleCaseMapping:0x0665 + }, + { code:0x0666 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0666 + ,simpleLowerCaseMapping:0x0666 + ,simpleTitleCaseMapping:0x0666 + }, + { code:0x0667 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0667 + ,simpleLowerCaseMapping:0x0667 + ,simpleTitleCaseMapping:0x0667 + }, + { code:0x0668 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0668 + ,simpleLowerCaseMapping:0x0668 + ,simpleTitleCaseMapping:0x0668 + }, + { code:0x0669 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0669 + ,simpleLowerCaseMapping:0x0669 + ,simpleTitleCaseMapping:0x0669 + }, + { code:0x066A + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x066A + ,simpleLowerCaseMapping:0x066A + ,simpleTitleCaseMapping:0x066A + }, + { code:0x066B + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x066B + ,simpleLowerCaseMapping:0x066B + ,simpleTitleCaseMapping:0x066B + }, + { code:0x066C + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x066C + ,simpleLowerCaseMapping:0x066C + ,simpleTitleCaseMapping:0x066C + }, + { code:0x066D + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x066D + ,simpleLowerCaseMapping:0x066D + ,simpleTitleCaseMapping:0x066D + }, + { code:0x066E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x066E + ,simpleLowerCaseMapping:0x066E + ,simpleTitleCaseMapping:0x066E + }, + { code:0x066F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x066F + ,simpleLowerCaseMapping:0x066F + ,simpleTitleCaseMapping:0x066F + }, + { code:0x0670 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0670 + ,simpleLowerCaseMapping:0x0670 + ,simpleTitleCaseMapping:0x0670 + }, + { code:0x0671 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0671 + ,simpleLowerCaseMapping:0x0671 + ,simpleTitleCaseMapping:0x0671 + }, + { code:0x0672 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0672 + ,simpleLowerCaseMapping:0x0672 + ,simpleTitleCaseMapping:0x0672 + }, + { code:0x0673 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0673 + ,simpleLowerCaseMapping:0x0673 + ,simpleTitleCaseMapping:0x0673 + }, + { code:0x0674 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0674 + ,simpleLowerCaseMapping:0x0674 + ,simpleTitleCaseMapping:0x0674 + }, + { code:0x0675 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0675 + ,simpleLowerCaseMapping:0x0675 + ,simpleTitleCaseMapping:0x0675 + }, + { code:0x0676 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0676 + ,simpleLowerCaseMapping:0x0676 + ,simpleTitleCaseMapping:0x0676 + }, + { code:0x0677 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0677 + ,simpleLowerCaseMapping:0x0677 + ,simpleTitleCaseMapping:0x0677 + }, + { code:0x0678 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0678 + ,simpleLowerCaseMapping:0x0678 + ,simpleTitleCaseMapping:0x0678 + }, + { code:0x0679 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0679 + ,simpleLowerCaseMapping:0x0679 + ,simpleTitleCaseMapping:0x0679 + }, + { code:0x067A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x067A + ,simpleLowerCaseMapping:0x067A + ,simpleTitleCaseMapping:0x067A + }, + { code:0x067B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x067B + ,simpleLowerCaseMapping:0x067B + ,simpleTitleCaseMapping:0x067B + }, + { code:0x067C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x067C + ,simpleLowerCaseMapping:0x067C + ,simpleTitleCaseMapping:0x067C + }, + { code:0x067D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x067D + ,simpleLowerCaseMapping:0x067D + ,simpleTitleCaseMapping:0x067D + }, + { code:0x067E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x067E + ,simpleLowerCaseMapping:0x067E + ,simpleTitleCaseMapping:0x067E + }, + { code:0x067F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x067F + ,simpleLowerCaseMapping:0x067F + ,simpleTitleCaseMapping:0x067F + }, + { code:0x0680 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0680 + ,simpleLowerCaseMapping:0x0680 + ,simpleTitleCaseMapping:0x0680 + }, + { code:0x0681 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0681 + ,simpleLowerCaseMapping:0x0681 + ,simpleTitleCaseMapping:0x0681 + }, + { code:0x0682 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0682 + ,simpleLowerCaseMapping:0x0682 + ,simpleTitleCaseMapping:0x0682 + }, + { code:0x0683 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0683 + ,simpleLowerCaseMapping:0x0683 + ,simpleTitleCaseMapping:0x0683 + }, + { code:0x0684 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0684 + ,simpleLowerCaseMapping:0x0684 + ,simpleTitleCaseMapping:0x0684 + }, + { code:0x0685 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0685 + ,simpleLowerCaseMapping:0x0685 + ,simpleTitleCaseMapping:0x0685 + }, + { code:0x0686 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0686 + ,simpleLowerCaseMapping:0x0686 + ,simpleTitleCaseMapping:0x0686 + }, + { code:0x0687 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0687 + ,simpleLowerCaseMapping:0x0687 + ,simpleTitleCaseMapping:0x0687 + }, + { code:0x0688 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0688 + ,simpleLowerCaseMapping:0x0688 + ,simpleTitleCaseMapping:0x0688 + }, + { code:0x0689 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0689 + ,simpleLowerCaseMapping:0x0689 + ,simpleTitleCaseMapping:0x0689 + }, + { code:0x068A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x068A + ,simpleLowerCaseMapping:0x068A + ,simpleTitleCaseMapping:0x068A + }, + { code:0x068B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x068B + ,simpleLowerCaseMapping:0x068B + ,simpleTitleCaseMapping:0x068B + }, + { code:0x068C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x068C + ,simpleLowerCaseMapping:0x068C + ,simpleTitleCaseMapping:0x068C + }, + { code:0x068D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x068D + ,simpleLowerCaseMapping:0x068D + ,simpleTitleCaseMapping:0x068D + }, + { code:0x068E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x068E + ,simpleLowerCaseMapping:0x068E + ,simpleTitleCaseMapping:0x068E + }, + { code:0x068F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x068F + ,simpleLowerCaseMapping:0x068F + ,simpleTitleCaseMapping:0x068F + }, + { code:0x0690 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0690 + ,simpleLowerCaseMapping:0x0690 + ,simpleTitleCaseMapping:0x0690 + }, + { code:0x0691 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0691 + ,simpleLowerCaseMapping:0x0691 + ,simpleTitleCaseMapping:0x0691 + }, + { code:0x0692 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0692 + ,simpleLowerCaseMapping:0x0692 + ,simpleTitleCaseMapping:0x0692 + }, + { code:0x0693 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0693 + ,simpleLowerCaseMapping:0x0693 + ,simpleTitleCaseMapping:0x0693 + }, + { code:0x0694 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0694 + ,simpleLowerCaseMapping:0x0694 + ,simpleTitleCaseMapping:0x0694 + }, + { code:0x0695 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0695 + ,simpleLowerCaseMapping:0x0695 + ,simpleTitleCaseMapping:0x0695 + }, + { code:0x0696 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0696 + ,simpleLowerCaseMapping:0x0696 + ,simpleTitleCaseMapping:0x0696 + }, + { code:0x0697 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0697 + ,simpleLowerCaseMapping:0x0697 + ,simpleTitleCaseMapping:0x0697 + }, + { code:0x0698 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0698 + ,simpleLowerCaseMapping:0x0698 + ,simpleTitleCaseMapping:0x0698 + }, + { code:0x0699 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0699 + ,simpleLowerCaseMapping:0x0699 + ,simpleTitleCaseMapping:0x0699 + }, + { code:0x069A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x069A + ,simpleLowerCaseMapping:0x069A + ,simpleTitleCaseMapping:0x069A + }, + { code:0x069B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x069B + ,simpleLowerCaseMapping:0x069B + ,simpleTitleCaseMapping:0x069B + }, + { code:0x069C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x069C + ,simpleLowerCaseMapping:0x069C + ,simpleTitleCaseMapping:0x069C + }, + { code:0x069D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x069D + ,simpleLowerCaseMapping:0x069D + ,simpleTitleCaseMapping:0x069D + }, + { code:0x069E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x069E + ,simpleLowerCaseMapping:0x069E + ,simpleTitleCaseMapping:0x069E + }, + { code:0x069F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x069F + ,simpleLowerCaseMapping:0x069F + ,simpleTitleCaseMapping:0x069F + }, + { code:0x06A0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06A0 + ,simpleLowerCaseMapping:0x06A0 + ,simpleTitleCaseMapping:0x06A0 + }, + { code:0x06A1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06A1 + ,simpleLowerCaseMapping:0x06A1 + ,simpleTitleCaseMapping:0x06A1 + }, + { code:0x06A2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06A2 + ,simpleLowerCaseMapping:0x06A2 + ,simpleTitleCaseMapping:0x06A2 + }, + { code:0x06A3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06A3 + ,simpleLowerCaseMapping:0x06A3 + ,simpleTitleCaseMapping:0x06A3 + }, + { code:0x06A4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06A4 + ,simpleLowerCaseMapping:0x06A4 + ,simpleTitleCaseMapping:0x06A4 + }, + { code:0x06A5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06A5 + ,simpleLowerCaseMapping:0x06A5 + ,simpleTitleCaseMapping:0x06A5 + }, + { code:0x06A6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06A6 + ,simpleLowerCaseMapping:0x06A6 + ,simpleTitleCaseMapping:0x06A6 + }, + { code:0x06A7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06A7 + ,simpleLowerCaseMapping:0x06A7 + ,simpleTitleCaseMapping:0x06A7 + }, + { code:0x06A8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06A8 + ,simpleLowerCaseMapping:0x06A8 + ,simpleTitleCaseMapping:0x06A8 + }, + { code:0x06A9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06A9 + ,simpleLowerCaseMapping:0x06A9 + ,simpleTitleCaseMapping:0x06A9 + }, + { code:0x06AA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06AA + ,simpleLowerCaseMapping:0x06AA + ,simpleTitleCaseMapping:0x06AA + }, + { code:0x06AB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06AB + ,simpleLowerCaseMapping:0x06AB + ,simpleTitleCaseMapping:0x06AB + }, + { code:0x06AC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06AC + ,simpleLowerCaseMapping:0x06AC + ,simpleTitleCaseMapping:0x06AC + }, + { code:0x06AD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06AD + ,simpleLowerCaseMapping:0x06AD + ,simpleTitleCaseMapping:0x06AD + }, + { code:0x06AE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06AE + ,simpleLowerCaseMapping:0x06AE + ,simpleTitleCaseMapping:0x06AE + }, + { code:0x06AF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06AF + ,simpleLowerCaseMapping:0x06AF + ,simpleTitleCaseMapping:0x06AF + }, + { code:0x06B0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06B0 + ,simpleLowerCaseMapping:0x06B0 + ,simpleTitleCaseMapping:0x06B0 + }, + { code:0x06B1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06B1 + ,simpleLowerCaseMapping:0x06B1 + ,simpleTitleCaseMapping:0x06B1 + }, + { code:0x06B2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06B2 + ,simpleLowerCaseMapping:0x06B2 + ,simpleTitleCaseMapping:0x06B2 + }, + { code:0x06B3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06B3 + ,simpleLowerCaseMapping:0x06B3 + ,simpleTitleCaseMapping:0x06B3 + }, + { code:0x06B4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06B4 + ,simpleLowerCaseMapping:0x06B4 + ,simpleTitleCaseMapping:0x06B4 + }, + { code:0x06B5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06B5 + ,simpleLowerCaseMapping:0x06B5 + ,simpleTitleCaseMapping:0x06B5 + }, + { code:0x06B6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06B6 + ,simpleLowerCaseMapping:0x06B6 + ,simpleTitleCaseMapping:0x06B6 + }, + { code:0x06B7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06B7 + ,simpleLowerCaseMapping:0x06B7 + ,simpleTitleCaseMapping:0x06B7 + }, + { code:0x06B8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06B8 + ,simpleLowerCaseMapping:0x06B8 + ,simpleTitleCaseMapping:0x06B8 + }, + { code:0x06B9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06B9 + ,simpleLowerCaseMapping:0x06B9 + ,simpleTitleCaseMapping:0x06B9 + }, + { code:0x06BA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06BA + ,simpleLowerCaseMapping:0x06BA + ,simpleTitleCaseMapping:0x06BA + }, + { code:0x06BB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06BB + ,simpleLowerCaseMapping:0x06BB + ,simpleTitleCaseMapping:0x06BB + }, + { code:0x06BC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06BC + ,simpleLowerCaseMapping:0x06BC + ,simpleTitleCaseMapping:0x06BC + }, + { code:0x06BD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06BD + ,simpleLowerCaseMapping:0x06BD + ,simpleTitleCaseMapping:0x06BD + }, + { code:0x06BE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06BE + ,simpleLowerCaseMapping:0x06BE + ,simpleTitleCaseMapping:0x06BE + }, + { code:0x06BF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06BF + ,simpleLowerCaseMapping:0x06BF + ,simpleTitleCaseMapping:0x06BF + }, + { code:0x06C0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06C0 + ,simpleLowerCaseMapping:0x06C0 + ,simpleTitleCaseMapping:0x06C0 + }, + { code:0x06C1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06C1 + ,simpleLowerCaseMapping:0x06C1 + ,simpleTitleCaseMapping:0x06C1 + }, + { code:0x06C2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06C2 + ,simpleLowerCaseMapping:0x06C2 + ,simpleTitleCaseMapping:0x06C2 + }, + { code:0x06C3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06C3 + ,simpleLowerCaseMapping:0x06C3 + ,simpleTitleCaseMapping:0x06C3 + }, + { code:0x06C4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06C4 + ,simpleLowerCaseMapping:0x06C4 + ,simpleTitleCaseMapping:0x06C4 + }, + { code:0x06C5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06C5 + ,simpleLowerCaseMapping:0x06C5 + ,simpleTitleCaseMapping:0x06C5 + }, + { code:0x06C6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06C6 + ,simpleLowerCaseMapping:0x06C6 + ,simpleTitleCaseMapping:0x06C6 + }, + { code:0x06C7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06C7 + ,simpleLowerCaseMapping:0x06C7 + ,simpleTitleCaseMapping:0x06C7 + }, + { code:0x06C8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06C8 + ,simpleLowerCaseMapping:0x06C8 + ,simpleTitleCaseMapping:0x06C8 + }, + { code:0x06C9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06C9 + ,simpleLowerCaseMapping:0x06C9 + ,simpleTitleCaseMapping:0x06C9 + }, + { code:0x06CA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06CA + ,simpleLowerCaseMapping:0x06CA + ,simpleTitleCaseMapping:0x06CA + }, + { code:0x06CB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06CB + ,simpleLowerCaseMapping:0x06CB + ,simpleTitleCaseMapping:0x06CB + }, + { code:0x06CC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06CC + ,simpleLowerCaseMapping:0x06CC + ,simpleTitleCaseMapping:0x06CC + }, + { code:0x06CD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06CD + ,simpleLowerCaseMapping:0x06CD + ,simpleTitleCaseMapping:0x06CD + }, + { code:0x06CE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06CE + ,simpleLowerCaseMapping:0x06CE + ,simpleTitleCaseMapping:0x06CE + }, + { code:0x06CF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06CF + ,simpleLowerCaseMapping:0x06CF + ,simpleTitleCaseMapping:0x06CF + }, + { code:0x06D0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06D0 + ,simpleLowerCaseMapping:0x06D0 + ,simpleTitleCaseMapping:0x06D0 + }, + { code:0x06D1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06D1 + ,simpleLowerCaseMapping:0x06D1 + ,simpleTitleCaseMapping:0x06D1 + }, + { code:0x06D2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06D2 + ,simpleLowerCaseMapping:0x06D2 + ,simpleTitleCaseMapping:0x06D2 + }, + { code:0x06D3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06D3 + ,simpleLowerCaseMapping:0x06D3 + ,simpleTitleCaseMapping:0x06D3 + }, + { code:0x06D4 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x06D4 + ,simpleLowerCaseMapping:0x06D4 + ,simpleTitleCaseMapping:0x06D4 + }, + { code:0x06D5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06D5 + ,simpleLowerCaseMapping:0x06D5 + ,simpleTitleCaseMapping:0x06D5 + }, + { code:0x06D6 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x06D6 + ,simpleLowerCaseMapping:0x06D6 + ,simpleTitleCaseMapping:0x06D6 + }, + { code:0x06D7 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x06D7 + ,simpleLowerCaseMapping:0x06D7 + ,simpleTitleCaseMapping:0x06D7 + }, + { code:0x06D8 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x06D8 + ,simpleLowerCaseMapping:0x06D8 + ,simpleTitleCaseMapping:0x06D8 + }, + { code:0x06D9 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x06D9 + ,simpleLowerCaseMapping:0x06D9 + ,simpleTitleCaseMapping:0x06D9 + }, + { code:0x06DA + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x06DA + ,simpleLowerCaseMapping:0x06DA + ,simpleTitleCaseMapping:0x06DA + }, + { code:0x06DB + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x06DB + ,simpleLowerCaseMapping:0x06DB + ,simpleTitleCaseMapping:0x06DB + }, + { code:0x06DC + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x06DC + ,simpleLowerCaseMapping:0x06DC + ,simpleTitleCaseMapping:0x06DC + }, + { code:0x06DD + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x06DD + ,simpleLowerCaseMapping:0x06DD + ,simpleTitleCaseMapping:0x06DD + }, + { code:0x06DE + ,generalCategory:UnicodeData.GeneralCategory.Me + ,simpleUpperCaseMapping:0x06DE + ,simpleLowerCaseMapping:0x06DE + ,simpleTitleCaseMapping:0x06DE + }, + { code:0x06DF + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x06DF + ,simpleLowerCaseMapping:0x06DF + ,simpleTitleCaseMapping:0x06DF + }, + { code:0x06E0 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x06E0 + ,simpleLowerCaseMapping:0x06E0 + ,simpleTitleCaseMapping:0x06E0 + }, + { code:0x06E1 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x06E1 + ,simpleLowerCaseMapping:0x06E1 + ,simpleTitleCaseMapping:0x06E1 + }, + { code:0x06E2 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x06E2 + ,simpleLowerCaseMapping:0x06E2 + ,simpleTitleCaseMapping:0x06E2 + }, + { code:0x06E3 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x06E3 + ,simpleLowerCaseMapping:0x06E3 + ,simpleTitleCaseMapping:0x06E3 + }, + { code:0x06E4 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x06E4 + ,simpleLowerCaseMapping:0x06E4 + ,simpleTitleCaseMapping:0x06E4 + }, + { code:0x06E5 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x06E5 + ,simpleLowerCaseMapping:0x06E5 + ,simpleTitleCaseMapping:0x06E5 + }, + { code:0x06E6 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x06E6 + ,simpleLowerCaseMapping:0x06E6 + ,simpleTitleCaseMapping:0x06E6 + }, + { code:0x06E7 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x06E7 + ,simpleLowerCaseMapping:0x06E7 + ,simpleTitleCaseMapping:0x06E7 + }, + { code:0x06E8 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x06E8 + ,simpleLowerCaseMapping:0x06E8 + ,simpleTitleCaseMapping:0x06E8 + }, + { code:0x06E9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x06E9 + ,simpleLowerCaseMapping:0x06E9 + ,simpleTitleCaseMapping:0x06E9 + }, + { code:0x06EA + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x06EA + ,simpleLowerCaseMapping:0x06EA + ,simpleTitleCaseMapping:0x06EA + }, + { code:0x06EB + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x06EB + ,simpleLowerCaseMapping:0x06EB + ,simpleTitleCaseMapping:0x06EB + }, + { code:0x06EC + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x06EC + ,simpleLowerCaseMapping:0x06EC + ,simpleTitleCaseMapping:0x06EC + }, + { code:0x06ED + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x06ED + ,simpleLowerCaseMapping:0x06ED + ,simpleTitleCaseMapping:0x06ED + }, + { code:0x06EE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06EE + ,simpleLowerCaseMapping:0x06EE + ,simpleTitleCaseMapping:0x06EE + }, + { code:0x06EF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06EF + ,simpleLowerCaseMapping:0x06EF + ,simpleTitleCaseMapping:0x06EF + }, + { code:0x06F0 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x06F0 + ,simpleLowerCaseMapping:0x06F0 + ,simpleTitleCaseMapping:0x06F0 + }, + { code:0x06F1 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x06F1 + ,simpleLowerCaseMapping:0x06F1 + ,simpleTitleCaseMapping:0x06F1 + }, + { code:0x06F2 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x06F2 + ,simpleLowerCaseMapping:0x06F2 + ,simpleTitleCaseMapping:0x06F2 + }, + { code:0x06F3 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x06F3 + ,simpleLowerCaseMapping:0x06F3 + ,simpleTitleCaseMapping:0x06F3 + }, + { code:0x06F4 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x06F4 + ,simpleLowerCaseMapping:0x06F4 + ,simpleTitleCaseMapping:0x06F4 + }, + { code:0x06F5 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x06F5 + ,simpleLowerCaseMapping:0x06F5 + ,simpleTitleCaseMapping:0x06F5 + }, + { code:0x06F6 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x06F6 + ,simpleLowerCaseMapping:0x06F6 + ,simpleTitleCaseMapping:0x06F6 + }, + { code:0x06F7 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x06F7 + ,simpleLowerCaseMapping:0x06F7 + ,simpleTitleCaseMapping:0x06F7 + }, + { code:0x06F8 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x06F8 + ,simpleLowerCaseMapping:0x06F8 + ,simpleTitleCaseMapping:0x06F8 + }, + { code:0x06F9 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x06F9 + ,simpleLowerCaseMapping:0x06F9 + ,simpleTitleCaseMapping:0x06F9 + }, + { code:0x06FA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06FA + ,simpleLowerCaseMapping:0x06FA + ,simpleTitleCaseMapping:0x06FA + }, + { code:0x06FB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06FB + ,simpleLowerCaseMapping:0x06FB + ,simpleTitleCaseMapping:0x06FB + }, + { code:0x06FC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06FC + ,simpleLowerCaseMapping:0x06FC + ,simpleTitleCaseMapping:0x06FC + }, + { code:0x06FD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x06FD + ,simpleLowerCaseMapping:0x06FD + ,simpleTitleCaseMapping:0x06FD + }, + { code:0x06FE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x06FE + ,simpleLowerCaseMapping:0x06FE + ,simpleTitleCaseMapping:0x06FE + }, + { code:0x06FF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x06FF + ,simpleLowerCaseMapping:0x06FF + ,simpleTitleCaseMapping:0x06FF + }, + { code:0x0700 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0700 + ,simpleLowerCaseMapping:0x0700 + ,simpleTitleCaseMapping:0x0700 + }, + { code:0x0701 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0701 + ,simpleLowerCaseMapping:0x0701 + ,simpleTitleCaseMapping:0x0701 + }, + { code:0x0702 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0702 + ,simpleLowerCaseMapping:0x0702 + ,simpleTitleCaseMapping:0x0702 + }, + { code:0x0703 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0703 + ,simpleLowerCaseMapping:0x0703 + ,simpleTitleCaseMapping:0x0703 + }, + { code:0x0704 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0704 + ,simpleLowerCaseMapping:0x0704 + ,simpleTitleCaseMapping:0x0704 + }, + { code:0x0705 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0705 + ,simpleLowerCaseMapping:0x0705 + ,simpleTitleCaseMapping:0x0705 + }, + { code:0x0706 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0706 + ,simpleLowerCaseMapping:0x0706 + ,simpleTitleCaseMapping:0x0706 + }, + { code:0x0707 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0707 + ,simpleLowerCaseMapping:0x0707 + ,simpleTitleCaseMapping:0x0707 + }, + { code:0x0708 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0708 + ,simpleLowerCaseMapping:0x0708 + ,simpleTitleCaseMapping:0x0708 + }, + { code:0x0709 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0709 + ,simpleLowerCaseMapping:0x0709 + ,simpleTitleCaseMapping:0x0709 + }, + { code:0x070A + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x070A + ,simpleLowerCaseMapping:0x070A + ,simpleTitleCaseMapping:0x070A + }, + { code:0x070B + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x070B + ,simpleLowerCaseMapping:0x070B + ,simpleTitleCaseMapping:0x070B + }, + { code:0x070C + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x070C + ,simpleLowerCaseMapping:0x070C + ,simpleTitleCaseMapping:0x070C + }, + { code:0x070D + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x070D + ,simpleLowerCaseMapping:0x070D + ,simpleTitleCaseMapping:0x070D + }, + { code:0x070F + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x070F + ,simpleLowerCaseMapping:0x070F + ,simpleTitleCaseMapping:0x070F + }, + { code:0x0710 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0710 + ,simpleLowerCaseMapping:0x0710 + ,simpleTitleCaseMapping:0x0710 + }, + { code:0x0711 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0711 + ,simpleLowerCaseMapping:0x0711 + ,simpleTitleCaseMapping:0x0711 + }, + { code:0x0712 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0712 + ,simpleLowerCaseMapping:0x0712 + ,simpleTitleCaseMapping:0x0712 + }, + { code:0x0713 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0713 + ,simpleLowerCaseMapping:0x0713 + ,simpleTitleCaseMapping:0x0713 + }, + { code:0x0714 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0714 + ,simpleLowerCaseMapping:0x0714 + ,simpleTitleCaseMapping:0x0714 + }, + { code:0x0715 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0715 + ,simpleLowerCaseMapping:0x0715 + ,simpleTitleCaseMapping:0x0715 + }, + { code:0x0716 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0716 + ,simpleLowerCaseMapping:0x0716 + ,simpleTitleCaseMapping:0x0716 + }, + { code:0x0717 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0717 + ,simpleLowerCaseMapping:0x0717 + ,simpleTitleCaseMapping:0x0717 + }, + { code:0x0718 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0718 + ,simpleLowerCaseMapping:0x0718 + ,simpleTitleCaseMapping:0x0718 + }, + { code:0x0719 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0719 + ,simpleLowerCaseMapping:0x0719 + ,simpleTitleCaseMapping:0x0719 + }, + { code:0x071A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x071A + ,simpleLowerCaseMapping:0x071A + ,simpleTitleCaseMapping:0x071A + }, + { code:0x071B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x071B + ,simpleLowerCaseMapping:0x071B + ,simpleTitleCaseMapping:0x071B + }, + { code:0x071C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x071C + ,simpleLowerCaseMapping:0x071C + ,simpleTitleCaseMapping:0x071C + }, + { code:0x071D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x071D + ,simpleLowerCaseMapping:0x071D + ,simpleTitleCaseMapping:0x071D + }, + { code:0x071E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x071E + ,simpleLowerCaseMapping:0x071E + ,simpleTitleCaseMapping:0x071E + }, + { code:0x071F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x071F + ,simpleLowerCaseMapping:0x071F + ,simpleTitleCaseMapping:0x071F + }, + { code:0x0720 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0720 + ,simpleLowerCaseMapping:0x0720 + ,simpleTitleCaseMapping:0x0720 + }, + { code:0x0721 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0721 + ,simpleLowerCaseMapping:0x0721 + ,simpleTitleCaseMapping:0x0721 + }, + { code:0x0722 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0722 + ,simpleLowerCaseMapping:0x0722 + ,simpleTitleCaseMapping:0x0722 + }, + { code:0x0723 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0723 + ,simpleLowerCaseMapping:0x0723 + ,simpleTitleCaseMapping:0x0723 + }, + { code:0x0724 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0724 + ,simpleLowerCaseMapping:0x0724 + ,simpleTitleCaseMapping:0x0724 + }, + { code:0x0725 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0725 + ,simpleLowerCaseMapping:0x0725 + ,simpleTitleCaseMapping:0x0725 + }, + { code:0x0726 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0726 + ,simpleLowerCaseMapping:0x0726 + ,simpleTitleCaseMapping:0x0726 + }, + { code:0x0727 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0727 + ,simpleLowerCaseMapping:0x0727 + ,simpleTitleCaseMapping:0x0727 + }, + { code:0x0728 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0728 + ,simpleLowerCaseMapping:0x0728 + ,simpleTitleCaseMapping:0x0728 + }, + { code:0x0729 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0729 + ,simpleLowerCaseMapping:0x0729 + ,simpleTitleCaseMapping:0x0729 + }, + { code:0x072A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x072A + ,simpleLowerCaseMapping:0x072A + ,simpleTitleCaseMapping:0x072A + }, + { code:0x072B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x072B + ,simpleLowerCaseMapping:0x072B + ,simpleTitleCaseMapping:0x072B + }, + { code:0x072C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x072C + ,simpleLowerCaseMapping:0x072C + ,simpleTitleCaseMapping:0x072C + }, + { code:0x072D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x072D + ,simpleLowerCaseMapping:0x072D + ,simpleTitleCaseMapping:0x072D + }, + { code:0x072E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x072E + ,simpleLowerCaseMapping:0x072E + ,simpleTitleCaseMapping:0x072E + }, + { code:0x072F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x072F + ,simpleLowerCaseMapping:0x072F + ,simpleTitleCaseMapping:0x072F + }, + { code:0x0730 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0730 + ,simpleLowerCaseMapping:0x0730 + ,simpleTitleCaseMapping:0x0730 + }, + { code:0x0731 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0731 + ,simpleLowerCaseMapping:0x0731 + ,simpleTitleCaseMapping:0x0731 + }, + { code:0x0732 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0732 + ,simpleLowerCaseMapping:0x0732 + ,simpleTitleCaseMapping:0x0732 + }, + { code:0x0733 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0733 + ,simpleLowerCaseMapping:0x0733 + ,simpleTitleCaseMapping:0x0733 + }, + { code:0x0734 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0734 + ,simpleLowerCaseMapping:0x0734 + ,simpleTitleCaseMapping:0x0734 + }, + { code:0x0735 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0735 + ,simpleLowerCaseMapping:0x0735 + ,simpleTitleCaseMapping:0x0735 + }, + { code:0x0736 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0736 + ,simpleLowerCaseMapping:0x0736 + ,simpleTitleCaseMapping:0x0736 + }, + { code:0x0737 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0737 + ,simpleLowerCaseMapping:0x0737 + ,simpleTitleCaseMapping:0x0737 + }, + { code:0x0738 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0738 + ,simpleLowerCaseMapping:0x0738 + ,simpleTitleCaseMapping:0x0738 + }, + { code:0x0739 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0739 + ,simpleLowerCaseMapping:0x0739 + ,simpleTitleCaseMapping:0x0739 + }, + { code:0x073A + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x073A + ,simpleLowerCaseMapping:0x073A + ,simpleTitleCaseMapping:0x073A + }, + { code:0x073B + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x073B + ,simpleLowerCaseMapping:0x073B + ,simpleTitleCaseMapping:0x073B + }, + { code:0x073C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x073C + ,simpleLowerCaseMapping:0x073C + ,simpleTitleCaseMapping:0x073C + }, + { code:0x073D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x073D + ,simpleLowerCaseMapping:0x073D + ,simpleTitleCaseMapping:0x073D + }, + { code:0x073E + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x073E + ,simpleLowerCaseMapping:0x073E + ,simpleTitleCaseMapping:0x073E + }, + { code:0x073F + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x073F + ,simpleLowerCaseMapping:0x073F + ,simpleTitleCaseMapping:0x073F + }, + { code:0x0740 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0740 + ,simpleLowerCaseMapping:0x0740 + ,simpleTitleCaseMapping:0x0740 + }, + { code:0x0741 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0741 + ,simpleLowerCaseMapping:0x0741 + ,simpleTitleCaseMapping:0x0741 + }, + { code:0x0742 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0742 + ,simpleLowerCaseMapping:0x0742 + ,simpleTitleCaseMapping:0x0742 + }, + { code:0x0743 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0743 + ,simpleLowerCaseMapping:0x0743 + ,simpleTitleCaseMapping:0x0743 + }, + { code:0x0744 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0744 + ,simpleLowerCaseMapping:0x0744 + ,simpleTitleCaseMapping:0x0744 + }, + { code:0x0745 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0745 + ,simpleLowerCaseMapping:0x0745 + ,simpleTitleCaseMapping:0x0745 + }, + { code:0x0746 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0746 + ,simpleLowerCaseMapping:0x0746 + ,simpleTitleCaseMapping:0x0746 + }, + { code:0x0747 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0747 + ,simpleLowerCaseMapping:0x0747 + ,simpleTitleCaseMapping:0x0747 + }, + { code:0x0748 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0748 + ,simpleLowerCaseMapping:0x0748 + ,simpleTitleCaseMapping:0x0748 + }, + { code:0x0749 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0749 + ,simpleLowerCaseMapping:0x0749 + ,simpleTitleCaseMapping:0x0749 + }, + { code:0x074A + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x074A + ,simpleLowerCaseMapping:0x074A + ,simpleTitleCaseMapping:0x074A + }, + { code:0x074D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x074D + ,simpleLowerCaseMapping:0x074D + ,simpleTitleCaseMapping:0x074D + }, + { code:0x074E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x074E + ,simpleLowerCaseMapping:0x074E + ,simpleTitleCaseMapping:0x074E + }, + { code:0x074F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x074F + ,simpleLowerCaseMapping:0x074F + ,simpleTitleCaseMapping:0x074F + }, + { code:0x0750 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0750 + ,simpleLowerCaseMapping:0x0750 + ,simpleTitleCaseMapping:0x0750 + }, + { code:0x0751 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0751 + ,simpleLowerCaseMapping:0x0751 + ,simpleTitleCaseMapping:0x0751 + }, + { code:0x0752 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0752 + ,simpleLowerCaseMapping:0x0752 + ,simpleTitleCaseMapping:0x0752 + }, + { code:0x0753 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0753 + ,simpleLowerCaseMapping:0x0753 + ,simpleTitleCaseMapping:0x0753 + }, + { code:0x0754 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0754 + ,simpleLowerCaseMapping:0x0754 + ,simpleTitleCaseMapping:0x0754 + }, + { code:0x0755 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0755 + ,simpleLowerCaseMapping:0x0755 + ,simpleTitleCaseMapping:0x0755 + }, + { code:0x0756 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0756 + ,simpleLowerCaseMapping:0x0756 + ,simpleTitleCaseMapping:0x0756 + }, + { code:0x0757 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0757 + ,simpleLowerCaseMapping:0x0757 + ,simpleTitleCaseMapping:0x0757 + }, + { code:0x0758 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0758 + ,simpleLowerCaseMapping:0x0758 + ,simpleTitleCaseMapping:0x0758 + }, + { code:0x0759 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0759 + ,simpleLowerCaseMapping:0x0759 + ,simpleTitleCaseMapping:0x0759 + }, + { code:0x075A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x075A + ,simpleLowerCaseMapping:0x075A + ,simpleTitleCaseMapping:0x075A + }, + { code:0x075B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x075B + ,simpleLowerCaseMapping:0x075B + ,simpleTitleCaseMapping:0x075B + }, + { code:0x075C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x075C + ,simpleLowerCaseMapping:0x075C + ,simpleTitleCaseMapping:0x075C + }, + { code:0x075D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x075D + ,simpleLowerCaseMapping:0x075D + ,simpleTitleCaseMapping:0x075D + }, + { code:0x075E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x075E + ,simpleLowerCaseMapping:0x075E + ,simpleTitleCaseMapping:0x075E + }, + { code:0x075F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x075F + ,simpleLowerCaseMapping:0x075F + ,simpleTitleCaseMapping:0x075F + }, + { code:0x0760 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0760 + ,simpleLowerCaseMapping:0x0760 + ,simpleTitleCaseMapping:0x0760 + }, + { code:0x0761 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0761 + ,simpleLowerCaseMapping:0x0761 + ,simpleTitleCaseMapping:0x0761 + }, + { code:0x0762 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0762 + ,simpleLowerCaseMapping:0x0762 + ,simpleTitleCaseMapping:0x0762 + }, + { code:0x0763 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0763 + ,simpleLowerCaseMapping:0x0763 + ,simpleTitleCaseMapping:0x0763 + }, + { code:0x0764 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0764 + ,simpleLowerCaseMapping:0x0764 + ,simpleTitleCaseMapping:0x0764 + }, + { code:0x0765 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0765 + ,simpleLowerCaseMapping:0x0765 + ,simpleTitleCaseMapping:0x0765 + }, + { code:0x0766 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0766 + ,simpleLowerCaseMapping:0x0766 + ,simpleTitleCaseMapping:0x0766 + }, + { code:0x0767 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0767 + ,simpleLowerCaseMapping:0x0767 + ,simpleTitleCaseMapping:0x0767 + }, + { code:0x0768 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0768 + ,simpleLowerCaseMapping:0x0768 + ,simpleTitleCaseMapping:0x0768 + }, + { code:0x0769 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0769 + ,simpleLowerCaseMapping:0x0769 + ,simpleTitleCaseMapping:0x0769 + }, + { code:0x076A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x076A + ,simpleLowerCaseMapping:0x076A + ,simpleTitleCaseMapping:0x076A + }, + { code:0x076B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x076B + ,simpleLowerCaseMapping:0x076B + ,simpleTitleCaseMapping:0x076B + }, + { code:0x076C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x076C + ,simpleLowerCaseMapping:0x076C + ,simpleTitleCaseMapping:0x076C + }, + { code:0x076D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x076D + ,simpleLowerCaseMapping:0x076D + ,simpleTitleCaseMapping:0x076D + }, + { code:0x0780 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0780 + ,simpleLowerCaseMapping:0x0780 + ,simpleTitleCaseMapping:0x0780 + }, + { code:0x0781 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0781 + ,simpleLowerCaseMapping:0x0781 + ,simpleTitleCaseMapping:0x0781 + }, + { code:0x0782 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0782 + ,simpleLowerCaseMapping:0x0782 + ,simpleTitleCaseMapping:0x0782 + }, + { code:0x0783 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0783 + ,simpleLowerCaseMapping:0x0783 + ,simpleTitleCaseMapping:0x0783 + }, + { code:0x0784 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0784 + ,simpleLowerCaseMapping:0x0784 + ,simpleTitleCaseMapping:0x0784 + }, + { code:0x0785 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0785 + ,simpleLowerCaseMapping:0x0785 + ,simpleTitleCaseMapping:0x0785 + }, + { code:0x0786 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0786 + ,simpleLowerCaseMapping:0x0786 + ,simpleTitleCaseMapping:0x0786 + }, + { code:0x0787 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0787 + ,simpleLowerCaseMapping:0x0787 + ,simpleTitleCaseMapping:0x0787 + }, + { code:0x0788 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0788 + ,simpleLowerCaseMapping:0x0788 + ,simpleTitleCaseMapping:0x0788 + }, + { code:0x0789 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0789 + ,simpleLowerCaseMapping:0x0789 + ,simpleTitleCaseMapping:0x0789 + }, + { code:0x078A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x078A + ,simpleLowerCaseMapping:0x078A + ,simpleTitleCaseMapping:0x078A + }, + { code:0x078B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x078B + ,simpleLowerCaseMapping:0x078B + ,simpleTitleCaseMapping:0x078B + }, + { code:0x078C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x078C + ,simpleLowerCaseMapping:0x078C + ,simpleTitleCaseMapping:0x078C + }, + { code:0x078D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x078D + ,simpleLowerCaseMapping:0x078D + ,simpleTitleCaseMapping:0x078D + }, + { code:0x078E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x078E + ,simpleLowerCaseMapping:0x078E + ,simpleTitleCaseMapping:0x078E + }, + { code:0x078F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x078F + ,simpleLowerCaseMapping:0x078F + ,simpleTitleCaseMapping:0x078F + }, + { code:0x0790 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0790 + ,simpleLowerCaseMapping:0x0790 + ,simpleTitleCaseMapping:0x0790 + }, + { code:0x0791 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0791 + ,simpleLowerCaseMapping:0x0791 + ,simpleTitleCaseMapping:0x0791 + }, + { code:0x0792 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0792 + ,simpleLowerCaseMapping:0x0792 + ,simpleTitleCaseMapping:0x0792 + }, + { code:0x0793 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0793 + ,simpleLowerCaseMapping:0x0793 + ,simpleTitleCaseMapping:0x0793 + }, + { code:0x0794 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0794 + ,simpleLowerCaseMapping:0x0794 + ,simpleTitleCaseMapping:0x0794 + }, + { code:0x0795 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0795 + ,simpleLowerCaseMapping:0x0795 + ,simpleTitleCaseMapping:0x0795 + }, + { code:0x0796 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0796 + ,simpleLowerCaseMapping:0x0796 + ,simpleTitleCaseMapping:0x0796 + }, + { code:0x0797 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0797 + ,simpleLowerCaseMapping:0x0797 + ,simpleTitleCaseMapping:0x0797 + }, + { code:0x0798 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0798 + ,simpleLowerCaseMapping:0x0798 + ,simpleTitleCaseMapping:0x0798 + }, + { code:0x0799 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0799 + ,simpleLowerCaseMapping:0x0799 + ,simpleTitleCaseMapping:0x0799 + }, + { code:0x079A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x079A + ,simpleLowerCaseMapping:0x079A + ,simpleTitleCaseMapping:0x079A + }, + { code:0x079B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x079B + ,simpleLowerCaseMapping:0x079B + ,simpleTitleCaseMapping:0x079B + }, + { code:0x079C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x079C + ,simpleLowerCaseMapping:0x079C + ,simpleTitleCaseMapping:0x079C + }, + { code:0x079D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x079D + ,simpleLowerCaseMapping:0x079D + ,simpleTitleCaseMapping:0x079D + }, + { code:0x079E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x079E + ,simpleLowerCaseMapping:0x079E + ,simpleTitleCaseMapping:0x079E + }, + { code:0x079F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x079F + ,simpleLowerCaseMapping:0x079F + ,simpleTitleCaseMapping:0x079F + }, + { code:0x07A0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07A0 + ,simpleLowerCaseMapping:0x07A0 + ,simpleTitleCaseMapping:0x07A0 + }, + { code:0x07A1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07A1 + ,simpleLowerCaseMapping:0x07A1 + ,simpleTitleCaseMapping:0x07A1 + }, + { code:0x07A2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07A2 + ,simpleLowerCaseMapping:0x07A2 + ,simpleTitleCaseMapping:0x07A2 + }, + { code:0x07A3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07A3 + ,simpleLowerCaseMapping:0x07A3 + ,simpleTitleCaseMapping:0x07A3 + }, + { code:0x07A4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07A4 + ,simpleLowerCaseMapping:0x07A4 + ,simpleTitleCaseMapping:0x07A4 + }, + { code:0x07A5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07A5 + ,simpleLowerCaseMapping:0x07A5 + ,simpleTitleCaseMapping:0x07A5 + }, + { code:0x07A6 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x07A6 + ,simpleLowerCaseMapping:0x07A6 + ,simpleTitleCaseMapping:0x07A6 + }, + { code:0x07A7 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x07A7 + ,simpleLowerCaseMapping:0x07A7 + ,simpleTitleCaseMapping:0x07A7 + }, + { code:0x07A8 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x07A8 + ,simpleLowerCaseMapping:0x07A8 + ,simpleTitleCaseMapping:0x07A8 + }, + { code:0x07A9 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x07A9 + ,simpleLowerCaseMapping:0x07A9 + ,simpleTitleCaseMapping:0x07A9 + }, + { code:0x07AA + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x07AA + ,simpleLowerCaseMapping:0x07AA + ,simpleTitleCaseMapping:0x07AA + }, + { code:0x07AB + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x07AB + ,simpleLowerCaseMapping:0x07AB + ,simpleTitleCaseMapping:0x07AB + }, + { code:0x07AC + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x07AC + ,simpleLowerCaseMapping:0x07AC + ,simpleTitleCaseMapping:0x07AC + }, + { code:0x07AD + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x07AD + ,simpleLowerCaseMapping:0x07AD + ,simpleTitleCaseMapping:0x07AD + }, + { code:0x07AE + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x07AE + ,simpleLowerCaseMapping:0x07AE + ,simpleTitleCaseMapping:0x07AE + }, + { code:0x07AF + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x07AF + ,simpleLowerCaseMapping:0x07AF + ,simpleTitleCaseMapping:0x07AF + }, + { code:0x07B0 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x07B0 + ,simpleLowerCaseMapping:0x07B0 + ,simpleTitleCaseMapping:0x07B0 + }, + { code:0x07B1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07B1 + ,simpleLowerCaseMapping:0x07B1 + ,simpleTitleCaseMapping:0x07B1 + }, + { code:0x07C0 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x07C0 + ,simpleLowerCaseMapping:0x07C0 + ,simpleTitleCaseMapping:0x07C0 + }, + { code:0x07C1 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x07C1 + ,simpleLowerCaseMapping:0x07C1 + ,simpleTitleCaseMapping:0x07C1 + }, + { code:0x07C2 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x07C2 + ,simpleLowerCaseMapping:0x07C2 + ,simpleTitleCaseMapping:0x07C2 + }, + { code:0x07C3 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x07C3 + ,simpleLowerCaseMapping:0x07C3 + ,simpleTitleCaseMapping:0x07C3 + }, + { code:0x07C4 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x07C4 + ,simpleLowerCaseMapping:0x07C4 + ,simpleTitleCaseMapping:0x07C4 + }, + { code:0x07C5 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x07C5 + ,simpleLowerCaseMapping:0x07C5 + ,simpleTitleCaseMapping:0x07C5 + }, + { code:0x07C6 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x07C6 + ,simpleLowerCaseMapping:0x07C6 + ,simpleTitleCaseMapping:0x07C6 + }, + { code:0x07C7 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x07C7 + ,simpleLowerCaseMapping:0x07C7 + ,simpleTitleCaseMapping:0x07C7 + }, + { code:0x07C8 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x07C8 + ,simpleLowerCaseMapping:0x07C8 + ,simpleTitleCaseMapping:0x07C8 + }, + { code:0x07C9 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x07C9 + ,simpleLowerCaseMapping:0x07C9 + ,simpleTitleCaseMapping:0x07C9 + }, + { code:0x07CA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07CA + ,simpleLowerCaseMapping:0x07CA + ,simpleTitleCaseMapping:0x07CA + }, + { code:0x07CB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07CB + ,simpleLowerCaseMapping:0x07CB + ,simpleTitleCaseMapping:0x07CB + }, + { code:0x07CC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07CC + ,simpleLowerCaseMapping:0x07CC + ,simpleTitleCaseMapping:0x07CC + }, + { code:0x07CD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07CD + ,simpleLowerCaseMapping:0x07CD + ,simpleTitleCaseMapping:0x07CD + }, + { code:0x07CE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07CE + ,simpleLowerCaseMapping:0x07CE + ,simpleTitleCaseMapping:0x07CE + }, + { code:0x07CF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07CF + ,simpleLowerCaseMapping:0x07CF + ,simpleTitleCaseMapping:0x07CF + }, + { code:0x07D0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07D0 + ,simpleLowerCaseMapping:0x07D0 + ,simpleTitleCaseMapping:0x07D0 + }, + { code:0x07D1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07D1 + ,simpleLowerCaseMapping:0x07D1 + ,simpleTitleCaseMapping:0x07D1 + }, + { code:0x07D2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07D2 + ,simpleLowerCaseMapping:0x07D2 + ,simpleTitleCaseMapping:0x07D2 + }, + { code:0x07D3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07D3 + ,simpleLowerCaseMapping:0x07D3 + ,simpleTitleCaseMapping:0x07D3 + }, + { code:0x07D4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07D4 + ,simpleLowerCaseMapping:0x07D4 + ,simpleTitleCaseMapping:0x07D4 + }, + { code:0x07D5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07D5 + ,simpleLowerCaseMapping:0x07D5 + ,simpleTitleCaseMapping:0x07D5 + }, + { code:0x07D6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07D6 + ,simpleLowerCaseMapping:0x07D6 + ,simpleTitleCaseMapping:0x07D6 + }, + { code:0x07D7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07D7 + ,simpleLowerCaseMapping:0x07D7 + ,simpleTitleCaseMapping:0x07D7 + }, + { code:0x07D8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07D8 + ,simpleLowerCaseMapping:0x07D8 + ,simpleTitleCaseMapping:0x07D8 + }, + { code:0x07D9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07D9 + ,simpleLowerCaseMapping:0x07D9 + ,simpleTitleCaseMapping:0x07D9 + }, + { code:0x07DA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07DA + ,simpleLowerCaseMapping:0x07DA + ,simpleTitleCaseMapping:0x07DA + }, + { code:0x07DB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07DB + ,simpleLowerCaseMapping:0x07DB + ,simpleTitleCaseMapping:0x07DB + }, + { code:0x07DC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07DC + ,simpleLowerCaseMapping:0x07DC + ,simpleTitleCaseMapping:0x07DC + }, + { code:0x07DD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07DD + ,simpleLowerCaseMapping:0x07DD + ,simpleTitleCaseMapping:0x07DD + }, + { code:0x07DE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07DE + ,simpleLowerCaseMapping:0x07DE + ,simpleTitleCaseMapping:0x07DE + }, + { code:0x07DF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07DF + ,simpleLowerCaseMapping:0x07DF + ,simpleTitleCaseMapping:0x07DF + }, + { code:0x07E0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07E0 + ,simpleLowerCaseMapping:0x07E0 + ,simpleTitleCaseMapping:0x07E0 + }, + { code:0x07E1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07E1 + ,simpleLowerCaseMapping:0x07E1 + ,simpleTitleCaseMapping:0x07E1 + }, + { code:0x07E2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07E2 + ,simpleLowerCaseMapping:0x07E2 + ,simpleTitleCaseMapping:0x07E2 + }, + { code:0x07E3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07E3 + ,simpleLowerCaseMapping:0x07E3 + ,simpleTitleCaseMapping:0x07E3 + }, + { code:0x07E4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07E4 + ,simpleLowerCaseMapping:0x07E4 + ,simpleTitleCaseMapping:0x07E4 + }, + { code:0x07E5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07E5 + ,simpleLowerCaseMapping:0x07E5 + ,simpleTitleCaseMapping:0x07E5 + }, + { code:0x07E6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07E6 + ,simpleLowerCaseMapping:0x07E6 + ,simpleTitleCaseMapping:0x07E6 + }, + { code:0x07E7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07E7 + ,simpleLowerCaseMapping:0x07E7 + ,simpleTitleCaseMapping:0x07E7 + }, + { code:0x07E8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07E8 + ,simpleLowerCaseMapping:0x07E8 + ,simpleTitleCaseMapping:0x07E8 + }, + { code:0x07E9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07E9 + ,simpleLowerCaseMapping:0x07E9 + ,simpleTitleCaseMapping:0x07E9 + }, + { code:0x07EA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x07EA + ,simpleLowerCaseMapping:0x07EA + ,simpleTitleCaseMapping:0x07EA + }, + { code:0x07EB + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x07EB + ,simpleLowerCaseMapping:0x07EB + ,simpleTitleCaseMapping:0x07EB + }, + { code:0x07EC + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x07EC + ,simpleLowerCaseMapping:0x07EC + ,simpleTitleCaseMapping:0x07EC + }, + { code:0x07ED + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x07ED + ,simpleLowerCaseMapping:0x07ED + ,simpleTitleCaseMapping:0x07ED + }, + { code:0x07EE + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x07EE + ,simpleLowerCaseMapping:0x07EE + ,simpleTitleCaseMapping:0x07EE + }, + { code:0x07EF + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x07EF + ,simpleLowerCaseMapping:0x07EF + ,simpleTitleCaseMapping:0x07EF + }, + { code:0x07F0 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x07F0 + ,simpleLowerCaseMapping:0x07F0 + ,simpleTitleCaseMapping:0x07F0 + }, + { code:0x07F1 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x07F1 + ,simpleLowerCaseMapping:0x07F1 + ,simpleTitleCaseMapping:0x07F1 + }, + { code:0x07F2 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x07F2 + ,simpleLowerCaseMapping:0x07F2 + ,simpleTitleCaseMapping:0x07F2 + }, + { code:0x07F3 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x07F3 + ,simpleLowerCaseMapping:0x07F3 + ,simpleTitleCaseMapping:0x07F3 + }, + { code:0x07F4 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x07F4 + ,simpleLowerCaseMapping:0x07F4 + ,simpleTitleCaseMapping:0x07F4 + }, + { code:0x07F5 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x07F5 + ,simpleLowerCaseMapping:0x07F5 + ,simpleTitleCaseMapping:0x07F5 + }, + { code:0x07F6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x07F6 + ,simpleLowerCaseMapping:0x07F6 + ,simpleTitleCaseMapping:0x07F6 + }, + { code:0x07F7 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x07F7 + ,simpleLowerCaseMapping:0x07F7 + ,simpleTitleCaseMapping:0x07F7 + }, + { code:0x07F8 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x07F8 + ,simpleLowerCaseMapping:0x07F8 + ,simpleTitleCaseMapping:0x07F8 + }, + { code:0x07F9 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x07F9 + ,simpleLowerCaseMapping:0x07F9 + ,simpleTitleCaseMapping:0x07F9 + }, + { code:0x07FA + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x07FA + ,simpleLowerCaseMapping:0x07FA + ,simpleTitleCaseMapping:0x07FA + }, + { code:0x0901 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0901 + ,simpleLowerCaseMapping:0x0901 + ,simpleTitleCaseMapping:0x0901 + }, + { code:0x0902 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0902 + ,simpleLowerCaseMapping:0x0902 + ,simpleTitleCaseMapping:0x0902 + }, + { code:0x0903 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0903 + ,simpleLowerCaseMapping:0x0903 + ,simpleTitleCaseMapping:0x0903 + }, + { code:0x0904 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0904 + ,simpleLowerCaseMapping:0x0904 + ,simpleTitleCaseMapping:0x0904 + }, + { code:0x0905 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0905 + ,simpleLowerCaseMapping:0x0905 + ,simpleTitleCaseMapping:0x0905 + }, + { code:0x0906 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0906 + ,simpleLowerCaseMapping:0x0906 + ,simpleTitleCaseMapping:0x0906 + }, + { code:0x0907 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0907 + ,simpleLowerCaseMapping:0x0907 + ,simpleTitleCaseMapping:0x0907 + }, + { code:0x0908 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0908 + ,simpleLowerCaseMapping:0x0908 + ,simpleTitleCaseMapping:0x0908 + }, + { code:0x0909 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0909 + ,simpleLowerCaseMapping:0x0909 + ,simpleTitleCaseMapping:0x0909 + }, + { code:0x090A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x090A + ,simpleLowerCaseMapping:0x090A + ,simpleTitleCaseMapping:0x090A + }, + { code:0x090B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x090B + ,simpleLowerCaseMapping:0x090B + ,simpleTitleCaseMapping:0x090B + }, + { code:0x090C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x090C + ,simpleLowerCaseMapping:0x090C + ,simpleTitleCaseMapping:0x090C + }, + { code:0x090D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x090D + ,simpleLowerCaseMapping:0x090D + ,simpleTitleCaseMapping:0x090D + }, + { code:0x090E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x090E + ,simpleLowerCaseMapping:0x090E + ,simpleTitleCaseMapping:0x090E + }, + { code:0x090F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x090F + ,simpleLowerCaseMapping:0x090F + ,simpleTitleCaseMapping:0x090F + }, + { code:0x0910 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0910 + ,simpleLowerCaseMapping:0x0910 + ,simpleTitleCaseMapping:0x0910 + }, + { code:0x0911 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0911 + ,simpleLowerCaseMapping:0x0911 + ,simpleTitleCaseMapping:0x0911 + }, + { code:0x0912 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0912 + ,simpleLowerCaseMapping:0x0912 + ,simpleTitleCaseMapping:0x0912 + }, + { code:0x0913 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0913 + ,simpleLowerCaseMapping:0x0913 + ,simpleTitleCaseMapping:0x0913 + }, + { code:0x0914 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0914 + ,simpleLowerCaseMapping:0x0914 + ,simpleTitleCaseMapping:0x0914 + }, + { code:0x0915 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0915 + ,simpleLowerCaseMapping:0x0915 + ,simpleTitleCaseMapping:0x0915 + }, + { code:0x0916 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0916 + ,simpleLowerCaseMapping:0x0916 + ,simpleTitleCaseMapping:0x0916 + }, + { code:0x0917 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0917 + ,simpleLowerCaseMapping:0x0917 + ,simpleTitleCaseMapping:0x0917 + }, + { code:0x0918 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0918 + ,simpleLowerCaseMapping:0x0918 + ,simpleTitleCaseMapping:0x0918 + }, + { code:0x0919 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0919 + ,simpleLowerCaseMapping:0x0919 + ,simpleTitleCaseMapping:0x0919 + }, + { code:0x091A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x091A + ,simpleLowerCaseMapping:0x091A + ,simpleTitleCaseMapping:0x091A + }, + { code:0x091B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x091B + ,simpleLowerCaseMapping:0x091B + ,simpleTitleCaseMapping:0x091B + }, + { code:0x091C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x091C + ,simpleLowerCaseMapping:0x091C + ,simpleTitleCaseMapping:0x091C + }, + { code:0x091D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x091D + ,simpleLowerCaseMapping:0x091D + ,simpleTitleCaseMapping:0x091D + }, + { code:0x091E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x091E + ,simpleLowerCaseMapping:0x091E + ,simpleTitleCaseMapping:0x091E + }, + { code:0x091F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x091F + ,simpleLowerCaseMapping:0x091F + ,simpleTitleCaseMapping:0x091F + }, + { code:0x0920 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0920 + ,simpleLowerCaseMapping:0x0920 + ,simpleTitleCaseMapping:0x0920 + }, + { code:0x0921 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0921 + ,simpleLowerCaseMapping:0x0921 + ,simpleTitleCaseMapping:0x0921 + }, + { code:0x0922 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0922 + ,simpleLowerCaseMapping:0x0922 + ,simpleTitleCaseMapping:0x0922 + }, + { code:0x0923 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0923 + ,simpleLowerCaseMapping:0x0923 + ,simpleTitleCaseMapping:0x0923 + }, + { code:0x0924 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0924 + ,simpleLowerCaseMapping:0x0924 + ,simpleTitleCaseMapping:0x0924 + }, + { code:0x0925 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0925 + ,simpleLowerCaseMapping:0x0925 + ,simpleTitleCaseMapping:0x0925 + }, + { code:0x0926 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0926 + ,simpleLowerCaseMapping:0x0926 + ,simpleTitleCaseMapping:0x0926 + }, + { code:0x0927 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0927 + ,simpleLowerCaseMapping:0x0927 + ,simpleTitleCaseMapping:0x0927 + }, + { code:0x0928 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0928 + ,simpleLowerCaseMapping:0x0928 + ,simpleTitleCaseMapping:0x0928 + }, + { code:0x0929 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0929 + ,simpleLowerCaseMapping:0x0929 + ,simpleTitleCaseMapping:0x0929 + }, + { code:0x092A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x092A + ,simpleLowerCaseMapping:0x092A + ,simpleTitleCaseMapping:0x092A + }, + { code:0x092B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x092B + ,simpleLowerCaseMapping:0x092B + ,simpleTitleCaseMapping:0x092B + }, + { code:0x092C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x092C + ,simpleLowerCaseMapping:0x092C + ,simpleTitleCaseMapping:0x092C + }, + { code:0x092D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x092D + ,simpleLowerCaseMapping:0x092D + ,simpleTitleCaseMapping:0x092D + }, + { code:0x092E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x092E + ,simpleLowerCaseMapping:0x092E + ,simpleTitleCaseMapping:0x092E + }, + { code:0x092F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x092F + ,simpleLowerCaseMapping:0x092F + ,simpleTitleCaseMapping:0x092F + }, + { code:0x0930 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0930 + ,simpleLowerCaseMapping:0x0930 + ,simpleTitleCaseMapping:0x0930 + }, + { code:0x0931 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0931 + ,simpleLowerCaseMapping:0x0931 + ,simpleTitleCaseMapping:0x0931 + }, + { code:0x0932 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0932 + ,simpleLowerCaseMapping:0x0932 + ,simpleTitleCaseMapping:0x0932 + }, + { code:0x0933 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0933 + ,simpleLowerCaseMapping:0x0933 + ,simpleTitleCaseMapping:0x0933 + }, + { code:0x0934 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0934 + ,simpleLowerCaseMapping:0x0934 + ,simpleTitleCaseMapping:0x0934 + }, + { code:0x0935 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0935 + ,simpleLowerCaseMapping:0x0935 + ,simpleTitleCaseMapping:0x0935 + }, + { code:0x0936 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0936 + ,simpleLowerCaseMapping:0x0936 + ,simpleTitleCaseMapping:0x0936 + }, + { code:0x0937 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0937 + ,simpleLowerCaseMapping:0x0937 + ,simpleTitleCaseMapping:0x0937 + }, + { code:0x0938 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0938 + ,simpleLowerCaseMapping:0x0938 + ,simpleTitleCaseMapping:0x0938 + }, + { code:0x0939 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0939 + ,simpleLowerCaseMapping:0x0939 + ,simpleTitleCaseMapping:0x0939 + }, + { code:0x093C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x093C + ,simpleLowerCaseMapping:0x093C + ,simpleTitleCaseMapping:0x093C + }, + { code:0x093D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x093D + ,simpleLowerCaseMapping:0x093D + ,simpleTitleCaseMapping:0x093D + }, + { code:0x093E + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x093E + ,simpleLowerCaseMapping:0x093E + ,simpleTitleCaseMapping:0x093E + }, + { code:0x093F + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x093F + ,simpleLowerCaseMapping:0x093F + ,simpleTitleCaseMapping:0x093F + }, + { code:0x0940 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0940 + ,simpleLowerCaseMapping:0x0940 + ,simpleTitleCaseMapping:0x0940 + }, + { code:0x0941 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0941 + ,simpleLowerCaseMapping:0x0941 + ,simpleTitleCaseMapping:0x0941 + }, + { code:0x0942 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0942 + ,simpleLowerCaseMapping:0x0942 + ,simpleTitleCaseMapping:0x0942 + }, + { code:0x0943 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0943 + ,simpleLowerCaseMapping:0x0943 + ,simpleTitleCaseMapping:0x0943 + }, + { code:0x0944 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0944 + ,simpleLowerCaseMapping:0x0944 + ,simpleTitleCaseMapping:0x0944 + }, + { code:0x0945 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0945 + ,simpleLowerCaseMapping:0x0945 + ,simpleTitleCaseMapping:0x0945 + }, + { code:0x0946 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0946 + ,simpleLowerCaseMapping:0x0946 + ,simpleTitleCaseMapping:0x0946 + }, + { code:0x0947 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0947 + ,simpleLowerCaseMapping:0x0947 + ,simpleTitleCaseMapping:0x0947 + }, + { code:0x0948 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0948 + ,simpleLowerCaseMapping:0x0948 + ,simpleTitleCaseMapping:0x0948 + }, + { code:0x0949 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0949 + ,simpleLowerCaseMapping:0x0949 + ,simpleTitleCaseMapping:0x0949 + }, + { code:0x094A + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x094A + ,simpleLowerCaseMapping:0x094A + ,simpleTitleCaseMapping:0x094A + }, + { code:0x094B + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x094B + ,simpleLowerCaseMapping:0x094B + ,simpleTitleCaseMapping:0x094B + }, + { code:0x094C + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x094C + ,simpleLowerCaseMapping:0x094C + ,simpleTitleCaseMapping:0x094C + }, + { code:0x094D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x094D + ,simpleLowerCaseMapping:0x094D + ,simpleTitleCaseMapping:0x094D + }, + { code:0x0950 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0950 + ,simpleLowerCaseMapping:0x0950 + ,simpleTitleCaseMapping:0x0950 + }, + { code:0x0951 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0951 + ,simpleLowerCaseMapping:0x0951 + ,simpleTitleCaseMapping:0x0951 + }, + { code:0x0952 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0952 + ,simpleLowerCaseMapping:0x0952 + ,simpleTitleCaseMapping:0x0952 + }, + { code:0x0953 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0953 + ,simpleLowerCaseMapping:0x0953 + ,simpleTitleCaseMapping:0x0953 + }, + { code:0x0954 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0954 + ,simpleLowerCaseMapping:0x0954 + ,simpleTitleCaseMapping:0x0954 + }, + { code:0x0958 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0958 + ,simpleLowerCaseMapping:0x0958 + ,simpleTitleCaseMapping:0x0958 + }, + { code:0x0959 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0959 + ,simpleLowerCaseMapping:0x0959 + ,simpleTitleCaseMapping:0x0959 + }, + { code:0x095A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x095A + ,simpleLowerCaseMapping:0x095A + ,simpleTitleCaseMapping:0x095A + }, + { code:0x095B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x095B + ,simpleLowerCaseMapping:0x095B + ,simpleTitleCaseMapping:0x095B + }, + { code:0x095C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x095C + ,simpleLowerCaseMapping:0x095C + ,simpleTitleCaseMapping:0x095C + }, + { code:0x095D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x095D + ,simpleLowerCaseMapping:0x095D + ,simpleTitleCaseMapping:0x095D + }, + { code:0x095E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x095E + ,simpleLowerCaseMapping:0x095E + ,simpleTitleCaseMapping:0x095E + }, + { code:0x095F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x095F + ,simpleLowerCaseMapping:0x095F + ,simpleTitleCaseMapping:0x095F + }, + { code:0x0960 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0960 + ,simpleLowerCaseMapping:0x0960 + ,simpleTitleCaseMapping:0x0960 + }, + { code:0x0961 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0961 + ,simpleLowerCaseMapping:0x0961 + ,simpleTitleCaseMapping:0x0961 + }, + { code:0x0962 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0962 + ,simpleLowerCaseMapping:0x0962 + ,simpleTitleCaseMapping:0x0962 + }, + { code:0x0963 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0963 + ,simpleLowerCaseMapping:0x0963 + ,simpleTitleCaseMapping:0x0963 + }, + { code:0x0964 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0964 + ,simpleLowerCaseMapping:0x0964 + ,simpleTitleCaseMapping:0x0964 + }, + { code:0x0965 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0965 + ,simpleLowerCaseMapping:0x0965 + ,simpleTitleCaseMapping:0x0965 + }, + { code:0x0966 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0966 + ,simpleLowerCaseMapping:0x0966 + ,simpleTitleCaseMapping:0x0966 + }, + { code:0x0967 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0967 + ,simpleLowerCaseMapping:0x0967 + ,simpleTitleCaseMapping:0x0967 + }, + { code:0x0968 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0968 + ,simpleLowerCaseMapping:0x0968 + ,simpleTitleCaseMapping:0x0968 + }, + { code:0x0969 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0969 + ,simpleLowerCaseMapping:0x0969 + ,simpleTitleCaseMapping:0x0969 + }, + { code:0x096A + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x096A + ,simpleLowerCaseMapping:0x096A + ,simpleTitleCaseMapping:0x096A + }, + { code:0x096B + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x096B + ,simpleLowerCaseMapping:0x096B + ,simpleTitleCaseMapping:0x096B + }, + { code:0x096C + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x096C + ,simpleLowerCaseMapping:0x096C + ,simpleTitleCaseMapping:0x096C + }, + { code:0x096D + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x096D + ,simpleLowerCaseMapping:0x096D + ,simpleTitleCaseMapping:0x096D + }, + { code:0x096E + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x096E + ,simpleLowerCaseMapping:0x096E + ,simpleTitleCaseMapping:0x096E + }, + { code:0x096F + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x096F + ,simpleLowerCaseMapping:0x096F + ,simpleTitleCaseMapping:0x096F + }, + { code:0x0970 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0970 + ,simpleLowerCaseMapping:0x0970 + ,simpleTitleCaseMapping:0x0970 + }, + { code:0x097B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x097B + ,simpleLowerCaseMapping:0x097B + ,simpleTitleCaseMapping:0x097B + }, + { code:0x097C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x097C + ,simpleLowerCaseMapping:0x097C + ,simpleTitleCaseMapping:0x097C + }, + { code:0x097D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x097D + ,simpleLowerCaseMapping:0x097D + ,simpleTitleCaseMapping:0x097D + }, + { code:0x097E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x097E + ,simpleLowerCaseMapping:0x097E + ,simpleTitleCaseMapping:0x097E + }, + { code:0x097F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x097F + ,simpleLowerCaseMapping:0x097F + ,simpleTitleCaseMapping:0x097F + }, + { code:0x0981 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0981 + ,simpleLowerCaseMapping:0x0981 + ,simpleTitleCaseMapping:0x0981 + }, + { code:0x0982 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0982 + ,simpleLowerCaseMapping:0x0982 + ,simpleTitleCaseMapping:0x0982 + }, + { code:0x0983 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0983 + ,simpleLowerCaseMapping:0x0983 + ,simpleTitleCaseMapping:0x0983 + }, + { code:0x0985 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0985 + ,simpleLowerCaseMapping:0x0985 + ,simpleTitleCaseMapping:0x0985 + }, + { code:0x0986 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0986 + ,simpleLowerCaseMapping:0x0986 + ,simpleTitleCaseMapping:0x0986 + }, + { code:0x0987 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0987 + ,simpleLowerCaseMapping:0x0987 + ,simpleTitleCaseMapping:0x0987 + }, + { code:0x0988 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0988 + ,simpleLowerCaseMapping:0x0988 + ,simpleTitleCaseMapping:0x0988 + }, + { code:0x0989 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0989 + ,simpleLowerCaseMapping:0x0989 + ,simpleTitleCaseMapping:0x0989 + }, + { code:0x098A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x098A + ,simpleLowerCaseMapping:0x098A + ,simpleTitleCaseMapping:0x098A + }, + { code:0x098B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x098B + ,simpleLowerCaseMapping:0x098B + ,simpleTitleCaseMapping:0x098B + }, + { code:0x098C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x098C + ,simpleLowerCaseMapping:0x098C + ,simpleTitleCaseMapping:0x098C + }, + { code:0x098F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x098F + ,simpleLowerCaseMapping:0x098F + ,simpleTitleCaseMapping:0x098F + }, + { code:0x0990 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0990 + ,simpleLowerCaseMapping:0x0990 + ,simpleTitleCaseMapping:0x0990 + }, + { code:0x0993 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0993 + ,simpleLowerCaseMapping:0x0993 + ,simpleTitleCaseMapping:0x0993 + }, + { code:0x0994 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0994 + ,simpleLowerCaseMapping:0x0994 + ,simpleTitleCaseMapping:0x0994 + }, + { code:0x0995 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0995 + ,simpleLowerCaseMapping:0x0995 + ,simpleTitleCaseMapping:0x0995 + }, + { code:0x0996 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0996 + ,simpleLowerCaseMapping:0x0996 + ,simpleTitleCaseMapping:0x0996 + }, + { code:0x0997 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0997 + ,simpleLowerCaseMapping:0x0997 + ,simpleTitleCaseMapping:0x0997 + }, + { code:0x0998 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0998 + ,simpleLowerCaseMapping:0x0998 + ,simpleTitleCaseMapping:0x0998 + }, + { code:0x0999 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0999 + ,simpleLowerCaseMapping:0x0999 + ,simpleTitleCaseMapping:0x0999 + }, + { code:0x099A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x099A + ,simpleLowerCaseMapping:0x099A + ,simpleTitleCaseMapping:0x099A + }, + { code:0x099B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x099B + ,simpleLowerCaseMapping:0x099B + ,simpleTitleCaseMapping:0x099B + }, + { code:0x099C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x099C + ,simpleLowerCaseMapping:0x099C + ,simpleTitleCaseMapping:0x099C + }, + { code:0x099D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x099D + ,simpleLowerCaseMapping:0x099D + ,simpleTitleCaseMapping:0x099D + }, + { code:0x099E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x099E + ,simpleLowerCaseMapping:0x099E + ,simpleTitleCaseMapping:0x099E + }, + { code:0x099F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x099F + ,simpleLowerCaseMapping:0x099F + ,simpleTitleCaseMapping:0x099F + }, + { code:0x09A0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x09A0 + ,simpleLowerCaseMapping:0x09A0 + ,simpleTitleCaseMapping:0x09A0 + }, + { code:0x09A1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x09A1 + ,simpleLowerCaseMapping:0x09A1 + ,simpleTitleCaseMapping:0x09A1 + }, + { code:0x09A2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x09A2 + ,simpleLowerCaseMapping:0x09A2 + ,simpleTitleCaseMapping:0x09A2 + }, + { code:0x09A3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x09A3 + ,simpleLowerCaseMapping:0x09A3 + ,simpleTitleCaseMapping:0x09A3 + }, + { code:0x09A4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x09A4 + ,simpleLowerCaseMapping:0x09A4 + ,simpleTitleCaseMapping:0x09A4 + }, + { code:0x09A5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x09A5 + ,simpleLowerCaseMapping:0x09A5 + ,simpleTitleCaseMapping:0x09A5 + }, + { code:0x09A6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x09A6 + ,simpleLowerCaseMapping:0x09A6 + ,simpleTitleCaseMapping:0x09A6 + }, + { code:0x09A7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x09A7 + ,simpleLowerCaseMapping:0x09A7 + ,simpleTitleCaseMapping:0x09A7 + }, + { code:0x09A8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x09A8 + ,simpleLowerCaseMapping:0x09A8 + ,simpleTitleCaseMapping:0x09A8 + }, + { code:0x09AA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x09AA + ,simpleLowerCaseMapping:0x09AA + ,simpleTitleCaseMapping:0x09AA + }, + { code:0x09AB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x09AB + ,simpleLowerCaseMapping:0x09AB + ,simpleTitleCaseMapping:0x09AB + }, + { code:0x09AC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x09AC + ,simpleLowerCaseMapping:0x09AC + ,simpleTitleCaseMapping:0x09AC + }, + { code:0x09AD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x09AD + ,simpleLowerCaseMapping:0x09AD + ,simpleTitleCaseMapping:0x09AD + }, + { code:0x09AE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x09AE + ,simpleLowerCaseMapping:0x09AE + ,simpleTitleCaseMapping:0x09AE + }, + { code:0x09AF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x09AF + ,simpleLowerCaseMapping:0x09AF + ,simpleTitleCaseMapping:0x09AF + }, + { code:0x09B0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x09B0 + ,simpleLowerCaseMapping:0x09B0 + ,simpleTitleCaseMapping:0x09B0 + }, + { code:0x09B2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x09B2 + ,simpleLowerCaseMapping:0x09B2 + ,simpleTitleCaseMapping:0x09B2 + }, + { code:0x09B6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x09B6 + ,simpleLowerCaseMapping:0x09B6 + ,simpleTitleCaseMapping:0x09B6 + }, + { code:0x09B7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x09B7 + ,simpleLowerCaseMapping:0x09B7 + ,simpleTitleCaseMapping:0x09B7 + }, + { code:0x09B8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x09B8 + ,simpleLowerCaseMapping:0x09B8 + ,simpleTitleCaseMapping:0x09B8 + }, + { code:0x09B9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x09B9 + ,simpleLowerCaseMapping:0x09B9 + ,simpleTitleCaseMapping:0x09B9 + }, + { code:0x09BC + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x09BC + ,simpleLowerCaseMapping:0x09BC + ,simpleTitleCaseMapping:0x09BC + }, + { code:0x09BD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x09BD + ,simpleLowerCaseMapping:0x09BD + ,simpleTitleCaseMapping:0x09BD + }, + { code:0x09BE + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x09BE + ,simpleLowerCaseMapping:0x09BE + ,simpleTitleCaseMapping:0x09BE + }, + { code:0x09BF + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x09BF + ,simpleLowerCaseMapping:0x09BF + ,simpleTitleCaseMapping:0x09BF + }, + { code:0x09C0 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x09C0 + ,simpleLowerCaseMapping:0x09C0 + ,simpleTitleCaseMapping:0x09C0 + }, + { code:0x09C1 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x09C1 + ,simpleLowerCaseMapping:0x09C1 + ,simpleTitleCaseMapping:0x09C1 + }, + { code:0x09C2 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x09C2 + ,simpleLowerCaseMapping:0x09C2 + ,simpleTitleCaseMapping:0x09C2 + }, + { code:0x09C3 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x09C3 + ,simpleLowerCaseMapping:0x09C3 + ,simpleTitleCaseMapping:0x09C3 + }, + { code:0x09C4 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x09C4 + ,simpleLowerCaseMapping:0x09C4 + ,simpleTitleCaseMapping:0x09C4 + }, + { code:0x09C7 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x09C7 + ,simpleLowerCaseMapping:0x09C7 + ,simpleTitleCaseMapping:0x09C7 + }, + { code:0x09C8 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x09C8 + ,simpleLowerCaseMapping:0x09C8 + ,simpleTitleCaseMapping:0x09C8 + }, + { code:0x09CB + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x09CB + ,simpleLowerCaseMapping:0x09CB + ,simpleTitleCaseMapping:0x09CB + }, + { code:0x09CC + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x09CC + ,simpleLowerCaseMapping:0x09CC + ,simpleTitleCaseMapping:0x09CC + }, + { code:0x09CD + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x09CD + ,simpleLowerCaseMapping:0x09CD + ,simpleTitleCaseMapping:0x09CD + }, + { code:0x09CE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x09CE + ,simpleLowerCaseMapping:0x09CE + ,simpleTitleCaseMapping:0x09CE + }, + { code:0x09D7 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x09D7 + ,simpleLowerCaseMapping:0x09D7 + ,simpleTitleCaseMapping:0x09D7 + }, + { code:0x09DC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x09DC + ,simpleLowerCaseMapping:0x09DC + ,simpleTitleCaseMapping:0x09DC + }, + { code:0x09DD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x09DD + ,simpleLowerCaseMapping:0x09DD + ,simpleTitleCaseMapping:0x09DD + }, + { code:0x09DF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x09DF + ,simpleLowerCaseMapping:0x09DF + ,simpleTitleCaseMapping:0x09DF + }, + { code:0x09E0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x09E0 + ,simpleLowerCaseMapping:0x09E0 + ,simpleTitleCaseMapping:0x09E0 + }, + { code:0x09E1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x09E1 + ,simpleLowerCaseMapping:0x09E1 + ,simpleTitleCaseMapping:0x09E1 + }, + { code:0x09E2 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x09E2 + ,simpleLowerCaseMapping:0x09E2 + ,simpleTitleCaseMapping:0x09E2 + }, + { code:0x09E3 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x09E3 + ,simpleLowerCaseMapping:0x09E3 + ,simpleTitleCaseMapping:0x09E3 + }, + { code:0x09E6 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x09E6 + ,simpleLowerCaseMapping:0x09E6 + ,simpleTitleCaseMapping:0x09E6 + }, + { code:0x09E7 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x09E7 + ,simpleLowerCaseMapping:0x09E7 + ,simpleTitleCaseMapping:0x09E7 + }, + { code:0x09E8 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x09E8 + ,simpleLowerCaseMapping:0x09E8 + ,simpleTitleCaseMapping:0x09E8 + }, + { code:0x09E9 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x09E9 + ,simpleLowerCaseMapping:0x09E9 + ,simpleTitleCaseMapping:0x09E9 + }, + { code:0x09EA + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x09EA + ,simpleLowerCaseMapping:0x09EA + ,simpleTitleCaseMapping:0x09EA + }, + { code:0x09EB + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x09EB + ,simpleLowerCaseMapping:0x09EB + ,simpleTitleCaseMapping:0x09EB + }, + { code:0x09EC + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x09EC + ,simpleLowerCaseMapping:0x09EC + ,simpleTitleCaseMapping:0x09EC + }, + { code:0x09ED + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x09ED + ,simpleLowerCaseMapping:0x09ED + ,simpleTitleCaseMapping:0x09ED + }, + { code:0x09EE + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x09EE + ,simpleLowerCaseMapping:0x09EE + ,simpleTitleCaseMapping:0x09EE + }, + { code:0x09EF + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x09EF + ,simpleLowerCaseMapping:0x09EF + ,simpleTitleCaseMapping:0x09EF + }, + { code:0x09F0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x09F0 + ,simpleLowerCaseMapping:0x09F0 + ,simpleTitleCaseMapping:0x09F0 + }, + { code:0x09F1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x09F1 + ,simpleLowerCaseMapping:0x09F1 + ,simpleTitleCaseMapping:0x09F1 + }, + { code:0x09F2 + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0x09F2 + ,simpleLowerCaseMapping:0x09F2 + ,simpleTitleCaseMapping:0x09F2 + }, + { code:0x09F3 + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0x09F3 + ,simpleLowerCaseMapping:0x09F3 + ,simpleTitleCaseMapping:0x09F3 + }, + { code:0x09F4 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x09F4 + ,simpleLowerCaseMapping:0x09F4 + ,simpleTitleCaseMapping:0x09F4 + }, + { code:0x09F5 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x09F5 + ,simpleLowerCaseMapping:0x09F5 + ,simpleTitleCaseMapping:0x09F5 + }, + { code:0x09F6 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x09F6 + ,simpleLowerCaseMapping:0x09F6 + ,simpleTitleCaseMapping:0x09F6 + }, + { code:0x09F7 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x09F7 + ,simpleLowerCaseMapping:0x09F7 + ,simpleTitleCaseMapping:0x09F7 + }, + { code:0x09F8 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x09F8 + ,simpleLowerCaseMapping:0x09F8 + ,simpleTitleCaseMapping:0x09F8 + }, + { code:0x09F9 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x09F9 + ,simpleLowerCaseMapping:0x09F9 + ,simpleTitleCaseMapping:0x09F9 + }, + { code:0x09FA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x09FA + ,simpleLowerCaseMapping:0x09FA + ,simpleTitleCaseMapping:0x09FA + }, + { code:0x0A01 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0A01 + ,simpleLowerCaseMapping:0x0A01 + ,simpleTitleCaseMapping:0x0A01 + }, + { code:0x0A02 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0A02 + ,simpleLowerCaseMapping:0x0A02 + ,simpleTitleCaseMapping:0x0A02 + }, + { code:0x0A03 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0A03 + ,simpleLowerCaseMapping:0x0A03 + ,simpleTitleCaseMapping:0x0A03 + }, + { code:0x0A05 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A05 + ,simpleLowerCaseMapping:0x0A05 + ,simpleTitleCaseMapping:0x0A05 + }, + { code:0x0A06 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A06 + ,simpleLowerCaseMapping:0x0A06 + ,simpleTitleCaseMapping:0x0A06 + }, + { code:0x0A07 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A07 + ,simpleLowerCaseMapping:0x0A07 + ,simpleTitleCaseMapping:0x0A07 + }, + { code:0x0A08 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A08 + ,simpleLowerCaseMapping:0x0A08 + ,simpleTitleCaseMapping:0x0A08 + }, + { code:0x0A09 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A09 + ,simpleLowerCaseMapping:0x0A09 + ,simpleTitleCaseMapping:0x0A09 + }, + { code:0x0A0A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A0A + ,simpleLowerCaseMapping:0x0A0A + ,simpleTitleCaseMapping:0x0A0A + }, + { code:0x0A0F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A0F + ,simpleLowerCaseMapping:0x0A0F + ,simpleTitleCaseMapping:0x0A0F + }, + { code:0x0A10 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A10 + ,simpleLowerCaseMapping:0x0A10 + ,simpleTitleCaseMapping:0x0A10 + }, + { code:0x0A13 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A13 + ,simpleLowerCaseMapping:0x0A13 + ,simpleTitleCaseMapping:0x0A13 + }, + { code:0x0A14 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A14 + ,simpleLowerCaseMapping:0x0A14 + ,simpleTitleCaseMapping:0x0A14 + }, + { code:0x0A15 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A15 + ,simpleLowerCaseMapping:0x0A15 + ,simpleTitleCaseMapping:0x0A15 + }, + { code:0x0A16 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A16 + ,simpleLowerCaseMapping:0x0A16 + ,simpleTitleCaseMapping:0x0A16 + }, + { code:0x0A17 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A17 + ,simpleLowerCaseMapping:0x0A17 + ,simpleTitleCaseMapping:0x0A17 + }, + { code:0x0A18 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A18 + ,simpleLowerCaseMapping:0x0A18 + ,simpleTitleCaseMapping:0x0A18 + }, + { code:0x0A19 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A19 + ,simpleLowerCaseMapping:0x0A19 + ,simpleTitleCaseMapping:0x0A19 + }, + { code:0x0A1A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A1A + ,simpleLowerCaseMapping:0x0A1A + ,simpleTitleCaseMapping:0x0A1A + }, + { code:0x0A1B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A1B + ,simpleLowerCaseMapping:0x0A1B + ,simpleTitleCaseMapping:0x0A1B + }, + { code:0x0A1C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A1C + ,simpleLowerCaseMapping:0x0A1C + ,simpleTitleCaseMapping:0x0A1C + }, + { code:0x0A1D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A1D + ,simpleLowerCaseMapping:0x0A1D + ,simpleTitleCaseMapping:0x0A1D + }, + { code:0x0A1E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A1E + ,simpleLowerCaseMapping:0x0A1E + ,simpleTitleCaseMapping:0x0A1E + }, + { code:0x0A1F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A1F + ,simpleLowerCaseMapping:0x0A1F + ,simpleTitleCaseMapping:0x0A1F + }, + { code:0x0A20 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A20 + ,simpleLowerCaseMapping:0x0A20 + ,simpleTitleCaseMapping:0x0A20 + }, + { code:0x0A21 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A21 + ,simpleLowerCaseMapping:0x0A21 + ,simpleTitleCaseMapping:0x0A21 + }, + { code:0x0A22 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A22 + ,simpleLowerCaseMapping:0x0A22 + ,simpleTitleCaseMapping:0x0A22 + }, + { code:0x0A23 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A23 + ,simpleLowerCaseMapping:0x0A23 + ,simpleTitleCaseMapping:0x0A23 + }, + { code:0x0A24 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A24 + ,simpleLowerCaseMapping:0x0A24 + ,simpleTitleCaseMapping:0x0A24 + }, + { code:0x0A25 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A25 + ,simpleLowerCaseMapping:0x0A25 + ,simpleTitleCaseMapping:0x0A25 + }, + { code:0x0A26 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A26 + ,simpleLowerCaseMapping:0x0A26 + ,simpleTitleCaseMapping:0x0A26 + }, + { code:0x0A27 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A27 + ,simpleLowerCaseMapping:0x0A27 + ,simpleTitleCaseMapping:0x0A27 + }, + { code:0x0A28 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A28 + ,simpleLowerCaseMapping:0x0A28 + ,simpleTitleCaseMapping:0x0A28 + }, + { code:0x0A2A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A2A + ,simpleLowerCaseMapping:0x0A2A + ,simpleTitleCaseMapping:0x0A2A + }, + { code:0x0A2B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A2B + ,simpleLowerCaseMapping:0x0A2B + ,simpleTitleCaseMapping:0x0A2B + }, + { code:0x0A2C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A2C + ,simpleLowerCaseMapping:0x0A2C + ,simpleTitleCaseMapping:0x0A2C + }, + { code:0x0A2D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A2D + ,simpleLowerCaseMapping:0x0A2D + ,simpleTitleCaseMapping:0x0A2D + }, + { code:0x0A2E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A2E + ,simpleLowerCaseMapping:0x0A2E + ,simpleTitleCaseMapping:0x0A2E + }, + { code:0x0A2F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A2F + ,simpleLowerCaseMapping:0x0A2F + ,simpleTitleCaseMapping:0x0A2F + }, + { code:0x0A30 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A30 + ,simpleLowerCaseMapping:0x0A30 + ,simpleTitleCaseMapping:0x0A30 + }, + { code:0x0A32 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A32 + ,simpleLowerCaseMapping:0x0A32 + ,simpleTitleCaseMapping:0x0A32 + }, + { code:0x0A33 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A33 + ,simpleLowerCaseMapping:0x0A33 + ,simpleTitleCaseMapping:0x0A33 + }, + { code:0x0A35 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A35 + ,simpleLowerCaseMapping:0x0A35 + ,simpleTitleCaseMapping:0x0A35 + }, + { code:0x0A36 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A36 + ,simpleLowerCaseMapping:0x0A36 + ,simpleTitleCaseMapping:0x0A36 + }, + { code:0x0A38 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A38 + ,simpleLowerCaseMapping:0x0A38 + ,simpleTitleCaseMapping:0x0A38 + }, + { code:0x0A39 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A39 + ,simpleLowerCaseMapping:0x0A39 + ,simpleTitleCaseMapping:0x0A39 + }, + { code:0x0A3C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0A3C + ,simpleLowerCaseMapping:0x0A3C + ,simpleTitleCaseMapping:0x0A3C + }, + { code:0x0A3E + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0A3E + ,simpleLowerCaseMapping:0x0A3E + ,simpleTitleCaseMapping:0x0A3E + }, + { code:0x0A3F + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0A3F + ,simpleLowerCaseMapping:0x0A3F + ,simpleTitleCaseMapping:0x0A3F + }, + { code:0x0A40 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0A40 + ,simpleLowerCaseMapping:0x0A40 + ,simpleTitleCaseMapping:0x0A40 + }, + { code:0x0A41 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0A41 + ,simpleLowerCaseMapping:0x0A41 + ,simpleTitleCaseMapping:0x0A41 + }, + { code:0x0A42 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0A42 + ,simpleLowerCaseMapping:0x0A42 + ,simpleTitleCaseMapping:0x0A42 + }, + { code:0x0A47 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0A47 + ,simpleLowerCaseMapping:0x0A47 + ,simpleTitleCaseMapping:0x0A47 + }, + { code:0x0A48 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0A48 + ,simpleLowerCaseMapping:0x0A48 + ,simpleTitleCaseMapping:0x0A48 + }, + { code:0x0A4B + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0A4B + ,simpleLowerCaseMapping:0x0A4B + ,simpleTitleCaseMapping:0x0A4B + }, + { code:0x0A4C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0A4C + ,simpleLowerCaseMapping:0x0A4C + ,simpleTitleCaseMapping:0x0A4C + }, + { code:0x0A4D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0A4D + ,simpleLowerCaseMapping:0x0A4D + ,simpleTitleCaseMapping:0x0A4D + }, + { code:0x0A59 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A59 + ,simpleLowerCaseMapping:0x0A59 + ,simpleTitleCaseMapping:0x0A59 + }, + { code:0x0A5A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A5A + ,simpleLowerCaseMapping:0x0A5A + ,simpleTitleCaseMapping:0x0A5A + }, + { code:0x0A5B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A5B + ,simpleLowerCaseMapping:0x0A5B + ,simpleTitleCaseMapping:0x0A5B + }, + { code:0x0A5C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A5C + ,simpleLowerCaseMapping:0x0A5C + ,simpleTitleCaseMapping:0x0A5C + }, + { code:0x0A5E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A5E + ,simpleLowerCaseMapping:0x0A5E + ,simpleTitleCaseMapping:0x0A5E + }, + { code:0x0A66 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0A66 + ,simpleLowerCaseMapping:0x0A66 + ,simpleTitleCaseMapping:0x0A66 + }, + { code:0x0A67 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0A67 + ,simpleLowerCaseMapping:0x0A67 + ,simpleTitleCaseMapping:0x0A67 + }, + { code:0x0A68 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0A68 + ,simpleLowerCaseMapping:0x0A68 + ,simpleTitleCaseMapping:0x0A68 + }, + { code:0x0A69 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0A69 + ,simpleLowerCaseMapping:0x0A69 + ,simpleTitleCaseMapping:0x0A69 + }, + { code:0x0A6A + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0A6A + ,simpleLowerCaseMapping:0x0A6A + ,simpleTitleCaseMapping:0x0A6A + }, + { code:0x0A6B + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0A6B + ,simpleLowerCaseMapping:0x0A6B + ,simpleTitleCaseMapping:0x0A6B + }, + { code:0x0A6C + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0A6C + ,simpleLowerCaseMapping:0x0A6C + ,simpleTitleCaseMapping:0x0A6C + }, + { code:0x0A6D + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0A6D + ,simpleLowerCaseMapping:0x0A6D + ,simpleTitleCaseMapping:0x0A6D + }, + { code:0x0A6E + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0A6E + ,simpleLowerCaseMapping:0x0A6E + ,simpleTitleCaseMapping:0x0A6E + }, + { code:0x0A6F + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0A6F + ,simpleLowerCaseMapping:0x0A6F + ,simpleTitleCaseMapping:0x0A6F + }, + { code:0x0A70 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0A70 + ,simpleLowerCaseMapping:0x0A70 + ,simpleTitleCaseMapping:0x0A70 + }, + { code:0x0A71 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0A71 + ,simpleLowerCaseMapping:0x0A71 + ,simpleTitleCaseMapping:0x0A71 + }, + { code:0x0A72 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A72 + ,simpleLowerCaseMapping:0x0A72 + ,simpleTitleCaseMapping:0x0A72 + }, + { code:0x0A73 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A73 + ,simpleLowerCaseMapping:0x0A73 + ,simpleTitleCaseMapping:0x0A73 + }, + { code:0x0A74 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A74 + ,simpleLowerCaseMapping:0x0A74 + ,simpleTitleCaseMapping:0x0A74 + }, + { code:0x0A81 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0A81 + ,simpleLowerCaseMapping:0x0A81 + ,simpleTitleCaseMapping:0x0A81 + }, + { code:0x0A82 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0A82 + ,simpleLowerCaseMapping:0x0A82 + ,simpleTitleCaseMapping:0x0A82 + }, + { code:0x0A83 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0A83 + ,simpleLowerCaseMapping:0x0A83 + ,simpleTitleCaseMapping:0x0A83 + }, + { code:0x0A85 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A85 + ,simpleLowerCaseMapping:0x0A85 + ,simpleTitleCaseMapping:0x0A85 + }, + { code:0x0A86 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A86 + ,simpleLowerCaseMapping:0x0A86 + ,simpleTitleCaseMapping:0x0A86 + }, + { code:0x0A87 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A87 + ,simpleLowerCaseMapping:0x0A87 + ,simpleTitleCaseMapping:0x0A87 + }, + { code:0x0A88 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A88 + ,simpleLowerCaseMapping:0x0A88 + ,simpleTitleCaseMapping:0x0A88 + }, + { code:0x0A89 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A89 + ,simpleLowerCaseMapping:0x0A89 + ,simpleTitleCaseMapping:0x0A89 + }, + { code:0x0A8A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A8A + ,simpleLowerCaseMapping:0x0A8A + ,simpleTitleCaseMapping:0x0A8A + }, + { code:0x0A8B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A8B + ,simpleLowerCaseMapping:0x0A8B + ,simpleTitleCaseMapping:0x0A8B + }, + { code:0x0A8C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A8C + ,simpleLowerCaseMapping:0x0A8C + ,simpleTitleCaseMapping:0x0A8C + }, + { code:0x0A8D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A8D + ,simpleLowerCaseMapping:0x0A8D + ,simpleTitleCaseMapping:0x0A8D + }, + { code:0x0A8F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A8F + ,simpleLowerCaseMapping:0x0A8F + ,simpleTitleCaseMapping:0x0A8F + }, + { code:0x0A90 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A90 + ,simpleLowerCaseMapping:0x0A90 + ,simpleTitleCaseMapping:0x0A90 + }, + { code:0x0A91 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A91 + ,simpleLowerCaseMapping:0x0A91 + ,simpleTitleCaseMapping:0x0A91 + }, + { code:0x0A93 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A93 + ,simpleLowerCaseMapping:0x0A93 + ,simpleTitleCaseMapping:0x0A93 + }, + { code:0x0A94 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A94 + ,simpleLowerCaseMapping:0x0A94 + ,simpleTitleCaseMapping:0x0A94 + }, + { code:0x0A95 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A95 + ,simpleLowerCaseMapping:0x0A95 + ,simpleTitleCaseMapping:0x0A95 + }, + { code:0x0A96 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A96 + ,simpleLowerCaseMapping:0x0A96 + ,simpleTitleCaseMapping:0x0A96 + }, + { code:0x0A97 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A97 + ,simpleLowerCaseMapping:0x0A97 + ,simpleTitleCaseMapping:0x0A97 + }, + { code:0x0A98 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A98 + ,simpleLowerCaseMapping:0x0A98 + ,simpleTitleCaseMapping:0x0A98 + }, + { code:0x0A99 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A99 + ,simpleLowerCaseMapping:0x0A99 + ,simpleTitleCaseMapping:0x0A99 + }, + { code:0x0A9A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A9A + ,simpleLowerCaseMapping:0x0A9A + ,simpleTitleCaseMapping:0x0A9A + }, + { code:0x0A9B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A9B + ,simpleLowerCaseMapping:0x0A9B + ,simpleTitleCaseMapping:0x0A9B + }, + { code:0x0A9C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A9C + ,simpleLowerCaseMapping:0x0A9C + ,simpleTitleCaseMapping:0x0A9C + }, + { code:0x0A9D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A9D + ,simpleLowerCaseMapping:0x0A9D + ,simpleTitleCaseMapping:0x0A9D + }, + { code:0x0A9E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A9E + ,simpleLowerCaseMapping:0x0A9E + ,simpleTitleCaseMapping:0x0A9E + }, + { code:0x0A9F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0A9F + ,simpleLowerCaseMapping:0x0A9F + ,simpleTitleCaseMapping:0x0A9F + }, + { code:0x0AA0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0AA0 + ,simpleLowerCaseMapping:0x0AA0 + ,simpleTitleCaseMapping:0x0AA0 + }, + { code:0x0AA1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0AA1 + ,simpleLowerCaseMapping:0x0AA1 + ,simpleTitleCaseMapping:0x0AA1 + }, + { code:0x0AA2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0AA2 + ,simpleLowerCaseMapping:0x0AA2 + ,simpleTitleCaseMapping:0x0AA2 + }, + { code:0x0AA3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0AA3 + ,simpleLowerCaseMapping:0x0AA3 + ,simpleTitleCaseMapping:0x0AA3 + }, + { code:0x0AA4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0AA4 + ,simpleLowerCaseMapping:0x0AA4 + ,simpleTitleCaseMapping:0x0AA4 + }, + { code:0x0AA5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0AA5 + ,simpleLowerCaseMapping:0x0AA5 + ,simpleTitleCaseMapping:0x0AA5 + }, + { code:0x0AA6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0AA6 + ,simpleLowerCaseMapping:0x0AA6 + ,simpleTitleCaseMapping:0x0AA6 + }, + { code:0x0AA7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0AA7 + ,simpleLowerCaseMapping:0x0AA7 + ,simpleTitleCaseMapping:0x0AA7 + }, + { code:0x0AA8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0AA8 + ,simpleLowerCaseMapping:0x0AA8 + ,simpleTitleCaseMapping:0x0AA8 + }, + { code:0x0AAA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0AAA + ,simpleLowerCaseMapping:0x0AAA + ,simpleTitleCaseMapping:0x0AAA + }, + { code:0x0AAB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0AAB + ,simpleLowerCaseMapping:0x0AAB + ,simpleTitleCaseMapping:0x0AAB + }, + { code:0x0AAC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0AAC + ,simpleLowerCaseMapping:0x0AAC + ,simpleTitleCaseMapping:0x0AAC + }, + { code:0x0AAD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0AAD + ,simpleLowerCaseMapping:0x0AAD + ,simpleTitleCaseMapping:0x0AAD + }, + { code:0x0AAE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0AAE + ,simpleLowerCaseMapping:0x0AAE + ,simpleTitleCaseMapping:0x0AAE + }, + { code:0x0AAF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0AAF + ,simpleLowerCaseMapping:0x0AAF + ,simpleTitleCaseMapping:0x0AAF + }, + { code:0x0AB0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0AB0 + ,simpleLowerCaseMapping:0x0AB0 + ,simpleTitleCaseMapping:0x0AB0 + }, + { code:0x0AB2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0AB2 + ,simpleLowerCaseMapping:0x0AB2 + ,simpleTitleCaseMapping:0x0AB2 + }, + { code:0x0AB3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0AB3 + ,simpleLowerCaseMapping:0x0AB3 + ,simpleTitleCaseMapping:0x0AB3 + }, + { code:0x0AB5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0AB5 + ,simpleLowerCaseMapping:0x0AB5 + ,simpleTitleCaseMapping:0x0AB5 + }, + { code:0x0AB6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0AB6 + ,simpleLowerCaseMapping:0x0AB6 + ,simpleTitleCaseMapping:0x0AB6 + }, + { code:0x0AB7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0AB7 + ,simpleLowerCaseMapping:0x0AB7 + ,simpleTitleCaseMapping:0x0AB7 + }, + { code:0x0AB8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0AB8 + ,simpleLowerCaseMapping:0x0AB8 + ,simpleTitleCaseMapping:0x0AB8 + }, + { code:0x0AB9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0AB9 + ,simpleLowerCaseMapping:0x0AB9 + ,simpleTitleCaseMapping:0x0AB9 + }, + { code:0x0ABC + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0ABC + ,simpleLowerCaseMapping:0x0ABC + ,simpleTitleCaseMapping:0x0ABC + }, + { code:0x0ABD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0ABD + ,simpleLowerCaseMapping:0x0ABD + ,simpleTitleCaseMapping:0x0ABD + }, + { code:0x0ABE + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0ABE + ,simpleLowerCaseMapping:0x0ABE + ,simpleTitleCaseMapping:0x0ABE + }, + { code:0x0ABF + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0ABF + ,simpleLowerCaseMapping:0x0ABF + ,simpleTitleCaseMapping:0x0ABF + }, + { code:0x0AC0 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0AC0 + ,simpleLowerCaseMapping:0x0AC0 + ,simpleTitleCaseMapping:0x0AC0 + }, + { code:0x0AC1 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0AC1 + ,simpleLowerCaseMapping:0x0AC1 + ,simpleTitleCaseMapping:0x0AC1 + }, + { code:0x0AC2 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0AC2 + ,simpleLowerCaseMapping:0x0AC2 + ,simpleTitleCaseMapping:0x0AC2 + }, + { code:0x0AC3 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0AC3 + ,simpleLowerCaseMapping:0x0AC3 + ,simpleTitleCaseMapping:0x0AC3 + }, + { code:0x0AC4 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0AC4 + ,simpleLowerCaseMapping:0x0AC4 + ,simpleTitleCaseMapping:0x0AC4 + }, + { code:0x0AC5 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0AC5 + ,simpleLowerCaseMapping:0x0AC5 + ,simpleTitleCaseMapping:0x0AC5 + }, + { code:0x0AC7 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0AC7 + ,simpleLowerCaseMapping:0x0AC7 + ,simpleTitleCaseMapping:0x0AC7 + }, + { code:0x0AC8 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0AC8 + ,simpleLowerCaseMapping:0x0AC8 + ,simpleTitleCaseMapping:0x0AC8 + }, + { code:0x0AC9 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0AC9 + ,simpleLowerCaseMapping:0x0AC9 + ,simpleTitleCaseMapping:0x0AC9 + }, + { code:0x0ACB + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0ACB + ,simpleLowerCaseMapping:0x0ACB + ,simpleTitleCaseMapping:0x0ACB + }, + { code:0x0ACC + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0ACC + ,simpleLowerCaseMapping:0x0ACC + ,simpleTitleCaseMapping:0x0ACC + }, + { code:0x0ACD + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0ACD + ,simpleLowerCaseMapping:0x0ACD + ,simpleTitleCaseMapping:0x0ACD + }, + { code:0x0AD0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0AD0 + ,simpleLowerCaseMapping:0x0AD0 + ,simpleTitleCaseMapping:0x0AD0 + }, + { code:0x0AE0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0AE0 + ,simpleLowerCaseMapping:0x0AE0 + ,simpleTitleCaseMapping:0x0AE0 + }, + { code:0x0AE1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0AE1 + ,simpleLowerCaseMapping:0x0AE1 + ,simpleTitleCaseMapping:0x0AE1 + }, + { code:0x0AE2 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0AE2 + ,simpleLowerCaseMapping:0x0AE2 + ,simpleTitleCaseMapping:0x0AE2 + }, + { code:0x0AE3 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0AE3 + ,simpleLowerCaseMapping:0x0AE3 + ,simpleTitleCaseMapping:0x0AE3 + }, + { code:0x0AE6 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0AE6 + ,simpleLowerCaseMapping:0x0AE6 + ,simpleTitleCaseMapping:0x0AE6 + }, + { code:0x0AE7 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0AE7 + ,simpleLowerCaseMapping:0x0AE7 + ,simpleTitleCaseMapping:0x0AE7 + }, + { code:0x0AE8 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0AE8 + ,simpleLowerCaseMapping:0x0AE8 + ,simpleTitleCaseMapping:0x0AE8 + }, + { code:0x0AE9 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0AE9 + ,simpleLowerCaseMapping:0x0AE9 + ,simpleTitleCaseMapping:0x0AE9 + }, + { code:0x0AEA + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0AEA + ,simpleLowerCaseMapping:0x0AEA + ,simpleTitleCaseMapping:0x0AEA + }, + { code:0x0AEB + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0AEB + ,simpleLowerCaseMapping:0x0AEB + ,simpleTitleCaseMapping:0x0AEB + }, + { code:0x0AEC + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0AEC + ,simpleLowerCaseMapping:0x0AEC + ,simpleTitleCaseMapping:0x0AEC + }, + { code:0x0AED + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0AED + ,simpleLowerCaseMapping:0x0AED + ,simpleTitleCaseMapping:0x0AED + }, + { code:0x0AEE + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0AEE + ,simpleLowerCaseMapping:0x0AEE + ,simpleTitleCaseMapping:0x0AEE + }, + { code:0x0AEF + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0AEF + ,simpleLowerCaseMapping:0x0AEF + ,simpleTitleCaseMapping:0x0AEF + }, + { code:0x0AF1 + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0x0AF1 + ,simpleLowerCaseMapping:0x0AF1 + ,simpleTitleCaseMapping:0x0AF1 + }, + { code:0x0B01 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0B01 + ,simpleLowerCaseMapping:0x0B01 + ,simpleTitleCaseMapping:0x0B01 + }, + { code:0x0B02 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0B02 + ,simpleLowerCaseMapping:0x0B02 + ,simpleTitleCaseMapping:0x0B02 + }, + { code:0x0B03 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0B03 + ,simpleLowerCaseMapping:0x0B03 + ,simpleTitleCaseMapping:0x0B03 + }, + { code:0x0B05 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B05 + ,simpleLowerCaseMapping:0x0B05 + ,simpleTitleCaseMapping:0x0B05 + }, + { code:0x0B06 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B06 + ,simpleLowerCaseMapping:0x0B06 + ,simpleTitleCaseMapping:0x0B06 + }, + { code:0x0B07 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B07 + ,simpleLowerCaseMapping:0x0B07 + ,simpleTitleCaseMapping:0x0B07 + }, + { code:0x0B08 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B08 + ,simpleLowerCaseMapping:0x0B08 + ,simpleTitleCaseMapping:0x0B08 + }, + { code:0x0B09 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B09 + ,simpleLowerCaseMapping:0x0B09 + ,simpleTitleCaseMapping:0x0B09 + }, + { code:0x0B0A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B0A + ,simpleLowerCaseMapping:0x0B0A + ,simpleTitleCaseMapping:0x0B0A + }, + { code:0x0B0B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B0B + ,simpleLowerCaseMapping:0x0B0B + ,simpleTitleCaseMapping:0x0B0B + }, + { code:0x0B0C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B0C + ,simpleLowerCaseMapping:0x0B0C + ,simpleTitleCaseMapping:0x0B0C + }, + { code:0x0B0F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B0F + ,simpleLowerCaseMapping:0x0B0F + ,simpleTitleCaseMapping:0x0B0F + }, + { code:0x0B10 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B10 + ,simpleLowerCaseMapping:0x0B10 + ,simpleTitleCaseMapping:0x0B10 + }, + { code:0x0B13 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B13 + ,simpleLowerCaseMapping:0x0B13 + ,simpleTitleCaseMapping:0x0B13 + }, + { code:0x0B14 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B14 + ,simpleLowerCaseMapping:0x0B14 + ,simpleTitleCaseMapping:0x0B14 + }, + { code:0x0B15 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B15 + ,simpleLowerCaseMapping:0x0B15 + ,simpleTitleCaseMapping:0x0B15 + }, + { code:0x0B16 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B16 + ,simpleLowerCaseMapping:0x0B16 + ,simpleTitleCaseMapping:0x0B16 + }, + { code:0x0B17 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B17 + ,simpleLowerCaseMapping:0x0B17 + ,simpleTitleCaseMapping:0x0B17 + }, + { code:0x0B18 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B18 + ,simpleLowerCaseMapping:0x0B18 + ,simpleTitleCaseMapping:0x0B18 + }, + { code:0x0B19 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B19 + ,simpleLowerCaseMapping:0x0B19 + ,simpleTitleCaseMapping:0x0B19 + }, + { code:0x0B1A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B1A + ,simpleLowerCaseMapping:0x0B1A + ,simpleTitleCaseMapping:0x0B1A + }, + { code:0x0B1B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B1B + ,simpleLowerCaseMapping:0x0B1B + ,simpleTitleCaseMapping:0x0B1B + }, + { code:0x0B1C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B1C + ,simpleLowerCaseMapping:0x0B1C + ,simpleTitleCaseMapping:0x0B1C + }, + { code:0x0B1D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B1D + ,simpleLowerCaseMapping:0x0B1D + ,simpleTitleCaseMapping:0x0B1D + }, + { code:0x0B1E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B1E + ,simpleLowerCaseMapping:0x0B1E + ,simpleTitleCaseMapping:0x0B1E + }, + { code:0x0B1F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B1F + ,simpleLowerCaseMapping:0x0B1F + ,simpleTitleCaseMapping:0x0B1F + }, + { code:0x0B20 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B20 + ,simpleLowerCaseMapping:0x0B20 + ,simpleTitleCaseMapping:0x0B20 + }, + { code:0x0B21 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B21 + ,simpleLowerCaseMapping:0x0B21 + ,simpleTitleCaseMapping:0x0B21 + }, + { code:0x0B22 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B22 + ,simpleLowerCaseMapping:0x0B22 + ,simpleTitleCaseMapping:0x0B22 + }, + { code:0x0B23 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B23 + ,simpleLowerCaseMapping:0x0B23 + ,simpleTitleCaseMapping:0x0B23 + }, + { code:0x0B24 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B24 + ,simpleLowerCaseMapping:0x0B24 + ,simpleTitleCaseMapping:0x0B24 + }, + { code:0x0B25 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B25 + ,simpleLowerCaseMapping:0x0B25 + ,simpleTitleCaseMapping:0x0B25 + }, + { code:0x0B26 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B26 + ,simpleLowerCaseMapping:0x0B26 + ,simpleTitleCaseMapping:0x0B26 + }, + { code:0x0B27 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B27 + ,simpleLowerCaseMapping:0x0B27 + ,simpleTitleCaseMapping:0x0B27 + }, + { code:0x0B28 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B28 + ,simpleLowerCaseMapping:0x0B28 + ,simpleTitleCaseMapping:0x0B28 + }, + { code:0x0B2A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B2A + ,simpleLowerCaseMapping:0x0B2A + ,simpleTitleCaseMapping:0x0B2A + }, + { code:0x0B2B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B2B + ,simpleLowerCaseMapping:0x0B2B + ,simpleTitleCaseMapping:0x0B2B + }, + { code:0x0B2C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B2C + ,simpleLowerCaseMapping:0x0B2C + ,simpleTitleCaseMapping:0x0B2C + }, + { code:0x0B2D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B2D + ,simpleLowerCaseMapping:0x0B2D + ,simpleTitleCaseMapping:0x0B2D + }, + { code:0x0B2E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B2E + ,simpleLowerCaseMapping:0x0B2E + ,simpleTitleCaseMapping:0x0B2E + }, + { code:0x0B2F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B2F + ,simpleLowerCaseMapping:0x0B2F + ,simpleTitleCaseMapping:0x0B2F + }, + { code:0x0B30 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B30 + ,simpleLowerCaseMapping:0x0B30 + ,simpleTitleCaseMapping:0x0B30 + }, + { code:0x0B32 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B32 + ,simpleLowerCaseMapping:0x0B32 + ,simpleTitleCaseMapping:0x0B32 + }, + { code:0x0B33 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B33 + ,simpleLowerCaseMapping:0x0B33 + ,simpleTitleCaseMapping:0x0B33 + }, + { code:0x0B35 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B35 + ,simpleLowerCaseMapping:0x0B35 + ,simpleTitleCaseMapping:0x0B35 + }, + { code:0x0B36 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B36 + ,simpleLowerCaseMapping:0x0B36 + ,simpleTitleCaseMapping:0x0B36 + }, + { code:0x0B37 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B37 + ,simpleLowerCaseMapping:0x0B37 + ,simpleTitleCaseMapping:0x0B37 + }, + { code:0x0B38 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B38 + ,simpleLowerCaseMapping:0x0B38 + ,simpleTitleCaseMapping:0x0B38 + }, + { code:0x0B39 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B39 + ,simpleLowerCaseMapping:0x0B39 + ,simpleTitleCaseMapping:0x0B39 + }, + { code:0x0B3C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0B3C + ,simpleLowerCaseMapping:0x0B3C + ,simpleTitleCaseMapping:0x0B3C + }, + { code:0x0B3D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B3D + ,simpleLowerCaseMapping:0x0B3D + ,simpleTitleCaseMapping:0x0B3D + }, + { code:0x0B3E + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0B3E + ,simpleLowerCaseMapping:0x0B3E + ,simpleTitleCaseMapping:0x0B3E + }, + { code:0x0B3F + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0B3F + ,simpleLowerCaseMapping:0x0B3F + ,simpleTitleCaseMapping:0x0B3F + }, + { code:0x0B40 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0B40 + ,simpleLowerCaseMapping:0x0B40 + ,simpleTitleCaseMapping:0x0B40 + }, + { code:0x0B41 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0B41 + ,simpleLowerCaseMapping:0x0B41 + ,simpleTitleCaseMapping:0x0B41 + }, + { code:0x0B42 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0B42 + ,simpleLowerCaseMapping:0x0B42 + ,simpleTitleCaseMapping:0x0B42 + }, + { code:0x0B43 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0B43 + ,simpleLowerCaseMapping:0x0B43 + ,simpleTitleCaseMapping:0x0B43 + }, + { code:0x0B47 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0B47 + ,simpleLowerCaseMapping:0x0B47 + ,simpleTitleCaseMapping:0x0B47 + }, + { code:0x0B48 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0B48 + ,simpleLowerCaseMapping:0x0B48 + ,simpleTitleCaseMapping:0x0B48 + }, + { code:0x0B4B + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0B4B + ,simpleLowerCaseMapping:0x0B4B + ,simpleTitleCaseMapping:0x0B4B + }, + { code:0x0B4C + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0B4C + ,simpleLowerCaseMapping:0x0B4C + ,simpleTitleCaseMapping:0x0B4C + }, + { code:0x0B4D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0B4D + ,simpleLowerCaseMapping:0x0B4D + ,simpleTitleCaseMapping:0x0B4D + }, + { code:0x0B56 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0B56 + ,simpleLowerCaseMapping:0x0B56 + ,simpleTitleCaseMapping:0x0B56 + }, + { code:0x0B57 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0B57 + ,simpleLowerCaseMapping:0x0B57 + ,simpleTitleCaseMapping:0x0B57 + }, + { code:0x0B5C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B5C + ,simpleLowerCaseMapping:0x0B5C + ,simpleTitleCaseMapping:0x0B5C + }, + { code:0x0B5D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B5D + ,simpleLowerCaseMapping:0x0B5D + ,simpleTitleCaseMapping:0x0B5D + }, + { code:0x0B5F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B5F + ,simpleLowerCaseMapping:0x0B5F + ,simpleTitleCaseMapping:0x0B5F + }, + { code:0x0B60 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B60 + ,simpleLowerCaseMapping:0x0B60 + ,simpleTitleCaseMapping:0x0B60 + }, + { code:0x0B61 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B61 + ,simpleLowerCaseMapping:0x0B61 + ,simpleTitleCaseMapping:0x0B61 + }, + { code:0x0B66 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0B66 + ,simpleLowerCaseMapping:0x0B66 + ,simpleTitleCaseMapping:0x0B66 + }, + { code:0x0B67 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0B67 + ,simpleLowerCaseMapping:0x0B67 + ,simpleTitleCaseMapping:0x0B67 + }, + { code:0x0B68 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0B68 + ,simpleLowerCaseMapping:0x0B68 + ,simpleTitleCaseMapping:0x0B68 + }, + { code:0x0B69 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0B69 + ,simpleLowerCaseMapping:0x0B69 + ,simpleTitleCaseMapping:0x0B69 + }, + { code:0x0B6A + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0B6A + ,simpleLowerCaseMapping:0x0B6A + ,simpleTitleCaseMapping:0x0B6A + }, + { code:0x0B6B + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0B6B + ,simpleLowerCaseMapping:0x0B6B + ,simpleTitleCaseMapping:0x0B6B + }, + { code:0x0B6C + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0B6C + ,simpleLowerCaseMapping:0x0B6C + ,simpleTitleCaseMapping:0x0B6C + }, + { code:0x0B6D + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0B6D + ,simpleLowerCaseMapping:0x0B6D + ,simpleTitleCaseMapping:0x0B6D + }, + { code:0x0B6E + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0B6E + ,simpleLowerCaseMapping:0x0B6E + ,simpleTitleCaseMapping:0x0B6E + }, + { code:0x0B6F + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0B6F + ,simpleLowerCaseMapping:0x0B6F + ,simpleTitleCaseMapping:0x0B6F + }, + { code:0x0B70 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0B70 + ,simpleLowerCaseMapping:0x0B70 + ,simpleTitleCaseMapping:0x0B70 + }, + { code:0x0B71 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B71 + ,simpleLowerCaseMapping:0x0B71 + ,simpleTitleCaseMapping:0x0B71 + }, + { code:0x0B82 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0B82 + ,simpleLowerCaseMapping:0x0B82 + ,simpleTitleCaseMapping:0x0B82 + }, + { code:0x0B83 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B83 + ,simpleLowerCaseMapping:0x0B83 + ,simpleTitleCaseMapping:0x0B83 + }, + { code:0x0B85 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B85 + ,simpleLowerCaseMapping:0x0B85 + ,simpleTitleCaseMapping:0x0B85 + }, + { code:0x0B86 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B86 + ,simpleLowerCaseMapping:0x0B86 + ,simpleTitleCaseMapping:0x0B86 + }, + { code:0x0B87 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B87 + ,simpleLowerCaseMapping:0x0B87 + ,simpleTitleCaseMapping:0x0B87 + }, + { code:0x0B88 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B88 + ,simpleLowerCaseMapping:0x0B88 + ,simpleTitleCaseMapping:0x0B88 + }, + { code:0x0B89 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B89 + ,simpleLowerCaseMapping:0x0B89 + ,simpleTitleCaseMapping:0x0B89 + }, + { code:0x0B8A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B8A + ,simpleLowerCaseMapping:0x0B8A + ,simpleTitleCaseMapping:0x0B8A + }, + { code:0x0B8E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B8E + ,simpleLowerCaseMapping:0x0B8E + ,simpleTitleCaseMapping:0x0B8E + }, + { code:0x0B8F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B8F + ,simpleLowerCaseMapping:0x0B8F + ,simpleTitleCaseMapping:0x0B8F + }, + { code:0x0B90 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B90 + ,simpleLowerCaseMapping:0x0B90 + ,simpleTitleCaseMapping:0x0B90 + }, + { code:0x0B92 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B92 + ,simpleLowerCaseMapping:0x0B92 + ,simpleTitleCaseMapping:0x0B92 + }, + { code:0x0B93 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B93 + ,simpleLowerCaseMapping:0x0B93 + ,simpleTitleCaseMapping:0x0B93 + }, + { code:0x0B94 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B94 + ,simpleLowerCaseMapping:0x0B94 + ,simpleTitleCaseMapping:0x0B94 + }, + { code:0x0B95 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B95 + ,simpleLowerCaseMapping:0x0B95 + ,simpleTitleCaseMapping:0x0B95 + }, + { code:0x0B99 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B99 + ,simpleLowerCaseMapping:0x0B99 + ,simpleTitleCaseMapping:0x0B99 + }, + { code:0x0B9A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B9A + ,simpleLowerCaseMapping:0x0B9A + ,simpleTitleCaseMapping:0x0B9A + }, + { code:0x0B9C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B9C + ,simpleLowerCaseMapping:0x0B9C + ,simpleTitleCaseMapping:0x0B9C + }, + { code:0x0B9E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B9E + ,simpleLowerCaseMapping:0x0B9E + ,simpleTitleCaseMapping:0x0B9E + }, + { code:0x0B9F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0B9F + ,simpleLowerCaseMapping:0x0B9F + ,simpleTitleCaseMapping:0x0B9F + }, + { code:0x0BA3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0BA3 + ,simpleLowerCaseMapping:0x0BA3 + ,simpleTitleCaseMapping:0x0BA3 + }, + { code:0x0BA4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0BA4 + ,simpleLowerCaseMapping:0x0BA4 + ,simpleTitleCaseMapping:0x0BA4 + }, + { code:0x0BA8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0BA8 + ,simpleLowerCaseMapping:0x0BA8 + ,simpleTitleCaseMapping:0x0BA8 + }, + { code:0x0BA9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0BA9 + ,simpleLowerCaseMapping:0x0BA9 + ,simpleTitleCaseMapping:0x0BA9 + }, + { code:0x0BAA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0BAA + ,simpleLowerCaseMapping:0x0BAA + ,simpleTitleCaseMapping:0x0BAA + }, + { code:0x0BAE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0BAE + ,simpleLowerCaseMapping:0x0BAE + ,simpleTitleCaseMapping:0x0BAE + }, + { code:0x0BAF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0BAF + ,simpleLowerCaseMapping:0x0BAF + ,simpleTitleCaseMapping:0x0BAF + }, + { code:0x0BB0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0BB0 + ,simpleLowerCaseMapping:0x0BB0 + ,simpleTitleCaseMapping:0x0BB0 + }, + { code:0x0BB1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0BB1 + ,simpleLowerCaseMapping:0x0BB1 + ,simpleTitleCaseMapping:0x0BB1 + }, + { code:0x0BB2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0BB2 + ,simpleLowerCaseMapping:0x0BB2 + ,simpleTitleCaseMapping:0x0BB2 + }, + { code:0x0BB3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0BB3 + ,simpleLowerCaseMapping:0x0BB3 + ,simpleTitleCaseMapping:0x0BB3 + }, + { code:0x0BB4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0BB4 + ,simpleLowerCaseMapping:0x0BB4 + ,simpleTitleCaseMapping:0x0BB4 + }, + { code:0x0BB5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0BB5 + ,simpleLowerCaseMapping:0x0BB5 + ,simpleTitleCaseMapping:0x0BB5 + }, + { code:0x0BB6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0BB6 + ,simpleLowerCaseMapping:0x0BB6 + ,simpleTitleCaseMapping:0x0BB6 + }, + { code:0x0BB7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0BB7 + ,simpleLowerCaseMapping:0x0BB7 + ,simpleTitleCaseMapping:0x0BB7 + }, + { code:0x0BB8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0BB8 + ,simpleLowerCaseMapping:0x0BB8 + ,simpleTitleCaseMapping:0x0BB8 + }, + { code:0x0BB9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0BB9 + ,simpleLowerCaseMapping:0x0BB9 + ,simpleTitleCaseMapping:0x0BB9 + }, + { code:0x0BBE + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0BBE + ,simpleLowerCaseMapping:0x0BBE + ,simpleTitleCaseMapping:0x0BBE + }, + { code:0x0BBF + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0BBF + ,simpleLowerCaseMapping:0x0BBF + ,simpleTitleCaseMapping:0x0BBF + }, + { code:0x0BC0 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0BC0 + ,simpleLowerCaseMapping:0x0BC0 + ,simpleTitleCaseMapping:0x0BC0 + }, + { code:0x0BC1 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0BC1 + ,simpleLowerCaseMapping:0x0BC1 + ,simpleTitleCaseMapping:0x0BC1 + }, + { code:0x0BC2 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0BC2 + ,simpleLowerCaseMapping:0x0BC2 + ,simpleTitleCaseMapping:0x0BC2 + }, + { code:0x0BC6 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0BC6 + ,simpleLowerCaseMapping:0x0BC6 + ,simpleTitleCaseMapping:0x0BC6 + }, + { code:0x0BC7 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0BC7 + ,simpleLowerCaseMapping:0x0BC7 + ,simpleTitleCaseMapping:0x0BC7 + }, + { code:0x0BC8 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0BC8 + ,simpleLowerCaseMapping:0x0BC8 + ,simpleTitleCaseMapping:0x0BC8 + }, + { code:0x0BCA + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0BCA + ,simpleLowerCaseMapping:0x0BCA + ,simpleTitleCaseMapping:0x0BCA + }, + { code:0x0BCB + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0BCB + ,simpleLowerCaseMapping:0x0BCB + ,simpleTitleCaseMapping:0x0BCB + }, + { code:0x0BCC + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0BCC + ,simpleLowerCaseMapping:0x0BCC + ,simpleTitleCaseMapping:0x0BCC + }, + { code:0x0BCD + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0BCD + ,simpleLowerCaseMapping:0x0BCD + ,simpleTitleCaseMapping:0x0BCD + }, + { code:0x0BD7 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0BD7 + ,simpleLowerCaseMapping:0x0BD7 + ,simpleTitleCaseMapping:0x0BD7 + }, + { code:0x0BE6 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0BE6 + ,simpleLowerCaseMapping:0x0BE6 + ,simpleTitleCaseMapping:0x0BE6 + }, + { code:0x0BE7 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0BE7 + ,simpleLowerCaseMapping:0x0BE7 + ,simpleTitleCaseMapping:0x0BE7 + }, + { code:0x0BE8 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0BE8 + ,simpleLowerCaseMapping:0x0BE8 + ,simpleTitleCaseMapping:0x0BE8 + }, + { code:0x0BE9 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0BE9 + ,simpleLowerCaseMapping:0x0BE9 + ,simpleTitleCaseMapping:0x0BE9 + }, + { code:0x0BEA + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0BEA + ,simpleLowerCaseMapping:0x0BEA + ,simpleTitleCaseMapping:0x0BEA + }, + { code:0x0BEB + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0BEB + ,simpleLowerCaseMapping:0x0BEB + ,simpleTitleCaseMapping:0x0BEB + }, + { code:0x0BEC + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0BEC + ,simpleLowerCaseMapping:0x0BEC + ,simpleTitleCaseMapping:0x0BEC + }, + { code:0x0BED + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0BED + ,simpleLowerCaseMapping:0x0BED + ,simpleTitleCaseMapping:0x0BED + }, + { code:0x0BEE + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0BEE + ,simpleLowerCaseMapping:0x0BEE + ,simpleTitleCaseMapping:0x0BEE + }, + { code:0x0BEF + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0BEF + ,simpleLowerCaseMapping:0x0BEF + ,simpleTitleCaseMapping:0x0BEF + }, + { code:0x0BF0 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x0BF0 + ,simpleLowerCaseMapping:0x0BF0 + ,simpleTitleCaseMapping:0x0BF0 + }, + { code:0x0BF1 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x0BF1 + ,simpleLowerCaseMapping:0x0BF1 + ,simpleTitleCaseMapping:0x0BF1 + }, + { code:0x0BF2 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x0BF2 + ,simpleLowerCaseMapping:0x0BF2 + ,simpleTitleCaseMapping:0x0BF2 + }, + { code:0x0BF3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0BF3 + ,simpleLowerCaseMapping:0x0BF3 + ,simpleTitleCaseMapping:0x0BF3 + }, + { code:0x0BF4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0BF4 + ,simpleLowerCaseMapping:0x0BF4 + ,simpleTitleCaseMapping:0x0BF4 + }, + { code:0x0BF5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0BF5 + ,simpleLowerCaseMapping:0x0BF5 + ,simpleTitleCaseMapping:0x0BF5 + }, + { code:0x0BF6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0BF6 + ,simpleLowerCaseMapping:0x0BF6 + ,simpleTitleCaseMapping:0x0BF6 + }, + { code:0x0BF7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0BF7 + ,simpleLowerCaseMapping:0x0BF7 + ,simpleTitleCaseMapping:0x0BF7 + }, + { code:0x0BF8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0BF8 + ,simpleLowerCaseMapping:0x0BF8 + ,simpleTitleCaseMapping:0x0BF8 + }, + { code:0x0BF9 + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0x0BF9 + ,simpleLowerCaseMapping:0x0BF9 + ,simpleTitleCaseMapping:0x0BF9 + }, + { code:0x0BFA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0BFA + ,simpleLowerCaseMapping:0x0BFA + ,simpleTitleCaseMapping:0x0BFA + }, + { code:0x0C01 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0C01 + ,simpleLowerCaseMapping:0x0C01 + ,simpleTitleCaseMapping:0x0C01 + }, + { code:0x0C02 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0C02 + ,simpleLowerCaseMapping:0x0C02 + ,simpleTitleCaseMapping:0x0C02 + }, + { code:0x0C03 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0C03 + ,simpleLowerCaseMapping:0x0C03 + ,simpleTitleCaseMapping:0x0C03 + }, + { code:0x0C05 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C05 + ,simpleLowerCaseMapping:0x0C05 + ,simpleTitleCaseMapping:0x0C05 + }, + { code:0x0C06 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C06 + ,simpleLowerCaseMapping:0x0C06 + ,simpleTitleCaseMapping:0x0C06 + }, + { code:0x0C07 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C07 + ,simpleLowerCaseMapping:0x0C07 + ,simpleTitleCaseMapping:0x0C07 + }, + { code:0x0C08 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C08 + ,simpleLowerCaseMapping:0x0C08 + ,simpleTitleCaseMapping:0x0C08 + }, + { code:0x0C09 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C09 + ,simpleLowerCaseMapping:0x0C09 + ,simpleTitleCaseMapping:0x0C09 + }, + { code:0x0C0A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C0A + ,simpleLowerCaseMapping:0x0C0A + ,simpleTitleCaseMapping:0x0C0A + }, + { code:0x0C0B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C0B + ,simpleLowerCaseMapping:0x0C0B + ,simpleTitleCaseMapping:0x0C0B + }, + { code:0x0C0C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C0C + ,simpleLowerCaseMapping:0x0C0C + ,simpleTitleCaseMapping:0x0C0C + }, + { code:0x0C0E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C0E + ,simpleLowerCaseMapping:0x0C0E + ,simpleTitleCaseMapping:0x0C0E + }, + { code:0x0C0F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C0F + ,simpleLowerCaseMapping:0x0C0F + ,simpleTitleCaseMapping:0x0C0F + }, + { code:0x0C10 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C10 + ,simpleLowerCaseMapping:0x0C10 + ,simpleTitleCaseMapping:0x0C10 + }, + { code:0x0C12 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C12 + ,simpleLowerCaseMapping:0x0C12 + ,simpleTitleCaseMapping:0x0C12 + }, + { code:0x0C13 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C13 + ,simpleLowerCaseMapping:0x0C13 + ,simpleTitleCaseMapping:0x0C13 + }, + { code:0x0C14 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C14 + ,simpleLowerCaseMapping:0x0C14 + ,simpleTitleCaseMapping:0x0C14 + }, + { code:0x0C15 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C15 + ,simpleLowerCaseMapping:0x0C15 + ,simpleTitleCaseMapping:0x0C15 + }, + { code:0x0C16 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C16 + ,simpleLowerCaseMapping:0x0C16 + ,simpleTitleCaseMapping:0x0C16 + }, + { code:0x0C17 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C17 + ,simpleLowerCaseMapping:0x0C17 + ,simpleTitleCaseMapping:0x0C17 + }, + { code:0x0C18 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C18 + ,simpleLowerCaseMapping:0x0C18 + ,simpleTitleCaseMapping:0x0C18 + }, + { code:0x0C19 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C19 + ,simpleLowerCaseMapping:0x0C19 + ,simpleTitleCaseMapping:0x0C19 + }, + { code:0x0C1A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C1A + ,simpleLowerCaseMapping:0x0C1A + ,simpleTitleCaseMapping:0x0C1A + }, + { code:0x0C1B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C1B + ,simpleLowerCaseMapping:0x0C1B + ,simpleTitleCaseMapping:0x0C1B + }, + { code:0x0C1C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C1C + ,simpleLowerCaseMapping:0x0C1C + ,simpleTitleCaseMapping:0x0C1C + }, + { code:0x0C1D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C1D + ,simpleLowerCaseMapping:0x0C1D + ,simpleTitleCaseMapping:0x0C1D + }, + { code:0x0C1E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C1E + ,simpleLowerCaseMapping:0x0C1E + ,simpleTitleCaseMapping:0x0C1E + }, + { code:0x0C1F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C1F + ,simpleLowerCaseMapping:0x0C1F + ,simpleTitleCaseMapping:0x0C1F + }, + { code:0x0C20 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C20 + ,simpleLowerCaseMapping:0x0C20 + ,simpleTitleCaseMapping:0x0C20 + }, + { code:0x0C21 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C21 + ,simpleLowerCaseMapping:0x0C21 + ,simpleTitleCaseMapping:0x0C21 + }, + { code:0x0C22 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C22 + ,simpleLowerCaseMapping:0x0C22 + ,simpleTitleCaseMapping:0x0C22 + }, + { code:0x0C23 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C23 + ,simpleLowerCaseMapping:0x0C23 + ,simpleTitleCaseMapping:0x0C23 + }, + { code:0x0C24 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C24 + ,simpleLowerCaseMapping:0x0C24 + ,simpleTitleCaseMapping:0x0C24 + }, + { code:0x0C25 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C25 + ,simpleLowerCaseMapping:0x0C25 + ,simpleTitleCaseMapping:0x0C25 + }, + { code:0x0C26 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C26 + ,simpleLowerCaseMapping:0x0C26 + ,simpleTitleCaseMapping:0x0C26 + }, + { code:0x0C27 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C27 + ,simpleLowerCaseMapping:0x0C27 + ,simpleTitleCaseMapping:0x0C27 + }, + { code:0x0C28 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C28 + ,simpleLowerCaseMapping:0x0C28 + ,simpleTitleCaseMapping:0x0C28 + }, + { code:0x0C2A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C2A + ,simpleLowerCaseMapping:0x0C2A + ,simpleTitleCaseMapping:0x0C2A + }, + { code:0x0C2B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C2B + ,simpleLowerCaseMapping:0x0C2B + ,simpleTitleCaseMapping:0x0C2B + }, + { code:0x0C2C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C2C + ,simpleLowerCaseMapping:0x0C2C + ,simpleTitleCaseMapping:0x0C2C + }, + { code:0x0C2D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C2D + ,simpleLowerCaseMapping:0x0C2D + ,simpleTitleCaseMapping:0x0C2D + }, + { code:0x0C2E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C2E + ,simpleLowerCaseMapping:0x0C2E + ,simpleTitleCaseMapping:0x0C2E + }, + { code:0x0C2F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C2F + ,simpleLowerCaseMapping:0x0C2F + ,simpleTitleCaseMapping:0x0C2F + }, + { code:0x0C30 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C30 + ,simpleLowerCaseMapping:0x0C30 + ,simpleTitleCaseMapping:0x0C30 + }, + { code:0x0C31 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C31 + ,simpleLowerCaseMapping:0x0C31 + ,simpleTitleCaseMapping:0x0C31 + }, + { code:0x0C32 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C32 + ,simpleLowerCaseMapping:0x0C32 + ,simpleTitleCaseMapping:0x0C32 + }, + { code:0x0C33 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C33 + ,simpleLowerCaseMapping:0x0C33 + ,simpleTitleCaseMapping:0x0C33 + }, + { code:0x0C35 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C35 + ,simpleLowerCaseMapping:0x0C35 + ,simpleTitleCaseMapping:0x0C35 + }, + { code:0x0C36 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C36 + ,simpleLowerCaseMapping:0x0C36 + ,simpleTitleCaseMapping:0x0C36 + }, + { code:0x0C37 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C37 + ,simpleLowerCaseMapping:0x0C37 + ,simpleTitleCaseMapping:0x0C37 + }, + { code:0x0C38 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C38 + ,simpleLowerCaseMapping:0x0C38 + ,simpleTitleCaseMapping:0x0C38 + }, + { code:0x0C39 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C39 + ,simpleLowerCaseMapping:0x0C39 + ,simpleTitleCaseMapping:0x0C39 + }, + { code:0x0C3E + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0C3E + ,simpleLowerCaseMapping:0x0C3E + ,simpleTitleCaseMapping:0x0C3E + }, + { code:0x0C3F + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0C3F + ,simpleLowerCaseMapping:0x0C3F + ,simpleTitleCaseMapping:0x0C3F + }, + { code:0x0C40 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0C40 + ,simpleLowerCaseMapping:0x0C40 + ,simpleTitleCaseMapping:0x0C40 + }, + { code:0x0C41 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0C41 + ,simpleLowerCaseMapping:0x0C41 + ,simpleTitleCaseMapping:0x0C41 + }, + { code:0x0C42 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0C42 + ,simpleLowerCaseMapping:0x0C42 + ,simpleTitleCaseMapping:0x0C42 + }, + { code:0x0C43 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0C43 + ,simpleLowerCaseMapping:0x0C43 + ,simpleTitleCaseMapping:0x0C43 + }, + { code:0x0C44 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0C44 + ,simpleLowerCaseMapping:0x0C44 + ,simpleTitleCaseMapping:0x0C44 + }, + { code:0x0C46 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0C46 + ,simpleLowerCaseMapping:0x0C46 + ,simpleTitleCaseMapping:0x0C46 + }, + { code:0x0C47 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0C47 + ,simpleLowerCaseMapping:0x0C47 + ,simpleTitleCaseMapping:0x0C47 + }, + { code:0x0C48 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0C48 + ,simpleLowerCaseMapping:0x0C48 + ,simpleTitleCaseMapping:0x0C48 + }, + { code:0x0C4A + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0C4A + ,simpleLowerCaseMapping:0x0C4A + ,simpleTitleCaseMapping:0x0C4A + }, + { code:0x0C4B + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0C4B + ,simpleLowerCaseMapping:0x0C4B + ,simpleTitleCaseMapping:0x0C4B + }, + { code:0x0C4C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0C4C + ,simpleLowerCaseMapping:0x0C4C + ,simpleTitleCaseMapping:0x0C4C + }, + { code:0x0C4D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0C4D + ,simpleLowerCaseMapping:0x0C4D + ,simpleTitleCaseMapping:0x0C4D + }, + { code:0x0C55 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0C55 + ,simpleLowerCaseMapping:0x0C55 + ,simpleTitleCaseMapping:0x0C55 + }, + { code:0x0C56 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0C56 + ,simpleLowerCaseMapping:0x0C56 + ,simpleTitleCaseMapping:0x0C56 + }, + { code:0x0C60 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C60 + ,simpleLowerCaseMapping:0x0C60 + ,simpleTitleCaseMapping:0x0C60 + }, + { code:0x0C61 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C61 + ,simpleLowerCaseMapping:0x0C61 + ,simpleTitleCaseMapping:0x0C61 + }, + { code:0x0C66 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0C66 + ,simpleLowerCaseMapping:0x0C66 + ,simpleTitleCaseMapping:0x0C66 + }, + { code:0x0C67 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0C67 + ,simpleLowerCaseMapping:0x0C67 + ,simpleTitleCaseMapping:0x0C67 + }, + { code:0x0C68 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0C68 + ,simpleLowerCaseMapping:0x0C68 + ,simpleTitleCaseMapping:0x0C68 + }, + { code:0x0C69 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0C69 + ,simpleLowerCaseMapping:0x0C69 + ,simpleTitleCaseMapping:0x0C69 + }, + { code:0x0C6A + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0C6A + ,simpleLowerCaseMapping:0x0C6A + ,simpleTitleCaseMapping:0x0C6A + }, + { code:0x0C6B + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0C6B + ,simpleLowerCaseMapping:0x0C6B + ,simpleTitleCaseMapping:0x0C6B + }, + { code:0x0C6C + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0C6C + ,simpleLowerCaseMapping:0x0C6C + ,simpleTitleCaseMapping:0x0C6C + }, + { code:0x0C6D + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0C6D + ,simpleLowerCaseMapping:0x0C6D + ,simpleTitleCaseMapping:0x0C6D + }, + { code:0x0C6E + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0C6E + ,simpleLowerCaseMapping:0x0C6E + ,simpleTitleCaseMapping:0x0C6E + }, + { code:0x0C6F + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0C6F + ,simpleLowerCaseMapping:0x0C6F + ,simpleTitleCaseMapping:0x0C6F + }, + { code:0x0C82 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0C82 + ,simpleLowerCaseMapping:0x0C82 + ,simpleTitleCaseMapping:0x0C82 + }, + { code:0x0C83 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0C83 + ,simpleLowerCaseMapping:0x0C83 + ,simpleTitleCaseMapping:0x0C83 + }, + { code:0x0C85 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C85 + ,simpleLowerCaseMapping:0x0C85 + ,simpleTitleCaseMapping:0x0C85 + }, + { code:0x0C86 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C86 + ,simpleLowerCaseMapping:0x0C86 + ,simpleTitleCaseMapping:0x0C86 + }, + { code:0x0C87 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C87 + ,simpleLowerCaseMapping:0x0C87 + ,simpleTitleCaseMapping:0x0C87 + }, + { code:0x0C88 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C88 + ,simpleLowerCaseMapping:0x0C88 + ,simpleTitleCaseMapping:0x0C88 + }, + { code:0x0C89 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C89 + ,simpleLowerCaseMapping:0x0C89 + ,simpleTitleCaseMapping:0x0C89 + }, + { code:0x0C8A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C8A + ,simpleLowerCaseMapping:0x0C8A + ,simpleTitleCaseMapping:0x0C8A + }, + { code:0x0C8B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C8B + ,simpleLowerCaseMapping:0x0C8B + ,simpleTitleCaseMapping:0x0C8B + }, + { code:0x0C8C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C8C + ,simpleLowerCaseMapping:0x0C8C + ,simpleTitleCaseMapping:0x0C8C + }, + { code:0x0C8E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C8E + ,simpleLowerCaseMapping:0x0C8E + ,simpleTitleCaseMapping:0x0C8E + }, + { code:0x0C8F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C8F + ,simpleLowerCaseMapping:0x0C8F + ,simpleTitleCaseMapping:0x0C8F + }, + { code:0x0C90 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C90 + ,simpleLowerCaseMapping:0x0C90 + ,simpleTitleCaseMapping:0x0C90 + }, + { code:0x0C92 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C92 + ,simpleLowerCaseMapping:0x0C92 + ,simpleTitleCaseMapping:0x0C92 + }, + { code:0x0C93 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C93 + ,simpleLowerCaseMapping:0x0C93 + ,simpleTitleCaseMapping:0x0C93 + }, + { code:0x0C94 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C94 + ,simpleLowerCaseMapping:0x0C94 + ,simpleTitleCaseMapping:0x0C94 + }, + { code:0x0C95 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C95 + ,simpleLowerCaseMapping:0x0C95 + ,simpleTitleCaseMapping:0x0C95 + }, + { code:0x0C96 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C96 + ,simpleLowerCaseMapping:0x0C96 + ,simpleTitleCaseMapping:0x0C96 + }, + { code:0x0C97 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C97 + ,simpleLowerCaseMapping:0x0C97 + ,simpleTitleCaseMapping:0x0C97 + }, + { code:0x0C98 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C98 + ,simpleLowerCaseMapping:0x0C98 + ,simpleTitleCaseMapping:0x0C98 + }, + { code:0x0C99 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C99 + ,simpleLowerCaseMapping:0x0C99 + ,simpleTitleCaseMapping:0x0C99 + }, + { code:0x0C9A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C9A + ,simpleLowerCaseMapping:0x0C9A + ,simpleTitleCaseMapping:0x0C9A + }, + { code:0x0C9B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C9B + ,simpleLowerCaseMapping:0x0C9B + ,simpleTitleCaseMapping:0x0C9B + }, + { code:0x0C9C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C9C + ,simpleLowerCaseMapping:0x0C9C + ,simpleTitleCaseMapping:0x0C9C + }, + { code:0x0C9D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C9D + ,simpleLowerCaseMapping:0x0C9D + ,simpleTitleCaseMapping:0x0C9D + }, + { code:0x0C9E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C9E + ,simpleLowerCaseMapping:0x0C9E + ,simpleTitleCaseMapping:0x0C9E + }, + { code:0x0C9F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0C9F + ,simpleLowerCaseMapping:0x0C9F + ,simpleTitleCaseMapping:0x0C9F + }, + { code:0x0CA0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0CA0 + ,simpleLowerCaseMapping:0x0CA0 + ,simpleTitleCaseMapping:0x0CA0 + }, + { code:0x0CA1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0CA1 + ,simpleLowerCaseMapping:0x0CA1 + ,simpleTitleCaseMapping:0x0CA1 + }, + { code:0x0CA2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0CA2 + ,simpleLowerCaseMapping:0x0CA2 + ,simpleTitleCaseMapping:0x0CA2 + }, + { code:0x0CA3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0CA3 + ,simpleLowerCaseMapping:0x0CA3 + ,simpleTitleCaseMapping:0x0CA3 + }, + { code:0x0CA4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0CA4 + ,simpleLowerCaseMapping:0x0CA4 + ,simpleTitleCaseMapping:0x0CA4 + }, + { code:0x0CA5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0CA5 + ,simpleLowerCaseMapping:0x0CA5 + ,simpleTitleCaseMapping:0x0CA5 + }, + { code:0x0CA6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0CA6 + ,simpleLowerCaseMapping:0x0CA6 + ,simpleTitleCaseMapping:0x0CA6 + }, + { code:0x0CA7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0CA7 + ,simpleLowerCaseMapping:0x0CA7 + ,simpleTitleCaseMapping:0x0CA7 + }, + { code:0x0CA8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0CA8 + ,simpleLowerCaseMapping:0x0CA8 + ,simpleTitleCaseMapping:0x0CA8 + }, + { code:0x0CAA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0CAA + ,simpleLowerCaseMapping:0x0CAA + ,simpleTitleCaseMapping:0x0CAA + }, + { code:0x0CAB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0CAB + ,simpleLowerCaseMapping:0x0CAB + ,simpleTitleCaseMapping:0x0CAB + }, + { code:0x0CAC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0CAC + ,simpleLowerCaseMapping:0x0CAC + ,simpleTitleCaseMapping:0x0CAC + }, + { code:0x0CAD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0CAD + ,simpleLowerCaseMapping:0x0CAD + ,simpleTitleCaseMapping:0x0CAD + }, + { code:0x0CAE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0CAE + ,simpleLowerCaseMapping:0x0CAE + ,simpleTitleCaseMapping:0x0CAE + }, + { code:0x0CAF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0CAF + ,simpleLowerCaseMapping:0x0CAF + ,simpleTitleCaseMapping:0x0CAF + }, + { code:0x0CB0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0CB0 + ,simpleLowerCaseMapping:0x0CB0 + ,simpleTitleCaseMapping:0x0CB0 + }, + { code:0x0CB1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0CB1 + ,simpleLowerCaseMapping:0x0CB1 + ,simpleTitleCaseMapping:0x0CB1 + }, + { code:0x0CB2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0CB2 + ,simpleLowerCaseMapping:0x0CB2 + ,simpleTitleCaseMapping:0x0CB2 + }, + { code:0x0CB3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0CB3 + ,simpleLowerCaseMapping:0x0CB3 + ,simpleTitleCaseMapping:0x0CB3 + }, + { code:0x0CB5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0CB5 + ,simpleLowerCaseMapping:0x0CB5 + ,simpleTitleCaseMapping:0x0CB5 + }, + { code:0x0CB6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0CB6 + ,simpleLowerCaseMapping:0x0CB6 + ,simpleTitleCaseMapping:0x0CB6 + }, + { code:0x0CB7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0CB7 + ,simpleLowerCaseMapping:0x0CB7 + ,simpleTitleCaseMapping:0x0CB7 + }, + { code:0x0CB8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0CB8 + ,simpleLowerCaseMapping:0x0CB8 + ,simpleTitleCaseMapping:0x0CB8 + }, + { code:0x0CB9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0CB9 + ,simpleLowerCaseMapping:0x0CB9 + ,simpleTitleCaseMapping:0x0CB9 + }, + { code:0x0CBC + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0CBC + ,simpleLowerCaseMapping:0x0CBC + ,simpleTitleCaseMapping:0x0CBC + }, + { code:0x0CBD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0CBD + ,simpleLowerCaseMapping:0x0CBD + ,simpleTitleCaseMapping:0x0CBD + }, + { code:0x0CBE + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0CBE + ,simpleLowerCaseMapping:0x0CBE + ,simpleTitleCaseMapping:0x0CBE + }, + { code:0x0CBF + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0CBF + ,simpleLowerCaseMapping:0x0CBF + ,simpleTitleCaseMapping:0x0CBF + }, + { code:0x0CC0 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0CC0 + ,simpleLowerCaseMapping:0x0CC0 + ,simpleTitleCaseMapping:0x0CC0 + }, + { code:0x0CC1 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0CC1 + ,simpleLowerCaseMapping:0x0CC1 + ,simpleTitleCaseMapping:0x0CC1 + }, + { code:0x0CC2 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0CC2 + ,simpleLowerCaseMapping:0x0CC2 + ,simpleTitleCaseMapping:0x0CC2 + }, + { code:0x0CC3 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0CC3 + ,simpleLowerCaseMapping:0x0CC3 + ,simpleTitleCaseMapping:0x0CC3 + }, + { code:0x0CC4 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0CC4 + ,simpleLowerCaseMapping:0x0CC4 + ,simpleTitleCaseMapping:0x0CC4 + }, + { code:0x0CC6 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0CC6 + ,simpleLowerCaseMapping:0x0CC6 + ,simpleTitleCaseMapping:0x0CC6 + }, + { code:0x0CC7 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0CC7 + ,simpleLowerCaseMapping:0x0CC7 + ,simpleTitleCaseMapping:0x0CC7 + }, + { code:0x0CC8 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0CC8 + ,simpleLowerCaseMapping:0x0CC8 + ,simpleTitleCaseMapping:0x0CC8 + }, + { code:0x0CCA + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0CCA + ,simpleLowerCaseMapping:0x0CCA + ,simpleTitleCaseMapping:0x0CCA + }, + { code:0x0CCB + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0CCB + ,simpleLowerCaseMapping:0x0CCB + ,simpleTitleCaseMapping:0x0CCB + }, + { code:0x0CCC + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0CCC + ,simpleLowerCaseMapping:0x0CCC + ,simpleTitleCaseMapping:0x0CCC + }, + { code:0x0CCD + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0CCD + ,simpleLowerCaseMapping:0x0CCD + ,simpleTitleCaseMapping:0x0CCD + }, + { code:0x0CD5 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0CD5 + ,simpleLowerCaseMapping:0x0CD5 + ,simpleTitleCaseMapping:0x0CD5 + }, + { code:0x0CD6 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0CD6 + ,simpleLowerCaseMapping:0x0CD6 + ,simpleTitleCaseMapping:0x0CD6 + }, + { code:0x0CDE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0CDE + ,simpleLowerCaseMapping:0x0CDE + ,simpleTitleCaseMapping:0x0CDE + }, + { code:0x0CE0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0CE0 + ,simpleLowerCaseMapping:0x0CE0 + ,simpleTitleCaseMapping:0x0CE0 + }, + { code:0x0CE1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0CE1 + ,simpleLowerCaseMapping:0x0CE1 + ,simpleTitleCaseMapping:0x0CE1 + }, + { code:0x0CE2 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0CE2 + ,simpleLowerCaseMapping:0x0CE2 + ,simpleTitleCaseMapping:0x0CE2 + }, + { code:0x0CE3 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0CE3 + ,simpleLowerCaseMapping:0x0CE3 + ,simpleTitleCaseMapping:0x0CE3 + }, + { code:0x0CE6 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0CE6 + ,simpleLowerCaseMapping:0x0CE6 + ,simpleTitleCaseMapping:0x0CE6 + }, + { code:0x0CE7 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0CE7 + ,simpleLowerCaseMapping:0x0CE7 + ,simpleTitleCaseMapping:0x0CE7 + }, + { code:0x0CE8 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0CE8 + ,simpleLowerCaseMapping:0x0CE8 + ,simpleTitleCaseMapping:0x0CE8 + }, + { code:0x0CE9 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0CE9 + ,simpleLowerCaseMapping:0x0CE9 + ,simpleTitleCaseMapping:0x0CE9 + }, + { code:0x0CEA + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0CEA + ,simpleLowerCaseMapping:0x0CEA + ,simpleTitleCaseMapping:0x0CEA + }, + { code:0x0CEB + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0CEB + ,simpleLowerCaseMapping:0x0CEB + ,simpleTitleCaseMapping:0x0CEB + }, + { code:0x0CEC + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0CEC + ,simpleLowerCaseMapping:0x0CEC + ,simpleTitleCaseMapping:0x0CEC + }, + { code:0x0CED + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0CED + ,simpleLowerCaseMapping:0x0CED + ,simpleTitleCaseMapping:0x0CED + }, + { code:0x0CEE + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0CEE + ,simpleLowerCaseMapping:0x0CEE + ,simpleTitleCaseMapping:0x0CEE + }, + { code:0x0CEF + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0CEF + ,simpleLowerCaseMapping:0x0CEF + ,simpleTitleCaseMapping:0x0CEF + }, + { code:0x0CF1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0CF1 + ,simpleLowerCaseMapping:0x0CF1 + ,simpleTitleCaseMapping:0x0CF1 + }, + { code:0x0CF2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0CF2 + ,simpleLowerCaseMapping:0x0CF2 + ,simpleTitleCaseMapping:0x0CF2 + }, + { code:0x0D02 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0D02 + ,simpleLowerCaseMapping:0x0D02 + ,simpleTitleCaseMapping:0x0D02 + }, + { code:0x0D03 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0D03 + ,simpleLowerCaseMapping:0x0D03 + ,simpleTitleCaseMapping:0x0D03 + }, + { code:0x0D05 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D05 + ,simpleLowerCaseMapping:0x0D05 + ,simpleTitleCaseMapping:0x0D05 + }, + { code:0x0D06 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D06 + ,simpleLowerCaseMapping:0x0D06 + ,simpleTitleCaseMapping:0x0D06 + }, + { code:0x0D07 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D07 + ,simpleLowerCaseMapping:0x0D07 + ,simpleTitleCaseMapping:0x0D07 + }, + { code:0x0D08 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D08 + ,simpleLowerCaseMapping:0x0D08 + ,simpleTitleCaseMapping:0x0D08 + }, + { code:0x0D09 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D09 + ,simpleLowerCaseMapping:0x0D09 + ,simpleTitleCaseMapping:0x0D09 + }, + { code:0x0D0A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D0A + ,simpleLowerCaseMapping:0x0D0A + ,simpleTitleCaseMapping:0x0D0A + }, + { code:0x0D0B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D0B + ,simpleLowerCaseMapping:0x0D0B + ,simpleTitleCaseMapping:0x0D0B + }, + { code:0x0D0C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D0C + ,simpleLowerCaseMapping:0x0D0C + ,simpleTitleCaseMapping:0x0D0C + }, + { code:0x0D0E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D0E + ,simpleLowerCaseMapping:0x0D0E + ,simpleTitleCaseMapping:0x0D0E + }, + { code:0x0D0F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D0F + ,simpleLowerCaseMapping:0x0D0F + ,simpleTitleCaseMapping:0x0D0F + }, + { code:0x0D10 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D10 + ,simpleLowerCaseMapping:0x0D10 + ,simpleTitleCaseMapping:0x0D10 + }, + { code:0x0D12 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D12 + ,simpleLowerCaseMapping:0x0D12 + ,simpleTitleCaseMapping:0x0D12 + }, + { code:0x0D13 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D13 + ,simpleLowerCaseMapping:0x0D13 + ,simpleTitleCaseMapping:0x0D13 + }, + { code:0x0D14 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D14 + ,simpleLowerCaseMapping:0x0D14 + ,simpleTitleCaseMapping:0x0D14 + }, + { code:0x0D15 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D15 + ,simpleLowerCaseMapping:0x0D15 + ,simpleTitleCaseMapping:0x0D15 + }, + { code:0x0D16 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D16 + ,simpleLowerCaseMapping:0x0D16 + ,simpleTitleCaseMapping:0x0D16 + }, + { code:0x0D17 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D17 + ,simpleLowerCaseMapping:0x0D17 + ,simpleTitleCaseMapping:0x0D17 + }, + { code:0x0D18 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D18 + ,simpleLowerCaseMapping:0x0D18 + ,simpleTitleCaseMapping:0x0D18 + }, + { code:0x0D19 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D19 + ,simpleLowerCaseMapping:0x0D19 + ,simpleTitleCaseMapping:0x0D19 + }, + { code:0x0D1A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D1A + ,simpleLowerCaseMapping:0x0D1A + ,simpleTitleCaseMapping:0x0D1A + }, + { code:0x0D1B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D1B + ,simpleLowerCaseMapping:0x0D1B + ,simpleTitleCaseMapping:0x0D1B + }, + { code:0x0D1C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D1C + ,simpleLowerCaseMapping:0x0D1C + ,simpleTitleCaseMapping:0x0D1C + }, + { code:0x0D1D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D1D + ,simpleLowerCaseMapping:0x0D1D + ,simpleTitleCaseMapping:0x0D1D + }, + { code:0x0D1E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D1E + ,simpleLowerCaseMapping:0x0D1E + ,simpleTitleCaseMapping:0x0D1E + }, + { code:0x0D1F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D1F + ,simpleLowerCaseMapping:0x0D1F + ,simpleTitleCaseMapping:0x0D1F + }, + { code:0x0D20 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D20 + ,simpleLowerCaseMapping:0x0D20 + ,simpleTitleCaseMapping:0x0D20 + }, + { code:0x0D21 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D21 + ,simpleLowerCaseMapping:0x0D21 + ,simpleTitleCaseMapping:0x0D21 + }, + { code:0x0D22 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D22 + ,simpleLowerCaseMapping:0x0D22 + ,simpleTitleCaseMapping:0x0D22 + }, + { code:0x0D23 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D23 + ,simpleLowerCaseMapping:0x0D23 + ,simpleTitleCaseMapping:0x0D23 + }, + { code:0x0D24 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D24 + ,simpleLowerCaseMapping:0x0D24 + ,simpleTitleCaseMapping:0x0D24 + }, + { code:0x0D25 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D25 + ,simpleLowerCaseMapping:0x0D25 + ,simpleTitleCaseMapping:0x0D25 + }, + { code:0x0D26 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D26 + ,simpleLowerCaseMapping:0x0D26 + ,simpleTitleCaseMapping:0x0D26 + }, + { code:0x0D27 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D27 + ,simpleLowerCaseMapping:0x0D27 + ,simpleTitleCaseMapping:0x0D27 + }, + { code:0x0D28 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D28 + ,simpleLowerCaseMapping:0x0D28 + ,simpleTitleCaseMapping:0x0D28 + }, + { code:0x0D2A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D2A + ,simpleLowerCaseMapping:0x0D2A + ,simpleTitleCaseMapping:0x0D2A + }, + { code:0x0D2B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D2B + ,simpleLowerCaseMapping:0x0D2B + ,simpleTitleCaseMapping:0x0D2B + }, + { code:0x0D2C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D2C + ,simpleLowerCaseMapping:0x0D2C + ,simpleTitleCaseMapping:0x0D2C + }, + { code:0x0D2D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D2D + ,simpleLowerCaseMapping:0x0D2D + ,simpleTitleCaseMapping:0x0D2D + }, + { code:0x0D2E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D2E + ,simpleLowerCaseMapping:0x0D2E + ,simpleTitleCaseMapping:0x0D2E + }, + { code:0x0D2F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D2F + ,simpleLowerCaseMapping:0x0D2F + ,simpleTitleCaseMapping:0x0D2F + }, + { code:0x0D30 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D30 + ,simpleLowerCaseMapping:0x0D30 + ,simpleTitleCaseMapping:0x0D30 + }, + { code:0x0D31 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D31 + ,simpleLowerCaseMapping:0x0D31 + ,simpleTitleCaseMapping:0x0D31 + }, + { code:0x0D32 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D32 + ,simpleLowerCaseMapping:0x0D32 + ,simpleTitleCaseMapping:0x0D32 + }, + { code:0x0D33 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D33 + ,simpleLowerCaseMapping:0x0D33 + ,simpleTitleCaseMapping:0x0D33 + }, + { code:0x0D34 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D34 + ,simpleLowerCaseMapping:0x0D34 + ,simpleTitleCaseMapping:0x0D34 + }, + { code:0x0D35 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D35 + ,simpleLowerCaseMapping:0x0D35 + ,simpleTitleCaseMapping:0x0D35 + }, + { code:0x0D36 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D36 + ,simpleLowerCaseMapping:0x0D36 + ,simpleTitleCaseMapping:0x0D36 + }, + { code:0x0D37 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D37 + ,simpleLowerCaseMapping:0x0D37 + ,simpleTitleCaseMapping:0x0D37 + }, + { code:0x0D38 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D38 + ,simpleLowerCaseMapping:0x0D38 + ,simpleTitleCaseMapping:0x0D38 + }, + { code:0x0D39 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D39 + ,simpleLowerCaseMapping:0x0D39 + ,simpleTitleCaseMapping:0x0D39 + }, + { code:0x0D3E + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0D3E + ,simpleLowerCaseMapping:0x0D3E + ,simpleTitleCaseMapping:0x0D3E + }, + { code:0x0D3F + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0D3F + ,simpleLowerCaseMapping:0x0D3F + ,simpleTitleCaseMapping:0x0D3F + }, + { code:0x0D40 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0D40 + ,simpleLowerCaseMapping:0x0D40 + ,simpleTitleCaseMapping:0x0D40 + }, + { code:0x0D41 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0D41 + ,simpleLowerCaseMapping:0x0D41 + ,simpleTitleCaseMapping:0x0D41 + }, + { code:0x0D42 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0D42 + ,simpleLowerCaseMapping:0x0D42 + ,simpleTitleCaseMapping:0x0D42 + }, + { code:0x0D43 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0D43 + ,simpleLowerCaseMapping:0x0D43 + ,simpleTitleCaseMapping:0x0D43 + }, + { code:0x0D46 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0D46 + ,simpleLowerCaseMapping:0x0D46 + ,simpleTitleCaseMapping:0x0D46 + }, + { code:0x0D47 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0D47 + ,simpleLowerCaseMapping:0x0D47 + ,simpleTitleCaseMapping:0x0D47 + }, + { code:0x0D48 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0D48 + ,simpleLowerCaseMapping:0x0D48 + ,simpleTitleCaseMapping:0x0D48 + }, + { code:0x0D4A + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0D4A + ,simpleLowerCaseMapping:0x0D4A + ,simpleTitleCaseMapping:0x0D4A + }, + { code:0x0D4B + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0D4B + ,simpleLowerCaseMapping:0x0D4B + ,simpleTitleCaseMapping:0x0D4B + }, + { code:0x0D4C + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0D4C + ,simpleLowerCaseMapping:0x0D4C + ,simpleTitleCaseMapping:0x0D4C + }, + { code:0x0D4D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0D4D + ,simpleLowerCaseMapping:0x0D4D + ,simpleTitleCaseMapping:0x0D4D + }, + { code:0x0D57 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0D57 + ,simpleLowerCaseMapping:0x0D57 + ,simpleTitleCaseMapping:0x0D57 + }, + { code:0x0D60 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D60 + ,simpleLowerCaseMapping:0x0D60 + ,simpleTitleCaseMapping:0x0D60 + }, + { code:0x0D61 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D61 + ,simpleLowerCaseMapping:0x0D61 + ,simpleTitleCaseMapping:0x0D61 + }, + { code:0x0D66 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0D66 + ,simpleLowerCaseMapping:0x0D66 + ,simpleTitleCaseMapping:0x0D66 + }, + { code:0x0D67 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0D67 + ,simpleLowerCaseMapping:0x0D67 + ,simpleTitleCaseMapping:0x0D67 + }, + { code:0x0D68 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0D68 + ,simpleLowerCaseMapping:0x0D68 + ,simpleTitleCaseMapping:0x0D68 + }, + { code:0x0D69 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0D69 + ,simpleLowerCaseMapping:0x0D69 + ,simpleTitleCaseMapping:0x0D69 + }, + { code:0x0D6A + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0D6A + ,simpleLowerCaseMapping:0x0D6A + ,simpleTitleCaseMapping:0x0D6A + }, + { code:0x0D6B + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0D6B + ,simpleLowerCaseMapping:0x0D6B + ,simpleTitleCaseMapping:0x0D6B + }, + { code:0x0D6C + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0D6C + ,simpleLowerCaseMapping:0x0D6C + ,simpleTitleCaseMapping:0x0D6C + }, + { code:0x0D6D + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0D6D + ,simpleLowerCaseMapping:0x0D6D + ,simpleTitleCaseMapping:0x0D6D + }, + { code:0x0D6E + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0D6E + ,simpleLowerCaseMapping:0x0D6E + ,simpleTitleCaseMapping:0x0D6E + }, + { code:0x0D6F + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0D6F + ,simpleLowerCaseMapping:0x0D6F + ,simpleTitleCaseMapping:0x0D6F + }, + { code:0x0D82 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0D82 + ,simpleLowerCaseMapping:0x0D82 + ,simpleTitleCaseMapping:0x0D82 + }, + { code:0x0D83 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0D83 + ,simpleLowerCaseMapping:0x0D83 + ,simpleTitleCaseMapping:0x0D83 + }, + { code:0x0D85 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D85 + ,simpleLowerCaseMapping:0x0D85 + ,simpleTitleCaseMapping:0x0D85 + }, + { code:0x0D86 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D86 + ,simpleLowerCaseMapping:0x0D86 + ,simpleTitleCaseMapping:0x0D86 + }, + { code:0x0D87 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D87 + ,simpleLowerCaseMapping:0x0D87 + ,simpleTitleCaseMapping:0x0D87 + }, + { code:0x0D88 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D88 + ,simpleLowerCaseMapping:0x0D88 + ,simpleTitleCaseMapping:0x0D88 + }, + { code:0x0D89 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D89 + ,simpleLowerCaseMapping:0x0D89 + ,simpleTitleCaseMapping:0x0D89 + }, + { code:0x0D8A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D8A + ,simpleLowerCaseMapping:0x0D8A + ,simpleTitleCaseMapping:0x0D8A + }, + { code:0x0D8B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D8B + ,simpleLowerCaseMapping:0x0D8B + ,simpleTitleCaseMapping:0x0D8B + }, + { code:0x0D8C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D8C + ,simpleLowerCaseMapping:0x0D8C + ,simpleTitleCaseMapping:0x0D8C + }, + { code:0x0D8D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D8D + ,simpleLowerCaseMapping:0x0D8D + ,simpleTitleCaseMapping:0x0D8D + }, + { code:0x0D8E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D8E + ,simpleLowerCaseMapping:0x0D8E + ,simpleTitleCaseMapping:0x0D8E + }, + { code:0x0D8F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D8F + ,simpleLowerCaseMapping:0x0D8F + ,simpleTitleCaseMapping:0x0D8F + }, + { code:0x0D90 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D90 + ,simpleLowerCaseMapping:0x0D90 + ,simpleTitleCaseMapping:0x0D90 + }, + { code:0x0D91 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D91 + ,simpleLowerCaseMapping:0x0D91 + ,simpleTitleCaseMapping:0x0D91 + }, + { code:0x0D92 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D92 + ,simpleLowerCaseMapping:0x0D92 + ,simpleTitleCaseMapping:0x0D92 + }, + { code:0x0D93 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D93 + ,simpleLowerCaseMapping:0x0D93 + ,simpleTitleCaseMapping:0x0D93 + }, + { code:0x0D94 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D94 + ,simpleLowerCaseMapping:0x0D94 + ,simpleTitleCaseMapping:0x0D94 + }, + { code:0x0D95 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D95 + ,simpleLowerCaseMapping:0x0D95 + ,simpleTitleCaseMapping:0x0D95 + }, + { code:0x0D96 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D96 + ,simpleLowerCaseMapping:0x0D96 + ,simpleTitleCaseMapping:0x0D96 + }, + { code:0x0D9A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D9A + ,simpleLowerCaseMapping:0x0D9A + ,simpleTitleCaseMapping:0x0D9A + }, + { code:0x0D9B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D9B + ,simpleLowerCaseMapping:0x0D9B + ,simpleTitleCaseMapping:0x0D9B + }, + { code:0x0D9C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D9C + ,simpleLowerCaseMapping:0x0D9C + ,simpleTitleCaseMapping:0x0D9C + }, + { code:0x0D9D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D9D + ,simpleLowerCaseMapping:0x0D9D + ,simpleTitleCaseMapping:0x0D9D + }, + { code:0x0D9E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D9E + ,simpleLowerCaseMapping:0x0D9E + ,simpleTitleCaseMapping:0x0D9E + }, + { code:0x0D9F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0D9F + ,simpleLowerCaseMapping:0x0D9F + ,simpleTitleCaseMapping:0x0D9F + }, + { code:0x0DA0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DA0 + ,simpleLowerCaseMapping:0x0DA0 + ,simpleTitleCaseMapping:0x0DA0 + }, + { code:0x0DA1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DA1 + ,simpleLowerCaseMapping:0x0DA1 + ,simpleTitleCaseMapping:0x0DA1 + }, + { code:0x0DA2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DA2 + ,simpleLowerCaseMapping:0x0DA2 + ,simpleTitleCaseMapping:0x0DA2 + }, + { code:0x0DA3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DA3 + ,simpleLowerCaseMapping:0x0DA3 + ,simpleTitleCaseMapping:0x0DA3 + }, + { code:0x0DA4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DA4 + ,simpleLowerCaseMapping:0x0DA4 + ,simpleTitleCaseMapping:0x0DA4 + }, + { code:0x0DA5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DA5 + ,simpleLowerCaseMapping:0x0DA5 + ,simpleTitleCaseMapping:0x0DA5 + }, + { code:0x0DA6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DA6 + ,simpleLowerCaseMapping:0x0DA6 + ,simpleTitleCaseMapping:0x0DA6 + }, + { code:0x0DA7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DA7 + ,simpleLowerCaseMapping:0x0DA7 + ,simpleTitleCaseMapping:0x0DA7 + }, + { code:0x0DA8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DA8 + ,simpleLowerCaseMapping:0x0DA8 + ,simpleTitleCaseMapping:0x0DA8 + }, + { code:0x0DA9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DA9 + ,simpleLowerCaseMapping:0x0DA9 + ,simpleTitleCaseMapping:0x0DA9 + }, + { code:0x0DAA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DAA + ,simpleLowerCaseMapping:0x0DAA + ,simpleTitleCaseMapping:0x0DAA + }, + { code:0x0DAB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DAB + ,simpleLowerCaseMapping:0x0DAB + ,simpleTitleCaseMapping:0x0DAB + }, + { code:0x0DAC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DAC + ,simpleLowerCaseMapping:0x0DAC + ,simpleTitleCaseMapping:0x0DAC + }, + { code:0x0DAD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DAD + ,simpleLowerCaseMapping:0x0DAD + ,simpleTitleCaseMapping:0x0DAD + }, + { code:0x0DAE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DAE + ,simpleLowerCaseMapping:0x0DAE + ,simpleTitleCaseMapping:0x0DAE + }, + { code:0x0DAF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DAF + ,simpleLowerCaseMapping:0x0DAF + ,simpleTitleCaseMapping:0x0DAF + }, + { code:0x0DB0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DB0 + ,simpleLowerCaseMapping:0x0DB0 + ,simpleTitleCaseMapping:0x0DB0 + }, + { code:0x0DB1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DB1 + ,simpleLowerCaseMapping:0x0DB1 + ,simpleTitleCaseMapping:0x0DB1 + }, + { code:0x0DB3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DB3 + ,simpleLowerCaseMapping:0x0DB3 + ,simpleTitleCaseMapping:0x0DB3 + }, + { code:0x0DB4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DB4 + ,simpleLowerCaseMapping:0x0DB4 + ,simpleTitleCaseMapping:0x0DB4 + }, + { code:0x0DB5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DB5 + ,simpleLowerCaseMapping:0x0DB5 + ,simpleTitleCaseMapping:0x0DB5 + }, + { code:0x0DB6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DB6 + ,simpleLowerCaseMapping:0x0DB6 + ,simpleTitleCaseMapping:0x0DB6 + }, + { code:0x0DB7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DB7 + ,simpleLowerCaseMapping:0x0DB7 + ,simpleTitleCaseMapping:0x0DB7 + }, + { code:0x0DB8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DB8 + ,simpleLowerCaseMapping:0x0DB8 + ,simpleTitleCaseMapping:0x0DB8 + }, + { code:0x0DB9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DB9 + ,simpleLowerCaseMapping:0x0DB9 + ,simpleTitleCaseMapping:0x0DB9 + }, + { code:0x0DBA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DBA + ,simpleLowerCaseMapping:0x0DBA + ,simpleTitleCaseMapping:0x0DBA + }, + { code:0x0DBB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DBB + ,simpleLowerCaseMapping:0x0DBB + ,simpleTitleCaseMapping:0x0DBB + }, + { code:0x0DBD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DBD + ,simpleLowerCaseMapping:0x0DBD + ,simpleTitleCaseMapping:0x0DBD + }, + { code:0x0DC0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DC0 + ,simpleLowerCaseMapping:0x0DC0 + ,simpleTitleCaseMapping:0x0DC0 + }, + { code:0x0DC1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DC1 + ,simpleLowerCaseMapping:0x0DC1 + ,simpleTitleCaseMapping:0x0DC1 + }, + { code:0x0DC2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DC2 + ,simpleLowerCaseMapping:0x0DC2 + ,simpleTitleCaseMapping:0x0DC2 + }, + { code:0x0DC3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DC3 + ,simpleLowerCaseMapping:0x0DC3 + ,simpleTitleCaseMapping:0x0DC3 + }, + { code:0x0DC4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DC4 + ,simpleLowerCaseMapping:0x0DC4 + ,simpleTitleCaseMapping:0x0DC4 + }, + { code:0x0DC5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DC5 + ,simpleLowerCaseMapping:0x0DC5 + ,simpleTitleCaseMapping:0x0DC5 + }, + { code:0x0DC6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0DC6 + ,simpleLowerCaseMapping:0x0DC6 + ,simpleTitleCaseMapping:0x0DC6 + }, + { code:0x0DCA + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0DCA + ,simpleLowerCaseMapping:0x0DCA + ,simpleTitleCaseMapping:0x0DCA + }, + { code:0x0DCF + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0DCF + ,simpleLowerCaseMapping:0x0DCF + ,simpleTitleCaseMapping:0x0DCF + }, + { code:0x0DD0 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0DD0 + ,simpleLowerCaseMapping:0x0DD0 + ,simpleTitleCaseMapping:0x0DD0 + }, + { code:0x0DD1 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0DD1 + ,simpleLowerCaseMapping:0x0DD1 + ,simpleTitleCaseMapping:0x0DD1 + }, + { code:0x0DD2 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0DD2 + ,simpleLowerCaseMapping:0x0DD2 + ,simpleTitleCaseMapping:0x0DD2 + }, + { code:0x0DD3 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0DD3 + ,simpleLowerCaseMapping:0x0DD3 + ,simpleTitleCaseMapping:0x0DD3 + }, + { code:0x0DD4 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0DD4 + ,simpleLowerCaseMapping:0x0DD4 + ,simpleTitleCaseMapping:0x0DD4 + }, + { code:0x0DD6 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0DD6 + ,simpleLowerCaseMapping:0x0DD6 + ,simpleTitleCaseMapping:0x0DD6 + }, + { code:0x0DD8 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0DD8 + ,simpleLowerCaseMapping:0x0DD8 + ,simpleTitleCaseMapping:0x0DD8 + }, + { code:0x0DD9 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0DD9 + ,simpleLowerCaseMapping:0x0DD9 + ,simpleTitleCaseMapping:0x0DD9 + }, + { code:0x0DDA + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0DDA + ,simpleLowerCaseMapping:0x0DDA + ,simpleTitleCaseMapping:0x0DDA + }, + { code:0x0DDB + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0DDB + ,simpleLowerCaseMapping:0x0DDB + ,simpleTitleCaseMapping:0x0DDB + }, + { code:0x0DDC + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0DDC + ,simpleLowerCaseMapping:0x0DDC + ,simpleTitleCaseMapping:0x0DDC + }, + { code:0x0DDD + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0DDD + ,simpleLowerCaseMapping:0x0DDD + ,simpleTitleCaseMapping:0x0DDD + }, + { code:0x0DDE + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0DDE + ,simpleLowerCaseMapping:0x0DDE + ,simpleTitleCaseMapping:0x0DDE + }, + { code:0x0DDF + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0DDF + ,simpleLowerCaseMapping:0x0DDF + ,simpleTitleCaseMapping:0x0DDF + }, + { code:0x0DF2 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0DF2 + ,simpleLowerCaseMapping:0x0DF2 + ,simpleTitleCaseMapping:0x0DF2 + }, + { code:0x0DF3 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0DF3 + ,simpleLowerCaseMapping:0x0DF3 + ,simpleTitleCaseMapping:0x0DF3 + }, + { code:0x0DF4 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0DF4 + ,simpleLowerCaseMapping:0x0DF4 + ,simpleTitleCaseMapping:0x0DF4 + }, + { code:0x0E01 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E01 + ,simpleLowerCaseMapping:0x0E01 + ,simpleTitleCaseMapping:0x0E01 + }, + { code:0x0E02 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E02 + ,simpleLowerCaseMapping:0x0E02 + ,simpleTitleCaseMapping:0x0E02 + }, + { code:0x0E03 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E03 + ,simpleLowerCaseMapping:0x0E03 + ,simpleTitleCaseMapping:0x0E03 + }, + { code:0x0E04 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E04 + ,simpleLowerCaseMapping:0x0E04 + ,simpleTitleCaseMapping:0x0E04 + }, + { code:0x0E05 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E05 + ,simpleLowerCaseMapping:0x0E05 + ,simpleTitleCaseMapping:0x0E05 + }, + { code:0x0E06 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E06 + ,simpleLowerCaseMapping:0x0E06 + ,simpleTitleCaseMapping:0x0E06 + }, + { code:0x0E07 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E07 + ,simpleLowerCaseMapping:0x0E07 + ,simpleTitleCaseMapping:0x0E07 + }, + { code:0x0E08 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E08 + ,simpleLowerCaseMapping:0x0E08 + ,simpleTitleCaseMapping:0x0E08 + }, + { code:0x0E09 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E09 + ,simpleLowerCaseMapping:0x0E09 + ,simpleTitleCaseMapping:0x0E09 + }, + { code:0x0E0A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E0A + ,simpleLowerCaseMapping:0x0E0A + ,simpleTitleCaseMapping:0x0E0A + }, + { code:0x0E0B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E0B + ,simpleLowerCaseMapping:0x0E0B + ,simpleTitleCaseMapping:0x0E0B + }, + { code:0x0E0C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E0C + ,simpleLowerCaseMapping:0x0E0C + ,simpleTitleCaseMapping:0x0E0C + }, + { code:0x0E0D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E0D + ,simpleLowerCaseMapping:0x0E0D + ,simpleTitleCaseMapping:0x0E0D + }, + { code:0x0E0E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E0E + ,simpleLowerCaseMapping:0x0E0E + ,simpleTitleCaseMapping:0x0E0E + }, + { code:0x0E0F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E0F + ,simpleLowerCaseMapping:0x0E0F + ,simpleTitleCaseMapping:0x0E0F + }, + { code:0x0E10 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E10 + ,simpleLowerCaseMapping:0x0E10 + ,simpleTitleCaseMapping:0x0E10 + }, + { code:0x0E11 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E11 + ,simpleLowerCaseMapping:0x0E11 + ,simpleTitleCaseMapping:0x0E11 + }, + { code:0x0E12 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E12 + ,simpleLowerCaseMapping:0x0E12 + ,simpleTitleCaseMapping:0x0E12 + }, + { code:0x0E13 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E13 + ,simpleLowerCaseMapping:0x0E13 + ,simpleTitleCaseMapping:0x0E13 + }, + { code:0x0E14 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E14 + ,simpleLowerCaseMapping:0x0E14 + ,simpleTitleCaseMapping:0x0E14 + }, + { code:0x0E15 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E15 + ,simpleLowerCaseMapping:0x0E15 + ,simpleTitleCaseMapping:0x0E15 + }, + { code:0x0E16 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E16 + ,simpleLowerCaseMapping:0x0E16 + ,simpleTitleCaseMapping:0x0E16 + }, + { code:0x0E17 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E17 + ,simpleLowerCaseMapping:0x0E17 + ,simpleTitleCaseMapping:0x0E17 + }, + { code:0x0E18 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E18 + ,simpleLowerCaseMapping:0x0E18 + ,simpleTitleCaseMapping:0x0E18 + }, + { code:0x0E19 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E19 + ,simpleLowerCaseMapping:0x0E19 + ,simpleTitleCaseMapping:0x0E19 + }, + { code:0x0E1A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E1A + ,simpleLowerCaseMapping:0x0E1A + ,simpleTitleCaseMapping:0x0E1A + }, + { code:0x0E1B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E1B + ,simpleLowerCaseMapping:0x0E1B + ,simpleTitleCaseMapping:0x0E1B + }, + { code:0x0E1C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E1C + ,simpleLowerCaseMapping:0x0E1C + ,simpleTitleCaseMapping:0x0E1C + }, + { code:0x0E1D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E1D + ,simpleLowerCaseMapping:0x0E1D + ,simpleTitleCaseMapping:0x0E1D + }, + { code:0x0E1E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E1E + ,simpleLowerCaseMapping:0x0E1E + ,simpleTitleCaseMapping:0x0E1E + }, + { code:0x0E1F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E1F + ,simpleLowerCaseMapping:0x0E1F + ,simpleTitleCaseMapping:0x0E1F + }, + { code:0x0E20 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E20 + ,simpleLowerCaseMapping:0x0E20 + ,simpleTitleCaseMapping:0x0E20 + }, + { code:0x0E21 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E21 + ,simpleLowerCaseMapping:0x0E21 + ,simpleTitleCaseMapping:0x0E21 + }, + { code:0x0E22 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E22 + ,simpleLowerCaseMapping:0x0E22 + ,simpleTitleCaseMapping:0x0E22 + }, + { code:0x0E23 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E23 + ,simpleLowerCaseMapping:0x0E23 + ,simpleTitleCaseMapping:0x0E23 + }, + { code:0x0E24 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E24 + ,simpleLowerCaseMapping:0x0E24 + ,simpleTitleCaseMapping:0x0E24 + }, + { code:0x0E25 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E25 + ,simpleLowerCaseMapping:0x0E25 + ,simpleTitleCaseMapping:0x0E25 + }, + { code:0x0E26 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E26 + ,simpleLowerCaseMapping:0x0E26 + ,simpleTitleCaseMapping:0x0E26 + }, + { code:0x0E27 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E27 + ,simpleLowerCaseMapping:0x0E27 + ,simpleTitleCaseMapping:0x0E27 + }, + { code:0x0E28 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E28 + ,simpleLowerCaseMapping:0x0E28 + ,simpleTitleCaseMapping:0x0E28 + }, + { code:0x0E29 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E29 + ,simpleLowerCaseMapping:0x0E29 + ,simpleTitleCaseMapping:0x0E29 + }, + { code:0x0E2A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E2A + ,simpleLowerCaseMapping:0x0E2A + ,simpleTitleCaseMapping:0x0E2A + }, + { code:0x0E2B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E2B + ,simpleLowerCaseMapping:0x0E2B + ,simpleTitleCaseMapping:0x0E2B + }, + { code:0x0E2C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E2C + ,simpleLowerCaseMapping:0x0E2C + ,simpleTitleCaseMapping:0x0E2C + }, + { code:0x0E2D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E2D + ,simpleLowerCaseMapping:0x0E2D + ,simpleTitleCaseMapping:0x0E2D + }, + { code:0x0E2E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E2E + ,simpleLowerCaseMapping:0x0E2E + ,simpleTitleCaseMapping:0x0E2E + }, + { code:0x0E2F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E2F + ,simpleLowerCaseMapping:0x0E2F + ,simpleTitleCaseMapping:0x0E2F + }, + { code:0x0E30 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E30 + ,simpleLowerCaseMapping:0x0E30 + ,simpleTitleCaseMapping:0x0E30 + }, + { code:0x0E31 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0E31 + ,simpleLowerCaseMapping:0x0E31 + ,simpleTitleCaseMapping:0x0E31 + }, + { code:0x0E32 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E32 + ,simpleLowerCaseMapping:0x0E32 + ,simpleTitleCaseMapping:0x0E32 + }, + { code:0x0E33 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E33 + ,simpleLowerCaseMapping:0x0E33 + ,simpleTitleCaseMapping:0x0E33 + }, + { code:0x0E34 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0E34 + ,simpleLowerCaseMapping:0x0E34 + ,simpleTitleCaseMapping:0x0E34 + }, + { code:0x0E35 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0E35 + ,simpleLowerCaseMapping:0x0E35 + ,simpleTitleCaseMapping:0x0E35 + }, + { code:0x0E36 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0E36 + ,simpleLowerCaseMapping:0x0E36 + ,simpleTitleCaseMapping:0x0E36 + }, + { code:0x0E37 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0E37 + ,simpleLowerCaseMapping:0x0E37 + ,simpleTitleCaseMapping:0x0E37 + }, + { code:0x0E38 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0E38 + ,simpleLowerCaseMapping:0x0E38 + ,simpleTitleCaseMapping:0x0E38 + }, + { code:0x0E39 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0E39 + ,simpleLowerCaseMapping:0x0E39 + ,simpleTitleCaseMapping:0x0E39 + }, + { code:0x0E3A + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0E3A + ,simpleLowerCaseMapping:0x0E3A + ,simpleTitleCaseMapping:0x0E3A + }, + { code:0x0E3F + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0x0E3F + ,simpleLowerCaseMapping:0x0E3F + ,simpleTitleCaseMapping:0x0E3F + }, + { code:0x0E40 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E40 + ,simpleLowerCaseMapping:0x0E40 + ,simpleTitleCaseMapping:0x0E40 + }, + { code:0x0E41 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E41 + ,simpleLowerCaseMapping:0x0E41 + ,simpleTitleCaseMapping:0x0E41 + }, + { code:0x0E42 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E42 + ,simpleLowerCaseMapping:0x0E42 + ,simpleTitleCaseMapping:0x0E42 + }, + { code:0x0E43 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E43 + ,simpleLowerCaseMapping:0x0E43 + ,simpleTitleCaseMapping:0x0E43 + }, + { code:0x0E44 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E44 + ,simpleLowerCaseMapping:0x0E44 + ,simpleTitleCaseMapping:0x0E44 + }, + { code:0x0E45 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E45 + ,simpleLowerCaseMapping:0x0E45 + ,simpleTitleCaseMapping:0x0E45 + }, + { code:0x0E46 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x0E46 + ,simpleLowerCaseMapping:0x0E46 + ,simpleTitleCaseMapping:0x0E46 + }, + { code:0x0E47 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0E47 + ,simpleLowerCaseMapping:0x0E47 + ,simpleTitleCaseMapping:0x0E47 + }, + { code:0x0E48 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0E48 + ,simpleLowerCaseMapping:0x0E48 + ,simpleTitleCaseMapping:0x0E48 + }, + { code:0x0E49 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0E49 + ,simpleLowerCaseMapping:0x0E49 + ,simpleTitleCaseMapping:0x0E49 + }, + { code:0x0E4A + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0E4A + ,simpleLowerCaseMapping:0x0E4A + ,simpleTitleCaseMapping:0x0E4A + }, + { code:0x0E4B + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0E4B + ,simpleLowerCaseMapping:0x0E4B + ,simpleTitleCaseMapping:0x0E4B + }, + { code:0x0E4C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0E4C + ,simpleLowerCaseMapping:0x0E4C + ,simpleTitleCaseMapping:0x0E4C + }, + { code:0x0E4D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0E4D + ,simpleLowerCaseMapping:0x0E4D + ,simpleTitleCaseMapping:0x0E4D + }, + { code:0x0E4E + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0E4E + ,simpleLowerCaseMapping:0x0E4E + ,simpleTitleCaseMapping:0x0E4E + }, + { code:0x0E4F + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0E4F + ,simpleLowerCaseMapping:0x0E4F + ,simpleTitleCaseMapping:0x0E4F + }, + { code:0x0E50 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0E50 + ,simpleLowerCaseMapping:0x0E50 + ,simpleTitleCaseMapping:0x0E50 + }, + { code:0x0E51 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0E51 + ,simpleLowerCaseMapping:0x0E51 + ,simpleTitleCaseMapping:0x0E51 + }, + { code:0x0E52 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0E52 + ,simpleLowerCaseMapping:0x0E52 + ,simpleTitleCaseMapping:0x0E52 + }, + { code:0x0E53 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0E53 + ,simpleLowerCaseMapping:0x0E53 + ,simpleTitleCaseMapping:0x0E53 + }, + { code:0x0E54 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0E54 + ,simpleLowerCaseMapping:0x0E54 + ,simpleTitleCaseMapping:0x0E54 + }, + { code:0x0E55 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0E55 + ,simpleLowerCaseMapping:0x0E55 + ,simpleTitleCaseMapping:0x0E55 + }, + { code:0x0E56 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0E56 + ,simpleLowerCaseMapping:0x0E56 + ,simpleTitleCaseMapping:0x0E56 + }, + { code:0x0E57 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0E57 + ,simpleLowerCaseMapping:0x0E57 + ,simpleTitleCaseMapping:0x0E57 + }, + { code:0x0E58 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0E58 + ,simpleLowerCaseMapping:0x0E58 + ,simpleTitleCaseMapping:0x0E58 + }, + { code:0x0E59 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0E59 + ,simpleLowerCaseMapping:0x0E59 + ,simpleTitleCaseMapping:0x0E59 + }, + { code:0x0E5A + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0E5A + ,simpleLowerCaseMapping:0x0E5A + ,simpleTitleCaseMapping:0x0E5A + }, + { code:0x0E5B + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0E5B + ,simpleLowerCaseMapping:0x0E5B + ,simpleTitleCaseMapping:0x0E5B + }, + { code:0x0E81 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E81 + ,simpleLowerCaseMapping:0x0E81 + ,simpleTitleCaseMapping:0x0E81 + }, + { code:0x0E82 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E82 + ,simpleLowerCaseMapping:0x0E82 + ,simpleTitleCaseMapping:0x0E82 + }, + { code:0x0E84 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E84 + ,simpleLowerCaseMapping:0x0E84 + ,simpleTitleCaseMapping:0x0E84 + }, + { code:0x0E87 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E87 + ,simpleLowerCaseMapping:0x0E87 + ,simpleTitleCaseMapping:0x0E87 + }, + { code:0x0E88 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E88 + ,simpleLowerCaseMapping:0x0E88 + ,simpleTitleCaseMapping:0x0E88 + }, + { code:0x0E8A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E8A + ,simpleLowerCaseMapping:0x0E8A + ,simpleTitleCaseMapping:0x0E8A + }, + { code:0x0E8D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E8D + ,simpleLowerCaseMapping:0x0E8D + ,simpleTitleCaseMapping:0x0E8D + }, + { code:0x0E94 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E94 + ,simpleLowerCaseMapping:0x0E94 + ,simpleTitleCaseMapping:0x0E94 + }, + { code:0x0E95 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E95 + ,simpleLowerCaseMapping:0x0E95 + ,simpleTitleCaseMapping:0x0E95 + }, + { code:0x0E96 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E96 + ,simpleLowerCaseMapping:0x0E96 + ,simpleTitleCaseMapping:0x0E96 + }, + { code:0x0E97 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E97 + ,simpleLowerCaseMapping:0x0E97 + ,simpleTitleCaseMapping:0x0E97 + }, + { code:0x0E99 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E99 + ,simpleLowerCaseMapping:0x0E99 + ,simpleTitleCaseMapping:0x0E99 + }, + { code:0x0E9A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E9A + ,simpleLowerCaseMapping:0x0E9A + ,simpleTitleCaseMapping:0x0E9A + }, + { code:0x0E9B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E9B + ,simpleLowerCaseMapping:0x0E9B + ,simpleTitleCaseMapping:0x0E9B + }, + { code:0x0E9C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E9C + ,simpleLowerCaseMapping:0x0E9C + ,simpleTitleCaseMapping:0x0E9C + }, + { code:0x0E9D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E9D + ,simpleLowerCaseMapping:0x0E9D + ,simpleTitleCaseMapping:0x0E9D + }, + { code:0x0E9E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E9E + ,simpleLowerCaseMapping:0x0E9E + ,simpleTitleCaseMapping:0x0E9E + }, + { code:0x0E9F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0E9F + ,simpleLowerCaseMapping:0x0E9F + ,simpleTitleCaseMapping:0x0E9F + }, + { code:0x0EA1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0EA1 + ,simpleLowerCaseMapping:0x0EA1 + ,simpleTitleCaseMapping:0x0EA1 + }, + { code:0x0EA2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0EA2 + ,simpleLowerCaseMapping:0x0EA2 + ,simpleTitleCaseMapping:0x0EA2 + }, + { code:0x0EA3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0EA3 + ,simpleLowerCaseMapping:0x0EA3 + ,simpleTitleCaseMapping:0x0EA3 + }, + { code:0x0EA5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0EA5 + ,simpleLowerCaseMapping:0x0EA5 + ,simpleTitleCaseMapping:0x0EA5 + }, + { code:0x0EA7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0EA7 + ,simpleLowerCaseMapping:0x0EA7 + ,simpleTitleCaseMapping:0x0EA7 + }, + { code:0x0EAA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0EAA + ,simpleLowerCaseMapping:0x0EAA + ,simpleTitleCaseMapping:0x0EAA + }, + { code:0x0EAB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0EAB + ,simpleLowerCaseMapping:0x0EAB + ,simpleTitleCaseMapping:0x0EAB + }, + { code:0x0EAD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0EAD + ,simpleLowerCaseMapping:0x0EAD + ,simpleTitleCaseMapping:0x0EAD + }, + { code:0x0EAE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0EAE + ,simpleLowerCaseMapping:0x0EAE + ,simpleTitleCaseMapping:0x0EAE + }, + { code:0x0EAF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0EAF + ,simpleLowerCaseMapping:0x0EAF + ,simpleTitleCaseMapping:0x0EAF + }, + { code:0x0EB0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0EB0 + ,simpleLowerCaseMapping:0x0EB0 + ,simpleTitleCaseMapping:0x0EB0 + }, + { code:0x0EB1 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0EB1 + ,simpleLowerCaseMapping:0x0EB1 + ,simpleTitleCaseMapping:0x0EB1 + }, + { code:0x0EB2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0EB2 + ,simpleLowerCaseMapping:0x0EB2 + ,simpleTitleCaseMapping:0x0EB2 + }, + { code:0x0EB3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0EB3 + ,simpleLowerCaseMapping:0x0EB3 + ,simpleTitleCaseMapping:0x0EB3 + }, + { code:0x0EB4 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0EB4 + ,simpleLowerCaseMapping:0x0EB4 + ,simpleTitleCaseMapping:0x0EB4 + }, + { code:0x0EB5 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0EB5 + ,simpleLowerCaseMapping:0x0EB5 + ,simpleTitleCaseMapping:0x0EB5 + }, + { code:0x0EB6 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0EB6 + ,simpleLowerCaseMapping:0x0EB6 + ,simpleTitleCaseMapping:0x0EB6 + }, + { code:0x0EB7 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0EB7 + ,simpleLowerCaseMapping:0x0EB7 + ,simpleTitleCaseMapping:0x0EB7 + }, + { code:0x0EB8 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0EB8 + ,simpleLowerCaseMapping:0x0EB8 + ,simpleTitleCaseMapping:0x0EB8 + }, + { code:0x0EB9 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0EB9 + ,simpleLowerCaseMapping:0x0EB9 + ,simpleTitleCaseMapping:0x0EB9 + }, + { code:0x0EBB + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0EBB + ,simpleLowerCaseMapping:0x0EBB + ,simpleTitleCaseMapping:0x0EBB + }, + { code:0x0EBC + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0EBC + ,simpleLowerCaseMapping:0x0EBC + ,simpleTitleCaseMapping:0x0EBC + }, + { code:0x0EBD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0EBD + ,simpleLowerCaseMapping:0x0EBD + ,simpleTitleCaseMapping:0x0EBD + }, + { code:0x0EC0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0EC0 + ,simpleLowerCaseMapping:0x0EC0 + ,simpleTitleCaseMapping:0x0EC0 + }, + { code:0x0EC1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0EC1 + ,simpleLowerCaseMapping:0x0EC1 + ,simpleTitleCaseMapping:0x0EC1 + }, + { code:0x0EC2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0EC2 + ,simpleLowerCaseMapping:0x0EC2 + ,simpleTitleCaseMapping:0x0EC2 + }, + { code:0x0EC3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0EC3 + ,simpleLowerCaseMapping:0x0EC3 + ,simpleTitleCaseMapping:0x0EC3 + }, + { code:0x0EC4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0EC4 + ,simpleLowerCaseMapping:0x0EC4 + ,simpleTitleCaseMapping:0x0EC4 + }, + { code:0x0EC6 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x0EC6 + ,simpleLowerCaseMapping:0x0EC6 + ,simpleTitleCaseMapping:0x0EC6 + }, + { code:0x0EC8 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0EC8 + ,simpleLowerCaseMapping:0x0EC8 + ,simpleTitleCaseMapping:0x0EC8 + }, + { code:0x0EC9 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0EC9 + ,simpleLowerCaseMapping:0x0EC9 + ,simpleTitleCaseMapping:0x0EC9 + }, + { code:0x0ECA + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0ECA + ,simpleLowerCaseMapping:0x0ECA + ,simpleTitleCaseMapping:0x0ECA + }, + { code:0x0ECB + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0ECB + ,simpleLowerCaseMapping:0x0ECB + ,simpleTitleCaseMapping:0x0ECB + }, + { code:0x0ECC + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0ECC + ,simpleLowerCaseMapping:0x0ECC + ,simpleTitleCaseMapping:0x0ECC + }, + { code:0x0ECD + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0ECD + ,simpleLowerCaseMapping:0x0ECD + ,simpleTitleCaseMapping:0x0ECD + }, + { code:0x0ED0 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0ED0 + ,simpleLowerCaseMapping:0x0ED0 + ,simpleTitleCaseMapping:0x0ED0 + }, + { code:0x0ED1 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0ED1 + ,simpleLowerCaseMapping:0x0ED1 + ,simpleTitleCaseMapping:0x0ED1 + }, + { code:0x0ED2 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0ED2 + ,simpleLowerCaseMapping:0x0ED2 + ,simpleTitleCaseMapping:0x0ED2 + }, + { code:0x0ED3 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0ED3 + ,simpleLowerCaseMapping:0x0ED3 + ,simpleTitleCaseMapping:0x0ED3 + }, + { code:0x0ED4 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0ED4 + ,simpleLowerCaseMapping:0x0ED4 + ,simpleTitleCaseMapping:0x0ED4 + }, + { code:0x0ED5 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0ED5 + ,simpleLowerCaseMapping:0x0ED5 + ,simpleTitleCaseMapping:0x0ED5 + }, + { code:0x0ED6 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0ED6 + ,simpleLowerCaseMapping:0x0ED6 + ,simpleTitleCaseMapping:0x0ED6 + }, + { code:0x0ED7 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0ED7 + ,simpleLowerCaseMapping:0x0ED7 + ,simpleTitleCaseMapping:0x0ED7 + }, + { code:0x0ED8 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0ED8 + ,simpleLowerCaseMapping:0x0ED8 + ,simpleTitleCaseMapping:0x0ED8 + }, + { code:0x0ED9 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0ED9 + ,simpleLowerCaseMapping:0x0ED9 + ,simpleTitleCaseMapping:0x0ED9 + }, + { code:0x0EDC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0EDC + ,simpleLowerCaseMapping:0x0EDC + ,simpleTitleCaseMapping:0x0EDC + }, + { code:0x0EDD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0EDD + ,simpleLowerCaseMapping:0x0EDD + ,simpleTitleCaseMapping:0x0EDD + }, + { code:0x0F00 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F00 + ,simpleLowerCaseMapping:0x0F00 + ,simpleTitleCaseMapping:0x0F00 + }, + { code:0x0F01 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0F01 + ,simpleLowerCaseMapping:0x0F01 + ,simpleTitleCaseMapping:0x0F01 + }, + { code:0x0F02 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0F02 + ,simpleLowerCaseMapping:0x0F02 + ,simpleTitleCaseMapping:0x0F02 + }, + { code:0x0F03 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0F03 + ,simpleLowerCaseMapping:0x0F03 + ,simpleTitleCaseMapping:0x0F03 + }, + { code:0x0F04 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0F04 + ,simpleLowerCaseMapping:0x0F04 + ,simpleTitleCaseMapping:0x0F04 + }, + { code:0x0F05 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0F05 + ,simpleLowerCaseMapping:0x0F05 + ,simpleTitleCaseMapping:0x0F05 + }, + { code:0x0F06 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0F06 + ,simpleLowerCaseMapping:0x0F06 + ,simpleTitleCaseMapping:0x0F06 + }, + { code:0x0F07 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0F07 + ,simpleLowerCaseMapping:0x0F07 + ,simpleTitleCaseMapping:0x0F07 + }, + { code:0x0F08 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0F08 + ,simpleLowerCaseMapping:0x0F08 + ,simpleTitleCaseMapping:0x0F08 + }, + { code:0x0F09 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0F09 + ,simpleLowerCaseMapping:0x0F09 + ,simpleTitleCaseMapping:0x0F09 + }, + { code:0x0F0A + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0F0A + ,simpleLowerCaseMapping:0x0F0A + ,simpleTitleCaseMapping:0x0F0A + }, + { code:0x0F0B + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0F0B + ,simpleLowerCaseMapping:0x0F0B + ,simpleTitleCaseMapping:0x0F0B + }, + { code:0x0F0C + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0F0C + ,simpleLowerCaseMapping:0x0F0C + ,simpleTitleCaseMapping:0x0F0C + }, + { code:0x0F0D + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0F0D + ,simpleLowerCaseMapping:0x0F0D + ,simpleTitleCaseMapping:0x0F0D + }, + { code:0x0F0E + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0F0E + ,simpleLowerCaseMapping:0x0F0E + ,simpleTitleCaseMapping:0x0F0E + }, + { code:0x0F0F + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0F0F + ,simpleLowerCaseMapping:0x0F0F + ,simpleTitleCaseMapping:0x0F0F + }, + { code:0x0F10 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0F10 + ,simpleLowerCaseMapping:0x0F10 + ,simpleTitleCaseMapping:0x0F10 + }, + { code:0x0F11 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0F11 + ,simpleLowerCaseMapping:0x0F11 + ,simpleTitleCaseMapping:0x0F11 + }, + { code:0x0F12 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0F12 + ,simpleLowerCaseMapping:0x0F12 + ,simpleTitleCaseMapping:0x0F12 + }, + { code:0x0F13 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0F13 + ,simpleLowerCaseMapping:0x0F13 + ,simpleTitleCaseMapping:0x0F13 + }, + { code:0x0F14 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0F14 + ,simpleLowerCaseMapping:0x0F14 + ,simpleTitleCaseMapping:0x0F14 + }, + { code:0x0F15 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0F15 + ,simpleLowerCaseMapping:0x0F15 + ,simpleTitleCaseMapping:0x0F15 + }, + { code:0x0F16 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0F16 + ,simpleLowerCaseMapping:0x0F16 + ,simpleTitleCaseMapping:0x0F16 + }, + { code:0x0F17 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0F17 + ,simpleLowerCaseMapping:0x0F17 + ,simpleTitleCaseMapping:0x0F17 + }, + { code:0x0F18 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F18 + ,simpleLowerCaseMapping:0x0F18 + ,simpleTitleCaseMapping:0x0F18 + }, + { code:0x0F19 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F19 + ,simpleLowerCaseMapping:0x0F19 + ,simpleTitleCaseMapping:0x0F19 + }, + { code:0x0F1A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0F1A + ,simpleLowerCaseMapping:0x0F1A + ,simpleTitleCaseMapping:0x0F1A + }, + { code:0x0F1B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0F1B + ,simpleLowerCaseMapping:0x0F1B + ,simpleTitleCaseMapping:0x0F1B + }, + { code:0x0F1C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0F1C + ,simpleLowerCaseMapping:0x0F1C + ,simpleTitleCaseMapping:0x0F1C + }, + { code:0x0F1D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0F1D + ,simpleLowerCaseMapping:0x0F1D + ,simpleTitleCaseMapping:0x0F1D + }, + { code:0x0F1E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0F1E + ,simpleLowerCaseMapping:0x0F1E + ,simpleTitleCaseMapping:0x0F1E + }, + { code:0x0F1F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0F1F + ,simpleLowerCaseMapping:0x0F1F + ,simpleTitleCaseMapping:0x0F1F + }, + { code:0x0F20 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0F20 + ,simpleLowerCaseMapping:0x0F20 + ,simpleTitleCaseMapping:0x0F20 + }, + { code:0x0F21 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0F21 + ,simpleLowerCaseMapping:0x0F21 + ,simpleTitleCaseMapping:0x0F21 + }, + { code:0x0F22 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0F22 + ,simpleLowerCaseMapping:0x0F22 + ,simpleTitleCaseMapping:0x0F22 + }, + { code:0x0F23 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0F23 + ,simpleLowerCaseMapping:0x0F23 + ,simpleTitleCaseMapping:0x0F23 + }, + { code:0x0F24 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0F24 + ,simpleLowerCaseMapping:0x0F24 + ,simpleTitleCaseMapping:0x0F24 + }, + { code:0x0F25 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0F25 + ,simpleLowerCaseMapping:0x0F25 + ,simpleTitleCaseMapping:0x0F25 + }, + { code:0x0F26 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0F26 + ,simpleLowerCaseMapping:0x0F26 + ,simpleTitleCaseMapping:0x0F26 + }, + { code:0x0F27 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0F27 + ,simpleLowerCaseMapping:0x0F27 + ,simpleTitleCaseMapping:0x0F27 + }, + { code:0x0F28 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0F28 + ,simpleLowerCaseMapping:0x0F28 + ,simpleTitleCaseMapping:0x0F28 + }, + { code:0x0F29 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x0F29 + ,simpleLowerCaseMapping:0x0F29 + ,simpleTitleCaseMapping:0x0F29 + }, + { code:0x0F2A + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x0F2A + ,simpleLowerCaseMapping:0x0F2A + ,simpleTitleCaseMapping:0x0F2A + }, + { code:0x0F2B + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x0F2B + ,simpleLowerCaseMapping:0x0F2B + ,simpleTitleCaseMapping:0x0F2B + }, + { code:0x0F2C + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x0F2C + ,simpleLowerCaseMapping:0x0F2C + ,simpleTitleCaseMapping:0x0F2C + }, + { code:0x0F2D + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x0F2D + ,simpleLowerCaseMapping:0x0F2D + ,simpleTitleCaseMapping:0x0F2D + }, + { code:0x0F2E + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x0F2E + ,simpleLowerCaseMapping:0x0F2E + ,simpleTitleCaseMapping:0x0F2E + }, + { code:0x0F2F + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x0F2F + ,simpleLowerCaseMapping:0x0F2F + ,simpleTitleCaseMapping:0x0F2F + }, + { code:0x0F30 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x0F30 + ,simpleLowerCaseMapping:0x0F30 + ,simpleTitleCaseMapping:0x0F30 + }, + { code:0x0F31 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x0F31 + ,simpleLowerCaseMapping:0x0F31 + ,simpleTitleCaseMapping:0x0F31 + }, + { code:0x0F32 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x0F32 + ,simpleLowerCaseMapping:0x0F32 + ,simpleTitleCaseMapping:0x0F32 + }, + { code:0x0F33 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x0F33 + ,simpleLowerCaseMapping:0x0F33 + ,simpleTitleCaseMapping:0x0F33 + }, + { code:0x0F34 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0F34 + ,simpleLowerCaseMapping:0x0F34 + ,simpleTitleCaseMapping:0x0F34 + }, + { code:0x0F35 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F35 + ,simpleLowerCaseMapping:0x0F35 + ,simpleTitleCaseMapping:0x0F35 + }, + { code:0x0F36 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0F36 + ,simpleLowerCaseMapping:0x0F36 + ,simpleTitleCaseMapping:0x0F36 + }, + { code:0x0F37 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F37 + ,simpleLowerCaseMapping:0x0F37 + ,simpleTitleCaseMapping:0x0F37 + }, + { code:0x0F38 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0F38 + ,simpleLowerCaseMapping:0x0F38 + ,simpleTitleCaseMapping:0x0F38 + }, + { code:0x0F39 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F39 + ,simpleLowerCaseMapping:0x0F39 + ,simpleTitleCaseMapping:0x0F39 + }, + { code:0x0F3A + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x0F3A + ,simpleLowerCaseMapping:0x0F3A + ,simpleTitleCaseMapping:0x0F3A + }, + { code:0x0F3B + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x0F3B + ,simpleLowerCaseMapping:0x0F3B + ,simpleTitleCaseMapping:0x0F3B + }, + { code:0x0F3C + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x0F3C + ,simpleLowerCaseMapping:0x0F3C + ,simpleTitleCaseMapping:0x0F3C + }, + { code:0x0F3D + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x0F3D + ,simpleLowerCaseMapping:0x0F3D + ,simpleTitleCaseMapping:0x0F3D + }, + { code:0x0F3E + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0F3E + ,simpleLowerCaseMapping:0x0F3E + ,simpleTitleCaseMapping:0x0F3E + }, + { code:0x0F3F + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0F3F + ,simpleLowerCaseMapping:0x0F3F + ,simpleTitleCaseMapping:0x0F3F + }, + { code:0x0F40 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F40 + ,simpleLowerCaseMapping:0x0F40 + ,simpleTitleCaseMapping:0x0F40 + }, + { code:0x0F41 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F41 + ,simpleLowerCaseMapping:0x0F41 + ,simpleTitleCaseMapping:0x0F41 + }, + { code:0x0F42 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F42 + ,simpleLowerCaseMapping:0x0F42 + ,simpleTitleCaseMapping:0x0F42 + }, + { code:0x0F43 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F43 + ,simpleLowerCaseMapping:0x0F43 + ,simpleTitleCaseMapping:0x0F43 + }, + { code:0x0F44 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F44 + ,simpleLowerCaseMapping:0x0F44 + ,simpleTitleCaseMapping:0x0F44 + }, + { code:0x0F45 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F45 + ,simpleLowerCaseMapping:0x0F45 + ,simpleTitleCaseMapping:0x0F45 + }, + { code:0x0F46 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F46 + ,simpleLowerCaseMapping:0x0F46 + ,simpleTitleCaseMapping:0x0F46 + }, + { code:0x0F47 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F47 + ,simpleLowerCaseMapping:0x0F47 + ,simpleTitleCaseMapping:0x0F47 + }, + { code:0x0F49 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F49 + ,simpleLowerCaseMapping:0x0F49 + ,simpleTitleCaseMapping:0x0F49 + }, + { code:0x0F4A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F4A + ,simpleLowerCaseMapping:0x0F4A + ,simpleTitleCaseMapping:0x0F4A + }, + { code:0x0F4B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F4B + ,simpleLowerCaseMapping:0x0F4B + ,simpleTitleCaseMapping:0x0F4B + }, + { code:0x0F4C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F4C + ,simpleLowerCaseMapping:0x0F4C + ,simpleTitleCaseMapping:0x0F4C + }, + { code:0x0F4D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F4D + ,simpleLowerCaseMapping:0x0F4D + ,simpleTitleCaseMapping:0x0F4D + }, + { code:0x0F4E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F4E + ,simpleLowerCaseMapping:0x0F4E + ,simpleTitleCaseMapping:0x0F4E + }, + { code:0x0F4F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F4F + ,simpleLowerCaseMapping:0x0F4F + ,simpleTitleCaseMapping:0x0F4F + }, + { code:0x0F50 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F50 + ,simpleLowerCaseMapping:0x0F50 + ,simpleTitleCaseMapping:0x0F50 + }, + { code:0x0F51 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F51 + ,simpleLowerCaseMapping:0x0F51 + ,simpleTitleCaseMapping:0x0F51 + }, + { code:0x0F52 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F52 + ,simpleLowerCaseMapping:0x0F52 + ,simpleTitleCaseMapping:0x0F52 + }, + { code:0x0F53 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F53 + ,simpleLowerCaseMapping:0x0F53 + ,simpleTitleCaseMapping:0x0F53 + }, + { code:0x0F54 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F54 + ,simpleLowerCaseMapping:0x0F54 + ,simpleTitleCaseMapping:0x0F54 + }, + { code:0x0F55 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F55 + ,simpleLowerCaseMapping:0x0F55 + ,simpleTitleCaseMapping:0x0F55 + }, + { code:0x0F56 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F56 + ,simpleLowerCaseMapping:0x0F56 + ,simpleTitleCaseMapping:0x0F56 + }, + { code:0x0F57 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F57 + ,simpleLowerCaseMapping:0x0F57 + ,simpleTitleCaseMapping:0x0F57 + }, + { code:0x0F58 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F58 + ,simpleLowerCaseMapping:0x0F58 + ,simpleTitleCaseMapping:0x0F58 + }, + { code:0x0F59 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F59 + ,simpleLowerCaseMapping:0x0F59 + ,simpleTitleCaseMapping:0x0F59 + }, + { code:0x0F5A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F5A + ,simpleLowerCaseMapping:0x0F5A + ,simpleTitleCaseMapping:0x0F5A + }, + { code:0x0F5B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F5B + ,simpleLowerCaseMapping:0x0F5B + ,simpleTitleCaseMapping:0x0F5B + }, + { code:0x0F5C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F5C + ,simpleLowerCaseMapping:0x0F5C + ,simpleTitleCaseMapping:0x0F5C + }, + { code:0x0F5D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F5D + ,simpleLowerCaseMapping:0x0F5D + ,simpleTitleCaseMapping:0x0F5D + }, + { code:0x0F5E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F5E + ,simpleLowerCaseMapping:0x0F5E + ,simpleTitleCaseMapping:0x0F5E + }, + { code:0x0F5F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F5F + ,simpleLowerCaseMapping:0x0F5F + ,simpleTitleCaseMapping:0x0F5F + }, + { code:0x0F60 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F60 + ,simpleLowerCaseMapping:0x0F60 + ,simpleTitleCaseMapping:0x0F60 + }, + { code:0x0F61 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F61 + ,simpleLowerCaseMapping:0x0F61 + ,simpleTitleCaseMapping:0x0F61 + }, + { code:0x0F62 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F62 + ,simpleLowerCaseMapping:0x0F62 + ,simpleTitleCaseMapping:0x0F62 + }, + { code:0x0F63 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F63 + ,simpleLowerCaseMapping:0x0F63 + ,simpleTitleCaseMapping:0x0F63 + }, + { code:0x0F64 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F64 + ,simpleLowerCaseMapping:0x0F64 + ,simpleTitleCaseMapping:0x0F64 + }, + { code:0x0F65 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F65 + ,simpleLowerCaseMapping:0x0F65 + ,simpleTitleCaseMapping:0x0F65 + }, + { code:0x0F66 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F66 + ,simpleLowerCaseMapping:0x0F66 + ,simpleTitleCaseMapping:0x0F66 + }, + { code:0x0F67 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F67 + ,simpleLowerCaseMapping:0x0F67 + ,simpleTitleCaseMapping:0x0F67 + }, + { code:0x0F68 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F68 + ,simpleLowerCaseMapping:0x0F68 + ,simpleTitleCaseMapping:0x0F68 + }, + { code:0x0F69 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F69 + ,simpleLowerCaseMapping:0x0F69 + ,simpleTitleCaseMapping:0x0F69 + }, + { code:0x0F6A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F6A + ,simpleLowerCaseMapping:0x0F6A + ,simpleTitleCaseMapping:0x0F6A + }, + { code:0x0F71 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F71 + ,simpleLowerCaseMapping:0x0F71 + ,simpleTitleCaseMapping:0x0F71 + }, + { code:0x0F72 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F72 + ,simpleLowerCaseMapping:0x0F72 + ,simpleTitleCaseMapping:0x0F72 + }, + { code:0x0F73 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F73 + ,simpleLowerCaseMapping:0x0F73 + ,simpleTitleCaseMapping:0x0F73 + }, + { code:0x0F74 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F74 + ,simpleLowerCaseMapping:0x0F74 + ,simpleTitleCaseMapping:0x0F74 + }, + { code:0x0F75 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F75 + ,simpleLowerCaseMapping:0x0F75 + ,simpleTitleCaseMapping:0x0F75 + }, + { code:0x0F76 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F76 + ,simpleLowerCaseMapping:0x0F76 + ,simpleTitleCaseMapping:0x0F76 + }, + { code:0x0F77 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F77 + ,simpleLowerCaseMapping:0x0F77 + ,simpleTitleCaseMapping:0x0F77 + }, + { code:0x0F78 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F78 + ,simpleLowerCaseMapping:0x0F78 + ,simpleTitleCaseMapping:0x0F78 + }, + { code:0x0F79 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F79 + ,simpleLowerCaseMapping:0x0F79 + ,simpleTitleCaseMapping:0x0F79 + }, + { code:0x0F7A + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F7A + ,simpleLowerCaseMapping:0x0F7A + ,simpleTitleCaseMapping:0x0F7A + }, + { code:0x0F7B + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F7B + ,simpleLowerCaseMapping:0x0F7B + ,simpleTitleCaseMapping:0x0F7B + }, + { code:0x0F7C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F7C + ,simpleLowerCaseMapping:0x0F7C + ,simpleTitleCaseMapping:0x0F7C + }, + { code:0x0F7D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F7D + ,simpleLowerCaseMapping:0x0F7D + ,simpleTitleCaseMapping:0x0F7D + }, + { code:0x0F7E + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F7E + ,simpleLowerCaseMapping:0x0F7E + ,simpleTitleCaseMapping:0x0F7E + }, + { code:0x0F7F + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x0F7F + ,simpleLowerCaseMapping:0x0F7F + ,simpleTitleCaseMapping:0x0F7F + }, + { code:0x0F80 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F80 + ,simpleLowerCaseMapping:0x0F80 + ,simpleTitleCaseMapping:0x0F80 + }, + { code:0x0F81 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F81 + ,simpleLowerCaseMapping:0x0F81 + ,simpleTitleCaseMapping:0x0F81 + }, + { code:0x0F82 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F82 + ,simpleLowerCaseMapping:0x0F82 + ,simpleTitleCaseMapping:0x0F82 + }, + { code:0x0F83 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F83 + ,simpleLowerCaseMapping:0x0F83 + ,simpleTitleCaseMapping:0x0F83 + }, + { code:0x0F84 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F84 + ,simpleLowerCaseMapping:0x0F84 + ,simpleTitleCaseMapping:0x0F84 + }, + { code:0x0F85 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0F85 + ,simpleLowerCaseMapping:0x0F85 + ,simpleTitleCaseMapping:0x0F85 + }, + { code:0x0F86 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F86 + ,simpleLowerCaseMapping:0x0F86 + ,simpleTitleCaseMapping:0x0F86 + }, + { code:0x0F87 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F87 + ,simpleLowerCaseMapping:0x0F87 + ,simpleTitleCaseMapping:0x0F87 + }, + { code:0x0F88 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F88 + ,simpleLowerCaseMapping:0x0F88 + ,simpleTitleCaseMapping:0x0F88 + }, + { code:0x0F89 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F89 + ,simpleLowerCaseMapping:0x0F89 + ,simpleTitleCaseMapping:0x0F89 + }, + { code:0x0F8A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F8A + ,simpleLowerCaseMapping:0x0F8A + ,simpleTitleCaseMapping:0x0F8A + }, + { code:0x0F8B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x0F8B + ,simpleLowerCaseMapping:0x0F8B + ,simpleTitleCaseMapping:0x0F8B + }, + { code:0x0F90 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F90 + ,simpleLowerCaseMapping:0x0F90 + ,simpleTitleCaseMapping:0x0F90 + }, + { code:0x0F91 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F91 + ,simpleLowerCaseMapping:0x0F91 + ,simpleTitleCaseMapping:0x0F91 + }, + { code:0x0F92 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F92 + ,simpleLowerCaseMapping:0x0F92 + ,simpleTitleCaseMapping:0x0F92 + }, + { code:0x0F93 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F93 + ,simpleLowerCaseMapping:0x0F93 + ,simpleTitleCaseMapping:0x0F93 + }, + { code:0x0F94 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F94 + ,simpleLowerCaseMapping:0x0F94 + ,simpleTitleCaseMapping:0x0F94 + }, + { code:0x0F95 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F95 + ,simpleLowerCaseMapping:0x0F95 + ,simpleTitleCaseMapping:0x0F95 + }, + { code:0x0F96 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F96 + ,simpleLowerCaseMapping:0x0F96 + ,simpleTitleCaseMapping:0x0F96 + }, + { code:0x0F97 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F97 + ,simpleLowerCaseMapping:0x0F97 + ,simpleTitleCaseMapping:0x0F97 + }, + { code:0x0F99 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F99 + ,simpleLowerCaseMapping:0x0F99 + ,simpleTitleCaseMapping:0x0F99 + }, + { code:0x0F9A + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F9A + ,simpleLowerCaseMapping:0x0F9A + ,simpleTitleCaseMapping:0x0F9A + }, + { code:0x0F9B + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F9B + ,simpleLowerCaseMapping:0x0F9B + ,simpleTitleCaseMapping:0x0F9B + }, + { code:0x0F9C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F9C + ,simpleLowerCaseMapping:0x0F9C + ,simpleTitleCaseMapping:0x0F9C + }, + { code:0x0F9D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F9D + ,simpleLowerCaseMapping:0x0F9D + ,simpleTitleCaseMapping:0x0F9D + }, + { code:0x0F9E + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F9E + ,simpleLowerCaseMapping:0x0F9E + ,simpleTitleCaseMapping:0x0F9E + }, + { code:0x0F9F + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0F9F + ,simpleLowerCaseMapping:0x0F9F + ,simpleTitleCaseMapping:0x0F9F + }, + { code:0x0FA0 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0FA0 + ,simpleLowerCaseMapping:0x0FA0 + ,simpleTitleCaseMapping:0x0FA0 + }, + { code:0x0FA1 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0FA1 + ,simpleLowerCaseMapping:0x0FA1 + ,simpleTitleCaseMapping:0x0FA1 + }, + { code:0x0FA2 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0FA2 + ,simpleLowerCaseMapping:0x0FA2 + ,simpleTitleCaseMapping:0x0FA2 + }, + { code:0x0FA3 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0FA3 + ,simpleLowerCaseMapping:0x0FA3 + ,simpleTitleCaseMapping:0x0FA3 + }, + { code:0x0FA4 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0FA4 + ,simpleLowerCaseMapping:0x0FA4 + ,simpleTitleCaseMapping:0x0FA4 + }, + { code:0x0FA5 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0FA5 + ,simpleLowerCaseMapping:0x0FA5 + ,simpleTitleCaseMapping:0x0FA5 + }, + { code:0x0FA6 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0FA6 + ,simpleLowerCaseMapping:0x0FA6 + ,simpleTitleCaseMapping:0x0FA6 + }, + { code:0x0FA7 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0FA7 + ,simpleLowerCaseMapping:0x0FA7 + ,simpleTitleCaseMapping:0x0FA7 + }, + { code:0x0FA8 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0FA8 + ,simpleLowerCaseMapping:0x0FA8 + ,simpleTitleCaseMapping:0x0FA8 + }, + { code:0x0FA9 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0FA9 + ,simpleLowerCaseMapping:0x0FA9 + ,simpleTitleCaseMapping:0x0FA9 + }, + { code:0x0FAA + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0FAA + ,simpleLowerCaseMapping:0x0FAA + ,simpleTitleCaseMapping:0x0FAA + }, + { code:0x0FAB + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0FAB + ,simpleLowerCaseMapping:0x0FAB + ,simpleTitleCaseMapping:0x0FAB + }, + { code:0x0FAC + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0FAC + ,simpleLowerCaseMapping:0x0FAC + ,simpleTitleCaseMapping:0x0FAC + }, + { code:0x0FAD + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0FAD + ,simpleLowerCaseMapping:0x0FAD + ,simpleTitleCaseMapping:0x0FAD + }, + { code:0x0FAE + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0FAE + ,simpleLowerCaseMapping:0x0FAE + ,simpleTitleCaseMapping:0x0FAE + }, + { code:0x0FAF + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0FAF + ,simpleLowerCaseMapping:0x0FAF + ,simpleTitleCaseMapping:0x0FAF + }, + { code:0x0FB0 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0FB0 + ,simpleLowerCaseMapping:0x0FB0 + ,simpleTitleCaseMapping:0x0FB0 + }, + { code:0x0FB1 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0FB1 + ,simpleLowerCaseMapping:0x0FB1 + ,simpleTitleCaseMapping:0x0FB1 + }, + { code:0x0FB2 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0FB2 + ,simpleLowerCaseMapping:0x0FB2 + ,simpleTitleCaseMapping:0x0FB2 + }, + { code:0x0FB3 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0FB3 + ,simpleLowerCaseMapping:0x0FB3 + ,simpleTitleCaseMapping:0x0FB3 + }, + { code:0x0FB4 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0FB4 + ,simpleLowerCaseMapping:0x0FB4 + ,simpleTitleCaseMapping:0x0FB4 + }, + { code:0x0FB5 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0FB5 + ,simpleLowerCaseMapping:0x0FB5 + ,simpleTitleCaseMapping:0x0FB5 + }, + { code:0x0FB6 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0FB6 + ,simpleLowerCaseMapping:0x0FB6 + ,simpleTitleCaseMapping:0x0FB6 + }, + { code:0x0FB7 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0FB7 + ,simpleLowerCaseMapping:0x0FB7 + ,simpleTitleCaseMapping:0x0FB7 + }, + { code:0x0FB8 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0FB8 + ,simpleLowerCaseMapping:0x0FB8 + ,simpleTitleCaseMapping:0x0FB8 + }, + { code:0x0FB9 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0FB9 + ,simpleLowerCaseMapping:0x0FB9 + ,simpleTitleCaseMapping:0x0FB9 + }, + { code:0x0FBA + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0FBA + ,simpleLowerCaseMapping:0x0FBA + ,simpleTitleCaseMapping:0x0FBA + }, + { code:0x0FBB + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0FBB + ,simpleLowerCaseMapping:0x0FBB + ,simpleTitleCaseMapping:0x0FBB + }, + { code:0x0FBC + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0FBC + ,simpleLowerCaseMapping:0x0FBC + ,simpleTitleCaseMapping:0x0FBC + }, + { code:0x0FBE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0FBE + ,simpleLowerCaseMapping:0x0FBE + ,simpleTitleCaseMapping:0x0FBE + }, + { code:0x0FBF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0FBF + ,simpleLowerCaseMapping:0x0FBF + ,simpleTitleCaseMapping:0x0FBF + }, + { code:0x0FC0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0FC0 + ,simpleLowerCaseMapping:0x0FC0 + ,simpleTitleCaseMapping:0x0FC0 + }, + { code:0x0FC1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0FC1 + ,simpleLowerCaseMapping:0x0FC1 + ,simpleTitleCaseMapping:0x0FC1 + }, + { code:0x0FC2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0FC2 + ,simpleLowerCaseMapping:0x0FC2 + ,simpleTitleCaseMapping:0x0FC2 + }, + { code:0x0FC3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0FC3 + ,simpleLowerCaseMapping:0x0FC3 + ,simpleTitleCaseMapping:0x0FC3 + }, + { code:0x0FC4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0FC4 + ,simpleLowerCaseMapping:0x0FC4 + ,simpleTitleCaseMapping:0x0FC4 + }, + { code:0x0FC5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0FC5 + ,simpleLowerCaseMapping:0x0FC5 + ,simpleTitleCaseMapping:0x0FC5 + }, + { code:0x0FC6 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x0FC6 + ,simpleLowerCaseMapping:0x0FC6 + ,simpleTitleCaseMapping:0x0FC6 + }, + { code:0x0FC7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0FC7 + ,simpleLowerCaseMapping:0x0FC7 + ,simpleTitleCaseMapping:0x0FC7 + }, + { code:0x0FC8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0FC8 + ,simpleLowerCaseMapping:0x0FC8 + ,simpleTitleCaseMapping:0x0FC8 + }, + { code:0x0FC9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0FC9 + ,simpleLowerCaseMapping:0x0FC9 + ,simpleTitleCaseMapping:0x0FC9 + }, + { code:0x0FCA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0FCA + ,simpleLowerCaseMapping:0x0FCA + ,simpleTitleCaseMapping:0x0FCA + }, + { code:0x0FCB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0FCB + ,simpleLowerCaseMapping:0x0FCB + ,simpleTitleCaseMapping:0x0FCB + }, + { code:0x0FCC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0FCC + ,simpleLowerCaseMapping:0x0FCC + ,simpleTitleCaseMapping:0x0FCC + }, + { code:0x0FCF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x0FCF + ,simpleLowerCaseMapping:0x0FCF + ,simpleTitleCaseMapping:0x0FCF + }, + { code:0x0FD0 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0FD0 + ,simpleLowerCaseMapping:0x0FD0 + ,simpleTitleCaseMapping:0x0FD0 + }, + { code:0x0FD1 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x0FD1 + ,simpleLowerCaseMapping:0x0FD1 + ,simpleTitleCaseMapping:0x0FD1 + }, + { code:0x1000 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1000 + ,simpleLowerCaseMapping:0x1000 + ,simpleTitleCaseMapping:0x1000 + }, + { code:0x1001 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1001 + ,simpleLowerCaseMapping:0x1001 + ,simpleTitleCaseMapping:0x1001 + }, + { code:0x1002 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1002 + ,simpleLowerCaseMapping:0x1002 + ,simpleTitleCaseMapping:0x1002 + }, + { code:0x1003 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1003 + ,simpleLowerCaseMapping:0x1003 + ,simpleTitleCaseMapping:0x1003 + }, + { code:0x1004 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1004 + ,simpleLowerCaseMapping:0x1004 + ,simpleTitleCaseMapping:0x1004 + }, + { code:0x1005 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1005 + ,simpleLowerCaseMapping:0x1005 + ,simpleTitleCaseMapping:0x1005 + }, + { code:0x1006 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1006 + ,simpleLowerCaseMapping:0x1006 + ,simpleTitleCaseMapping:0x1006 + }, + { code:0x1007 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1007 + ,simpleLowerCaseMapping:0x1007 + ,simpleTitleCaseMapping:0x1007 + }, + { code:0x1008 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1008 + ,simpleLowerCaseMapping:0x1008 + ,simpleTitleCaseMapping:0x1008 + }, + { code:0x1009 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1009 + ,simpleLowerCaseMapping:0x1009 + ,simpleTitleCaseMapping:0x1009 + }, + { code:0x100A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100A + ,simpleLowerCaseMapping:0x100A + ,simpleTitleCaseMapping:0x100A + }, + { code:0x100B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100B + ,simpleLowerCaseMapping:0x100B + ,simpleTitleCaseMapping:0x100B + }, + { code:0x100C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100C + ,simpleLowerCaseMapping:0x100C + ,simpleTitleCaseMapping:0x100C + }, + { code:0x100D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100D + ,simpleLowerCaseMapping:0x100D + ,simpleTitleCaseMapping:0x100D + }, + { code:0x100E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100E + ,simpleLowerCaseMapping:0x100E + ,simpleTitleCaseMapping:0x100E + }, + { code:0x100F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100F + ,simpleLowerCaseMapping:0x100F + ,simpleTitleCaseMapping:0x100F + }, + { code:0x1010 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1010 + ,simpleLowerCaseMapping:0x1010 + ,simpleTitleCaseMapping:0x1010 + }, + { code:0x1011 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1011 + ,simpleLowerCaseMapping:0x1011 + ,simpleTitleCaseMapping:0x1011 + }, + { code:0x1012 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1012 + ,simpleLowerCaseMapping:0x1012 + ,simpleTitleCaseMapping:0x1012 + }, + { code:0x1013 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1013 + ,simpleLowerCaseMapping:0x1013 + ,simpleTitleCaseMapping:0x1013 + }, + { code:0x1014 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1014 + ,simpleLowerCaseMapping:0x1014 + ,simpleTitleCaseMapping:0x1014 + }, + { code:0x1015 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1015 + ,simpleLowerCaseMapping:0x1015 + ,simpleTitleCaseMapping:0x1015 + }, + { code:0x1016 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1016 + ,simpleLowerCaseMapping:0x1016 + ,simpleTitleCaseMapping:0x1016 + }, + { code:0x1017 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1017 + ,simpleLowerCaseMapping:0x1017 + ,simpleTitleCaseMapping:0x1017 + }, + { code:0x1018 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1018 + ,simpleLowerCaseMapping:0x1018 + ,simpleTitleCaseMapping:0x1018 + }, + { code:0x1019 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1019 + ,simpleLowerCaseMapping:0x1019 + ,simpleTitleCaseMapping:0x1019 + }, + { code:0x101A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x101A + ,simpleLowerCaseMapping:0x101A + ,simpleTitleCaseMapping:0x101A + }, + { code:0x101B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x101B + ,simpleLowerCaseMapping:0x101B + ,simpleTitleCaseMapping:0x101B + }, + { code:0x101C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x101C + ,simpleLowerCaseMapping:0x101C + ,simpleTitleCaseMapping:0x101C + }, + { code:0x101D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x101D + ,simpleLowerCaseMapping:0x101D + ,simpleTitleCaseMapping:0x101D + }, + { code:0x101E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x101E + ,simpleLowerCaseMapping:0x101E + ,simpleTitleCaseMapping:0x101E + }, + { code:0x101F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x101F + ,simpleLowerCaseMapping:0x101F + ,simpleTitleCaseMapping:0x101F + }, + { code:0x1020 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1020 + ,simpleLowerCaseMapping:0x1020 + ,simpleTitleCaseMapping:0x1020 + }, + { code:0x1021 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1021 + ,simpleLowerCaseMapping:0x1021 + ,simpleTitleCaseMapping:0x1021 + }, + { code:0x1023 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1023 + ,simpleLowerCaseMapping:0x1023 + ,simpleTitleCaseMapping:0x1023 + }, + { code:0x1024 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1024 + ,simpleLowerCaseMapping:0x1024 + ,simpleTitleCaseMapping:0x1024 + }, + { code:0x1025 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1025 + ,simpleLowerCaseMapping:0x1025 + ,simpleTitleCaseMapping:0x1025 + }, + { code:0x1026 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1026 + ,simpleLowerCaseMapping:0x1026 + ,simpleTitleCaseMapping:0x1026 + }, + { code:0x1027 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1027 + ,simpleLowerCaseMapping:0x1027 + ,simpleTitleCaseMapping:0x1027 + }, + { code:0x1029 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1029 + ,simpleLowerCaseMapping:0x1029 + ,simpleTitleCaseMapping:0x1029 + }, + { code:0x102A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x102A + ,simpleLowerCaseMapping:0x102A + ,simpleTitleCaseMapping:0x102A + }, + { code:0x102C + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x102C + ,simpleLowerCaseMapping:0x102C + ,simpleTitleCaseMapping:0x102C + }, + { code:0x102D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x102D + ,simpleLowerCaseMapping:0x102D + ,simpleTitleCaseMapping:0x102D + }, + { code:0x102E + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x102E + ,simpleLowerCaseMapping:0x102E + ,simpleTitleCaseMapping:0x102E + }, + { code:0x102F + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x102F + ,simpleLowerCaseMapping:0x102F + ,simpleTitleCaseMapping:0x102F + }, + { code:0x1030 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1030 + ,simpleLowerCaseMapping:0x1030 + ,simpleTitleCaseMapping:0x1030 + }, + { code:0x1031 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1031 + ,simpleLowerCaseMapping:0x1031 + ,simpleTitleCaseMapping:0x1031 + }, + { code:0x1032 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1032 + ,simpleLowerCaseMapping:0x1032 + ,simpleTitleCaseMapping:0x1032 + }, + { code:0x1036 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1036 + ,simpleLowerCaseMapping:0x1036 + ,simpleTitleCaseMapping:0x1036 + }, + { code:0x1037 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1037 + ,simpleLowerCaseMapping:0x1037 + ,simpleTitleCaseMapping:0x1037 + }, + { code:0x1038 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1038 + ,simpleLowerCaseMapping:0x1038 + ,simpleTitleCaseMapping:0x1038 + }, + { code:0x1039 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1039 + ,simpleLowerCaseMapping:0x1039 + ,simpleTitleCaseMapping:0x1039 + }, + { code:0x1040 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1040 + ,simpleLowerCaseMapping:0x1040 + ,simpleTitleCaseMapping:0x1040 + }, + { code:0x1041 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1041 + ,simpleLowerCaseMapping:0x1041 + ,simpleTitleCaseMapping:0x1041 + }, + { code:0x1042 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1042 + ,simpleLowerCaseMapping:0x1042 + ,simpleTitleCaseMapping:0x1042 + }, + { code:0x1043 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1043 + ,simpleLowerCaseMapping:0x1043 + ,simpleTitleCaseMapping:0x1043 + }, + { code:0x1044 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1044 + ,simpleLowerCaseMapping:0x1044 + ,simpleTitleCaseMapping:0x1044 + }, + { code:0x1045 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1045 + ,simpleLowerCaseMapping:0x1045 + ,simpleTitleCaseMapping:0x1045 + }, + { code:0x1046 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1046 + ,simpleLowerCaseMapping:0x1046 + ,simpleTitleCaseMapping:0x1046 + }, + { code:0x1047 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1047 + ,simpleLowerCaseMapping:0x1047 + ,simpleTitleCaseMapping:0x1047 + }, + { code:0x1048 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1048 + ,simpleLowerCaseMapping:0x1048 + ,simpleTitleCaseMapping:0x1048 + }, + { code:0x1049 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1049 + ,simpleLowerCaseMapping:0x1049 + ,simpleTitleCaseMapping:0x1049 + }, + { code:0x104A + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x104A + ,simpleLowerCaseMapping:0x104A + ,simpleTitleCaseMapping:0x104A + }, + { code:0x104B + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x104B + ,simpleLowerCaseMapping:0x104B + ,simpleTitleCaseMapping:0x104B + }, + { code:0x104C + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x104C + ,simpleLowerCaseMapping:0x104C + ,simpleTitleCaseMapping:0x104C + }, + { code:0x104D + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x104D + ,simpleLowerCaseMapping:0x104D + ,simpleTitleCaseMapping:0x104D + }, + { code:0x104E + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x104E + ,simpleLowerCaseMapping:0x104E + ,simpleTitleCaseMapping:0x104E + }, + { code:0x104F + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x104F + ,simpleLowerCaseMapping:0x104F + ,simpleTitleCaseMapping:0x104F + }, + { code:0x1050 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1050 + ,simpleLowerCaseMapping:0x1050 + ,simpleTitleCaseMapping:0x1050 + }, + { code:0x1051 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1051 + ,simpleLowerCaseMapping:0x1051 + ,simpleTitleCaseMapping:0x1051 + }, + { code:0x1052 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1052 + ,simpleLowerCaseMapping:0x1052 + ,simpleTitleCaseMapping:0x1052 + }, + { code:0x1053 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1053 + ,simpleLowerCaseMapping:0x1053 + ,simpleTitleCaseMapping:0x1053 + }, + { code:0x1054 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1054 + ,simpleLowerCaseMapping:0x1054 + ,simpleTitleCaseMapping:0x1054 + }, + { code:0x1055 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1055 + ,simpleLowerCaseMapping:0x1055 + ,simpleTitleCaseMapping:0x1055 + }, + { code:0x1056 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1056 + ,simpleLowerCaseMapping:0x1056 + ,simpleTitleCaseMapping:0x1056 + }, + { code:0x1057 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1057 + ,simpleLowerCaseMapping:0x1057 + ,simpleTitleCaseMapping:0x1057 + }, + { code:0x1058 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1058 + ,simpleLowerCaseMapping:0x1058 + ,simpleTitleCaseMapping:0x1058 + }, + { code:0x1059 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1059 + ,simpleLowerCaseMapping:0x1059 + ,simpleTitleCaseMapping:0x1059 + }, + { code:0x10A0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10A0 + ,simpleLowerCaseMapping:0x2D00 + ,simpleTitleCaseMapping:0x10A0 + }, + { code:0x10A1 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10A1 + ,simpleLowerCaseMapping:0x2D01 + ,simpleTitleCaseMapping:0x10A1 + }, + { code:0x10A2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10A2 + ,simpleLowerCaseMapping:0x2D02 + ,simpleTitleCaseMapping:0x10A2 + }, + { code:0x10A3 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10A3 + ,simpleLowerCaseMapping:0x2D03 + ,simpleTitleCaseMapping:0x10A3 + }, + { code:0x10A4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10A4 + ,simpleLowerCaseMapping:0x2D04 + ,simpleTitleCaseMapping:0x10A4 + }, + { code:0x10A5 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10A5 + ,simpleLowerCaseMapping:0x2D05 + ,simpleTitleCaseMapping:0x10A5 + }, + { code:0x10A6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10A6 + ,simpleLowerCaseMapping:0x2D06 + ,simpleTitleCaseMapping:0x10A6 + }, + { code:0x10A7 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10A7 + ,simpleLowerCaseMapping:0x2D07 + ,simpleTitleCaseMapping:0x10A7 + }, + { code:0x10A8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10A8 + ,simpleLowerCaseMapping:0x2D08 + ,simpleTitleCaseMapping:0x10A8 + }, + { code:0x10A9 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10A9 + ,simpleLowerCaseMapping:0x2D09 + ,simpleTitleCaseMapping:0x10A9 + }, + { code:0x10AA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10AA + ,simpleLowerCaseMapping:0x2D0A + ,simpleTitleCaseMapping:0x10AA + }, + { code:0x10AB + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10AB + ,simpleLowerCaseMapping:0x2D0B + ,simpleTitleCaseMapping:0x10AB + }, + { code:0x10AC + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10AC + ,simpleLowerCaseMapping:0x2D0C + ,simpleTitleCaseMapping:0x10AC + }, + { code:0x10AD + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10AD + ,simpleLowerCaseMapping:0x2D0D + ,simpleTitleCaseMapping:0x10AD + }, + { code:0x10AE + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10AE + ,simpleLowerCaseMapping:0x2D0E + ,simpleTitleCaseMapping:0x10AE + }, + { code:0x10AF + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10AF + ,simpleLowerCaseMapping:0x2D0F + ,simpleTitleCaseMapping:0x10AF + }, + { code:0x10B0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10B0 + ,simpleLowerCaseMapping:0x2D10 + ,simpleTitleCaseMapping:0x10B0 + }, + { code:0x10B1 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10B1 + ,simpleLowerCaseMapping:0x2D11 + ,simpleTitleCaseMapping:0x10B1 + }, + { code:0x10B2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10B2 + ,simpleLowerCaseMapping:0x2D12 + ,simpleTitleCaseMapping:0x10B2 + }, + { code:0x10B3 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10B3 + ,simpleLowerCaseMapping:0x2D13 + ,simpleTitleCaseMapping:0x10B3 + }, + { code:0x10B4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10B4 + ,simpleLowerCaseMapping:0x2D14 + ,simpleTitleCaseMapping:0x10B4 + }, + { code:0x10B5 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10B5 + ,simpleLowerCaseMapping:0x2D15 + ,simpleTitleCaseMapping:0x10B5 + }, + { code:0x10B6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10B6 + ,simpleLowerCaseMapping:0x2D16 + ,simpleTitleCaseMapping:0x10B6 + }, + { code:0x10B7 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10B7 + ,simpleLowerCaseMapping:0x2D17 + ,simpleTitleCaseMapping:0x10B7 + }, + { code:0x10B8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10B8 + ,simpleLowerCaseMapping:0x2D18 + ,simpleTitleCaseMapping:0x10B8 + }, + { code:0x10B9 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10B9 + ,simpleLowerCaseMapping:0x2D19 + ,simpleTitleCaseMapping:0x10B9 + }, + { code:0x10BA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10BA + ,simpleLowerCaseMapping:0x2D1A + ,simpleTitleCaseMapping:0x10BA + }, + { code:0x10BB + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10BB + ,simpleLowerCaseMapping:0x2D1B + ,simpleTitleCaseMapping:0x10BB + }, + { code:0x10BC + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10BC + ,simpleLowerCaseMapping:0x2D1C + ,simpleTitleCaseMapping:0x10BC + }, + { code:0x10BD + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10BD + ,simpleLowerCaseMapping:0x2D1D + ,simpleTitleCaseMapping:0x10BD + }, + { code:0x10BE + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10BE + ,simpleLowerCaseMapping:0x2D1E + ,simpleTitleCaseMapping:0x10BE + }, + { code:0x10BF + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10BF + ,simpleLowerCaseMapping:0x2D1F + ,simpleTitleCaseMapping:0x10BF + }, + { code:0x10C0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10C0 + ,simpleLowerCaseMapping:0x2D20 + ,simpleTitleCaseMapping:0x10C0 + }, + { code:0x10C1 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10C1 + ,simpleLowerCaseMapping:0x2D21 + ,simpleTitleCaseMapping:0x10C1 + }, + { code:0x10C2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10C2 + ,simpleLowerCaseMapping:0x2D22 + ,simpleTitleCaseMapping:0x10C2 + }, + { code:0x10C3 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10C3 + ,simpleLowerCaseMapping:0x2D23 + ,simpleTitleCaseMapping:0x10C3 + }, + { code:0x10C4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10C4 + ,simpleLowerCaseMapping:0x2D24 + ,simpleTitleCaseMapping:0x10C4 + }, + { code:0x10C5 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10C5 + ,simpleLowerCaseMapping:0x2D25 + ,simpleTitleCaseMapping:0x10C5 + }, + { code:0x10D0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10D0 + ,simpleLowerCaseMapping:0x10D0 + ,simpleTitleCaseMapping:0x10D0 + }, + { code:0x10D1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10D1 + ,simpleLowerCaseMapping:0x10D1 + ,simpleTitleCaseMapping:0x10D1 + }, + { code:0x10D2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10D2 + ,simpleLowerCaseMapping:0x10D2 + ,simpleTitleCaseMapping:0x10D2 + }, + { code:0x10D3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10D3 + ,simpleLowerCaseMapping:0x10D3 + ,simpleTitleCaseMapping:0x10D3 + }, + { code:0x10D4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10D4 + ,simpleLowerCaseMapping:0x10D4 + ,simpleTitleCaseMapping:0x10D4 + }, + { code:0x10D5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10D5 + ,simpleLowerCaseMapping:0x10D5 + ,simpleTitleCaseMapping:0x10D5 + }, + { code:0x10D6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10D6 + ,simpleLowerCaseMapping:0x10D6 + ,simpleTitleCaseMapping:0x10D6 + }, + { code:0x10D7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10D7 + ,simpleLowerCaseMapping:0x10D7 + ,simpleTitleCaseMapping:0x10D7 + }, + { code:0x10D8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10D8 + ,simpleLowerCaseMapping:0x10D8 + ,simpleTitleCaseMapping:0x10D8 + }, + { code:0x10D9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10D9 + ,simpleLowerCaseMapping:0x10D9 + ,simpleTitleCaseMapping:0x10D9 + }, + { code:0x10DA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10DA + ,simpleLowerCaseMapping:0x10DA + ,simpleTitleCaseMapping:0x10DA + }, + { code:0x10DB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10DB + ,simpleLowerCaseMapping:0x10DB + ,simpleTitleCaseMapping:0x10DB + }, + { code:0x10DC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10DC + ,simpleLowerCaseMapping:0x10DC + ,simpleTitleCaseMapping:0x10DC + }, + { code:0x10DD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10DD + ,simpleLowerCaseMapping:0x10DD + ,simpleTitleCaseMapping:0x10DD + }, + { code:0x10DE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10DE + ,simpleLowerCaseMapping:0x10DE + ,simpleTitleCaseMapping:0x10DE + }, + { code:0x10DF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10DF + ,simpleLowerCaseMapping:0x10DF + ,simpleTitleCaseMapping:0x10DF + }, + { code:0x10E0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10E0 + ,simpleLowerCaseMapping:0x10E0 + ,simpleTitleCaseMapping:0x10E0 + }, + { code:0x10E1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10E1 + ,simpleLowerCaseMapping:0x10E1 + ,simpleTitleCaseMapping:0x10E1 + }, + { code:0x10E2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10E2 + ,simpleLowerCaseMapping:0x10E2 + ,simpleTitleCaseMapping:0x10E2 + }, + { code:0x10E3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10E3 + ,simpleLowerCaseMapping:0x10E3 + ,simpleTitleCaseMapping:0x10E3 + }, + { code:0x10E4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10E4 + ,simpleLowerCaseMapping:0x10E4 + ,simpleTitleCaseMapping:0x10E4 + }, + { code:0x10E5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10E5 + ,simpleLowerCaseMapping:0x10E5 + ,simpleTitleCaseMapping:0x10E5 + }, + { code:0x10E6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10E6 + ,simpleLowerCaseMapping:0x10E6 + ,simpleTitleCaseMapping:0x10E6 + }, + { code:0x10E7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10E7 + ,simpleLowerCaseMapping:0x10E7 + ,simpleTitleCaseMapping:0x10E7 + }, + { code:0x10E8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10E8 + ,simpleLowerCaseMapping:0x10E8 + ,simpleTitleCaseMapping:0x10E8 + }, + { code:0x10E9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10E9 + ,simpleLowerCaseMapping:0x10E9 + ,simpleTitleCaseMapping:0x10E9 + }, + { code:0x10EA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10EA + ,simpleLowerCaseMapping:0x10EA + ,simpleTitleCaseMapping:0x10EA + }, + { code:0x10EB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10EB + ,simpleLowerCaseMapping:0x10EB + ,simpleTitleCaseMapping:0x10EB + }, + { code:0x10EC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10EC + ,simpleLowerCaseMapping:0x10EC + ,simpleTitleCaseMapping:0x10EC + }, + { code:0x10ED + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10ED + ,simpleLowerCaseMapping:0x10ED + ,simpleTitleCaseMapping:0x10ED + }, + { code:0x10EE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10EE + ,simpleLowerCaseMapping:0x10EE + ,simpleTitleCaseMapping:0x10EE + }, + { code:0x10EF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10EF + ,simpleLowerCaseMapping:0x10EF + ,simpleTitleCaseMapping:0x10EF + }, + { code:0x10F0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10F0 + ,simpleLowerCaseMapping:0x10F0 + ,simpleTitleCaseMapping:0x10F0 + }, + { code:0x10F1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10F1 + ,simpleLowerCaseMapping:0x10F1 + ,simpleTitleCaseMapping:0x10F1 + }, + { code:0x10F2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10F2 + ,simpleLowerCaseMapping:0x10F2 + ,simpleTitleCaseMapping:0x10F2 + }, + { code:0x10F3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10F3 + ,simpleLowerCaseMapping:0x10F3 + ,simpleTitleCaseMapping:0x10F3 + }, + { code:0x10F4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10F4 + ,simpleLowerCaseMapping:0x10F4 + ,simpleTitleCaseMapping:0x10F4 + }, + { code:0x10F5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10F5 + ,simpleLowerCaseMapping:0x10F5 + ,simpleTitleCaseMapping:0x10F5 + }, + { code:0x10F6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10F6 + ,simpleLowerCaseMapping:0x10F6 + ,simpleTitleCaseMapping:0x10F6 + }, + { code:0x10F7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10F7 + ,simpleLowerCaseMapping:0x10F7 + ,simpleTitleCaseMapping:0x10F7 + }, + { code:0x10F8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10F8 + ,simpleLowerCaseMapping:0x10F8 + ,simpleTitleCaseMapping:0x10F8 + }, + { code:0x10F9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10F9 + ,simpleLowerCaseMapping:0x10F9 + ,simpleTitleCaseMapping:0x10F9 + }, + { code:0x10FA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10FA + ,simpleLowerCaseMapping:0x10FA + ,simpleTitleCaseMapping:0x10FA + }, + { code:0x10FB + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x10FB + ,simpleLowerCaseMapping:0x10FB + ,simpleTitleCaseMapping:0x10FB + }, + { code:0x10FC + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x10FC + ,simpleLowerCaseMapping:0x10FC + ,simpleTitleCaseMapping:0x10FC + }, + { code:0x1100 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1100 + ,simpleLowerCaseMapping:0x1100 + ,simpleTitleCaseMapping:0x1100 + }, + { code:0x1101 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1101 + ,simpleLowerCaseMapping:0x1101 + ,simpleTitleCaseMapping:0x1101 + }, + { code:0x1102 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1102 + ,simpleLowerCaseMapping:0x1102 + ,simpleTitleCaseMapping:0x1102 + }, + { code:0x1103 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1103 + ,simpleLowerCaseMapping:0x1103 + ,simpleTitleCaseMapping:0x1103 + }, + { code:0x1104 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1104 + ,simpleLowerCaseMapping:0x1104 + ,simpleTitleCaseMapping:0x1104 + }, + { code:0x1105 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1105 + ,simpleLowerCaseMapping:0x1105 + ,simpleTitleCaseMapping:0x1105 + }, + { code:0x1106 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1106 + ,simpleLowerCaseMapping:0x1106 + ,simpleTitleCaseMapping:0x1106 + }, + { code:0x1107 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1107 + ,simpleLowerCaseMapping:0x1107 + ,simpleTitleCaseMapping:0x1107 + }, + { code:0x1108 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1108 + ,simpleLowerCaseMapping:0x1108 + ,simpleTitleCaseMapping:0x1108 + }, + { code:0x1109 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1109 + ,simpleLowerCaseMapping:0x1109 + ,simpleTitleCaseMapping:0x1109 + }, + { code:0x110A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x110A + ,simpleLowerCaseMapping:0x110A + ,simpleTitleCaseMapping:0x110A + }, + { code:0x110B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x110B + ,simpleLowerCaseMapping:0x110B + ,simpleTitleCaseMapping:0x110B + }, + { code:0x110C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x110C + ,simpleLowerCaseMapping:0x110C + ,simpleTitleCaseMapping:0x110C + }, + { code:0x110D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x110D + ,simpleLowerCaseMapping:0x110D + ,simpleTitleCaseMapping:0x110D + }, + { code:0x110E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x110E + ,simpleLowerCaseMapping:0x110E + ,simpleTitleCaseMapping:0x110E + }, + { code:0x110F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x110F + ,simpleLowerCaseMapping:0x110F + ,simpleTitleCaseMapping:0x110F + }, + { code:0x1110 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1110 + ,simpleLowerCaseMapping:0x1110 + ,simpleTitleCaseMapping:0x1110 + }, + { code:0x1111 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1111 + ,simpleLowerCaseMapping:0x1111 + ,simpleTitleCaseMapping:0x1111 + }, + { code:0x1112 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1112 + ,simpleLowerCaseMapping:0x1112 + ,simpleTitleCaseMapping:0x1112 + }, + { code:0x1113 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1113 + ,simpleLowerCaseMapping:0x1113 + ,simpleTitleCaseMapping:0x1113 + }, + { code:0x1114 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1114 + ,simpleLowerCaseMapping:0x1114 + ,simpleTitleCaseMapping:0x1114 + }, + { code:0x1115 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1115 + ,simpleLowerCaseMapping:0x1115 + ,simpleTitleCaseMapping:0x1115 + }, + { code:0x1116 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1116 + ,simpleLowerCaseMapping:0x1116 + ,simpleTitleCaseMapping:0x1116 + }, + { code:0x1117 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1117 + ,simpleLowerCaseMapping:0x1117 + ,simpleTitleCaseMapping:0x1117 + }, + { code:0x1118 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1118 + ,simpleLowerCaseMapping:0x1118 + ,simpleTitleCaseMapping:0x1118 + }, + { code:0x1119 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1119 + ,simpleLowerCaseMapping:0x1119 + ,simpleTitleCaseMapping:0x1119 + }, + { code:0x111A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x111A + ,simpleLowerCaseMapping:0x111A + ,simpleTitleCaseMapping:0x111A + }, + { code:0x111B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x111B + ,simpleLowerCaseMapping:0x111B + ,simpleTitleCaseMapping:0x111B + }, + { code:0x111C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x111C + ,simpleLowerCaseMapping:0x111C + ,simpleTitleCaseMapping:0x111C + }, + { code:0x111D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x111D + ,simpleLowerCaseMapping:0x111D + ,simpleTitleCaseMapping:0x111D + }, + { code:0x111E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x111E + ,simpleLowerCaseMapping:0x111E + ,simpleTitleCaseMapping:0x111E + }, + { code:0x111F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x111F + ,simpleLowerCaseMapping:0x111F + ,simpleTitleCaseMapping:0x111F + }, + { code:0x1120 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1120 + ,simpleLowerCaseMapping:0x1120 + ,simpleTitleCaseMapping:0x1120 + }, + { code:0x1121 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1121 + ,simpleLowerCaseMapping:0x1121 + ,simpleTitleCaseMapping:0x1121 + }, + { code:0x1122 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1122 + ,simpleLowerCaseMapping:0x1122 + ,simpleTitleCaseMapping:0x1122 + }, + { code:0x1123 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1123 + ,simpleLowerCaseMapping:0x1123 + ,simpleTitleCaseMapping:0x1123 + }, + { code:0x1124 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1124 + ,simpleLowerCaseMapping:0x1124 + ,simpleTitleCaseMapping:0x1124 + }, + { code:0x1125 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1125 + ,simpleLowerCaseMapping:0x1125 + ,simpleTitleCaseMapping:0x1125 + }, + { code:0x1126 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1126 + ,simpleLowerCaseMapping:0x1126 + ,simpleTitleCaseMapping:0x1126 + }, + { code:0x1127 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1127 + ,simpleLowerCaseMapping:0x1127 + ,simpleTitleCaseMapping:0x1127 + }, + { code:0x1128 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1128 + ,simpleLowerCaseMapping:0x1128 + ,simpleTitleCaseMapping:0x1128 + }, + { code:0x1129 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1129 + ,simpleLowerCaseMapping:0x1129 + ,simpleTitleCaseMapping:0x1129 + }, + { code:0x112A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x112A + ,simpleLowerCaseMapping:0x112A + ,simpleTitleCaseMapping:0x112A + }, + { code:0x112B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x112B + ,simpleLowerCaseMapping:0x112B + ,simpleTitleCaseMapping:0x112B + }, + { code:0x112C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x112C + ,simpleLowerCaseMapping:0x112C + ,simpleTitleCaseMapping:0x112C + }, + { code:0x112D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x112D + ,simpleLowerCaseMapping:0x112D + ,simpleTitleCaseMapping:0x112D + }, + { code:0x112E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x112E + ,simpleLowerCaseMapping:0x112E + ,simpleTitleCaseMapping:0x112E + }, + { code:0x112F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x112F + ,simpleLowerCaseMapping:0x112F + ,simpleTitleCaseMapping:0x112F + }, + { code:0x1130 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1130 + ,simpleLowerCaseMapping:0x1130 + ,simpleTitleCaseMapping:0x1130 + }, + { code:0x1131 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1131 + ,simpleLowerCaseMapping:0x1131 + ,simpleTitleCaseMapping:0x1131 + }, + { code:0x1132 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1132 + ,simpleLowerCaseMapping:0x1132 + ,simpleTitleCaseMapping:0x1132 + }, + { code:0x1133 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1133 + ,simpleLowerCaseMapping:0x1133 + ,simpleTitleCaseMapping:0x1133 + }, + { code:0x1134 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1134 + ,simpleLowerCaseMapping:0x1134 + ,simpleTitleCaseMapping:0x1134 + }, + { code:0x1135 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1135 + ,simpleLowerCaseMapping:0x1135 + ,simpleTitleCaseMapping:0x1135 + }, + { code:0x1136 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1136 + ,simpleLowerCaseMapping:0x1136 + ,simpleTitleCaseMapping:0x1136 + }, + { code:0x1137 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1137 + ,simpleLowerCaseMapping:0x1137 + ,simpleTitleCaseMapping:0x1137 + }, + { code:0x1138 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1138 + ,simpleLowerCaseMapping:0x1138 + ,simpleTitleCaseMapping:0x1138 + }, + { code:0x1139 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1139 + ,simpleLowerCaseMapping:0x1139 + ,simpleTitleCaseMapping:0x1139 + }, + { code:0x113A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x113A + ,simpleLowerCaseMapping:0x113A + ,simpleTitleCaseMapping:0x113A + }, + { code:0x113B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x113B + ,simpleLowerCaseMapping:0x113B + ,simpleTitleCaseMapping:0x113B + }, + { code:0x113C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x113C + ,simpleLowerCaseMapping:0x113C + ,simpleTitleCaseMapping:0x113C + }, + { code:0x113D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x113D + ,simpleLowerCaseMapping:0x113D + ,simpleTitleCaseMapping:0x113D + }, + { code:0x113E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x113E + ,simpleLowerCaseMapping:0x113E + ,simpleTitleCaseMapping:0x113E + }, + { code:0x113F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x113F + ,simpleLowerCaseMapping:0x113F + ,simpleTitleCaseMapping:0x113F + }, + { code:0x1140 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1140 + ,simpleLowerCaseMapping:0x1140 + ,simpleTitleCaseMapping:0x1140 + }, + { code:0x1141 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1141 + ,simpleLowerCaseMapping:0x1141 + ,simpleTitleCaseMapping:0x1141 + }, + { code:0x1142 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1142 + ,simpleLowerCaseMapping:0x1142 + ,simpleTitleCaseMapping:0x1142 + }, + { code:0x1143 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1143 + ,simpleLowerCaseMapping:0x1143 + ,simpleTitleCaseMapping:0x1143 + }, + { code:0x1144 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1144 + ,simpleLowerCaseMapping:0x1144 + ,simpleTitleCaseMapping:0x1144 + }, + { code:0x1145 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1145 + ,simpleLowerCaseMapping:0x1145 + ,simpleTitleCaseMapping:0x1145 + }, + { code:0x1146 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1146 + ,simpleLowerCaseMapping:0x1146 + ,simpleTitleCaseMapping:0x1146 + }, + { code:0x1147 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1147 + ,simpleLowerCaseMapping:0x1147 + ,simpleTitleCaseMapping:0x1147 + }, + { code:0x1148 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1148 + ,simpleLowerCaseMapping:0x1148 + ,simpleTitleCaseMapping:0x1148 + }, + { code:0x1149 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1149 + ,simpleLowerCaseMapping:0x1149 + ,simpleTitleCaseMapping:0x1149 + }, + { code:0x114A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x114A + ,simpleLowerCaseMapping:0x114A + ,simpleTitleCaseMapping:0x114A + }, + { code:0x114B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x114B + ,simpleLowerCaseMapping:0x114B + ,simpleTitleCaseMapping:0x114B + }, + { code:0x114C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x114C + ,simpleLowerCaseMapping:0x114C + ,simpleTitleCaseMapping:0x114C + }, + { code:0x114D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x114D + ,simpleLowerCaseMapping:0x114D + ,simpleTitleCaseMapping:0x114D + }, + { code:0x114E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x114E + ,simpleLowerCaseMapping:0x114E + ,simpleTitleCaseMapping:0x114E + }, + { code:0x114F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x114F + ,simpleLowerCaseMapping:0x114F + ,simpleTitleCaseMapping:0x114F + }, + { code:0x1150 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1150 + ,simpleLowerCaseMapping:0x1150 + ,simpleTitleCaseMapping:0x1150 + }, + { code:0x1151 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1151 + ,simpleLowerCaseMapping:0x1151 + ,simpleTitleCaseMapping:0x1151 + }, + { code:0x1152 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1152 + ,simpleLowerCaseMapping:0x1152 + ,simpleTitleCaseMapping:0x1152 + }, + { code:0x1153 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1153 + ,simpleLowerCaseMapping:0x1153 + ,simpleTitleCaseMapping:0x1153 + }, + { code:0x1154 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1154 + ,simpleLowerCaseMapping:0x1154 + ,simpleTitleCaseMapping:0x1154 + }, + { code:0x1155 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1155 + ,simpleLowerCaseMapping:0x1155 + ,simpleTitleCaseMapping:0x1155 + }, + { code:0x1156 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1156 + ,simpleLowerCaseMapping:0x1156 + ,simpleTitleCaseMapping:0x1156 + }, + { code:0x1157 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1157 + ,simpleLowerCaseMapping:0x1157 + ,simpleTitleCaseMapping:0x1157 + }, + { code:0x1158 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1158 + ,simpleLowerCaseMapping:0x1158 + ,simpleTitleCaseMapping:0x1158 + }, + { code:0x1159 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1159 + ,simpleLowerCaseMapping:0x1159 + ,simpleTitleCaseMapping:0x1159 + }, + { code:0x115F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x115F + ,simpleLowerCaseMapping:0x115F + ,simpleTitleCaseMapping:0x115F + }, + { code:0x1160 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1160 + ,simpleLowerCaseMapping:0x1160 + ,simpleTitleCaseMapping:0x1160 + }, + { code:0x1161 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1161 + ,simpleLowerCaseMapping:0x1161 + ,simpleTitleCaseMapping:0x1161 + }, + { code:0x1162 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1162 + ,simpleLowerCaseMapping:0x1162 + ,simpleTitleCaseMapping:0x1162 + }, + { code:0x1163 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1163 + ,simpleLowerCaseMapping:0x1163 + ,simpleTitleCaseMapping:0x1163 + }, + { code:0x1164 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1164 + ,simpleLowerCaseMapping:0x1164 + ,simpleTitleCaseMapping:0x1164 + }, + { code:0x1165 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1165 + ,simpleLowerCaseMapping:0x1165 + ,simpleTitleCaseMapping:0x1165 + }, + { code:0x1166 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1166 + ,simpleLowerCaseMapping:0x1166 + ,simpleTitleCaseMapping:0x1166 + }, + { code:0x1167 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1167 + ,simpleLowerCaseMapping:0x1167 + ,simpleTitleCaseMapping:0x1167 + }, + { code:0x1168 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1168 + ,simpleLowerCaseMapping:0x1168 + ,simpleTitleCaseMapping:0x1168 + }, + { code:0x1169 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1169 + ,simpleLowerCaseMapping:0x1169 + ,simpleTitleCaseMapping:0x1169 + }, + { code:0x116A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x116A + ,simpleLowerCaseMapping:0x116A + ,simpleTitleCaseMapping:0x116A + }, + { code:0x116B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x116B + ,simpleLowerCaseMapping:0x116B + ,simpleTitleCaseMapping:0x116B + }, + { code:0x116C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x116C + ,simpleLowerCaseMapping:0x116C + ,simpleTitleCaseMapping:0x116C + }, + { code:0x116D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x116D + ,simpleLowerCaseMapping:0x116D + ,simpleTitleCaseMapping:0x116D + }, + { code:0x116E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x116E + ,simpleLowerCaseMapping:0x116E + ,simpleTitleCaseMapping:0x116E + }, + { code:0x116F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x116F + ,simpleLowerCaseMapping:0x116F + ,simpleTitleCaseMapping:0x116F + }, + { code:0x1170 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1170 + ,simpleLowerCaseMapping:0x1170 + ,simpleTitleCaseMapping:0x1170 + }, + { code:0x1171 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1171 + ,simpleLowerCaseMapping:0x1171 + ,simpleTitleCaseMapping:0x1171 + }, + { code:0x1172 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1172 + ,simpleLowerCaseMapping:0x1172 + ,simpleTitleCaseMapping:0x1172 + }, + { code:0x1173 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1173 + ,simpleLowerCaseMapping:0x1173 + ,simpleTitleCaseMapping:0x1173 + }, + { code:0x1174 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1174 + ,simpleLowerCaseMapping:0x1174 + ,simpleTitleCaseMapping:0x1174 + }, + { code:0x1175 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1175 + ,simpleLowerCaseMapping:0x1175 + ,simpleTitleCaseMapping:0x1175 + }, + { code:0x1176 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1176 + ,simpleLowerCaseMapping:0x1176 + ,simpleTitleCaseMapping:0x1176 + }, + { code:0x1177 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1177 + ,simpleLowerCaseMapping:0x1177 + ,simpleTitleCaseMapping:0x1177 + }, + { code:0x1178 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1178 + ,simpleLowerCaseMapping:0x1178 + ,simpleTitleCaseMapping:0x1178 + }, + { code:0x1179 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1179 + ,simpleLowerCaseMapping:0x1179 + ,simpleTitleCaseMapping:0x1179 + }, + { code:0x117A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x117A + ,simpleLowerCaseMapping:0x117A + ,simpleTitleCaseMapping:0x117A + }, + { code:0x117B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x117B + ,simpleLowerCaseMapping:0x117B + ,simpleTitleCaseMapping:0x117B + }, + { code:0x117C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x117C + ,simpleLowerCaseMapping:0x117C + ,simpleTitleCaseMapping:0x117C + }, + { code:0x117D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x117D + ,simpleLowerCaseMapping:0x117D + ,simpleTitleCaseMapping:0x117D + }, + { code:0x117E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x117E + ,simpleLowerCaseMapping:0x117E + ,simpleTitleCaseMapping:0x117E + }, + { code:0x117F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x117F + ,simpleLowerCaseMapping:0x117F + ,simpleTitleCaseMapping:0x117F + }, + { code:0x1180 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1180 + ,simpleLowerCaseMapping:0x1180 + ,simpleTitleCaseMapping:0x1180 + }, + { code:0x1181 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1181 + ,simpleLowerCaseMapping:0x1181 + ,simpleTitleCaseMapping:0x1181 + }, + { code:0x1182 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1182 + ,simpleLowerCaseMapping:0x1182 + ,simpleTitleCaseMapping:0x1182 + }, + { code:0x1183 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1183 + ,simpleLowerCaseMapping:0x1183 + ,simpleTitleCaseMapping:0x1183 + }, + { code:0x1184 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1184 + ,simpleLowerCaseMapping:0x1184 + ,simpleTitleCaseMapping:0x1184 + }, + { code:0x1185 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1185 + ,simpleLowerCaseMapping:0x1185 + ,simpleTitleCaseMapping:0x1185 + }, + { code:0x1186 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1186 + ,simpleLowerCaseMapping:0x1186 + ,simpleTitleCaseMapping:0x1186 + }, + { code:0x1187 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1187 + ,simpleLowerCaseMapping:0x1187 + ,simpleTitleCaseMapping:0x1187 + }, + { code:0x1188 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1188 + ,simpleLowerCaseMapping:0x1188 + ,simpleTitleCaseMapping:0x1188 + }, + { code:0x1189 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1189 + ,simpleLowerCaseMapping:0x1189 + ,simpleTitleCaseMapping:0x1189 + }, + { code:0x118A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x118A + ,simpleLowerCaseMapping:0x118A + ,simpleTitleCaseMapping:0x118A + }, + { code:0x118B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x118B + ,simpleLowerCaseMapping:0x118B + ,simpleTitleCaseMapping:0x118B + }, + { code:0x118C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x118C + ,simpleLowerCaseMapping:0x118C + ,simpleTitleCaseMapping:0x118C + }, + { code:0x118D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x118D + ,simpleLowerCaseMapping:0x118D + ,simpleTitleCaseMapping:0x118D + }, + { code:0x118E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x118E + ,simpleLowerCaseMapping:0x118E + ,simpleTitleCaseMapping:0x118E + }, + { code:0x118F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x118F + ,simpleLowerCaseMapping:0x118F + ,simpleTitleCaseMapping:0x118F + }, + { code:0x1190 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1190 + ,simpleLowerCaseMapping:0x1190 + ,simpleTitleCaseMapping:0x1190 + }, + { code:0x1191 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1191 + ,simpleLowerCaseMapping:0x1191 + ,simpleTitleCaseMapping:0x1191 + }, + { code:0x1192 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1192 + ,simpleLowerCaseMapping:0x1192 + ,simpleTitleCaseMapping:0x1192 + }, + { code:0x1193 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1193 + ,simpleLowerCaseMapping:0x1193 + ,simpleTitleCaseMapping:0x1193 + }, + { code:0x1194 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1194 + ,simpleLowerCaseMapping:0x1194 + ,simpleTitleCaseMapping:0x1194 + }, + { code:0x1195 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1195 + ,simpleLowerCaseMapping:0x1195 + ,simpleTitleCaseMapping:0x1195 + }, + { code:0x1196 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1196 + ,simpleLowerCaseMapping:0x1196 + ,simpleTitleCaseMapping:0x1196 + }, + { code:0x1197 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1197 + ,simpleLowerCaseMapping:0x1197 + ,simpleTitleCaseMapping:0x1197 + }, + { code:0x1198 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1198 + ,simpleLowerCaseMapping:0x1198 + ,simpleTitleCaseMapping:0x1198 + }, + { code:0x1199 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1199 + ,simpleLowerCaseMapping:0x1199 + ,simpleTitleCaseMapping:0x1199 + }, + { code:0x119A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x119A + ,simpleLowerCaseMapping:0x119A + ,simpleTitleCaseMapping:0x119A + }, + { code:0x119B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x119B + ,simpleLowerCaseMapping:0x119B + ,simpleTitleCaseMapping:0x119B + }, + { code:0x119C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x119C + ,simpleLowerCaseMapping:0x119C + ,simpleTitleCaseMapping:0x119C + }, + { code:0x119D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x119D + ,simpleLowerCaseMapping:0x119D + ,simpleTitleCaseMapping:0x119D + }, + { code:0x119E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x119E + ,simpleLowerCaseMapping:0x119E + ,simpleTitleCaseMapping:0x119E + }, + { code:0x119F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x119F + ,simpleLowerCaseMapping:0x119F + ,simpleTitleCaseMapping:0x119F + }, + { code:0x11A0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11A0 + ,simpleLowerCaseMapping:0x11A0 + ,simpleTitleCaseMapping:0x11A0 + }, + { code:0x11A1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11A1 + ,simpleLowerCaseMapping:0x11A1 + ,simpleTitleCaseMapping:0x11A1 + }, + { code:0x11A2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11A2 + ,simpleLowerCaseMapping:0x11A2 + ,simpleTitleCaseMapping:0x11A2 + }, + { code:0x11A8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11A8 + ,simpleLowerCaseMapping:0x11A8 + ,simpleTitleCaseMapping:0x11A8 + }, + { code:0x11A9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11A9 + ,simpleLowerCaseMapping:0x11A9 + ,simpleTitleCaseMapping:0x11A9 + }, + { code:0x11AA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11AA + ,simpleLowerCaseMapping:0x11AA + ,simpleTitleCaseMapping:0x11AA + }, + { code:0x11AB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11AB + ,simpleLowerCaseMapping:0x11AB + ,simpleTitleCaseMapping:0x11AB + }, + { code:0x11AC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11AC + ,simpleLowerCaseMapping:0x11AC + ,simpleTitleCaseMapping:0x11AC + }, + { code:0x11AD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11AD + ,simpleLowerCaseMapping:0x11AD + ,simpleTitleCaseMapping:0x11AD + }, + { code:0x11AE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11AE + ,simpleLowerCaseMapping:0x11AE + ,simpleTitleCaseMapping:0x11AE + }, + { code:0x11AF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11AF + ,simpleLowerCaseMapping:0x11AF + ,simpleTitleCaseMapping:0x11AF + }, + { code:0x11B0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11B0 + ,simpleLowerCaseMapping:0x11B0 + ,simpleTitleCaseMapping:0x11B0 + }, + { code:0x11B1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11B1 + ,simpleLowerCaseMapping:0x11B1 + ,simpleTitleCaseMapping:0x11B1 + }, + { code:0x11B2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11B2 + ,simpleLowerCaseMapping:0x11B2 + ,simpleTitleCaseMapping:0x11B2 + }, + { code:0x11B3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11B3 + ,simpleLowerCaseMapping:0x11B3 + ,simpleTitleCaseMapping:0x11B3 + }, + { code:0x11B4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11B4 + ,simpleLowerCaseMapping:0x11B4 + ,simpleTitleCaseMapping:0x11B4 + }, + { code:0x11B5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11B5 + ,simpleLowerCaseMapping:0x11B5 + ,simpleTitleCaseMapping:0x11B5 + }, + { code:0x11B6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11B6 + ,simpleLowerCaseMapping:0x11B6 + ,simpleTitleCaseMapping:0x11B6 + }, + { code:0x11B7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11B7 + ,simpleLowerCaseMapping:0x11B7 + ,simpleTitleCaseMapping:0x11B7 + }, + { code:0x11B8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11B8 + ,simpleLowerCaseMapping:0x11B8 + ,simpleTitleCaseMapping:0x11B8 + }, + { code:0x11B9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11B9 + ,simpleLowerCaseMapping:0x11B9 + ,simpleTitleCaseMapping:0x11B9 + }, + { code:0x11BA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11BA + ,simpleLowerCaseMapping:0x11BA + ,simpleTitleCaseMapping:0x11BA + }, + { code:0x11BB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11BB + ,simpleLowerCaseMapping:0x11BB + ,simpleTitleCaseMapping:0x11BB + }, + { code:0x11BC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11BC + ,simpleLowerCaseMapping:0x11BC + ,simpleTitleCaseMapping:0x11BC + }, + { code:0x11BD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11BD + ,simpleLowerCaseMapping:0x11BD + ,simpleTitleCaseMapping:0x11BD + }, + { code:0x11BE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11BE + ,simpleLowerCaseMapping:0x11BE + ,simpleTitleCaseMapping:0x11BE + }, + { code:0x11BF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11BF + ,simpleLowerCaseMapping:0x11BF + ,simpleTitleCaseMapping:0x11BF + }, + { code:0x11C0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11C0 + ,simpleLowerCaseMapping:0x11C0 + ,simpleTitleCaseMapping:0x11C0 + }, + { code:0x11C1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11C1 + ,simpleLowerCaseMapping:0x11C1 + ,simpleTitleCaseMapping:0x11C1 + }, + { code:0x11C2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11C2 + ,simpleLowerCaseMapping:0x11C2 + ,simpleTitleCaseMapping:0x11C2 + }, + { code:0x11C3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11C3 + ,simpleLowerCaseMapping:0x11C3 + ,simpleTitleCaseMapping:0x11C3 + }, + { code:0x11C4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11C4 + ,simpleLowerCaseMapping:0x11C4 + ,simpleTitleCaseMapping:0x11C4 + }, + { code:0x11C5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11C5 + ,simpleLowerCaseMapping:0x11C5 + ,simpleTitleCaseMapping:0x11C5 + }, + { code:0x11C6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11C6 + ,simpleLowerCaseMapping:0x11C6 + ,simpleTitleCaseMapping:0x11C6 + }, + { code:0x11C7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11C7 + ,simpleLowerCaseMapping:0x11C7 + ,simpleTitleCaseMapping:0x11C7 + }, + { code:0x11C8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11C8 + ,simpleLowerCaseMapping:0x11C8 + ,simpleTitleCaseMapping:0x11C8 + }, + { code:0x11C9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11C9 + ,simpleLowerCaseMapping:0x11C9 + ,simpleTitleCaseMapping:0x11C9 + }, + { code:0x11CA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11CA + ,simpleLowerCaseMapping:0x11CA + ,simpleTitleCaseMapping:0x11CA + }, + { code:0x11CB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11CB + ,simpleLowerCaseMapping:0x11CB + ,simpleTitleCaseMapping:0x11CB + }, + { code:0x11CC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11CC + ,simpleLowerCaseMapping:0x11CC + ,simpleTitleCaseMapping:0x11CC + }, + { code:0x11CD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11CD + ,simpleLowerCaseMapping:0x11CD + ,simpleTitleCaseMapping:0x11CD + }, + { code:0x11CE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11CE + ,simpleLowerCaseMapping:0x11CE + ,simpleTitleCaseMapping:0x11CE + }, + { code:0x11CF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11CF + ,simpleLowerCaseMapping:0x11CF + ,simpleTitleCaseMapping:0x11CF + }, + { code:0x11D0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11D0 + ,simpleLowerCaseMapping:0x11D0 + ,simpleTitleCaseMapping:0x11D0 + }, + { code:0x11D1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11D1 + ,simpleLowerCaseMapping:0x11D1 + ,simpleTitleCaseMapping:0x11D1 + }, + { code:0x11D2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11D2 + ,simpleLowerCaseMapping:0x11D2 + ,simpleTitleCaseMapping:0x11D2 + }, + { code:0x11D3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11D3 + ,simpleLowerCaseMapping:0x11D3 + ,simpleTitleCaseMapping:0x11D3 + }, + { code:0x11D4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11D4 + ,simpleLowerCaseMapping:0x11D4 + ,simpleTitleCaseMapping:0x11D4 + }, + { code:0x11D5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11D5 + ,simpleLowerCaseMapping:0x11D5 + ,simpleTitleCaseMapping:0x11D5 + }, + { code:0x11D6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11D6 + ,simpleLowerCaseMapping:0x11D6 + ,simpleTitleCaseMapping:0x11D6 + }, + { code:0x11D7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11D7 + ,simpleLowerCaseMapping:0x11D7 + ,simpleTitleCaseMapping:0x11D7 + }, + { code:0x11D8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11D8 + ,simpleLowerCaseMapping:0x11D8 + ,simpleTitleCaseMapping:0x11D8 + }, + { code:0x11D9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11D9 + ,simpleLowerCaseMapping:0x11D9 + ,simpleTitleCaseMapping:0x11D9 + }, + { code:0x11DA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11DA + ,simpleLowerCaseMapping:0x11DA + ,simpleTitleCaseMapping:0x11DA + }, + { code:0x11DB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11DB + ,simpleLowerCaseMapping:0x11DB + ,simpleTitleCaseMapping:0x11DB + }, + { code:0x11DC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11DC + ,simpleLowerCaseMapping:0x11DC + ,simpleTitleCaseMapping:0x11DC + }, + { code:0x11DD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11DD + ,simpleLowerCaseMapping:0x11DD + ,simpleTitleCaseMapping:0x11DD + }, + { code:0x11DE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11DE + ,simpleLowerCaseMapping:0x11DE + ,simpleTitleCaseMapping:0x11DE + }, + { code:0x11DF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11DF + ,simpleLowerCaseMapping:0x11DF + ,simpleTitleCaseMapping:0x11DF + }, + { code:0x11E0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11E0 + ,simpleLowerCaseMapping:0x11E0 + ,simpleTitleCaseMapping:0x11E0 + }, + { code:0x11E1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11E1 + ,simpleLowerCaseMapping:0x11E1 + ,simpleTitleCaseMapping:0x11E1 + }, + { code:0x11E2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11E2 + ,simpleLowerCaseMapping:0x11E2 + ,simpleTitleCaseMapping:0x11E2 + }, + { code:0x11E3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11E3 + ,simpleLowerCaseMapping:0x11E3 + ,simpleTitleCaseMapping:0x11E3 + }, + { code:0x11E4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11E4 + ,simpleLowerCaseMapping:0x11E4 + ,simpleTitleCaseMapping:0x11E4 + }, + { code:0x11E5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11E5 + ,simpleLowerCaseMapping:0x11E5 + ,simpleTitleCaseMapping:0x11E5 + }, + { code:0x11E6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11E6 + ,simpleLowerCaseMapping:0x11E6 + ,simpleTitleCaseMapping:0x11E6 + }, + { code:0x11E7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11E7 + ,simpleLowerCaseMapping:0x11E7 + ,simpleTitleCaseMapping:0x11E7 + }, + { code:0x11E8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11E8 + ,simpleLowerCaseMapping:0x11E8 + ,simpleTitleCaseMapping:0x11E8 + }, + { code:0x11E9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11E9 + ,simpleLowerCaseMapping:0x11E9 + ,simpleTitleCaseMapping:0x11E9 + }, + { code:0x11EA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11EA + ,simpleLowerCaseMapping:0x11EA + ,simpleTitleCaseMapping:0x11EA + }, + { code:0x11EB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11EB + ,simpleLowerCaseMapping:0x11EB + ,simpleTitleCaseMapping:0x11EB + }, + { code:0x11EC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11EC + ,simpleLowerCaseMapping:0x11EC + ,simpleTitleCaseMapping:0x11EC + }, + { code:0x11ED + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11ED + ,simpleLowerCaseMapping:0x11ED + ,simpleTitleCaseMapping:0x11ED + }, + { code:0x11EE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11EE + ,simpleLowerCaseMapping:0x11EE + ,simpleTitleCaseMapping:0x11EE + }, + { code:0x11EF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11EF + ,simpleLowerCaseMapping:0x11EF + ,simpleTitleCaseMapping:0x11EF + }, + { code:0x11F0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11F0 + ,simpleLowerCaseMapping:0x11F0 + ,simpleTitleCaseMapping:0x11F0 + }, + { code:0x11F1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11F1 + ,simpleLowerCaseMapping:0x11F1 + ,simpleTitleCaseMapping:0x11F1 + }, + { code:0x11F2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11F2 + ,simpleLowerCaseMapping:0x11F2 + ,simpleTitleCaseMapping:0x11F2 + }, + { code:0x11F3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11F3 + ,simpleLowerCaseMapping:0x11F3 + ,simpleTitleCaseMapping:0x11F3 + }, + { code:0x11F4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11F4 + ,simpleLowerCaseMapping:0x11F4 + ,simpleTitleCaseMapping:0x11F4 + }, + { code:0x11F5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11F5 + ,simpleLowerCaseMapping:0x11F5 + ,simpleTitleCaseMapping:0x11F5 + }, + { code:0x11F6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11F6 + ,simpleLowerCaseMapping:0x11F6 + ,simpleTitleCaseMapping:0x11F6 + }, + { code:0x11F7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11F7 + ,simpleLowerCaseMapping:0x11F7 + ,simpleTitleCaseMapping:0x11F7 + }, + { code:0x11F8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11F8 + ,simpleLowerCaseMapping:0x11F8 + ,simpleTitleCaseMapping:0x11F8 + }, + { code:0x11F9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x11F9 + ,simpleLowerCaseMapping:0x11F9 + ,simpleTitleCaseMapping:0x11F9 + }, + { code:0x1200 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1200 + ,simpleLowerCaseMapping:0x1200 + ,simpleTitleCaseMapping:0x1200 + }, + { code:0x1201 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1201 + ,simpleLowerCaseMapping:0x1201 + ,simpleTitleCaseMapping:0x1201 + }, + { code:0x1202 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1202 + ,simpleLowerCaseMapping:0x1202 + ,simpleTitleCaseMapping:0x1202 + }, + { code:0x1203 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1203 + ,simpleLowerCaseMapping:0x1203 + ,simpleTitleCaseMapping:0x1203 + }, + { code:0x1204 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1204 + ,simpleLowerCaseMapping:0x1204 + ,simpleTitleCaseMapping:0x1204 + }, + { code:0x1205 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1205 + ,simpleLowerCaseMapping:0x1205 + ,simpleTitleCaseMapping:0x1205 + }, + { code:0x1206 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1206 + ,simpleLowerCaseMapping:0x1206 + ,simpleTitleCaseMapping:0x1206 + }, + { code:0x1207 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1207 + ,simpleLowerCaseMapping:0x1207 + ,simpleTitleCaseMapping:0x1207 + }, + { code:0x1208 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1208 + ,simpleLowerCaseMapping:0x1208 + ,simpleTitleCaseMapping:0x1208 + }, + { code:0x1209 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1209 + ,simpleLowerCaseMapping:0x1209 + ,simpleTitleCaseMapping:0x1209 + }, + { code:0x120A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120A + ,simpleLowerCaseMapping:0x120A + ,simpleTitleCaseMapping:0x120A + }, + { code:0x120B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120B + ,simpleLowerCaseMapping:0x120B + ,simpleTitleCaseMapping:0x120B + }, + { code:0x120C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120C + ,simpleLowerCaseMapping:0x120C + ,simpleTitleCaseMapping:0x120C + }, + { code:0x120D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120D + ,simpleLowerCaseMapping:0x120D + ,simpleTitleCaseMapping:0x120D + }, + { code:0x120E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120E + ,simpleLowerCaseMapping:0x120E + ,simpleTitleCaseMapping:0x120E + }, + { code:0x120F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120F + ,simpleLowerCaseMapping:0x120F + ,simpleTitleCaseMapping:0x120F + }, + { code:0x1210 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1210 + ,simpleLowerCaseMapping:0x1210 + ,simpleTitleCaseMapping:0x1210 + }, + { code:0x1211 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1211 + ,simpleLowerCaseMapping:0x1211 + ,simpleTitleCaseMapping:0x1211 + }, + { code:0x1212 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1212 + ,simpleLowerCaseMapping:0x1212 + ,simpleTitleCaseMapping:0x1212 + }, + { code:0x1213 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1213 + ,simpleLowerCaseMapping:0x1213 + ,simpleTitleCaseMapping:0x1213 + }, + { code:0x1214 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1214 + ,simpleLowerCaseMapping:0x1214 + ,simpleTitleCaseMapping:0x1214 + }, + { code:0x1215 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1215 + ,simpleLowerCaseMapping:0x1215 + ,simpleTitleCaseMapping:0x1215 + }, + { code:0x1216 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1216 + ,simpleLowerCaseMapping:0x1216 + ,simpleTitleCaseMapping:0x1216 + }, + { code:0x1217 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1217 + ,simpleLowerCaseMapping:0x1217 + ,simpleTitleCaseMapping:0x1217 + }, + { code:0x1218 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1218 + ,simpleLowerCaseMapping:0x1218 + ,simpleTitleCaseMapping:0x1218 + }, + { code:0x1219 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1219 + ,simpleLowerCaseMapping:0x1219 + ,simpleTitleCaseMapping:0x1219 + }, + { code:0x121A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121A + ,simpleLowerCaseMapping:0x121A + ,simpleTitleCaseMapping:0x121A + }, + { code:0x121B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121B + ,simpleLowerCaseMapping:0x121B + ,simpleTitleCaseMapping:0x121B + }, + { code:0x121C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121C + ,simpleLowerCaseMapping:0x121C + ,simpleTitleCaseMapping:0x121C + }, + { code:0x121D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121D + ,simpleLowerCaseMapping:0x121D + ,simpleTitleCaseMapping:0x121D + }, + { code:0x121E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121E + ,simpleLowerCaseMapping:0x121E + ,simpleTitleCaseMapping:0x121E + }, + { code:0x121F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121F + ,simpleLowerCaseMapping:0x121F + ,simpleTitleCaseMapping:0x121F + }, + { code:0x1220 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1220 + ,simpleLowerCaseMapping:0x1220 + ,simpleTitleCaseMapping:0x1220 + }, + { code:0x1221 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1221 + ,simpleLowerCaseMapping:0x1221 + ,simpleTitleCaseMapping:0x1221 + }, + { code:0x1222 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1222 + ,simpleLowerCaseMapping:0x1222 + ,simpleTitleCaseMapping:0x1222 + }, + { code:0x1223 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1223 + ,simpleLowerCaseMapping:0x1223 + ,simpleTitleCaseMapping:0x1223 + }, + { code:0x1224 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1224 + ,simpleLowerCaseMapping:0x1224 + ,simpleTitleCaseMapping:0x1224 + }, + { code:0x1225 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1225 + ,simpleLowerCaseMapping:0x1225 + ,simpleTitleCaseMapping:0x1225 + }, + { code:0x1226 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1226 + ,simpleLowerCaseMapping:0x1226 + ,simpleTitleCaseMapping:0x1226 + }, + { code:0x1227 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1227 + ,simpleLowerCaseMapping:0x1227 + ,simpleTitleCaseMapping:0x1227 + }, + { code:0x1228 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1228 + ,simpleLowerCaseMapping:0x1228 + ,simpleTitleCaseMapping:0x1228 + }, + { code:0x1229 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1229 + ,simpleLowerCaseMapping:0x1229 + ,simpleTitleCaseMapping:0x1229 + }, + { code:0x122A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122A + ,simpleLowerCaseMapping:0x122A + ,simpleTitleCaseMapping:0x122A + }, + { code:0x122B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122B + ,simpleLowerCaseMapping:0x122B + ,simpleTitleCaseMapping:0x122B + }, + { code:0x122C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122C + ,simpleLowerCaseMapping:0x122C + ,simpleTitleCaseMapping:0x122C + }, + { code:0x122D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122D + ,simpleLowerCaseMapping:0x122D + ,simpleTitleCaseMapping:0x122D + }, + { code:0x122E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122E + ,simpleLowerCaseMapping:0x122E + ,simpleTitleCaseMapping:0x122E + }, + { code:0x122F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122F + ,simpleLowerCaseMapping:0x122F + ,simpleTitleCaseMapping:0x122F + }, + { code:0x1230 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1230 + ,simpleLowerCaseMapping:0x1230 + ,simpleTitleCaseMapping:0x1230 + }, + { code:0x1231 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1231 + ,simpleLowerCaseMapping:0x1231 + ,simpleTitleCaseMapping:0x1231 + }, + { code:0x1232 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1232 + ,simpleLowerCaseMapping:0x1232 + ,simpleTitleCaseMapping:0x1232 + }, + { code:0x1233 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1233 + ,simpleLowerCaseMapping:0x1233 + ,simpleTitleCaseMapping:0x1233 + }, + { code:0x1234 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1234 + ,simpleLowerCaseMapping:0x1234 + ,simpleTitleCaseMapping:0x1234 + }, + { code:0x1235 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1235 + ,simpleLowerCaseMapping:0x1235 + ,simpleTitleCaseMapping:0x1235 + }, + { code:0x1236 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1236 + ,simpleLowerCaseMapping:0x1236 + ,simpleTitleCaseMapping:0x1236 + }, + { code:0x1237 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1237 + ,simpleLowerCaseMapping:0x1237 + ,simpleTitleCaseMapping:0x1237 + }, + { code:0x1238 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1238 + ,simpleLowerCaseMapping:0x1238 + ,simpleTitleCaseMapping:0x1238 + }, + { code:0x1239 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1239 + ,simpleLowerCaseMapping:0x1239 + ,simpleTitleCaseMapping:0x1239 + }, + { code:0x123A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x123A + ,simpleLowerCaseMapping:0x123A + ,simpleTitleCaseMapping:0x123A + }, + { code:0x123B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x123B + ,simpleLowerCaseMapping:0x123B + ,simpleTitleCaseMapping:0x123B + }, + { code:0x123C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x123C + ,simpleLowerCaseMapping:0x123C + ,simpleTitleCaseMapping:0x123C + }, + { code:0x123D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x123D + ,simpleLowerCaseMapping:0x123D + ,simpleTitleCaseMapping:0x123D + }, + { code:0x123E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x123E + ,simpleLowerCaseMapping:0x123E + ,simpleTitleCaseMapping:0x123E + }, + { code:0x123F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x123F + ,simpleLowerCaseMapping:0x123F + ,simpleTitleCaseMapping:0x123F + }, + { code:0x1240 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1240 + ,simpleLowerCaseMapping:0x1240 + ,simpleTitleCaseMapping:0x1240 + }, + { code:0x1241 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1241 + ,simpleLowerCaseMapping:0x1241 + ,simpleTitleCaseMapping:0x1241 + }, + { code:0x1242 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1242 + ,simpleLowerCaseMapping:0x1242 + ,simpleTitleCaseMapping:0x1242 + }, + { code:0x1243 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1243 + ,simpleLowerCaseMapping:0x1243 + ,simpleTitleCaseMapping:0x1243 + }, + { code:0x1244 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1244 + ,simpleLowerCaseMapping:0x1244 + ,simpleTitleCaseMapping:0x1244 + }, + { code:0x1245 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1245 + ,simpleLowerCaseMapping:0x1245 + ,simpleTitleCaseMapping:0x1245 + }, + { code:0x1246 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1246 + ,simpleLowerCaseMapping:0x1246 + ,simpleTitleCaseMapping:0x1246 + }, + { code:0x1247 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1247 + ,simpleLowerCaseMapping:0x1247 + ,simpleTitleCaseMapping:0x1247 + }, + { code:0x1248 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1248 + ,simpleLowerCaseMapping:0x1248 + ,simpleTitleCaseMapping:0x1248 + }, + { code:0x124A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x124A + ,simpleLowerCaseMapping:0x124A + ,simpleTitleCaseMapping:0x124A + }, + { code:0x124B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x124B + ,simpleLowerCaseMapping:0x124B + ,simpleTitleCaseMapping:0x124B + }, + { code:0x124C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x124C + ,simpleLowerCaseMapping:0x124C + ,simpleTitleCaseMapping:0x124C + }, + { code:0x124D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x124D + ,simpleLowerCaseMapping:0x124D + ,simpleTitleCaseMapping:0x124D + }, + { code:0x1250 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1250 + ,simpleLowerCaseMapping:0x1250 + ,simpleTitleCaseMapping:0x1250 + }, + { code:0x1251 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1251 + ,simpleLowerCaseMapping:0x1251 + ,simpleTitleCaseMapping:0x1251 + }, + { code:0x1252 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1252 + ,simpleLowerCaseMapping:0x1252 + ,simpleTitleCaseMapping:0x1252 + }, + { code:0x1253 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1253 + ,simpleLowerCaseMapping:0x1253 + ,simpleTitleCaseMapping:0x1253 + }, + { code:0x1254 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1254 + ,simpleLowerCaseMapping:0x1254 + ,simpleTitleCaseMapping:0x1254 + }, + { code:0x1255 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1255 + ,simpleLowerCaseMapping:0x1255 + ,simpleTitleCaseMapping:0x1255 + }, + { code:0x1256 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1256 + ,simpleLowerCaseMapping:0x1256 + ,simpleTitleCaseMapping:0x1256 + }, + { code:0x1258 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1258 + ,simpleLowerCaseMapping:0x1258 + ,simpleTitleCaseMapping:0x1258 + }, + { code:0x125A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x125A + ,simpleLowerCaseMapping:0x125A + ,simpleTitleCaseMapping:0x125A + }, + { code:0x125B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x125B + ,simpleLowerCaseMapping:0x125B + ,simpleTitleCaseMapping:0x125B + }, + { code:0x125C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x125C + ,simpleLowerCaseMapping:0x125C + ,simpleTitleCaseMapping:0x125C + }, + { code:0x125D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x125D + ,simpleLowerCaseMapping:0x125D + ,simpleTitleCaseMapping:0x125D + }, + { code:0x1260 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1260 + ,simpleLowerCaseMapping:0x1260 + ,simpleTitleCaseMapping:0x1260 + }, + { code:0x1261 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1261 + ,simpleLowerCaseMapping:0x1261 + ,simpleTitleCaseMapping:0x1261 + }, + { code:0x1262 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1262 + ,simpleLowerCaseMapping:0x1262 + ,simpleTitleCaseMapping:0x1262 + }, + { code:0x1263 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1263 + ,simpleLowerCaseMapping:0x1263 + ,simpleTitleCaseMapping:0x1263 + }, + { code:0x1264 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1264 + ,simpleLowerCaseMapping:0x1264 + ,simpleTitleCaseMapping:0x1264 + }, + { code:0x1265 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1265 + ,simpleLowerCaseMapping:0x1265 + ,simpleTitleCaseMapping:0x1265 + }, + { code:0x1266 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1266 + ,simpleLowerCaseMapping:0x1266 + ,simpleTitleCaseMapping:0x1266 + }, + { code:0x1267 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1267 + ,simpleLowerCaseMapping:0x1267 + ,simpleTitleCaseMapping:0x1267 + }, + { code:0x1268 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1268 + ,simpleLowerCaseMapping:0x1268 + ,simpleTitleCaseMapping:0x1268 + }, + { code:0x1269 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1269 + ,simpleLowerCaseMapping:0x1269 + ,simpleTitleCaseMapping:0x1269 + }, + { code:0x126A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x126A + ,simpleLowerCaseMapping:0x126A + ,simpleTitleCaseMapping:0x126A + }, + { code:0x126B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x126B + ,simpleLowerCaseMapping:0x126B + ,simpleTitleCaseMapping:0x126B + }, + { code:0x126C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x126C + ,simpleLowerCaseMapping:0x126C + ,simpleTitleCaseMapping:0x126C + }, + { code:0x126D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x126D + ,simpleLowerCaseMapping:0x126D + ,simpleTitleCaseMapping:0x126D + }, + { code:0x126E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x126E + ,simpleLowerCaseMapping:0x126E + ,simpleTitleCaseMapping:0x126E + }, + { code:0x126F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x126F + ,simpleLowerCaseMapping:0x126F + ,simpleTitleCaseMapping:0x126F + }, + { code:0x1270 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1270 + ,simpleLowerCaseMapping:0x1270 + ,simpleTitleCaseMapping:0x1270 + }, + { code:0x1271 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1271 + ,simpleLowerCaseMapping:0x1271 + ,simpleTitleCaseMapping:0x1271 + }, + { code:0x1272 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1272 + ,simpleLowerCaseMapping:0x1272 + ,simpleTitleCaseMapping:0x1272 + }, + { code:0x1273 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1273 + ,simpleLowerCaseMapping:0x1273 + ,simpleTitleCaseMapping:0x1273 + }, + { code:0x1274 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1274 + ,simpleLowerCaseMapping:0x1274 + ,simpleTitleCaseMapping:0x1274 + }, + { code:0x1275 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1275 + ,simpleLowerCaseMapping:0x1275 + ,simpleTitleCaseMapping:0x1275 + }, + { code:0x1276 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1276 + ,simpleLowerCaseMapping:0x1276 + ,simpleTitleCaseMapping:0x1276 + }, + { code:0x1277 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1277 + ,simpleLowerCaseMapping:0x1277 + ,simpleTitleCaseMapping:0x1277 + }, + { code:0x1278 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1278 + ,simpleLowerCaseMapping:0x1278 + ,simpleTitleCaseMapping:0x1278 + }, + { code:0x1279 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1279 + ,simpleLowerCaseMapping:0x1279 + ,simpleTitleCaseMapping:0x1279 + }, + { code:0x127A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x127A + ,simpleLowerCaseMapping:0x127A + ,simpleTitleCaseMapping:0x127A + }, + { code:0x127B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x127B + ,simpleLowerCaseMapping:0x127B + ,simpleTitleCaseMapping:0x127B + }, + { code:0x127C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x127C + ,simpleLowerCaseMapping:0x127C + ,simpleTitleCaseMapping:0x127C + }, + { code:0x127D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x127D + ,simpleLowerCaseMapping:0x127D + ,simpleTitleCaseMapping:0x127D + }, + { code:0x127E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x127E + ,simpleLowerCaseMapping:0x127E + ,simpleTitleCaseMapping:0x127E + }, + { code:0x127F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x127F + ,simpleLowerCaseMapping:0x127F + ,simpleTitleCaseMapping:0x127F + }, + { code:0x1280 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1280 + ,simpleLowerCaseMapping:0x1280 + ,simpleTitleCaseMapping:0x1280 + }, + { code:0x1281 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1281 + ,simpleLowerCaseMapping:0x1281 + ,simpleTitleCaseMapping:0x1281 + }, + { code:0x1282 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1282 + ,simpleLowerCaseMapping:0x1282 + ,simpleTitleCaseMapping:0x1282 + }, + { code:0x1283 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1283 + ,simpleLowerCaseMapping:0x1283 + ,simpleTitleCaseMapping:0x1283 + }, + { code:0x1284 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1284 + ,simpleLowerCaseMapping:0x1284 + ,simpleTitleCaseMapping:0x1284 + }, + { code:0x1285 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1285 + ,simpleLowerCaseMapping:0x1285 + ,simpleTitleCaseMapping:0x1285 + }, + { code:0x1286 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1286 + ,simpleLowerCaseMapping:0x1286 + ,simpleTitleCaseMapping:0x1286 + }, + { code:0x1287 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1287 + ,simpleLowerCaseMapping:0x1287 + ,simpleTitleCaseMapping:0x1287 + }, + { code:0x1288 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1288 + ,simpleLowerCaseMapping:0x1288 + ,simpleTitleCaseMapping:0x1288 + }, + { code:0x128A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x128A + ,simpleLowerCaseMapping:0x128A + ,simpleTitleCaseMapping:0x128A + }, + { code:0x128B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x128B + ,simpleLowerCaseMapping:0x128B + ,simpleTitleCaseMapping:0x128B + }, + { code:0x128C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x128C + ,simpleLowerCaseMapping:0x128C + ,simpleTitleCaseMapping:0x128C + }, + { code:0x128D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x128D + ,simpleLowerCaseMapping:0x128D + ,simpleTitleCaseMapping:0x128D + }, + { code:0x1290 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1290 + ,simpleLowerCaseMapping:0x1290 + ,simpleTitleCaseMapping:0x1290 + }, + { code:0x1291 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1291 + ,simpleLowerCaseMapping:0x1291 + ,simpleTitleCaseMapping:0x1291 + }, + { code:0x1292 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1292 + ,simpleLowerCaseMapping:0x1292 + ,simpleTitleCaseMapping:0x1292 + }, + { code:0x1293 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1293 + ,simpleLowerCaseMapping:0x1293 + ,simpleTitleCaseMapping:0x1293 + }, + { code:0x1294 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1294 + ,simpleLowerCaseMapping:0x1294 + ,simpleTitleCaseMapping:0x1294 + }, + { code:0x1295 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1295 + ,simpleLowerCaseMapping:0x1295 + ,simpleTitleCaseMapping:0x1295 + }, + { code:0x1296 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1296 + ,simpleLowerCaseMapping:0x1296 + ,simpleTitleCaseMapping:0x1296 + }, + { code:0x1297 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1297 + ,simpleLowerCaseMapping:0x1297 + ,simpleTitleCaseMapping:0x1297 + }, + { code:0x1298 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1298 + ,simpleLowerCaseMapping:0x1298 + ,simpleTitleCaseMapping:0x1298 + }, + { code:0x1299 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1299 + ,simpleLowerCaseMapping:0x1299 + ,simpleTitleCaseMapping:0x1299 + }, + { code:0x129A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x129A + ,simpleLowerCaseMapping:0x129A + ,simpleTitleCaseMapping:0x129A + }, + { code:0x129B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x129B + ,simpleLowerCaseMapping:0x129B + ,simpleTitleCaseMapping:0x129B + }, + { code:0x129C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x129C + ,simpleLowerCaseMapping:0x129C + ,simpleTitleCaseMapping:0x129C + }, + { code:0x129D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x129D + ,simpleLowerCaseMapping:0x129D + ,simpleTitleCaseMapping:0x129D + }, + { code:0x129E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x129E + ,simpleLowerCaseMapping:0x129E + ,simpleTitleCaseMapping:0x129E + }, + { code:0x129F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x129F + ,simpleLowerCaseMapping:0x129F + ,simpleTitleCaseMapping:0x129F + }, + { code:0x12A0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12A0 + ,simpleLowerCaseMapping:0x12A0 + ,simpleTitleCaseMapping:0x12A0 + }, + { code:0x12A1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12A1 + ,simpleLowerCaseMapping:0x12A1 + ,simpleTitleCaseMapping:0x12A1 + }, + { code:0x12A2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12A2 + ,simpleLowerCaseMapping:0x12A2 + ,simpleTitleCaseMapping:0x12A2 + }, + { code:0x12A3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12A3 + ,simpleLowerCaseMapping:0x12A3 + ,simpleTitleCaseMapping:0x12A3 + }, + { code:0x12A4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12A4 + ,simpleLowerCaseMapping:0x12A4 + ,simpleTitleCaseMapping:0x12A4 + }, + { code:0x12A5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12A5 + ,simpleLowerCaseMapping:0x12A5 + ,simpleTitleCaseMapping:0x12A5 + }, + { code:0x12A6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12A6 + ,simpleLowerCaseMapping:0x12A6 + ,simpleTitleCaseMapping:0x12A6 + }, + { code:0x12A7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12A7 + ,simpleLowerCaseMapping:0x12A7 + ,simpleTitleCaseMapping:0x12A7 + }, + { code:0x12A8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12A8 + ,simpleLowerCaseMapping:0x12A8 + ,simpleTitleCaseMapping:0x12A8 + }, + { code:0x12A9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12A9 + ,simpleLowerCaseMapping:0x12A9 + ,simpleTitleCaseMapping:0x12A9 + }, + { code:0x12AA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12AA + ,simpleLowerCaseMapping:0x12AA + ,simpleTitleCaseMapping:0x12AA + }, + { code:0x12AB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12AB + ,simpleLowerCaseMapping:0x12AB + ,simpleTitleCaseMapping:0x12AB + }, + { code:0x12AC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12AC + ,simpleLowerCaseMapping:0x12AC + ,simpleTitleCaseMapping:0x12AC + }, + { code:0x12AD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12AD + ,simpleLowerCaseMapping:0x12AD + ,simpleTitleCaseMapping:0x12AD + }, + { code:0x12AE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12AE + ,simpleLowerCaseMapping:0x12AE + ,simpleTitleCaseMapping:0x12AE + }, + { code:0x12AF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12AF + ,simpleLowerCaseMapping:0x12AF + ,simpleTitleCaseMapping:0x12AF + }, + { code:0x12B0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12B0 + ,simpleLowerCaseMapping:0x12B0 + ,simpleTitleCaseMapping:0x12B0 + }, + { code:0x12B2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12B2 + ,simpleLowerCaseMapping:0x12B2 + ,simpleTitleCaseMapping:0x12B2 + }, + { code:0x12B3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12B3 + ,simpleLowerCaseMapping:0x12B3 + ,simpleTitleCaseMapping:0x12B3 + }, + { code:0x12B4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12B4 + ,simpleLowerCaseMapping:0x12B4 + ,simpleTitleCaseMapping:0x12B4 + }, + { code:0x12B5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12B5 + ,simpleLowerCaseMapping:0x12B5 + ,simpleTitleCaseMapping:0x12B5 + }, + { code:0x12B8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12B8 + ,simpleLowerCaseMapping:0x12B8 + ,simpleTitleCaseMapping:0x12B8 + }, + { code:0x12B9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12B9 + ,simpleLowerCaseMapping:0x12B9 + ,simpleTitleCaseMapping:0x12B9 + }, + { code:0x12BA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12BA + ,simpleLowerCaseMapping:0x12BA + ,simpleTitleCaseMapping:0x12BA + }, + { code:0x12BB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12BB + ,simpleLowerCaseMapping:0x12BB + ,simpleTitleCaseMapping:0x12BB + }, + { code:0x12BC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12BC + ,simpleLowerCaseMapping:0x12BC + ,simpleTitleCaseMapping:0x12BC + }, + { code:0x12BD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12BD + ,simpleLowerCaseMapping:0x12BD + ,simpleTitleCaseMapping:0x12BD + }, + { code:0x12BE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12BE + ,simpleLowerCaseMapping:0x12BE + ,simpleTitleCaseMapping:0x12BE + }, + { code:0x12C0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12C0 + ,simpleLowerCaseMapping:0x12C0 + ,simpleTitleCaseMapping:0x12C0 + }, + { code:0x12C2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12C2 + ,simpleLowerCaseMapping:0x12C2 + ,simpleTitleCaseMapping:0x12C2 + }, + { code:0x12C3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12C3 + ,simpleLowerCaseMapping:0x12C3 + ,simpleTitleCaseMapping:0x12C3 + }, + { code:0x12C4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12C4 + ,simpleLowerCaseMapping:0x12C4 + ,simpleTitleCaseMapping:0x12C4 + }, + { code:0x12C5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12C5 + ,simpleLowerCaseMapping:0x12C5 + ,simpleTitleCaseMapping:0x12C5 + }, + { code:0x12C8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12C8 + ,simpleLowerCaseMapping:0x12C8 + ,simpleTitleCaseMapping:0x12C8 + }, + { code:0x12C9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12C9 + ,simpleLowerCaseMapping:0x12C9 + ,simpleTitleCaseMapping:0x12C9 + }, + { code:0x12CA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12CA + ,simpleLowerCaseMapping:0x12CA + ,simpleTitleCaseMapping:0x12CA + }, + { code:0x12CB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12CB + ,simpleLowerCaseMapping:0x12CB + ,simpleTitleCaseMapping:0x12CB + }, + { code:0x12CC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12CC + ,simpleLowerCaseMapping:0x12CC + ,simpleTitleCaseMapping:0x12CC + }, + { code:0x12CD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12CD + ,simpleLowerCaseMapping:0x12CD + ,simpleTitleCaseMapping:0x12CD + }, + { code:0x12CE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12CE + ,simpleLowerCaseMapping:0x12CE + ,simpleTitleCaseMapping:0x12CE + }, + { code:0x12CF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12CF + ,simpleLowerCaseMapping:0x12CF + ,simpleTitleCaseMapping:0x12CF + }, + { code:0x12D0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12D0 + ,simpleLowerCaseMapping:0x12D0 + ,simpleTitleCaseMapping:0x12D0 + }, + { code:0x12D1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12D1 + ,simpleLowerCaseMapping:0x12D1 + ,simpleTitleCaseMapping:0x12D1 + }, + { code:0x12D2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12D2 + ,simpleLowerCaseMapping:0x12D2 + ,simpleTitleCaseMapping:0x12D2 + }, + { code:0x12D3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12D3 + ,simpleLowerCaseMapping:0x12D3 + ,simpleTitleCaseMapping:0x12D3 + }, + { code:0x12D4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12D4 + ,simpleLowerCaseMapping:0x12D4 + ,simpleTitleCaseMapping:0x12D4 + }, + { code:0x12D5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12D5 + ,simpleLowerCaseMapping:0x12D5 + ,simpleTitleCaseMapping:0x12D5 + }, + { code:0x12D6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12D6 + ,simpleLowerCaseMapping:0x12D6 + ,simpleTitleCaseMapping:0x12D6 + }, + { code:0x12D8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12D8 + ,simpleLowerCaseMapping:0x12D8 + ,simpleTitleCaseMapping:0x12D8 + }, + { code:0x12D9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12D9 + ,simpleLowerCaseMapping:0x12D9 + ,simpleTitleCaseMapping:0x12D9 + }, + { code:0x12DA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12DA + ,simpleLowerCaseMapping:0x12DA + ,simpleTitleCaseMapping:0x12DA + }, + { code:0x12DB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12DB + ,simpleLowerCaseMapping:0x12DB + ,simpleTitleCaseMapping:0x12DB + }, + { code:0x12DC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12DC + ,simpleLowerCaseMapping:0x12DC + ,simpleTitleCaseMapping:0x12DC + }, + { code:0x12DD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12DD + ,simpleLowerCaseMapping:0x12DD + ,simpleTitleCaseMapping:0x12DD + }, + { code:0x12DE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12DE + ,simpleLowerCaseMapping:0x12DE + ,simpleTitleCaseMapping:0x12DE + }, + { code:0x12DF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12DF + ,simpleLowerCaseMapping:0x12DF + ,simpleTitleCaseMapping:0x12DF + }, + { code:0x12E0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12E0 + ,simpleLowerCaseMapping:0x12E0 + ,simpleTitleCaseMapping:0x12E0 + }, + { code:0x12E1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12E1 + ,simpleLowerCaseMapping:0x12E1 + ,simpleTitleCaseMapping:0x12E1 + }, + { code:0x12E2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12E2 + ,simpleLowerCaseMapping:0x12E2 + ,simpleTitleCaseMapping:0x12E2 + }, + { code:0x12E3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12E3 + ,simpleLowerCaseMapping:0x12E3 + ,simpleTitleCaseMapping:0x12E3 + }, + { code:0x12E4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12E4 + ,simpleLowerCaseMapping:0x12E4 + ,simpleTitleCaseMapping:0x12E4 + }, + { code:0x12E5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12E5 + ,simpleLowerCaseMapping:0x12E5 + ,simpleTitleCaseMapping:0x12E5 + }, + { code:0x12E6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12E6 + ,simpleLowerCaseMapping:0x12E6 + ,simpleTitleCaseMapping:0x12E6 + }, + { code:0x12E7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12E7 + ,simpleLowerCaseMapping:0x12E7 + ,simpleTitleCaseMapping:0x12E7 + }, + { code:0x12E8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12E8 + ,simpleLowerCaseMapping:0x12E8 + ,simpleTitleCaseMapping:0x12E8 + }, + { code:0x12E9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12E9 + ,simpleLowerCaseMapping:0x12E9 + ,simpleTitleCaseMapping:0x12E9 + }, + { code:0x12EA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12EA + ,simpleLowerCaseMapping:0x12EA + ,simpleTitleCaseMapping:0x12EA + }, + { code:0x12EB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12EB + ,simpleLowerCaseMapping:0x12EB + ,simpleTitleCaseMapping:0x12EB + }, + { code:0x12EC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12EC + ,simpleLowerCaseMapping:0x12EC + ,simpleTitleCaseMapping:0x12EC + }, + { code:0x12ED + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12ED + ,simpleLowerCaseMapping:0x12ED + ,simpleTitleCaseMapping:0x12ED + }, + { code:0x12EE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12EE + ,simpleLowerCaseMapping:0x12EE + ,simpleTitleCaseMapping:0x12EE + }, + { code:0x12EF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12EF + ,simpleLowerCaseMapping:0x12EF + ,simpleTitleCaseMapping:0x12EF + }, + { code:0x12F0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12F0 + ,simpleLowerCaseMapping:0x12F0 + ,simpleTitleCaseMapping:0x12F0 + }, + { code:0x12F1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12F1 + ,simpleLowerCaseMapping:0x12F1 + ,simpleTitleCaseMapping:0x12F1 + }, + { code:0x12F2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12F2 + ,simpleLowerCaseMapping:0x12F2 + ,simpleTitleCaseMapping:0x12F2 + }, + { code:0x12F3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12F3 + ,simpleLowerCaseMapping:0x12F3 + ,simpleTitleCaseMapping:0x12F3 + }, + { code:0x12F4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12F4 + ,simpleLowerCaseMapping:0x12F4 + ,simpleTitleCaseMapping:0x12F4 + }, + { code:0x12F5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12F5 + ,simpleLowerCaseMapping:0x12F5 + ,simpleTitleCaseMapping:0x12F5 + }, + { code:0x12F6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12F6 + ,simpleLowerCaseMapping:0x12F6 + ,simpleTitleCaseMapping:0x12F6 + }, + { code:0x12F7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12F7 + ,simpleLowerCaseMapping:0x12F7 + ,simpleTitleCaseMapping:0x12F7 + }, + { code:0x12F8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12F8 + ,simpleLowerCaseMapping:0x12F8 + ,simpleTitleCaseMapping:0x12F8 + }, + { code:0x12F9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12F9 + ,simpleLowerCaseMapping:0x12F9 + ,simpleTitleCaseMapping:0x12F9 + }, + { code:0x12FA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12FA + ,simpleLowerCaseMapping:0x12FA + ,simpleTitleCaseMapping:0x12FA + }, + { code:0x12FB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12FB + ,simpleLowerCaseMapping:0x12FB + ,simpleTitleCaseMapping:0x12FB + }, + { code:0x12FC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12FC + ,simpleLowerCaseMapping:0x12FC + ,simpleTitleCaseMapping:0x12FC + }, + { code:0x12FD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12FD + ,simpleLowerCaseMapping:0x12FD + ,simpleTitleCaseMapping:0x12FD + }, + { code:0x12FE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12FE + ,simpleLowerCaseMapping:0x12FE + ,simpleTitleCaseMapping:0x12FE + }, + { code:0x12FF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12FF + ,simpleLowerCaseMapping:0x12FF + ,simpleTitleCaseMapping:0x12FF + }, + { code:0x1300 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1300 + ,simpleLowerCaseMapping:0x1300 + ,simpleTitleCaseMapping:0x1300 + }, + { code:0x1301 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1301 + ,simpleLowerCaseMapping:0x1301 + ,simpleTitleCaseMapping:0x1301 + }, + { code:0x1302 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1302 + ,simpleLowerCaseMapping:0x1302 + ,simpleTitleCaseMapping:0x1302 + }, + { code:0x1303 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1303 + ,simpleLowerCaseMapping:0x1303 + ,simpleTitleCaseMapping:0x1303 + }, + { code:0x1304 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1304 + ,simpleLowerCaseMapping:0x1304 + ,simpleTitleCaseMapping:0x1304 + }, + { code:0x1305 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1305 + ,simpleLowerCaseMapping:0x1305 + ,simpleTitleCaseMapping:0x1305 + }, + { code:0x1306 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1306 + ,simpleLowerCaseMapping:0x1306 + ,simpleTitleCaseMapping:0x1306 + }, + { code:0x1307 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1307 + ,simpleLowerCaseMapping:0x1307 + ,simpleTitleCaseMapping:0x1307 + }, + { code:0x1308 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1308 + ,simpleLowerCaseMapping:0x1308 + ,simpleTitleCaseMapping:0x1308 + }, + { code:0x1309 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1309 + ,simpleLowerCaseMapping:0x1309 + ,simpleTitleCaseMapping:0x1309 + }, + { code:0x130A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x130A + ,simpleLowerCaseMapping:0x130A + ,simpleTitleCaseMapping:0x130A + }, + { code:0x130B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x130B + ,simpleLowerCaseMapping:0x130B + ,simpleTitleCaseMapping:0x130B + }, + { code:0x130C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x130C + ,simpleLowerCaseMapping:0x130C + ,simpleTitleCaseMapping:0x130C + }, + { code:0x130D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x130D + ,simpleLowerCaseMapping:0x130D + ,simpleTitleCaseMapping:0x130D + }, + { code:0x130E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x130E + ,simpleLowerCaseMapping:0x130E + ,simpleTitleCaseMapping:0x130E + }, + { code:0x130F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x130F + ,simpleLowerCaseMapping:0x130F + ,simpleTitleCaseMapping:0x130F + }, + { code:0x1310 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1310 + ,simpleLowerCaseMapping:0x1310 + ,simpleTitleCaseMapping:0x1310 + }, + { code:0x1312 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1312 + ,simpleLowerCaseMapping:0x1312 + ,simpleTitleCaseMapping:0x1312 + }, + { code:0x1313 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1313 + ,simpleLowerCaseMapping:0x1313 + ,simpleTitleCaseMapping:0x1313 + }, + { code:0x1314 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1314 + ,simpleLowerCaseMapping:0x1314 + ,simpleTitleCaseMapping:0x1314 + }, + { code:0x1315 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1315 + ,simpleLowerCaseMapping:0x1315 + ,simpleTitleCaseMapping:0x1315 + }, + { code:0x1318 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1318 + ,simpleLowerCaseMapping:0x1318 + ,simpleTitleCaseMapping:0x1318 + }, + { code:0x1319 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1319 + ,simpleLowerCaseMapping:0x1319 + ,simpleTitleCaseMapping:0x1319 + }, + { code:0x131A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x131A + ,simpleLowerCaseMapping:0x131A + ,simpleTitleCaseMapping:0x131A + }, + { code:0x131B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x131B + ,simpleLowerCaseMapping:0x131B + ,simpleTitleCaseMapping:0x131B + }, + { code:0x131C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x131C + ,simpleLowerCaseMapping:0x131C + ,simpleTitleCaseMapping:0x131C + }, + { code:0x131D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x131D + ,simpleLowerCaseMapping:0x131D + ,simpleTitleCaseMapping:0x131D + }, + { code:0x131E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x131E + ,simpleLowerCaseMapping:0x131E + ,simpleTitleCaseMapping:0x131E + }, + { code:0x131F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x131F + ,simpleLowerCaseMapping:0x131F + ,simpleTitleCaseMapping:0x131F + }, + { code:0x1320 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1320 + ,simpleLowerCaseMapping:0x1320 + ,simpleTitleCaseMapping:0x1320 + }, + { code:0x1321 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1321 + ,simpleLowerCaseMapping:0x1321 + ,simpleTitleCaseMapping:0x1321 + }, + { code:0x1322 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1322 + ,simpleLowerCaseMapping:0x1322 + ,simpleTitleCaseMapping:0x1322 + }, + { code:0x1323 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1323 + ,simpleLowerCaseMapping:0x1323 + ,simpleTitleCaseMapping:0x1323 + }, + { code:0x1324 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1324 + ,simpleLowerCaseMapping:0x1324 + ,simpleTitleCaseMapping:0x1324 + }, + { code:0x1325 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1325 + ,simpleLowerCaseMapping:0x1325 + ,simpleTitleCaseMapping:0x1325 + }, + { code:0x1326 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1326 + ,simpleLowerCaseMapping:0x1326 + ,simpleTitleCaseMapping:0x1326 + }, + { code:0x1327 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1327 + ,simpleLowerCaseMapping:0x1327 + ,simpleTitleCaseMapping:0x1327 + }, + { code:0x1328 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1328 + ,simpleLowerCaseMapping:0x1328 + ,simpleTitleCaseMapping:0x1328 + }, + { code:0x1329 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1329 + ,simpleLowerCaseMapping:0x1329 + ,simpleTitleCaseMapping:0x1329 + }, + { code:0x132A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x132A + ,simpleLowerCaseMapping:0x132A + ,simpleTitleCaseMapping:0x132A + }, + { code:0x132B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x132B + ,simpleLowerCaseMapping:0x132B + ,simpleTitleCaseMapping:0x132B + }, + { code:0x132C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x132C + ,simpleLowerCaseMapping:0x132C + ,simpleTitleCaseMapping:0x132C + }, + { code:0x132D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x132D + ,simpleLowerCaseMapping:0x132D + ,simpleTitleCaseMapping:0x132D + }, + { code:0x132E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x132E + ,simpleLowerCaseMapping:0x132E + ,simpleTitleCaseMapping:0x132E + }, + { code:0x132F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x132F + ,simpleLowerCaseMapping:0x132F + ,simpleTitleCaseMapping:0x132F + }, + { code:0x1330 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1330 + ,simpleLowerCaseMapping:0x1330 + ,simpleTitleCaseMapping:0x1330 + }, + { code:0x1331 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1331 + ,simpleLowerCaseMapping:0x1331 + ,simpleTitleCaseMapping:0x1331 + }, + { code:0x1332 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1332 + ,simpleLowerCaseMapping:0x1332 + ,simpleTitleCaseMapping:0x1332 + }, + { code:0x1333 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1333 + ,simpleLowerCaseMapping:0x1333 + ,simpleTitleCaseMapping:0x1333 + }, + { code:0x1334 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1334 + ,simpleLowerCaseMapping:0x1334 + ,simpleTitleCaseMapping:0x1334 + }, + { code:0x1335 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1335 + ,simpleLowerCaseMapping:0x1335 + ,simpleTitleCaseMapping:0x1335 + }, + { code:0x1336 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1336 + ,simpleLowerCaseMapping:0x1336 + ,simpleTitleCaseMapping:0x1336 + }, + { code:0x1337 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1337 + ,simpleLowerCaseMapping:0x1337 + ,simpleTitleCaseMapping:0x1337 + }, + { code:0x1338 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1338 + ,simpleLowerCaseMapping:0x1338 + ,simpleTitleCaseMapping:0x1338 + }, + { code:0x1339 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1339 + ,simpleLowerCaseMapping:0x1339 + ,simpleTitleCaseMapping:0x1339 + }, + { code:0x133A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x133A + ,simpleLowerCaseMapping:0x133A + ,simpleTitleCaseMapping:0x133A + }, + { code:0x133B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x133B + ,simpleLowerCaseMapping:0x133B + ,simpleTitleCaseMapping:0x133B + }, + { code:0x133C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x133C + ,simpleLowerCaseMapping:0x133C + ,simpleTitleCaseMapping:0x133C + }, + { code:0x133D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x133D + ,simpleLowerCaseMapping:0x133D + ,simpleTitleCaseMapping:0x133D + }, + { code:0x133E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x133E + ,simpleLowerCaseMapping:0x133E + ,simpleTitleCaseMapping:0x133E + }, + { code:0x133F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x133F + ,simpleLowerCaseMapping:0x133F + ,simpleTitleCaseMapping:0x133F + }, + { code:0x1340 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1340 + ,simpleLowerCaseMapping:0x1340 + ,simpleTitleCaseMapping:0x1340 + }, + { code:0x1341 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1341 + ,simpleLowerCaseMapping:0x1341 + ,simpleTitleCaseMapping:0x1341 + }, + { code:0x1342 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1342 + ,simpleLowerCaseMapping:0x1342 + ,simpleTitleCaseMapping:0x1342 + }, + { code:0x1343 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1343 + ,simpleLowerCaseMapping:0x1343 + ,simpleTitleCaseMapping:0x1343 + }, + { code:0x1344 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1344 + ,simpleLowerCaseMapping:0x1344 + ,simpleTitleCaseMapping:0x1344 + }, + { code:0x1345 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1345 + ,simpleLowerCaseMapping:0x1345 + ,simpleTitleCaseMapping:0x1345 + }, + { code:0x1346 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1346 + ,simpleLowerCaseMapping:0x1346 + ,simpleTitleCaseMapping:0x1346 + }, + { code:0x1347 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1347 + ,simpleLowerCaseMapping:0x1347 + ,simpleTitleCaseMapping:0x1347 + }, + { code:0x1348 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1348 + ,simpleLowerCaseMapping:0x1348 + ,simpleTitleCaseMapping:0x1348 + }, + { code:0x1349 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1349 + ,simpleLowerCaseMapping:0x1349 + ,simpleTitleCaseMapping:0x1349 + }, + { code:0x134A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x134A + ,simpleLowerCaseMapping:0x134A + ,simpleTitleCaseMapping:0x134A + }, + { code:0x134B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x134B + ,simpleLowerCaseMapping:0x134B + ,simpleTitleCaseMapping:0x134B + }, + { code:0x134C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x134C + ,simpleLowerCaseMapping:0x134C + ,simpleTitleCaseMapping:0x134C + }, + { code:0x134D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x134D + ,simpleLowerCaseMapping:0x134D + ,simpleTitleCaseMapping:0x134D + }, + { code:0x134E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x134E + ,simpleLowerCaseMapping:0x134E + ,simpleTitleCaseMapping:0x134E + }, + { code:0x134F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x134F + ,simpleLowerCaseMapping:0x134F + ,simpleTitleCaseMapping:0x134F + }, + { code:0x1350 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1350 + ,simpleLowerCaseMapping:0x1350 + ,simpleTitleCaseMapping:0x1350 + }, + { code:0x1351 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1351 + ,simpleLowerCaseMapping:0x1351 + ,simpleTitleCaseMapping:0x1351 + }, + { code:0x1352 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1352 + ,simpleLowerCaseMapping:0x1352 + ,simpleTitleCaseMapping:0x1352 + }, + { code:0x1353 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1353 + ,simpleLowerCaseMapping:0x1353 + ,simpleTitleCaseMapping:0x1353 + }, + { code:0x1354 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1354 + ,simpleLowerCaseMapping:0x1354 + ,simpleTitleCaseMapping:0x1354 + }, + { code:0x1355 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1355 + ,simpleLowerCaseMapping:0x1355 + ,simpleTitleCaseMapping:0x1355 + }, + { code:0x1356 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1356 + ,simpleLowerCaseMapping:0x1356 + ,simpleTitleCaseMapping:0x1356 + }, + { code:0x1357 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1357 + ,simpleLowerCaseMapping:0x1357 + ,simpleTitleCaseMapping:0x1357 + }, + { code:0x1358 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1358 + ,simpleLowerCaseMapping:0x1358 + ,simpleTitleCaseMapping:0x1358 + }, + { code:0x1359 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1359 + ,simpleLowerCaseMapping:0x1359 + ,simpleTitleCaseMapping:0x1359 + }, + { code:0x135A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x135A + ,simpleLowerCaseMapping:0x135A + ,simpleTitleCaseMapping:0x135A + }, + { code:0x135F + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x135F + ,simpleLowerCaseMapping:0x135F + ,simpleTitleCaseMapping:0x135F + }, + { code:0x1360 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1360 + ,simpleLowerCaseMapping:0x1360 + ,simpleTitleCaseMapping:0x1360 + }, + { code:0x1361 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x1361 + ,simpleLowerCaseMapping:0x1361 + ,simpleTitleCaseMapping:0x1361 + }, + { code:0x1362 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x1362 + ,simpleLowerCaseMapping:0x1362 + ,simpleTitleCaseMapping:0x1362 + }, + { code:0x1363 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x1363 + ,simpleLowerCaseMapping:0x1363 + ,simpleTitleCaseMapping:0x1363 + }, + { code:0x1364 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x1364 + ,simpleLowerCaseMapping:0x1364 + ,simpleTitleCaseMapping:0x1364 + }, + { code:0x1365 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x1365 + ,simpleLowerCaseMapping:0x1365 + ,simpleTitleCaseMapping:0x1365 + }, + { code:0x1366 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x1366 + ,simpleLowerCaseMapping:0x1366 + ,simpleTitleCaseMapping:0x1366 + }, + { code:0x1367 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x1367 + ,simpleLowerCaseMapping:0x1367 + ,simpleTitleCaseMapping:0x1367 + }, + { code:0x1368 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x1368 + ,simpleLowerCaseMapping:0x1368 + ,simpleTitleCaseMapping:0x1368 + }, + { code:0x1369 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1369 + ,simpleLowerCaseMapping:0x1369 + ,simpleTitleCaseMapping:0x1369 + }, + { code:0x136A + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x136A + ,simpleLowerCaseMapping:0x136A + ,simpleTitleCaseMapping:0x136A + }, + { code:0x136B + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x136B + ,simpleLowerCaseMapping:0x136B + ,simpleTitleCaseMapping:0x136B + }, + { code:0x136C + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x136C + ,simpleLowerCaseMapping:0x136C + ,simpleTitleCaseMapping:0x136C + }, + { code:0x136D + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x136D + ,simpleLowerCaseMapping:0x136D + ,simpleTitleCaseMapping:0x136D + }, + { code:0x136E + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x136E + ,simpleLowerCaseMapping:0x136E + ,simpleTitleCaseMapping:0x136E + }, + { code:0x136F + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x136F + ,simpleLowerCaseMapping:0x136F + ,simpleTitleCaseMapping:0x136F + }, + { code:0x1370 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1370 + ,simpleLowerCaseMapping:0x1370 + ,simpleTitleCaseMapping:0x1370 + }, + { code:0x1371 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1371 + ,simpleLowerCaseMapping:0x1371 + ,simpleTitleCaseMapping:0x1371 + }, + { code:0x1372 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1372 + ,simpleLowerCaseMapping:0x1372 + ,simpleTitleCaseMapping:0x1372 + }, + { code:0x1373 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1373 + ,simpleLowerCaseMapping:0x1373 + ,simpleTitleCaseMapping:0x1373 + }, + { code:0x1374 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1374 + ,simpleLowerCaseMapping:0x1374 + ,simpleTitleCaseMapping:0x1374 + }, + { code:0x1375 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1375 + ,simpleLowerCaseMapping:0x1375 + ,simpleTitleCaseMapping:0x1375 + }, + { code:0x1376 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1376 + ,simpleLowerCaseMapping:0x1376 + ,simpleTitleCaseMapping:0x1376 + }, + { code:0x1377 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1377 + ,simpleLowerCaseMapping:0x1377 + ,simpleTitleCaseMapping:0x1377 + }, + { code:0x1378 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1378 + ,simpleLowerCaseMapping:0x1378 + ,simpleTitleCaseMapping:0x1378 + }, + { code:0x1379 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1379 + ,simpleLowerCaseMapping:0x1379 + ,simpleTitleCaseMapping:0x1379 + }, + { code:0x137A + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x137A + ,simpleLowerCaseMapping:0x137A + ,simpleTitleCaseMapping:0x137A + }, + { code:0x137B + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x137B + ,simpleLowerCaseMapping:0x137B + ,simpleTitleCaseMapping:0x137B + }, + { code:0x137C + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x137C + ,simpleLowerCaseMapping:0x137C + ,simpleTitleCaseMapping:0x137C + }, + { code:0x1380 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1380 + ,simpleLowerCaseMapping:0x1380 + ,simpleTitleCaseMapping:0x1380 + }, + { code:0x1381 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1381 + ,simpleLowerCaseMapping:0x1381 + ,simpleTitleCaseMapping:0x1381 + }, + { code:0x1382 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1382 + ,simpleLowerCaseMapping:0x1382 + ,simpleTitleCaseMapping:0x1382 + }, + { code:0x1383 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1383 + ,simpleLowerCaseMapping:0x1383 + ,simpleTitleCaseMapping:0x1383 + }, + { code:0x1384 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1384 + ,simpleLowerCaseMapping:0x1384 + ,simpleTitleCaseMapping:0x1384 + }, + { code:0x1385 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1385 + ,simpleLowerCaseMapping:0x1385 + ,simpleTitleCaseMapping:0x1385 + }, + { code:0x1386 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1386 + ,simpleLowerCaseMapping:0x1386 + ,simpleTitleCaseMapping:0x1386 + }, + { code:0x1387 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1387 + ,simpleLowerCaseMapping:0x1387 + ,simpleTitleCaseMapping:0x1387 + }, + { code:0x1388 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1388 + ,simpleLowerCaseMapping:0x1388 + ,simpleTitleCaseMapping:0x1388 + }, + { code:0x1389 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1389 + ,simpleLowerCaseMapping:0x1389 + ,simpleTitleCaseMapping:0x1389 + }, + { code:0x138A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x138A + ,simpleLowerCaseMapping:0x138A + ,simpleTitleCaseMapping:0x138A + }, + { code:0x138B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x138B + ,simpleLowerCaseMapping:0x138B + ,simpleTitleCaseMapping:0x138B + }, + { code:0x138C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x138C + ,simpleLowerCaseMapping:0x138C + ,simpleTitleCaseMapping:0x138C + }, + { code:0x138D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x138D + ,simpleLowerCaseMapping:0x138D + ,simpleTitleCaseMapping:0x138D + }, + { code:0x138E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x138E + ,simpleLowerCaseMapping:0x138E + ,simpleTitleCaseMapping:0x138E + }, + { code:0x138F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x138F + ,simpleLowerCaseMapping:0x138F + ,simpleTitleCaseMapping:0x138F + }, + { code:0x1390 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1390 + ,simpleLowerCaseMapping:0x1390 + ,simpleTitleCaseMapping:0x1390 + }, + { code:0x1391 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1391 + ,simpleLowerCaseMapping:0x1391 + ,simpleTitleCaseMapping:0x1391 + }, + { code:0x1392 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1392 + ,simpleLowerCaseMapping:0x1392 + ,simpleTitleCaseMapping:0x1392 + }, + { code:0x1393 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1393 + ,simpleLowerCaseMapping:0x1393 + ,simpleTitleCaseMapping:0x1393 + }, + { code:0x1394 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1394 + ,simpleLowerCaseMapping:0x1394 + ,simpleTitleCaseMapping:0x1394 + }, + { code:0x1395 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1395 + ,simpleLowerCaseMapping:0x1395 + ,simpleTitleCaseMapping:0x1395 + }, + { code:0x1396 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1396 + ,simpleLowerCaseMapping:0x1396 + ,simpleTitleCaseMapping:0x1396 + }, + { code:0x1397 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1397 + ,simpleLowerCaseMapping:0x1397 + ,simpleTitleCaseMapping:0x1397 + }, + { code:0x1398 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1398 + ,simpleLowerCaseMapping:0x1398 + ,simpleTitleCaseMapping:0x1398 + }, + { code:0x1399 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1399 + ,simpleLowerCaseMapping:0x1399 + ,simpleTitleCaseMapping:0x1399 + }, + { code:0x13A0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13A0 + ,simpleLowerCaseMapping:0x13A0 + ,simpleTitleCaseMapping:0x13A0 + }, + { code:0x13A1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13A1 + ,simpleLowerCaseMapping:0x13A1 + ,simpleTitleCaseMapping:0x13A1 + }, + { code:0x13A2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13A2 + ,simpleLowerCaseMapping:0x13A2 + ,simpleTitleCaseMapping:0x13A2 + }, + { code:0x13A3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13A3 + ,simpleLowerCaseMapping:0x13A3 + ,simpleTitleCaseMapping:0x13A3 + }, + { code:0x13A4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13A4 + ,simpleLowerCaseMapping:0x13A4 + ,simpleTitleCaseMapping:0x13A4 + }, + { code:0x13A5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13A5 + ,simpleLowerCaseMapping:0x13A5 + ,simpleTitleCaseMapping:0x13A5 + }, + { code:0x13A6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13A6 + ,simpleLowerCaseMapping:0x13A6 + ,simpleTitleCaseMapping:0x13A6 + }, + { code:0x13A7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13A7 + ,simpleLowerCaseMapping:0x13A7 + ,simpleTitleCaseMapping:0x13A7 + }, + { code:0x13A8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13A8 + ,simpleLowerCaseMapping:0x13A8 + ,simpleTitleCaseMapping:0x13A8 + }, + { code:0x13A9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13A9 + ,simpleLowerCaseMapping:0x13A9 + ,simpleTitleCaseMapping:0x13A9 + }, + { code:0x13AA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13AA + ,simpleLowerCaseMapping:0x13AA + ,simpleTitleCaseMapping:0x13AA + }, + { code:0x13AB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13AB + ,simpleLowerCaseMapping:0x13AB + ,simpleTitleCaseMapping:0x13AB + }, + { code:0x13AC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13AC + ,simpleLowerCaseMapping:0x13AC + ,simpleTitleCaseMapping:0x13AC + }, + { code:0x13AD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13AD + ,simpleLowerCaseMapping:0x13AD + ,simpleTitleCaseMapping:0x13AD + }, + { code:0x13AE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13AE + ,simpleLowerCaseMapping:0x13AE + ,simpleTitleCaseMapping:0x13AE + }, + { code:0x13AF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13AF + ,simpleLowerCaseMapping:0x13AF + ,simpleTitleCaseMapping:0x13AF + }, + { code:0x13B0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13B0 + ,simpleLowerCaseMapping:0x13B0 + ,simpleTitleCaseMapping:0x13B0 + }, + { code:0x13B1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13B1 + ,simpleLowerCaseMapping:0x13B1 + ,simpleTitleCaseMapping:0x13B1 + }, + { code:0x13B2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13B2 + ,simpleLowerCaseMapping:0x13B2 + ,simpleTitleCaseMapping:0x13B2 + }, + { code:0x13B3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13B3 + ,simpleLowerCaseMapping:0x13B3 + ,simpleTitleCaseMapping:0x13B3 + }, + { code:0x13B4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13B4 + ,simpleLowerCaseMapping:0x13B4 + ,simpleTitleCaseMapping:0x13B4 + }, + { code:0x13B5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13B5 + ,simpleLowerCaseMapping:0x13B5 + ,simpleTitleCaseMapping:0x13B5 + }, + { code:0x13B6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13B6 + ,simpleLowerCaseMapping:0x13B6 + ,simpleTitleCaseMapping:0x13B6 + }, + { code:0x13B7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13B7 + ,simpleLowerCaseMapping:0x13B7 + ,simpleTitleCaseMapping:0x13B7 + }, + { code:0x13B8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13B8 + ,simpleLowerCaseMapping:0x13B8 + ,simpleTitleCaseMapping:0x13B8 + }, + { code:0x13B9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13B9 + ,simpleLowerCaseMapping:0x13B9 + ,simpleTitleCaseMapping:0x13B9 + }, + { code:0x13BA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13BA + ,simpleLowerCaseMapping:0x13BA + ,simpleTitleCaseMapping:0x13BA + }, + { code:0x13BB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13BB + ,simpleLowerCaseMapping:0x13BB + ,simpleTitleCaseMapping:0x13BB + }, + { code:0x13BC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13BC + ,simpleLowerCaseMapping:0x13BC + ,simpleTitleCaseMapping:0x13BC + }, + { code:0x13BD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13BD + ,simpleLowerCaseMapping:0x13BD + ,simpleTitleCaseMapping:0x13BD + }, + { code:0x13BE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13BE + ,simpleLowerCaseMapping:0x13BE + ,simpleTitleCaseMapping:0x13BE + }, + { code:0x13BF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13BF + ,simpleLowerCaseMapping:0x13BF + ,simpleTitleCaseMapping:0x13BF + }, + { code:0x13C0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13C0 + ,simpleLowerCaseMapping:0x13C0 + ,simpleTitleCaseMapping:0x13C0 + }, + { code:0x13C1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13C1 + ,simpleLowerCaseMapping:0x13C1 + ,simpleTitleCaseMapping:0x13C1 + }, + { code:0x13C2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13C2 + ,simpleLowerCaseMapping:0x13C2 + ,simpleTitleCaseMapping:0x13C2 + }, + { code:0x13C3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13C3 + ,simpleLowerCaseMapping:0x13C3 + ,simpleTitleCaseMapping:0x13C3 + }, + { code:0x13C4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13C4 + ,simpleLowerCaseMapping:0x13C4 + ,simpleTitleCaseMapping:0x13C4 + }, + { code:0x13C5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13C5 + ,simpleLowerCaseMapping:0x13C5 + ,simpleTitleCaseMapping:0x13C5 + }, + { code:0x13C6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13C6 + ,simpleLowerCaseMapping:0x13C6 + ,simpleTitleCaseMapping:0x13C6 + }, + { code:0x13C7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13C7 + ,simpleLowerCaseMapping:0x13C7 + ,simpleTitleCaseMapping:0x13C7 + }, + { code:0x13C8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13C8 + ,simpleLowerCaseMapping:0x13C8 + ,simpleTitleCaseMapping:0x13C8 + }, + { code:0x13C9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13C9 + ,simpleLowerCaseMapping:0x13C9 + ,simpleTitleCaseMapping:0x13C9 + }, + { code:0x13CA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13CA + ,simpleLowerCaseMapping:0x13CA + ,simpleTitleCaseMapping:0x13CA + }, + { code:0x13CB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13CB + ,simpleLowerCaseMapping:0x13CB + ,simpleTitleCaseMapping:0x13CB + }, + { code:0x13CC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13CC + ,simpleLowerCaseMapping:0x13CC + ,simpleTitleCaseMapping:0x13CC + }, + { code:0x13CD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13CD + ,simpleLowerCaseMapping:0x13CD + ,simpleTitleCaseMapping:0x13CD + }, + { code:0x13CE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13CE + ,simpleLowerCaseMapping:0x13CE + ,simpleTitleCaseMapping:0x13CE + }, + { code:0x13CF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13CF + ,simpleLowerCaseMapping:0x13CF + ,simpleTitleCaseMapping:0x13CF + }, + { code:0x13D0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13D0 + ,simpleLowerCaseMapping:0x13D0 + ,simpleTitleCaseMapping:0x13D0 + }, + { code:0x13D1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13D1 + ,simpleLowerCaseMapping:0x13D1 + ,simpleTitleCaseMapping:0x13D1 + }, + { code:0x13D2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13D2 + ,simpleLowerCaseMapping:0x13D2 + ,simpleTitleCaseMapping:0x13D2 + }, + { code:0x13D3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13D3 + ,simpleLowerCaseMapping:0x13D3 + ,simpleTitleCaseMapping:0x13D3 + }, + { code:0x13D4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13D4 + ,simpleLowerCaseMapping:0x13D4 + ,simpleTitleCaseMapping:0x13D4 + }, + { code:0x13D5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13D5 + ,simpleLowerCaseMapping:0x13D5 + ,simpleTitleCaseMapping:0x13D5 + }, + { code:0x13D6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13D6 + ,simpleLowerCaseMapping:0x13D6 + ,simpleTitleCaseMapping:0x13D6 + }, + { code:0x13D7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13D7 + ,simpleLowerCaseMapping:0x13D7 + ,simpleTitleCaseMapping:0x13D7 + }, + { code:0x13D8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13D8 + ,simpleLowerCaseMapping:0x13D8 + ,simpleTitleCaseMapping:0x13D8 + }, + { code:0x13D9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13D9 + ,simpleLowerCaseMapping:0x13D9 + ,simpleTitleCaseMapping:0x13D9 + }, + { code:0x13DA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13DA + ,simpleLowerCaseMapping:0x13DA + ,simpleTitleCaseMapping:0x13DA + }, + { code:0x13DB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13DB + ,simpleLowerCaseMapping:0x13DB + ,simpleTitleCaseMapping:0x13DB + }, + { code:0x13DC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13DC + ,simpleLowerCaseMapping:0x13DC + ,simpleTitleCaseMapping:0x13DC + }, + { code:0x13DD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13DD + ,simpleLowerCaseMapping:0x13DD + ,simpleTitleCaseMapping:0x13DD + }, + { code:0x13DE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13DE + ,simpleLowerCaseMapping:0x13DE + ,simpleTitleCaseMapping:0x13DE + }, + { code:0x13DF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13DF + ,simpleLowerCaseMapping:0x13DF + ,simpleTitleCaseMapping:0x13DF + }, + { code:0x13E0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13E0 + ,simpleLowerCaseMapping:0x13E0 + ,simpleTitleCaseMapping:0x13E0 + }, + { code:0x13E1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13E1 + ,simpleLowerCaseMapping:0x13E1 + ,simpleTitleCaseMapping:0x13E1 + }, + { code:0x13E2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13E2 + ,simpleLowerCaseMapping:0x13E2 + ,simpleTitleCaseMapping:0x13E2 + }, + { code:0x13E3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13E3 + ,simpleLowerCaseMapping:0x13E3 + ,simpleTitleCaseMapping:0x13E3 + }, + { code:0x13E4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13E4 + ,simpleLowerCaseMapping:0x13E4 + ,simpleTitleCaseMapping:0x13E4 + }, + { code:0x13E5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13E5 + ,simpleLowerCaseMapping:0x13E5 + ,simpleTitleCaseMapping:0x13E5 + }, + { code:0x13E6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13E6 + ,simpleLowerCaseMapping:0x13E6 + ,simpleTitleCaseMapping:0x13E6 + }, + { code:0x13E7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13E7 + ,simpleLowerCaseMapping:0x13E7 + ,simpleTitleCaseMapping:0x13E7 + }, + { code:0x13E8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13E8 + ,simpleLowerCaseMapping:0x13E8 + ,simpleTitleCaseMapping:0x13E8 + }, + { code:0x13E9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13E9 + ,simpleLowerCaseMapping:0x13E9 + ,simpleTitleCaseMapping:0x13E9 + }, + { code:0x13EA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13EA + ,simpleLowerCaseMapping:0x13EA + ,simpleTitleCaseMapping:0x13EA + }, + { code:0x13EB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13EB + ,simpleLowerCaseMapping:0x13EB + ,simpleTitleCaseMapping:0x13EB + }, + { code:0x13EC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13EC + ,simpleLowerCaseMapping:0x13EC + ,simpleTitleCaseMapping:0x13EC + }, + { code:0x13ED + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13ED + ,simpleLowerCaseMapping:0x13ED + ,simpleTitleCaseMapping:0x13ED + }, + { code:0x13EE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13EE + ,simpleLowerCaseMapping:0x13EE + ,simpleTitleCaseMapping:0x13EE + }, + { code:0x13EF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13EF + ,simpleLowerCaseMapping:0x13EF + ,simpleTitleCaseMapping:0x13EF + }, + { code:0x13F0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13F0 + ,simpleLowerCaseMapping:0x13F0 + ,simpleTitleCaseMapping:0x13F0 + }, + { code:0x13F1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13F1 + ,simpleLowerCaseMapping:0x13F1 + ,simpleTitleCaseMapping:0x13F1 + }, + { code:0x13F2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13F2 + ,simpleLowerCaseMapping:0x13F2 + ,simpleTitleCaseMapping:0x13F2 + }, + { code:0x13F3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13F3 + ,simpleLowerCaseMapping:0x13F3 + ,simpleTitleCaseMapping:0x13F3 + }, + { code:0x13F4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x13F4 + ,simpleLowerCaseMapping:0x13F4 + ,simpleTitleCaseMapping:0x13F4 + }, + { code:0x1401 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1401 + ,simpleLowerCaseMapping:0x1401 + ,simpleTitleCaseMapping:0x1401 + }, + { code:0x1402 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1402 + ,simpleLowerCaseMapping:0x1402 + ,simpleTitleCaseMapping:0x1402 + }, + { code:0x1403 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1403 + ,simpleLowerCaseMapping:0x1403 + ,simpleTitleCaseMapping:0x1403 + }, + { code:0x1404 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1404 + ,simpleLowerCaseMapping:0x1404 + ,simpleTitleCaseMapping:0x1404 + }, + { code:0x1405 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1405 + ,simpleLowerCaseMapping:0x1405 + ,simpleTitleCaseMapping:0x1405 + }, + { code:0x1406 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1406 + ,simpleLowerCaseMapping:0x1406 + ,simpleTitleCaseMapping:0x1406 + }, + { code:0x1407 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1407 + ,simpleLowerCaseMapping:0x1407 + ,simpleTitleCaseMapping:0x1407 + }, + { code:0x1408 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1408 + ,simpleLowerCaseMapping:0x1408 + ,simpleTitleCaseMapping:0x1408 + }, + { code:0x1409 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1409 + ,simpleLowerCaseMapping:0x1409 + ,simpleTitleCaseMapping:0x1409 + }, + { code:0x140A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x140A + ,simpleLowerCaseMapping:0x140A + ,simpleTitleCaseMapping:0x140A + }, + { code:0x140B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x140B + ,simpleLowerCaseMapping:0x140B + ,simpleTitleCaseMapping:0x140B + }, + { code:0x140C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x140C + ,simpleLowerCaseMapping:0x140C + ,simpleTitleCaseMapping:0x140C + }, + { code:0x140D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x140D + ,simpleLowerCaseMapping:0x140D + ,simpleTitleCaseMapping:0x140D + }, + { code:0x140E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x140E + ,simpleLowerCaseMapping:0x140E + ,simpleTitleCaseMapping:0x140E + }, + { code:0x140F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x140F + ,simpleLowerCaseMapping:0x140F + ,simpleTitleCaseMapping:0x140F + }, + { code:0x1410 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1410 + ,simpleLowerCaseMapping:0x1410 + ,simpleTitleCaseMapping:0x1410 + }, + { code:0x1411 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1411 + ,simpleLowerCaseMapping:0x1411 + ,simpleTitleCaseMapping:0x1411 + }, + { code:0x1412 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1412 + ,simpleLowerCaseMapping:0x1412 + ,simpleTitleCaseMapping:0x1412 + }, + { code:0x1413 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1413 + ,simpleLowerCaseMapping:0x1413 + ,simpleTitleCaseMapping:0x1413 + }, + { code:0x1414 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1414 + ,simpleLowerCaseMapping:0x1414 + ,simpleTitleCaseMapping:0x1414 + }, + { code:0x1415 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1415 + ,simpleLowerCaseMapping:0x1415 + ,simpleTitleCaseMapping:0x1415 + }, + { code:0x1416 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1416 + ,simpleLowerCaseMapping:0x1416 + ,simpleTitleCaseMapping:0x1416 + }, + { code:0x1417 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1417 + ,simpleLowerCaseMapping:0x1417 + ,simpleTitleCaseMapping:0x1417 + }, + { code:0x1418 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1418 + ,simpleLowerCaseMapping:0x1418 + ,simpleTitleCaseMapping:0x1418 + }, + { code:0x1419 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1419 + ,simpleLowerCaseMapping:0x1419 + ,simpleTitleCaseMapping:0x1419 + }, + { code:0x141A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x141A + ,simpleLowerCaseMapping:0x141A + ,simpleTitleCaseMapping:0x141A + }, + { code:0x141B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x141B + ,simpleLowerCaseMapping:0x141B + ,simpleTitleCaseMapping:0x141B + }, + { code:0x141C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x141C + ,simpleLowerCaseMapping:0x141C + ,simpleTitleCaseMapping:0x141C + }, + { code:0x141D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x141D + ,simpleLowerCaseMapping:0x141D + ,simpleTitleCaseMapping:0x141D + }, + { code:0x141E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x141E + ,simpleLowerCaseMapping:0x141E + ,simpleTitleCaseMapping:0x141E + }, + { code:0x141F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x141F + ,simpleLowerCaseMapping:0x141F + ,simpleTitleCaseMapping:0x141F + }, + { code:0x1420 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1420 + ,simpleLowerCaseMapping:0x1420 + ,simpleTitleCaseMapping:0x1420 + }, + { code:0x1421 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1421 + ,simpleLowerCaseMapping:0x1421 + ,simpleTitleCaseMapping:0x1421 + }, + { code:0x1422 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1422 + ,simpleLowerCaseMapping:0x1422 + ,simpleTitleCaseMapping:0x1422 + }, + { code:0x1423 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1423 + ,simpleLowerCaseMapping:0x1423 + ,simpleTitleCaseMapping:0x1423 + }, + { code:0x1424 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1424 + ,simpleLowerCaseMapping:0x1424 + ,simpleTitleCaseMapping:0x1424 + }, + { code:0x1425 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1425 + ,simpleLowerCaseMapping:0x1425 + ,simpleTitleCaseMapping:0x1425 + }, + { code:0x1426 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1426 + ,simpleLowerCaseMapping:0x1426 + ,simpleTitleCaseMapping:0x1426 + }, + { code:0x1427 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1427 + ,simpleLowerCaseMapping:0x1427 + ,simpleTitleCaseMapping:0x1427 + }, + { code:0x1428 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1428 + ,simpleLowerCaseMapping:0x1428 + ,simpleTitleCaseMapping:0x1428 + }, + { code:0x1429 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1429 + ,simpleLowerCaseMapping:0x1429 + ,simpleTitleCaseMapping:0x1429 + }, + { code:0x142A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x142A + ,simpleLowerCaseMapping:0x142A + ,simpleTitleCaseMapping:0x142A + }, + { code:0x142B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x142B + ,simpleLowerCaseMapping:0x142B + ,simpleTitleCaseMapping:0x142B + }, + { code:0x142C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x142C + ,simpleLowerCaseMapping:0x142C + ,simpleTitleCaseMapping:0x142C + }, + { code:0x142D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x142D + ,simpleLowerCaseMapping:0x142D + ,simpleTitleCaseMapping:0x142D + }, + { code:0x142E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x142E + ,simpleLowerCaseMapping:0x142E + ,simpleTitleCaseMapping:0x142E + }, + { code:0x142F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x142F + ,simpleLowerCaseMapping:0x142F + ,simpleTitleCaseMapping:0x142F + }, + { code:0x1430 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1430 + ,simpleLowerCaseMapping:0x1430 + ,simpleTitleCaseMapping:0x1430 + }, + { code:0x1431 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1431 + ,simpleLowerCaseMapping:0x1431 + ,simpleTitleCaseMapping:0x1431 + }, + { code:0x1432 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1432 + ,simpleLowerCaseMapping:0x1432 + ,simpleTitleCaseMapping:0x1432 + }, + { code:0x1433 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1433 + ,simpleLowerCaseMapping:0x1433 + ,simpleTitleCaseMapping:0x1433 + }, + { code:0x1434 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1434 + ,simpleLowerCaseMapping:0x1434 + ,simpleTitleCaseMapping:0x1434 + }, + { code:0x1435 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1435 + ,simpleLowerCaseMapping:0x1435 + ,simpleTitleCaseMapping:0x1435 + }, + { code:0x1436 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1436 + ,simpleLowerCaseMapping:0x1436 + ,simpleTitleCaseMapping:0x1436 + }, + { code:0x1437 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1437 + ,simpleLowerCaseMapping:0x1437 + ,simpleTitleCaseMapping:0x1437 + }, + { code:0x1438 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1438 + ,simpleLowerCaseMapping:0x1438 + ,simpleTitleCaseMapping:0x1438 + }, + { code:0x1439 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1439 + ,simpleLowerCaseMapping:0x1439 + ,simpleTitleCaseMapping:0x1439 + }, + { code:0x143A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x143A + ,simpleLowerCaseMapping:0x143A + ,simpleTitleCaseMapping:0x143A + }, + { code:0x143B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x143B + ,simpleLowerCaseMapping:0x143B + ,simpleTitleCaseMapping:0x143B + }, + { code:0x143C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x143C + ,simpleLowerCaseMapping:0x143C + ,simpleTitleCaseMapping:0x143C + }, + { code:0x143D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x143D + ,simpleLowerCaseMapping:0x143D + ,simpleTitleCaseMapping:0x143D + }, + { code:0x143E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x143E + ,simpleLowerCaseMapping:0x143E + ,simpleTitleCaseMapping:0x143E + }, + { code:0x143F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x143F + ,simpleLowerCaseMapping:0x143F + ,simpleTitleCaseMapping:0x143F + }, + { code:0x1440 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1440 + ,simpleLowerCaseMapping:0x1440 + ,simpleTitleCaseMapping:0x1440 + }, + { code:0x1441 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1441 + ,simpleLowerCaseMapping:0x1441 + ,simpleTitleCaseMapping:0x1441 + }, + { code:0x1442 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1442 + ,simpleLowerCaseMapping:0x1442 + ,simpleTitleCaseMapping:0x1442 + }, + { code:0x1443 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1443 + ,simpleLowerCaseMapping:0x1443 + ,simpleTitleCaseMapping:0x1443 + }, + { code:0x1444 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1444 + ,simpleLowerCaseMapping:0x1444 + ,simpleTitleCaseMapping:0x1444 + }, + { code:0x1445 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1445 + ,simpleLowerCaseMapping:0x1445 + ,simpleTitleCaseMapping:0x1445 + }, + { code:0x1446 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1446 + ,simpleLowerCaseMapping:0x1446 + ,simpleTitleCaseMapping:0x1446 + }, + { code:0x1447 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1447 + ,simpleLowerCaseMapping:0x1447 + ,simpleTitleCaseMapping:0x1447 + }, + { code:0x1448 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1448 + ,simpleLowerCaseMapping:0x1448 + ,simpleTitleCaseMapping:0x1448 + }, + { code:0x1449 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1449 + ,simpleLowerCaseMapping:0x1449 + ,simpleTitleCaseMapping:0x1449 + }, + { code:0x144A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x144A + ,simpleLowerCaseMapping:0x144A + ,simpleTitleCaseMapping:0x144A + }, + { code:0x144B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x144B + ,simpleLowerCaseMapping:0x144B + ,simpleTitleCaseMapping:0x144B + }, + { code:0x144C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x144C + ,simpleLowerCaseMapping:0x144C + ,simpleTitleCaseMapping:0x144C + }, + { code:0x144D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x144D + ,simpleLowerCaseMapping:0x144D + ,simpleTitleCaseMapping:0x144D + }, + { code:0x144E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x144E + ,simpleLowerCaseMapping:0x144E + ,simpleTitleCaseMapping:0x144E + }, + { code:0x144F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x144F + ,simpleLowerCaseMapping:0x144F + ,simpleTitleCaseMapping:0x144F + }, + { code:0x1450 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1450 + ,simpleLowerCaseMapping:0x1450 + ,simpleTitleCaseMapping:0x1450 + }, + { code:0x1451 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1451 + ,simpleLowerCaseMapping:0x1451 + ,simpleTitleCaseMapping:0x1451 + }, + { code:0x1452 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1452 + ,simpleLowerCaseMapping:0x1452 + ,simpleTitleCaseMapping:0x1452 + }, + { code:0x1453 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1453 + ,simpleLowerCaseMapping:0x1453 + ,simpleTitleCaseMapping:0x1453 + }, + { code:0x1454 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1454 + ,simpleLowerCaseMapping:0x1454 + ,simpleTitleCaseMapping:0x1454 + }, + { code:0x1455 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1455 + ,simpleLowerCaseMapping:0x1455 + ,simpleTitleCaseMapping:0x1455 + }, + { code:0x1456 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1456 + ,simpleLowerCaseMapping:0x1456 + ,simpleTitleCaseMapping:0x1456 + }, + { code:0x1457 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1457 + ,simpleLowerCaseMapping:0x1457 + ,simpleTitleCaseMapping:0x1457 + }, + { code:0x1458 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1458 + ,simpleLowerCaseMapping:0x1458 + ,simpleTitleCaseMapping:0x1458 + }, + { code:0x1459 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1459 + ,simpleLowerCaseMapping:0x1459 + ,simpleTitleCaseMapping:0x1459 + }, + { code:0x145A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x145A + ,simpleLowerCaseMapping:0x145A + ,simpleTitleCaseMapping:0x145A + }, + { code:0x145B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x145B + ,simpleLowerCaseMapping:0x145B + ,simpleTitleCaseMapping:0x145B + }, + { code:0x145C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x145C + ,simpleLowerCaseMapping:0x145C + ,simpleTitleCaseMapping:0x145C + }, + { code:0x145D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x145D + ,simpleLowerCaseMapping:0x145D + ,simpleTitleCaseMapping:0x145D + }, + { code:0x145E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x145E + ,simpleLowerCaseMapping:0x145E + ,simpleTitleCaseMapping:0x145E + }, + { code:0x145F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x145F + ,simpleLowerCaseMapping:0x145F + ,simpleTitleCaseMapping:0x145F + }, + { code:0x1460 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1460 + ,simpleLowerCaseMapping:0x1460 + ,simpleTitleCaseMapping:0x1460 + }, + { code:0x1461 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1461 + ,simpleLowerCaseMapping:0x1461 + ,simpleTitleCaseMapping:0x1461 + }, + { code:0x1462 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1462 + ,simpleLowerCaseMapping:0x1462 + ,simpleTitleCaseMapping:0x1462 + }, + { code:0x1463 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1463 + ,simpleLowerCaseMapping:0x1463 + ,simpleTitleCaseMapping:0x1463 + }, + { code:0x1464 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1464 + ,simpleLowerCaseMapping:0x1464 + ,simpleTitleCaseMapping:0x1464 + }, + { code:0x1465 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1465 + ,simpleLowerCaseMapping:0x1465 + ,simpleTitleCaseMapping:0x1465 + }, + { code:0x1466 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1466 + ,simpleLowerCaseMapping:0x1466 + ,simpleTitleCaseMapping:0x1466 + }, + { code:0x1467 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1467 + ,simpleLowerCaseMapping:0x1467 + ,simpleTitleCaseMapping:0x1467 + }, + { code:0x1468 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1468 + ,simpleLowerCaseMapping:0x1468 + ,simpleTitleCaseMapping:0x1468 + }, + { code:0x1469 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1469 + ,simpleLowerCaseMapping:0x1469 + ,simpleTitleCaseMapping:0x1469 + }, + { code:0x146A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x146A + ,simpleLowerCaseMapping:0x146A + ,simpleTitleCaseMapping:0x146A + }, + { code:0x146B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x146B + ,simpleLowerCaseMapping:0x146B + ,simpleTitleCaseMapping:0x146B + }, + { code:0x146C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x146C + ,simpleLowerCaseMapping:0x146C + ,simpleTitleCaseMapping:0x146C + }, + { code:0x146D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x146D + ,simpleLowerCaseMapping:0x146D + ,simpleTitleCaseMapping:0x146D + }, + { code:0x146E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x146E + ,simpleLowerCaseMapping:0x146E + ,simpleTitleCaseMapping:0x146E + }, + { code:0x146F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x146F + ,simpleLowerCaseMapping:0x146F + ,simpleTitleCaseMapping:0x146F + }, + { code:0x1470 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1470 + ,simpleLowerCaseMapping:0x1470 + ,simpleTitleCaseMapping:0x1470 + }, + { code:0x1471 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1471 + ,simpleLowerCaseMapping:0x1471 + ,simpleTitleCaseMapping:0x1471 + }, + { code:0x1472 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1472 + ,simpleLowerCaseMapping:0x1472 + ,simpleTitleCaseMapping:0x1472 + }, + { code:0x1473 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1473 + ,simpleLowerCaseMapping:0x1473 + ,simpleTitleCaseMapping:0x1473 + }, + { code:0x1474 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1474 + ,simpleLowerCaseMapping:0x1474 + ,simpleTitleCaseMapping:0x1474 + }, + { code:0x1475 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1475 + ,simpleLowerCaseMapping:0x1475 + ,simpleTitleCaseMapping:0x1475 + }, + { code:0x1476 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1476 + ,simpleLowerCaseMapping:0x1476 + ,simpleTitleCaseMapping:0x1476 + }, + { code:0x1477 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1477 + ,simpleLowerCaseMapping:0x1477 + ,simpleTitleCaseMapping:0x1477 + }, + { code:0x1478 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1478 + ,simpleLowerCaseMapping:0x1478 + ,simpleTitleCaseMapping:0x1478 + }, + { code:0x1479 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1479 + ,simpleLowerCaseMapping:0x1479 + ,simpleTitleCaseMapping:0x1479 + }, + { code:0x147A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x147A + ,simpleLowerCaseMapping:0x147A + ,simpleTitleCaseMapping:0x147A + }, + { code:0x147B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x147B + ,simpleLowerCaseMapping:0x147B + ,simpleTitleCaseMapping:0x147B + }, + { code:0x147C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x147C + ,simpleLowerCaseMapping:0x147C + ,simpleTitleCaseMapping:0x147C + }, + { code:0x147D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x147D + ,simpleLowerCaseMapping:0x147D + ,simpleTitleCaseMapping:0x147D + }, + { code:0x147E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x147E + ,simpleLowerCaseMapping:0x147E + ,simpleTitleCaseMapping:0x147E + }, + { code:0x147F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x147F + ,simpleLowerCaseMapping:0x147F + ,simpleTitleCaseMapping:0x147F + }, + { code:0x1480 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1480 + ,simpleLowerCaseMapping:0x1480 + ,simpleTitleCaseMapping:0x1480 + }, + { code:0x1481 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1481 + ,simpleLowerCaseMapping:0x1481 + ,simpleTitleCaseMapping:0x1481 + }, + { code:0x1482 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1482 + ,simpleLowerCaseMapping:0x1482 + ,simpleTitleCaseMapping:0x1482 + }, + { code:0x1483 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1483 + ,simpleLowerCaseMapping:0x1483 + ,simpleTitleCaseMapping:0x1483 + }, + { code:0x1484 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1484 + ,simpleLowerCaseMapping:0x1484 + ,simpleTitleCaseMapping:0x1484 + }, + { code:0x1485 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1485 + ,simpleLowerCaseMapping:0x1485 + ,simpleTitleCaseMapping:0x1485 + }, + { code:0x1486 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1486 + ,simpleLowerCaseMapping:0x1486 + ,simpleTitleCaseMapping:0x1486 + }, + { code:0x1487 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1487 + ,simpleLowerCaseMapping:0x1487 + ,simpleTitleCaseMapping:0x1487 + }, + { code:0x1488 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1488 + ,simpleLowerCaseMapping:0x1488 + ,simpleTitleCaseMapping:0x1488 + }, + { code:0x1489 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1489 + ,simpleLowerCaseMapping:0x1489 + ,simpleTitleCaseMapping:0x1489 + }, + { code:0x148A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x148A + ,simpleLowerCaseMapping:0x148A + ,simpleTitleCaseMapping:0x148A + }, + { code:0x148B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x148B + ,simpleLowerCaseMapping:0x148B + ,simpleTitleCaseMapping:0x148B + }, + { code:0x148C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x148C + ,simpleLowerCaseMapping:0x148C + ,simpleTitleCaseMapping:0x148C + }, + { code:0x148D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x148D + ,simpleLowerCaseMapping:0x148D + ,simpleTitleCaseMapping:0x148D + }, + { code:0x148E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x148E + ,simpleLowerCaseMapping:0x148E + ,simpleTitleCaseMapping:0x148E + }, + { code:0x148F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x148F + ,simpleLowerCaseMapping:0x148F + ,simpleTitleCaseMapping:0x148F + }, + { code:0x1490 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1490 + ,simpleLowerCaseMapping:0x1490 + ,simpleTitleCaseMapping:0x1490 + }, + { code:0x1491 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1491 + ,simpleLowerCaseMapping:0x1491 + ,simpleTitleCaseMapping:0x1491 + }, + { code:0x1492 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1492 + ,simpleLowerCaseMapping:0x1492 + ,simpleTitleCaseMapping:0x1492 + }, + { code:0x1493 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1493 + ,simpleLowerCaseMapping:0x1493 + ,simpleTitleCaseMapping:0x1493 + }, + { code:0x1494 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1494 + ,simpleLowerCaseMapping:0x1494 + ,simpleTitleCaseMapping:0x1494 + }, + { code:0x1495 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1495 + ,simpleLowerCaseMapping:0x1495 + ,simpleTitleCaseMapping:0x1495 + }, + { code:0x1496 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1496 + ,simpleLowerCaseMapping:0x1496 + ,simpleTitleCaseMapping:0x1496 + }, + { code:0x1497 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1497 + ,simpleLowerCaseMapping:0x1497 + ,simpleTitleCaseMapping:0x1497 + }, + { code:0x1498 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1498 + ,simpleLowerCaseMapping:0x1498 + ,simpleTitleCaseMapping:0x1498 + }, + { code:0x1499 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1499 + ,simpleLowerCaseMapping:0x1499 + ,simpleTitleCaseMapping:0x1499 + }, + { code:0x149A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x149A + ,simpleLowerCaseMapping:0x149A + ,simpleTitleCaseMapping:0x149A + }, + { code:0x149B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x149B + ,simpleLowerCaseMapping:0x149B + ,simpleTitleCaseMapping:0x149B + }, + { code:0x149C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x149C + ,simpleLowerCaseMapping:0x149C + ,simpleTitleCaseMapping:0x149C + }, + { code:0x149D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x149D + ,simpleLowerCaseMapping:0x149D + ,simpleTitleCaseMapping:0x149D + }, + { code:0x149E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x149E + ,simpleLowerCaseMapping:0x149E + ,simpleTitleCaseMapping:0x149E + }, + { code:0x149F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x149F + ,simpleLowerCaseMapping:0x149F + ,simpleTitleCaseMapping:0x149F + }, + { code:0x14A0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14A0 + ,simpleLowerCaseMapping:0x14A0 + ,simpleTitleCaseMapping:0x14A0 + }, + { code:0x14A1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14A1 + ,simpleLowerCaseMapping:0x14A1 + ,simpleTitleCaseMapping:0x14A1 + }, + { code:0x14A2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14A2 + ,simpleLowerCaseMapping:0x14A2 + ,simpleTitleCaseMapping:0x14A2 + }, + { code:0x14A3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14A3 + ,simpleLowerCaseMapping:0x14A3 + ,simpleTitleCaseMapping:0x14A3 + }, + { code:0x14A4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14A4 + ,simpleLowerCaseMapping:0x14A4 + ,simpleTitleCaseMapping:0x14A4 + }, + { code:0x14A5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14A5 + ,simpleLowerCaseMapping:0x14A5 + ,simpleTitleCaseMapping:0x14A5 + }, + { code:0x14A6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14A6 + ,simpleLowerCaseMapping:0x14A6 + ,simpleTitleCaseMapping:0x14A6 + }, + { code:0x14A7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14A7 + ,simpleLowerCaseMapping:0x14A7 + ,simpleTitleCaseMapping:0x14A7 + }, + { code:0x14A8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14A8 + ,simpleLowerCaseMapping:0x14A8 + ,simpleTitleCaseMapping:0x14A8 + }, + { code:0x14A9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14A9 + ,simpleLowerCaseMapping:0x14A9 + ,simpleTitleCaseMapping:0x14A9 + }, + { code:0x14AA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14AA + ,simpleLowerCaseMapping:0x14AA + ,simpleTitleCaseMapping:0x14AA + }, + { code:0x14AB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14AB + ,simpleLowerCaseMapping:0x14AB + ,simpleTitleCaseMapping:0x14AB + }, + { code:0x14AC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14AC + ,simpleLowerCaseMapping:0x14AC + ,simpleTitleCaseMapping:0x14AC + }, + { code:0x14AD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14AD + ,simpleLowerCaseMapping:0x14AD + ,simpleTitleCaseMapping:0x14AD + }, + { code:0x14AE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14AE + ,simpleLowerCaseMapping:0x14AE + ,simpleTitleCaseMapping:0x14AE + }, + { code:0x14AF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14AF + ,simpleLowerCaseMapping:0x14AF + ,simpleTitleCaseMapping:0x14AF + }, + { code:0x14B0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14B0 + ,simpleLowerCaseMapping:0x14B0 + ,simpleTitleCaseMapping:0x14B0 + }, + { code:0x14B1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14B1 + ,simpleLowerCaseMapping:0x14B1 + ,simpleTitleCaseMapping:0x14B1 + }, + { code:0x14B2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14B2 + ,simpleLowerCaseMapping:0x14B2 + ,simpleTitleCaseMapping:0x14B2 + }, + { code:0x14B3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14B3 + ,simpleLowerCaseMapping:0x14B3 + ,simpleTitleCaseMapping:0x14B3 + }, + { code:0x14B4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14B4 + ,simpleLowerCaseMapping:0x14B4 + ,simpleTitleCaseMapping:0x14B4 + }, + { code:0x14B5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14B5 + ,simpleLowerCaseMapping:0x14B5 + ,simpleTitleCaseMapping:0x14B5 + }, + { code:0x14B6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14B6 + ,simpleLowerCaseMapping:0x14B6 + ,simpleTitleCaseMapping:0x14B6 + }, + { code:0x14B7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14B7 + ,simpleLowerCaseMapping:0x14B7 + ,simpleTitleCaseMapping:0x14B7 + }, + { code:0x14B8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14B8 + ,simpleLowerCaseMapping:0x14B8 + ,simpleTitleCaseMapping:0x14B8 + }, + { code:0x14B9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14B9 + ,simpleLowerCaseMapping:0x14B9 + ,simpleTitleCaseMapping:0x14B9 + }, + { code:0x14BA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14BA + ,simpleLowerCaseMapping:0x14BA + ,simpleTitleCaseMapping:0x14BA + }, + { code:0x14BB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14BB + ,simpleLowerCaseMapping:0x14BB + ,simpleTitleCaseMapping:0x14BB + }, + { code:0x14BC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14BC + ,simpleLowerCaseMapping:0x14BC + ,simpleTitleCaseMapping:0x14BC + }, + { code:0x14BD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14BD + ,simpleLowerCaseMapping:0x14BD + ,simpleTitleCaseMapping:0x14BD + }, + { code:0x14BE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14BE + ,simpleLowerCaseMapping:0x14BE + ,simpleTitleCaseMapping:0x14BE + }, + { code:0x14BF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14BF + ,simpleLowerCaseMapping:0x14BF + ,simpleTitleCaseMapping:0x14BF + }, + { code:0x14C0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14C0 + ,simpleLowerCaseMapping:0x14C0 + ,simpleTitleCaseMapping:0x14C0 + }, + { code:0x14C1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14C1 + ,simpleLowerCaseMapping:0x14C1 + ,simpleTitleCaseMapping:0x14C1 + }, + { code:0x14C2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14C2 + ,simpleLowerCaseMapping:0x14C2 + ,simpleTitleCaseMapping:0x14C2 + }, + { code:0x14C3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14C3 + ,simpleLowerCaseMapping:0x14C3 + ,simpleTitleCaseMapping:0x14C3 + }, + { code:0x14C4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14C4 + ,simpleLowerCaseMapping:0x14C4 + ,simpleTitleCaseMapping:0x14C4 + }, + { code:0x14C5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14C5 + ,simpleLowerCaseMapping:0x14C5 + ,simpleTitleCaseMapping:0x14C5 + }, + { code:0x14C6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14C6 + ,simpleLowerCaseMapping:0x14C6 + ,simpleTitleCaseMapping:0x14C6 + }, + { code:0x14C7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14C7 + ,simpleLowerCaseMapping:0x14C7 + ,simpleTitleCaseMapping:0x14C7 + }, + { code:0x14C8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14C8 + ,simpleLowerCaseMapping:0x14C8 + ,simpleTitleCaseMapping:0x14C8 + }, + { code:0x14C9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14C9 + ,simpleLowerCaseMapping:0x14C9 + ,simpleTitleCaseMapping:0x14C9 + }, + { code:0x14CA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14CA + ,simpleLowerCaseMapping:0x14CA + ,simpleTitleCaseMapping:0x14CA + }, + { code:0x14CB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14CB + ,simpleLowerCaseMapping:0x14CB + ,simpleTitleCaseMapping:0x14CB + }, + { code:0x14CC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14CC + ,simpleLowerCaseMapping:0x14CC + ,simpleTitleCaseMapping:0x14CC + }, + { code:0x14CD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14CD + ,simpleLowerCaseMapping:0x14CD + ,simpleTitleCaseMapping:0x14CD + }, + { code:0x14CE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14CE + ,simpleLowerCaseMapping:0x14CE + ,simpleTitleCaseMapping:0x14CE + }, + { code:0x14CF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14CF + ,simpleLowerCaseMapping:0x14CF + ,simpleTitleCaseMapping:0x14CF + }, + { code:0x14D0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14D0 + ,simpleLowerCaseMapping:0x14D0 + ,simpleTitleCaseMapping:0x14D0 + }, + { code:0x14D1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14D1 + ,simpleLowerCaseMapping:0x14D1 + ,simpleTitleCaseMapping:0x14D1 + }, + { code:0x14D2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14D2 + ,simpleLowerCaseMapping:0x14D2 + ,simpleTitleCaseMapping:0x14D2 + }, + { code:0x14D3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14D3 + ,simpleLowerCaseMapping:0x14D3 + ,simpleTitleCaseMapping:0x14D3 + }, + { code:0x14D4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14D4 + ,simpleLowerCaseMapping:0x14D4 + ,simpleTitleCaseMapping:0x14D4 + }, + { code:0x14D5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14D5 + ,simpleLowerCaseMapping:0x14D5 + ,simpleTitleCaseMapping:0x14D5 + }, + { code:0x14D6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14D6 + ,simpleLowerCaseMapping:0x14D6 + ,simpleTitleCaseMapping:0x14D6 + }, + { code:0x14D7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14D7 + ,simpleLowerCaseMapping:0x14D7 + ,simpleTitleCaseMapping:0x14D7 + }, + { code:0x14D8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14D8 + ,simpleLowerCaseMapping:0x14D8 + ,simpleTitleCaseMapping:0x14D8 + }, + { code:0x14D9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14D9 + ,simpleLowerCaseMapping:0x14D9 + ,simpleTitleCaseMapping:0x14D9 + }, + { code:0x14DA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14DA + ,simpleLowerCaseMapping:0x14DA + ,simpleTitleCaseMapping:0x14DA + }, + { code:0x14DB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14DB + ,simpleLowerCaseMapping:0x14DB + ,simpleTitleCaseMapping:0x14DB + }, + { code:0x14DC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14DC + ,simpleLowerCaseMapping:0x14DC + ,simpleTitleCaseMapping:0x14DC + }, + { code:0x14DD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14DD + ,simpleLowerCaseMapping:0x14DD + ,simpleTitleCaseMapping:0x14DD + }, + { code:0x14DE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14DE + ,simpleLowerCaseMapping:0x14DE + ,simpleTitleCaseMapping:0x14DE + }, + { code:0x14DF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14DF + ,simpleLowerCaseMapping:0x14DF + ,simpleTitleCaseMapping:0x14DF + }, + { code:0x14E0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14E0 + ,simpleLowerCaseMapping:0x14E0 + ,simpleTitleCaseMapping:0x14E0 + }, + { code:0x14E1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14E1 + ,simpleLowerCaseMapping:0x14E1 + ,simpleTitleCaseMapping:0x14E1 + }, + { code:0x14E2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14E2 + ,simpleLowerCaseMapping:0x14E2 + ,simpleTitleCaseMapping:0x14E2 + }, + { code:0x14E3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14E3 + ,simpleLowerCaseMapping:0x14E3 + ,simpleTitleCaseMapping:0x14E3 + }, + { code:0x14E4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14E4 + ,simpleLowerCaseMapping:0x14E4 + ,simpleTitleCaseMapping:0x14E4 + }, + { code:0x14E5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14E5 + ,simpleLowerCaseMapping:0x14E5 + ,simpleTitleCaseMapping:0x14E5 + }, + { code:0x14E6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14E6 + ,simpleLowerCaseMapping:0x14E6 + ,simpleTitleCaseMapping:0x14E6 + }, + { code:0x14E7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14E7 + ,simpleLowerCaseMapping:0x14E7 + ,simpleTitleCaseMapping:0x14E7 + }, + { code:0x14E8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14E8 + ,simpleLowerCaseMapping:0x14E8 + ,simpleTitleCaseMapping:0x14E8 + }, + { code:0x14E9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14E9 + ,simpleLowerCaseMapping:0x14E9 + ,simpleTitleCaseMapping:0x14E9 + }, + { code:0x14EA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14EA + ,simpleLowerCaseMapping:0x14EA + ,simpleTitleCaseMapping:0x14EA + }, + { code:0x14EB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14EB + ,simpleLowerCaseMapping:0x14EB + ,simpleTitleCaseMapping:0x14EB + }, + { code:0x14EC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14EC + ,simpleLowerCaseMapping:0x14EC + ,simpleTitleCaseMapping:0x14EC + }, + { code:0x14ED + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14ED + ,simpleLowerCaseMapping:0x14ED + ,simpleTitleCaseMapping:0x14ED + }, + { code:0x14EE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14EE + ,simpleLowerCaseMapping:0x14EE + ,simpleTitleCaseMapping:0x14EE + }, + { code:0x14EF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14EF + ,simpleLowerCaseMapping:0x14EF + ,simpleTitleCaseMapping:0x14EF + }, + { code:0x14F0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14F0 + ,simpleLowerCaseMapping:0x14F0 + ,simpleTitleCaseMapping:0x14F0 + }, + { code:0x14F1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14F1 + ,simpleLowerCaseMapping:0x14F1 + ,simpleTitleCaseMapping:0x14F1 + }, + { code:0x14F2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14F2 + ,simpleLowerCaseMapping:0x14F2 + ,simpleTitleCaseMapping:0x14F2 + }, + { code:0x14F3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14F3 + ,simpleLowerCaseMapping:0x14F3 + ,simpleTitleCaseMapping:0x14F3 + }, + { code:0x14F4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14F4 + ,simpleLowerCaseMapping:0x14F4 + ,simpleTitleCaseMapping:0x14F4 + }, + { code:0x14F5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14F5 + ,simpleLowerCaseMapping:0x14F5 + ,simpleTitleCaseMapping:0x14F5 + }, + { code:0x14F6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14F6 + ,simpleLowerCaseMapping:0x14F6 + ,simpleTitleCaseMapping:0x14F6 + }, + { code:0x14F7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14F7 + ,simpleLowerCaseMapping:0x14F7 + ,simpleTitleCaseMapping:0x14F7 + }, + { code:0x14F8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14F8 + ,simpleLowerCaseMapping:0x14F8 + ,simpleTitleCaseMapping:0x14F8 + }, + { code:0x14F9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14F9 + ,simpleLowerCaseMapping:0x14F9 + ,simpleTitleCaseMapping:0x14F9 + }, + { code:0x14FA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14FA + ,simpleLowerCaseMapping:0x14FA + ,simpleTitleCaseMapping:0x14FA + }, + { code:0x14FB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14FB + ,simpleLowerCaseMapping:0x14FB + ,simpleTitleCaseMapping:0x14FB + }, + { code:0x14FC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14FC + ,simpleLowerCaseMapping:0x14FC + ,simpleTitleCaseMapping:0x14FC + }, + { code:0x14FD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14FD + ,simpleLowerCaseMapping:0x14FD + ,simpleTitleCaseMapping:0x14FD + }, + { code:0x14FE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14FE + ,simpleLowerCaseMapping:0x14FE + ,simpleTitleCaseMapping:0x14FE + }, + { code:0x14FF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x14FF + ,simpleLowerCaseMapping:0x14FF + ,simpleTitleCaseMapping:0x14FF + }, + { code:0x1500 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1500 + ,simpleLowerCaseMapping:0x1500 + ,simpleTitleCaseMapping:0x1500 + }, + { code:0x1501 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1501 + ,simpleLowerCaseMapping:0x1501 + ,simpleTitleCaseMapping:0x1501 + }, + { code:0x1502 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1502 + ,simpleLowerCaseMapping:0x1502 + ,simpleTitleCaseMapping:0x1502 + }, + { code:0x1503 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1503 + ,simpleLowerCaseMapping:0x1503 + ,simpleTitleCaseMapping:0x1503 + }, + { code:0x1504 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1504 + ,simpleLowerCaseMapping:0x1504 + ,simpleTitleCaseMapping:0x1504 + }, + { code:0x1505 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1505 + ,simpleLowerCaseMapping:0x1505 + ,simpleTitleCaseMapping:0x1505 + }, + { code:0x1506 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1506 + ,simpleLowerCaseMapping:0x1506 + ,simpleTitleCaseMapping:0x1506 + }, + { code:0x1507 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1507 + ,simpleLowerCaseMapping:0x1507 + ,simpleTitleCaseMapping:0x1507 + }, + { code:0x1508 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1508 + ,simpleLowerCaseMapping:0x1508 + ,simpleTitleCaseMapping:0x1508 + }, + { code:0x1509 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1509 + ,simpleLowerCaseMapping:0x1509 + ,simpleTitleCaseMapping:0x1509 + }, + { code:0x150A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x150A + ,simpleLowerCaseMapping:0x150A + ,simpleTitleCaseMapping:0x150A + }, + { code:0x150B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x150B + ,simpleLowerCaseMapping:0x150B + ,simpleTitleCaseMapping:0x150B + }, + { code:0x150C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x150C + ,simpleLowerCaseMapping:0x150C + ,simpleTitleCaseMapping:0x150C + }, + { code:0x150D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x150D + ,simpleLowerCaseMapping:0x150D + ,simpleTitleCaseMapping:0x150D + }, + { code:0x150E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x150E + ,simpleLowerCaseMapping:0x150E + ,simpleTitleCaseMapping:0x150E + }, + { code:0x150F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x150F + ,simpleLowerCaseMapping:0x150F + ,simpleTitleCaseMapping:0x150F + }, + { code:0x1510 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1510 + ,simpleLowerCaseMapping:0x1510 + ,simpleTitleCaseMapping:0x1510 + }, + { code:0x1511 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1511 + ,simpleLowerCaseMapping:0x1511 + ,simpleTitleCaseMapping:0x1511 + }, + { code:0x1512 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1512 + ,simpleLowerCaseMapping:0x1512 + ,simpleTitleCaseMapping:0x1512 + }, + { code:0x1513 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1513 + ,simpleLowerCaseMapping:0x1513 + ,simpleTitleCaseMapping:0x1513 + }, + { code:0x1514 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1514 + ,simpleLowerCaseMapping:0x1514 + ,simpleTitleCaseMapping:0x1514 + }, + { code:0x1515 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1515 + ,simpleLowerCaseMapping:0x1515 + ,simpleTitleCaseMapping:0x1515 + }, + { code:0x1516 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1516 + ,simpleLowerCaseMapping:0x1516 + ,simpleTitleCaseMapping:0x1516 + }, + { code:0x1517 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1517 + ,simpleLowerCaseMapping:0x1517 + ,simpleTitleCaseMapping:0x1517 + }, + { code:0x1518 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1518 + ,simpleLowerCaseMapping:0x1518 + ,simpleTitleCaseMapping:0x1518 + }, + { code:0x1519 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1519 + ,simpleLowerCaseMapping:0x1519 + ,simpleTitleCaseMapping:0x1519 + }, + { code:0x151A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x151A + ,simpleLowerCaseMapping:0x151A + ,simpleTitleCaseMapping:0x151A + }, + { code:0x151B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x151B + ,simpleLowerCaseMapping:0x151B + ,simpleTitleCaseMapping:0x151B + }, + { code:0x151C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x151C + ,simpleLowerCaseMapping:0x151C + ,simpleTitleCaseMapping:0x151C + }, + { code:0x151D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x151D + ,simpleLowerCaseMapping:0x151D + ,simpleTitleCaseMapping:0x151D + }, + { code:0x151E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x151E + ,simpleLowerCaseMapping:0x151E + ,simpleTitleCaseMapping:0x151E + }, + { code:0x151F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x151F + ,simpleLowerCaseMapping:0x151F + ,simpleTitleCaseMapping:0x151F + }, + { code:0x1520 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1520 + ,simpleLowerCaseMapping:0x1520 + ,simpleTitleCaseMapping:0x1520 + }, + { code:0x1521 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1521 + ,simpleLowerCaseMapping:0x1521 + ,simpleTitleCaseMapping:0x1521 + }, + { code:0x1522 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1522 + ,simpleLowerCaseMapping:0x1522 + ,simpleTitleCaseMapping:0x1522 + }, + { code:0x1523 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1523 + ,simpleLowerCaseMapping:0x1523 + ,simpleTitleCaseMapping:0x1523 + }, + { code:0x1524 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1524 + ,simpleLowerCaseMapping:0x1524 + ,simpleTitleCaseMapping:0x1524 + }, + { code:0x1525 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1525 + ,simpleLowerCaseMapping:0x1525 + ,simpleTitleCaseMapping:0x1525 + }, + { code:0x1526 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1526 + ,simpleLowerCaseMapping:0x1526 + ,simpleTitleCaseMapping:0x1526 + }, + { code:0x1527 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1527 + ,simpleLowerCaseMapping:0x1527 + ,simpleTitleCaseMapping:0x1527 + }, + { code:0x1528 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1528 + ,simpleLowerCaseMapping:0x1528 + ,simpleTitleCaseMapping:0x1528 + }, + { code:0x1529 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1529 + ,simpleLowerCaseMapping:0x1529 + ,simpleTitleCaseMapping:0x1529 + }, + { code:0x152A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x152A + ,simpleLowerCaseMapping:0x152A + ,simpleTitleCaseMapping:0x152A + }, + { code:0x152B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x152B + ,simpleLowerCaseMapping:0x152B + ,simpleTitleCaseMapping:0x152B + }, + { code:0x152C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x152C + ,simpleLowerCaseMapping:0x152C + ,simpleTitleCaseMapping:0x152C + }, + { code:0x152D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x152D + ,simpleLowerCaseMapping:0x152D + ,simpleTitleCaseMapping:0x152D + }, + { code:0x152E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x152E + ,simpleLowerCaseMapping:0x152E + ,simpleTitleCaseMapping:0x152E + }, + { code:0x152F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x152F + ,simpleLowerCaseMapping:0x152F + ,simpleTitleCaseMapping:0x152F + }, + { code:0x1530 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1530 + ,simpleLowerCaseMapping:0x1530 + ,simpleTitleCaseMapping:0x1530 + }, + { code:0x1531 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1531 + ,simpleLowerCaseMapping:0x1531 + ,simpleTitleCaseMapping:0x1531 + }, + { code:0x1532 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1532 + ,simpleLowerCaseMapping:0x1532 + ,simpleTitleCaseMapping:0x1532 + }, + { code:0x1533 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1533 + ,simpleLowerCaseMapping:0x1533 + ,simpleTitleCaseMapping:0x1533 + }, + { code:0x1534 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1534 + ,simpleLowerCaseMapping:0x1534 + ,simpleTitleCaseMapping:0x1534 + }, + { code:0x1535 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1535 + ,simpleLowerCaseMapping:0x1535 + ,simpleTitleCaseMapping:0x1535 + }, + { code:0x1536 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1536 + ,simpleLowerCaseMapping:0x1536 + ,simpleTitleCaseMapping:0x1536 + }, + { code:0x1537 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1537 + ,simpleLowerCaseMapping:0x1537 + ,simpleTitleCaseMapping:0x1537 + }, + { code:0x1538 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1538 + ,simpleLowerCaseMapping:0x1538 + ,simpleTitleCaseMapping:0x1538 + }, + { code:0x1539 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1539 + ,simpleLowerCaseMapping:0x1539 + ,simpleTitleCaseMapping:0x1539 + }, + { code:0x153A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x153A + ,simpleLowerCaseMapping:0x153A + ,simpleTitleCaseMapping:0x153A + }, + { code:0x153B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x153B + ,simpleLowerCaseMapping:0x153B + ,simpleTitleCaseMapping:0x153B + }, + { code:0x153C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x153C + ,simpleLowerCaseMapping:0x153C + ,simpleTitleCaseMapping:0x153C + }, + { code:0x153D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x153D + ,simpleLowerCaseMapping:0x153D + ,simpleTitleCaseMapping:0x153D + }, + { code:0x153E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x153E + ,simpleLowerCaseMapping:0x153E + ,simpleTitleCaseMapping:0x153E + }, + { code:0x153F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x153F + ,simpleLowerCaseMapping:0x153F + ,simpleTitleCaseMapping:0x153F + }, + { code:0x1540 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1540 + ,simpleLowerCaseMapping:0x1540 + ,simpleTitleCaseMapping:0x1540 + }, + { code:0x1541 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1541 + ,simpleLowerCaseMapping:0x1541 + ,simpleTitleCaseMapping:0x1541 + }, + { code:0x1542 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1542 + ,simpleLowerCaseMapping:0x1542 + ,simpleTitleCaseMapping:0x1542 + }, + { code:0x1543 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1543 + ,simpleLowerCaseMapping:0x1543 + ,simpleTitleCaseMapping:0x1543 + }, + { code:0x1544 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1544 + ,simpleLowerCaseMapping:0x1544 + ,simpleTitleCaseMapping:0x1544 + }, + { code:0x1545 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1545 + ,simpleLowerCaseMapping:0x1545 + ,simpleTitleCaseMapping:0x1545 + }, + { code:0x1546 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1546 + ,simpleLowerCaseMapping:0x1546 + ,simpleTitleCaseMapping:0x1546 + }, + { code:0x1547 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1547 + ,simpleLowerCaseMapping:0x1547 + ,simpleTitleCaseMapping:0x1547 + }, + { code:0x1548 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1548 + ,simpleLowerCaseMapping:0x1548 + ,simpleTitleCaseMapping:0x1548 + }, + { code:0x1549 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1549 + ,simpleLowerCaseMapping:0x1549 + ,simpleTitleCaseMapping:0x1549 + }, + { code:0x154A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x154A + ,simpleLowerCaseMapping:0x154A + ,simpleTitleCaseMapping:0x154A + }, + { code:0x154B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x154B + ,simpleLowerCaseMapping:0x154B + ,simpleTitleCaseMapping:0x154B + }, + { code:0x154C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x154C + ,simpleLowerCaseMapping:0x154C + ,simpleTitleCaseMapping:0x154C + }, + { code:0x154D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x154D + ,simpleLowerCaseMapping:0x154D + ,simpleTitleCaseMapping:0x154D + }, + { code:0x154E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x154E + ,simpleLowerCaseMapping:0x154E + ,simpleTitleCaseMapping:0x154E + }, + { code:0x154F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x154F + ,simpleLowerCaseMapping:0x154F + ,simpleTitleCaseMapping:0x154F + }, + { code:0x1550 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1550 + ,simpleLowerCaseMapping:0x1550 + ,simpleTitleCaseMapping:0x1550 + }, + { code:0x1551 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1551 + ,simpleLowerCaseMapping:0x1551 + ,simpleTitleCaseMapping:0x1551 + }, + { code:0x1552 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1552 + ,simpleLowerCaseMapping:0x1552 + ,simpleTitleCaseMapping:0x1552 + }, + { code:0x1553 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1553 + ,simpleLowerCaseMapping:0x1553 + ,simpleTitleCaseMapping:0x1553 + }, + { code:0x1554 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1554 + ,simpleLowerCaseMapping:0x1554 + ,simpleTitleCaseMapping:0x1554 + }, + { code:0x1555 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1555 + ,simpleLowerCaseMapping:0x1555 + ,simpleTitleCaseMapping:0x1555 + }, + { code:0x1556 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1556 + ,simpleLowerCaseMapping:0x1556 + ,simpleTitleCaseMapping:0x1556 + }, + { code:0x1557 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1557 + ,simpleLowerCaseMapping:0x1557 + ,simpleTitleCaseMapping:0x1557 + }, + { code:0x1558 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1558 + ,simpleLowerCaseMapping:0x1558 + ,simpleTitleCaseMapping:0x1558 + }, + { code:0x1559 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1559 + ,simpleLowerCaseMapping:0x1559 + ,simpleTitleCaseMapping:0x1559 + }, + { code:0x155A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x155A + ,simpleLowerCaseMapping:0x155A + ,simpleTitleCaseMapping:0x155A + }, + { code:0x155B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x155B + ,simpleLowerCaseMapping:0x155B + ,simpleTitleCaseMapping:0x155B + }, + { code:0x155C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x155C + ,simpleLowerCaseMapping:0x155C + ,simpleTitleCaseMapping:0x155C + }, + { code:0x155D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x155D + ,simpleLowerCaseMapping:0x155D + ,simpleTitleCaseMapping:0x155D + }, + { code:0x155E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x155E + ,simpleLowerCaseMapping:0x155E + ,simpleTitleCaseMapping:0x155E + }, + { code:0x155F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x155F + ,simpleLowerCaseMapping:0x155F + ,simpleTitleCaseMapping:0x155F + }, + { code:0x1560 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1560 + ,simpleLowerCaseMapping:0x1560 + ,simpleTitleCaseMapping:0x1560 + }, + { code:0x1561 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1561 + ,simpleLowerCaseMapping:0x1561 + ,simpleTitleCaseMapping:0x1561 + }, + { code:0x1562 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1562 + ,simpleLowerCaseMapping:0x1562 + ,simpleTitleCaseMapping:0x1562 + }, + { code:0x1563 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1563 + ,simpleLowerCaseMapping:0x1563 + ,simpleTitleCaseMapping:0x1563 + }, + { code:0x1564 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1564 + ,simpleLowerCaseMapping:0x1564 + ,simpleTitleCaseMapping:0x1564 + }, + { code:0x1565 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1565 + ,simpleLowerCaseMapping:0x1565 + ,simpleTitleCaseMapping:0x1565 + }, + { code:0x1566 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1566 + ,simpleLowerCaseMapping:0x1566 + ,simpleTitleCaseMapping:0x1566 + }, + { code:0x1567 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1567 + ,simpleLowerCaseMapping:0x1567 + ,simpleTitleCaseMapping:0x1567 + }, + { code:0x1568 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1568 + ,simpleLowerCaseMapping:0x1568 + ,simpleTitleCaseMapping:0x1568 + }, + { code:0x1569 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1569 + ,simpleLowerCaseMapping:0x1569 + ,simpleTitleCaseMapping:0x1569 + }, + { code:0x156A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x156A + ,simpleLowerCaseMapping:0x156A + ,simpleTitleCaseMapping:0x156A + }, + { code:0x156B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x156B + ,simpleLowerCaseMapping:0x156B + ,simpleTitleCaseMapping:0x156B + }, + { code:0x156C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x156C + ,simpleLowerCaseMapping:0x156C + ,simpleTitleCaseMapping:0x156C + }, + { code:0x156D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x156D + ,simpleLowerCaseMapping:0x156D + ,simpleTitleCaseMapping:0x156D + }, + { code:0x156E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x156E + ,simpleLowerCaseMapping:0x156E + ,simpleTitleCaseMapping:0x156E + }, + { code:0x156F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x156F + ,simpleLowerCaseMapping:0x156F + ,simpleTitleCaseMapping:0x156F + }, + { code:0x1570 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1570 + ,simpleLowerCaseMapping:0x1570 + ,simpleTitleCaseMapping:0x1570 + }, + { code:0x1571 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1571 + ,simpleLowerCaseMapping:0x1571 + ,simpleTitleCaseMapping:0x1571 + }, + { code:0x1572 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1572 + ,simpleLowerCaseMapping:0x1572 + ,simpleTitleCaseMapping:0x1572 + }, + { code:0x1573 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1573 + ,simpleLowerCaseMapping:0x1573 + ,simpleTitleCaseMapping:0x1573 + }, + { code:0x1574 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1574 + ,simpleLowerCaseMapping:0x1574 + ,simpleTitleCaseMapping:0x1574 + }, + { code:0x1575 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1575 + ,simpleLowerCaseMapping:0x1575 + ,simpleTitleCaseMapping:0x1575 + }, + { code:0x1576 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1576 + ,simpleLowerCaseMapping:0x1576 + ,simpleTitleCaseMapping:0x1576 + }, + { code:0x1577 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1577 + ,simpleLowerCaseMapping:0x1577 + ,simpleTitleCaseMapping:0x1577 + }, + { code:0x1578 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1578 + ,simpleLowerCaseMapping:0x1578 + ,simpleTitleCaseMapping:0x1578 + }, + { code:0x1579 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1579 + ,simpleLowerCaseMapping:0x1579 + ,simpleTitleCaseMapping:0x1579 + }, + { code:0x157A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x157A + ,simpleLowerCaseMapping:0x157A + ,simpleTitleCaseMapping:0x157A + }, + { code:0x157B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x157B + ,simpleLowerCaseMapping:0x157B + ,simpleTitleCaseMapping:0x157B + }, + { code:0x157C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x157C + ,simpleLowerCaseMapping:0x157C + ,simpleTitleCaseMapping:0x157C + }, + { code:0x157D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x157D + ,simpleLowerCaseMapping:0x157D + ,simpleTitleCaseMapping:0x157D + }, + { code:0x157E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x157E + ,simpleLowerCaseMapping:0x157E + ,simpleTitleCaseMapping:0x157E + }, + { code:0x157F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x157F + ,simpleLowerCaseMapping:0x157F + ,simpleTitleCaseMapping:0x157F + }, + { code:0x1580 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1580 + ,simpleLowerCaseMapping:0x1580 + ,simpleTitleCaseMapping:0x1580 + }, + { code:0x1581 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1581 + ,simpleLowerCaseMapping:0x1581 + ,simpleTitleCaseMapping:0x1581 + }, + { code:0x1582 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1582 + ,simpleLowerCaseMapping:0x1582 + ,simpleTitleCaseMapping:0x1582 + }, + { code:0x1583 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1583 + ,simpleLowerCaseMapping:0x1583 + ,simpleTitleCaseMapping:0x1583 + }, + { code:0x1584 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1584 + ,simpleLowerCaseMapping:0x1584 + ,simpleTitleCaseMapping:0x1584 + }, + { code:0x1585 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1585 + ,simpleLowerCaseMapping:0x1585 + ,simpleTitleCaseMapping:0x1585 + }, + { code:0x1586 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1586 + ,simpleLowerCaseMapping:0x1586 + ,simpleTitleCaseMapping:0x1586 + }, + { code:0x1587 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1587 + ,simpleLowerCaseMapping:0x1587 + ,simpleTitleCaseMapping:0x1587 + }, + { code:0x1588 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1588 + ,simpleLowerCaseMapping:0x1588 + ,simpleTitleCaseMapping:0x1588 + }, + { code:0x1589 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1589 + ,simpleLowerCaseMapping:0x1589 + ,simpleTitleCaseMapping:0x1589 + }, + { code:0x158A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x158A + ,simpleLowerCaseMapping:0x158A + ,simpleTitleCaseMapping:0x158A + }, + { code:0x158B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x158B + ,simpleLowerCaseMapping:0x158B + ,simpleTitleCaseMapping:0x158B + }, + { code:0x158C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x158C + ,simpleLowerCaseMapping:0x158C + ,simpleTitleCaseMapping:0x158C + }, + { code:0x158D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x158D + ,simpleLowerCaseMapping:0x158D + ,simpleTitleCaseMapping:0x158D + }, + { code:0x158E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x158E + ,simpleLowerCaseMapping:0x158E + ,simpleTitleCaseMapping:0x158E + }, + { code:0x158F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x158F + ,simpleLowerCaseMapping:0x158F + ,simpleTitleCaseMapping:0x158F + }, + { code:0x1590 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1590 + ,simpleLowerCaseMapping:0x1590 + ,simpleTitleCaseMapping:0x1590 + }, + { code:0x1591 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1591 + ,simpleLowerCaseMapping:0x1591 + ,simpleTitleCaseMapping:0x1591 + }, + { code:0x1592 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1592 + ,simpleLowerCaseMapping:0x1592 + ,simpleTitleCaseMapping:0x1592 + }, + { code:0x1593 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1593 + ,simpleLowerCaseMapping:0x1593 + ,simpleTitleCaseMapping:0x1593 + }, + { code:0x1594 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1594 + ,simpleLowerCaseMapping:0x1594 + ,simpleTitleCaseMapping:0x1594 + }, + { code:0x1595 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1595 + ,simpleLowerCaseMapping:0x1595 + ,simpleTitleCaseMapping:0x1595 + }, + { code:0x1596 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1596 + ,simpleLowerCaseMapping:0x1596 + ,simpleTitleCaseMapping:0x1596 + }, + { code:0x1597 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1597 + ,simpleLowerCaseMapping:0x1597 + ,simpleTitleCaseMapping:0x1597 + }, + { code:0x1598 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1598 + ,simpleLowerCaseMapping:0x1598 + ,simpleTitleCaseMapping:0x1598 + }, + { code:0x1599 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1599 + ,simpleLowerCaseMapping:0x1599 + ,simpleTitleCaseMapping:0x1599 + }, + { code:0x159A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x159A + ,simpleLowerCaseMapping:0x159A + ,simpleTitleCaseMapping:0x159A + }, + { code:0x159B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x159B + ,simpleLowerCaseMapping:0x159B + ,simpleTitleCaseMapping:0x159B + }, + { code:0x159C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x159C + ,simpleLowerCaseMapping:0x159C + ,simpleTitleCaseMapping:0x159C + }, + { code:0x159D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x159D + ,simpleLowerCaseMapping:0x159D + ,simpleTitleCaseMapping:0x159D + }, + { code:0x159E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x159E + ,simpleLowerCaseMapping:0x159E + ,simpleTitleCaseMapping:0x159E + }, + { code:0x159F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x159F + ,simpleLowerCaseMapping:0x159F + ,simpleTitleCaseMapping:0x159F + }, + { code:0x15A0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15A0 + ,simpleLowerCaseMapping:0x15A0 + ,simpleTitleCaseMapping:0x15A0 + }, + { code:0x15A1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15A1 + ,simpleLowerCaseMapping:0x15A1 + ,simpleTitleCaseMapping:0x15A1 + }, + { code:0x15A2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15A2 + ,simpleLowerCaseMapping:0x15A2 + ,simpleTitleCaseMapping:0x15A2 + }, + { code:0x15A3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15A3 + ,simpleLowerCaseMapping:0x15A3 + ,simpleTitleCaseMapping:0x15A3 + }, + { code:0x15A4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15A4 + ,simpleLowerCaseMapping:0x15A4 + ,simpleTitleCaseMapping:0x15A4 + }, + { code:0x15A5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15A5 + ,simpleLowerCaseMapping:0x15A5 + ,simpleTitleCaseMapping:0x15A5 + }, + { code:0x15A6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15A6 + ,simpleLowerCaseMapping:0x15A6 + ,simpleTitleCaseMapping:0x15A6 + }, + { code:0x15A7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15A7 + ,simpleLowerCaseMapping:0x15A7 + ,simpleTitleCaseMapping:0x15A7 + }, + { code:0x15A8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15A8 + ,simpleLowerCaseMapping:0x15A8 + ,simpleTitleCaseMapping:0x15A8 + }, + { code:0x15A9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15A9 + ,simpleLowerCaseMapping:0x15A9 + ,simpleTitleCaseMapping:0x15A9 + }, + { code:0x15AA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15AA + ,simpleLowerCaseMapping:0x15AA + ,simpleTitleCaseMapping:0x15AA + }, + { code:0x15AB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15AB + ,simpleLowerCaseMapping:0x15AB + ,simpleTitleCaseMapping:0x15AB + }, + { code:0x15AC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15AC + ,simpleLowerCaseMapping:0x15AC + ,simpleTitleCaseMapping:0x15AC + }, + { code:0x15AD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15AD + ,simpleLowerCaseMapping:0x15AD + ,simpleTitleCaseMapping:0x15AD + }, + { code:0x15AE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15AE + ,simpleLowerCaseMapping:0x15AE + ,simpleTitleCaseMapping:0x15AE + }, + { code:0x15AF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15AF + ,simpleLowerCaseMapping:0x15AF + ,simpleTitleCaseMapping:0x15AF + }, + { code:0x15B0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15B0 + ,simpleLowerCaseMapping:0x15B0 + ,simpleTitleCaseMapping:0x15B0 + }, + { code:0x15B1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15B1 + ,simpleLowerCaseMapping:0x15B1 + ,simpleTitleCaseMapping:0x15B1 + }, + { code:0x15B2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15B2 + ,simpleLowerCaseMapping:0x15B2 + ,simpleTitleCaseMapping:0x15B2 + }, + { code:0x15B3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15B3 + ,simpleLowerCaseMapping:0x15B3 + ,simpleTitleCaseMapping:0x15B3 + }, + { code:0x15B4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15B4 + ,simpleLowerCaseMapping:0x15B4 + ,simpleTitleCaseMapping:0x15B4 + }, + { code:0x15B5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15B5 + ,simpleLowerCaseMapping:0x15B5 + ,simpleTitleCaseMapping:0x15B5 + }, + { code:0x15B6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15B6 + ,simpleLowerCaseMapping:0x15B6 + ,simpleTitleCaseMapping:0x15B6 + }, + { code:0x15B7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15B7 + ,simpleLowerCaseMapping:0x15B7 + ,simpleTitleCaseMapping:0x15B7 + }, + { code:0x15B8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15B8 + ,simpleLowerCaseMapping:0x15B8 + ,simpleTitleCaseMapping:0x15B8 + }, + { code:0x15B9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15B9 + ,simpleLowerCaseMapping:0x15B9 + ,simpleTitleCaseMapping:0x15B9 + }, + { code:0x15BA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15BA + ,simpleLowerCaseMapping:0x15BA + ,simpleTitleCaseMapping:0x15BA + }, + { code:0x15BB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15BB + ,simpleLowerCaseMapping:0x15BB + ,simpleTitleCaseMapping:0x15BB + }, + { code:0x15BC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15BC + ,simpleLowerCaseMapping:0x15BC + ,simpleTitleCaseMapping:0x15BC + }, + { code:0x15BD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15BD + ,simpleLowerCaseMapping:0x15BD + ,simpleTitleCaseMapping:0x15BD + }, + { code:0x15BE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15BE + ,simpleLowerCaseMapping:0x15BE + ,simpleTitleCaseMapping:0x15BE + }, + { code:0x15BF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15BF + ,simpleLowerCaseMapping:0x15BF + ,simpleTitleCaseMapping:0x15BF + }, + { code:0x15C0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15C0 + ,simpleLowerCaseMapping:0x15C0 + ,simpleTitleCaseMapping:0x15C0 + }, + { code:0x15C1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15C1 + ,simpleLowerCaseMapping:0x15C1 + ,simpleTitleCaseMapping:0x15C1 + }, + { code:0x15C2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15C2 + ,simpleLowerCaseMapping:0x15C2 + ,simpleTitleCaseMapping:0x15C2 + }, + { code:0x15C3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15C3 + ,simpleLowerCaseMapping:0x15C3 + ,simpleTitleCaseMapping:0x15C3 + }, + { code:0x15C4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15C4 + ,simpleLowerCaseMapping:0x15C4 + ,simpleTitleCaseMapping:0x15C4 + }, + { code:0x15C5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15C5 + ,simpleLowerCaseMapping:0x15C5 + ,simpleTitleCaseMapping:0x15C5 + }, + { code:0x15C6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15C6 + ,simpleLowerCaseMapping:0x15C6 + ,simpleTitleCaseMapping:0x15C6 + }, + { code:0x15C7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15C7 + ,simpleLowerCaseMapping:0x15C7 + ,simpleTitleCaseMapping:0x15C7 + }, + { code:0x15C8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15C8 + ,simpleLowerCaseMapping:0x15C8 + ,simpleTitleCaseMapping:0x15C8 + }, + { code:0x15C9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15C9 + ,simpleLowerCaseMapping:0x15C9 + ,simpleTitleCaseMapping:0x15C9 + }, + { code:0x15CA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15CA + ,simpleLowerCaseMapping:0x15CA + ,simpleTitleCaseMapping:0x15CA + }, + { code:0x15CB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15CB + ,simpleLowerCaseMapping:0x15CB + ,simpleTitleCaseMapping:0x15CB + }, + { code:0x15CC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15CC + ,simpleLowerCaseMapping:0x15CC + ,simpleTitleCaseMapping:0x15CC + }, + { code:0x15CD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15CD + ,simpleLowerCaseMapping:0x15CD + ,simpleTitleCaseMapping:0x15CD + }, + { code:0x15CE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15CE + ,simpleLowerCaseMapping:0x15CE + ,simpleTitleCaseMapping:0x15CE + }, + { code:0x15CF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15CF + ,simpleLowerCaseMapping:0x15CF + ,simpleTitleCaseMapping:0x15CF + }, + { code:0x15D0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15D0 + ,simpleLowerCaseMapping:0x15D0 + ,simpleTitleCaseMapping:0x15D0 + }, + { code:0x15D1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15D1 + ,simpleLowerCaseMapping:0x15D1 + ,simpleTitleCaseMapping:0x15D1 + }, + { code:0x15D2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15D2 + ,simpleLowerCaseMapping:0x15D2 + ,simpleTitleCaseMapping:0x15D2 + }, + { code:0x15D3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15D3 + ,simpleLowerCaseMapping:0x15D3 + ,simpleTitleCaseMapping:0x15D3 + }, + { code:0x15D4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15D4 + ,simpleLowerCaseMapping:0x15D4 + ,simpleTitleCaseMapping:0x15D4 + }, + { code:0x15D5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15D5 + ,simpleLowerCaseMapping:0x15D5 + ,simpleTitleCaseMapping:0x15D5 + }, + { code:0x15D6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15D6 + ,simpleLowerCaseMapping:0x15D6 + ,simpleTitleCaseMapping:0x15D6 + }, + { code:0x15D7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15D7 + ,simpleLowerCaseMapping:0x15D7 + ,simpleTitleCaseMapping:0x15D7 + }, + { code:0x15D8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15D8 + ,simpleLowerCaseMapping:0x15D8 + ,simpleTitleCaseMapping:0x15D8 + }, + { code:0x15D9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15D9 + ,simpleLowerCaseMapping:0x15D9 + ,simpleTitleCaseMapping:0x15D9 + }, + { code:0x15DA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15DA + ,simpleLowerCaseMapping:0x15DA + ,simpleTitleCaseMapping:0x15DA + }, + { code:0x15DB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15DB + ,simpleLowerCaseMapping:0x15DB + ,simpleTitleCaseMapping:0x15DB + }, + { code:0x15DC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15DC + ,simpleLowerCaseMapping:0x15DC + ,simpleTitleCaseMapping:0x15DC + }, + { code:0x15DD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15DD + ,simpleLowerCaseMapping:0x15DD + ,simpleTitleCaseMapping:0x15DD + }, + { code:0x15DE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15DE + ,simpleLowerCaseMapping:0x15DE + ,simpleTitleCaseMapping:0x15DE + }, + { code:0x15DF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15DF + ,simpleLowerCaseMapping:0x15DF + ,simpleTitleCaseMapping:0x15DF + }, + { code:0x15E0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15E0 + ,simpleLowerCaseMapping:0x15E0 + ,simpleTitleCaseMapping:0x15E0 + }, + { code:0x15E1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15E1 + ,simpleLowerCaseMapping:0x15E1 + ,simpleTitleCaseMapping:0x15E1 + }, + { code:0x15E2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15E2 + ,simpleLowerCaseMapping:0x15E2 + ,simpleTitleCaseMapping:0x15E2 + }, + { code:0x15E3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15E3 + ,simpleLowerCaseMapping:0x15E3 + ,simpleTitleCaseMapping:0x15E3 + }, + { code:0x15E4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15E4 + ,simpleLowerCaseMapping:0x15E4 + ,simpleTitleCaseMapping:0x15E4 + }, + { code:0x15E5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15E5 + ,simpleLowerCaseMapping:0x15E5 + ,simpleTitleCaseMapping:0x15E5 + }, + { code:0x15E6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15E6 + ,simpleLowerCaseMapping:0x15E6 + ,simpleTitleCaseMapping:0x15E6 + }, + { code:0x15E7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15E7 + ,simpleLowerCaseMapping:0x15E7 + ,simpleTitleCaseMapping:0x15E7 + }, + { code:0x15E8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15E8 + ,simpleLowerCaseMapping:0x15E8 + ,simpleTitleCaseMapping:0x15E8 + }, + { code:0x15E9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15E9 + ,simpleLowerCaseMapping:0x15E9 + ,simpleTitleCaseMapping:0x15E9 + }, + { code:0x15EA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15EA + ,simpleLowerCaseMapping:0x15EA + ,simpleTitleCaseMapping:0x15EA + }, + { code:0x15EB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15EB + ,simpleLowerCaseMapping:0x15EB + ,simpleTitleCaseMapping:0x15EB + }, + { code:0x15EC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15EC + ,simpleLowerCaseMapping:0x15EC + ,simpleTitleCaseMapping:0x15EC + }, + { code:0x15ED + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15ED + ,simpleLowerCaseMapping:0x15ED + ,simpleTitleCaseMapping:0x15ED + }, + { code:0x15EE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15EE + ,simpleLowerCaseMapping:0x15EE + ,simpleTitleCaseMapping:0x15EE + }, + { code:0x15EF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15EF + ,simpleLowerCaseMapping:0x15EF + ,simpleTitleCaseMapping:0x15EF + }, + { code:0x15F0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15F0 + ,simpleLowerCaseMapping:0x15F0 + ,simpleTitleCaseMapping:0x15F0 + }, + { code:0x15F1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15F1 + ,simpleLowerCaseMapping:0x15F1 + ,simpleTitleCaseMapping:0x15F1 + }, + { code:0x15F2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15F2 + ,simpleLowerCaseMapping:0x15F2 + ,simpleTitleCaseMapping:0x15F2 + }, + { code:0x15F3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15F3 + ,simpleLowerCaseMapping:0x15F3 + ,simpleTitleCaseMapping:0x15F3 + }, + { code:0x15F4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15F4 + ,simpleLowerCaseMapping:0x15F4 + ,simpleTitleCaseMapping:0x15F4 + }, + { code:0x15F5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15F5 + ,simpleLowerCaseMapping:0x15F5 + ,simpleTitleCaseMapping:0x15F5 + }, + { code:0x15F6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15F6 + ,simpleLowerCaseMapping:0x15F6 + ,simpleTitleCaseMapping:0x15F6 + }, + { code:0x15F7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15F7 + ,simpleLowerCaseMapping:0x15F7 + ,simpleTitleCaseMapping:0x15F7 + }, + { code:0x15F8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15F8 + ,simpleLowerCaseMapping:0x15F8 + ,simpleTitleCaseMapping:0x15F8 + }, + { code:0x15F9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15F9 + ,simpleLowerCaseMapping:0x15F9 + ,simpleTitleCaseMapping:0x15F9 + }, + { code:0x15FA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15FA + ,simpleLowerCaseMapping:0x15FA + ,simpleTitleCaseMapping:0x15FA + }, + { code:0x15FB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15FB + ,simpleLowerCaseMapping:0x15FB + ,simpleTitleCaseMapping:0x15FB + }, + { code:0x15FC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15FC + ,simpleLowerCaseMapping:0x15FC + ,simpleTitleCaseMapping:0x15FC + }, + { code:0x15FD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15FD + ,simpleLowerCaseMapping:0x15FD + ,simpleTitleCaseMapping:0x15FD + }, + { code:0x15FE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15FE + ,simpleLowerCaseMapping:0x15FE + ,simpleTitleCaseMapping:0x15FE + }, + { code:0x15FF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x15FF + ,simpleLowerCaseMapping:0x15FF + ,simpleTitleCaseMapping:0x15FF + }, + { code:0x1600 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1600 + ,simpleLowerCaseMapping:0x1600 + ,simpleTitleCaseMapping:0x1600 + }, + { code:0x1601 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1601 + ,simpleLowerCaseMapping:0x1601 + ,simpleTitleCaseMapping:0x1601 + }, + { code:0x1602 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1602 + ,simpleLowerCaseMapping:0x1602 + ,simpleTitleCaseMapping:0x1602 + }, + { code:0x1603 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1603 + ,simpleLowerCaseMapping:0x1603 + ,simpleTitleCaseMapping:0x1603 + }, + { code:0x1604 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1604 + ,simpleLowerCaseMapping:0x1604 + ,simpleTitleCaseMapping:0x1604 + }, + { code:0x1605 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1605 + ,simpleLowerCaseMapping:0x1605 + ,simpleTitleCaseMapping:0x1605 + }, + { code:0x1606 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1606 + ,simpleLowerCaseMapping:0x1606 + ,simpleTitleCaseMapping:0x1606 + }, + { code:0x1607 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1607 + ,simpleLowerCaseMapping:0x1607 + ,simpleTitleCaseMapping:0x1607 + }, + { code:0x1608 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1608 + ,simpleLowerCaseMapping:0x1608 + ,simpleTitleCaseMapping:0x1608 + }, + { code:0x1609 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1609 + ,simpleLowerCaseMapping:0x1609 + ,simpleTitleCaseMapping:0x1609 + }, + { code:0x160A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x160A + ,simpleLowerCaseMapping:0x160A + ,simpleTitleCaseMapping:0x160A + }, + { code:0x160B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x160B + ,simpleLowerCaseMapping:0x160B + ,simpleTitleCaseMapping:0x160B + }, + { code:0x160C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x160C + ,simpleLowerCaseMapping:0x160C + ,simpleTitleCaseMapping:0x160C + }, + { code:0x160D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x160D + ,simpleLowerCaseMapping:0x160D + ,simpleTitleCaseMapping:0x160D + }, + { code:0x160E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x160E + ,simpleLowerCaseMapping:0x160E + ,simpleTitleCaseMapping:0x160E + }, + { code:0x160F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x160F + ,simpleLowerCaseMapping:0x160F + ,simpleTitleCaseMapping:0x160F + }, + { code:0x1610 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1610 + ,simpleLowerCaseMapping:0x1610 + ,simpleTitleCaseMapping:0x1610 + }, + { code:0x1611 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1611 + ,simpleLowerCaseMapping:0x1611 + ,simpleTitleCaseMapping:0x1611 + }, + { code:0x1612 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1612 + ,simpleLowerCaseMapping:0x1612 + ,simpleTitleCaseMapping:0x1612 + }, + { code:0x1613 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1613 + ,simpleLowerCaseMapping:0x1613 + ,simpleTitleCaseMapping:0x1613 + }, + { code:0x1614 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1614 + ,simpleLowerCaseMapping:0x1614 + ,simpleTitleCaseMapping:0x1614 + }, + { code:0x1615 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1615 + ,simpleLowerCaseMapping:0x1615 + ,simpleTitleCaseMapping:0x1615 + }, + { code:0x1616 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1616 + ,simpleLowerCaseMapping:0x1616 + ,simpleTitleCaseMapping:0x1616 + }, + { code:0x1617 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1617 + ,simpleLowerCaseMapping:0x1617 + ,simpleTitleCaseMapping:0x1617 + }, + { code:0x1618 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1618 + ,simpleLowerCaseMapping:0x1618 + ,simpleTitleCaseMapping:0x1618 + }, + { code:0x1619 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1619 + ,simpleLowerCaseMapping:0x1619 + ,simpleTitleCaseMapping:0x1619 + }, + { code:0x161A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x161A + ,simpleLowerCaseMapping:0x161A + ,simpleTitleCaseMapping:0x161A + }, + { code:0x161B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x161B + ,simpleLowerCaseMapping:0x161B + ,simpleTitleCaseMapping:0x161B + }, + { code:0x161C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x161C + ,simpleLowerCaseMapping:0x161C + ,simpleTitleCaseMapping:0x161C + }, + { code:0x161D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x161D + ,simpleLowerCaseMapping:0x161D + ,simpleTitleCaseMapping:0x161D + }, + { code:0x161E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x161E + ,simpleLowerCaseMapping:0x161E + ,simpleTitleCaseMapping:0x161E + }, + { code:0x161F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x161F + ,simpleLowerCaseMapping:0x161F + ,simpleTitleCaseMapping:0x161F + }, + { code:0x1620 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1620 + ,simpleLowerCaseMapping:0x1620 + ,simpleTitleCaseMapping:0x1620 + }, + { code:0x1621 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1621 + ,simpleLowerCaseMapping:0x1621 + ,simpleTitleCaseMapping:0x1621 + }, + { code:0x1622 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1622 + ,simpleLowerCaseMapping:0x1622 + ,simpleTitleCaseMapping:0x1622 + }, + { code:0x1623 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1623 + ,simpleLowerCaseMapping:0x1623 + ,simpleTitleCaseMapping:0x1623 + }, + { code:0x1624 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1624 + ,simpleLowerCaseMapping:0x1624 + ,simpleTitleCaseMapping:0x1624 + }, + { code:0x1625 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1625 + ,simpleLowerCaseMapping:0x1625 + ,simpleTitleCaseMapping:0x1625 + }, + { code:0x1626 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1626 + ,simpleLowerCaseMapping:0x1626 + ,simpleTitleCaseMapping:0x1626 + }, + { code:0x1627 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1627 + ,simpleLowerCaseMapping:0x1627 + ,simpleTitleCaseMapping:0x1627 + }, + { code:0x1628 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1628 + ,simpleLowerCaseMapping:0x1628 + ,simpleTitleCaseMapping:0x1628 + }, + { code:0x1629 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1629 + ,simpleLowerCaseMapping:0x1629 + ,simpleTitleCaseMapping:0x1629 + }, + { code:0x162A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x162A + ,simpleLowerCaseMapping:0x162A + ,simpleTitleCaseMapping:0x162A + }, + { code:0x162B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x162B + ,simpleLowerCaseMapping:0x162B + ,simpleTitleCaseMapping:0x162B + }, + { code:0x162C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x162C + ,simpleLowerCaseMapping:0x162C + ,simpleTitleCaseMapping:0x162C + }, + { code:0x162D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x162D + ,simpleLowerCaseMapping:0x162D + ,simpleTitleCaseMapping:0x162D + }, + { code:0x162E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x162E + ,simpleLowerCaseMapping:0x162E + ,simpleTitleCaseMapping:0x162E + }, + { code:0x162F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x162F + ,simpleLowerCaseMapping:0x162F + ,simpleTitleCaseMapping:0x162F + }, + { code:0x1630 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1630 + ,simpleLowerCaseMapping:0x1630 + ,simpleTitleCaseMapping:0x1630 + }, + { code:0x1631 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1631 + ,simpleLowerCaseMapping:0x1631 + ,simpleTitleCaseMapping:0x1631 + }, + { code:0x1632 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1632 + ,simpleLowerCaseMapping:0x1632 + ,simpleTitleCaseMapping:0x1632 + }, + { code:0x1633 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1633 + ,simpleLowerCaseMapping:0x1633 + ,simpleTitleCaseMapping:0x1633 + }, + { code:0x1634 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1634 + ,simpleLowerCaseMapping:0x1634 + ,simpleTitleCaseMapping:0x1634 + }, + { code:0x1635 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1635 + ,simpleLowerCaseMapping:0x1635 + ,simpleTitleCaseMapping:0x1635 + }, + { code:0x1636 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1636 + ,simpleLowerCaseMapping:0x1636 + ,simpleTitleCaseMapping:0x1636 + }, + { code:0x1637 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1637 + ,simpleLowerCaseMapping:0x1637 + ,simpleTitleCaseMapping:0x1637 + }, + { code:0x1638 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1638 + ,simpleLowerCaseMapping:0x1638 + ,simpleTitleCaseMapping:0x1638 + }, + { code:0x1639 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1639 + ,simpleLowerCaseMapping:0x1639 + ,simpleTitleCaseMapping:0x1639 + }, + { code:0x163A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x163A + ,simpleLowerCaseMapping:0x163A + ,simpleTitleCaseMapping:0x163A + }, + { code:0x163B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x163B + ,simpleLowerCaseMapping:0x163B + ,simpleTitleCaseMapping:0x163B + }, + { code:0x163C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x163C + ,simpleLowerCaseMapping:0x163C + ,simpleTitleCaseMapping:0x163C + }, + { code:0x163D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x163D + ,simpleLowerCaseMapping:0x163D + ,simpleTitleCaseMapping:0x163D + }, + { code:0x163E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x163E + ,simpleLowerCaseMapping:0x163E + ,simpleTitleCaseMapping:0x163E + }, + { code:0x163F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x163F + ,simpleLowerCaseMapping:0x163F + ,simpleTitleCaseMapping:0x163F + }, + { code:0x1640 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1640 + ,simpleLowerCaseMapping:0x1640 + ,simpleTitleCaseMapping:0x1640 + }, + { code:0x1641 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1641 + ,simpleLowerCaseMapping:0x1641 + ,simpleTitleCaseMapping:0x1641 + }, + { code:0x1642 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1642 + ,simpleLowerCaseMapping:0x1642 + ,simpleTitleCaseMapping:0x1642 + }, + { code:0x1643 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1643 + ,simpleLowerCaseMapping:0x1643 + ,simpleTitleCaseMapping:0x1643 + }, + { code:0x1644 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1644 + ,simpleLowerCaseMapping:0x1644 + ,simpleTitleCaseMapping:0x1644 + }, + { code:0x1645 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1645 + ,simpleLowerCaseMapping:0x1645 + ,simpleTitleCaseMapping:0x1645 + }, + { code:0x1646 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1646 + ,simpleLowerCaseMapping:0x1646 + ,simpleTitleCaseMapping:0x1646 + }, + { code:0x1647 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1647 + ,simpleLowerCaseMapping:0x1647 + ,simpleTitleCaseMapping:0x1647 + }, + { code:0x1648 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1648 + ,simpleLowerCaseMapping:0x1648 + ,simpleTitleCaseMapping:0x1648 + }, + { code:0x1649 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1649 + ,simpleLowerCaseMapping:0x1649 + ,simpleTitleCaseMapping:0x1649 + }, + { code:0x164A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x164A + ,simpleLowerCaseMapping:0x164A + ,simpleTitleCaseMapping:0x164A + }, + { code:0x164B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x164B + ,simpleLowerCaseMapping:0x164B + ,simpleTitleCaseMapping:0x164B + }, + { code:0x164C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x164C + ,simpleLowerCaseMapping:0x164C + ,simpleTitleCaseMapping:0x164C + }, + { code:0x164D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x164D + ,simpleLowerCaseMapping:0x164D + ,simpleTitleCaseMapping:0x164D + }, + { code:0x164E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x164E + ,simpleLowerCaseMapping:0x164E + ,simpleTitleCaseMapping:0x164E + }, + { code:0x164F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x164F + ,simpleLowerCaseMapping:0x164F + ,simpleTitleCaseMapping:0x164F + }, + { code:0x1650 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1650 + ,simpleLowerCaseMapping:0x1650 + ,simpleTitleCaseMapping:0x1650 + }, + { code:0x1651 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1651 + ,simpleLowerCaseMapping:0x1651 + ,simpleTitleCaseMapping:0x1651 + }, + { code:0x1652 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1652 + ,simpleLowerCaseMapping:0x1652 + ,simpleTitleCaseMapping:0x1652 + }, + { code:0x1653 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1653 + ,simpleLowerCaseMapping:0x1653 + ,simpleTitleCaseMapping:0x1653 + }, + { code:0x1654 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1654 + ,simpleLowerCaseMapping:0x1654 + ,simpleTitleCaseMapping:0x1654 + }, + { code:0x1655 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1655 + ,simpleLowerCaseMapping:0x1655 + ,simpleTitleCaseMapping:0x1655 + }, + { code:0x1656 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1656 + ,simpleLowerCaseMapping:0x1656 + ,simpleTitleCaseMapping:0x1656 + }, + { code:0x1657 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1657 + ,simpleLowerCaseMapping:0x1657 + ,simpleTitleCaseMapping:0x1657 + }, + { code:0x1658 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1658 + ,simpleLowerCaseMapping:0x1658 + ,simpleTitleCaseMapping:0x1658 + }, + { code:0x1659 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1659 + ,simpleLowerCaseMapping:0x1659 + ,simpleTitleCaseMapping:0x1659 + }, + { code:0x165A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x165A + ,simpleLowerCaseMapping:0x165A + ,simpleTitleCaseMapping:0x165A + }, + { code:0x165B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x165B + ,simpleLowerCaseMapping:0x165B + ,simpleTitleCaseMapping:0x165B + }, + { code:0x165C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x165C + ,simpleLowerCaseMapping:0x165C + ,simpleTitleCaseMapping:0x165C + }, + { code:0x165D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x165D + ,simpleLowerCaseMapping:0x165D + ,simpleTitleCaseMapping:0x165D + }, + { code:0x165E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x165E + ,simpleLowerCaseMapping:0x165E + ,simpleTitleCaseMapping:0x165E + }, + { code:0x165F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x165F + ,simpleLowerCaseMapping:0x165F + ,simpleTitleCaseMapping:0x165F + }, + { code:0x1660 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1660 + ,simpleLowerCaseMapping:0x1660 + ,simpleTitleCaseMapping:0x1660 + }, + { code:0x1661 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1661 + ,simpleLowerCaseMapping:0x1661 + ,simpleTitleCaseMapping:0x1661 + }, + { code:0x1662 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1662 + ,simpleLowerCaseMapping:0x1662 + ,simpleTitleCaseMapping:0x1662 + }, + { code:0x1663 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1663 + ,simpleLowerCaseMapping:0x1663 + ,simpleTitleCaseMapping:0x1663 + }, + { code:0x1664 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1664 + ,simpleLowerCaseMapping:0x1664 + ,simpleTitleCaseMapping:0x1664 + }, + { code:0x1665 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1665 + ,simpleLowerCaseMapping:0x1665 + ,simpleTitleCaseMapping:0x1665 + }, + { code:0x1666 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1666 + ,simpleLowerCaseMapping:0x1666 + ,simpleTitleCaseMapping:0x1666 + }, + { code:0x1667 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1667 + ,simpleLowerCaseMapping:0x1667 + ,simpleTitleCaseMapping:0x1667 + }, + { code:0x1668 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1668 + ,simpleLowerCaseMapping:0x1668 + ,simpleTitleCaseMapping:0x1668 + }, + { code:0x1669 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1669 + ,simpleLowerCaseMapping:0x1669 + ,simpleTitleCaseMapping:0x1669 + }, + { code:0x166A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x166A + ,simpleLowerCaseMapping:0x166A + ,simpleTitleCaseMapping:0x166A + }, + { code:0x166B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x166B + ,simpleLowerCaseMapping:0x166B + ,simpleTitleCaseMapping:0x166B + }, + { code:0x166C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x166C + ,simpleLowerCaseMapping:0x166C + ,simpleTitleCaseMapping:0x166C + }, + { code:0x166D + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x166D + ,simpleLowerCaseMapping:0x166D + ,simpleTitleCaseMapping:0x166D + }, + { code:0x166E + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x166E + ,simpleLowerCaseMapping:0x166E + ,simpleTitleCaseMapping:0x166E + }, + { code:0x166F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x166F + ,simpleLowerCaseMapping:0x166F + ,simpleTitleCaseMapping:0x166F + }, + { code:0x1670 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1670 + ,simpleLowerCaseMapping:0x1670 + ,simpleTitleCaseMapping:0x1670 + }, + { code:0x1671 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1671 + ,simpleLowerCaseMapping:0x1671 + ,simpleTitleCaseMapping:0x1671 + }, + { code:0x1672 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1672 + ,simpleLowerCaseMapping:0x1672 + ,simpleTitleCaseMapping:0x1672 + }, + { code:0x1673 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1673 + ,simpleLowerCaseMapping:0x1673 + ,simpleTitleCaseMapping:0x1673 + }, + { code:0x1674 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1674 + ,simpleLowerCaseMapping:0x1674 + ,simpleTitleCaseMapping:0x1674 + }, + { code:0x1675 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1675 + ,simpleLowerCaseMapping:0x1675 + ,simpleTitleCaseMapping:0x1675 + }, + { code:0x1676 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1676 + ,simpleLowerCaseMapping:0x1676 + ,simpleTitleCaseMapping:0x1676 + }, + { code:0x1680 + ,generalCategory:UnicodeData.GeneralCategory.Zs + ,simpleUpperCaseMapping:0x1680 + ,simpleLowerCaseMapping:0x1680 + ,simpleTitleCaseMapping:0x1680 + }, + { code:0x1681 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1681 + ,simpleLowerCaseMapping:0x1681 + ,simpleTitleCaseMapping:0x1681 + }, + { code:0x1682 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1682 + ,simpleLowerCaseMapping:0x1682 + ,simpleTitleCaseMapping:0x1682 + }, + { code:0x1683 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1683 + ,simpleLowerCaseMapping:0x1683 + ,simpleTitleCaseMapping:0x1683 + }, + { code:0x1684 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1684 + ,simpleLowerCaseMapping:0x1684 + ,simpleTitleCaseMapping:0x1684 + }, + { code:0x1685 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1685 + ,simpleLowerCaseMapping:0x1685 + ,simpleTitleCaseMapping:0x1685 + }, + { code:0x1686 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1686 + ,simpleLowerCaseMapping:0x1686 + ,simpleTitleCaseMapping:0x1686 + }, + { code:0x1687 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1687 + ,simpleLowerCaseMapping:0x1687 + ,simpleTitleCaseMapping:0x1687 + }, + { code:0x1688 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1688 + ,simpleLowerCaseMapping:0x1688 + ,simpleTitleCaseMapping:0x1688 + }, + { code:0x1689 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1689 + ,simpleLowerCaseMapping:0x1689 + ,simpleTitleCaseMapping:0x1689 + }, + { code:0x168A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x168A + ,simpleLowerCaseMapping:0x168A + ,simpleTitleCaseMapping:0x168A + }, + { code:0x168B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x168B + ,simpleLowerCaseMapping:0x168B + ,simpleTitleCaseMapping:0x168B + }, + { code:0x168C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x168C + ,simpleLowerCaseMapping:0x168C + ,simpleTitleCaseMapping:0x168C + }, + { code:0x168D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x168D + ,simpleLowerCaseMapping:0x168D + ,simpleTitleCaseMapping:0x168D + }, + { code:0x168E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x168E + ,simpleLowerCaseMapping:0x168E + ,simpleTitleCaseMapping:0x168E + }, + { code:0x168F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x168F + ,simpleLowerCaseMapping:0x168F + ,simpleTitleCaseMapping:0x168F + }, + { code:0x1690 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1690 + ,simpleLowerCaseMapping:0x1690 + ,simpleTitleCaseMapping:0x1690 + }, + { code:0x1691 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1691 + ,simpleLowerCaseMapping:0x1691 + ,simpleTitleCaseMapping:0x1691 + }, + { code:0x1692 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1692 + ,simpleLowerCaseMapping:0x1692 + ,simpleTitleCaseMapping:0x1692 + }, + { code:0x1693 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1693 + ,simpleLowerCaseMapping:0x1693 + ,simpleTitleCaseMapping:0x1693 + }, + { code:0x1694 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1694 + ,simpleLowerCaseMapping:0x1694 + ,simpleTitleCaseMapping:0x1694 + }, + { code:0x1695 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1695 + ,simpleLowerCaseMapping:0x1695 + ,simpleTitleCaseMapping:0x1695 + }, + { code:0x1696 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1696 + ,simpleLowerCaseMapping:0x1696 + ,simpleTitleCaseMapping:0x1696 + }, + { code:0x1697 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1697 + ,simpleLowerCaseMapping:0x1697 + ,simpleTitleCaseMapping:0x1697 + }, + { code:0x1698 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1698 + ,simpleLowerCaseMapping:0x1698 + ,simpleTitleCaseMapping:0x1698 + }, + { code:0x1699 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1699 + ,simpleLowerCaseMapping:0x1699 + ,simpleTitleCaseMapping:0x1699 + }, + { code:0x169A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x169A + ,simpleLowerCaseMapping:0x169A + ,simpleTitleCaseMapping:0x169A + }, + { code:0x169B + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x169B + ,simpleLowerCaseMapping:0x169B + ,simpleTitleCaseMapping:0x169B + }, + { code:0x169C + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x169C + ,simpleLowerCaseMapping:0x169C + ,simpleTitleCaseMapping:0x169C + }, + { code:0x16A0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16A0 + ,simpleLowerCaseMapping:0x16A0 + ,simpleTitleCaseMapping:0x16A0 + }, + { code:0x16A1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16A1 + ,simpleLowerCaseMapping:0x16A1 + ,simpleTitleCaseMapping:0x16A1 + }, + { code:0x16A2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16A2 + ,simpleLowerCaseMapping:0x16A2 + ,simpleTitleCaseMapping:0x16A2 + }, + { code:0x16A3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16A3 + ,simpleLowerCaseMapping:0x16A3 + ,simpleTitleCaseMapping:0x16A3 + }, + { code:0x16A4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16A4 + ,simpleLowerCaseMapping:0x16A4 + ,simpleTitleCaseMapping:0x16A4 + }, + { code:0x16A5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16A5 + ,simpleLowerCaseMapping:0x16A5 + ,simpleTitleCaseMapping:0x16A5 + }, + { code:0x16A6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16A6 + ,simpleLowerCaseMapping:0x16A6 + ,simpleTitleCaseMapping:0x16A6 + }, + { code:0x16A7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16A7 + ,simpleLowerCaseMapping:0x16A7 + ,simpleTitleCaseMapping:0x16A7 + }, + { code:0x16A8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16A8 + ,simpleLowerCaseMapping:0x16A8 + ,simpleTitleCaseMapping:0x16A8 + }, + { code:0x16A9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16A9 + ,simpleLowerCaseMapping:0x16A9 + ,simpleTitleCaseMapping:0x16A9 + }, + { code:0x16AA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16AA + ,simpleLowerCaseMapping:0x16AA + ,simpleTitleCaseMapping:0x16AA + }, + { code:0x16AB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16AB + ,simpleLowerCaseMapping:0x16AB + ,simpleTitleCaseMapping:0x16AB + }, + { code:0x16AC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16AC + ,simpleLowerCaseMapping:0x16AC + ,simpleTitleCaseMapping:0x16AC + }, + { code:0x16AD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16AD + ,simpleLowerCaseMapping:0x16AD + ,simpleTitleCaseMapping:0x16AD + }, + { code:0x16AE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16AE + ,simpleLowerCaseMapping:0x16AE + ,simpleTitleCaseMapping:0x16AE + }, + { code:0x16AF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16AF + ,simpleLowerCaseMapping:0x16AF + ,simpleTitleCaseMapping:0x16AF + }, + { code:0x16B0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16B0 + ,simpleLowerCaseMapping:0x16B0 + ,simpleTitleCaseMapping:0x16B0 + }, + { code:0x16B1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16B1 + ,simpleLowerCaseMapping:0x16B1 + ,simpleTitleCaseMapping:0x16B1 + }, + { code:0x16B2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16B2 + ,simpleLowerCaseMapping:0x16B2 + ,simpleTitleCaseMapping:0x16B2 + }, + { code:0x16B3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16B3 + ,simpleLowerCaseMapping:0x16B3 + ,simpleTitleCaseMapping:0x16B3 + }, + { code:0x16B4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16B4 + ,simpleLowerCaseMapping:0x16B4 + ,simpleTitleCaseMapping:0x16B4 + }, + { code:0x16B5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16B5 + ,simpleLowerCaseMapping:0x16B5 + ,simpleTitleCaseMapping:0x16B5 + }, + { code:0x16B6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16B6 + ,simpleLowerCaseMapping:0x16B6 + ,simpleTitleCaseMapping:0x16B6 + }, + { code:0x16B7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16B7 + ,simpleLowerCaseMapping:0x16B7 + ,simpleTitleCaseMapping:0x16B7 + }, + { code:0x16B8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16B8 + ,simpleLowerCaseMapping:0x16B8 + ,simpleTitleCaseMapping:0x16B8 + }, + { code:0x16B9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16B9 + ,simpleLowerCaseMapping:0x16B9 + ,simpleTitleCaseMapping:0x16B9 + }, + { code:0x16BA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16BA + ,simpleLowerCaseMapping:0x16BA + ,simpleTitleCaseMapping:0x16BA + }, + { code:0x16BB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16BB + ,simpleLowerCaseMapping:0x16BB + ,simpleTitleCaseMapping:0x16BB + }, + { code:0x16BC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16BC + ,simpleLowerCaseMapping:0x16BC + ,simpleTitleCaseMapping:0x16BC + }, + { code:0x16BD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16BD + ,simpleLowerCaseMapping:0x16BD + ,simpleTitleCaseMapping:0x16BD + }, + { code:0x16BE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16BE + ,simpleLowerCaseMapping:0x16BE + ,simpleTitleCaseMapping:0x16BE + }, + { code:0x16BF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16BF + ,simpleLowerCaseMapping:0x16BF + ,simpleTitleCaseMapping:0x16BF + }, + { code:0x16C0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16C0 + ,simpleLowerCaseMapping:0x16C0 + ,simpleTitleCaseMapping:0x16C0 + }, + { code:0x16C1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16C1 + ,simpleLowerCaseMapping:0x16C1 + ,simpleTitleCaseMapping:0x16C1 + }, + { code:0x16C2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16C2 + ,simpleLowerCaseMapping:0x16C2 + ,simpleTitleCaseMapping:0x16C2 + }, + { code:0x16C3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16C3 + ,simpleLowerCaseMapping:0x16C3 + ,simpleTitleCaseMapping:0x16C3 + }, + { code:0x16C4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16C4 + ,simpleLowerCaseMapping:0x16C4 + ,simpleTitleCaseMapping:0x16C4 + }, + { code:0x16C5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16C5 + ,simpleLowerCaseMapping:0x16C5 + ,simpleTitleCaseMapping:0x16C5 + }, + { code:0x16C6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16C6 + ,simpleLowerCaseMapping:0x16C6 + ,simpleTitleCaseMapping:0x16C6 + }, + { code:0x16C7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16C7 + ,simpleLowerCaseMapping:0x16C7 + ,simpleTitleCaseMapping:0x16C7 + }, + { code:0x16C8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16C8 + ,simpleLowerCaseMapping:0x16C8 + ,simpleTitleCaseMapping:0x16C8 + }, + { code:0x16C9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16C9 + ,simpleLowerCaseMapping:0x16C9 + ,simpleTitleCaseMapping:0x16C9 + }, + { code:0x16CA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16CA + ,simpleLowerCaseMapping:0x16CA + ,simpleTitleCaseMapping:0x16CA + }, + { code:0x16CB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16CB + ,simpleLowerCaseMapping:0x16CB + ,simpleTitleCaseMapping:0x16CB + }, + { code:0x16CC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16CC + ,simpleLowerCaseMapping:0x16CC + ,simpleTitleCaseMapping:0x16CC + }, + { code:0x16CD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16CD + ,simpleLowerCaseMapping:0x16CD + ,simpleTitleCaseMapping:0x16CD + }, + { code:0x16CE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16CE + ,simpleLowerCaseMapping:0x16CE + ,simpleTitleCaseMapping:0x16CE + }, + { code:0x16CF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16CF + ,simpleLowerCaseMapping:0x16CF + ,simpleTitleCaseMapping:0x16CF + }, + { code:0x16D0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16D0 + ,simpleLowerCaseMapping:0x16D0 + ,simpleTitleCaseMapping:0x16D0 + }, + { code:0x16D1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16D1 + ,simpleLowerCaseMapping:0x16D1 + ,simpleTitleCaseMapping:0x16D1 + }, + { code:0x16D2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16D2 + ,simpleLowerCaseMapping:0x16D2 + ,simpleTitleCaseMapping:0x16D2 + }, + { code:0x16D3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16D3 + ,simpleLowerCaseMapping:0x16D3 + ,simpleTitleCaseMapping:0x16D3 + }, + { code:0x16D4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16D4 + ,simpleLowerCaseMapping:0x16D4 + ,simpleTitleCaseMapping:0x16D4 + }, + { code:0x16D5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16D5 + ,simpleLowerCaseMapping:0x16D5 + ,simpleTitleCaseMapping:0x16D5 + }, + { code:0x16D6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16D6 + ,simpleLowerCaseMapping:0x16D6 + ,simpleTitleCaseMapping:0x16D6 + }, + { code:0x16D7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16D7 + ,simpleLowerCaseMapping:0x16D7 + ,simpleTitleCaseMapping:0x16D7 + }, + { code:0x16D8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16D8 + ,simpleLowerCaseMapping:0x16D8 + ,simpleTitleCaseMapping:0x16D8 + }, + { code:0x16D9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16D9 + ,simpleLowerCaseMapping:0x16D9 + ,simpleTitleCaseMapping:0x16D9 + }, + { code:0x16DA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16DA + ,simpleLowerCaseMapping:0x16DA + ,simpleTitleCaseMapping:0x16DA + }, + { code:0x16DB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16DB + ,simpleLowerCaseMapping:0x16DB + ,simpleTitleCaseMapping:0x16DB + }, + { code:0x16DC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16DC + ,simpleLowerCaseMapping:0x16DC + ,simpleTitleCaseMapping:0x16DC + }, + { code:0x16DD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16DD + ,simpleLowerCaseMapping:0x16DD + ,simpleTitleCaseMapping:0x16DD + }, + { code:0x16DE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16DE + ,simpleLowerCaseMapping:0x16DE + ,simpleTitleCaseMapping:0x16DE + }, + { code:0x16DF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16DF + ,simpleLowerCaseMapping:0x16DF + ,simpleTitleCaseMapping:0x16DF + }, + { code:0x16E0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16E0 + ,simpleLowerCaseMapping:0x16E0 + ,simpleTitleCaseMapping:0x16E0 + }, + { code:0x16E1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16E1 + ,simpleLowerCaseMapping:0x16E1 + ,simpleTitleCaseMapping:0x16E1 + }, + { code:0x16E2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16E2 + ,simpleLowerCaseMapping:0x16E2 + ,simpleTitleCaseMapping:0x16E2 + }, + { code:0x16E3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16E3 + ,simpleLowerCaseMapping:0x16E3 + ,simpleTitleCaseMapping:0x16E3 + }, + { code:0x16E4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16E4 + ,simpleLowerCaseMapping:0x16E4 + ,simpleTitleCaseMapping:0x16E4 + }, + { code:0x16E5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16E5 + ,simpleLowerCaseMapping:0x16E5 + ,simpleTitleCaseMapping:0x16E5 + }, + { code:0x16E6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16E6 + ,simpleLowerCaseMapping:0x16E6 + ,simpleTitleCaseMapping:0x16E6 + }, + { code:0x16E7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16E7 + ,simpleLowerCaseMapping:0x16E7 + ,simpleTitleCaseMapping:0x16E7 + }, + { code:0x16E8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16E8 + ,simpleLowerCaseMapping:0x16E8 + ,simpleTitleCaseMapping:0x16E8 + }, + { code:0x16E9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16E9 + ,simpleLowerCaseMapping:0x16E9 + ,simpleTitleCaseMapping:0x16E9 + }, + { code:0x16EA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x16EA + ,simpleLowerCaseMapping:0x16EA + ,simpleTitleCaseMapping:0x16EA + }, + { code:0x16EB + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x16EB + ,simpleLowerCaseMapping:0x16EB + ,simpleTitleCaseMapping:0x16EB + }, + { code:0x16EC + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x16EC + ,simpleLowerCaseMapping:0x16EC + ,simpleTitleCaseMapping:0x16EC + }, + { code:0x16ED + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x16ED + ,simpleLowerCaseMapping:0x16ED + ,simpleTitleCaseMapping:0x16ED + }, + { code:0x16EE + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x16EE + ,simpleLowerCaseMapping:0x16EE + ,simpleTitleCaseMapping:0x16EE + }, + { code:0x16EF + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x16EF + ,simpleLowerCaseMapping:0x16EF + ,simpleTitleCaseMapping:0x16EF + }, + { code:0x16F0 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x16F0 + ,simpleLowerCaseMapping:0x16F0 + ,simpleTitleCaseMapping:0x16F0 + }, + { code:0x1700 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1700 + ,simpleLowerCaseMapping:0x1700 + ,simpleTitleCaseMapping:0x1700 + }, + { code:0x1701 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1701 + ,simpleLowerCaseMapping:0x1701 + ,simpleTitleCaseMapping:0x1701 + }, + { code:0x1702 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1702 + ,simpleLowerCaseMapping:0x1702 + ,simpleTitleCaseMapping:0x1702 + }, + { code:0x1703 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1703 + ,simpleLowerCaseMapping:0x1703 + ,simpleTitleCaseMapping:0x1703 + }, + { code:0x1704 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1704 + ,simpleLowerCaseMapping:0x1704 + ,simpleTitleCaseMapping:0x1704 + }, + { code:0x1705 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1705 + ,simpleLowerCaseMapping:0x1705 + ,simpleTitleCaseMapping:0x1705 + }, + { code:0x1706 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1706 + ,simpleLowerCaseMapping:0x1706 + ,simpleTitleCaseMapping:0x1706 + }, + { code:0x1707 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1707 + ,simpleLowerCaseMapping:0x1707 + ,simpleTitleCaseMapping:0x1707 + }, + { code:0x1708 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1708 + ,simpleLowerCaseMapping:0x1708 + ,simpleTitleCaseMapping:0x1708 + }, + { code:0x1709 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1709 + ,simpleLowerCaseMapping:0x1709 + ,simpleTitleCaseMapping:0x1709 + }, + { code:0x170A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x170A + ,simpleLowerCaseMapping:0x170A + ,simpleTitleCaseMapping:0x170A + }, + { code:0x170B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x170B + ,simpleLowerCaseMapping:0x170B + ,simpleTitleCaseMapping:0x170B + }, + { code:0x170C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x170C + ,simpleLowerCaseMapping:0x170C + ,simpleTitleCaseMapping:0x170C + }, + { code:0x170E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x170E + ,simpleLowerCaseMapping:0x170E + ,simpleTitleCaseMapping:0x170E + }, + { code:0x170F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x170F + ,simpleLowerCaseMapping:0x170F + ,simpleTitleCaseMapping:0x170F + }, + { code:0x1710 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1710 + ,simpleLowerCaseMapping:0x1710 + ,simpleTitleCaseMapping:0x1710 + }, + { code:0x1711 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1711 + ,simpleLowerCaseMapping:0x1711 + ,simpleTitleCaseMapping:0x1711 + }, + { code:0x1712 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1712 + ,simpleLowerCaseMapping:0x1712 + ,simpleTitleCaseMapping:0x1712 + }, + { code:0x1713 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1713 + ,simpleLowerCaseMapping:0x1713 + ,simpleTitleCaseMapping:0x1713 + }, + { code:0x1714 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1714 + ,simpleLowerCaseMapping:0x1714 + ,simpleTitleCaseMapping:0x1714 + }, + { code:0x1720 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1720 + ,simpleLowerCaseMapping:0x1720 + ,simpleTitleCaseMapping:0x1720 + }, + { code:0x1721 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1721 + ,simpleLowerCaseMapping:0x1721 + ,simpleTitleCaseMapping:0x1721 + }, + { code:0x1722 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1722 + ,simpleLowerCaseMapping:0x1722 + ,simpleTitleCaseMapping:0x1722 + }, + { code:0x1723 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1723 + ,simpleLowerCaseMapping:0x1723 + ,simpleTitleCaseMapping:0x1723 + }, + { code:0x1724 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1724 + ,simpleLowerCaseMapping:0x1724 + ,simpleTitleCaseMapping:0x1724 + }, + { code:0x1725 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1725 + ,simpleLowerCaseMapping:0x1725 + ,simpleTitleCaseMapping:0x1725 + }, + { code:0x1726 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1726 + ,simpleLowerCaseMapping:0x1726 + ,simpleTitleCaseMapping:0x1726 + }, + { code:0x1727 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1727 + ,simpleLowerCaseMapping:0x1727 + ,simpleTitleCaseMapping:0x1727 + }, + { code:0x1728 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1728 + ,simpleLowerCaseMapping:0x1728 + ,simpleTitleCaseMapping:0x1728 + }, + { code:0x1729 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1729 + ,simpleLowerCaseMapping:0x1729 + ,simpleTitleCaseMapping:0x1729 + }, + { code:0x172A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x172A + ,simpleLowerCaseMapping:0x172A + ,simpleTitleCaseMapping:0x172A + }, + { code:0x172B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x172B + ,simpleLowerCaseMapping:0x172B + ,simpleTitleCaseMapping:0x172B + }, + { code:0x172C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x172C + ,simpleLowerCaseMapping:0x172C + ,simpleTitleCaseMapping:0x172C + }, + { code:0x172D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x172D + ,simpleLowerCaseMapping:0x172D + ,simpleTitleCaseMapping:0x172D + }, + { code:0x172E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x172E + ,simpleLowerCaseMapping:0x172E + ,simpleTitleCaseMapping:0x172E + }, + { code:0x172F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x172F + ,simpleLowerCaseMapping:0x172F + ,simpleTitleCaseMapping:0x172F + }, + { code:0x1730 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1730 + ,simpleLowerCaseMapping:0x1730 + ,simpleTitleCaseMapping:0x1730 + }, + { code:0x1731 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1731 + ,simpleLowerCaseMapping:0x1731 + ,simpleTitleCaseMapping:0x1731 + }, + { code:0x1732 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1732 + ,simpleLowerCaseMapping:0x1732 + ,simpleTitleCaseMapping:0x1732 + }, + { code:0x1733 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1733 + ,simpleLowerCaseMapping:0x1733 + ,simpleTitleCaseMapping:0x1733 + }, + { code:0x1734 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1734 + ,simpleLowerCaseMapping:0x1734 + ,simpleTitleCaseMapping:0x1734 + }, + { code:0x1735 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x1735 + ,simpleLowerCaseMapping:0x1735 + ,simpleTitleCaseMapping:0x1735 + }, + { code:0x1736 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x1736 + ,simpleLowerCaseMapping:0x1736 + ,simpleTitleCaseMapping:0x1736 + }, + { code:0x1740 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1740 + ,simpleLowerCaseMapping:0x1740 + ,simpleTitleCaseMapping:0x1740 + }, + { code:0x1741 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1741 + ,simpleLowerCaseMapping:0x1741 + ,simpleTitleCaseMapping:0x1741 + }, + { code:0x1742 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1742 + ,simpleLowerCaseMapping:0x1742 + ,simpleTitleCaseMapping:0x1742 + }, + { code:0x1743 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1743 + ,simpleLowerCaseMapping:0x1743 + ,simpleTitleCaseMapping:0x1743 + }, + { code:0x1744 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1744 + ,simpleLowerCaseMapping:0x1744 + ,simpleTitleCaseMapping:0x1744 + }, + { code:0x1745 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1745 + ,simpleLowerCaseMapping:0x1745 + ,simpleTitleCaseMapping:0x1745 + }, + { code:0x1746 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1746 + ,simpleLowerCaseMapping:0x1746 + ,simpleTitleCaseMapping:0x1746 + }, + { code:0x1747 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1747 + ,simpleLowerCaseMapping:0x1747 + ,simpleTitleCaseMapping:0x1747 + }, + { code:0x1748 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1748 + ,simpleLowerCaseMapping:0x1748 + ,simpleTitleCaseMapping:0x1748 + }, + { code:0x1749 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1749 + ,simpleLowerCaseMapping:0x1749 + ,simpleTitleCaseMapping:0x1749 + }, + { code:0x174A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x174A + ,simpleLowerCaseMapping:0x174A + ,simpleTitleCaseMapping:0x174A + }, + { code:0x174B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x174B + ,simpleLowerCaseMapping:0x174B + ,simpleTitleCaseMapping:0x174B + }, + { code:0x174C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x174C + ,simpleLowerCaseMapping:0x174C + ,simpleTitleCaseMapping:0x174C + }, + { code:0x174D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x174D + ,simpleLowerCaseMapping:0x174D + ,simpleTitleCaseMapping:0x174D + }, + { code:0x174E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x174E + ,simpleLowerCaseMapping:0x174E + ,simpleTitleCaseMapping:0x174E + }, + { code:0x174F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x174F + ,simpleLowerCaseMapping:0x174F + ,simpleTitleCaseMapping:0x174F + }, + { code:0x1750 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1750 + ,simpleLowerCaseMapping:0x1750 + ,simpleTitleCaseMapping:0x1750 + }, + { code:0x1751 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1751 + ,simpleLowerCaseMapping:0x1751 + ,simpleTitleCaseMapping:0x1751 + }, + { code:0x1752 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1752 + ,simpleLowerCaseMapping:0x1752 + ,simpleTitleCaseMapping:0x1752 + }, + { code:0x1753 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1753 + ,simpleLowerCaseMapping:0x1753 + ,simpleTitleCaseMapping:0x1753 + }, + { code:0x1760 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1760 + ,simpleLowerCaseMapping:0x1760 + ,simpleTitleCaseMapping:0x1760 + }, + { code:0x1761 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1761 + ,simpleLowerCaseMapping:0x1761 + ,simpleTitleCaseMapping:0x1761 + }, + { code:0x1762 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1762 + ,simpleLowerCaseMapping:0x1762 + ,simpleTitleCaseMapping:0x1762 + }, + { code:0x1763 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1763 + ,simpleLowerCaseMapping:0x1763 + ,simpleTitleCaseMapping:0x1763 + }, + { code:0x1764 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1764 + ,simpleLowerCaseMapping:0x1764 + ,simpleTitleCaseMapping:0x1764 + }, + { code:0x1765 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1765 + ,simpleLowerCaseMapping:0x1765 + ,simpleTitleCaseMapping:0x1765 + }, + { code:0x1766 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1766 + ,simpleLowerCaseMapping:0x1766 + ,simpleTitleCaseMapping:0x1766 + }, + { code:0x1767 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1767 + ,simpleLowerCaseMapping:0x1767 + ,simpleTitleCaseMapping:0x1767 + }, + { code:0x1768 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1768 + ,simpleLowerCaseMapping:0x1768 + ,simpleTitleCaseMapping:0x1768 + }, + { code:0x1769 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1769 + ,simpleLowerCaseMapping:0x1769 + ,simpleTitleCaseMapping:0x1769 + }, + { code:0x176A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x176A + ,simpleLowerCaseMapping:0x176A + ,simpleTitleCaseMapping:0x176A + }, + { code:0x176B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x176B + ,simpleLowerCaseMapping:0x176B + ,simpleTitleCaseMapping:0x176B + }, + { code:0x176C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x176C + ,simpleLowerCaseMapping:0x176C + ,simpleTitleCaseMapping:0x176C + }, + { code:0x176E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x176E + ,simpleLowerCaseMapping:0x176E + ,simpleTitleCaseMapping:0x176E + }, + { code:0x176F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x176F + ,simpleLowerCaseMapping:0x176F + ,simpleTitleCaseMapping:0x176F + }, + { code:0x1770 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1770 + ,simpleLowerCaseMapping:0x1770 + ,simpleTitleCaseMapping:0x1770 + }, + { code:0x1772 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1772 + ,simpleLowerCaseMapping:0x1772 + ,simpleTitleCaseMapping:0x1772 + }, + { code:0x1773 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1773 + ,simpleLowerCaseMapping:0x1773 + ,simpleTitleCaseMapping:0x1773 + }, + { code:0x1780 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1780 + ,simpleLowerCaseMapping:0x1780 + ,simpleTitleCaseMapping:0x1780 + }, + { code:0x1781 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1781 + ,simpleLowerCaseMapping:0x1781 + ,simpleTitleCaseMapping:0x1781 + }, + { code:0x1782 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1782 + ,simpleLowerCaseMapping:0x1782 + ,simpleTitleCaseMapping:0x1782 + }, + { code:0x1783 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1783 + ,simpleLowerCaseMapping:0x1783 + ,simpleTitleCaseMapping:0x1783 + }, + { code:0x1784 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1784 + ,simpleLowerCaseMapping:0x1784 + ,simpleTitleCaseMapping:0x1784 + }, + { code:0x1785 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1785 + ,simpleLowerCaseMapping:0x1785 + ,simpleTitleCaseMapping:0x1785 + }, + { code:0x1786 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1786 + ,simpleLowerCaseMapping:0x1786 + ,simpleTitleCaseMapping:0x1786 + }, + { code:0x1787 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1787 + ,simpleLowerCaseMapping:0x1787 + ,simpleTitleCaseMapping:0x1787 + }, + { code:0x1788 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1788 + ,simpleLowerCaseMapping:0x1788 + ,simpleTitleCaseMapping:0x1788 + }, + { code:0x1789 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1789 + ,simpleLowerCaseMapping:0x1789 + ,simpleTitleCaseMapping:0x1789 + }, + { code:0x178A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x178A + ,simpleLowerCaseMapping:0x178A + ,simpleTitleCaseMapping:0x178A + }, + { code:0x178B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x178B + ,simpleLowerCaseMapping:0x178B + ,simpleTitleCaseMapping:0x178B + }, + { code:0x178C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x178C + ,simpleLowerCaseMapping:0x178C + ,simpleTitleCaseMapping:0x178C + }, + { code:0x178D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x178D + ,simpleLowerCaseMapping:0x178D + ,simpleTitleCaseMapping:0x178D + }, + { code:0x178E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x178E + ,simpleLowerCaseMapping:0x178E + ,simpleTitleCaseMapping:0x178E + }, + { code:0x178F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x178F + ,simpleLowerCaseMapping:0x178F + ,simpleTitleCaseMapping:0x178F + }, + { code:0x1790 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1790 + ,simpleLowerCaseMapping:0x1790 + ,simpleTitleCaseMapping:0x1790 + }, + { code:0x1791 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1791 + ,simpleLowerCaseMapping:0x1791 + ,simpleTitleCaseMapping:0x1791 + }, + { code:0x1792 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1792 + ,simpleLowerCaseMapping:0x1792 + ,simpleTitleCaseMapping:0x1792 + }, + { code:0x1793 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1793 + ,simpleLowerCaseMapping:0x1793 + ,simpleTitleCaseMapping:0x1793 + }, + { code:0x1794 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1794 + ,simpleLowerCaseMapping:0x1794 + ,simpleTitleCaseMapping:0x1794 + }, + { code:0x1795 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1795 + ,simpleLowerCaseMapping:0x1795 + ,simpleTitleCaseMapping:0x1795 + }, + { code:0x1796 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1796 + ,simpleLowerCaseMapping:0x1796 + ,simpleTitleCaseMapping:0x1796 + }, + { code:0x1797 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1797 + ,simpleLowerCaseMapping:0x1797 + ,simpleTitleCaseMapping:0x1797 + }, + { code:0x1798 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1798 + ,simpleLowerCaseMapping:0x1798 + ,simpleTitleCaseMapping:0x1798 + }, + { code:0x1799 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1799 + ,simpleLowerCaseMapping:0x1799 + ,simpleTitleCaseMapping:0x1799 + }, + { code:0x179A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x179A + ,simpleLowerCaseMapping:0x179A + ,simpleTitleCaseMapping:0x179A + }, + { code:0x179B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x179B + ,simpleLowerCaseMapping:0x179B + ,simpleTitleCaseMapping:0x179B + }, + { code:0x179C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x179C + ,simpleLowerCaseMapping:0x179C + ,simpleTitleCaseMapping:0x179C + }, + { code:0x179D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x179D + ,simpleLowerCaseMapping:0x179D + ,simpleTitleCaseMapping:0x179D + }, + { code:0x179E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x179E + ,simpleLowerCaseMapping:0x179E + ,simpleTitleCaseMapping:0x179E + }, + { code:0x179F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x179F + ,simpleLowerCaseMapping:0x179F + ,simpleTitleCaseMapping:0x179F + }, + { code:0x17A0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x17A0 + ,simpleLowerCaseMapping:0x17A0 + ,simpleTitleCaseMapping:0x17A0 + }, + { code:0x17A1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x17A1 + ,simpleLowerCaseMapping:0x17A1 + ,simpleTitleCaseMapping:0x17A1 + }, + { code:0x17A2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x17A2 + ,simpleLowerCaseMapping:0x17A2 + ,simpleTitleCaseMapping:0x17A2 + }, + { code:0x17A3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x17A3 + ,simpleLowerCaseMapping:0x17A3 + ,simpleTitleCaseMapping:0x17A3 + }, + { code:0x17A4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x17A4 + ,simpleLowerCaseMapping:0x17A4 + ,simpleTitleCaseMapping:0x17A4 + }, + { code:0x17A5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x17A5 + ,simpleLowerCaseMapping:0x17A5 + ,simpleTitleCaseMapping:0x17A5 + }, + { code:0x17A6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x17A6 + ,simpleLowerCaseMapping:0x17A6 + ,simpleTitleCaseMapping:0x17A6 + }, + { code:0x17A7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x17A7 + ,simpleLowerCaseMapping:0x17A7 + ,simpleTitleCaseMapping:0x17A7 + }, + { code:0x17A8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x17A8 + ,simpleLowerCaseMapping:0x17A8 + ,simpleTitleCaseMapping:0x17A8 + }, + { code:0x17A9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x17A9 + ,simpleLowerCaseMapping:0x17A9 + ,simpleTitleCaseMapping:0x17A9 + }, + { code:0x17AA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x17AA + ,simpleLowerCaseMapping:0x17AA + ,simpleTitleCaseMapping:0x17AA + }, + { code:0x17AB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x17AB + ,simpleLowerCaseMapping:0x17AB + ,simpleTitleCaseMapping:0x17AB + }, + { code:0x17AC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x17AC + ,simpleLowerCaseMapping:0x17AC + ,simpleTitleCaseMapping:0x17AC + }, + { code:0x17AD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x17AD + ,simpleLowerCaseMapping:0x17AD + ,simpleTitleCaseMapping:0x17AD + }, + { code:0x17AE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x17AE + ,simpleLowerCaseMapping:0x17AE + ,simpleTitleCaseMapping:0x17AE + }, + { code:0x17AF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x17AF + ,simpleLowerCaseMapping:0x17AF + ,simpleTitleCaseMapping:0x17AF + }, + { code:0x17B0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x17B0 + ,simpleLowerCaseMapping:0x17B0 + ,simpleTitleCaseMapping:0x17B0 + }, + { code:0x17B1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x17B1 + ,simpleLowerCaseMapping:0x17B1 + ,simpleTitleCaseMapping:0x17B1 + }, + { code:0x17B2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x17B2 + ,simpleLowerCaseMapping:0x17B2 + ,simpleTitleCaseMapping:0x17B2 + }, + { code:0x17B3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x17B3 + ,simpleLowerCaseMapping:0x17B3 + ,simpleTitleCaseMapping:0x17B3 + }, + { code:0x17B4 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x17B4 + ,simpleLowerCaseMapping:0x17B4 + ,simpleTitleCaseMapping:0x17B4 + }, + { code:0x17B5 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x17B5 + ,simpleLowerCaseMapping:0x17B5 + ,simpleTitleCaseMapping:0x17B5 + }, + { code:0x17B6 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x17B6 + ,simpleLowerCaseMapping:0x17B6 + ,simpleTitleCaseMapping:0x17B6 + }, + { code:0x17B7 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x17B7 + ,simpleLowerCaseMapping:0x17B7 + ,simpleTitleCaseMapping:0x17B7 + }, + { code:0x17B8 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x17B8 + ,simpleLowerCaseMapping:0x17B8 + ,simpleTitleCaseMapping:0x17B8 + }, + { code:0x17B9 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x17B9 + ,simpleLowerCaseMapping:0x17B9 + ,simpleTitleCaseMapping:0x17B9 + }, + { code:0x17BA + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x17BA + ,simpleLowerCaseMapping:0x17BA + ,simpleTitleCaseMapping:0x17BA + }, + { code:0x17BB + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x17BB + ,simpleLowerCaseMapping:0x17BB + ,simpleTitleCaseMapping:0x17BB + }, + { code:0x17BC + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x17BC + ,simpleLowerCaseMapping:0x17BC + ,simpleTitleCaseMapping:0x17BC + }, + { code:0x17BD + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x17BD + ,simpleLowerCaseMapping:0x17BD + ,simpleTitleCaseMapping:0x17BD + }, + { code:0x17BE + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x17BE + ,simpleLowerCaseMapping:0x17BE + ,simpleTitleCaseMapping:0x17BE + }, + { code:0x17BF + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x17BF + ,simpleLowerCaseMapping:0x17BF + ,simpleTitleCaseMapping:0x17BF + }, + { code:0x17C0 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x17C0 + ,simpleLowerCaseMapping:0x17C0 + ,simpleTitleCaseMapping:0x17C0 + }, + { code:0x17C1 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x17C1 + ,simpleLowerCaseMapping:0x17C1 + ,simpleTitleCaseMapping:0x17C1 + }, + { code:0x17C2 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x17C2 + ,simpleLowerCaseMapping:0x17C2 + ,simpleTitleCaseMapping:0x17C2 + }, + { code:0x17C3 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x17C3 + ,simpleLowerCaseMapping:0x17C3 + ,simpleTitleCaseMapping:0x17C3 + }, + { code:0x17C4 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x17C4 + ,simpleLowerCaseMapping:0x17C4 + ,simpleTitleCaseMapping:0x17C4 + }, + { code:0x17C5 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x17C5 + ,simpleLowerCaseMapping:0x17C5 + ,simpleTitleCaseMapping:0x17C5 + }, + { code:0x17C6 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x17C6 + ,simpleLowerCaseMapping:0x17C6 + ,simpleTitleCaseMapping:0x17C6 + }, + { code:0x17C7 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x17C7 + ,simpleLowerCaseMapping:0x17C7 + ,simpleTitleCaseMapping:0x17C7 + }, + { code:0x17C8 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x17C8 + ,simpleLowerCaseMapping:0x17C8 + ,simpleTitleCaseMapping:0x17C8 + }, + { code:0x17C9 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x17C9 + ,simpleLowerCaseMapping:0x17C9 + ,simpleTitleCaseMapping:0x17C9 + }, + { code:0x17CA + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x17CA + ,simpleLowerCaseMapping:0x17CA + ,simpleTitleCaseMapping:0x17CA + }, + { code:0x17CB + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x17CB + ,simpleLowerCaseMapping:0x17CB + ,simpleTitleCaseMapping:0x17CB + }, + { code:0x17CC + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x17CC + ,simpleLowerCaseMapping:0x17CC + ,simpleTitleCaseMapping:0x17CC + }, + { code:0x17CD + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x17CD + ,simpleLowerCaseMapping:0x17CD + ,simpleTitleCaseMapping:0x17CD + }, + { code:0x17CE + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x17CE + ,simpleLowerCaseMapping:0x17CE + ,simpleTitleCaseMapping:0x17CE + }, + { code:0x17CF + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x17CF + ,simpleLowerCaseMapping:0x17CF + ,simpleTitleCaseMapping:0x17CF + }, + { code:0x17D0 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x17D0 + ,simpleLowerCaseMapping:0x17D0 + ,simpleTitleCaseMapping:0x17D0 + }, + { code:0x17D1 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x17D1 + ,simpleLowerCaseMapping:0x17D1 + ,simpleTitleCaseMapping:0x17D1 + }, + { code:0x17D2 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x17D2 + ,simpleLowerCaseMapping:0x17D2 + ,simpleTitleCaseMapping:0x17D2 + }, + { code:0x17D3 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x17D3 + ,simpleLowerCaseMapping:0x17D3 + ,simpleTitleCaseMapping:0x17D3 + }, + { code:0x17D4 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x17D4 + ,simpleLowerCaseMapping:0x17D4 + ,simpleTitleCaseMapping:0x17D4 + }, + { code:0x17D5 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x17D5 + ,simpleLowerCaseMapping:0x17D5 + ,simpleTitleCaseMapping:0x17D5 + }, + { code:0x17D6 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x17D6 + ,simpleLowerCaseMapping:0x17D6 + ,simpleTitleCaseMapping:0x17D6 + }, + { code:0x17D7 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x17D7 + ,simpleLowerCaseMapping:0x17D7 + ,simpleTitleCaseMapping:0x17D7 + }, + { code:0x17D8 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x17D8 + ,simpleLowerCaseMapping:0x17D8 + ,simpleTitleCaseMapping:0x17D8 + }, + { code:0x17D9 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x17D9 + ,simpleLowerCaseMapping:0x17D9 + ,simpleTitleCaseMapping:0x17D9 + }, + { code:0x17DA + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x17DA + ,simpleLowerCaseMapping:0x17DA + ,simpleTitleCaseMapping:0x17DA + }, + { code:0x17DB + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0x17DB + ,simpleLowerCaseMapping:0x17DB + ,simpleTitleCaseMapping:0x17DB + }, + { code:0x17DC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x17DC + ,simpleLowerCaseMapping:0x17DC + ,simpleTitleCaseMapping:0x17DC + }, + { code:0x17DD + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x17DD + ,simpleLowerCaseMapping:0x17DD + ,simpleTitleCaseMapping:0x17DD + }, + { code:0x17E0 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x17E0 + ,simpleLowerCaseMapping:0x17E0 + ,simpleTitleCaseMapping:0x17E0 + }, + { code:0x17E1 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x17E1 + ,simpleLowerCaseMapping:0x17E1 + ,simpleTitleCaseMapping:0x17E1 + }, + { code:0x17E2 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x17E2 + ,simpleLowerCaseMapping:0x17E2 + ,simpleTitleCaseMapping:0x17E2 + }, + { code:0x17E3 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x17E3 + ,simpleLowerCaseMapping:0x17E3 + ,simpleTitleCaseMapping:0x17E3 + }, + { code:0x17E4 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x17E4 + ,simpleLowerCaseMapping:0x17E4 + ,simpleTitleCaseMapping:0x17E4 + }, + { code:0x17E5 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x17E5 + ,simpleLowerCaseMapping:0x17E5 + ,simpleTitleCaseMapping:0x17E5 + }, + { code:0x17E6 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x17E6 + ,simpleLowerCaseMapping:0x17E6 + ,simpleTitleCaseMapping:0x17E6 + }, + { code:0x17E7 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x17E7 + ,simpleLowerCaseMapping:0x17E7 + ,simpleTitleCaseMapping:0x17E7 + }, + { code:0x17E8 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x17E8 + ,simpleLowerCaseMapping:0x17E8 + ,simpleTitleCaseMapping:0x17E8 + }, + { code:0x17E9 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x17E9 + ,simpleLowerCaseMapping:0x17E9 + ,simpleTitleCaseMapping:0x17E9 + }, + { code:0x17F0 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x17F0 + ,simpleLowerCaseMapping:0x17F0 + ,simpleTitleCaseMapping:0x17F0 + }, + { code:0x17F1 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x17F1 + ,simpleLowerCaseMapping:0x17F1 + ,simpleTitleCaseMapping:0x17F1 + }, + { code:0x17F2 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x17F2 + ,simpleLowerCaseMapping:0x17F2 + ,simpleTitleCaseMapping:0x17F2 + }, + { code:0x17F3 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x17F3 + ,simpleLowerCaseMapping:0x17F3 + ,simpleTitleCaseMapping:0x17F3 + }, + { code:0x17F4 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x17F4 + ,simpleLowerCaseMapping:0x17F4 + ,simpleTitleCaseMapping:0x17F4 + }, + { code:0x17F5 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x17F5 + ,simpleLowerCaseMapping:0x17F5 + ,simpleTitleCaseMapping:0x17F5 + }, + { code:0x17F6 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x17F6 + ,simpleLowerCaseMapping:0x17F6 + ,simpleTitleCaseMapping:0x17F6 + }, + { code:0x17F7 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x17F7 + ,simpleLowerCaseMapping:0x17F7 + ,simpleTitleCaseMapping:0x17F7 + }, + { code:0x17F8 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x17F8 + ,simpleLowerCaseMapping:0x17F8 + ,simpleTitleCaseMapping:0x17F8 + }, + { code:0x17F9 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x17F9 + ,simpleLowerCaseMapping:0x17F9 + ,simpleTitleCaseMapping:0x17F9 + }, + { code:0x1800 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x1800 + ,simpleLowerCaseMapping:0x1800 + ,simpleTitleCaseMapping:0x1800 + }, + { code:0x1801 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x1801 + ,simpleLowerCaseMapping:0x1801 + ,simpleTitleCaseMapping:0x1801 + }, + { code:0x1802 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x1802 + ,simpleLowerCaseMapping:0x1802 + ,simpleTitleCaseMapping:0x1802 + }, + { code:0x1803 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x1803 + ,simpleLowerCaseMapping:0x1803 + ,simpleTitleCaseMapping:0x1803 + }, + { code:0x1804 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x1804 + ,simpleLowerCaseMapping:0x1804 + ,simpleTitleCaseMapping:0x1804 + }, + { code:0x1805 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x1805 + ,simpleLowerCaseMapping:0x1805 + ,simpleTitleCaseMapping:0x1805 + }, + { code:0x1806 + ,generalCategory:UnicodeData.GeneralCategory.Pd + ,simpleUpperCaseMapping:0x1806 + ,simpleLowerCaseMapping:0x1806 + ,simpleTitleCaseMapping:0x1806 + }, + { code:0x1807 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x1807 + ,simpleLowerCaseMapping:0x1807 + ,simpleTitleCaseMapping:0x1807 + }, + { code:0x1808 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x1808 + ,simpleLowerCaseMapping:0x1808 + ,simpleTitleCaseMapping:0x1808 + }, + { code:0x1809 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x1809 + ,simpleLowerCaseMapping:0x1809 + ,simpleTitleCaseMapping:0x1809 + }, + { code:0x180A + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x180A + ,simpleLowerCaseMapping:0x180A + ,simpleTitleCaseMapping:0x180A + }, + { code:0x180B + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x180B + ,simpleLowerCaseMapping:0x180B + ,simpleTitleCaseMapping:0x180B + }, + { code:0x180C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x180C + ,simpleLowerCaseMapping:0x180C + ,simpleTitleCaseMapping:0x180C + }, + { code:0x180D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x180D + ,simpleLowerCaseMapping:0x180D + ,simpleTitleCaseMapping:0x180D + }, + { code:0x180E + ,generalCategory:UnicodeData.GeneralCategory.Zs + ,simpleUpperCaseMapping:0x180E + ,simpleLowerCaseMapping:0x180E + ,simpleTitleCaseMapping:0x180E + }, + { code:0x1810 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1810 + ,simpleLowerCaseMapping:0x1810 + ,simpleTitleCaseMapping:0x1810 + }, + { code:0x1811 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1811 + ,simpleLowerCaseMapping:0x1811 + ,simpleTitleCaseMapping:0x1811 + }, + { code:0x1812 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1812 + ,simpleLowerCaseMapping:0x1812 + ,simpleTitleCaseMapping:0x1812 + }, + { code:0x1813 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1813 + ,simpleLowerCaseMapping:0x1813 + ,simpleTitleCaseMapping:0x1813 + }, + { code:0x1814 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1814 + ,simpleLowerCaseMapping:0x1814 + ,simpleTitleCaseMapping:0x1814 + }, + { code:0x1815 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1815 + ,simpleLowerCaseMapping:0x1815 + ,simpleTitleCaseMapping:0x1815 + }, + { code:0x1816 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1816 + ,simpleLowerCaseMapping:0x1816 + ,simpleTitleCaseMapping:0x1816 + }, + { code:0x1817 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1817 + ,simpleLowerCaseMapping:0x1817 + ,simpleTitleCaseMapping:0x1817 + }, + { code:0x1818 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1818 + ,simpleLowerCaseMapping:0x1818 + ,simpleTitleCaseMapping:0x1818 + }, + { code:0x1819 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1819 + ,simpleLowerCaseMapping:0x1819 + ,simpleTitleCaseMapping:0x1819 + }, + { code:0x1820 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1820 + ,simpleLowerCaseMapping:0x1820 + ,simpleTitleCaseMapping:0x1820 + }, + { code:0x1821 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1821 + ,simpleLowerCaseMapping:0x1821 + ,simpleTitleCaseMapping:0x1821 + }, + { code:0x1822 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1822 + ,simpleLowerCaseMapping:0x1822 + ,simpleTitleCaseMapping:0x1822 + }, + { code:0x1823 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1823 + ,simpleLowerCaseMapping:0x1823 + ,simpleTitleCaseMapping:0x1823 + }, + { code:0x1824 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1824 + ,simpleLowerCaseMapping:0x1824 + ,simpleTitleCaseMapping:0x1824 + }, + { code:0x1825 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1825 + ,simpleLowerCaseMapping:0x1825 + ,simpleTitleCaseMapping:0x1825 + }, + { code:0x1826 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1826 + ,simpleLowerCaseMapping:0x1826 + ,simpleTitleCaseMapping:0x1826 + }, + { code:0x1827 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1827 + ,simpleLowerCaseMapping:0x1827 + ,simpleTitleCaseMapping:0x1827 + }, + { code:0x1828 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1828 + ,simpleLowerCaseMapping:0x1828 + ,simpleTitleCaseMapping:0x1828 + }, + { code:0x1829 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1829 + ,simpleLowerCaseMapping:0x1829 + ,simpleTitleCaseMapping:0x1829 + }, + { code:0x182A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x182A + ,simpleLowerCaseMapping:0x182A + ,simpleTitleCaseMapping:0x182A + }, + { code:0x182B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x182B + ,simpleLowerCaseMapping:0x182B + ,simpleTitleCaseMapping:0x182B + }, + { code:0x182C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x182C + ,simpleLowerCaseMapping:0x182C + ,simpleTitleCaseMapping:0x182C + }, + { code:0x182D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x182D + ,simpleLowerCaseMapping:0x182D + ,simpleTitleCaseMapping:0x182D + }, + { code:0x182E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x182E + ,simpleLowerCaseMapping:0x182E + ,simpleTitleCaseMapping:0x182E + }, + { code:0x182F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x182F + ,simpleLowerCaseMapping:0x182F + ,simpleTitleCaseMapping:0x182F + }, + { code:0x1830 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1830 + ,simpleLowerCaseMapping:0x1830 + ,simpleTitleCaseMapping:0x1830 + }, + { code:0x1831 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1831 + ,simpleLowerCaseMapping:0x1831 + ,simpleTitleCaseMapping:0x1831 + }, + { code:0x1832 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1832 + ,simpleLowerCaseMapping:0x1832 + ,simpleTitleCaseMapping:0x1832 + }, + { code:0x1833 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1833 + ,simpleLowerCaseMapping:0x1833 + ,simpleTitleCaseMapping:0x1833 + }, + { code:0x1834 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1834 + ,simpleLowerCaseMapping:0x1834 + ,simpleTitleCaseMapping:0x1834 + }, + { code:0x1835 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1835 + ,simpleLowerCaseMapping:0x1835 + ,simpleTitleCaseMapping:0x1835 + }, + { code:0x1836 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1836 + ,simpleLowerCaseMapping:0x1836 + ,simpleTitleCaseMapping:0x1836 + }, + { code:0x1837 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1837 + ,simpleLowerCaseMapping:0x1837 + ,simpleTitleCaseMapping:0x1837 + }, + { code:0x1838 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1838 + ,simpleLowerCaseMapping:0x1838 + ,simpleTitleCaseMapping:0x1838 + }, + { code:0x1839 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1839 + ,simpleLowerCaseMapping:0x1839 + ,simpleTitleCaseMapping:0x1839 + }, + { code:0x183A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x183A + ,simpleLowerCaseMapping:0x183A + ,simpleTitleCaseMapping:0x183A + }, + { code:0x183B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x183B + ,simpleLowerCaseMapping:0x183B + ,simpleTitleCaseMapping:0x183B + }, + { code:0x183C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x183C + ,simpleLowerCaseMapping:0x183C + ,simpleTitleCaseMapping:0x183C + }, + { code:0x183D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x183D + ,simpleLowerCaseMapping:0x183D + ,simpleTitleCaseMapping:0x183D + }, + { code:0x183E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x183E + ,simpleLowerCaseMapping:0x183E + ,simpleTitleCaseMapping:0x183E + }, + { code:0x183F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x183F + ,simpleLowerCaseMapping:0x183F + ,simpleTitleCaseMapping:0x183F + }, + { code:0x1840 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1840 + ,simpleLowerCaseMapping:0x1840 + ,simpleTitleCaseMapping:0x1840 + }, + { code:0x1841 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1841 + ,simpleLowerCaseMapping:0x1841 + ,simpleTitleCaseMapping:0x1841 + }, + { code:0x1842 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1842 + ,simpleLowerCaseMapping:0x1842 + ,simpleTitleCaseMapping:0x1842 + }, + { code:0x1843 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1843 + ,simpleLowerCaseMapping:0x1843 + ,simpleTitleCaseMapping:0x1843 + }, + { code:0x1844 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1844 + ,simpleLowerCaseMapping:0x1844 + ,simpleTitleCaseMapping:0x1844 + }, + { code:0x1845 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1845 + ,simpleLowerCaseMapping:0x1845 + ,simpleTitleCaseMapping:0x1845 + }, + { code:0x1846 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1846 + ,simpleLowerCaseMapping:0x1846 + ,simpleTitleCaseMapping:0x1846 + }, + { code:0x1847 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1847 + ,simpleLowerCaseMapping:0x1847 + ,simpleTitleCaseMapping:0x1847 + }, + { code:0x1848 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1848 + ,simpleLowerCaseMapping:0x1848 + ,simpleTitleCaseMapping:0x1848 + }, + { code:0x1849 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1849 + ,simpleLowerCaseMapping:0x1849 + ,simpleTitleCaseMapping:0x1849 + }, + { code:0x184A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x184A + ,simpleLowerCaseMapping:0x184A + ,simpleTitleCaseMapping:0x184A + }, + { code:0x184B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x184B + ,simpleLowerCaseMapping:0x184B + ,simpleTitleCaseMapping:0x184B + }, + { code:0x184C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x184C + ,simpleLowerCaseMapping:0x184C + ,simpleTitleCaseMapping:0x184C + }, + { code:0x184D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x184D + ,simpleLowerCaseMapping:0x184D + ,simpleTitleCaseMapping:0x184D + }, + { code:0x184E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x184E + ,simpleLowerCaseMapping:0x184E + ,simpleTitleCaseMapping:0x184E + }, + { code:0x184F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x184F + ,simpleLowerCaseMapping:0x184F + ,simpleTitleCaseMapping:0x184F + }, + { code:0x1850 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1850 + ,simpleLowerCaseMapping:0x1850 + ,simpleTitleCaseMapping:0x1850 + }, + { code:0x1851 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1851 + ,simpleLowerCaseMapping:0x1851 + ,simpleTitleCaseMapping:0x1851 + }, + { code:0x1852 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1852 + ,simpleLowerCaseMapping:0x1852 + ,simpleTitleCaseMapping:0x1852 + }, + { code:0x1853 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1853 + ,simpleLowerCaseMapping:0x1853 + ,simpleTitleCaseMapping:0x1853 + }, + { code:0x1854 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1854 + ,simpleLowerCaseMapping:0x1854 + ,simpleTitleCaseMapping:0x1854 + }, + { code:0x1855 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1855 + ,simpleLowerCaseMapping:0x1855 + ,simpleTitleCaseMapping:0x1855 + }, + { code:0x1856 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1856 + ,simpleLowerCaseMapping:0x1856 + ,simpleTitleCaseMapping:0x1856 + }, + { code:0x1857 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1857 + ,simpleLowerCaseMapping:0x1857 + ,simpleTitleCaseMapping:0x1857 + }, + { code:0x1858 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1858 + ,simpleLowerCaseMapping:0x1858 + ,simpleTitleCaseMapping:0x1858 + }, + { code:0x1859 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1859 + ,simpleLowerCaseMapping:0x1859 + ,simpleTitleCaseMapping:0x1859 + }, + { code:0x185A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x185A + ,simpleLowerCaseMapping:0x185A + ,simpleTitleCaseMapping:0x185A + }, + { code:0x185B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x185B + ,simpleLowerCaseMapping:0x185B + ,simpleTitleCaseMapping:0x185B + }, + { code:0x185C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x185C + ,simpleLowerCaseMapping:0x185C + ,simpleTitleCaseMapping:0x185C + }, + { code:0x185D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x185D + ,simpleLowerCaseMapping:0x185D + ,simpleTitleCaseMapping:0x185D + }, + { code:0x185E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x185E + ,simpleLowerCaseMapping:0x185E + ,simpleTitleCaseMapping:0x185E + }, + { code:0x185F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x185F + ,simpleLowerCaseMapping:0x185F + ,simpleTitleCaseMapping:0x185F + }, + { code:0x1860 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1860 + ,simpleLowerCaseMapping:0x1860 + ,simpleTitleCaseMapping:0x1860 + }, + { code:0x1861 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1861 + ,simpleLowerCaseMapping:0x1861 + ,simpleTitleCaseMapping:0x1861 + }, + { code:0x1862 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1862 + ,simpleLowerCaseMapping:0x1862 + ,simpleTitleCaseMapping:0x1862 + }, + { code:0x1863 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1863 + ,simpleLowerCaseMapping:0x1863 + ,simpleTitleCaseMapping:0x1863 + }, + { code:0x1864 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1864 + ,simpleLowerCaseMapping:0x1864 + ,simpleTitleCaseMapping:0x1864 + }, + { code:0x1865 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1865 + ,simpleLowerCaseMapping:0x1865 + ,simpleTitleCaseMapping:0x1865 + }, + { code:0x1866 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1866 + ,simpleLowerCaseMapping:0x1866 + ,simpleTitleCaseMapping:0x1866 + }, + { code:0x1867 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1867 + ,simpleLowerCaseMapping:0x1867 + ,simpleTitleCaseMapping:0x1867 + }, + { code:0x1868 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1868 + ,simpleLowerCaseMapping:0x1868 + ,simpleTitleCaseMapping:0x1868 + }, + { code:0x1869 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1869 + ,simpleLowerCaseMapping:0x1869 + ,simpleTitleCaseMapping:0x1869 + }, + { code:0x186A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x186A + ,simpleLowerCaseMapping:0x186A + ,simpleTitleCaseMapping:0x186A + }, + { code:0x186B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x186B + ,simpleLowerCaseMapping:0x186B + ,simpleTitleCaseMapping:0x186B + }, + { code:0x186C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x186C + ,simpleLowerCaseMapping:0x186C + ,simpleTitleCaseMapping:0x186C + }, + { code:0x186D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x186D + ,simpleLowerCaseMapping:0x186D + ,simpleTitleCaseMapping:0x186D + }, + { code:0x186E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x186E + ,simpleLowerCaseMapping:0x186E + ,simpleTitleCaseMapping:0x186E + }, + { code:0x186F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x186F + ,simpleLowerCaseMapping:0x186F + ,simpleTitleCaseMapping:0x186F + }, + { code:0x1870 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1870 + ,simpleLowerCaseMapping:0x1870 + ,simpleTitleCaseMapping:0x1870 + }, + { code:0x1871 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1871 + ,simpleLowerCaseMapping:0x1871 + ,simpleTitleCaseMapping:0x1871 + }, + { code:0x1872 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1872 + ,simpleLowerCaseMapping:0x1872 + ,simpleTitleCaseMapping:0x1872 + }, + { code:0x1873 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1873 + ,simpleLowerCaseMapping:0x1873 + ,simpleTitleCaseMapping:0x1873 + }, + { code:0x1874 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1874 + ,simpleLowerCaseMapping:0x1874 + ,simpleTitleCaseMapping:0x1874 + }, + { code:0x1875 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1875 + ,simpleLowerCaseMapping:0x1875 + ,simpleTitleCaseMapping:0x1875 + }, + { code:0x1876 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1876 + ,simpleLowerCaseMapping:0x1876 + ,simpleTitleCaseMapping:0x1876 + }, + { code:0x1877 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1877 + ,simpleLowerCaseMapping:0x1877 + ,simpleTitleCaseMapping:0x1877 + }, + { code:0x1880 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1880 + ,simpleLowerCaseMapping:0x1880 + ,simpleTitleCaseMapping:0x1880 + }, + { code:0x1881 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1881 + ,simpleLowerCaseMapping:0x1881 + ,simpleTitleCaseMapping:0x1881 + }, + { code:0x1882 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1882 + ,simpleLowerCaseMapping:0x1882 + ,simpleTitleCaseMapping:0x1882 + }, + { code:0x1883 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1883 + ,simpleLowerCaseMapping:0x1883 + ,simpleTitleCaseMapping:0x1883 + }, + { code:0x1884 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1884 + ,simpleLowerCaseMapping:0x1884 + ,simpleTitleCaseMapping:0x1884 + }, + { code:0x1885 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1885 + ,simpleLowerCaseMapping:0x1885 + ,simpleTitleCaseMapping:0x1885 + }, + { code:0x1886 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1886 + ,simpleLowerCaseMapping:0x1886 + ,simpleTitleCaseMapping:0x1886 + }, + { code:0x1887 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1887 + ,simpleLowerCaseMapping:0x1887 + ,simpleTitleCaseMapping:0x1887 + }, + { code:0x1888 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1888 + ,simpleLowerCaseMapping:0x1888 + ,simpleTitleCaseMapping:0x1888 + }, + { code:0x1889 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1889 + ,simpleLowerCaseMapping:0x1889 + ,simpleTitleCaseMapping:0x1889 + }, + { code:0x188A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x188A + ,simpleLowerCaseMapping:0x188A + ,simpleTitleCaseMapping:0x188A + }, + { code:0x188B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x188B + ,simpleLowerCaseMapping:0x188B + ,simpleTitleCaseMapping:0x188B + }, + { code:0x188C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x188C + ,simpleLowerCaseMapping:0x188C + ,simpleTitleCaseMapping:0x188C + }, + { code:0x188D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x188D + ,simpleLowerCaseMapping:0x188D + ,simpleTitleCaseMapping:0x188D + }, + { code:0x188E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x188E + ,simpleLowerCaseMapping:0x188E + ,simpleTitleCaseMapping:0x188E + }, + { code:0x188F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x188F + ,simpleLowerCaseMapping:0x188F + ,simpleTitleCaseMapping:0x188F + }, + { code:0x1890 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1890 + ,simpleLowerCaseMapping:0x1890 + ,simpleTitleCaseMapping:0x1890 + }, + { code:0x1891 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1891 + ,simpleLowerCaseMapping:0x1891 + ,simpleTitleCaseMapping:0x1891 + }, + { code:0x1892 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1892 + ,simpleLowerCaseMapping:0x1892 + ,simpleTitleCaseMapping:0x1892 + }, + { code:0x1893 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1893 + ,simpleLowerCaseMapping:0x1893 + ,simpleTitleCaseMapping:0x1893 + }, + { code:0x1894 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1894 + ,simpleLowerCaseMapping:0x1894 + ,simpleTitleCaseMapping:0x1894 + }, + { code:0x1895 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1895 + ,simpleLowerCaseMapping:0x1895 + ,simpleTitleCaseMapping:0x1895 + }, + { code:0x1896 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1896 + ,simpleLowerCaseMapping:0x1896 + ,simpleTitleCaseMapping:0x1896 + }, + { code:0x1897 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1897 + ,simpleLowerCaseMapping:0x1897 + ,simpleTitleCaseMapping:0x1897 + }, + { code:0x1898 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1898 + ,simpleLowerCaseMapping:0x1898 + ,simpleTitleCaseMapping:0x1898 + }, + { code:0x1899 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1899 + ,simpleLowerCaseMapping:0x1899 + ,simpleTitleCaseMapping:0x1899 + }, + { code:0x189A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x189A + ,simpleLowerCaseMapping:0x189A + ,simpleTitleCaseMapping:0x189A + }, + { code:0x189B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x189B + ,simpleLowerCaseMapping:0x189B + ,simpleTitleCaseMapping:0x189B + }, + { code:0x189C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x189C + ,simpleLowerCaseMapping:0x189C + ,simpleTitleCaseMapping:0x189C + }, + { code:0x189D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x189D + ,simpleLowerCaseMapping:0x189D + ,simpleTitleCaseMapping:0x189D + }, + { code:0x189E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x189E + ,simpleLowerCaseMapping:0x189E + ,simpleTitleCaseMapping:0x189E + }, + { code:0x189F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x189F + ,simpleLowerCaseMapping:0x189F + ,simpleTitleCaseMapping:0x189F + }, + { code:0x18A0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x18A0 + ,simpleLowerCaseMapping:0x18A0 + ,simpleTitleCaseMapping:0x18A0 + }, + { code:0x18A1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x18A1 + ,simpleLowerCaseMapping:0x18A1 + ,simpleTitleCaseMapping:0x18A1 + }, + { code:0x18A2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x18A2 + ,simpleLowerCaseMapping:0x18A2 + ,simpleTitleCaseMapping:0x18A2 + }, + { code:0x18A3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x18A3 + ,simpleLowerCaseMapping:0x18A3 + ,simpleTitleCaseMapping:0x18A3 + }, + { code:0x18A4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x18A4 + ,simpleLowerCaseMapping:0x18A4 + ,simpleTitleCaseMapping:0x18A4 + }, + { code:0x18A5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x18A5 + ,simpleLowerCaseMapping:0x18A5 + ,simpleTitleCaseMapping:0x18A5 + }, + { code:0x18A6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x18A6 + ,simpleLowerCaseMapping:0x18A6 + ,simpleTitleCaseMapping:0x18A6 + }, + { code:0x18A7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x18A7 + ,simpleLowerCaseMapping:0x18A7 + ,simpleTitleCaseMapping:0x18A7 + }, + { code:0x18A8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x18A8 + ,simpleLowerCaseMapping:0x18A8 + ,simpleTitleCaseMapping:0x18A8 + }, + { code:0x18A9 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x18A9 + ,simpleLowerCaseMapping:0x18A9 + ,simpleTitleCaseMapping:0x18A9 + }, + { code:0x1900 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1900 + ,simpleLowerCaseMapping:0x1900 + ,simpleTitleCaseMapping:0x1900 + }, + { code:0x1901 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1901 + ,simpleLowerCaseMapping:0x1901 + ,simpleTitleCaseMapping:0x1901 + }, + { code:0x1902 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1902 + ,simpleLowerCaseMapping:0x1902 + ,simpleTitleCaseMapping:0x1902 + }, + { code:0x1903 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1903 + ,simpleLowerCaseMapping:0x1903 + ,simpleTitleCaseMapping:0x1903 + }, + { code:0x1904 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1904 + ,simpleLowerCaseMapping:0x1904 + ,simpleTitleCaseMapping:0x1904 + }, + { code:0x1905 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1905 + ,simpleLowerCaseMapping:0x1905 + ,simpleTitleCaseMapping:0x1905 + }, + { code:0x1906 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1906 + ,simpleLowerCaseMapping:0x1906 + ,simpleTitleCaseMapping:0x1906 + }, + { code:0x1907 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1907 + ,simpleLowerCaseMapping:0x1907 + ,simpleTitleCaseMapping:0x1907 + }, + { code:0x1908 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1908 + ,simpleLowerCaseMapping:0x1908 + ,simpleTitleCaseMapping:0x1908 + }, + { code:0x1909 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1909 + ,simpleLowerCaseMapping:0x1909 + ,simpleTitleCaseMapping:0x1909 + }, + { code:0x190A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x190A + ,simpleLowerCaseMapping:0x190A + ,simpleTitleCaseMapping:0x190A + }, + { code:0x190B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x190B + ,simpleLowerCaseMapping:0x190B + ,simpleTitleCaseMapping:0x190B + }, + { code:0x190C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x190C + ,simpleLowerCaseMapping:0x190C + ,simpleTitleCaseMapping:0x190C + }, + { code:0x190D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x190D + ,simpleLowerCaseMapping:0x190D + ,simpleTitleCaseMapping:0x190D + }, + { code:0x190E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x190E + ,simpleLowerCaseMapping:0x190E + ,simpleTitleCaseMapping:0x190E + }, + { code:0x190F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x190F + ,simpleLowerCaseMapping:0x190F + ,simpleTitleCaseMapping:0x190F + }, + { code:0x1910 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1910 + ,simpleLowerCaseMapping:0x1910 + ,simpleTitleCaseMapping:0x1910 + }, + { code:0x1911 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1911 + ,simpleLowerCaseMapping:0x1911 + ,simpleTitleCaseMapping:0x1911 + }, + { code:0x1912 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1912 + ,simpleLowerCaseMapping:0x1912 + ,simpleTitleCaseMapping:0x1912 + }, + { code:0x1913 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1913 + ,simpleLowerCaseMapping:0x1913 + ,simpleTitleCaseMapping:0x1913 + }, + { code:0x1914 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1914 + ,simpleLowerCaseMapping:0x1914 + ,simpleTitleCaseMapping:0x1914 + }, + { code:0x1915 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1915 + ,simpleLowerCaseMapping:0x1915 + ,simpleTitleCaseMapping:0x1915 + }, + { code:0x1916 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1916 + ,simpleLowerCaseMapping:0x1916 + ,simpleTitleCaseMapping:0x1916 + }, + { code:0x1917 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1917 + ,simpleLowerCaseMapping:0x1917 + ,simpleTitleCaseMapping:0x1917 + }, + { code:0x1918 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1918 + ,simpleLowerCaseMapping:0x1918 + ,simpleTitleCaseMapping:0x1918 + }, + { code:0x1919 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1919 + ,simpleLowerCaseMapping:0x1919 + ,simpleTitleCaseMapping:0x1919 + }, + { code:0x191A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x191A + ,simpleLowerCaseMapping:0x191A + ,simpleTitleCaseMapping:0x191A + }, + { code:0x191B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x191B + ,simpleLowerCaseMapping:0x191B + ,simpleTitleCaseMapping:0x191B + }, + { code:0x191C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x191C + ,simpleLowerCaseMapping:0x191C + ,simpleTitleCaseMapping:0x191C + }, + { code:0x1920 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1920 + ,simpleLowerCaseMapping:0x1920 + ,simpleTitleCaseMapping:0x1920 + }, + { code:0x1921 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1921 + ,simpleLowerCaseMapping:0x1921 + ,simpleTitleCaseMapping:0x1921 + }, + { code:0x1922 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1922 + ,simpleLowerCaseMapping:0x1922 + ,simpleTitleCaseMapping:0x1922 + }, + { code:0x1923 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1923 + ,simpleLowerCaseMapping:0x1923 + ,simpleTitleCaseMapping:0x1923 + }, + { code:0x1924 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1924 + ,simpleLowerCaseMapping:0x1924 + ,simpleTitleCaseMapping:0x1924 + }, + { code:0x1925 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1925 + ,simpleLowerCaseMapping:0x1925 + ,simpleTitleCaseMapping:0x1925 + }, + { code:0x1926 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1926 + ,simpleLowerCaseMapping:0x1926 + ,simpleTitleCaseMapping:0x1926 + }, + { code:0x1927 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1927 + ,simpleLowerCaseMapping:0x1927 + ,simpleTitleCaseMapping:0x1927 + }, + { code:0x1928 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1928 + ,simpleLowerCaseMapping:0x1928 + ,simpleTitleCaseMapping:0x1928 + }, + { code:0x1929 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1929 + ,simpleLowerCaseMapping:0x1929 + ,simpleTitleCaseMapping:0x1929 + }, + { code:0x192A + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x192A + ,simpleLowerCaseMapping:0x192A + ,simpleTitleCaseMapping:0x192A + }, + { code:0x192B + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x192B + ,simpleLowerCaseMapping:0x192B + ,simpleTitleCaseMapping:0x192B + }, + { code:0x1930 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1930 + ,simpleLowerCaseMapping:0x1930 + ,simpleTitleCaseMapping:0x1930 + }, + { code:0x1931 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1931 + ,simpleLowerCaseMapping:0x1931 + ,simpleTitleCaseMapping:0x1931 + }, + { code:0x1932 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1932 + ,simpleLowerCaseMapping:0x1932 + ,simpleTitleCaseMapping:0x1932 + }, + { code:0x1933 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1933 + ,simpleLowerCaseMapping:0x1933 + ,simpleTitleCaseMapping:0x1933 + }, + { code:0x1934 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1934 + ,simpleLowerCaseMapping:0x1934 + ,simpleTitleCaseMapping:0x1934 + }, + { code:0x1935 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1935 + ,simpleLowerCaseMapping:0x1935 + ,simpleTitleCaseMapping:0x1935 + }, + { code:0x1936 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1936 + ,simpleLowerCaseMapping:0x1936 + ,simpleTitleCaseMapping:0x1936 + }, + { code:0x1937 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1937 + ,simpleLowerCaseMapping:0x1937 + ,simpleTitleCaseMapping:0x1937 + }, + { code:0x1938 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1938 + ,simpleLowerCaseMapping:0x1938 + ,simpleTitleCaseMapping:0x1938 + }, + { code:0x1939 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1939 + ,simpleLowerCaseMapping:0x1939 + ,simpleTitleCaseMapping:0x1939 + }, + { code:0x193A + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x193A + ,simpleLowerCaseMapping:0x193A + ,simpleTitleCaseMapping:0x193A + }, + { code:0x193B + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x193B + ,simpleLowerCaseMapping:0x193B + ,simpleTitleCaseMapping:0x193B + }, + { code:0x1940 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1940 + ,simpleLowerCaseMapping:0x1940 + ,simpleTitleCaseMapping:0x1940 + }, + { code:0x1944 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x1944 + ,simpleLowerCaseMapping:0x1944 + ,simpleTitleCaseMapping:0x1944 + }, + { code:0x1945 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x1945 + ,simpleLowerCaseMapping:0x1945 + ,simpleTitleCaseMapping:0x1945 + }, + { code:0x1946 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1946 + ,simpleLowerCaseMapping:0x1946 + ,simpleTitleCaseMapping:0x1946 + }, + { code:0x1947 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1947 + ,simpleLowerCaseMapping:0x1947 + ,simpleTitleCaseMapping:0x1947 + }, + { code:0x1948 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1948 + ,simpleLowerCaseMapping:0x1948 + ,simpleTitleCaseMapping:0x1948 + }, + { code:0x1949 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1949 + ,simpleLowerCaseMapping:0x1949 + ,simpleTitleCaseMapping:0x1949 + }, + { code:0x194A + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x194A + ,simpleLowerCaseMapping:0x194A + ,simpleTitleCaseMapping:0x194A + }, + { code:0x194B + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x194B + ,simpleLowerCaseMapping:0x194B + ,simpleTitleCaseMapping:0x194B + }, + { code:0x194C + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x194C + ,simpleLowerCaseMapping:0x194C + ,simpleTitleCaseMapping:0x194C + }, + { code:0x194D + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x194D + ,simpleLowerCaseMapping:0x194D + ,simpleTitleCaseMapping:0x194D + }, + { code:0x194E + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x194E + ,simpleLowerCaseMapping:0x194E + ,simpleTitleCaseMapping:0x194E + }, + { code:0x194F + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x194F + ,simpleLowerCaseMapping:0x194F + ,simpleTitleCaseMapping:0x194F + }, + { code:0x1950 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1950 + ,simpleLowerCaseMapping:0x1950 + ,simpleTitleCaseMapping:0x1950 + }, + { code:0x1951 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1951 + ,simpleLowerCaseMapping:0x1951 + ,simpleTitleCaseMapping:0x1951 + }, + { code:0x1952 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1952 + ,simpleLowerCaseMapping:0x1952 + ,simpleTitleCaseMapping:0x1952 + }, + { code:0x1953 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1953 + ,simpleLowerCaseMapping:0x1953 + ,simpleTitleCaseMapping:0x1953 + }, + { code:0x1954 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1954 + ,simpleLowerCaseMapping:0x1954 + ,simpleTitleCaseMapping:0x1954 + }, + { code:0x1955 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1955 + ,simpleLowerCaseMapping:0x1955 + ,simpleTitleCaseMapping:0x1955 + }, + { code:0x1956 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1956 + ,simpleLowerCaseMapping:0x1956 + ,simpleTitleCaseMapping:0x1956 + }, + { code:0x1957 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1957 + ,simpleLowerCaseMapping:0x1957 + ,simpleTitleCaseMapping:0x1957 + }, + { code:0x1958 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1958 + ,simpleLowerCaseMapping:0x1958 + ,simpleTitleCaseMapping:0x1958 + }, + { code:0x1959 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1959 + ,simpleLowerCaseMapping:0x1959 + ,simpleTitleCaseMapping:0x1959 + }, + { code:0x195A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x195A + ,simpleLowerCaseMapping:0x195A + ,simpleTitleCaseMapping:0x195A + }, + { code:0x195B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x195B + ,simpleLowerCaseMapping:0x195B + ,simpleTitleCaseMapping:0x195B + }, + { code:0x195C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x195C + ,simpleLowerCaseMapping:0x195C + ,simpleTitleCaseMapping:0x195C + }, + { code:0x195D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x195D + ,simpleLowerCaseMapping:0x195D + ,simpleTitleCaseMapping:0x195D + }, + { code:0x195E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x195E + ,simpleLowerCaseMapping:0x195E + ,simpleTitleCaseMapping:0x195E + }, + { code:0x195F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x195F + ,simpleLowerCaseMapping:0x195F + ,simpleTitleCaseMapping:0x195F + }, + { code:0x1960 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1960 + ,simpleLowerCaseMapping:0x1960 + ,simpleTitleCaseMapping:0x1960 + }, + { code:0x1961 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1961 + ,simpleLowerCaseMapping:0x1961 + ,simpleTitleCaseMapping:0x1961 + }, + { code:0x1962 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1962 + ,simpleLowerCaseMapping:0x1962 + ,simpleTitleCaseMapping:0x1962 + }, + { code:0x1963 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1963 + ,simpleLowerCaseMapping:0x1963 + ,simpleTitleCaseMapping:0x1963 + }, + { code:0x1964 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1964 + ,simpleLowerCaseMapping:0x1964 + ,simpleTitleCaseMapping:0x1964 + }, + { code:0x1965 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1965 + ,simpleLowerCaseMapping:0x1965 + ,simpleTitleCaseMapping:0x1965 + }, + { code:0x1966 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1966 + ,simpleLowerCaseMapping:0x1966 + ,simpleTitleCaseMapping:0x1966 + }, + { code:0x1967 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1967 + ,simpleLowerCaseMapping:0x1967 + ,simpleTitleCaseMapping:0x1967 + }, + { code:0x1968 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1968 + ,simpleLowerCaseMapping:0x1968 + ,simpleTitleCaseMapping:0x1968 + }, + { code:0x1969 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1969 + ,simpleLowerCaseMapping:0x1969 + ,simpleTitleCaseMapping:0x1969 + }, + { code:0x196A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x196A + ,simpleLowerCaseMapping:0x196A + ,simpleTitleCaseMapping:0x196A + }, + { code:0x196B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x196B + ,simpleLowerCaseMapping:0x196B + ,simpleTitleCaseMapping:0x196B + }, + { code:0x196C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x196C + ,simpleLowerCaseMapping:0x196C + ,simpleTitleCaseMapping:0x196C + }, + { code:0x196D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x196D + ,simpleLowerCaseMapping:0x196D + ,simpleTitleCaseMapping:0x196D + }, + { code:0x1970 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1970 + ,simpleLowerCaseMapping:0x1970 + ,simpleTitleCaseMapping:0x1970 + }, + { code:0x1971 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1971 + ,simpleLowerCaseMapping:0x1971 + ,simpleTitleCaseMapping:0x1971 + }, + { code:0x1972 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1972 + ,simpleLowerCaseMapping:0x1972 + ,simpleTitleCaseMapping:0x1972 + }, + { code:0x1973 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1973 + ,simpleLowerCaseMapping:0x1973 + ,simpleTitleCaseMapping:0x1973 + }, + { code:0x1974 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1974 + ,simpleLowerCaseMapping:0x1974 + ,simpleTitleCaseMapping:0x1974 + }, + { code:0x1980 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1980 + ,simpleLowerCaseMapping:0x1980 + ,simpleTitleCaseMapping:0x1980 + }, + { code:0x1981 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1981 + ,simpleLowerCaseMapping:0x1981 + ,simpleTitleCaseMapping:0x1981 + }, + { code:0x1982 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1982 + ,simpleLowerCaseMapping:0x1982 + ,simpleTitleCaseMapping:0x1982 + }, + { code:0x1983 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1983 + ,simpleLowerCaseMapping:0x1983 + ,simpleTitleCaseMapping:0x1983 + }, + { code:0x1984 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1984 + ,simpleLowerCaseMapping:0x1984 + ,simpleTitleCaseMapping:0x1984 + }, + { code:0x1985 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1985 + ,simpleLowerCaseMapping:0x1985 + ,simpleTitleCaseMapping:0x1985 + }, + { code:0x1986 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1986 + ,simpleLowerCaseMapping:0x1986 + ,simpleTitleCaseMapping:0x1986 + }, + { code:0x1987 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1987 + ,simpleLowerCaseMapping:0x1987 + ,simpleTitleCaseMapping:0x1987 + }, + { code:0x1988 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1988 + ,simpleLowerCaseMapping:0x1988 + ,simpleTitleCaseMapping:0x1988 + }, + { code:0x1989 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1989 + ,simpleLowerCaseMapping:0x1989 + ,simpleTitleCaseMapping:0x1989 + }, + { code:0x198A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x198A + ,simpleLowerCaseMapping:0x198A + ,simpleTitleCaseMapping:0x198A + }, + { code:0x198B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x198B + ,simpleLowerCaseMapping:0x198B + ,simpleTitleCaseMapping:0x198B + }, + { code:0x198C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x198C + ,simpleLowerCaseMapping:0x198C + ,simpleTitleCaseMapping:0x198C + }, + { code:0x198D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x198D + ,simpleLowerCaseMapping:0x198D + ,simpleTitleCaseMapping:0x198D + }, + { code:0x198E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x198E + ,simpleLowerCaseMapping:0x198E + ,simpleTitleCaseMapping:0x198E + }, + { code:0x198F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x198F + ,simpleLowerCaseMapping:0x198F + ,simpleTitleCaseMapping:0x198F + }, + { code:0x1990 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1990 + ,simpleLowerCaseMapping:0x1990 + ,simpleTitleCaseMapping:0x1990 + }, + { code:0x1991 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1991 + ,simpleLowerCaseMapping:0x1991 + ,simpleTitleCaseMapping:0x1991 + }, + { code:0x1992 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1992 + ,simpleLowerCaseMapping:0x1992 + ,simpleTitleCaseMapping:0x1992 + }, + { code:0x1993 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1993 + ,simpleLowerCaseMapping:0x1993 + ,simpleTitleCaseMapping:0x1993 + }, + { code:0x1994 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1994 + ,simpleLowerCaseMapping:0x1994 + ,simpleTitleCaseMapping:0x1994 + }, + { code:0x1995 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1995 + ,simpleLowerCaseMapping:0x1995 + ,simpleTitleCaseMapping:0x1995 + }, + { code:0x1996 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1996 + ,simpleLowerCaseMapping:0x1996 + ,simpleTitleCaseMapping:0x1996 + }, + { code:0x1997 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1997 + ,simpleLowerCaseMapping:0x1997 + ,simpleTitleCaseMapping:0x1997 + }, + { code:0x1998 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1998 + ,simpleLowerCaseMapping:0x1998 + ,simpleTitleCaseMapping:0x1998 + }, + { code:0x1999 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1999 + ,simpleLowerCaseMapping:0x1999 + ,simpleTitleCaseMapping:0x1999 + }, + { code:0x199A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x199A + ,simpleLowerCaseMapping:0x199A + ,simpleTitleCaseMapping:0x199A + }, + { code:0x199B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x199B + ,simpleLowerCaseMapping:0x199B + ,simpleTitleCaseMapping:0x199B + }, + { code:0x199C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x199C + ,simpleLowerCaseMapping:0x199C + ,simpleTitleCaseMapping:0x199C + }, + { code:0x199D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x199D + ,simpleLowerCaseMapping:0x199D + ,simpleTitleCaseMapping:0x199D + }, + { code:0x199E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x199E + ,simpleLowerCaseMapping:0x199E + ,simpleTitleCaseMapping:0x199E + }, + { code:0x199F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x199F + ,simpleLowerCaseMapping:0x199F + ,simpleTitleCaseMapping:0x199F + }, + { code:0x19A0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x19A0 + ,simpleLowerCaseMapping:0x19A0 + ,simpleTitleCaseMapping:0x19A0 + }, + { code:0x19A1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x19A1 + ,simpleLowerCaseMapping:0x19A1 + ,simpleTitleCaseMapping:0x19A1 + }, + { code:0x19A2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x19A2 + ,simpleLowerCaseMapping:0x19A2 + ,simpleTitleCaseMapping:0x19A2 + }, + { code:0x19A3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x19A3 + ,simpleLowerCaseMapping:0x19A3 + ,simpleTitleCaseMapping:0x19A3 + }, + { code:0x19A4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x19A4 + ,simpleLowerCaseMapping:0x19A4 + ,simpleTitleCaseMapping:0x19A4 + }, + { code:0x19A5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x19A5 + ,simpleLowerCaseMapping:0x19A5 + ,simpleTitleCaseMapping:0x19A5 + }, + { code:0x19A6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x19A6 + ,simpleLowerCaseMapping:0x19A6 + ,simpleTitleCaseMapping:0x19A6 + }, + { code:0x19A7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x19A7 + ,simpleLowerCaseMapping:0x19A7 + ,simpleTitleCaseMapping:0x19A7 + }, + { code:0x19A8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x19A8 + ,simpleLowerCaseMapping:0x19A8 + ,simpleTitleCaseMapping:0x19A8 + }, + { code:0x19A9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x19A9 + ,simpleLowerCaseMapping:0x19A9 + ,simpleTitleCaseMapping:0x19A9 + }, + { code:0x19B0 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x19B0 + ,simpleLowerCaseMapping:0x19B0 + ,simpleTitleCaseMapping:0x19B0 + }, + { code:0x19B1 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x19B1 + ,simpleLowerCaseMapping:0x19B1 + ,simpleTitleCaseMapping:0x19B1 + }, + { code:0x19B2 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x19B2 + ,simpleLowerCaseMapping:0x19B2 + ,simpleTitleCaseMapping:0x19B2 + }, + { code:0x19B3 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x19B3 + ,simpleLowerCaseMapping:0x19B3 + ,simpleTitleCaseMapping:0x19B3 + }, + { code:0x19B4 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x19B4 + ,simpleLowerCaseMapping:0x19B4 + ,simpleTitleCaseMapping:0x19B4 + }, + { code:0x19B5 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x19B5 + ,simpleLowerCaseMapping:0x19B5 + ,simpleTitleCaseMapping:0x19B5 + }, + { code:0x19B6 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x19B6 + ,simpleLowerCaseMapping:0x19B6 + ,simpleTitleCaseMapping:0x19B6 + }, + { code:0x19B7 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x19B7 + ,simpleLowerCaseMapping:0x19B7 + ,simpleTitleCaseMapping:0x19B7 + }, + { code:0x19B8 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x19B8 + ,simpleLowerCaseMapping:0x19B8 + ,simpleTitleCaseMapping:0x19B8 + }, + { code:0x19B9 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x19B9 + ,simpleLowerCaseMapping:0x19B9 + ,simpleTitleCaseMapping:0x19B9 + }, + { code:0x19BA + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x19BA + ,simpleLowerCaseMapping:0x19BA + ,simpleTitleCaseMapping:0x19BA + }, + { code:0x19BB + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x19BB + ,simpleLowerCaseMapping:0x19BB + ,simpleTitleCaseMapping:0x19BB + }, + { code:0x19BC + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x19BC + ,simpleLowerCaseMapping:0x19BC + ,simpleTitleCaseMapping:0x19BC + }, + { code:0x19BD + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x19BD + ,simpleLowerCaseMapping:0x19BD + ,simpleTitleCaseMapping:0x19BD + }, + { code:0x19BE + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x19BE + ,simpleLowerCaseMapping:0x19BE + ,simpleTitleCaseMapping:0x19BE + }, + { code:0x19BF + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x19BF + ,simpleLowerCaseMapping:0x19BF + ,simpleTitleCaseMapping:0x19BF + }, + { code:0x19C0 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x19C0 + ,simpleLowerCaseMapping:0x19C0 + ,simpleTitleCaseMapping:0x19C0 + }, + { code:0x19C1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x19C1 + ,simpleLowerCaseMapping:0x19C1 + ,simpleTitleCaseMapping:0x19C1 + }, + { code:0x19C2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x19C2 + ,simpleLowerCaseMapping:0x19C2 + ,simpleTitleCaseMapping:0x19C2 + }, + { code:0x19C3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x19C3 + ,simpleLowerCaseMapping:0x19C3 + ,simpleTitleCaseMapping:0x19C3 + }, + { code:0x19C4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x19C4 + ,simpleLowerCaseMapping:0x19C4 + ,simpleTitleCaseMapping:0x19C4 + }, + { code:0x19C5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x19C5 + ,simpleLowerCaseMapping:0x19C5 + ,simpleTitleCaseMapping:0x19C5 + }, + { code:0x19C6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x19C6 + ,simpleLowerCaseMapping:0x19C6 + ,simpleTitleCaseMapping:0x19C6 + }, + { code:0x19C7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x19C7 + ,simpleLowerCaseMapping:0x19C7 + ,simpleTitleCaseMapping:0x19C7 + }, + { code:0x19C8 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x19C8 + ,simpleLowerCaseMapping:0x19C8 + ,simpleTitleCaseMapping:0x19C8 + }, + { code:0x19C9 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x19C9 + ,simpleLowerCaseMapping:0x19C9 + ,simpleTitleCaseMapping:0x19C9 + }, + { code:0x19D0 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x19D0 + ,simpleLowerCaseMapping:0x19D0 + ,simpleTitleCaseMapping:0x19D0 + }, + { code:0x19D1 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x19D1 + ,simpleLowerCaseMapping:0x19D1 + ,simpleTitleCaseMapping:0x19D1 + }, + { code:0x19D2 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x19D2 + ,simpleLowerCaseMapping:0x19D2 + ,simpleTitleCaseMapping:0x19D2 + }, + { code:0x19D3 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x19D3 + ,simpleLowerCaseMapping:0x19D3 + ,simpleTitleCaseMapping:0x19D3 + }, + { code:0x19D4 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x19D4 + ,simpleLowerCaseMapping:0x19D4 + ,simpleTitleCaseMapping:0x19D4 + }, + { code:0x19D5 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x19D5 + ,simpleLowerCaseMapping:0x19D5 + ,simpleTitleCaseMapping:0x19D5 + }, + { code:0x19D6 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x19D6 + ,simpleLowerCaseMapping:0x19D6 + ,simpleTitleCaseMapping:0x19D6 + }, + { code:0x19D7 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x19D7 + ,simpleLowerCaseMapping:0x19D7 + ,simpleTitleCaseMapping:0x19D7 + }, + { code:0x19D8 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x19D8 + ,simpleLowerCaseMapping:0x19D8 + ,simpleTitleCaseMapping:0x19D8 + }, + { code:0x19D9 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x19D9 + ,simpleLowerCaseMapping:0x19D9 + ,simpleTitleCaseMapping:0x19D9 + }, + { code:0x19DE + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x19DE + ,simpleLowerCaseMapping:0x19DE + ,simpleTitleCaseMapping:0x19DE + }, + { code:0x19DF + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x19DF + ,simpleLowerCaseMapping:0x19DF + ,simpleTitleCaseMapping:0x19DF + }, + { code:0x19E0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x19E0 + ,simpleLowerCaseMapping:0x19E0 + ,simpleTitleCaseMapping:0x19E0 + }, + { code:0x19E1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x19E1 + ,simpleLowerCaseMapping:0x19E1 + ,simpleTitleCaseMapping:0x19E1 + }, + { code:0x19E2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x19E2 + ,simpleLowerCaseMapping:0x19E2 + ,simpleTitleCaseMapping:0x19E2 + }, + { code:0x19E3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x19E3 + ,simpleLowerCaseMapping:0x19E3 + ,simpleTitleCaseMapping:0x19E3 + }, + { code:0x19E4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x19E4 + ,simpleLowerCaseMapping:0x19E4 + ,simpleTitleCaseMapping:0x19E4 + }, + { code:0x19E5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x19E5 + ,simpleLowerCaseMapping:0x19E5 + ,simpleTitleCaseMapping:0x19E5 + }, + { code:0x19E6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x19E6 + ,simpleLowerCaseMapping:0x19E6 + ,simpleTitleCaseMapping:0x19E6 + }, + { code:0x19E7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x19E7 + ,simpleLowerCaseMapping:0x19E7 + ,simpleTitleCaseMapping:0x19E7 + }, + { code:0x19E8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x19E8 + ,simpleLowerCaseMapping:0x19E8 + ,simpleTitleCaseMapping:0x19E8 + }, + { code:0x19E9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x19E9 + ,simpleLowerCaseMapping:0x19E9 + ,simpleTitleCaseMapping:0x19E9 + }, + { code:0x19EA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x19EA + ,simpleLowerCaseMapping:0x19EA + ,simpleTitleCaseMapping:0x19EA + }, + { code:0x19EB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x19EB + ,simpleLowerCaseMapping:0x19EB + ,simpleTitleCaseMapping:0x19EB + }, + { code:0x19EC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x19EC + ,simpleLowerCaseMapping:0x19EC + ,simpleTitleCaseMapping:0x19EC + }, + { code:0x19ED + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x19ED + ,simpleLowerCaseMapping:0x19ED + ,simpleTitleCaseMapping:0x19ED + }, + { code:0x19EE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x19EE + ,simpleLowerCaseMapping:0x19EE + ,simpleTitleCaseMapping:0x19EE + }, + { code:0x19EF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x19EF + ,simpleLowerCaseMapping:0x19EF + ,simpleTitleCaseMapping:0x19EF + }, + { code:0x19F0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x19F0 + ,simpleLowerCaseMapping:0x19F0 + ,simpleTitleCaseMapping:0x19F0 + }, + { code:0x19F1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x19F1 + ,simpleLowerCaseMapping:0x19F1 + ,simpleTitleCaseMapping:0x19F1 + }, + { code:0x19F2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x19F2 + ,simpleLowerCaseMapping:0x19F2 + ,simpleTitleCaseMapping:0x19F2 + }, + { code:0x19F3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x19F3 + ,simpleLowerCaseMapping:0x19F3 + ,simpleTitleCaseMapping:0x19F3 + }, + { code:0x19F4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x19F4 + ,simpleLowerCaseMapping:0x19F4 + ,simpleTitleCaseMapping:0x19F4 + }, + { code:0x19F5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x19F5 + ,simpleLowerCaseMapping:0x19F5 + ,simpleTitleCaseMapping:0x19F5 + }, + { code:0x19F6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x19F6 + ,simpleLowerCaseMapping:0x19F6 + ,simpleTitleCaseMapping:0x19F6 + }, + { code:0x19F7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x19F7 + ,simpleLowerCaseMapping:0x19F7 + ,simpleTitleCaseMapping:0x19F7 + }, + { code:0x19F8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x19F8 + ,simpleLowerCaseMapping:0x19F8 + ,simpleTitleCaseMapping:0x19F8 + }, + { code:0x19F9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x19F9 + ,simpleLowerCaseMapping:0x19F9 + ,simpleTitleCaseMapping:0x19F9 + }, + { code:0x19FA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x19FA + ,simpleLowerCaseMapping:0x19FA + ,simpleTitleCaseMapping:0x19FA + }, + { code:0x19FB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x19FB + ,simpleLowerCaseMapping:0x19FB + ,simpleTitleCaseMapping:0x19FB + }, + { code:0x19FC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x19FC + ,simpleLowerCaseMapping:0x19FC + ,simpleTitleCaseMapping:0x19FC + }, + { code:0x19FD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x19FD + ,simpleLowerCaseMapping:0x19FD + ,simpleTitleCaseMapping:0x19FD + }, + { code:0x19FE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x19FE + ,simpleLowerCaseMapping:0x19FE + ,simpleTitleCaseMapping:0x19FE + }, + { code:0x19FF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x19FF + ,simpleLowerCaseMapping:0x19FF + ,simpleTitleCaseMapping:0x19FF + }, + { code:0x1A00 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1A00 + ,simpleLowerCaseMapping:0x1A00 + ,simpleTitleCaseMapping:0x1A00 + }, + { code:0x1A01 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1A01 + ,simpleLowerCaseMapping:0x1A01 + ,simpleTitleCaseMapping:0x1A01 + }, + { code:0x1A02 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1A02 + ,simpleLowerCaseMapping:0x1A02 + ,simpleTitleCaseMapping:0x1A02 + }, + { code:0x1A03 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1A03 + ,simpleLowerCaseMapping:0x1A03 + ,simpleTitleCaseMapping:0x1A03 + }, + { code:0x1A04 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1A04 + ,simpleLowerCaseMapping:0x1A04 + ,simpleTitleCaseMapping:0x1A04 + }, + { code:0x1A05 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1A05 + ,simpleLowerCaseMapping:0x1A05 + ,simpleTitleCaseMapping:0x1A05 + }, + { code:0x1A06 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1A06 + ,simpleLowerCaseMapping:0x1A06 + ,simpleTitleCaseMapping:0x1A06 + }, + { code:0x1A07 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1A07 + ,simpleLowerCaseMapping:0x1A07 + ,simpleTitleCaseMapping:0x1A07 + }, + { code:0x1A08 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1A08 + ,simpleLowerCaseMapping:0x1A08 + ,simpleTitleCaseMapping:0x1A08 + }, + { code:0x1A09 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1A09 + ,simpleLowerCaseMapping:0x1A09 + ,simpleTitleCaseMapping:0x1A09 + }, + { code:0x1A0A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1A0A + ,simpleLowerCaseMapping:0x1A0A + ,simpleTitleCaseMapping:0x1A0A + }, + { code:0x1A0B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1A0B + ,simpleLowerCaseMapping:0x1A0B + ,simpleTitleCaseMapping:0x1A0B + }, + { code:0x1A0C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1A0C + ,simpleLowerCaseMapping:0x1A0C + ,simpleTitleCaseMapping:0x1A0C + }, + { code:0x1A0D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1A0D + ,simpleLowerCaseMapping:0x1A0D + ,simpleTitleCaseMapping:0x1A0D + }, + { code:0x1A0E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1A0E + ,simpleLowerCaseMapping:0x1A0E + ,simpleTitleCaseMapping:0x1A0E + }, + { code:0x1A0F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1A0F + ,simpleLowerCaseMapping:0x1A0F + ,simpleTitleCaseMapping:0x1A0F + }, + { code:0x1A10 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1A10 + ,simpleLowerCaseMapping:0x1A10 + ,simpleTitleCaseMapping:0x1A10 + }, + { code:0x1A11 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1A11 + ,simpleLowerCaseMapping:0x1A11 + ,simpleTitleCaseMapping:0x1A11 + }, + { code:0x1A12 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1A12 + ,simpleLowerCaseMapping:0x1A12 + ,simpleTitleCaseMapping:0x1A12 + }, + { code:0x1A13 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1A13 + ,simpleLowerCaseMapping:0x1A13 + ,simpleTitleCaseMapping:0x1A13 + }, + { code:0x1A14 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1A14 + ,simpleLowerCaseMapping:0x1A14 + ,simpleTitleCaseMapping:0x1A14 + }, + { code:0x1A15 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1A15 + ,simpleLowerCaseMapping:0x1A15 + ,simpleTitleCaseMapping:0x1A15 + }, + { code:0x1A16 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1A16 + ,simpleLowerCaseMapping:0x1A16 + ,simpleTitleCaseMapping:0x1A16 + }, + { code:0x1A17 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1A17 + ,simpleLowerCaseMapping:0x1A17 + ,simpleTitleCaseMapping:0x1A17 + }, + { code:0x1A18 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1A18 + ,simpleLowerCaseMapping:0x1A18 + ,simpleTitleCaseMapping:0x1A18 + }, + { code:0x1A19 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1A19 + ,simpleLowerCaseMapping:0x1A19 + ,simpleTitleCaseMapping:0x1A19 + }, + { code:0x1A1A + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1A1A + ,simpleLowerCaseMapping:0x1A1A + ,simpleTitleCaseMapping:0x1A1A + }, + { code:0x1A1B + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1A1B + ,simpleLowerCaseMapping:0x1A1B + ,simpleTitleCaseMapping:0x1A1B + }, + { code:0x1A1E + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x1A1E + ,simpleLowerCaseMapping:0x1A1E + ,simpleTitleCaseMapping:0x1A1E + }, + { code:0x1A1F + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x1A1F + ,simpleLowerCaseMapping:0x1A1F + ,simpleTitleCaseMapping:0x1A1F + }, + { code:0x1B00 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1B00 + ,simpleLowerCaseMapping:0x1B00 + ,simpleTitleCaseMapping:0x1B00 + }, + { code:0x1B01 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1B01 + ,simpleLowerCaseMapping:0x1B01 + ,simpleTitleCaseMapping:0x1B01 + }, + { code:0x1B02 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1B02 + ,simpleLowerCaseMapping:0x1B02 + ,simpleTitleCaseMapping:0x1B02 + }, + { code:0x1B03 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1B03 + ,simpleLowerCaseMapping:0x1B03 + ,simpleTitleCaseMapping:0x1B03 + }, + { code:0x1B04 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1B04 + ,simpleLowerCaseMapping:0x1B04 + ,simpleTitleCaseMapping:0x1B04 + }, + { code:0x1B05 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B05 + ,simpleLowerCaseMapping:0x1B05 + ,simpleTitleCaseMapping:0x1B05 + }, + { code:0x1B06 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B06 + ,simpleLowerCaseMapping:0x1B06 + ,simpleTitleCaseMapping:0x1B06 + }, + { code:0x1B07 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B07 + ,simpleLowerCaseMapping:0x1B07 + ,simpleTitleCaseMapping:0x1B07 + }, + { code:0x1B08 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B08 + ,simpleLowerCaseMapping:0x1B08 + ,simpleTitleCaseMapping:0x1B08 + }, + { code:0x1B09 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B09 + ,simpleLowerCaseMapping:0x1B09 + ,simpleTitleCaseMapping:0x1B09 + }, + { code:0x1B0A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B0A + ,simpleLowerCaseMapping:0x1B0A + ,simpleTitleCaseMapping:0x1B0A + }, + { code:0x1B0B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B0B + ,simpleLowerCaseMapping:0x1B0B + ,simpleTitleCaseMapping:0x1B0B + }, + { code:0x1B0C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B0C + ,simpleLowerCaseMapping:0x1B0C + ,simpleTitleCaseMapping:0x1B0C + }, + { code:0x1B0D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B0D + ,simpleLowerCaseMapping:0x1B0D + ,simpleTitleCaseMapping:0x1B0D + }, + { code:0x1B0E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B0E + ,simpleLowerCaseMapping:0x1B0E + ,simpleTitleCaseMapping:0x1B0E + }, + { code:0x1B0F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B0F + ,simpleLowerCaseMapping:0x1B0F + ,simpleTitleCaseMapping:0x1B0F + }, + { code:0x1B10 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B10 + ,simpleLowerCaseMapping:0x1B10 + ,simpleTitleCaseMapping:0x1B10 + }, + { code:0x1B11 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B11 + ,simpleLowerCaseMapping:0x1B11 + ,simpleTitleCaseMapping:0x1B11 + }, + { code:0x1B12 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B12 + ,simpleLowerCaseMapping:0x1B12 + ,simpleTitleCaseMapping:0x1B12 + }, + { code:0x1B13 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B13 + ,simpleLowerCaseMapping:0x1B13 + ,simpleTitleCaseMapping:0x1B13 + }, + { code:0x1B14 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B14 + ,simpleLowerCaseMapping:0x1B14 + ,simpleTitleCaseMapping:0x1B14 + }, + { code:0x1B15 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B15 + ,simpleLowerCaseMapping:0x1B15 + ,simpleTitleCaseMapping:0x1B15 + }, + { code:0x1B16 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B16 + ,simpleLowerCaseMapping:0x1B16 + ,simpleTitleCaseMapping:0x1B16 + }, + { code:0x1B17 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B17 + ,simpleLowerCaseMapping:0x1B17 + ,simpleTitleCaseMapping:0x1B17 + }, + { code:0x1B18 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B18 + ,simpleLowerCaseMapping:0x1B18 + ,simpleTitleCaseMapping:0x1B18 + }, + { code:0x1B19 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B19 + ,simpleLowerCaseMapping:0x1B19 + ,simpleTitleCaseMapping:0x1B19 + }, + { code:0x1B1A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B1A + ,simpleLowerCaseMapping:0x1B1A + ,simpleTitleCaseMapping:0x1B1A + }, + { code:0x1B1B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B1B + ,simpleLowerCaseMapping:0x1B1B + ,simpleTitleCaseMapping:0x1B1B + }, + { code:0x1B1C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B1C + ,simpleLowerCaseMapping:0x1B1C + ,simpleTitleCaseMapping:0x1B1C + }, + { code:0x1B1D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B1D + ,simpleLowerCaseMapping:0x1B1D + ,simpleTitleCaseMapping:0x1B1D + }, + { code:0x1B1E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B1E + ,simpleLowerCaseMapping:0x1B1E + ,simpleTitleCaseMapping:0x1B1E + }, + { code:0x1B1F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B1F + ,simpleLowerCaseMapping:0x1B1F + ,simpleTitleCaseMapping:0x1B1F + }, + { code:0x1B20 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B20 + ,simpleLowerCaseMapping:0x1B20 + ,simpleTitleCaseMapping:0x1B20 + }, + { code:0x1B21 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B21 + ,simpleLowerCaseMapping:0x1B21 + ,simpleTitleCaseMapping:0x1B21 + }, + { code:0x1B22 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B22 + ,simpleLowerCaseMapping:0x1B22 + ,simpleTitleCaseMapping:0x1B22 + }, + { code:0x1B23 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B23 + ,simpleLowerCaseMapping:0x1B23 + ,simpleTitleCaseMapping:0x1B23 + }, + { code:0x1B24 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B24 + ,simpleLowerCaseMapping:0x1B24 + ,simpleTitleCaseMapping:0x1B24 + }, + { code:0x1B25 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B25 + ,simpleLowerCaseMapping:0x1B25 + ,simpleTitleCaseMapping:0x1B25 + }, + { code:0x1B26 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B26 + ,simpleLowerCaseMapping:0x1B26 + ,simpleTitleCaseMapping:0x1B26 + }, + { code:0x1B27 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B27 + ,simpleLowerCaseMapping:0x1B27 + ,simpleTitleCaseMapping:0x1B27 + }, + { code:0x1B28 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B28 + ,simpleLowerCaseMapping:0x1B28 + ,simpleTitleCaseMapping:0x1B28 + }, + { code:0x1B29 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B29 + ,simpleLowerCaseMapping:0x1B29 + ,simpleTitleCaseMapping:0x1B29 + }, + { code:0x1B2A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B2A + ,simpleLowerCaseMapping:0x1B2A + ,simpleTitleCaseMapping:0x1B2A + }, + { code:0x1B2B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B2B + ,simpleLowerCaseMapping:0x1B2B + ,simpleTitleCaseMapping:0x1B2B + }, + { code:0x1B2C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B2C + ,simpleLowerCaseMapping:0x1B2C + ,simpleTitleCaseMapping:0x1B2C + }, + { code:0x1B2D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B2D + ,simpleLowerCaseMapping:0x1B2D + ,simpleTitleCaseMapping:0x1B2D + }, + { code:0x1B2E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B2E + ,simpleLowerCaseMapping:0x1B2E + ,simpleTitleCaseMapping:0x1B2E + }, + { code:0x1B2F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B2F + ,simpleLowerCaseMapping:0x1B2F + ,simpleTitleCaseMapping:0x1B2F + }, + { code:0x1B30 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B30 + ,simpleLowerCaseMapping:0x1B30 + ,simpleTitleCaseMapping:0x1B30 + }, + { code:0x1B31 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B31 + ,simpleLowerCaseMapping:0x1B31 + ,simpleTitleCaseMapping:0x1B31 + }, + { code:0x1B32 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B32 + ,simpleLowerCaseMapping:0x1B32 + ,simpleTitleCaseMapping:0x1B32 + }, + { code:0x1B33 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B33 + ,simpleLowerCaseMapping:0x1B33 + ,simpleTitleCaseMapping:0x1B33 + }, + { code:0x1B34 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1B34 + ,simpleLowerCaseMapping:0x1B34 + ,simpleTitleCaseMapping:0x1B34 + }, + { code:0x1B35 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1B35 + ,simpleLowerCaseMapping:0x1B35 + ,simpleTitleCaseMapping:0x1B35 + }, + { code:0x1B36 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1B36 + ,simpleLowerCaseMapping:0x1B36 + ,simpleTitleCaseMapping:0x1B36 + }, + { code:0x1B37 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1B37 + ,simpleLowerCaseMapping:0x1B37 + ,simpleTitleCaseMapping:0x1B37 + }, + { code:0x1B38 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1B38 + ,simpleLowerCaseMapping:0x1B38 + ,simpleTitleCaseMapping:0x1B38 + }, + { code:0x1B39 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1B39 + ,simpleLowerCaseMapping:0x1B39 + ,simpleTitleCaseMapping:0x1B39 + }, + { code:0x1B3A + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1B3A + ,simpleLowerCaseMapping:0x1B3A + ,simpleTitleCaseMapping:0x1B3A + }, + { code:0x1B3B + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1B3B + ,simpleLowerCaseMapping:0x1B3B + ,simpleTitleCaseMapping:0x1B3B + }, + { code:0x1B3C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1B3C + ,simpleLowerCaseMapping:0x1B3C + ,simpleTitleCaseMapping:0x1B3C + }, + { code:0x1B3D + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1B3D + ,simpleLowerCaseMapping:0x1B3D + ,simpleTitleCaseMapping:0x1B3D + }, + { code:0x1B3E + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1B3E + ,simpleLowerCaseMapping:0x1B3E + ,simpleTitleCaseMapping:0x1B3E + }, + { code:0x1B3F + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1B3F + ,simpleLowerCaseMapping:0x1B3F + ,simpleTitleCaseMapping:0x1B3F + }, + { code:0x1B40 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1B40 + ,simpleLowerCaseMapping:0x1B40 + ,simpleTitleCaseMapping:0x1B40 + }, + { code:0x1B41 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1B41 + ,simpleLowerCaseMapping:0x1B41 + ,simpleTitleCaseMapping:0x1B41 + }, + { code:0x1B42 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1B42 + ,simpleLowerCaseMapping:0x1B42 + ,simpleTitleCaseMapping:0x1B42 + }, + { code:0x1B43 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1B43 + ,simpleLowerCaseMapping:0x1B43 + ,simpleTitleCaseMapping:0x1B43 + }, + { code:0x1B44 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1B44 + ,simpleLowerCaseMapping:0x1B44 + ,simpleTitleCaseMapping:0x1B44 + }, + { code:0x1B45 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B45 + ,simpleLowerCaseMapping:0x1B45 + ,simpleTitleCaseMapping:0x1B45 + }, + { code:0x1B46 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B46 + ,simpleLowerCaseMapping:0x1B46 + ,simpleTitleCaseMapping:0x1B46 + }, + { code:0x1B47 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B47 + ,simpleLowerCaseMapping:0x1B47 + ,simpleTitleCaseMapping:0x1B47 + }, + { code:0x1B48 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B48 + ,simpleLowerCaseMapping:0x1B48 + ,simpleTitleCaseMapping:0x1B48 + }, + { code:0x1B49 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B49 + ,simpleLowerCaseMapping:0x1B49 + ,simpleTitleCaseMapping:0x1B49 + }, + { code:0x1B4A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B4A + ,simpleLowerCaseMapping:0x1B4A + ,simpleTitleCaseMapping:0x1B4A + }, + { code:0x1B4B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1B4B + ,simpleLowerCaseMapping:0x1B4B + ,simpleTitleCaseMapping:0x1B4B + }, + { code:0x1B50 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1B50 + ,simpleLowerCaseMapping:0x1B50 + ,simpleTitleCaseMapping:0x1B50 + }, + { code:0x1B51 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1B51 + ,simpleLowerCaseMapping:0x1B51 + ,simpleTitleCaseMapping:0x1B51 + }, + { code:0x1B52 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1B52 + ,simpleLowerCaseMapping:0x1B52 + ,simpleTitleCaseMapping:0x1B52 + }, + { code:0x1B53 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1B53 + ,simpleLowerCaseMapping:0x1B53 + ,simpleTitleCaseMapping:0x1B53 + }, + { code:0x1B54 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1B54 + ,simpleLowerCaseMapping:0x1B54 + ,simpleTitleCaseMapping:0x1B54 + }, + { code:0x1B55 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1B55 + ,simpleLowerCaseMapping:0x1B55 + ,simpleTitleCaseMapping:0x1B55 + }, + { code:0x1B56 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1B56 + ,simpleLowerCaseMapping:0x1B56 + ,simpleTitleCaseMapping:0x1B56 + }, + { code:0x1B57 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1B57 + ,simpleLowerCaseMapping:0x1B57 + ,simpleTitleCaseMapping:0x1B57 + }, + { code:0x1B58 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1B58 + ,simpleLowerCaseMapping:0x1B58 + ,simpleTitleCaseMapping:0x1B58 + }, + { code:0x1B59 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1B59 + ,simpleLowerCaseMapping:0x1B59 + ,simpleTitleCaseMapping:0x1B59 + }, + { code:0x1B5A + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x1B5A + ,simpleLowerCaseMapping:0x1B5A + ,simpleTitleCaseMapping:0x1B5A + }, + { code:0x1B5B + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x1B5B + ,simpleLowerCaseMapping:0x1B5B + ,simpleTitleCaseMapping:0x1B5B + }, + { code:0x1B5C + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x1B5C + ,simpleLowerCaseMapping:0x1B5C + ,simpleTitleCaseMapping:0x1B5C + }, + { code:0x1B5D + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x1B5D + ,simpleLowerCaseMapping:0x1B5D + ,simpleTitleCaseMapping:0x1B5D + }, + { code:0x1B5E + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x1B5E + ,simpleLowerCaseMapping:0x1B5E + ,simpleTitleCaseMapping:0x1B5E + }, + { code:0x1B5F + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x1B5F + ,simpleLowerCaseMapping:0x1B5F + ,simpleTitleCaseMapping:0x1B5F + }, + { code:0x1B60 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x1B60 + ,simpleLowerCaseMapping:0x1B60 + ,simpleTitleCaseMapping:0x1B60 + }, + { code:0x1B61 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1B61 + ,simpleLowerCaseMapping:0x1B61 + ,simpleTitleCaseMapping:0x1B61 + }, + { code:0x1B62 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1B62 + ,simpleLowerCaseMapping:0x1B62 + ,simpleTitleCaseMapping:0x1B62 + }, + { code:0x1B63 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1B63 + ,simpleLowerCaseMapping:0x1B63 + ,simpleTitleCaseMapping:0x1B63 + }, + { code:0x1B64 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1B64 + ,simpleLowerCaseMapping:0x1B64 + ,simpleTitleCaseMapping:0x1B64 + }, + { code:0x1B65 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1B65 + ,simpleLowerCaseMapping:0x1B65 + ,simpleTitleCaseMapping:0x1B65 + }, + { code:0x1B66 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1B66 + ,simpleLowerCaseMapping:0x1B66 + ,simpleTitleCaseMapping:0x1B66 + }, + { code:0x1B67 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1B67 + ,simpleLowerCaseMapping:0x1B67 + ,simpleTitleCaseMapping:0x1B67 + }, + { code:0x1B68 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1B68 + ,simpleLowerCaseMapping:0x1B68 + ,simpleTitleCaseMapping:0x1B68 + }, + { code:0x1B69 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1B69 + ,simpleLowerCaseMapping:0x1B69 + ,simpleTitleCaseMapping:0x1B69 + }, + { code:0x1B6A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1B6A + ,simpleLowerCaseMapping:0x1B6A + ,simpleTitleCaseMapping:0x1B6A + }, + { code:0x1B6B + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1B6B + ,simpleLowerCaseMapping:0x1B6B + ,simpleTitleCaseMapping:0x1B6B + }, + { code:0x1B6C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1B6C + ,simpleLowerCaseMapping:0x1B6C + ,simpleTitleCaseMapping:0x1B6C + }, + { code:0x1B6D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1B6D + ,simpleLowerCaseMapping:0x1B6D + ,simpleTitleCaseMapping:0x1B6D + }, + { code:0x1B6E + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1B6E + ,simpleLowerCaseMapping:0x1B6E + ,simpleTitleCaseMapping:0x1B6E + }, + { code:0x1B6F + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1B6F + ,simpleLowerCaseMapping:0x1B6F + ,simpleTitleCaseMapping:0x1B6F + }, + { code:0x1B70 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1B70 + ,simpleLowerCaseMapping:0x1B70 + ,simpleTitleCaseMapping:0x1B70 + }, + { code:0x1B71 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1B71 + ,simpleLowerCaseMapping:0x1B71 + ,simpleTitleCaseMapping:0x1B71 + }, + { code:0x1B72 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1B72 + ,simpleLowerCaseMapping:0x1B72 + ,simpleTitleCaseMapping:0x1B72 + }, + { code:0x1B73 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1B73 + ,simpleLowerCaseMapping:0x1B73 + ,simpleTitleCaseMapping:0x1B73 + }, + { code:0x1B74 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1B74 + ,simpleLowerCaseMapping:0x1B74 + ,simpleTitleCaseMapping:0x1B74 + }, + { code:0x1B75 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1B75 + ,simpleLowerCaseMapping:0x1B75 + ,simpleTitleCaseMapping:0x1B75 + }, + { code:0x1B76 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1B76 + ,simpleLowerCaseMapping:0x1B76 + ,simpleTitleCaseMapping:0x1B76 + }, + { code:0x1B77 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1B77 + ,simpleLowerCaseMapping:0x1B77 + ,simpleTitleCaseMapping:0x1B77 + }, + { code:0x1B78 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1B78 + ,simpleLowerCaseMapping:0x1B78 + ,simpleTitleCaseMapping:0x1B78 + }, + { code:0x1B79 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1B79 + ,simpleLowerCaseMapping:0x1B79 + ,simpleTitleCaseMapping:0x1B79 + }, + { code:0x1B7A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1B7A + ,simpleLowerCaseMapping:0x1B7A + ,simpleTitleCaseMapping:0x1B7A + }, + { code:0x1B7B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1B7B + ,simpleLowerCaseMapping:0x1B7B + ,simpleTitleCaseMapping:0x1B7B + }, + { code:0x1B7C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1B7C + ,simpleLowerCaseMapping:0x1B7C + ,simpleTitleCaseMapping:0x1B7C + }, + { code:0x1D00 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D00 + ,simpleLowerCaseMapping:0x1D00 + ,simpleTitleCaseMapping:0x1D00 + }, + { code:0x1D01 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D01 + ,simpleLowerCaseMapping:0x1D01 + ,simpleTitleCaseMapping:0x1D01 + }, + { code:0x1D02 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D02 + ,simpleLowerCaseMapping:0x1D02 + ,simpleTitleCaseMapping:0x1D02 + }, + { code:0x1D03 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D03 + ,simpleLowerCaseMapping:0x1D03 + ,simpleTitleCaseMapping:0x1D03 + }, + { code:0x1D04 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D04 + ,simpleLowerCaseMapping:0x1D04 + ,simpleTitleCaseMapping:0x1D04 + }, + { code:0x1D05 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D05 + ,simpleLowerCaseMapping:0x1D05 + ,simpleTitleCaseMapping:0x1D05 + }, + { code:0x1D06 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D06 + ,simpleLowerCaseMapping:0x1D06 + ,simpleTitleCaseMapping:0x1D06 + }, + { code:0x1D07 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D07 + ,simpleLowerCaseMapping:0x1D07 + ,simpleTitleCaseMapping:0x1D07 + }, + { code:0x1D08 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D08 + ,simpleLowerCaseMapping:0x1D08 + ,simpleTitleCaseMapping:0x1D08 + }, + { code:0x1D09 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D09 + ,simpleLowerCaseMapping:0x1D09 + ,simpleTitleCaseMapping:0x1D09 + }, + { code:0x1D0A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D0A + ,simpleLowerCaseMapping:0x1D0A + ,simpleTitleCaseMapping:0x1D0A + }, + { code:0x1D0B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D0B + ,simpleLowerCaseMapping:0x1D0B + ,simpleTitleCaseMapping:0x1D0B + }, + { code:0x1D0C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D0C + ,simpleLowerCaseMapping:0x1D0C + ,simpleTitleCaseMapping:0x1D0C + }, + { code:0x1D0D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D0D + ,simpleLowerCaseMapping:0x1D0D + ,simpleTitleCaseMapping:0x1D0D + }, + { code:0x1D0E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D0E + ,simpleLowerCaseMapping:0x1D0E + ,simpleTitleCaseMapping:0x1D0E + }, + { code:0x1D0F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D0F + ,simpleLowerCaseMapping:0x1D0F + ,simpleTitleCaseMapping:0x1D0F + }, + { code:0x1D10 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D10 + ,simpleLowerCaseMapping:0x1D10 + ,simpleTitleCaseMapping:0x1D10 + }, + { code:0x1D11 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D11 + ,simpleLowerCaseMapping:0x1D11 + ,simpleTitleCaseMapping:0x1D11 + }, + { code:0x1D12 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D12 + ,simpleLowerCaseMapping:0x1D12 + ,simpleTitleCaseMapping:0x1D12 + }, + { code:0x1D13 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D13 + ,simpleLowerCaseMapping:0x1D13 + ,simpleTitleCaseMapping:0x1D13 + }, + { code:0x1D14 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D14 + ,simpleLowerCaseMapping:0x1D14 + ,simpleTitleCaseMapping:0x1D14 + }, + { code:0x1D15 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D15 + ,simpleLowerCaseMapping:0x1D15 + ,simpleTitleCaseMapping:0x1D15 + }, + { code:0x1D16 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D16 + ,simpleLowerCaseMapping:0x1D16 + ,simpleTitleCaseMapping:0x1D16 + }, + { code:0x1D17 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D17 + ,simpleLowerCaseMapping:0x1D17 + ,simpleTitleCaseMapping:0x1D17 + }, + { code:0x1D18 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D18 + ,simpleLowerCaseMapping:0x1D18 + ,simpleTitleCaseMapping:0x1D18 + }, + { code:0x1D19 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D19 + ,simpleLowerCaseMapping:0x1D19 + ,simpleTitleCaseMapping:0x1D19 + }, + { code:0x1D1A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D1A + ,simpleLowerCaseMapping:0x1D1A + ,simpleTitleCaseMapping:0x1D1A + }, + { code:0x1D1B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D1B + ,simpleLowerCaseMapping:0x1D1B + ,simpleTitleCaseMapping:0x1D1B + }, + { code:0x1D1C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D1C + ,simpleLowerCaseMapping:0x1D1C + ,simpleTitleCaseMapping:0x1D1C + }, + { code:0x1D1D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D1D + ,simpleLowerCaseMapping:0x1D1D + ,simpleTitleCaseMapping:0x1D1D + }, + { code:0x1D1E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D1E + ,simpleLowerCaseMapping:0x1D1E + ,simpleTitleCaseMapping:0x1D1E + }, + { code:0x1D1F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D1F + ,simpleLowerCaseMapping:0x1D1F + ,simpleTitleCaseMapping:0x1D1F + }, + { code:0x1D20 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D20 + ,simpleLowerCaseMapping:0x1D20 + ,simpleTitleCaseMapping:0x1D20 + }, + { code:0x1D21 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D21 + ,simpleLowerCaseMapping:0x1D21 + ,simpleTitleCaseMapping:0x1D21 + }, + { code:0x1D22 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D22 + ,simpleLowerCaseMapping:0x1D22 + ,simpleTitleCaseMapping:0x1D22 + }, + { code:0x1D23 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D23 + ,simpleLowerCaseMapping:0x1D23 + ,simpleTitleCaseMapping:0x1D23 + }, + { code:0x1D24 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D24 + ,simpleLowerCaseMapping:0x1D24 + ,simpleTitleCaseMapping:0x1D24 + }, + { code:0x1D25 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D25 + ,simpleLowerCaseMapping:0x1D25 + ,simpleTitleCaseMapping:0x1D25 + }, + { code:0x1D26 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D26 + ,simpleLowerCaseMapping:0x1D26 + ,simpleTitleCaseMapping:0x1D26 + }, + { code:0x1D27 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D27 + ,simpleLowerCaseMapping:0x1D27 + ,simpleTitleCaseMapping:0x1D27 + }, + { code:0x1D28 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D28 + ,simpleLowerCaseMapping:0x1D28 + ,simpleTitleCaseMapping:0x1D28 + }, + { code:0x1D29 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D29 + ,simpleLowerCaseMapping:0x1D29 + ,simpleTitleCaseMapping:0x1D29 + }, + { code:0x1D2A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D2A + ,simpleLowerCaseMapping:0x1D2A + ,simpleTitleCaseMapping:0x1D2A + }, + { code:0x1D2B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D2B + ,simpleLowerCaseMapping:0x1D2B + ,simpleTitleCaseMapping:0x1D2B + }, + { code:0x1D2C + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D2C + ,simpleLowerCaseMapping:0x1D2C + ,simpleTitleCaseMapping:0x1D2C + }, + { code:0x1D2D + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D2D + ,simpleLowerCaseMapping:0x1D2D + ,simpleTitleCaseMapping:0x1D2D + }, + { code:0x1D2E + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D2E + ,simpleLowerCaseMapping:0x1D2E + ,simpleTitleCaseMapping:0x1D2E + }, + { code:0x1D2F + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D2F + ,simpleLowerCaseMapping:0x1D2F + ,simpleTitleCaseMapping:0x1D2F + }, + { code:0x1D30 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D30 + ,simpleLowerCaseMapping:0x1D30 + ,simpleTitleCaseMapping:0x1D30 + }, + { code:0x1D31 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D31 + ,simpleLowerCaseMapping:0x1D31 + ,simpleTitleCaseMapping:0x1D31 + }, + { code:0x1D32 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D32 + ,simpleLowerCaseMapping:0x1D32 + ,simpleTitleCaseMapping:0x1D32 + }, + { code:0x1D33 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D33 + ,simpleLowerCaseMapping:0x1D33 + ,simpleTitleCaseMapping:0x1D33 + }, + { code:0x1D34 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D34 + ,simpleLowerCaseMapping:0x1D34 + ,simpleTitleCaseMapping:0x1D34 + }, + { code:0x1D35 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D35 + ,simpleLowerCaseMapping:0x1D35 + ,simpleTitleCaseMapping:0x1D35 + }, + { code:0x1D36 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D36 + ,simpleLowerCaseMapping:0x1D36 + ,simpleTitleCaseMapping:0x1D36 + }, + { code:0x1D37 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D37 + ,simpleLowerCaseMapping:0x1D37 + ,simpleTitleCaseMapping:0x1D37 + }, + { code:0x1D38 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D38 + ,simpleLowerCaseMapping:0x1D38 + ,simpleTitleCaseMapping:0x1D38 + }, + { code:0x1D39 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D39 + ,simpleLowerCaseMapping:0x1D39 + ,simpleTitleCaseMapping:0x1D39 + }, + { code:0x1D3A + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D3A + ,simpleLowerCaseMapping:0x1D3A + ,simpleTitleCaseMapping:0x1D3A + }, + { code:0x1D3B + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D3B + ,simpleLowerCaseMapping:0x1D3B + ,simpleTitleCaseMapping:0x1D3B + }, + { code:0x1D3C + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D3C + ,simpleLowerCaseMapping:0x1D3C + ,simpleTitleCaseMapping:0x1D3C + }, + { code:0x1D3D + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D3D + ,simpleLowerCaseMapping:0x1D3D + ,simpleTitleCaseMapping:0x1D3D + }, + { code:0x1D3E + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D3E + ,simpleLowerCaseMapping:0x1D3E + ,simpleTitleCaseMapping:0x1D3E + }, + { code:0x1D3F + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D3F + ,simpleLowerCaseMapping:0x1D3F + ,simpleTitleCaseMapping:0x1D3F + }, + { code:0x1D40 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D40 + ,simpleLowerCaseMapping:0x1D40 + ,simpleTitleCaseMapping:0x1D40 + }, + { code:0x1D41 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D41 + ,simpleLowerCaseMapping:0x1D41 + ,simpleTitleCaseMapping:0x1D41 + }, + { code:0x1D42 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D42 + ,simpleLowerCaseMapping:0x1D42 + ,simpleTitleCaseMapping:0x1D42 + }, + { code:0x1D43 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D43 + ,simpleLowerCaseMapping:0x1D43 + ,simpleTitleCaseMapping:0x1D43 + }, + { code:0x1D44 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D44 + ,simpleLowerCaseMapping:0x1D44 + ,simpleTitleCaseMapping:0x1D44 + }, + { code:0x1D45 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D45 + ,simpleLowerCaseMapping:0x1D45 + ,simpleTitleCaseMapping:0x1D45 + }, + { code:0x1D46 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D46 + ,simpleLowerCaseMapping:0x1D46 + ,simpleTitleCaseMapping:0x1D46 + }, + { code:0x1D47 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D47 + ,simpleLowerCaseMapping:0x1D47 + ,simpleTitleCaseMapping:0x1D47 + }, + { code:0x1D48 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D48 + ,simpleLowerCaseMapping:0x1D48 + ,simpleTitleCaseMapping:0x1D48 + }, + { code:0x1D49 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D49 + ,simpleLowerCaseMapping:0x1D49 + ,simpleTitleCaseMapping:0x1D49 + }, + { code:0x1D4A + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D4A + ,simpleLowerCaseMapping:0x1D4A + ,simpleTitleCaseMapping:0x1D4A + }, + { code:0x1D4B + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D4B + ,simpleLowerCaseMapping:0x1D4B + ,simpleTitleCaseMapping:0x1D4B + }, + { code:0x1D4C + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D4C + ,simpleLowerCaseMapping:0x1D4C + ,simpleTitleCaseMapping:0x1D4C + }, + { code:0x1D4D + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D4D + ,simpleLowerCaseMapping:0x1D4D + ,simpleTitleCaseMapping:0x1D4D + }, + { code:0x1D4E + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D4E + ,simpleLowerCaseMapping:0x1D4E + ,simpleTitleCaseMapping:0x1D4E + }, + { code:0x1D4F + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D4F + ,simpleLowerCaseMapping:0x1D4F + ,simpleTitleCaseMapping:0x1D4F + }, + { code:0x1D50 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D50 + ,simpleLowerCaseMapping:0x1D50 + ,simpleTitleCaseMapping:0x1D50 + }, + { code:0x1D51 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D51 + ,simpleLowerCaseMapping:0x1D51 + ,simpleTitleCaseMapping:0x1D51 + }, + { code:0x1D52 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D52 + ,simpleLowerCaseMapping:0x1D52 + ,simpleTitleCaseMapping:0x1D52 + }, + { code:0x1D53 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D53 + ,simpleLowerCaseMapping:0x1D53 + ,simpleTitleCaseMapping:0x1D53 + }, + { code:0x1D54 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D54 + ,simpleLowerCaseMapping:0x1D54 + ,simpleTitleCaseMapping:0x1D54 + }, + { code:0x1D55 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D55 + ,simpleLowerCaseMapping:0x1D55 + ,simpleTitleCaseMapping:0x1D55 + }, + { code:0x1D56 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D56 + ,simpleLowerCaseMapping:0x1D56 + ,simpleTitleCaseMapping:0x1D56 + }, + { code:0x1D57 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D57 + ,simpleLowerCaseMapping:0x1D57 + ,simpleTitleCaseMapping:0x1D57 + }, + { code:0x1D58 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D58 + ,simpleLowerCaseMapping:0x1D58 + ,simpleTitleCaseMapping:0x1D58 + }, + { code:0x1D59 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D59 + ,simpleLowerCaseMapping:0x1D59 + ,simpleTitleCaseMapping:0x1D59 + }, + { code:0x1D5A + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D5A + ,simpleLowerCaseMapping:0x1D5A + ,simpleTitleCaseMapping:0x1D5A + }, + { code:0x1D5B + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D5B + ,simpleLowerCaseMapping:0x1D5B + ,simpleTitleCaseMapping:0x1D5B + }, + { code:0x1D5C + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D5C + ,simpleLowerCaseMapping:0x1D5C + ,simpleTitleCaseMapping:0x1D5C + }, + { code:0x1D5D + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D5D + ,simpleLowerCaseMapping:0x1D5D + ,simpleTitleCaseMapping:0x1D5D + }, + { code:0x1D5E + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D5E + ,simpleLowerCaseMapping:0x1D5E + ,simpleTitleCaseMapping:0x1D5E + }, + { code:0x1D5F + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D5F + ,simpleLowerCaseMapping:0x1D5F + ,simpleTitleCaseMapping:0x1D5F + }, + { code:0x1D60 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D60 + ,simpleLowerCaseMapping:0x1D60 + ,simpleTitleCaseMapping:0x1D60 + }, + { code:0x1D61 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D61 + ,simpleLowerCaseMapping:0x1D61 + ,simpleTitleCaseMapping:0x1D61 + }, + { code:0x1D62 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D62 + ,simpleLowerCaseMapping:0x1D62 + ,simpleTitleCaseMapping:0x1D62 + }, + { code:0x1D63 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D63 + ,simpleLowerCaseMapping:0x1D63 + ,simpleTitleCaseMapping:0x1D63 + }, + { code:0x1D64 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D64 + ,simpleLowerCaseMapping:0x1D64 + ,simpleTitleCaseMapping:0x1D64 + }, + { code:0x1D65 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D65 + ,simpleLowerCaseMapping:0x1D65 + ,simpleTitleCaseMapping:0x1D65 + }, + { code:0x1D66 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D66 + ,simpleLowerCaseMapping:0x1D66 + ,simpleTitleCaseMapping:0x1D66 + }, + { code:0x1D67 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D67 + ,simpleLowerCaseMapping:0x1D67 + ,simpleTitleCaseMapping:0x1D67 + }, + { code:0x1D68 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D68 + ,simpleLowerCaseMapping:0x1D68 + ,simpleTitleCaseMapping:0x1D68 + }, + { code:0x1D69 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D69 + ,simpleLowerCaseMapping:0x1D69 + ,simpleTitleCaseMapping:0x1D69 + }, + { code:0x1D6A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6A + ,simpleLowerCaseMapping:0x1D6A + ,simpleTitleCaseMapping:0x1D6A + }, + { code:0x1D6B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6B + ,simpleLowerCaseMapping:0x1D6B + ,simpleTitleCaseMapping:0x1D6B + }, + { code:0x1D6C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6C + ,simpleLowerCaseMapping:0x1D6C + ,simpleTitleCaseMapping:0x1D6C + }, + { code:0x1D6D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6D + ,simpleLowerCaseMapping:0x1D6D + ,simpleTitleCaseMapping:0x1D6D + }, + { code:0x1D6E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6E + ,simpleLowerCaseMapping:0x1D6E + ,simpleTitleCaseMapping:0x1D6E + }, + { code:0x1D6F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6F + ,simpleLowerCaseMapping:0x1D6F + ,simpleTitleCaseMapping:0x1D6F + }, + { code:0x1D70 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D70 + ,simpleLowerCaseMapping:0x1D70 + ,simpleTitleCaseMapping:0x1D70 + }, + { code:0x1D71 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D71 + ,simpleLowerCaseMapping:0x1D71 + ,simpleTitleCaseMapping:0x1D71 + }, + { code:0x1D72 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D72 + ,simpleLowerCaseMapping:0x1D72 + ,simpleTitleCaseMapping:0x1D72 + }, + { code:0x1D73 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D73 + ,simpleLowerCaseMapping:0x1D73 + ,simpleTitleCaseMapping:0x1D73 + }, + { code:0x1D74 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D74 + ,simpleLowerCaseMapping:0x1D74 + ,simpleTitleCaseMapping:0x1D74 + }, + { code:0x1D75 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D75 + ,simpleLowerCaseMapping:0x1D75 + ,simpleTitleCaseMapping:0x1D75 + }, + { code:0x1D76 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D76 + ,simpleLowerCaseMapping:0x1D76 + ,simpleTitleCaseMapping:0x1D76 + }, + { code:0x1D77 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D77 + ,simpleLowerCaseMapping:0x1D77 + ,simpleTitleCaseMapping:0x1D77 + }, + { code:0x1D78 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D78 + ,simpleLowerCaseMapping:0x1D78 + ,simpleTitleCaseMapping:0x1D78 + }, + { code:0x1D79 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D79 + ,simpleLowerCaseMapping:0x1D79 + ,simpleTitleCaseMapping:0x1D79 + }, + { code:0x1D7A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7A + ,simpleLowerCaseMapping:0x1D7A + ,simpleTitleCaseMapping:0x1D7A + }, + { code:0x1D7B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7B + ,simpleLowerCaseMapping:0x1D7B + ,simpleTitleCaseMapping:0x1D7B + }, + { code:0x1D7C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7C + ,simpleLowerCaseMapping:0x1D7C + ,simpleTitleCaseMapping:0x1D7C + }, + { code:0x1D7D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C63 + ,simpleLowerCaseMapping:0x1D7D + ,simpleTitleCaseMapping:0x2C63 + }, + { code:0x1D7E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7E + ,simpleLowerCaseMapping:0x1D7E + ,simpleTitleCaseMapping:0x1D7E + }, + { code:0x1D7F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7F + ,simpleLowerCaseMapping:0x1D7F + ,simpleTitleCaseMapping:0x1D7F + }, + { code:0x1D80 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D80 + ,simpleLowerCaseMapping:0x1D80 + ,simpleTitleCaseMapping:0x1D80 + }, + { code:0x1D81 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D81 + ,simpleLowerCaseMapping:0x1D81 + ,simpleTitleCaseMapping:0x1D81 + }, + { code:0x1D82 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D82 + ,simpleLowerCaseMapping:0x1D82 + ,simpleTitleCaseMapping:0x1D82 + }, + { code:0x1D83 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D83 + ,simpleLowerCaseMapping:0x1D83 + ,simpleTitleCaseMapping:0x1D83 + }, + { code:0x1D84 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D84 + ,simpleLowerCaseMapping:0x1D84 + ,simpleTitleCaseMapping:0x1D84 + }, + { code:0x1D85 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D85 + ,simpleLowerCaseMapping:0x1D85 + ,simpleTitleCaseMapping:0x1D85 + }, + { code:0x1D86 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D86 + ,simpleLowerCaseMapping:0x1D86 + ,simpleTitleCaseMapping:0x1D86 + }, + { code:0x1D87 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D87 + ,simpleLowerCaseMapping:0x1D87 + ,simpleTitleCaseMapping:0x1D87 + }, + { code:0x1D88 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D88 + ,simpleLowerCaseMapping:0x1D88 + ,simpleTitleCaseMapping:0x1D88 + }, + { code:0x1D89 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D89 + ,simpleLowerCaseMapping:0x1D89 + ,simpleTitleCaseMapping:0x1D89 + }, + { code:0x1D8A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D8A + ,simpleLowerCaseMapping:0x1D8A + ,simpleTitleCaseMapping:0x1D8A + }, + { code:0x1D8B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D8B + ,simpleLowerCaseMapping:0x1D8B + ,simpleTitleCaseMapping:0x1D8B + }, + { code:0x1D8C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D8C + ,simpleLowerCaseMapping:0x1D8C + ,simpleTitleCaseMapping:0x1D8C + }, + { code:0x1D8D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D8D + ,simpleLowerCaseMapping:0x1D8D + ,simpleTitleCaseMapping:0x1D8D + }, + { code:0x1D8E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D8E + ,simpleLowerCaseMapping:0x1D8E + ,simpleTitleCaseMapping:0x1D8E + }, + { code:0x1D8F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D8F + ,simpleLowerCaseMapping:0x1D8F + ,simpleTitleCaseMapping:0x1D8F + }, + { code:0x1D90 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D90 + ,simpleLowerCaseMapping:0x1D90 + ,simpleTitleCaseMapping:0x1D90 + }, + { code:0x1D91 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D91 + ,simpleLowerCaseMapping:0x1D91 + ,simpleTitleCaseMapping:0x1D91 + }, + { code:0x1D92 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D92 + ,simpleLowerCaseMapping:0x1D92 + ,simpleTitleCaseMapping:0x1D92 + }, + { code:0x1D93 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D93 + ,simpleLowerCaseMapping:0x1D93 + ,simpleTitleCaseMapping:0x1D93 + }, + { code:0x1D94 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D94 + ,simpleLowerCaseMapping:0x1D94 + ,simpleTitleCaseMapping:0x1D94 + }, + { code:0x1D95 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D95 + ,simpleLowerCaseMapping:0x1D95 + ,simpleTitleCaseMapping:0x1D95 + }, + { code:0x1D96 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D96 + ,simpleLowerCaseMapping:0x1D96 + ,simpleTitleCaseMapping:0x1D96 + }, + { code:0x1D97 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D97 + ,simpleLowerCaseMapping:0x1D97 + ,simpleTitleCaseMapping:0x1D97 + }, + { code:0x1D98 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D98 + ,simpleLowerCaseMapping:0x1D98 + ,simpleTitleCaseMapping:0x1D98 + }, + { code:0x1D99 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D99 + ,simpleLowerCaseMapping:0x1D99 + ,simpleTitleCaseMapping:0x1D99 + }, + { code:0x1D9A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D9A + ,simpleLowerCaseMapping:0x1D9A + ,simpleTitleCaseMapping:0x1D9A + }, + { code:0x1D9B + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D9B + ,simpleLowerCaseMapping:0x1D9B + ,simpleTitleCaseMapping:0x1D9B + }, + { code:0x1D9C + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D9C + ,simpleLowerCaseMapping:0x1D9C + ,simpleTitleCaseMapping:0x1D9C + }, + { code:0x1D9D + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D9D + ,simpleLowerCaseMapping:0x1D9D + ,simpleTitleCaseMapping:0x1D9D + }, + { code:0x1D9E + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D9E + ,simpleLowerCaseMapping:0x1D9E + ,simpleTitleCaseMapping:0x1D9E + }, + { code:0x1D9F + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1D9F + ,simpleLowerCaseMapping:0x1D9F + ,simpleTitleCaseMapping:0x1D9F + }, + { code:0x1DA0 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1DA0 + ,simpleLowerCaseMapping:0x1DA0 + ,simpleTitleCaseMapping:0x1DA0 + }, + { code:0x1DA1 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1DA1 + ,simpleLowerCaseMapping:0x1DA1 + ,simpleTitleCaseMapping:0x1DA1 + }, + { code:0x1DA2 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1DA2 + ,simpleLowerCaseMapping:0x1DA2 + ,simpleTitleCaseMapping:0x1DA2 + }, + { code:0x1DA3 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1DA3 + ,simpleLowerCaseMapping:0x1DA3 + ,simpleTitleCaseMapping:0x1DA3 + }, + { code:0x1DA4 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1DA4 + ,simpleLowerCaseMapping:0x1DA4 + ,simpleTitleCaseMapping:0x1DA4 + }, + { code:0x1DA5 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1DA5 + ,simpleLowerCaseMapping:0x1DA5 + ,simpleTitleCaseMapping:0x1DA5 + }, + { code:0x1DA6 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1DA6 + ,simpleLowerCaseMapping:0x1DA6 + ,simpleTitleCaseMapping:0x1DA6 + }, + { code:0x1DA7 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1DA7 + ,simpleLowerCaseMapping:0x1DA7 + ,simpleTitleCaseMapping:0x1DA7 + }, + { code:0x1DA8 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1DA8 + ,simpleLowerCaseMapping:0x1DA8 + ,simpleTitleCaseMapping:0x1DA8 + }, + { code:0x1DA9 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1DA9 + ,simpleLowerCaseMapping:0x1DA9 + ,simpleTitleCaseMapping:0x1DA9 + }, + { code:0x1DAA + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1DAA + ,simpleLowerCaseMapping:0x1DAA + ,simpleTitleCaseMapping:0x1DAA + }, + { code:0x1DAB + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1DAB + ,simpleLowerCaseMapping:0x1DAB + ,simpleTitleCaseMapping:0x1DAB + }, + { code:0x1DAC + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1DAC + ,simpleLowerCaseMapping:0x1DAC + ,simpleTitleCaseMapping:0x1DAC + }, + { code:0x1DAD + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1DAD + ,simpleLowerCaseMapping:0x1DAD + ,simpleTitleCaseMapping:0x1DAD + }, + { code:0x1DAE + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1DAE + ,simpleLowerCaseMapping:0x1DAE + ,simpleTitleCaseMapping:0x1DAE + }, + { code:0x1DAF + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1DAF + ,simpleLowerCaseMapping:0x1DAF + ,simpleTitleCaseMapping:0x1DAF + }, + { code:0x1DB0 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1DB0 + ,simpleLowerCaseMapping:0x1DB0 + ,simpleTitleCaseMapping:0x1DB0 + }, + { code:0x1DB1 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1DB1 + ,simpleLowerCaseMapping:0x1DB1 + ,simpleTitleCaseMapping:0x1DB1 + }, + { code:0x1DB2 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1DB2 + ,simpleLowerCaseMapping:0x1DB2 + ,simpleTitleCaseMapping:0x1DB2 + }, + { code:0x1DB3 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1DB3 + ,simpleLowerCaseMapping:0x1DB3 + ,simpleTitleCaseMapping:0x1DB3 + }, + { code:0x1DB4 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1DB4 + ,simpleLowerCaseMapping:0x1DB4 + ,simpleTitleCaseMapping:0x1DB4 + }, + { code:0x1DB5 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1DB5 + ,simpleLowerCaseMapping:0x1DB5 + ,simpleTitleCaseMapping:0x1DB5 + }, + { code:0x1DB6 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1DB6 + ,simpleLowerCaseMapping:0x1DB6 + ,simpleTitleCaseMapping:0x1DB6 + }, + { code:0x1DB7 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1DB7 + ,simpleLowerCaseMapping:0x1DB7 + ,simpleTitleCaseMapping:0x1DB7 + }, + { code:0x1DB8 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1DB8 + ,simpleLowerCaseMapping:0x1DB8 + ,simpleTitleCaseMapping:0x1DB8 + }, + { code:0x1DB9 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1DB9 + ,simpleLowerCaseMapping:0x1DB9 + ,simpleTitleCaseMapping:0x1DB9 + }, + { code:0x1DBA + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1DBA + ,simpleLowerCaseMapping:0x1DBA + ,simpleTitleCaseMapping:0x1DBA + }, + { code:0x1DBB + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1DBB + ,simpleLowerCaseMapping:0x1DBB + ,simpleTitleCaseMapping:0x1DBB + }, + { code:0x1DBC + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1DBC + ,simpleLowerCaseMapping:0x1DBC + ,simpleTitleCaseMapping:0x1DBC + }, + { code:0x1DBD + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1DBD + ,simpleLowerCaseMapping:0x1DBD + ,simpleTitleCaseMapping:0x1DBD + }, + { code:0x1DBE + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1DBE + ,simpleLowerCaseMapping:0x1DBE + ,simpleTitleCaseMapping:0x1DBE + }, + { code:0x1DBF + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x1DBF + ,simpleLowerCaseMapping:0x1DBF + ,simpleTitleCaseMapping:0x1DBF + }, + { code:0x1DC0 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1DC0 + ,simpleLowerCaseMapping:0x1DC0 + ,simpleTitleCaseMapping:0x1DC0 + }, + { code:0x1DC1 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1DC1 + ,simpleLowerCaseMapping:0x1DC1 + ,simpleTitleCaseMapping:0x1DC1 + }, + { code:0x1DC2 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1DC2 + ,simpleLowerCaseMapping:0x1DC2 + ,simpleTitleCaseMapping:0x1DC2 + }, + { code:0x1DC3 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1DC3 + ,simpleLowerCaseMapping:0x1DC3 + ,simpleTitleCaseMapping:0x1DC3 + }, + { code:0x1DC4 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1DC4 + ,simpleLowerCaseMapping:0x1DC4 + ,simpleTitleCaseMapping:0x1DC4 + }, + { code:0x1DC5 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1DC5 + ,simpleLowerCaseMapping:0x1DC5 + ,simpleTitleCaseMapping:0x1DC5 + }, + { code:0x1DC6 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1DC6 + ,simpleLowerCaseMapping:0x1DC6 + ,simpleTitleCaseMapping:0x1DC6 + }, + { code:0x1DC7 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1DC7 + ,simpleLowerCaseMapping:0x1DC7 + ,simpleTitleCaseMapping:0x1DC7 + }, + { code:0x1DC8 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1DC8 + ,simpleLowerCaseMapping:0x1DC8 + ,simpleTitleCaseMapping:0x1DC8 + }, + { code:0x1DC9 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1DC9 + ,simpleLowerCaseMapping:0x1DC9 + ,simpleTitleCaseMapping:0x1DC9 + }, + { code:0x1DCA + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1DCA + ,simpleLowerCaseMapping:0x1DCA + ,simpleTitleCaseMapping:0x1DCA + }, + { code:0x1DFE + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1DFE + ,simpleLowerCaseMapping:0x1DFE + ,simpleTitleCaseMapping:0x1DFE + }, + { code:0x1DFF + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1DFF + ,simpleLowerCaseMapping:0x1DFF + ,simpleTitleCaseMapping:0x1DFF + }, + { code:0x1E00 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E00 + ,simpleLowerCaseMapping:0x1E01 + ,simpleTitleCaseMapping:0x1E00 + }, + { code:0x1E01 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E00 + ,simpleLowerCaseMapping:0x1E01 + ,simpleTitleCaseMapping:0x1E00 + }, + { code:0x1E02 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E02 + ,simpleLowerCaseMapping:0x1E03 + ,simpleTitleCaseMapping:0x1E02 + }, + { code:0x1E03 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E02 + ,simpleLowerCaseMapping:0x1E03 + ,simpleTitleCaseMapping:0x1E02 + }, + { code:0x1E04 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E04 + ,simpleLowerCaseMapping:0x1E05 + ,simpleTitleCaseMapping:0x1E04 + }, + { code:0x1E05 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E04 + ,simpleLowerCaseMapping:0x1E05 + ,simpleTitleCaseMapping:0x1E04 + }, + { code:0x1E06 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E06 + ,simpleLowerCaseMapping:0x1E07 + ,simpleTitleCaseMapping:0x1E06 + }, + { code:0x1E07 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E06 + ,simpleLowerCaseMapping:0x1E07 + ,simpleTitleCaseMapping:0x1E06 + }, + { code:0x1E08 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E08 + ,simpleLowerCaseMapping:0x1E09 + ,simpleTitleCaseMapping:0x1E08 + }, + { code:0x1E09 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E08 + ,simpleLowerCaseMapping:0x1E09 + ,simpleTitleCaseMapping:0x1E08 + }, + { code:0x1E0A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E0A + ,simpleLowerCaseMapping:0x1E0B + ,simpleTitleCaseMapping:0x1E0A + }, + { code:0x1E0B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E0A + ,simpleLowerCaseMapping:0x1E0B + ,simpleTitleCaseMapping:0x1E0A + }, + { code:0x1E0C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E0C + ,simpleLowerCaseMapping:0x1E0D + ,simpleTitleCaseMapping:0x1E0C + }, + { code:0x1E0D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E0C + ,simpleLowerCaseMapping:0x1E0D + ,simpleTitleCaseMapping:0x1E0C + }, + { code:0x1E0E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E0E + ,simpleLowerCaseMapping:0x1E0F + ,simpleTitleCaseMapping:0x1E0E + }, + { code:0x1E0F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E0E + ,simpleLowerCaseMapping:0x1E0F + ,simpleTitleCaseMapping:0x1E0E + }, + { code:0x1E10 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E10 + ,simpleLowerCaseMapping:0x1E11 + ,simpleTitleCaseMapping:0x1E10 + }, + { code:0x1E11 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E10 + ,simpleLowerCaseMapping:0x1E11 + ,simpleTitleCaseMapping:0x1E10 + }, + { code:0x1E12 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E12 + ,simpleLowerCaseMapping:0x1E13 + ,simpleTitleCaseMapping:0x1E12 + }, + { code:0x1E13 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E12 + ,simpleLowerCaseMapping:0x1E13 + ,simpleTitleCaseMapping:0x1E12 + }, + { code:0x1E14 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E14 + ,simpleLowerCaseMapping:0x1E15 + ,simpleTitleCaseMapping:0x1E14 + }, + { code:0x1E15 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E14 + ,simpleLowerCaseMapping:0x1E15 + ,simpleTitleCaseMapping:0x1E14 + }, + { code:0x1E16 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E16 + ,simpleLowerCaseMapping:0x1E17 + ,simpleTitleCaseMapping:0x1E16 + }, + { code:0x1E17 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E16 + ,simpleLowerCaseMapping:0x1E17 + ,simpleTitleCaseMapping:0x1E16 + }, + { code:0x1E18 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E18 + ,simpleLowerCaseMapping:0x1E19 + ,simpleTitleCaseMapping:0x1E18 + }, + { code:0x1E19 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E18 + ,simpleLowerCaseMapping:0x1E19 + ,simpleTitleCaseMapping:0x1E18 + }, + { code:0x1E1A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E1A + ,simpleLowerCaseMapping:0x1E1B + ,simpleTitleCaseMapping:0x1E1A + }, + { code:0x1E1B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E1A + ,simpleLowerCaseMapping:0x1E1B + ,simpleTitleCaseMapping:0x1E1A + }, + { code:0x1E1C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E1C + ,simpleLowerCaseMapping:0x1E1D + ,simpleTitleCaseMapping:0x1E1C + }, + { code:0x1E1D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E1C + ,simpleLowerCaseMapping:0x1E1D + ,simpleTitleCaseMapping:0x1E1C + }, + { code:0x1E1E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E1E + ,simpleLowerCaseMapping:0x1E1F + ,simpleTitleCaseMapping:0x1E1E + }, + { code:0x1E1F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E1E + ,simpleLowerCaseMapping:0x1E1F + ,simpleTitleCaseMapping:0x1E1E + }, + { code:0x1E20 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E20 + ,simpleLowerCaseMapping:0x1E21 + ,simpleTitleCaseMapping:0x1E20 + }, + { code:0x1E21 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E20 + ,simpleLowerCaseMapping:0x1E21 + ,simpleTitleCaseMapping:0x1E20 + }, + { code:0x1E22 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E22 + ,simpleLowerCaseMapping:0x1E23 + ,simpleTitleCaseMapping:0x1E22 + }, + { code:0x1E23 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E22 + ,simpleLowerCaseMapping:0x1E23 + ,simpleTitleCaseMapping:0x1E22 + }, + { code:0x1E24 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E24 + ,simpleLowerCaseMapping:0x1E25 + ,simpleTitleCaseMapping:0x1E24 + }, + { code:0x1E25 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E24 + ,simpleLowerCaseMapping:0x1E25 + ,simpleTitleCaseMapping:0x1E24 + }, + { code:0x1E26 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E26 + ,simpleLowerCaseMapping:0x1E27 + ,simpleTitleCaseMapping:0x1E26 + }, + { code:0x1E27 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E26 + ,simpleLowerCaseMapping:0x1E27 + ,simpleTitleCaseMapping:0x1E26 + }, + { code:0x1E28 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E28 + ,simpleLowerCaseMapping:0x1E29 + ,simpleTitleCaseMapping:0x1E28 + }, + { code:0x1E29 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E28 + ,simpleLowerCaseMapping:0x1E29 + ,simpleTitleCaseMapping:0x1E28 + }, + { code:0x1E2A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E2A + ,simpleLowerCaseMapping:0x1E2B + ,simpleTitleCaseMapping:0x1E2A + }, + { code:0x1E2B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E2A + ,simpleLowerCaseMapping:0x1E2B + ,simpleTitleCaseMapping:0x1E2A + }, + { code:0x1E2C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E2C + ,simpleLowerCaseMapping:0x1E2D + ,simpleTitleCaseMapping:0x1E2C + }, + { code:0x1E2D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E2C + ,simpleLowerCaseMapping:0x1E2D + ,simpleTitleCaseMapping:0x1E2C + }, + { code:0x1E2E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E2E + ,simpleLowerCaseMapping:0x1E2F + ,simpleTitleCaseMapping:0x1E2E + }, + { code:0x1E2F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E2E + ,simpleLowerCaseMapping:0x1E2F + ,simpleTitleCaseMapping:0x1E2E + }, + { code:0x1E30 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E30 + ,simpleLowerCaseMapping:0x1E31 + ,simpleTitleCaseMapping:0x1E30 + }, + { code:0x1E31 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E30 + ,simpleLowerCaseMapping:0x1E31 + ,simpleTitleCaseMapping:0x1E30 + }, + { code:0x1E32 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E32 + ,simpleLowerCaseMapping:0x1E33 + ,simpleTitleCaseMapping:0x1E32 + }, + { code:0x1E33 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E32 + ,simpleLowerCaseMapping:0x1E33 + ,simpleTitleCaseMapping:0x1E32 + }, + { code:0x1E34 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E34 + ,simpleLowerCaseMapping:0x1E35 + ,simpleTitleCaseMapping:0x1E34 + }, + { code:0x1E35 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E34 + ,simpleLowerCaseMapping:0x1E35 + ,simpleTitleCaseMapping:0x1E34 + }, + { code:0x1E36 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E36 + ,simpleLowerCaseMapping:0x1E37 + ,simpleTitleCaseMapping:0x1E36 + }, + { code:0x1E37 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E36 + ,simpleLowerCaseMapping:0x1E37 + ,simpleTitleCaseMapping:0x1E36 + }, + { code:0x1E38 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E38 + ,simpleLowerCaseMapping:0x1E39 + ,simpleTitleCaseMapping:0x1E38 + }, + { code:0x1E39 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E38 + ,simpleLowerCaseMapping:0x1E39 + ,simpleTitleCaseMapping:0x1E38 + }, + { code:0x1E3A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E3A + ,simpleLowerCaseMapping:0x1E3B + ,simpleTitleCaseMapping:0x1E3A + }, + { code:0x1E3B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E3A + ,simpleLowerCaseMapping:0x1E3B + ,simpleTitleCaseMapping:0x1E3A + }, + { code:0x1E3C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E3C + ,simpleLowerCaseMapping:0x1E3D + ,simpleTitleCaseMapping:0x1E3C + }, + { code:0x1E3D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E3C + ,simpleLowerCaseMapping:0x1E3D + ,simpleTitleCaseMapping:0x1E3C + }, + { code:0x1E3E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E3E + ,simpleLowerCaseMapping:0x1E3F + ,simpleTitleCaseMapping:0x1E3E + }, + { code:0x1E3F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E3E + ,simpleLowerCaseMapping:0x1E3F + ,simpleTitleCaseMapping:0x1E3E + }, + { code:0x1E40 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E40 + ,simpleLowerCaseMapping:0x1E41 + ,simpleTitleCaseMapping:0x1E40 + }, + { code:0x1E41 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E40 + ,simpleLowerCaseMapping:0x1E41 + ,simpleTitleCaseMapping:0x1E40 + }, + { code:0x1E42 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E42 + ,simpleLowerCaseMapping:0x1E43 + ,simpleTitleCaseMapping:0x1E42 + }, + { code:0x1E43 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E42 + ,simpleLowerCaseMapping:0x1E43 + ,simpleTitleCaseMapping:0x1E42 + }, + { code:0x1E44 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E44 + ,simpleLowerCaseMapping:0x1E45 + ,simpleTitleCaseMapping:0x1E44 + }, + { code:0x1E45 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E44 + ,simpleLowerCaseMapping:0x1E45 + ,simpleTitleCaseMapping:0x1E44 + }, + { code:0x1E46 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E46 + ,simpleLowerCaseMapping:0x1E47 + ,simpleTitleCaseMapping:0x1E46 + }, + { code:0x1E47 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E46 + ,simpleLowerCaseMapping:0x1E47 + ,simpleTitleCaseMapping:0x1E46 + }, + { code:0x1E48 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E48 + ,simpleLowerCaseMapping:0x1E49 + ,simpleTitleCaseMapping:0x1E48 + }, + { code:0x1E49 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E48 + ,simpleLowerCaseMapping:0x1E49 + ,simpleTitleCaseMapping:0x1E48 + }, + { code:0x1E4A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E4A + ,simpleLowerCaseMapping:0x1E4B + ,simpleTitleCaseMapping:0x1E4A + }, + { code:0x1E4B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E4A + ,simpleLowerCaseMapping:0x1E4B + ,simpleTitleCaseMapping:0x1E4A + }, + { code:0x1E4C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E4C + ,simpleLowerCaseMapping:0x1E4D + ,simpleTitleCaseMapping:0x1E4C + }, + { code:0x1E4D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E4C + ,simpleLowerCaseMapping:0x1E4D + ,simpleTitleCaseMapping:0x1E4C + }, + { code:0x1E4E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E4E + ,simpleLowerCaseMapping:0x1E4F + ,simpleTitleCaseMapping:0x1E4E + }, + { code:0x1E4F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E4E + ,simpleLowerCaseMapping:0x1E4F + ,simpleTitleCaseMapping:0x1E4E + }, + { code:0x1E50 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E50 + ,simpleLowerCaseMapping:0x1E51 + ,simpleTitleCaseMapping:0x1E50 + }, + { code:0x1E51 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E50 + ,simpleLowerCaseMapping:0x1E51 + ,simpleTitleCaseMapping:0x1E50 + }, + { code:0x1E52 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E52 + ,simpleLowerCaseMapping:0x1E53 + ,simpleTitleCaseMapping:0x1E52 + }, + { code:0x1E53 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E52 + ,simpleLowerCaseMapping:0x1E53 + ,simpleTitleCaseMapping:0x1E52 + }, + { code:0x1E54 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E54 + ,simpleLowerCaseMapping:0x1E55 + ,simpleTitleCaseMapping:0x1E54 + }, + { code:0x1E55 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E54 + ,simpleLowerCaseMapping:0x1E55 + ,simpleTitleCaseMapping:0x1E54 + }, + { code:0x1E56 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E56 + ,simpleLowerCaseMapping:0x1E57 + ,simpleTitleCaseMapping:0x1E56 + }, + { code:0x1E57 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E56 + ,simpleLowerCaseMapping:0x1E57 + ,simpleTitleCaseMapping:0x1E56 + }, + { code:0x1E58 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E58 + ,simpleLowerCaseMapping:0x1E59 + ,simpleTitleCaseMapping:0x1E58 + }, + { code:0x1E59 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E58 + ,simpleLowerCaseMapping:0x1E59 + ,simpleTitleCaseMapping:0x1E58 + }, + { code:0x1E5A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E5A + ,simpleLowerCaseMapping:0x1E5B + ,simpleTitleCaseMapping:0x1E5A + }, + { code:0x1E5B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E5A + ,simpleLowerCaseMapping:0x1E5B + ,simpleTitleCaseMapping:0x1E5A + }, + { code:0x1E5C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E5C + ,simpleLowerCaseMapping:0x1E5D + ,simpleTitleCaseMapping:0x1E5C + }, + { code:0x1E5D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E5C + ,simpleLowerCaseMapping:0x1E5D + ,simpleTitleCaseMapping:0x1E5C + }, + { code:0x1E5E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E5E + ,simpleLowerCaseMapping:0x1E5F + ,simpleTitleCaseMapping:0x1E5E + }, + { code:0x1E5F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E5E + ,simpleLowerCaseMapping:0x1E5F + ,simpleTitleCaseMapping:0x1E5E + }, + { code:0x1E60 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E60 + ,simpleLowerCaseMapping:0x1E61 + ,simpleTitleCaseMapping:0x1E60 + }, + { code:0x1E61 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E60 + ,simpleLowerCaseMapping:0x1E61 + ,simpleTitleCaseMapping:0x1E60 + }, + { code:0x1E62 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E62 + ,simpleLowerCaseMapping:0x1E63 + ,simpleTitleCaseMapping:0x1E62 + }, + { code:0x1E63 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E62 + ,simpleLowerCaseMapping:0x1E63 + ,simpleTitleCaseMapping:0x1E62 + }, + { code:0x1E64 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E64 + ,simpleLowerCaseMapping:0x1E65 + ,simpleTitleCaseMapping:0x1E64 + }, + { code:0x1E65 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E64 + ,simpleLowerCaseMapping:0x1E65 + ,simpleTitleCaseMapping:0x1E64 + }, + { code:0x1E66 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E66 + ,simpleLowerCaseMapping:0x1E67 + ,simpleTitleCaseMapping:0x1E66 + }, + { code:0x1E67 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E66 + ,simpleLowerCaseMapping:0x1E67 + ,simpleTitleCaseMapping:0x1E66 + }, + { code:0x1E68 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E68 + ,simpleLowerCaseMapping:0x1E69 + ,simpleTitleCaseMapping:0x1E68 + }, + { code:0x1E69 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E68 + ,simpleLowerCaseMapping:0x1E69 + ,simpleTitleCaseMapping:0x1E68 + }, + { code:0x1E6A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E6A + ,simpleLowerCaseMapping:0x1E6B + ,simpleTitleCaseMapping:0x1E6A + }, + { code:0x1E6B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E6A + ,simpleLowerCaseMapping:0x1E6B + ,simpleTitleCaseMapping:0x1E6A + }, + { code:0x1E6C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E6C + ,simpleLowerCaseMapping:0x1E6D + ,simpleTitleCaseMapping:0x1E6C + }, + { code:0x1E6D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E6C + ,simpleLowerCaseMapping:0x1E6D + ,simpleTitleCaseMapping:0x1E6C + }, + { code:0x1E6E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E6E + ,simpleLowerCaseMapping:0x1E6F + ,simpleTitleCaseMapping:0x1E6E + }, + { code:0x1E6F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E6E + ,simpleLowerCaseMapping:0x1E6F + ,simpleTitleCaseMapping:0x1E6E + }, + { code:0x1E70 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E70 + ,simpleLowerCaseMapping:0x1E71 + ,simpleTitleCaseMapping:0x1E70 + }, + { code:0x1E71 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E70 + ,simpleLowerCaseMapping:0x1E71 + ,simpleTitleCaseMapping:0x1E70 + }, + { code:0x1E72 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E72 + ,simpleLowerCaseMapping:0x1E73 + ,simpleTitleCaseMapping:0x1E72 + }, + { code:0x1E73 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E72 + ,simpleLowerCaseMapping:0x1E73 + ,simpleTitleCaseMapping:0x1E72 + }, + { code:0x1E74 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E74 + ,simpleLowerCaseMapping:0x1E75 + ,simpleTitleCaseMapping:0x1E74 + }, + { code:0x1E75 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E74 + ,simpleLowerCaseMapping:0x1E75 + ,simpleTitleCaseMapping:0x1E74 + }, + { code:0x1E76 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E76 + ,simpleLowerCaseMapping:0x1E77 + ,simpleTitleCaseMapping:0x1E76 + }, + { code:0x1E77 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E76 + ,simpleLowerCaseMapping:0x1E77 + ,simpleTitleCaseMapping:0x1E76 + }, + { code:0x1E78 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E78 + ,simpleLowerCaseMapping:0x1E79 + ,simpleTitleCaseMapping:0x1E78 + }, + { code:0x1E79 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E78 + ,simpleLowerCaseMapping:0x1E79 + ,simpleTitleCaseMapping:0x1E78 + }, + { code:0x1E7A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E7A + ,simpleLowerCaseMapping:0x1E7B + ,simpleTitleCaseMapping:0x1E7A + }, + { code:0x1E7B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E7A + ,simpleLowerCaseMapping:0x1E7B + ,simpleTitleCaseMapping:0x1E7A + }, + { code:0x1E7C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E7C + ,simpleLowerCaseMapping:0x1E7D + ,simpleTitleCaseMapping:0x1E7C + }, + { code:0x1E7D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E7C + ,simpleLowerCaseMapping:0x1E7D + ,simpleTitleCaseMapping:0x1E7C + }, + { code:0x1E7E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E7E + ,simpleLowerCaseMapping:0x1E7F + ,simpleTitleCaseMapping:0x1E7E + }, + { code:0x1E7F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E7E + ,simpleLowerCaseMapping:0x1E7F + ,simpleTitleCaseMapping:0x1E7E + }, + { code:0x1E80 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E80 + ,simpleLowerCaseMapping:0x1E81 + ,simpleTitleCaseMapping:0x1E80 + }, + { code:0x1E81 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E80 + ,simpleLowerCaseMapping:0x1E81 + ,simpleTitleCaseMapping:0x1E80 + }, + { code:0x1E82 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E82 + ,simpleLowerCaseMapping:0x1E83 + ,simpleTitleCaseMapping:0x1E82 + }, + { code:0x1E83 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E82 + ,simpleLowerCaseMapping:0x1E83 + ,simpleTitleCaseMapping:0x1E82 + }, + { code:0x1E84 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E84 + ,simpleLowerCaseMapping:0x1E85 + ,simpleTitleCaseMapping:0x1E84 + }, + { code:0x1E85 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E84 + ,simpleLowerCaseMapping:0x1E85 + ,simpleTitleCaseMapping:0x1E84 + }, + { code:0x1E86 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E86 + ,simpleLowerCaseMapping:0x1E87 + ,simpleTitleCaseMapping:0x1E86 + }, + { code:0x1E87 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E86 + ,simpleLowerCaseMapping:0x1E87 + ,simpleTitleCaseMapping:0x1E86 + }, + { code:0x1E88 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E88 + ,simpleLowerCaseMapping:0x1E89 + ,simpleTitleCaseMapping:0x1E88 + }, + { code:0x1E89 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E88 + ,simpleLowerCaseMapping:0x1E89 + ,simpleTitleCaseMapping:0x1E88 + }, + { code:0x1E8A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E8A + ,simpleLowerCaseMapping:0x1E8B + ,simpleTitleCaseMapping:0x1E8A + }, + { code:0x1E8B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E8A + ,simpleLowerCaseMapping:0x1E8B + ,simpleTitleCaseMapping:0x1E8A + }, + { code:0x1E8C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E8C + ,simpleLowerCaseMapping:0x1E8D + ,simpleTitleCaseMapping:0x1E8C + }, + { code:0x1E8D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E8C + ,simpleLowerCaseMapping:0x1E8D + ,simpleTitleCaseMapping:0x1E8C + }, + { code:0x1E8E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E8E + ,simpleLowerCaseMapping:0x1E8F + ,simpleTitleCaseMapping:0x1E8E + }, + { code:0x1E8F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E8E + ,simpleLowerCaseMapping:0x1E8F + ,simpleTitleCaseMapping:0x1E8E + }, + { code:0x1E90 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E90 + ,simpleLowerCaseMapping:0x1E91 + ,simpleTitleCaseMapping:0x1E90 + }, + { code:0x1E91 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E90 + ,simpleLowerCaseMapping:0x1E91 + ,simpleTitleCaseMapping:0x1E90 + }, + { code:0x1E92 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E92 + ,simpleLowerCaseMapping:0x1E93 + ,simpleTitleCaseMapping:0x1E92 + }, + { code:0x1E93 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E92 + ,simpleLowerCaseMapping:0x1E93 + ,simpleTitleCaseMapping:0x1E92 + }, + { code:0x1E94 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1E94 + ,simpleLowerCaseMapping:0x1E95 + ,simpleTitleCaseMapping:0x1E94 + }, + { code:0x1E95 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E94 + ,simpleLowerCaseMapping:0x1E95 + ,simpleTitleCaseMapping:0x1E94 + }, + { code:0x1E96 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1E96 + ,simpleLowerCaseMapping:0x1E96 + ,simpleTitleCaseMapping:0x1E96 + }, + { code:0x1E97 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1E97 + ,simpleLowerCaseMapping:0x1E97 + ,simpleTitleCaseMapping:0x1E97 + }, + { code:0x1E98 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1E98 + ,simpleLowerCaseMapping:0x1E98 + ,simpleTitleCaseMapping:0x1E98 + }, + { code:0x1E99 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1E99 + ,simpleLowerCaseMapping:0x1E99 + ,simpleTitleCaseMapping:0x1E99 + }, + { code:0x1E9A + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1E9A + ,simpleLowerCaseMapping:0x1E9A + ,simpleTitleCaseMapping:0x1E9A + }, + { code:0x1E9B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1E60 + ,simpleLowerCaseMapping:0x1E9B + ,simpleTitleCaseMapping:0x1E60 + }, + { code:0x1EA0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EA0 + ,simpleLowerCaseMapping:0x1EA1 + ,simpleTitleCaseMapping:0x1EA0 + }, + { code:0x1EA1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EA0 + ,simpleLowerCaseMapping:0x1EA1 + ,simpleTitleCaseMapping:0x1EA0 + }, + { code:0x1EA2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EA2 + ,simpleLowerCaseMapping:0x1EA3 + ,simpleTitleCaseMapping:0x1EA2 + }, + { code:0x1EA3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EA2 + ,simpleLowerCaseMapping:0x1EA3 + ,simpleTitleCaseMapping:0x1EA2 + }, + { code:0x1EA4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EA4 + ,simpleLowerCaseMapping:0x1EA5 + ,simpleTitleCaseMapping:0x1EA4 + }, + { code:0x1EA5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EA4 + ,simpleLowerCaseMapping:0x1EA5 + ,simpleTitleCaseMapping:0x1EA4 + }, + { code:0x1EA6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EA6 + ,simpleLowerCaseMapping:0x1EA7 + ,simpleTitleCaseMapping:0x1EA6 + }, + { code:0x1EA7 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EA6 + ,simpleLowerCaseMapping:0x1EA7 + ,simpleTitleCaseMapping:0x1EA6 + }, + { code:0x1EA8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EA8 + ,simpleLowerCaseMapping:0x1EA9 + ,simpleTitleCaseMapping:0x1EA8 + }, + { code:0x1EA9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EA8 + ,simpleLowerCaseMapping:0x1EA9 + ,simpleTitleCaseMapping:0x1EA8 + }, + { code:0x1EAA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EAA + ,simpleLowerCaseMapping:0x1EAB + ,simpleTitleCaseMapping:0x1EAA + }, + { code:0x1EAB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EAA + ,simpleLowerCaseMapping:0x1EAB + ,simpleTitleCaseMapping:0x1EAA + }, + { code:0x1EAC + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EAC + ,simpleLowerCaseMapping:0x1EAD + ,simpleTitleCaseMapping:0x1EAC + }, + { code:0x1EAD + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EAC + ,simpleLowerCaseMapping:0x1EAD + ,simpleTitleCaseMapping:0x1EAC + }, + { code:0x1EAE + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EAE + ,simpleLowerCaseMapping:0x1EAF + ,simpleTitleCaseMapping:0x1EAE + }, + { code:0x1EAF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EAE + ,simpleLowerCaseMapping:0x1EAF + ,simpleTitleCaseMapping:0x1EAE + }, + { code:0x1EB0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EB0 + ,simpleLowerCaseMapping:0x1EB1 + ,simpleTitleCaseMapping:0x1EB0 + }, + { code:0x1EB1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EB0 + ,simpleLowerCaseMapping:0x1EB1 + ,simpleTitleCaseMapping:0x1EB0 + }, + { code:0x1EB2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EB2 + ,simpleLowerCaseMapping:0x1EB3 + ,simpleTitleCaseMapping:0x1EB2 + }, + { code:0x1EB3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EB2 + ,simpleLowerCaseMapping:0x1EB3 + ,simpleTitleCaseMapping:0x1EB2 + }, + { code:0x1EB4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EB4 + ,simpleLowerCaseMapping:0x1EB5 + ,simpleTitleCaseMapping:0x1EB4 + }, + { code:0x1EB5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EB4 + ,simpleLowerCaseMapping:0x1EB5 + ,simpleTitleCaseMapping:0x1EB4 + }, + { code:0x1EB6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EB6 + ,simpleLowerCaseMapping:0x1EB7 + ,simpleTitleCaseMapping:0x1EB6 + }, + { code:0x1EB7 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EB6 + ,simpleLowerCaseMapping:0x1EB7 + ,simpleTitleCaseMapping:0x1EB6 + }, + { code:0x1EB8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EB8 + ,simpleLowerCaseMapping:0x1EB9 + ,simpleTitleCaseMapping:0x1EB8 + }, + { code:0x1EB9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EB8 + ,simpleLowerCaseMapping:0x1EB9 + ,simpleTitleCaseMapping:0x1EB8 + }, + { code:0x1EBA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EBA + ,simpleLowerCaseMapping:0x1EBB + ,simpleTitleCaseMapping:0x1EBA + }, + { code:0x1EBB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EBA + ,simpleLowerCaseMapping:0x1EBB + ,simpleTitleCaseMapping:0x1EBA + }, + { code:0x1EBC + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EBC + ,simpleLowerCaseMapping:0x1EBD + ,simpleTitleCaseMapping:0x1EBC + }, + { code:0x1EBD + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EBC + ,simpleLowerCaseMapping:0x1EBD + ,simpleTitleCaseMapping:0x1EBC + }, + { code:0x1EBE + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EBE + ,simpleLowerCaseMapping:0x1EBF + ,simpleTitleCaseMapping:0x1EBE + }, + { code:0x1EBF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EBE + ,simpleLowerCaseMapping:0x1EBF + ,simpleTitleCaseMapping:0x1EBE + }, + { code:0x1EC0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EC0 + ,simpleLowerCaseMapping:0x1EC1 + ,simpleTitleCaseMapping:0x1EC0 + }, + { code:0x1EC1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EC0 + ,simpleLowerCaseMapping:0x1EC1 + ,simpleTitleCaseMapping:0x1EC0 + }, + { code:0x1EC2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EC2 + ,simpleLowerCaseMapping:0x1EC3 + ,simpleTitleCaseMapping:0x1EC2 + }, + { code:0x1EC3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EC2 + ,simpleLowerCaseMapping:0x1EC3 + ,simpleTitleCaseMapping:0x1EC2 + }, + { code:0x1EC4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EC4 + ,simpleLowerCaseMapping:0x1EC5 + ,simpleTitleCaseMapping:0x1EC4 + }, + { code:0x1EC5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EC4 + ,simpleLowerCaseMapping:0x1EC5 + ,simpleTitleCaseMapping:0x1EC4 + }, + { code:0x1EC6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EC6 + ,simpleLowerCaseMapping:0x1EC7 + ,simpleTitleCaseMapping:0x1EC6 + }, + { code:0x1EC7 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EC6 + ,simpleLowerCaseMapping:0x1EC7 + ,simpleTitleCaseMapping:0x1EC6 + }, + { code:0x1EC8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EC8 + ,simpleLowerCaseMapping:0x1EC9 + ,simpleTitleCaseMapping:0x1EC8 + }, + { code:0x1EC9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EC8 + ,simpleLowerCaseMapping:0x1EC9 + ,simpleTitleCaseMapping:0x1EC8 + }, + { code:0x1ECA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1ECA + ,simpleLowerCaseMapping:0x1ECB + ,simpleTitleCaseMapping:0x1ECA + }, + { code:0x1ECB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1ECA + ,simpleLowerCaseMapping:0x1ECB + ,simpleTitleCaseMapping:0x1ECA + }, + { code:0x1ECC + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1ECC + ,simpleLowerCaseMapping:0x1ECD + ,simpleTitleCaseMapping:0x1ECC + }, + { code:0x1ECD + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1ECC + ,simpleLowerCaseMapping:0x1ECD + ,simpleTitleCaseMapping:0x1ECC + }, + { code:0x1ECE + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1ECE + ,simpleLowerCaseMapping:0x1ECF + ,simpleTitleCaseMapping:0x1ECE + }, + { code:0x1ECF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1ECE + ,simpleLowerCaseMapping:0x1ECF + ,simpleTitleCaseMapping:0x1ECE + }, + { code:0x1ED0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1ED0 + ,simpleLowerCaseMapping:0x1ED1 + ,simpleTitleCaseMapping:0x1ED0 + }, + { code:0x1ED1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1ED0 + ,simpleLowerCaseMapping:0x1ED1 + ,simpleTitleCaseMapping:0x1ED0 + }, + { code:0x1ED2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1ED2 + ,simpleLowerCaseMapping:0x1ED3 + ,simpleTitleCaseMapping:0x1ED2 + }, + { code:0x1ED3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1ED2 + ,simpleLowerCaseMapping:0x1ED3 + ,simpleTitleCaseMapping:0x1ED2 + }, + { code:0x1ED4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1ED4 + ,simpleLowerCaseMapping:0x1ED5 + ,simpleTitleCaseMapping:0x1ED4 + }, + { code:0x1ED5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1ED4 + ,simpleLowerCaseMapping:0x1ED5 + ,simpleTitleCaseMapping:0x1ED4 + }, + { code:0x1ED6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1ED6 + ,simpleLowerCaseMapping:0x1ED7 + ,simpleTitleCaseMapping:0x1ED6 + }, + { code:0x1ED7 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1ED6 + ,simpleLowerCaseMapping:0x1ED7 + ,simpleTitleCaseMapping:0x1ED6 + }, + { code:0x1ED8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1ED8 + ,simpleLowerCaseMapping:0x1ED9 + ,simpleTitleCaseMapping:0x1ED8 + }, + { code:0x1ED9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1ED8 + ,simpleLowerCaseMapping:0x1ED9 + ,simpleTitleCaseMapping:0x1ED8 + }, + { code:0x1EDA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EDA + ,simpleLowerCaseMapping:0x1EDB + ,simpleTitleCaseMapping:0x1EDA + }, + { code:0x1EDB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EDA + ,simpleLowerCaseMapping:0x1EDB + ,simpleTitleCaseMapping:0x1EDA + }, + { code:0x1EDC + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EDC + ,simpleLowerCaseMapping:0x1EDD + ,simpleTitleCaseMapping:0x1EDC + }, + { code:0x1EDD + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EDC + ,simpleLowerCaseMapping:0x1EDD + ,simpleTitleCaseMapping:0x1EDC + }, + { code:0x1EDE + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EDE + ,simpleLowerCaseMapping:0x1EDF + ,simpleTitleCaseMapping:0x1EDE + }, + { code:0x1EDF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EDE + ,simpleLowerCaseMapping:0x1EDF + ,simpleTitleCaseMapping:0x1EDE + }, + { code:0x1EE0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EE0 + ,simpleLowerCaseMapping:0x1EE1 + ,simpleTitleCaseMapping:0x1EE0 + }, + { code:0x1EE1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EE0 + ,simpleLowerCaseMapping:0x1EE1 + ,simpleTitleCaseMapping:0x1EE0 + }, + { code:0x1EE2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EE2 + ,simpleLowerCaseMapping:0x1EE3 + ,simpleTitleCaseMapping:0x1EE2 + }, + { code:0x1EE3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EE2 + ,simpleLowerCaseMapping:0x1EE3 + ,simpleTitleCaseMapping:0x1EE2 + }, + { code:0x1EE4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EE4 + ,simpleLowerCaseMapping:0x1EE5 + ,simpleTitleCaseMapping:0x1EE4 + }, + { code:0x1EE5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EE4 + ,simpleLowerCaseMapping:0x1EE5 + ,simpleTitleCaseMapping:0x1EE4 + }, + { code:0x1EE6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EE6 + ,simpleLowerCaseMapping:0x1EE7 + ,simpleTitleCaseMapping:0x1EE6 + }, + { code:0x1EE7 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EE6 + ,simpleLowerCaseMapping:0x1EE7 + ,simpleTitleCaseMapping:0x1EE6 + }, + { code:0x1EE8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EE8 + ,simpleLowerCaseMapping:0x1EE9 + ,simpleTitleCaseMapping:0x1EE8 + }, + { code:0x1EE9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EE8 + ,simpleLowerCaseMapping:0x1EE9 + ,simpleTitleCaseMapping:0x1EE8 + }, + { code:0x1EEA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EEA + ,simpleLowerCaseMapping:0x1EEB + ,simpleTitleCaseMapping:0x1EEA + }, + { code:0x1EEB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EEA + ,simpleLowerCaseMapping:0x1EEB + ,simpleTitleCaseMapping:0x1EEA + }, + { code:0x1EEC + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EEC + ,simpleLowerCaseMapping:0x1EED + ,simpleTitleCaseMapping:0x1EEC + }, + { code:0x1EED + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EEC + ,simpleLowerCaseMapping:0x1EED + ,simpleTitleCaseMapping:0x1EEC + }, + { code:0x1EEE + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EEE + ,simpleLowerCaseMapping:0x1EEF + ,simpleTitleCaseMapping:0x1EEE + }, + { code:0x1EEF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EEE + ,simpleLowerCaseMapping:0x1EEF + ,simpleTitleCaseMapping:0x1EEE + }, + { code:0x1EF0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EF0 + ,simpleLowerCaseMapping:0x1EF1 + ,simpleTitleCaseMapping:0x1EF0 + }, + { code:0x1EF1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EF0 + ,simpleLowerCaseMapping:0x1EF1 + ,simpleTitleCaseMapping:0x1EF0 + }, + { code:0x1EF2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EF2 + ,simpleLowerCaseMapping:0x1EF3 + ,simpleTitleCaseMapping:0x1EF2 + }, + { code:0x1EF3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EF2 + ,simpleLowerCaseMapping:0x1EF3 + ,simpleTitleCaseMapping:0x1EF2 + }, + { code:0x1EF4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EF4 + ,simpleLowerCaseMapping:0x1EF5 + ,simpleTitleCaseMapping:0x1EF4 + }, + { code:0x1EF5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EF4 + ,simpleLowerCaseMapping:0x1EF5 + ,simpleTitleCaseMapping:0x1EF4 + }, + { code:0x1EF6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EF6 + ,simpleLowerCaseMapping:0x1EF7 + ,simpleTitleCaseMapping:0x1EF6 + }, + { code:0x1EF7 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EF6 + ,simpleLowerCaseMapping:0x1EF7 + ,simpleTitleCaseMapping:0x1EF6 + }, + { code:0x1EF8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1EF8 + ,simpleLowerCaseMapping:0x1EF9 + ,simpleTitleCaseMapping:0x1EF8 + }, + { code:0x1EF9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1EF8 + ,simpleLowerCaseMapping:0x1EF9 + ,simpleTitleCaseMapping:0x1EF8 + }, + { code:0x1F00 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F08 + ,simpleLowerCaseMapping:0x1F00 + ,simpleTitleCaseMapping:0x1F08 + }, + { code:0x1F01 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F09 + ,simpleLowerCaseMapping:0x1F01 + ,simpleTitleCaseMapping:0x1F09 + }, + { code:0x1F02 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F0A + ,simpleLowerCaseMapping:0x1F02 + ,simpleTitleCaseMapping:0x1F0A + }, + { code:0x1F03 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F0B + ,simpleLowerCaseMapping:0x1F03 + ,simpleTitleCaseMapping:0x1F0B + }, + { code:0x1F04 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F0C + ,simpleLowerCaseMapping:0x1F04 + ,simpleTitleCaseMapping:0x1F0C + }, + { code:0x1F05 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F0D + ,simpleLowerCaseMapping:0x1F05 + ,simpleTitleCaseMapping:0x1F0D + }, + { code:0x1F06 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F0E + ,simpleLowerCaseMapping:0x1F06 + ,simpleTitleCaseMapping:0x1F0E + }, + { code:0x1F07 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F0F + ,simpleLowerCaseMapping:0x1F07 + ,simpleTitleCaseMapping:0x1F0F + }, + { code:0x1F08 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F08 + ,simpleLowerCaseMapping:0x1F00 + ,simpleTitleCaseMapping:0x1F08 + }, + { code:0x1F09 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F09 + ,simpleLowerCaseMapping:0x1F01 + ,simpleTitleCaseMapping:0x1F09 + }, + { code:0x1F0A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F0A + ,simpleLowerCaseMapping:0x1F02 + ,simpleTitleCaseMapping:0x1F0A + }, + { code:0x1F0B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F0B + ,simpleLowerCaseMapping:0x1F03 + ,simpleTitleCaseMapping:0x1F0B + }, + { code:0x1F0C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F0C + ,simpleLowerCaseMapping:0x1F04 + ,simpleTitleCaseMapping:0x1F0C + }, + { code:0x1F0D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F0D + ,simpleLowerCaseMapping:0x1F05 + ,simpleTitleCaseMapping:0x1F0D + }, + { code:0x1F0E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F0E + ,simpleLowerCaseMapping:0x1F06 + ,simpleTitleCaseMapping:0x1F0E + }, + { code:0x1F0F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F0F + ,simpleLowerCaseMapping:0x1F07 + ,simpleTitleCaseMapping:0x1F0F + }, + { code:0x1F10 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F18 + ,simpleLowerCaseMapping:0x1F10 + ,simpleTitleCaseMapping:0x1F18 + }, + { code:0x1F11 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F19 + ,simpleLowerCaseMapping:0x1F11 + ,simpleTitleCaseMapping:0x1F19 + }, + { code:0x1F12 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F1A + ,simpleLowerCaseMapping:0x1F12 + ,simpleTitleCaseMapping:0x1F1A + }, + { code:0x1F13 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F1B + ,simpleLowerCaseMapping:0x1F13 + ,simpleTitleCaseMapping:0x1F1B + }, + { code:0x1F14 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F1C + ,simpleLowerCaseMapping:0x1F14 + ,simpleTitleCaseMapping:0x1F1C + }, + { code:0x1F15 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F1D + ,simpleLowerCaseMapping:0x1F15 + ,simpleTitleCaseMapping:0x1F1D + }, + { code:0x1F18 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F18 + ,simpleLowerCaseMapping:0x1F10 + ,simpleTitleCaseMapping:0x1F18 + }, + { code:0x1F19 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F19 + ,simpleLowerCaseMapping:0x1F11 + ,simpleTitleCaseMapping:0x1F19 + }, + { code:0x1F1A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F1A + ,simpleLowerCaseMapping:0x1F12 + ,simpleTitleCaseMapping:0x1F1A + }, + { code:0x1F1B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F1B + ,simpleLowerCaseMapping:0x1F13 + ,simpleTitleCaseMapping:0x1F1B + }, + { code:0x1F1C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F1C + ,simpleLowerCaseMapping:0x1F14 + ,simpleTitleCaseMapping:0x1F1C + }, + { code:0x1F1D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F1D + ,simpleLowerCaseMapping:0x1F15 + ,simpleTitleCaseMapping:0x1F1D + }, + { code:0x1F20 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F28 + ,simpleLowerCaseMapping:0x1F20 + ,simpleTitleCaseMapping:0x1F28 + }, + { code:0x1F21 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F29 + ,simpleLowerCaseMapping:0x1F21 + ,simpleTitleCaseMapping:0x1F29 + }, + { code:0x1F22 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F2A + ,simpleLowerCaseMapping:0x1F22 + ,simpleTitleCaseMapping:0x1F2A + }, + { code:0x1F23 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F2B + ,simpleLowerCaseMapping:0x1F23 + ,simpleTitleCaseMapping:0x1F2B + }, + { code:0x1F24 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F2C + ,simpleLowerCaseMapping:0x1F24 + ,simpleTitleCaseMapping:0x1F2C + }, + { code:0x1F25 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F2D + ,simpleLowerCaseMapping:0x1F25 + ,simpleTitleCaseMapping:0x1F2D + }, + { code:0x1F26 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F2E + ,simpleLowerCaseMapping:0x1F26 + ,simpleTitleCaseMapping:0x1F2E + }, + { code:0x1F27 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F2F + ,simpleLowerCaseMapping:0x1F27 + ,simpleTitleCaseMapping:0x1F2F + }, + { code:0x1F28 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F28 + ,simpleLowerCaseMapping:0x1F20 + ,simpleTitleCaseMapping:0x1F28 + }, + { code:0x1F29 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F29 + ,simpleLowerCaseMapping:0x1F21 + ,simpleTitleCaseMapping:0x1F29 + }, + { code:0x1F2A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F2A + ,simpleLowerCaseMapping:0x1F22 + ,simpleTitleCaseMapping:0x1F2A + }, + { code:0x1F2B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F2B + ,simpleLowerCaseMapping:0x1F23 + ,simpleTitleCaseMapping:0x1F2B + }, + { code:0x1F2C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F2C + ,simpleLowerCaseMapping:0x1F24 + ,simpleTitleCaseMapping:0x1F2C + }, + { code:0x1F2D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F2D + ,simpleLowerCaseMapping:0x1F25 + ,simpleTitleCaseMapping:0x1F2D + }, + { code:0x1F2E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F2E + ,simpleLowerCaseMapping:0x1F26 + ,simpleTitleCaseMapping:0x1F2E + }, + { code:0x1F2F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F2F + ,simpleLowerCaseMapping:0x1F27 + ,simpleTitleCaseMapping:0x1F2F + }, + { code:0x1F30 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F38 + ,simpleLowerCaseMapping:0x1F30 + ,simpleTitleCaseMapping:0x1F38 + }, + { code:0x1F31 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F39 + ,simpleLowerCaseMapping:0x1F31 + ,simpleTitleCaseMapping:0x1F39 + }, + { code:0x1F32 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F3A + ,simpleLowerCaseMapping:0x1F32 + ,simpleTitleCaseMapping:0x1F3A + }, + { code:0x1F33 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F3B + ,simpleLowerCaseMapping:0x1F33 + ,simpleTitleCaseMapping:0x1F3B + }, + { code:0x1F34 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F3C + ,simpleLowerCaseMapping:0x1F34 + ,simpleTitleCaseMapping:0x1F3C + }, + { code:0x1F35 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F3D + ,simpleLowerCaseMapping:0x1F35 + ,simpleTitleCaseMapping:0x1F3D + }, + { code:0x1F36 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F3E + ,simpleLowerCaseMapping:0x1F36 + ,simpleTitleCaseMapping:0x1F3E + }, + { code:0x1F37 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F3F + ,simpleLowerCaseMapping:0x1F37 + ,simpleTitleCaseMapping:0x1F3F + }, + { code:0x1F38 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F38 + ,simpleLowerCaseMapping:0x1F30 + ,simpleTitleCaseMapping:0x1F38 + }, + { code:0x1F39 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F39 + ,simpleLowerCaseMapping:0x1F31 + ,simpleTitleCaseMapping:0x1F39 + }, + { code:0x1F3A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F3A + ,simpleLowerCaseMapping:0x1F32 + ,simpleTitleCaseMapping:0x1F3A + }, + { code:0x1F3B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F3B + ,simpleLowerCaseMapping:0x1F33 + ,simpleTitleCaseMapping:0x1F3B + }, + { code:0x1F3C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F3C + ,simpleLowerCaseMapping:0x1F34 + ,simpleTitleCaseMapping:0x1F3C + }, + { code:0x1F3D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F3D + ,simpleLowerCaseMapping:0x1F35 + ,simpleTitleCaseMapping:0x1F3D + }, + { code:0x1F3E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F3E + ,simpleLowerCaseMapping:0x1F36 + ,simpleTitleCaseMapping:0x1F3E + }, + { code:0x1F3F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F3F + ,simpleLowerCaseMapping:0x1F37 + ,simpleTitleCaseMapping:0x1F3F + }, + { code:0x1F40 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F48 + ,simpleLowerCaseMapping:0x1F40 + ,simpleTitleCaseMapping:0x1F48 + }, + { code:0x1F41 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F49 + ,simpleLowerCaseMapping:0x1F41 + ,simpleTitleCaseMapping:0x1F49 + }, + { code:0x1F42 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F4A + ,simpleLowerCaseMapping:0x1F42 + ,simpleTitleCaseMapping:0x1F4A + }, + { code:0x1F43 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F4B + ,simpleLowerCaseMapping:0x1F43 + ,simpleTitleCaseMapping:0x1F4B + }, + { code:0x1F44 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F4C + ,simpleLowerCaseMapping:0x1F44 + ,simpleTitleCaseMapping:0x1F4C + }, + { code:0x1F45 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F4D + ,simpleLowerCaseMapping:0x1F45 + ,simpleTitleCaseMapping:0x1F4D + }, + { code:0x1F48 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F48 + ,simpleLowerCaseMapping:0x1F40 + ,simpleTitleCaseMapping:0x1F48 + }, + { code:0x1F49 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F49 + ,simpleLowerCaseMapping:0x1F41 + ,simpleTitleCaseMapping:0x1F49 + }, + { code:0x1F4A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F4A + ,simpleLowerCaseMapping:0x1F42 + ,simpleTitleCaseMapping:0x1F4A + }, + { code:0x1F4B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F4B + ,simpleLowerCaseMapping:0x1F43 + ,simpleTitleCaseMapping:0x1F4B + }, + { code:0x1F4C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F4C + ,simpleLowerCaseMapping:0x1F44 + ,simpleTitleCaseMapping:0x1F4C + }, + { code:0x1F4D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F4D + ,simpleLowerCaseMapping:0x1F45 + ,simpleTitleCaseMapping:0x1F4D + }, + { code:0x1F50 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F50 + ,simpleLowerCaseMapping:0x1F50 + ,simpleTitleCaseMapping:0x1F50 + }, + { code:0x1F51 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F59 + ,simpleLowerCaseMapping:0x1F51 + ,simpleTitleCaseMapping:0x1F59 + }, + { code:0x1F52 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F52 + ,simpleLowerCaseMapping:0x1F52 + ,simpleTitleCaseMapping:0x1F52 + }, + { code:0x1F53 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F5B + ,simpleLowerCaseMapping:0x1F53 + ,simpleTitleCaseMapping:0x1F5B + }, + { code:0x1F54 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F54 + ,simpleLowerCaseMapping:0x1F54 + ,simpleTitleCaseMapping:0x1F54 + }, + { code:0x1F55 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F5D + ,simpleLowerCaseMapping:0x1F55 + ,simpleTitleCaseMapping:0x1F5D + }, + { code:0x1F56 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F56 + ,simpleLowerCaseMapping:0x1F56 + ,simpleTitleCaseMapping:0x1F56 + }, + { code:0x1F57 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F5F + ,simpleLowerCaseMapping:0x1F57 + ,simpleTitleCaseMapping:0x1F5F + }, + { code:0x1F59 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F59 + ,simpleLowerCaseMapping:0x1F51 + ,simpleTitleCaseMapping:0x1F59 + }, + { code:0x1F5B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F5B + ,simpleLowerCaseMapping:0x1F53 + ,simpleTitleCaseMapping:0x1F5B + }, + { code:0x1F5D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F5D + ,simpleLowerCaseMapping:0x1F55 + ,simpleTitleCaseMapping:0x1F5D + }, + { code:0x1F5F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F5F + ,simpleLowerCaseMapping:0x1F57 + ,simpleTitleCaseMapping:0x1F5F + }, + { code:0x1F60 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F68 + ,simpleLowerCaseMapping:0x1F60 + ,simpleTitleCaseMapping:0x1F68 + }, + { code:0x1F61 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F69 + ,simpleLowerCaseMapping:0x1F61 + ,simpleTitleCaseMapping:0x1F69 + }, + { code:0x1F62 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F6A + ,simpleLowerCaseMapping:0x1F62 + ,simpleTitleCaseMapping:0x1F6A + }, + { code:0x1F63 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F6B + ,simpleLowerCaseMapping:0x1F63 + ,simpleTitleCaseMapping:0x1F6B + }, + { code:0x1F64 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F6C + ,simpleLowerCaseMapping:0x1F64 + ,simpleTitleCaseMapping:0x1F6C + }, + { code:0x1F65 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F6D + ,simpleLowerCaseMapping:0x1F65 + ,simpleTitleCaseMapping:0x1F6D + }, + { code:0x1F66 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F6E + ,simpleLowerCaseMapping:0x1F66 + ,simpleTitleCaseMapping:0x1F6E + }, + { code:0x1F67 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1F6F + ,simpleLowerCaseMapping:0x1F67 + ,simpleTitleCaseMapping:0x1F6F + }, + { code:0x1F68 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F68 + ,simpleLowerCaseMapping:0x1F60 + ,simpleTitleCaseMapping:0x1F68 + }, + { code:0x1F69 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F69 + ,simpleLowerCaseMapping:0x1F61 + ,simpleTitleCaseMapping:0x1F69 + }, + { code:0x1F6A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F6A + ,simpleLowerCaseMapping:0x1F62 + ,simpleTitleCaseMapping:0x1F6A + }, + { code:0x1F6B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F6B + ,simpleLowerCaseMapping:0x1F63 + ,simpleTitleCaseMapping:0x1F6B + }, + { code:0x1F6C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F6C + ,simpleLowerCaseMapping:0x1F64 + ,simpleTitleCaseMapping:0x1F6C + }, + { code:0x1F6D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F6D + ,simpleLowerCaseMapping:0x1F65 + ,simpleTitleCaseMapping:0x1F6D + }, + { code:0x1F6E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F6E + ,simpleLowerCaseMapping:0x1F66 + ,simpleTitleCaseMapping:0x1F6E + }, + { code:0x1F6F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1F6F + ,simpleLowerCaseMapping:0x1F67 + ,simpleTitleCaseMapping:0x1F6F + }, + { code:0x1F70 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1FBA + ,simpleLowerCaseMapping:0x1F70 + ,simpleTitleCaseMapping:0x1FBA + }, + { code:0x1F71 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1FBB + ,simpleLowerCaseMapping:0x1F71 + ,simpleTitleCaseMapping:0x1FBB + }, + { code:0x1F72 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1FC8 + ,simpleLowerCaseMapping:0x1F72 + ,simpleTitleCaseMapping:0x1FC8 + }, + { code:0x1F73 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1FC9 + ,simpleLowerCaseMapping:0x1F73 + ,simpleTitleCaseMapping:0x1FC9 + }, + { code:0x1F74 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1FCA + ,simpleLowerCaseMapping:0x1F74 + ,simpleTitleCaseMapping:0x1FCA + }, + { code:0x1F75 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1FCB + ,simpleLowerCaseMapping:0x1F75 + ,simpleTitleCaseMapping:0x1FCB + }, + { code:0x1F76 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1FDA + ,simpleLowerCaseMapping:0x1F76 + ,simpleTitleCaseMapping:0x1FDA + }, + { code:0x1F77 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1FDB + ,simpleLowerCaseMapping:0x1F77 + ,simpleTitleCaseMapping:0x1FDB + }, + { code:0x1F78 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1FF8 + ,simpleLowerCaseMapping:0x1F78 + ,simpleTitleCaseMapping:0x1FF8 + }, + { code:0x1F79 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1FF9 + ,simpleLowerCaseMapping:0x1F79 + ,simpleTitleCaseMapping:0x1FF9 + }, + { code:0x1F7A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1FEA + ,simpleLowerCaseMapping:0x1F7A + ,simpleTitleCaseMapping:0x1FEA + }, + { code:0x1F7B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1FEB + ,simpleLowerCaseMapping:0x1F7B + ,simpleTitleCaseMapping:0x1FEB + }, + { code:0x1F7C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1FFA + ,simpleLowerCaseMapping:0x1F7C + ,simpleTitleCaseMapping:0x1FFA + }, + { code:0x1F7D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1FFB + ,simpleLowerCaseMapping:0x1F7D + ,simpleTitleCaseMapping:0x1FFB + }, + { code:0x1F80 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F88 + ,simpleLowerCaseMapping:0x1F80 + ,simpleTitleCaseMapping:0x1F88 + }, + { code:0x1F81 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F89 + ,simpleLowerCaseMapping:0x1F81 + ,simpleTitleCaseMapping:0x1F89 + }, + { code:0x1F82 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F8A + ,simpleLowerCaseMapping:0x1F82 + ,simpleTitleCaseMapping:0x1F8A + }, + { code:0x1F83 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F8B + ,simpleLowerCaseMapping:0x1F83 + ,simpleTitleCaseMapping:0x1F8B + }, + { code:0x1F84 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F8C + ,simpleLowerCaseMapping:0x1F84 + ,simpleTitleCaseMapping:0x1F8C + }, + { code:0x1F85 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F8D + ,simpleLowerCaseMapping:0x1F85 + ,simpleTitleCaseMapping:0x1F8D + }, + { code:0x1F86 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F8E + ,simpleLowerCaseMapping:0x1F86 + ,simpleTitleCaseMapping:0x1F8E + }, + { code:0x1F87 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F8F + ,simpleLowerCaseMapping:0x1F87 + ,simpleTitleCaseMapping:0x1F8F + }, + { code:0x1F88 + ,generalCategory:UnicodeData.GeneralCategory.Lt | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F88 + ,simpleLowerCaseMapping:0x1F80 + ,simpleTitleCaseMapping:0x1F88 + }, + { code:0x1F89 + ,generalCategory:UnicodeData.GeneralCategory.Lt | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F89 + ,simpleLowerCaseMapping:0x1F81 + ,simpleTitleCaseMapping:0x1F89 + }, + { code:0x1F8A + ,generalCategory:UnicodeData.GeneralCategory.Lt | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F8A + ,simpleLowerCaseMapping:0x1F82 + ,simpleTitleCaseMapping:0x1F8A + }, + { code:0x1F8B + ,generalCategory:UnicodeData.GeneralCategory.Lt | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F8B + ,simpleLowerCaseMapping:0x1F83 + ,simpleTitleCaseMapping:0x1F8B + }, + { code:0x1F8C + ,generalCategory:UnicodeData.GeneralCategory.Lt | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F8C + ,simpleLowerCaseMapping:0x1F84 + ,simpleTitleCaseMapping:0x1F8C + }, + { code:0x1F8D + ,generalCategory:UnicodeData.GeneralCategory.Lt | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F8D + ,simpleLowerCaseMapping:0x1F85 + ,simpleTitleCaseMapping:0x1F8D + }, + { code:0x1F8E + ,generalCategory:UnicodeData.GeneralCategory.Lt | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F8E + ,simpleLowerCaseMapping:0x1F86 + ,simpleTitleCaseMapping:0x1F8E + }, + { code:0x1F8F + ,generalCategory:UnicodeData.GeneralCategory.Lt | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F8F + ,simpleLowerCaseMapping:0x1F87 + ,simpleTitleCaseMapping:0x1F8F + }, + { code:0x1F90 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F98 + ,simpleLowerCaseMapping:0x1F90 + ,simpleTitleCaseMapping:0x1F98 + }, + { code:0x1F91 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F99 + ,simpleLowerCaseMapping:0x1F91 + ,simpleTitleCaseMapping:0x1F99 + }, + { code:0x1F92 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F9A + ,simpleLowerCaseMapping:0x1F92 + ,simpleTitleCaseMapping:0x1F9A + }, + { code:0x1F93 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F9B + ,simpleLowerCaseMapping:0x1F93 + ,simpleTitleCaseMapping:0x1F9B + }, + { code:0x1F94 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F9C + ,simpleLowerCaseMapping:0x1F94 + ,simpleTitleCaseMapping:0x1F9C + }, + { code:0x1F95 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F9D + ,simpleLowerCaseMapping:0x1F95 + ,simpleTitleCaseMapping:0x1F9D + }, + { code:0x1F96 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F9E + ,simpleLowerCaseMapping:0x1F96 + ,simpleTitleCaseMapping:0x1F9E + }, + { code:0x1F97 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F9F + ,simpleLowerCaseMapping:0x1F97 + ,simpleTitleCaseMapping:0x1F9F + }, + { code:0x1F98 + ,generalCategory:UnicodeData.GeneralCategory.Lt | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F98 + ,simpleLowerCaseMapping:0x1F90 + ,simpleTitleCaseMapping:0x1F98 + }, + { code:0x1F99 + ,generalCategory:UnicodeData.GeneralCategory.Lt | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F99 + ,simpleLowerCaseMapping:0x1F91 + ,simpleTitleCaseMapping:0x1F99 + }, + { code:0x1F9A + ,generalCategory:UnicodeData.GeneralCategory.Lt | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F9A + ,simpleLowerCaseMapping:0x1F92 + ,simpleTitleCaseMapping:0x1F9A + }, + { code:0x1F9B + ,generalCategory:UnicodeData.GeneralCategory.Lt | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F9B + ,simpleLowerCaseMapping:0x1F93 + ,simpleTitleCaseMapping:0x1F9B + }, + { code:0x1F9C + ,generalCategory:UnicodeData.GeneralCategory.Lt | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F9C + ,simpleLowerCaseMapping:0x1F94 + ,simpleTitleCaseMapping:0x1F9C + }, + { code:0x1F9D + ,generalCategory:UnicodeData.GeneralCategory.Lt | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F9D + ,simpleLowerCaseMapping:0x1F95 + ,simpleTitleCaseMapping:0x1F9D + }, + { code:0x1F9E + ,generalCategory:UnicodeData.GeneralCategory.Lt | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F9E + ,simpleLowerCaseMapping:0x1F96 + ,simpleTitleCaseMapping:0x1F9E + }, + { code:0x1F9F + ,generalCategory:UnicodeData.GeneralCategory.Lt | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1F9F + ,simpleLowerCaseMapping:0x1F97 + ,simpleTitleCaseMapping:0x1F9F + }, + { code:0x1FA0 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FA8 + ,simpleLowerCaseMapping:0x1FA0 + ,simpleTitleCaseMapping:0x1FA8 + }, + { code:0x1FA1 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FA9 + ,simpleLowerCaseMapping:0x1FA1 + ,simpleTitleCaseMapping:0x1FA9 + }, + { code:0x1FA2 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FAA + ,simpleLowerCaseMapping:0x1FA2 + ,simpleTitleCaseMapping:0x1FAA + }, + { code:0x1FA3 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FAB + ,simpleLowerCaseMapping:0x1FA3 + ,simpleTitleCaseMapping:0x1FAB + }, + { code:0x1FA4 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FAC + ,simpleLowerCaseMapping:0x1FA4 + ,simpleTitleCaseMapping:0x1FAC + }, + { code:0x1FA5 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FAD + ,simpleLowerCaseMapping:0x1FA5 + ,simpleTitleCaseMapping:0x1FAD + }, + { code:0x1FA6 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FAE + ,simpleLowerCaseMapping:0x1FA6 + ,simpleTitleCaseMapping:0x1FAE + }, + { code:0x1FA7 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FAF + ,simpleLowerCaseMapping:0x1FA7 + ,simpleTitleCaseMapping:0x1FAF + }, + { code:0x1FA8 + ,generalCategory:UnicodeData.GeneralCategory.Lt | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FA8 + ,simpleLowerCaseMapping:0x1FA0 + ,simpleTitleCaseMapping:0x1FA8 + }, + { code:0x1FA9 + ,generalCategory:UnicodeData.GeneralCategory.Lt | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FA9 + ,simpleLowerCaseMapping:0x1FA1 + ,simpleTitleCaseMapping:0x1FA9 + }, + { code:0x1FAA + ,generalCategory:UnicodeData.GeneralCategory.Lt | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FAA + ,simpleLowerCaseMapping:0x1FA2 + ,simpleTitleCaseMapping:0x1FAA + }, + { code:0x1FAB + ,generalCategory:UnicodeData.GeneralCategory.Lt | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FAB + ,simpleLowerCaseMapping:0x1FA3 + ,simpleTitleCaseMapping:0x1FAB + }, + { code:0x1FAC + ,generalCategory:UnicodeData.GeneralCategory.Lt | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FAC + ,simpleLowerCaseMapping:0x1FA4 + ,simpleTitleCaseMapping:0x1FAC + }, + { code:0x1FAD + ,generalCategory:UnicodeData.GeneralCategory.Lt | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FAD + ,simpleLowerCaseMapping:0x1FA5 + ,simpleTitleCaseMapping:0x1FAD + }, + { code:0x1FAE + ,generalCategory:UnicodeData.GeneralCategory.Lt | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FAE + ,simpleLowerCaseMapping:0x1FA6 + ,simpleTitleCaseMapping:0x1FAE + }, + { code:0x1FAF + ,generalCategory:UnicodeData.GeneralCategory.Lt | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FAF + ,simpleLowerCaseMapping:0x1FA7 + ,simpleTitleCaseMapping:0x1FAF + }, + { code:0x1FB0 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1FB8 + ,simpleLowerCaseMapping:0x1FB0 + ,simpleTitleCaseMapping:0x1FB8 + }, + { code:0x1FB1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1FB9 + ,simpleLowerCaseMapping:0x1FB1 + ,simpleTitleCaseMapping:0x1FB9 + }, + { code:0x1FB2 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FB2 + ,simpleLowerCaseMapping:0x1FB2 + ,simpleTitleCaseMapping:0x1FB2 + }, + { code:0x1FB3 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FBC + ,simpleLowerCaseMapping:0x1FB3 + ,simpleTitleCaseMapping:0x1FBC + }, + { code:0x1FB4 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FB4 + ,simpleLowerCaseMapping:0x1FB4 + ,simpleTitleCaseMapping:0x1FB4 + }, + { code:0x1FB6 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FB6 + ,simpleLowerCaseMapping:0x1FB6 + ,simpleTitleCaseMapping:0x1FB6 + }, + { code:0x1FB7 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FB7 + ,simpleLowerCaseMapping:0x1FB7 + ,simpleTitleCaseMapping:0x1FB7 + }, + { code:0x1FB8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1FB8 + ,simpleLowerCaseMapping:0x1FB0 + ,simpleTitleCaseMapping:0x1FB8 + }, + { code:0x1FB9 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1FB9 + ,simpleLowerCaseMapping:0x1FB1 + ,simpleTitleCaseMapping:0x1FB9 + }, + { code:0x1FBA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1FBA + ,simpleLowerCaseMapping:0x1F70 + ,simpleTitleCaseMapping:0x1FBA + }, + { code:0x1FBB + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1FBB + ,simpleLowerCaseMapping:0x1F71 + ,simpleTitleCaseMapping:0x1FBB + }, + { code:0x1FBC + ,generalCategory:UnicodeData.GeneralCategory.Lt | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FBC + ,simpleLowerCaseMapping:0x1FB3 + ,simpleTitleCaseMapping:0x1FBC + }, + { code:0x1FBD + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x1FBD + ,simpleLowerCaseMapping:0x1FBD + ,simpleTitleCaseMapping:0x1FBD + }, + { code:0x1FBE + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x0399 + ,simpleLowerCaseMapping:0x1FBE + ,simpleTitleCaseMapping:0x0399 + }, + { code:0x1FBF + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x1FBF + ,simpleLowerCaseMapping:0x1FBF + ,simpleTitleCaseMapping:0x1FBF + }, + { code:0x1FC0 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x1FC0 + ,simpleLowerCaseMapping:0x1FC0 + ,simpleTitleCaseMapping:0x1FC0 + }, + { code:0x1FC1 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x1FC1 + ,simpleLowerCaseMapping:0x1FC1 + ,simpleTitleCaseMapping:0x1FC1 + }, + { code:0x1FC2 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FC2 + ,simpleLowerCaseMapping:0x1FC2 + ,simpleTitleCaseMapping:0x1FC2 + }, + { code:0x1FC3 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FCC + ,simpleLowerCaseMapping:0x1FC3 + ,simpleTitleCaseMapping:0x1FCC + }, + { code:0x1FC4 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FC4 + ,simpleLowerCaseMapping:0x1FC4 + ,simpleTitleCaseMapping:0x1FC4 + }, + { code:0x1FC6 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FC6 + ,simpleLowerCaseMapping:0x1FC6 + ,simpleTitleCaseMapping:0x1FC6 + }, + { code:0x1FC7 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FC7 + ,simpleLowerCaseMapping:0x1FC7 + ,simpleTitleCaseMapping:0x1FC7 + }, + { code:0x1FC8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1FC8 + ,simpleLowerCaseMapping:0x1F72 + ,simpleTitleCaseMapping:0x1FC8 + }, + { code:0x1FC9 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1FC9 + ,simpleLowerCaseMapping:0x1F73 + ,simpleTitleCaseMapping:0x1FC9 + }, + { code:0x1FCA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1FCA + ,simpleLowerCaseMapping:0x1F74 + ,simpleTitleCaseMapping:0x1FCA + }, + { code:0x1FCB + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1FCB + ,simpleLowerCaseMapping:0x1F75 + ,simpleTitleCaseMapping:0x1FCB + }, + { code:0x1FCC + ,generalCategory:UnicodeData.GeneralCategory.Lt | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FCC + ,simpleLowerCaseMapping:0x1FC3 + ,simpleTitleCaseMapping:0x1FCC + }, + { code:0x1FCD + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x1FCD + ,simpleLowerCaseMapping:0x1FCD + ,simpleTitleCaseMapping:0x1FCD + }, + { code:0x1FCE + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x1FCE + ,simpleLowerCaseMapping:0x1FCE + ,simpleTitleCaseMapping:0x1FCE + }, + { code:0x1FCF + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x1FCF + ,simpleLowerCaseMapping:0x1FCF + ,simpleTitleCaseMapping:0x1FCF + }, + { code:0x1FD0 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1FD8 + ,simpleLowerCaseMapping:0x1FD0 + ,simpleTitleCaseMapping:0x1FD8 + }, + { code:0x1FD1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1FD9 + ,simpleLowerCaseMapping:0x1FD1 + ,simpleTitleCaseMapping:0x1FD9 + }, + { code:0x1FD2 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FD2 + ,simpleLowerCaseMapping:0x1FD2 + ,simpleTitleCaseMapping:0x1FD2 + }, + { code:0x1FD3 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FD3 + ,simpleLowerCaseMapping:0x1FD3 + ,simpleTitleCaseMapping:0x1FD3 + }, + { code:0x1FD6 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FD6 + ,simpleLowerCaseMapping:0x1FD6 + ,simpleTitleCaseMapping:0x1FD6 + }, + { code:0x1FD7 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FD7 + ,simpleLowerCaseMapping:0x1FD7 + ,simpleTitleCaseMapping:0x1FD7 + }, + { code:0x1FD8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1FD8 + ,simpleLowerCaseMapping:0x1FD0 + ,simpleTitleCaseMapping:0x1FD8 + }, + { code:0x1FD9 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1FD9 + ,simpleLowerCaseMapping:0x1FD1 + ,simpleTitleCaseMapping:0x1FD9 + }, + { code:0x1FDA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1FDA + ,simpleLowerCaseMapping:0x1F76 + ,simpleTitleCaseMapping:0x1FDA + }, + { code:0x1FDB + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1FDB + ,simpleLowerCaseMapping:0x1F77 + ,simpleTitleCaseMapping:0x1FDB + }, + { code:0x1FDD + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x1FDD + ,simpleLowerCaseMapping:0x1FDD + ,simpleTitleCaseMapping:0x1FDD + }, + { code:0x1FDE + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x1FDE + ,simpleLowerCaseMapping:0x1FDE + ,simpleTitleCaseMapping:0x1FDE + }, + { code:0x1FDF + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x1FDF + ,simpleLowerCaseMapping:0x1FDF + ,simpleTitleCaseMapping:0x1FDF + }, + { code:0x1FE0 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1FE8 + ,simpleLowerCaseMapping:0x1FE0 + ,simpleTitleCaseMapping:0x1FE8 + }, + { code:0x1FE1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1FE9 + ,simpleLowerCaseMapping:0x1FE1 + ,simpleTitleCaseMapping:0x1FE9 + }, + { code:0x1FE2 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FE2 + ,simpleLowerCaseMapping:0x1FE2 + ,simpleTitleCaseMapping:0x1FE2 + }, + { code:0x1FE3 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FE3 + ,simpleLowerCaseMapping:0x1FE3 + ,simpleTitleCaseMapping:0x1FE3 + }, + { code:0x1FE4 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FE4 + ,simpleLowerCaseMapping:0x1FE4 + ,simpleTitleCaseMapping:0x1FE4 + }, + { code:0x1FE5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1FEC + ,simpleLowerCaseMapping:0x1FE5 + ,simpleTitleCaseMapping:0x1FEC + }, + { code:0x1FE6 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FE6 + ,simpleLowerCaseMapping:0x1FE6 + ,simpleTitleCaseMapping:0x1FE6 + }, + { code:0x1FE7 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FE7 + ,simpleLowerCaseMapping:0x1FE7 + ,simpleTitleCaseMapping:0x1FE7 + }, + { code:0x1FE8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1FE8 + ,simpleLowerCaseMapping:0x1FE0 + ,simpleTitleCaseMapping:0x1FE8 + }, + { code:0x1FE9 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1FE9 + ,simpleLowerCaseMapping:0x1FE1 + ,simpleTitleCaseMapping:0x1FE9 + }, + { code:0x1FEA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1FEA + ,simpleLowerCaseMapping:0x1F7A + ,simpleTitleCaseMapping:0x1FEA + }, + { code:0x1FEB + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1FEB + ,simpleLowerCaseMapping:0x1F7B + ,simpleTitleCaseMapping:0x1FEB + }, + { code:0x1FEC + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1FEC + ,simpleLowerCaseMapping:0x1FE5 + ,simpleTitleCaseMapping:0x1FEC + }, + { code:0x1FED + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x1FED + ,simpleLowerCaseMapping:0x1FED + ,simpleTitleCaseMapping:0x1FED + }, + { code:0x1FEE + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x1FEE + ,simpleLowerCaseMapping:0x1FEE + ,simpleTitleCaseMapping:0x1FEE + }, + { code:0x1FEF + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x1FEF + ,simpleLowerCaseMapping:0x1FEF + ,simpleTitleCaseMapping:0x1FEF + }, + { code:0x1FF2 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FF2 + ,simpleLowerCaseMapping:0x1FF2 + ,simpleTitleCaseMapping:0x1FF2 + }, + { code:0x1FF3 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FFC + ,simpleLowerCaseMapping:0x1FF3 + ,simpleTitleCaseMapping:0x1FFC + }, + { code:0x1FF4 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FF4 + ,simpleLowerCaseMapping:0x1FF4 + ,simpleTitleCaseMapping:0x1FF4 + }, + { code:0x1FF6 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FF6 + ,simpleLowerCaseMapping:0x1FF6 + ,simpleTitleCaseMapping:0x1FF6 + }, + { code:0x1FF7 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FF7 + ,simpleLowerCaseMapping:0x1FF7 + ,simpleTitleCaseMapping:0x1FF7 + }, + { code:0x1FF8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1FF8 + ,simpleLowerCaseMapping:0x1F78 + ,simpleTitleCaseMapping:0x1FF8 + }, + { code:0x1FF9 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1FF9 + ,simpleLowerCaseMapping:0x1F79 + ,simpleTitleCaseMapping:0x1FF9 + }, + { code:0x1FFA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1FFA + ,simpleLowerCaseMapping:0x1F7C + ,simpleTitleCaseMapping:0x1FFA + }, + { code:0x1FFB + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1FFB + ,simpleLowerCaseMapping:0x1F7D + ,simpleTitleCaseMapping:0x1FFB + }, + { code:0x1FFC + ,generalCategory:UnicodeData.GeneralCategory.Lt | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0x1FFC + ,simpleLowerCaseMapping:0x1FF3 + ,simpleTitleCaseMapping:0x1FFC + }, + { code:0x1FFD + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x1FFD + ,simpleLowerCaseMapping:0x1FFD + ,simpleTitleCaseMapping:0x1FFD + }, + { code:0x1FFE + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x1FFE + ,simpleLowerCaseMapping:0x1FFE + ,simpleTitleCaseMapping:0x1FFE + }, + { code:0x2000 + ,generalCategory:UnicodeData.GeneralCategory.Zs + ,simpleUpperCaseMapping:0x2000 + ,simpleLowerCaseMapping:0x2000 + ,simpleTitleCaseMapping:0x2000 + }, + { code:0x2001 + ,generalCategory:UnicodeData.GeneralCategory.Zs + ,simpleUpperCaseMapping:0x2001 + ,simpleLowerCaseMapping:0x2001 + ,simpleTitleCaseMapping:0x2001 + }, + { code:0x2002 + ,generalCategory:UnicodeData.GeneralCategory.Zs + ,simpleUpperCaseMapping:0x2002 + ,simpleLowerCaseMapping:0x2002 + ,simpleTitleCaseMapping:0x2002 + }, + { code:0x2003 + ,generalCategory:UnicodeData.GeneralCategory.Zs + ,simpleUpperCaseMapping:0x2003 + ,simpleLowerCaseMapping:0x2003 + ,simpleTitleCaseMapping:0x2003 + }, + { code:0x2004 + ,generalCategory:UnicodeData.GeneralCategory.Zs + ,simpleUpperCaseMapping:0x2004 + ,simpleLowerCaseMapping:0x2004 + ,simpleTitleCaseMapping:0x2004 + }, + { code:0x2005 + ,generalCategory:UnicodeData.GeneralCategory.Zs + ,simpleUpperCaseMapping:0x2005 + ,simpleLowerCaseMapping:0x2005 + ,simpleTitleCaseMapping:0x2005 + }, + { code:0x2006 + ,generalCategory:UnicodeData.GeneralCategory.Zs + ,simpleUpperCaseMapping:0x2006 + ,simpleLowerCaseMapping:0x2006 + ,simpleTitleCaseMapping:0x2006 + }, + { code:0x2007 + ,generalCategory:UnicodeData.GeneralCategory.Zs + ,simpleUpperCaseMapping:0x2007 + ,simpleLowerCaseMapping:0x2007 + ,simpleTitleCaseMapping:0x2007 + }, + { code:0x2008 + ,generalCategory:UnicodeData.GeneralCategory.Zs + ,simpleUpperCaseMapping:0x2008 + ,simpleLowerCaseMapping:0x2008 + ,simpleTitleCaseMapping:0x2008 + }, + { code:0x2009 + ,generalCategory:UnicodeData.GeneralCategory.Zs + ,simpleUpperCaseMapping:0x2009 + ,simpleLowerCaseMapping:0x2009 + ,simpleTitleCaseMapping:0x2009 + }, + { code:0x200A + ,generalCategory:UnicodeData.GeneralCategory.Zs + ,simpleUpperCaseMapping:0x200A + ,simpleLowerCaseMapping:0x200A + ,simpleTitleCaseMapping:0x200A + }, + { code:0x200B + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x200B + ,simpleLowerCaseMapping:0x200B + ,simpleTitleCaseMapping:0x200B + }, + { code:0x200C + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x200C + ,simpleLowerCaseMapping:0x200C + ,simpleTitleCaseMapping:0x200C + }, + { code:0x200D + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x200D + ,simpleLowerCaseMapping:0x200D + ,simpleTitleCaseMapping:0x200D + }, + { code:0x200E + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x200E + ,simpleLowerCaseMapping:0x200E + ,simpleTitleCaseMapping:0x200E + }, + { code:0x200F + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x200F + ,simpleLowerCaseMapping:0x200F + ,simpleTitleCaseMapping:0x200F + }, + { code:0x2010 + ,generalCategory:UnicodeData.GeneralCategory.Pd + ,simpleUpperCaseMapping:0x2010 + ,simpleLowerCaseMapping:0x2010 + ,simpleTitleCaseMapping:0x2010 + }, + { code:0x2011 + ,generalCategory:UnicodeData.GeneralCategory.Pd + ,simpleUpperCaseMapping:0x2011 + ,simpleLowerCaseMapping:0x2011 + ,simpleTitleCaseMapping:0x2011 + }, + { code:0x2012 + ,generalCategory:UnicodeData.GeneralCategory.Pd + ,simpleUpperCaseMapping:0x2012 + ,simpleLowerCaseMapping:0x2012 + ,simpleTitleCaseMapping:0x2012 + }, + { code:0x2013 + ,generalCategory:UnicodeData.GeneralCategory.Pd + ,simpleUpperCaseMapping:0x2013 + ,simpleLowerCaseMapping:0x2013 + ,simpleTitleCaseMapping:0x2013 + }, + { code:0x2014 + ,generalCategory:UnicodeData.GeneralCategory.Pd + ,simpleUpperCaseMapping:0x2014 + ,simpleLowerCaseMapping:0x2014 + ,simpleTitleCaseMapping:0x2014 + }, + { code:0x2015 + ,generalCategory:UnicodeData.GeneralCategory.Pd + ,simpleUpperCaseMapping:0x2015 + ,simpleLowerCaseMapping:0x2015 + ,simpleTitleCaseMapping:0x2015 + }, + { code:0x2016 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2016 + ,simpleLowerCaseMapping:0x2016 + ,simpleTitleCaseMapping:0x2016 + }, + { code:0x2017 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2017 + ,simpleLowerCaseMapping:0x2017 + ,simpleTitleCaseMapping:0x2017 + }, + { code:0x2018 + ,generalCategory:UnicodeData.GeneralCategory.Pi + ,simpleUpperCaseMapping:0x2018 + ,simpleLowerCaseMapping:0x2018 + ,simpleTitleCaseMapping:0x2018 + }, + { code:0x2019 + ,generalCategory:UnicodeData.GeneralCategory.Pf + ,simpleUpperCaseMapping:0x2019 + ,simpleLowerCaseMapping:0x2019 + ,simpleTitleCaseMapping:0x2019 + }, + { code:0x201A + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x201A + ,simpleLowerCaseMapping:0x201A + ,simpleTitleCaseMapping:0x201A + }, + { code:0x201B + ,generalCategory:UnicodeData.GeneralCategory.Pi + ,simpleUpperCaseMapping:0x201B + ,simpleLowerCaseMapping:0x201B + ,simpleTitleCaseMapping:0x201B + }, + { code:0x201C + ,generalCategory:UnicodeData.GeneralCategory.Pi + ,simpleUpperCaseMapping:0x201C + ,simpleLowerCaseMapping:0x201C + ,simpleTitleCaseMapping:0x201C + }, + { code:0x201D + ,generalCategory:UnicodeData.GeneralCategory.Pf + ,simpleUpperCaseMapping:0x201D + ,simpleLowerCaseMapping:0x201D + ,simpleTitleCaseMapping:0x201D + }, + { code:0x201E + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x201E + ,simpleLowerCaseMapping:0x201E + ,simpleTitleCaseMapping:0x201E + }, + { code:0x201F + ,generalCategory:UnicodeData.GeneralCategory.Pi + ,simpleUpperCaseMapping:0x201F + ,simpleLowerCaseMapping:0x201F + ,simpleTitleCaseMapping:0x201F + }, + { code:0x2020 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2020 + ,simpleLowerCaseMapping:0x2020 + ,simpleTitleCaseMapping:0x2020 + }, + { code:0x2021 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2021 + ,simpleLowerCaseMapping:0x2021 + ,simpleTitleCaseMapping:0x2021 + }, + { code:0x2022 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2022 + ,simpleLowerCaseMapping:0x2022 + ,simpleTitleCaseMapping:0x2022 + }, + { code:0x2023 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2023 + ,simpleLowerCaseMapping:0x2023 + ,simpleTitleCaseMapping:0x2023 + }, + { code:0x2024 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2024 + ,simpleLowerCaseMapping:0x2024 + ,simpleTitleCaseMapping:0x2024 + }, + { code:0x2025 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2025 + ,simpleLowerCaseMapping:0x2025 + ,simpleTitleCaseMapping:0x2025 + }, + { code:0x2026 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2026 + ,simpleLowerCaseMapping:0x2026 + ,simpleTitleCaseMapping:0x2026 + }, + { code:0x2027 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2027 + ,simpleLowerCaseMapping:0x2027 + ,simpleTitleCaseMapping:0x2027 + }, + { code:0x2028 + ,generalCategory:UnicodeData.GeneralCategory.Zl + ,simpleUpperCaseMapping:0x2028 + ,simpleLowerCaseMapping:0x2028 + ,simpleTitleCaseMapping:0x2028 + }, + { code:0x2029 + ,generalCategory:UnicodeData.GeneralCategory.Zp + ,simpleUpperCaseMapping:0x2029 + ,simpleLowerCaseMapping:0x2029 + ,simpleTitleCaseMapping:0x2029 + }, + { code:0x202A + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x202A + ,simpleLowerCaseMapping:0x202A + ,simpleTitleCaseMapping:0x202A + }, + { code:0x202B + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x202B + ,simpleLowerCaseMapping:0x202B + ,simpleTitleCaseMapping:0x202B + }, + { code:0x202C + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x202C + ,simpleLowerCaseMapping:0x202C + ,simpleTitleCaseMapping:0x202C + }, + { code:0x202D + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x202D + ,simpleLowerCaseMapping:0x202D + ,simpleTitleCaseMapping:0x202D + }, + { code:0x202E + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x202E + ,simpleLowerCaseMapping:0x202E + ,simpleTitleCaseMapping:0x202E + }, + { code:0x202F + ,generalCategory:UnicodeData.GeneralCategory.Zs + ,simpleUpperCaseMapping:0x202F + ,simpleLowerCaseMapping:0x202F + ,simpleTitleCaseMapping:0x202F + }, + { code:0x2030 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2030 + ,simpleLowerCaseMapping:0x2030 + ,simpleTitleCaseMapping:0x2030 + }, + { code:0x2031 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2031 + ,simpleLowerCaseMapping:0x2031 + ,simpleTitleCaseMapping:0x2031 + }, + { code:0x2032 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2032 + ,simpleLowerCaseMapping:0x2032 + ,simpleTitleCaseMapping:0x2032 + }, + { code:0x2033 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2033 + ,simpleLowerCaseMapping:0x2033 + ,simpleTitleCaseMapping:0x2033 + }, + { code:0x2034 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2034 + ,simpleLowerCaseMapping:0x2034 + ,simpleTitleCaseMapping:0x2034 + }, + { code:0x2035 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2035 + ,simpleLowerCaseMapping:0x2035 + ,simpleTitleCaseMapping:0x2035 + }, + { code:0x2036 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2036 + ,simpleLowerCaseMapping:0x2036 + ,simpleTitleCaseMapping:0x2036 + }, + { code:0x2037 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2037 + ,simpleLowerCaseMapping:0x2037 + ,simpleTitleCaseMapping:0x2037 + }, + { code:0x2038 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2038 + ,simpleLowerCaseMapping:0x2038 + ,simpleTitleCaseMapping:0x2038 + }, + { code:0x2039 + ,generalCategory:UnicodeData.GeneralCategory.Pi + ,simpleUpperCaseMapping:0x2039 + ,simpleLowerCaseMapping:0x2039 + ,simpleTitleCaseMapping:0x2039 + }, + { code:0x203A + ,generalCategory:UnicodeData.GeneralCategory.Pf + ,simpleUpperCaseMapping:0x203A + ,simpleLowerCaseMapping:0x203A + ,simpleTitleCaseMapping:0x203A + }, + { code:0x203B + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x203B + ,simpleLowerCaseMapping:0x203B + ,simpleTitleCaseMapping:0x203B + }, + { code:0x203C + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x203C + ,simpleLowerCaseMapping:0x203C + ,simpleTitleCaseMapping:0x203C + }, + { code:0x203D + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x203D + ,simpleLowerCaseMapping:0x203D + ,simpleTitleCaseMapping:0x203D + }, + { code:0x203E + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x203E + ,simpleLowerCaseMapping:0x203E + ,simpleTitleCaseMapping:0x203E + }, + { code:0x203F + ,generalCategory:UnicodeData.GeneralCategory.Pc + ,simpleUpperCaseMapping:0x203F + ,simpleLowerCaseMapping:0x203F + ,simpleTitleCaseMapping:0x203F + }, + { code:0x2040 + ,generalCategory:UnicodeData.GeneralCategory.Pc + ,simpleUpperCaseMapping:0x2040 + ,simpleLowerCaseMapping:0x2040 + ,simpleTitleCaseMapping:0x2040 + }, + { code:0x2041 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2041 + ,simpleLowerCaseMapping:0x2041 + ,simpleTitleCaseMapping:0x2041 + }, + { code:0x2042 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2042 + ,simpleLowerCaseMapping:0x2042 + ,simpleTitleCaseMapping:0x2042 + }, + { code:0x2043 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2043 + ,simpleLowerCaseMapping:0x2043 + ,simpleTitleCaseMapping:0x2043 + }, + { code:0x2044 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2044 + ,simpleLowerCaseMapping:0x2044 + ,simpleTitleCaseMapping:0x2044 + }, + { code:0x2045 + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x2045 + ,simpleLowerCaseMapping:0x2045 + ,simpleTitleCaseMapping:0x2045 + }, + { code:0x2046 + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x2046 + ,simpleLowerCaseMapping:0x2046 + ,simpleTitleCaseMapping:0x2046 + }, + { code:0x2047 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2047 + ,simpleLowerCaseMapping:0x2047 + ,simpleTitleCaseMapping:0x2047 + }, + { code:0x2048 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2048 + ,simpleLowerCaseMapping:0x2048 + ,simpleTitleCaseMapping:0x2048 + }, + { code:0x2049 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2049 + ,simpleLowerCaseMapping:0x2049 + ,simpleTitleCaseMapping:0x2049 + }, + { code:0x204A + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x204A + ,simpleLowerCaseMapping:0x204A + ,simpleTitleCaseMapping:0x204A + }, + { code:0x204B + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x204B + ,simpleLowerCaseMapping:0x204B + ,simpleTitleCaseMapping:0x204B + }, + { code:0x204C + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x204C + ,simpleLowerCaseMapping:0x204C + ,simpleTitleCaseMapping:0x204C + }, + { code:0x204D + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x204D + ,simpleLowerCaseMapping:0x204D + ,simpleTitleCaseMapping:0x204D + }, + { code:0x204E + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x204E + ,simpleLowerCaseMapping:0x204E + ,simpleTitleCaseMapping:0x204E + }, + { code:0x204F + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x204F + ,simpleLowerCaseMapping:0x204F + ,simpleTitleCaseMapping:0x204F + }, + { code:0x2050 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2050 + ,simpleLowerCaseMapping:0x2050 + ,simpleTitleCaseMapping:0x2050 + }, + { code:0x2051 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2051 + ,simpleLowerCaseMapping:0x2051 + ,simpleTitleCaseMapping:0x2051 + }, + { code:0x2052 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2052 + ,simpleLowerCaseMapping:0x2052 + ,simpleTitleCaseMapping:0x2052 + }, + { code:0x2053 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2053 + ,simpleLowerCaseMapping:0x2053 + ,simpleTitleCaseMapping:0x2053 + }, + { code:0x2054 + ,generalCategory:UnicodeData.GeneralCategory.Pc + ,simpleUpperCaseMapping:0x2054 + ,simpleLowerCaseMapping:0x2054 + ,simpleTitleCaseMapping:0x2054 + }, + { code:0x2055 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2055 + ,simpleLowerCaseMapping:0x2055 + ,simpleTitleCaseMapping:0x2055 + }, + { code:0x2056 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2056 + ,simpleLowerCaseMapping:0x2056 + ,simpleTitleCaseMapping:0x2056 + }, + { code:0x2057 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2057 + ,simpleLowerCaseMapping:0x2057 + ,simpleTitleCaseMapping:0x2057 + }, + { code:0x2058 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2058 + ,simpleLowerCaseMapping:0x2058 + ,simpleTitleCaseMapping:0x2058 + }, + { code:0x2059 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2059 + ,simpleLowerCaseMapping:0x2059 + ,simpleTitleCaseMapping:0x2059 + }, + { code:0x205A + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x205A + ,simpleLowerCaseMapping:0x205A + ,simpleTitleCaseMapping:0x205A + }, + { code:0x205B + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x205B + ,simpleLowerCaseMapping:0x205B + ,simpleTitleCaseMapping:0x205B + }, + { code:0x205C + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x205C + ,simpleLowerCaseMapping:0x205C + ,simpleTitleCaseMapping:0x205C + }, + { code:0x205D + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x205D + ,simpleLowerCaseMapping:0x205D + ,simpleTitleCaseMapping:0x205D + }, + { code:0x205E + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x205E + ,simpleLowerCaseMapping:0x205E + ,simpleTitleCaseMapping:0x205E + }, + { code:0x205F + ,generalCategory:UnicodeData.GeneralCategory.Zs + ,simpleUpperCaseMapping:0x205F + ,simpleLowerCaseMapping:0x205F + ,simpleTitleCaseMapping:0x205F + }, + { code:0x2060 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x2060 + ,simpleLowerCaseMapping:0x2060 + ,simpleTitleCaseMapping:0x2060 + }, + { code:0x2061 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x2061 + ,simpleLowerCaseMapping:0x2061 + ,simpleTitleCaseMapping:0x2061 + }, + { code:0x2062 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x2062 + ,simpleLowerCaseMapping:0x2062 + ,simpleTitleCaseMapping:0x2062 + }, + { code:0x2063 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x2063 + ,simpleLowerCaseMapping:0x2063 + ,simpleTitleCaseMapping:0x2063 + }, + { code:0x206A + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x206A + ,simpleLowerCaseMapping:0x206A + ,simpleTitleCaseMapping:0x206A + }, + { code:0x206B + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x206B + ,simpleLowerCaseMapping:0x206B + ,simpleTitleCaseMapping:0x206B + }, + { code:0x206C + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x206C + ,simpleLowerCaseMapping:0x206C + ,simpleTitleCaseMapping:0x206C + }, + { code:0x206D + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x206D + ,simpleLowerCaseMapping:0x206D + ,simpleTitleCaseMapping:0x206D + }, + { code:0x206E + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x206E + ,simpleLowerCaseMapping:0x206E + ,simpleTitleCaseMapping:0x206E + }, + { code:0x206F + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x206F + ,simpleLowerCaseMapping:0x206F + ,simpleTitleCaseMapping:0x206F + }, + { code:0x2070 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2070 + ,simpleLowerCaseMapping:0x2070 + ,simpleTitleCaseMapping:0x2070 + }, + { code:0x2071 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2071 + ,simpleLowerCaseMapping:0x2071 + ,simpleTitleCaseMapping:0x2071 + }, + { code:0x2074 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2074 + ,simpleLowerCaseMapping:0x2074 + ,simpleTitleCaseMapping:0x2074 + }, + { code:0x2075 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2075 + ,simpleLowerCaseMapping:0x2075 + ,simpleTitleCaseMapping:0x2075 + }, + { code:0x2076 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2076 + ,simpleLowerCaseMapping:0x2076 + ,simpleTitleCaseMapping:0x2076 + }, + { code:0x2077 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2077 + ,simpleLowerCaseMapping:0x2077 + ,simpleTitleCaseMapping:0x2077 + }, + { code:0x2078 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2078 + ,simpleLowerCaseMapping:0x2078 + ,simpleTitleCaseMapping:0x2078 + }, + { code:0x2079 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2079 + ,simpleLowerCaseMapping:0x2079 + ,simpleTitleCaseMapping:0x2079 + }, + { code:0x207A + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x207A + ,simpleLowerCaseMapping:0x207A + ,simpleTitleCaseMapping:0x207A + }, + { code:0x207B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x207B + ,simpleLowerCaseMapping:0x207B + ,simpleTitleCaseMapping:0x207B + }, + { code:0x207C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x207C + ,simpleLowerCaseMapping:0x207C + ,simpleTitleCaseMapping:0x207C + }, + { code:0x207D + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x207D + ,simpleLowerCaseMapping:0x207D + ,simpleTitleCaseMapping:0x207D + }, + { code:0x207E + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x207E + ,simpleLowerCaseMapping:0x207E + ,simpleTitleCaseMapping:0x207E + }, + { code:0x207F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x207F + ,simpleLowerCaseMapping:0x207F + ,simpleTitleCaseMapping:0x207F + }, + { code:0x2080 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2080 + ,simpleLowerCaseMapping:0x2080 + ,simpleTitleCaseMapping:0x2080 + }, + { code:0x2081 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2081 + ,simpleLowerCaseMapping:0x2081 + ,simpleTitleCaseMapping:0x2081 + }, + { code:0x2082 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2082 + ,simpleLowerCaseMapping:0x2082 + ,simpleTitleCaseMapping:0x2082 + }, + { code:0x2083 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2083 + ,simpleLowerCaseMapping:0x2083 + ,simpleTitleCaseMapping:0x2083 + }, + { code:0x2084 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2084 + ,simpleLowerCaseMapping:0x2084 + ,simpleTitleCaseMapping:0x2084 + }, + { code:0x2085 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2085 + ,simpleLowerCaseMapping:0x2085 + ,simpleTitleCaseMapping:0x2085 + }, + { code:0x2086 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2086 + ,simpleLowerCaseMapping:0x2086 + ,simpleTitleCaseMapping:0x2086 + }, + { code:0x2087 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2087 + ,simpleLowerCaseMapping:0x2087 + ,simpleTitleCaseMapping:0x2087 + }, + { code:0x2088 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2088 + ,simpleLowerCaseMapping:0x2088 + ,simpleTitleCaseMapping:0x2088 + }, + { code:0x2089 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2089 + ,simpleLowerCaseMapping:0x2089 + ,simpleTitleCaseMapping:0x2089 + }, + { code:0x208A + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x208A + ,simpleLowerCaseMapping:0x208A + ,simpleTitleCaseMapping:0x208A + }, + { code:0x208B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x208B + ,simpleLowerCaseMapping:0x208B + ,simpleTitleCaseMapping:0x208B + }, + { code:0x208C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x208C + ,simpleLowerCaseMapping:0x208C + ,simpleTitleCaseMapping:0x208C + }, + { code:0x208D + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x208D + ,simpleLowerCaseMapping:0x208D + ,simpleTitleCaseMapping:0x208D + }, + { code:0x208E + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x208E + ,simpleLowerCaseMapping:0x208E + ,simpleTitleCaseMapping:0x208E + }, + { code:0x2090 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x2090 + ,simpleLowerCaseMapping:0x2090 + ,simpleTitleCaseMapping:0x2090 + }, + { code:0x2091 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x2091 + ,simpleLowerCaseMapping:0x2091 + ,simpleTitleCaseMapping:0x2091 + }, + { code:0x2092 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x2092 + ,simpleLowerCaseMapping:0x2092 + ,simpleTitleCaseMapping:0x2092 + }, + { code:0x2093 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x2093 + ,simpleLowerCaseMapping:0x2093 + ,simpleTitleCaseMapping:0x2093 + }, + { code:0x2094 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x2094 + ,simpleLowerCaseMapping:0x2094 + ,simpleTitleCaseMapping:0x2094 + }, + { code:0x20A0 + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0x20A0 + ,simpleLowerCaseMapping:0x20A0 + ,simpleTitleCaseMapping:0x20A0 + }, + { code:0x20A1 + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0x20A1 + ,simpleLowerCaseMapping:0x20A1 + ,simpleTitleCaseMapping:0x20A1 + }, + { code:0x20A2 + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0x20A2 + ,simpleLowerCaseMapping:0x20A2 + ,simpleTitleCaseMapping:0x20A2 + }, + { code:0x20A3 + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0x20A3 + ,simpleLowerCaseMapping:0x20A3 + ,simpleTitleCaseMapping:0x20A3 + }, + { code:0x20A4 + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0x20A4 + ,simpleLowerCaseMapping:0x20A4 + ,simpleTitleCaseMapping:0x20A4 + }, + { code:0x20A5 + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0x20A5 + ,simpleLowerCaseMapping:0x20A5 + ,simpleTitleCaseMapping:0x20A5 + }, + { code:0x20A6 + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0x20A6 + ,simpleLowerCaseMapping:0x20A6 + ,simpleTitleCaseMapping:0x20A6 + }, + { code:0x20A7 + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0x20A7 + ,simpleLowerCaseMapping:0x20A7 + ,simpleTitleCaseMapping:0x20A7 + }, + { code:0x20A8 + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0x20A8 + ,simpleLowerCaseMapping:0x20A8 + ,simpleTitleCaseMapping:0x20A8 + }, + { code:0x20A9 + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0x20A9 + ,simpleLowerCaseMapping:0x20A9 + ,simpleTitleCaseMapping:0x20A9 + }, + { code:0x20AA + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0x20AA + ,simpleLowerCaseMapping:0x20AA + ,simpleTitleCaseMapping:0x20AA + }, + { code:0x20AB + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0x20AB + ,simpleLowerCaseMapping:0x20AB + ,simpleTitleCaseMapping:0x20AB + }, + { code:0x20AC + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0x20AC + ,simpleLowerCaseMapping:0x20AC + ,simpleTitleCaseMapping:0x20AC + }, + { code:0x20AD + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0x20AD + ,simpleLowerCaseMapping:0x20AD + ,simpleTitleCaseMapping:0x20AD + }, + { code:0x20AE + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0x20AE + ,simpleLowerCaseMapping:0x20AE + ,simpleTitleCaseMapping:0x20AE + }, + { code:0x20AF + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0x20AF + ,simpleLowerCaseMapping:0x20AF + ,simpleTitleCaseMapping:0x20AF + }, + { code:0x20B0 + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0x20B0 + ,simpleLowerCaseMapping:0x20B0 + ,simpleTitleCaseMapping:0x20B0 + }, + { code:0x20B1 + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0x20B1 + ,simpleLowerCaseMapping:0x20B1 + ,simpleTitleCaseMapping:0x20B1 + }, + { code:0x20B2 + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0x20B2 + ,simpleLowerCaseMapping:0x20B2 + ,simpleTitleCaseMapping:0x20B2 + }, + { code:0x20B3 + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0x20B3 + ,simpleLowerCaseMapping:0x20B3 + ,simpleTitleCaseMapping:0x20B3 + }, + { code:0x20B4 + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0x20B4 + ,simpleLowerCaseMapping:0x20B4 + ,simpleTitleCaseMapping:0x20B4 + }, + { code:0x20B5 + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0x20B5 + ,simpleLowerCaseMapping:0x20B5 + ,simpleTitleCaseMapping:0x20B5 + }, + { code:0x20D0 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x20D0 + ,simpleLowerCaseMapping:0x20D0 + ,simpleTitleCaseMapping:0x20D0 + }, + { code:0x20D1 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x20D1 + ,simpleLowerCaseMapping:0x20D1 + ,simpleTitleCaseMapping:0x20D1 + }, + { code:0x20D2 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x20D2 + ,simpleLowerCaseMapping:0x20D2 + ,simpleTitleCaseMapping:0x20D2 + }, + { code:0x20D3 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x20D3 + ,simpleLowerCaseMapping:0x20D3 + ,simpleTitleCaseMapping:0x20D3 + }, + { code:0x20D4 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x20D4 + ,simpleLowerCaseMapping:0x20D4 + ,simpleTitleCaseMapping:0x20D4 + }, + { code:0x20D5 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x20D5 + ,simpleLowerCaseMapping:0x20D5 + ,simpleTitleCaseMapping:0x20D5 + }, + { code:0x20D6 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x20D6 + ,simpleLowerCaseMapping:0x20D6 + ,simpleTitleCaseMapping:0x20D6 + }, + { code:0x20D7 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x20D7 + ,simpleLowerCaseMapping:0x20D7 + ,simpleTitleCaseMapping:0x20D7 + }, + { code:0x20D8 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x20D8 + ,simpleLowerCaseMapping:0x20D8 + ,simpleTitleCaseMapping:0x20D8 + }, + { code:0x20D9 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x20D9 + ,simpleLowerCaseMapping:0x20D9 + ,simpleTitleCaseMapping:0x20D9 + }, + { code:0x20DA + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x20DA + ,simpleLowerCaseMapping:0x20DA + ,simpleTitleCaseMapping:0x20DA + }, + { code:0x20DB + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x20DB + ,simpleLowerCaseMapping:0x20DB + ,simpleTitleCaseMapping:0x20DB + }, + { code:0x20DC + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x20DC + ,simpleLowerCaseMapping:0x20DC + ,simpleTitleCaseMapping:0x20DC + }, + { code:0x20DD + ,generalCategory:UnicodeData.GeneralCategory.Me + ,simpleUpperCaseMapping:0x20DD + ,simpleLowerCaseMapping:0x20DD + ,simpleTitleCaseMapping:0x20DD + }, + { code:0x20DE + ,generalCategory:UnicodeData.GeneralCategory.Me + ,simpleUpperCaseMapping:0x20DE + ,simpleLowerCaseMapping:0x20DE + ,simpleTitleCaseMapping:0x20DE + }, + { code:0x20DF + ,generalCategory:UnicodeData.GeneralCategory.Me + ,simpleUpperCaseMapping:0x20DF + ,simpleLowerCaseMapping:0x20DF + ,simpleTitleCaseMapping:0x20DF + }, + { code:0x20E0 + ,generalCategory:UnicodeData.GeneralCategory.Me + ,simpleUpperCaseMapping:0x20E0 + ,simpleLowerCaseMapping:0x20E0 + ,simpleTitleCaseMapping:0x20E0 + }, + { code:0x20E1 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x20E1 + ,simpleLowerCaseMapping:0x20E1 + ,simpleTitleCaseMapping:0x20E1 + }, + { code:0x20E2 + ,generalCategory:UnicodeData.GeneralCategory.Me + ,simpleUpperCaseMapping:0x20E2 + ,simpleLowerCaseMapping:0x20E2 + ,simpleTitleCaseMapping:0x20E2 + }, + { code:0x20E3 + ,generalCategory:UnicodeData.GeneralCategory.Me + ,simpleUpperCaseMapping:0x20E3 + ,simpleLowerCaseMapping:0x20E3 + ,simpleTitleCaseMapping:0x20E3 + }, + { code:0x20E4 + ,generalCategory:UnicodeData.GeneralCategory.Me + ,simpleUpperCaseMapping:0x20E4 + ,simpleLowerCaseMapping:0x20E4 + ,simpleTitleCaseMapping:0x20E4 + }, + { code:0x20E5 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x20E5 + ,simpleLowerCaseMapping:0x20E5 + ,simpleTitleCaseMapping:0x20E5 + }, + { code:0x20E6 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x20E6 + ,simpleLowerCaseMapping:0x20E6 + ,simpleTitleCaseMapping:0x20E6 + }, + { code:0x20E7 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x20E7 + ,simpleLowerCaseMapping:0x20E7 + ,simpleTitleCaseMapping:0x20E7 + }, + { code:0x20E8 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x20E8 + ,simpleLowerCaseMapping:0x20E8 + ,simpleTitleCaseMapping:0x20E8 + }, + { code:0x20E9 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x20E9 + ,simpleLowerCaseMapping:0x20E9 + ,simpleTitleCaseMapping:0x20E9 + }, + { code:0x20EA + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x20EA + ,simpleLowerCaseMapping:0x20EA + ,simpleTitleCaseMapping:0x20EA + }, + { code:0x20EB + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x20EB + ,simpleLowerCaseMapping:0x20EB + ,simpleTitleCaseMapping:0x20EB + }, + { code:0x20EC + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x20EC + ,simpleLowerCaseMapping:0x20EC + ,simpleTitleCaseMapping:0x20EC + }, + { code:0x20ED + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x20ED + ,simpleLowerCaseMapping:0x20ED + ,simpleTitleCaseMapping:0x20ED + }, + { code:0x20EE + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x20EE + ,simpleLowerCaseMapping:0x20EE + ,simpleTitleCaseMapping:0x20EE + }, + { code:0x20EF + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x20EF + ,simpleLowerCaseMapping:0x20EF + ,simpleTitleCaseMapping:0x20EF + }, + { code:0x2100 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2100 + ,simpleLowerCaseMapping:0x2100 + ,simpleTitleCaseMapping:0x2100 + }, + { code:0x2101 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2101 + ,simpleLowerCaseMapping:0x2101 + ,simpleTitleCaseMapping:0x2101 + }, + { code:0x2102 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2102 + ,simpleLowerCaseMapping:0x2102 + ,simpleTitleCaseMapping:0x2102 + }, + { code:0x2103 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2103 + ,simpleLowerCaseMapping:0x2103 + ,simpleTitleCaseMapping:0x2103 + }, + { code:0x2104 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2104 + ,simpleLowerCaseMapping:0x2104 + ,simpleTitleCaseMapping:0x2104 + }, + { code:0x2105 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2105 + ,simpleLowerCaseMapping:0x2105 + ,simpleTitleCaseMapping:0x2105 + }, + { code:0x2106 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2106 + ,simpleLowerCaseMapping:0x2106 + ,simpleTitleCaseMapping:0x2106 + }, + { code:0x2107 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2107 + ,simpleLowerCaseMapping:0x2107 + ,simpleTitleCaseMapping:0x2107 + }, + { code:0x2108 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2108 + ,simpleLowerCaseMapping:0x2108 + ,simpleTitleCaseMapping:0x2108 + }, + { code:0x2109 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2109 + ,simpleLowerCaseMapping:0x2109 + ,simpleTitleCaseMapping:0x2109 + }, + { code:0x210A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x210A + ,simpleLowerCaseMapping:0x210A + ,simpleTitleCaseMapping:0x210A + }, + { code:0x210B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x210B + ,simpleLowerCaseMapping:0x210B + ,simpleTitleCaseMapping:0x210B + }, + { code:0x210C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x210C + ,simpleLowerCaseMapping:0x210C + ,simpleTitleCaseMapping:0x210C + }, + { code:0x210D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x210D + ,simpleLowerCaseMapping:0x210D + ,simpleTitleCaseMapping:0x210D + }, + { code:0x210E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x210E + ,simpleLowerCaseMapping:0x210E + ,simpleTitleCaseMapping:0x210E + }, + { code:0x210F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x210F + ,simpleLowerCaseMapping:0x210F + ,simpleTitleCaseMapping:0x210F + }, + { code:0x2110 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2110 + ,simpleLowerCaseMapping:0x2110 + ,simpleTitleCaseMapping:0x2110 + }, + { code:0x2111 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2111 + ,simpleLowerCaseMapping:0x2111 + ,simpleTitleCaseMapping:0x2111 + }, + { code:0x2112 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2112 + ,simpleLowerCaseMapping:0x2112 + ,simpleTitleCaseMapping:0x2112 + }, + { code:0x2113 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2113 + ,simpleLowerCaseMapping:0x2113 + ,simpleTitleCaseMapping:0x2113 + }, + { code:0x2114 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2114 + ,simpleLowerCaseMapping:0x2114 + ,simpleTitleCaseMapping:0x2114 + }, + { code:0x2115 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2115 + ,simpleLowerCaseMapping:0x2115 + ,simpleTitleCaseMapping:0x2115 + }, + { code:0x2116 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2116 + ,simpleLowerCaseMapping:0x2116 + ,simpleTitleCaseMapping:0x2116 + }, + { code:0x2117 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2117 + ,simpleLowerCaseMapping:0x2117 + ,simpleTitleCaseMapping:0x2117 + }, + { code:0x2118 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2118 + ,simpleLowerCaseMapping:0x2118 + ,simpleTitleCaseMapping:0x2118 + }, + { code:0x2119 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2119 + ,simpleLowerCaseMapping:0x2119 + ,simpleTitleCaseMapping:0x2119 + }, + { code:0x211A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x211A + ,simpleLowerCaseMapping:0x211A + ,simpleTitleCaseMapping:0x211A + }, + { code:0x211B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x211B + ,simpleLowerCaseMapping:0x211B + ,simpleTitleCaseMapping:0x211B + }, + { code:0x211C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x211C + ,simpleLowerCaseMapping:0x211C + ,simpleTitleCaseMapping:0x211C + }, + { code:0x211D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x211D + ,simpleLowerCaseMapping:0x211D + ,simpleTitleCaseMapping:0x211D + }, + { code:0x211E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x211E + ,simpleLowerCaseMapping:0x211E + ,simpleTitleCaseMapping:0x211E + }, + { code:0x211F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x211F + ,simpleLowerCaseMapping:0x211F + ,simpleTitleCaseMapping:0x211F + }, + { code:0x2120 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2120 + ,simpleLowerCaseMapping:0x2120 + ,simpleTitleCaseMapping:0x2120 + }, + { code:0x2121 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2121 + ,simpleLowerCaseMapping:0x2121 + ,simpleTitleCaseMapping:0x2121 + }, + { code:0x2122 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2122 + ,simpleLowerCaseMapping:0x2122 + ,simpleTitleCaseMapping:0x2122 + }, + { code:0x2123 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2123 + ,simpleLowerCaseMapping:0x2123 + ,simpleTitleCaseMapping:0x2123 + }, + { code:0x2124 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2124 + ,simpleLowerCaseMapping:0x2124 + ,simpleTitleCaseMapping:0x2124 + }, + { code:0x2125 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2125 + ,simpleLowerCaseMapping:0x2125 + ,simpleTitleCaseMapping:0x2125 + }, + { code:0x2126 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2126 + ,simpleLowerCaseMapping:0x03C9 + ,simpleTitleCaseMapping:0x2126 + }, + { code:0x2127 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2127 + ,simpleLowerCaseMapping:0x2127 + ,simpleTitleCaseMapping:0x2127 + }, + { code:0x2128 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2128 + ,simpleLowerCaseMapping:0x2128 + ,simpleTitleCaseMapping:0x2128 + }, + { code:0x2129 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2129 + ,simpleLowerCaseMapping:0x2129 + ,simpleTitleCaseMapping:0x2129 + }, + { code:0x212A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x212A + ,simpleLowerCaseMapping:0x006B + ,simpleTitleCaseMapping:0x212A + }, + { code:0x212B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x212B + ,simpleLowerCaseMapping:0x00E5 + ,simpleTitleCaseMapping:0x212B + }, + { code:0x212C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x212C + ,simpleLowerCaseMapping:0x212C + ,simpleTitleCaseMapping:0x212C + }, + { code:0x212D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x212D + ,simpleLowerCaseMapping:0x212D + ,simpleTitleCaseMapping:0x212D + }, + { code:0x212E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x212E + ,simpleLowerCaseMapping:0x212E + ,simpleTitleCaseMapping:0x212E + }, + { code:0x212F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x212F + ,simpleLowerCaseMapping:0x212F + ,simpleTitleCaseMapping:0x212F + }, + { code:0x2130 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2130 + ,simpleLowerCaseMapping:0x2130 + ,simpleTitleCaseMapping:0x2130 + }, + { code:0x2131 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2131 + ,simpleLowerCaseMapping:0x2131 + ,simpleTitleCaseMapping:0x2131 + }, + { code:0x2132 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2132 + ,simpleLowerCaseMapping:0x214E + ,simpleTitleCaseMapping:0x2132 + }, + { code:0x2133 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2133 + ,simpleLowerCaseMapping:0x2133 + ,simpleTitleCaseMapping:0x2133 + }, + { code:0x2134 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2134 + ,simpleLowerCaseMapping:0x2134 + ,simpleTitleCaseMapping:0x2134 + }, + { code:0x2135 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2135 + ,simpleLowerCaseMapping:0x2135 + ,simpleTitleCaseMapping:0x2135 + }, + { code:0x2136 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2136 + ,simpleLowerCaseMapping:0x2136 + ,simpleTitleCaseMapping:0x2136 + }, + { code:0x2137 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2137 + ,simpleLowerCaseMapping:0x2137 + ,simpleTitleCaseMapping:0x2137 + }, + { code:0x2138 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2138 + ,simpleLowerCaseMapping:0x2138 + ,simpleTitleCaseMapping:0x2138 + }, + { code:0x2139 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2139 + ,simpleLowerCaseMapping:0x2139 + ,simpleTitleCaseMapping:0x2139 + }, + { code:0x213A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x213A + ,simpleLowerCaseMapping:0x213A + ,simpleTitleCaseMapping:0x213A + }, + { code:0x213B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x213B + ,simpleLowerCaseMapping:0x213B + ,simpleTitleCaseMapping:0x213B + }, + { code:0x213C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x213C + ,simpleLowerCaseMapping:0x213C + ,simpleTitleCaseMapping:0x213C + }, + { code:0x213D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x213D + ,simpleLowerCaseMapping:0x213D + ,simpleTitleCaseMapping:0x213D + }, + { code:0x213E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x213E + ,simpleLowerCaseMapping:0x213E + ,simpleTitleCaseMapping:0x213E + }, + { code:0x213F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x213F + ,simpleLowerCaseMapping:0x213F + ,simpleTitleCaseMapping:0x213F + }, + { code:0x2140 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2140 + ,simpleLowerCaseMapping:0x2140 + ,simpleTitleCaseMapping:0x2140 + }, + { code:0x2141 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2141 + ,simpleLowerCaseMapping:0x2141 + ,simpleTitleCaseMapping:0x2141 + }, + { code:0x2142 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2142 + ,simpleLowerCaseMapping:0x2142 + ,simpleTitleCaseMapping:0x2142 + }, + { code:0x2143 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2143 + ,simpleLowerCaseMapping:0x2143 + ,simpleTitleCaseMapping:0x2143 + }, + { code:0x2144 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2144 + ,simpleLowerCaseMapping:0x2144 + ,simpleTitleCaseMapping:0x2144 + }, + { code:0x2145 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2145 + ,simpleLowerCaseMapping:0x2145 + ,simpleTitleCaseMapping:0x2145 + }, + { code:0x2146 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2146 + ,simpleLowerCaseMapping:0x2146 + ,simpleTitleCaseMapping:0x2146 + }, + { code:0x2147 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2147 + ,simpleLowerCaseMapping:0x2147 + ,simpleTitleCaseMapping:0x2147 + }, + { code:0x2148 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2148 + ,simpleLowerCaseMapping:0x2148 + ,simpleTitleCaseMapping:0x2148 + }, + { code:0x2149 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2149 + ,simpleLowerCaseMapping:0x2149 + ,simpleTitleCaseMapping:0x2149 + }, + { code:0x214A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x214A + ,simpleLowerCaseMapping:0x214A + ,simpleTitleCaseMapping:0x214A + }, + { code:0x214B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x214B + ,simpleLowerCaseMapping:0x214B + ,simpleTitleCaseMapping:0x214B + }, + { code:0x214C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x214C + ,simpleLowerCaseMapping:0x214C + ,simpleTitleCaseMapping:0x214C + }, + { code:0x214D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x214D + ,simpleLowerCaseMapping:0x214D + ,simpleTitleCaseMapping:0x214D + }, + { code:0x214E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2132 + ,simpleLowerCaseMapping:0x214E + ,simpleTitleCaseMapping:0x2132 + }, + { code:0x2153 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2153 + ,simpleLowerCaseMapping:0x2153 + ,simpleTitleCaseMapping:0x2153 + }, + { code:0x2154 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2154 + ,simpleLowerCaseMapping:0x2154 + ,simpleTitleCaseMapping:0x2154 + }, + { code:0x2155 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2155 + ,simpleLowerCaseMapping:0x2155 + ,simpleTitleCaseMapping:0x2155 + }, + { code:0x2156 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2156 + ,simpleLowerCaseMapping:0x2156 + ,simpleTitleCaseMapping:0x2156 + }, + { code:0x2157 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2157 + ,simpleLowerCaseMapping:0x2157 + ,simpleTitleCaseMapping:0x2157 + }, + { code:0x2158 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2158 + ,simpleLowerCaseMapping:0x2158 + ,simpleTitleCaseMapping:0x2158 + }, + { code:0x2159 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2159 + ,simpleLowerCaseMapping:0x2159 + ,simpleTitleCaseMapping:0x2159 + }, + { code:0x215A + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x215A + ,simpleLowerCaseMapping:0x215A + ,simpleTitleCaseMapping:0x215A + }, + { code:0x215B + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x215B + ,simpleLowerCaseMapping:0x215B + ,simpleTitleCaseMapping:0x215B + }, + { code:0x215C + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x215C + ,simpleLowerCaseMapping:0x215C + ,simpleTitleCaseMapping:0x215C + }, + { code:0x215D + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x215D + ,simpleLowerCaseMapping:0x215D + ,simpleTitleCaseMapping:0x215D + }, + { code:0x215E + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x215E + ,simpleLowerCaseMapping:0x215E + ,simpleTitleCaseMapping:0x215E + }, + { code:0x215F + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x215F + ,simpleLowerCaseMapping:0x215F + ,simpleTitleCaseMapping:0x215F + }, + { code:0x2160 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x2160 + ,simpleLowerCaseMapping:0x2170 + ,simpleTitleCaseMapping:0x2160 + }, + { code:0x2161 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x2161 + ,simpleLowerCaseMapping:0x2171 + ,simpleTitleCaseMapping:0x2161 + }, + { code:0x2162 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x2162 + ,simpleLowerCaseMapping:0x2172 + ,simpleTitleCaseMapping:0x2162 + }, + { code:0x2163 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x2163 + ,simpleLowerCaseMapping:0x2173 + ,simpleTitleCaseMapping:0x2163 + }, + { code:0x2164 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x2164 + ,simpleLowerCaseMapping:0x2174 + ,simpleTitleCaseMapping:0x2164 + }, + { code:0x2165 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x2165 + ,simpleLowerCaseMapping:0x2175 + ,simpleTitleCaseMapping:0x2165 + }, + { code:0x2166 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x2166 + ,simpleLowerCaseMapping:0x2176 + ,simpleTitleCaseMapping:0x2166 + }, + { code:0x2167 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x2167 + ,simpleLowerCaseMapping:0x2177 + ,simpleTitleCaseMapping:0x2167 + }, + { code:0x2168 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x2168 + ,simpleLowerCaseMapping:0x2178 + ,simpleTitleCaseMapping:0x2168 + }, + { code:0x2169 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x2169 + ,simpleLowerCaseMapping:0x2179 + ,simpleTitleCaseMapping:0x2169 + }, + { code:0x216A + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x216A + ,simpleLowerCaseMapping:0x217A + ,simpleTitleCaseMapping:0x216A + }, + { code:0x216B + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x216B + ,simpleLowerCaseMapping:0x217B + ,simpleTitleCaseMapping:0x216B + }, + { code:0x216C + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x216C + ,simpleLowerCaseMapping:0x217C + ,simpleTitleCaseMapping:0x216C + }, + { code:0x216D + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x216D + ,simpleLowerCaseMapping:0x217D + ,simpleTitleCaseMapping:0x216D + }, + { code:0x216E + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x216E + ,simpleLowerCaseMapping:0x217E + ,simpleTitleCaseMapping:0x216E + }, + { code:0x216F + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x216F + ,simpleLowerCaseMapping:0x217F + ,simpleTitleCaseMapping:0x216F + }, + { code:0x2170 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x2160 + ,simpleLowerCaseMapping:0x2170 + ,simpleTitleCaseMapping:0x2160 + }, + { code:0x2171 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x2161 + ,simpleLowerCaseMapping:0x2171 + ,simpleTitleCaseMapping:0x2161 + }, + { code:0x2172 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x2162 + ,simpleLowerCaseMapping:0x2172 + ,simpleTitleCaseMapping:0x2162 + }, + { code:0x2173 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x2163 + ,simpleLowerCaseMapping:0x2173 + ,simpleTitleCaseMapping:0x2163 + }, + { code:0x2174 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x2164 + ,simpleLowerCaseMapping:0x2174 + ,simpleTitleCaseMapping:0x2164 + }, + { code:0x2175 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x2165 + ,simpleLowerCaseMapping:0x2175 + ,simpleTitleCaseMapping:0x2165 + }, + { code:0x2176 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x2166 + ,simpleLowerCaseMapping:0x2176 + ,simpleTitleCaseMapping:0x2166 + }, + { code:0x2177 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x2167 + ,simpleLowerCaseMapping:0x2177 + ,simpleTitleCaseMapping:0x2167 + }, + { code:0x2178 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x2168 + ,simpleLowerCaseMapping:0x2178 + ,simpleTitleCaseMapping:0x2168 + }, + { code:0x2179 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x2169 + ,simpleLowerCaseMapping:0x2179 + ,simpleTitleCaseMapping:0x2169 + }, + { code:0x217A + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x216A + ,simpleLowerCaseMapping:0x217A + ,simpleTitleCaseMapping:0x216A + }, + { code:0x217B + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x216B + ,simpleLowerCaseMapping:0x217B + ,simpleTitleCaseMapping:0x216B + }, + { code:0x217C + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x216C + ,simpleLowerCaseMapping:0x217C + ,simpleTitleCaseMapping:0x216C + }, + { code:0x217D + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x216D + ,simpleLowerCaseMapping:0x217D + ,simpleTitleCaseMapping:0x216D + }, + { code:0x217E + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x216E + ,simpleLowerCaseMapping:0x217E + ,simpleTitleCaseMapping:0x216E + }, + { code:0x217F + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x216F + ,simpleLowerCaseMapping:0x217F + ,simpleTitleCaseMapping:0x216F + }, + { code:0x2180 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x2180 + ,simpleLowerCaseMapping:0x2180 + ,simpleTitleCaseMapping:0x2180 + }, + { code:0x2181 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x2181 + ,simpleLowerCaseMapping:0x2181 + ,simpleTitleCaseMapping:0x2181 + }, + { code:0x2182 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x2182 + ,simpleLowerCaseMapping:0x2182 + ,simpleTitleCaseMapping:0x2182 + }, + { code:0x2183 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2183 + ,simpleLowerCaseMapping:0x2184 + ,simpleTitleCaseMapping:0x2183 + }, + { code:0x2184 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2183 + ,simpleLowerCaseMapping:0x2184 + ,simpleTitleCaseMapping:0x2183 + }, + { code:0x2190 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2190 + ,simpleLowerCaseMapping:0x2190 + ,simpleTitleCaseMapping:0x2190 + }, + { code:0x2191 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2191 + ,simpleLowerCaseMapping:0x2191 + ,simpleTitleCaseMapping:0x2191 + }, + { code:0x2192 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2192 + ,simpleLowerCaseMapping:0x2192 + ,simpleTitleCaseMapping:0x2192 + }, + { code:0x2193 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2193 + ,simpleLowerCaseMapping:0x2193 + ,simpleTitleCaseMapping:0x2193 + }, + { code:0x2194 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2194 + ,simpleLowerCaseMapping:0x2194 + ,simpleTitleCaseMapping:0x2194 + }, + { code:0x2195 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2195 + ,simpleLowerCaseMapping:0x2195 + ,simpleTitleCaseMapping:0x2195 + }, + { code:0x2196 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2196 + ,simpleLowerCaseMapping:0x2196 + ,simpleTitleCaseMapping:0x2196 + }, + { code:0x2197 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2197 + ,simpleLowerCaseMapping:0x2197 + ,simpleTitleCaseMapping:0x2197 + }, + { code:0x2198 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2198 + ,simpleLowerCaseMapping:0x2198 + ,simpleTitleCaseMapping:0x2198 + }, + { code:0x2199 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2199 + ,simpleLowerCaseMapping:0x2199 + ,simpleTitleCaseMapping:0x2199 + }, + { code:0x219A + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x219A + ,simpleLowerCaseMapping:0x219A + ,simpleTitleCaseMapping:0x219A + }, + { code:0x219B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x219B + ,simpleLowerCaseMapping:0x219B + ,simpleTitleCaseMapping:0x219B + }, + { code:0x219C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x219C + ,simpleLowerCaseMapping:0x219C + ,simpleTitleCaseMapping:0x219C + }, + { code:0x219D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x219D + ,simpleLowerCaseMapping:0x219D + ,simpleTitleCaseMapping:0x219D + }, + { code:0x219E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x219E + ,simpleLowerCaseMapping:0x219E + ,simpleTitleCaseMapping:0x219E + }, + { code:0x219F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x219F + ,simpleLowerCaseMapping:0x219F + ,simpleTitleCaseMapping:0x219F + }, + { code:0x21A0 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x21A0 + ,simpleLowerCaseMapping:0x21A0 + ,simpleTitleCaseMapping:0x21A0 + }, + { code:0x21A1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21A1 + ,simpleLowerCaseMapping:0x21A1 + ,simpleTitleCaseMapping:0x21A1 + }, + { code:0x21A2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21A2 + ,simpleLowerCaseMapping:0x21A2 + ,simpleTitleCaseMapping:0x21A2 + }, + { code:0x21A3 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x21A3 + ,simpleLowerCaseMapping:0x21A3 + ,simpleTitleCaseMapping:0x21A3 + }, + { code:0x21A4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21A4 + ,simpleLowerCaseMapping:0x21A4 + ,simpleTitleCaseMapping:0x21A4 + }, + { code:0x21A5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21A5 + ,simpleLowerCaseMapping:0x21A5 + ,simpleTitleCaseMapping:0x21A5 + }, + { code:0x21A6 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x21A6 + ,simpleLowerCaseMapping:0x21A6 + ,simpleTitleCaseMapping:0x21A6 + }, + { code:0x21A7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21A7 + ,simpleLowerCaseMapping:0x21A7 + ,simpleTitleCaseMapping:0x21A7 + }, + { code:0x21A8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21A8 + ,simpleLowerCaseMapping:0x21A8 + ,simpleTitleCaseMapping:0x21A8 + }, + { code:0x21A9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21A9 + ,simpleLowerCaseMapping:0x21A9 + ,simpleTitleCaseMapping:0x21A9 + }, + { code:0x21AA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21AA + ,simpleLowerCaseMapping:0x21AA + ,simpleTitleCaseMapping:0x21AA + }, + { code:0x21AB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21AB + ,simpleLowerCaseMapping:0x21AB + ,simpleTitleCaseMapping:0x21AB + }, + { code:0x21AC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21AC + ,simpleLowerCaseMapping:0x21AC + ,simpleTitleCaseMapping:0x21AC + }, + { code:0x21AD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21AD + ,simpleLowerCaseMapping:0x21AD + ,simpleTitleCaseMapping:0x21AD + }, + { code:0x21AE + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x21AE + ,simpleLowerCaseMapping:0x21AE + ,simpleTitleCaseMapping:0x21AE + }, + { code:0x21AF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21AF + ,simpleLowerCaseMapping:0x21AF + ,simpleTitleCaseMapping:0x21AF + }, + { code:0x21B0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21B0 + ,simpleLowerCaseMapping:0x21B0 + ,simpleTitleCaseMapping:0x21B0 + }, + { code:0x21B1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21B1 + ,simpleLowerCaseMapping:0x21B1 + ,simpleTitleCaseMapping:0x21B1 + }, + { code:0x21B2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21B2 + ,simpleLowerCaseMapping:0x21B2 + ,simpleTitleCaseMapping:0x21B2 + }, + { code:0x21B3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21B3 + ,simpleLowerCaseMapping:0x21B3 + ,simpleTitleCaseMapping:0x21B3 + }, + { code:0x21B4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21B4 + ,simpleLowerCaseMapping:0x21B4 + ,simpleTitleCaseMapping:0x21B4 + }, + { code:0x21B5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21B5 + ,simpleLowerCaseMapping:0x21B5 + ,simpleTitleCaseMapping:0x21B5 + }, + { code:0x21B6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21B6 + ,simpleLowerCaseMapping:0x21B6 + ,simpleTitleCaseMapping:0x21B6 + }, + { code:0x21B7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21B7 + ,simpleLowerCaseMapping:0x21B7 + ,simpleTitleCaseMapping:0x21B7 + }, + { code:0x21B8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21B8 + ,simpleLowerCaseMapping:0x21B8 + ,simpleTitleCaseMapping:0x21B8 + }, + { code:0x21B9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21B9 + ,simpleLowerCaseMapping:0x21B9 + ,simpleTitleCaseMapping:0x21B9 + }, + { code:0x21BA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21BA + ,simpleLowerCaseMapping:0x21BA + ,simpleTitleCaseMapping:0x21BA + }, + { code:0x21BB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21BB + ,simpleLowerCaseMapping:0x21BB + ,simpleTitleCaseMapping:0x21BB + }, + { code:0x21BC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21BC + ,simpleLowerCaseMapping:0x21BC + ,simpleTitleCaseMapping:0x21BC + }, + { code:0x21BD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21BD + ,simpleLowerCaseMapping:0x21BD + ,simpleTitleCaseMapping:0x21BD + }, + { code:0x21BE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21BE + ,simpleLowerCaseMapping:0x21BE + ,simpleTitleCaseMapping:0x21BE + }, + { code:0x21BF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21BF + ,simpleLowerCaseMapping:0x21BF + ,simpleTitleCaseMapping:0x21BF + }, + { code:0x21C0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21C0 + ,simpleLowerCaseMapping:0x21C0 + ,simpleTitleCaseMapping:0x21C0 + }, + { code:0x21C1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21C1 + ,simpleLowerCaseMapping:0x21C1 + ,simpleTitleCaseMapping:0x21C1 + }, + { code:0x21C2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21C2 + ,simpleLowerCaseMapping:0x21C2 + ,simpleTitleCaseMapping:0x21C2 + }, + { code:0x21C3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21C3 + ,simpleLowerCaseMapping:0x21C3 + ,simpleTitleCaseMapping:0x21C3 + }, + { code:0x21C4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21C4 + ,simpleLowerCaseMapping:0x21C4 + ,simpleTitleCaseMapping:0x21C4 + }, + { code:0x21C5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21C5 + ,simpleLowerCaseMapping:0x21C5 + ,simpleTitleCaseMapping:0x21C5 + }, + { code:0x21C6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21C6 + ,simpleLowerCaseMapping:0x21C6 + ,simpleTitleCaseMapping:0x21C6 + }, + { code:0x21C7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21C7 + ,simpleLowerCaseMapping:0x21C7 + ,simpleTitleCaseMapping:0x21C7 + }, + { code:0x21C8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21C8 + ,simpleLowerCaseMapping:0x21C8 + ,simpleTitleCaseMapping:0x21C8 + }, + { code:0x21C9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21C9 + ,simpleLowerCaseMapping:0x21C9 + ,simpleTitleCaseMapping:0x21C9 + }, + { code:0x21CA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21CA + ,simpleLowerCaseMapping:0x21CA + ,simpleTitleCaseMapping:0x21CA + }, + { code:0x21CB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21CB + ,simpleLowerCaseMapping:0x21CB + ,simpleTitleCaseMapping:0x21CB + }, + { code:0x21CC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21CC + ,simpleLowerCaseMapping:0x21CC + ,simpleTitleCaseMapping:0x21CC + }, + { code:0x21CD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21CD + ,simpleLowerCaseMapping:0x21CD + ,simpleTitleCaseMapping:0x21CD + }, + { code:0x21CE + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x21CE + ,simpleLowerCaseMapping:0x21CE + ,simpleTitleCaseMapping:0x21CE + }, + { code:0x21CF + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x21CF + ,simpleLowerCaseMapping:0x21CF + ,simpleTitleCaseMapping:0x21CF + }, + { code:0x21D0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21D0 + ,simpleLowerCaseMapping:0x21D0 + ,simpleTitleCaseMapping:0x21D0 + }, + { code:0x21D1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21D1 + ,simpleLowerCaseMapping:0x21D1 + ,simpleTitleCaseMapping:0x21D1 + }, + { code:0x21D2 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x21D2 + ,simpleLowerCaseMapping:0x21D2 + ,simpleTitleCaseMapping:0x21D2 + }, + { code:0x21D3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21D3 + ,simpleLowerCaseMapping:0x21D3 + ,simpleTitleCaseMapping:0x21D3 + }, + { code:0x21D4 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x21D4 + ,simpleLowerCaseMapping:0x21D4 + ,simpleTitleCaseMapping:0x21D4 + }, + { code:0x21D5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21D5 + ,simpleLowerCaseMapping:0x21D5 + ,simpleTitleCaseMapping:0x21D5 + }, + { code:0x21D6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21D6 + ,simpleLowerCaseMapping:0x21D6 + ,simpleTitleCaseMapping:0x21D6 + }, + { code:0x21D7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21D7 + ,simpleLowerCaseMapping:0x21D7 + ,simpleTitleCaseMapping:0x21D7 + }, + { code:0x21D8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21D8 + ,simpleLowerCaseMapping:0x21D8 + ,simpleTitleCaseMapping:0x21D8 + }, + { code:0x21D9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21D9 + ,simpleLowerCaseMapping:0x21D9 + ,simpleTitleCaseMapping:0x21D9 + }, + { code:0x21DA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21DA + ,simpleLowerCaseMapping:0x21DA + ,simpleTitleCaseMapping:0x21DA + }, + { code:0x21DB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21DB + ,simpleLowerCaseMapping:0x21DB + ,simpleTitleCaseMapping:0x21DB + }, + { code:0x21DC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21DC + ,simpleLowerCaseMapping:0x21DC + ,simpleTitleCaseMapping:0x21DC + }, + { code:0x21DD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21DD + ,simpleLowerCaseMapping:0x21DD + ,simpleTitleCaseMapping:0x21DD + }, + { code:0x21DE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21DE + ,simpleLowerCaseMapping:0x21DE + ,simpleTitleCaseMapping:0x21DE + }, + { code:0x21DF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21DF + ,simpleLowerCaseMapping:0x21DF + ,simpleTitleCaseMapping:0x21DF + }, + { code:0x21E0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21E0 + ,simpleLowerCaseMapping:0x21E0 + ,simpleTitleCaseMapping:0x21E0 + }, + { code:0x21E1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21E1 + ,simpleLowerCaseMapping:0x21E1 + ,simpleTitleCaseMapping:0x21E1 + }, + { code:0x21E2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21E2 + ,simpleLowerCaseMapping:0x21E2 + ,simpleTitleCaseMapping:0x21E2 + }, + { code:0x21E3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21E3 + ,simpleLowerCaseMapping:0x21E3 + ,simpleTitleCaseMapping:0x21E3 + }, + { code:0x21E4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21E4 + ,simpleLowerCaseMapping:0x21E4 + ,simpleTitleCaseMapping:0x21E4 + }, + { code:0x21E5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21E5 + ,simpleLowerCaseMapping:0x21E5 + ,simpleTitleCaseMapping:0x21E5 + }, + { code:0x21E6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21E6 + ,simpleLowerCaseMapping:0x21E6 + ,simpleTitleCaseMapping:0x21E6 + }, + { code:0x21E7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21E7 + ,simpleLowerCaseMapping:0x21E7 + ,simpleTitleCaseMapping:0x21E7 + }, + { code:0x21E8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21E8 + ,simpleLowerCaseMapping:0x21E8 + ,simpleTitleCaseMapping:0x21E8 + }, + { code:0x21E9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21E9 + ,simpleLowerCaseMapping:0x21E9 + ,simpleTitleCaseMapping:0x21E9 + }, + { code:0x21EA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21EA + ,simpleLowerCaseMapping:0x21EA + ,simpleTitleCaseMapping:0x21EA + }, + { code:0x21EB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21EB + ,simpleLowerCaseMapping:0x21EB + ,simpleTitleCaseMapping:0x21EB + }, + { code:0x21EC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21EC + ,simpleLowerCaseMapping:0x21EC + ,simpleTitleCaseMapping:0x21EC + }, + { code:0x21ED + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21ED + ,simpleLowerCaseMapping:0x21ED + ,simpleTitleCaseMapping:0x21ED + }, + { code:0x21EE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21EE + ,simpleLowerCaseMapping:0x21EE + ,simpleTitleCaseMapping:0x21EE + }, + { code:0x21EF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21EF + ,simpleLowerCaseMapping:0x21EF + ,simpleTitleCaseMapping:0x21EF + }, + { code:0x21F0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21F0 + ,simpleLowerCaseMapping:0x21F0 + ,simpleTitleCaseMapping:0x21F0 + }, + { code:0x21F1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21F1 + ,simpleLowerCaseMapping:0x21F1 + ,simpleTitleCaseMapping:0x21F1 + }, + { code:0x21F2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21F2 + ,simpleLowerCaseMapping:0x21F2 + ,simpleTitleCaseMapping:0x21F2 + }, + { code:0x21F3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x21F3 + ,simpleLowerCaseMapping:0x21F3 + ,simpleTitleCaseMapping:0x21F3 + }, + { code:0x21F4 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x21F4 + ,simpleLowerCaseMapping:0x21F4 + ,simpleTitleCaseMapping:0x21F4 + }, + { code:0x21F5 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x21F5 + ,simpleLowerCaseMapping:0x21F5 + ,simpleTitleCaseMapping:0x21F5 + }, + { code:0x21F6 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x21F6 + ,simpleLowerCaseMapping:0x21F6 + ,simpleTitleCaseMapping:0x21F6 + }, + { code:0x21F7 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x21F7 + ,simpleLowerCaseMapping:0x21F7 + ,simpleTitleCaseMapping:0x21F7 + }, + { code:0x21F8 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x21F8 + ,simpleLowerCaseMapping:0x21F8 + ,simpleTitleCaseMapping:0x21F8 + }, + { code:0x21F9 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x21F9 + ,simpleLowerCaseMapping:0x21F9 + ,simpleTitleCaseMapping:0x21F9 + }, + { code:0x21FA + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x21FA + ,simpleLowerCaseMapping:0x21FA + ,simpleTitleCaseMapping:0x21FA + }, + { code:0x21FB + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x21FB + ,simpleLowerCaseMapping:0x21FB + ,simpleTitleCaseMapping:0x21FB + }, + { code:0x21FC + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x21FC + ,simpleLowerCaseMapping:0x21FC + ,simpleTitleCaseMapping:0x21FC + }, + { code:0x21FD + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x21FD + ,simpleLowerCaseMapping:0x21FD + ,simpleTitleCaseMapping:0x21FD + }, + { code:0x21FE + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x21FE + ,simpleLowerCaseMapping:0x21FE + ,simpleTitleCaseMapping:0x21FE + }, + { code:0x21FF + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x21FF + ,simpleLowerCaseMapping:0x21FF + ,simpleTitleCaseMapping:0x21FF + }, + { code:0x2200 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2200 + ,simpleLowerCaseMapping:0x2200 + ,simpleTitleCaseMapping:0x2200 + }, + { code:0x2201 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2201 + ,simpleLowerCaseMapping:0x2201 + ,simpleTitleCaseMapping:0x2201 + }, + { code:0x2202 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2202 + ,simpleLowerCaseMapping:0x2202 + ,simpleTitleCaseMapping:0x2202 + }, + { code:0x2203 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2203 + ,simpleLowerCaseMapping:0x2203 + ,simpleTitleCaseMapping:0x2203 + }, + { code:0x2204 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2204 + ,simpleLowerCaseMapping:0x2204 + ,simpleTitleCaseMapping:0x2204 + }, + { code:0x2205 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2205 + ,simpleLowerCaseMapping:0x2205 + ,simpleTitleCaseMapping:0x2205 + }, + { code:0x2206 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2206 + ,simpleLowerCaseMapping:0x2206 + ,simpleTitleCaseMapping:0x2206 + }, + { code:0x2207 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2207 + ,simpleLowerCaseMapping:0x2207 + ,simpleTitleCaseMapping:0x2207 + }, + { code:0x2208 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2208 + ,simpleLowerCaseMapping:0x2208 + ,simpleTitleCaseMapping:0x2208 + }, + { code:0x2209 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2209 + ,simpleLowerCaseMapping:0x2209 + ,simpleTitleCaseMapping:0x2209 + }, + { code:0x220A + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x220A + ,simpleLowerCaseMapping:0x220A + ,simpleTitleCaseMapping:0x220A + }, + { code:0x220B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x220B + ,simpleLowerCaseMapping:0x220B + ,simpleTitleCaseMapping:0x220B + }, + { code:0x220C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x220C + ,simpleLowerCaseMapping:0x220C + ,simpleTitleCaseMapping:0x220C + }, + { code:0x220D + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x220D + ,simpleLowerCaseMapping:0x220D + ,simpleTitleCaseMapping:0x220D + }, + { code:0x220E + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x220E + ,simpleLowerCaseMapping:0x220E + ,simpleTitleCaseMapping:0x220E + }, + { code:0x220F + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x220F + ,simpleLowerCaseMapping:0x220F + ,simpleTitleCaseMapping:0x220F + }, + { code:0x2210 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2210 + ,simpleLowerCaseMapping:0x2210 + ,simpleTitleCaseMapping:0x2210 + }, + { code:0x2211 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2211 + ,simpleLowerCaseMapping:0x2211 + ,simpleTitleCaseMapping:0x2211 + }, + { code:0x2212 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2212 + ,simpleLowerCaseMapping:0x2212 + ,simpleTitleCaseMapping:0x2212 + }, + { code:0x2213 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2213 + ,simpleLowerCaseMapping:0x2213 + ,simpleTitleCaseMapping:0x2213 + }, + { code:0x2214 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2214 + ,simpleLowerCaseMapping:0x2214 + ,simpleTitleCaseMapping:0x2214 + }, + { code:0x2215 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2215 + ,simpleLowerCaseMapping:0x2215 + ,simpleTitleCaseMapping:0x2215 + }, + { code:0x2216 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2216 + ,simpleLowerCaseMapping:0x2216 + ,simpleTitleCaseMapping:0x2216 + }, + { code:0x2217 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2217 + ,simpleLowerCaseMapping:0x2217 + ,simpleTitleCaseMapping:0x2217 + }, + { code:0x2218 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2218 + ,simpleLowerCaseMapping:0x2218 + ,simpleTitleCaseMapping:0x2218 + }, + { code:0x2219 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2219 + ,simpleLowerCaseMapping:0x2219 + ,simpleTitleCaseMapping:0x2219 + }, + { code:0x221A + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x221A + ,simpleLowerCaseMapping:0x221A + ,simpleTitleCaseMapping:0x221A + }, + { code:0x221B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x221B + ,simpleLowerCaseMapping:0x221B + ,simpleTitleCaseMapping:0x221B + }, + { code:0x221C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x221C + ,simpleLowerCaseMapping:0x221C + ,simpleTitleCaseMapping:0x221C + }, + { code:0x221D + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x221D + ,simpleLowerCaseMapping:0x221D + ,simpleTitleCaseMapping:0x221D + }, + { code:0x221E + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x221E + ,simpleLowerCaseMapping:0x221E + ,simpleTitleCaseMapping:0x221E + }, + { code:0x221F + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x221F + ,simpleLowerCaseMapping:0x221F + ,simpleTitleCaseMapping:0x221F + }, + { code:0x2220 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2220 + ,simpleLowerCaseMapping:0x2220 + ,simpleTitleCaseMapping:0x2220 + }, + { code:0x2221 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2221 + ,simpleLowerCaseMapping:0x2221 + ,simpleTitleCaseMapping:0x2221 + }, + { code:0x2222 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2222 + ,simpleLowerCaseMapping:0x2222 + ,simpleTitleCaseMapping:0x2222 + }, + { code:0x2223 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2223 + ,simpleLowerCaseMapping:0x2223 + ,simpleTitleCaseMapping:0x2223 + }, + { code:0x2224 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2224 + ,simpleLowerCaseMapping:0x2224 + ,simpleTitleCaseMapping:0x2224 + }, + { code:0x2225 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2225 + ,simpleLowerCaseMapping:0x2225 + ,simpleTitleCaseMapping:0x2225 + }, + { code:0x2226 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2226 + ,simpleLowerCaseMapping:0x2226 + ,simpleTitleCaseMapping:0x2226 + }, + { code:0x2227 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2227 + ,simpleLowerCaseMapping:0x2227 + ,simpleTitleCaseMapping:0x2227 + }, + { code:0x2228 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2228 + ,simpleLowerCaseMapping:0x2228 + ,simpleTitleCaseMapping:0x2228 + }, + { code:0x2229 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2229 + ,simpleLowerCaseMapping:0x2229 + ,simpleTitleCaseMapping:0x2229 + }, + { code:0x222A + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x222A + ,simpleLowerCaseMapping:0x222A + ,simpleTitleCaseMapping:0x222A + }, + { code:0x222B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x222B + ,simpleLowerCaseMapping:0x222B + ,simpleTitleCaseMapping:0x222B + }, + { code:0x222C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x222C + ,simpleLowerCaseMapping:0x222C + ,simpleTitleCaseMapping:0x222C + }, + { code:0x222D + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x222D + ,simpleLowerCaseMapping:0x222D + ,simpleTitleCaseMapping:0x222D + }, + { code:0x222E + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x222E + ,simpleLowerCaseMapping:0x222E + ,simpleTitleCaseMapping:0x222E + }, + { code:0x222F + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x222F + ,simpleLowerCaseMapping:0x222F + ,simpleTitleCaseMapping:0x222F + }, + { code:0x2230 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2230 + ,simpleLowerCaseMapping:0x2230 + ,simpleTitleCaseMapping:0x2230 + }, + { code:0x2231 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2231 + ,simpleLowerCaseMapping:0x2231 + ,simpleTitleCaseMapping:0x2231 + }, + { code:0x2232 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2232 + ,simpleLowerCaseMapping:0x2232 + ,simpleTitleCaseMapping:0x2232 + }, + { code:0x2233 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2233 + ,simpleLowerCaseMapping:0x2233 + ,simpleTitleCaseMapping:0x2233 + }, + { code:0x2234 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2234 + ,simpleLowerCaseMapping:0x2234 + ,simpleTitleCaseMapping:0x2234 + }, + { code:0x2235 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2235 + ,simpleLowerCaseMapping:0x2235 + ,simpleTitleCaseMapping:0x2235 + }, + { code:0x2236 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2236 + ,simpleLowerCaseMapping:0x2236 + ,simpleTitleCaseMapping:0x2236 + }, + { code:0x2237 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2237 + ,simpleLowerCaseMapping:0x2237 + ,simpleTitleCaseMapping:0x2237 + }, + { code:0x2238 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2238 + ,simpleLowerCaseMapping:0x2238 + ,simpleTitleCaseMapping:0x2238 + }, + { code:0x2239 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2239 + ,simpleLowerCaseMapping:0x2239 + ,simpleTitleCaseMapping:0x2239 + }, + { code:0x223A + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x223A + ,simpleLowerCaseMapping:0x223A + ,simpleTitleCaseMapping:0x223A + }, + { code:0x223B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x223B + ,simpleLowerCaseMapping:0x223B + ,simpleTitleCaseMapping:0x223B + }, + { code:0x223C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x223C + ,simpleLowerCaseMapping:0x223C + ,simpleTitleCaseMapping:0x223C + }, + { code:0x223D + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x223D + ,simpleLowerCaseMapping:0x223D + ,simpleTitleCaseMapping:0x223D + }, + { code:0x223E + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x223E + ,simpleLowerCaseMapping:0x223E + ,simpleTitleCaseMapping:0x223E + }, + { code:0x223F + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x223F + ,simpleLowerCaseMapping:0x223F + ,simpleTitleCaseMapping:0x223F + }, + { code:0x2240 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2240 + ,simpleLowerCaseMapping:0x2240 + ,simpleTitleCaseMapping:0x2240 + }, + { code:0x2241 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2241 + ,simpleLowerCaseMapping:0x2241 + ,simpleTitleCaseMapping:0x2241 + }, + { code:0x2242 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2242 + ,simpleLowerCaseMapping:0x2242 + ,simpleTitleCaseMapping:0x2242 + }, + { code:0x2243 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2243 + ,simpleLowerCaseMapping:0x2243 + ,simpleTitleCaseMapping:0x2243 + }, + { code:0x2244 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2244 + ,simpleLowerCaseMapping:0x2244 + ,simpleTitleCaseMapping:0x2244 + }, + { code:0x2245 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2245 + ,simpleLowerCaseMapping:0x2245 + ,simpleTitleCaseMapping:0x2245 + }, + { code:0x2246 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2246 + ,simpleLowerCaseMapping:0x2246 + ,simpleTitleCaseMapping:0x2246 + }, + { code:0x2247 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2247 + ,simpleLowerCaseMapping:0x2247 + ,simpleTitleCaseMapping:0x2247 + }, + { code:0x2248 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2248 + ,simpleLowerCaseMapping:0x2248 + ,simpleTitleCaseMapping:0x2248 + }, + { code:0x2249 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2249 + ,simpleLowerCaseMapping:0x2249 + ,simpleTitleCaseMapping:0x2249 + }, + { code:0x224A + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x224A + ,simpleLowerCaseMapping:0x224A + ,simpleTitleCaseMapping:0x224A + }, + { code:0x224B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x224B + ,simpleLowerCaseMapping:0x224B + ,simpleTitleCaseMapping:0x224B + }, + { code:0x224C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x224C + ,simpleLowerCaseMapping:0x224C + ,simpleTitleCaseMapping:0x224C + }, + { code:0x224D + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x224D + ,simpleLowerCaseMapping:0x224D + ,simpleTitleCaseMapping:0x224D + }, + { code:0x224E + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x224E + ,simpleLowerCaseMapping:0x224E + ,simpleTitleCaseMapping:0x224E + }, + { code:0x224F + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x224F + ,simpleLowerCaseMapping:0x224F + ,simpleTitleCaseMapping:0x224F + }, + { code:0x2250 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2250 + ,simpleLowerCaseMapping:0x2250 + ,simpleTitleCaseMapping:0x2250 + }, + { code:0x2251 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2251 + ,simpleLowerCaseMapping:0x2251 + ,simpleTitleCaseMapping:0x2251 + }, + { code:0x2252 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2252 + ,simpleLowerCaseMapping:0x2252 + ,simpleTitleCaseMapping:0x2252 + }, + { code:0x2253 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2253 + ,simpleLowerCaseMapping:0x2253 + ,simpleTitleCaseMapping:0x2253 + }, + { code:0x2254 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2254 + ,simpleLowerCaseMapping:0x2254 + ,simpleTitleCaseMapping:0x2254 + }, + { code:0x2255 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2255 + ,simpleLowerCaseMapping:0x2255 + ,simpleTitleCaseMapping:0x2255 + }, + { code:0x2256 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2256 + ,simpleLowerCaseMapping:0x2256 + ,simpleTitleCaseMapping:0x2256 + }, + { code:0x2257 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2257 + ,simpleLowerCaseMapping:0x2257 + ,simpleTitleCaseMapping:0x2257 + }, + { code:0x2258 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2258 + ,simpleLowerCaseMapping:0x2258 + ,simpleTitleCaseMapping:0x2258 + }, + { code:0x2259 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2259 + ,simpleLowerCaseMapping:0x2259 + ,simpleTitleCaseMapping:0x2259 + }, + { code:0x225A + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x225A + ,simpleLowerCaseMapping:0x225A + ,simpleTitleCaseMapping:0x225A + }, + { code:0x225B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x225B + ,simpleLowerCaseMapping:0x225B + ,simpleTitleCaseMapping:0x225B + }, + { code:0x225C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x225C + ,simpleLowerCaseMapping:0x225C + ,simpleTitleCaseMapping:0x225C + }, + { code:0x225D + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x225D + ,simpleLowerCaseMapping:0x225D + ,simpleTitleCaseMapping:0x225D + }, + { code:0x225E + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x225E + ,simpleLowerCaseMapping:0x225E + ,simpleTitleCaseMapping:0x225E + }, + { code:0x225F + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x225F + ,simpleLowerCaseMapping:0x225F + ,simpleTitleCaseMapping:0x225F + }, + { code:0x2260 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2260 + ,simpleLowerCaseMapping:0x2260 + ,simpleTitleCaseMapping:0x2260 + }, + { code:0x2261 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2261 + ,simpleLowerCaseMapping:0x2261 + ,simpleTitleCaseMapping:0x2261 + }, + { code:0x2262 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2262 + ,simpleLowerCaseMapping:0x2262 + ,simpleTitleCaseMapping:0x2262 + }, + { code:0x2263 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2263 + ,simpleLowerCaseMapping:0x2263 + ,simpleTitleCaseMapping:0x2263 + }, + { code:0x2264 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2264 + ,simpleLowerCaseMapping:0x2264 + ,simpleTitleCaseMapping:0x2264 + }, + { code:0x2265 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2265 + ,simpleLowerCaseMapping:0x2265 + ,simpleTitleCaseMapping:0x2265 + }, + { code:0x2266 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2266 + ,simpleLowerCaseMapping:0x2266 + ,simpleTitleCaseMapping:0x2266 + }, + { code:0x2267 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2267 + ,simpleLowerCaseMapping:0x2267 + ,simpleTitleCaseMapping:0x2267 + }, + { code:0x2268 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2268 + ,simpleLowerCaseMapping:0x2268 + ,simpleTitleCaseMapping:0x2268 + }, + { code:0x2269 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2269 + ,simpleLowerCaseMapping:0x2269 + ,simpleTitleCaseMapping:0x2269 + }, + { code:0x226A + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x226A + ,simpleLowerCaseMapping:0x226A + ,simpleTitleCaseMapping:0x226A + }, + { code:0x226B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x226B + ,simpleLowerCaseMapping:0x226B + ,simpleTitleCaseMapping:0x226B + }, + { code:0x226C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x226C + ,simpleLowerCaseMapping:0x226C + ,simpleTitleCaseMapping:0x226C + }, + { code:0x226D + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x226D + ,simpleLowerCaseMapping:0x226D + ,simpleTitleCaseMapping:0x226D + }, + { code:0x226E + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x226E + ,simpleLowerCaseMapping:0x226E + ,simpleTitleCaseMapping:0x226E + }, + { code:0x226F + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x226F + ,simpleLowerCaseMapping:0x226F + ,simpleTitleCaseMapping:0x226F + }, + { code:0x2270 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2270 + ,simpleLowerCaseMapping:0x2270 + ,simpleTitleCaseMapping:0x2270 + }, + { code:0x2271 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2271 + ,simpleLowerCaseMapping:0x2271 + ,simpleTitleCaseMapping:0x2271 + }, + { code:0x2272 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2272 + ,simpleLowerCaseMapping:0x2272 + ,simpleTitleCaseMapping:0x2272 + }, + { code:0x2273 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2273 + ,simpleLowerCaseMapping:0x2273 + ,simpleTitleCaseMapping:0x2273 + }, + { code:0x2274 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2274 + ,simpleLowerCaseMapping:0x2274 + ,simpleTitleCaseMapping:0x2274 + }, + { code:0x2275 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2275 + ,simpleLowerCaseMapping:0x2275 + ,simpleTitleCaseMapping:0x2275 + }, + { code:0x2276 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2276 + ,simpleLowerCaseMapping:0x2276 + ,simpleTitleCaseMapping:0x2276 + }, + { code:0x2277 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2277 + ,simpleLowerCaseMapping:0x2277 + ,simpleTitleCaseMapping:0x2277 + }, + { code:0x2278 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2278 + ,simpleLowerCaseMapping:0x2278 + ,simpleTitleCaseMapping:0x2278 + }, + { code:0x2279 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2279 + ,simpleLowerCaseMapping:0x2279 + ,simpleTitleCaseMapping:0x2279 + }, + { code:0x227A + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x227A + ,simpleLowerCaseMapping:0x227A + ,simpleTitleCaseMapping:0x227A + }, + { code:0x227B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x227B + ,simpleLowerCaseMapping:0x227B + ,simpleTitleCaseMapping:0x227B + }, + { code:0x227C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x227C + ,simpleLowerCaseMapping:0x227C + ,simpleTitleCaseMapping:0x227C + }, + { code:0x227D + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x227D + ,simpleLowerCaseMapping:0x227D + ,simpleTitleCaseMapping:0x227D + }, + { code:0x227E + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x227E + ,simpleLowerCaseMapping:0x227E + ,simpleTitleCaseMapping:0x227E + }, + { code:0x227F + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x227F + ,simpleLowerCaseMapping:0x227F + ,simpleTitleCaseMapping:0x227F + }, + { code:0x2280 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2280 + ,simpleLowerCaseMapping:0x2280 + ,simpleTitleCaseMapping:0x2280 + }, + { code:0x2281 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2281 + ,simpleLowerCaseMapping:0x2281 + ,simpleTitleCaseMapping:0x2281 + }, + { code:0x2282 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2282 + ,simpleLowerCaseMapping:0x2282 + ,simpleTitleCaseMapping:0x2282 + }, + { code:0x2283 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2283 + ,simpleLowerCaseMapping:0x2283 + ,simpleTitleCaseMapping:0x2283 + }, + { code:0x2284 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2284 + ,simpleLowerCaseMapping:0x2284 + ,simpleTitleCaseMapping:0x2284 + }, + { code:0x2285 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2285 + ,simpleLowerCaseMapping:0x2285 + ,simpleTitleCaseMapping:0x2285 + }, + { code:0x2286 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2286 + ,simpleLowerCaseMapping:0x2286 + ,simpleTitleCaseMapping:0x2286 + }, + { code:0x2287 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2287 + ,simpleLowerCaseMapping:0x2287 + ,simpleTitleCaseMapping:0x2287 + }, + { code:0x2288 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2288 + ,simpleLowerCaseMapping:0x2288 + ,simpleTitleCaseMapping:0x2288 + }, + { code:0x2289 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2289 + ,simpleLowerCaseMapping:0x2289 + ,simpleTitleCaseMapping:0x2289 + }, + { code:0x228A + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x228A + ,simpleLowerCaseMapping:0x228A + ,simpleTitleCaseMapping:0x228A + }, + { code:0x228B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x228B + ,simpleLowerCaseMapping:0x228B + ,simpleTitleCaseMapping:0x228B + }, + { code:0x228C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x228C + ,simpleLowerCaseMapping:0x228C + ,simpleTitleCaseMapping:0x228C + }, + { code:0x228D + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x228D + ,simpleLowerCaseMapping:0x228D + ,simpleTitleCaseMapping:0x228D + }, + { code:0x228E + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x228E + ,simpleLowerCaseMapping:0x228E + ,simpleTitleCaseMapping:0x228E + }, + { code:0x228F + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x228F + ,simpleLowerCaseMapping:0x228F + ,simpleTitleCaseMapping:0x228F + }, + { code:0x2290 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2290 + ,simpleLowerCaseMapping:0x2290 + ,simpleTitleCaseMapping:0x2290 + }, + { code:0x2291 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2291 + ,simpleLowerCaseMapping:0x2291 + ,simpleTitleCaseMapping:0x2291 + }, + { code:0x2292 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2292 + ,simpleLowerCaseMapping:0x2292 + ,simpleTitleCaseMapping:0x2292 + }, + { code:0x2293 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2293 + ,simpleLowerCaseMapping:0x2293 + ,simpleTitleCaseMapping:0x2293 + }, + { code:0x2294 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2294 + ,simpleLowerCaseMapping:0x2294 + ,simpleTitleCaseMapping:0x2294 + }, + { code:0x2295 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2295 + ,simpleLowerCaseMapping:0x2295 + ,simpleTitleCaseMapping:0x2295 + }, + { code:0x2296 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2296 + ,simpleLowerCaseMapping:0x2296 + ,simpleTitleCaseMapping:0x2296 + }, + { code:0x2297 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2297 + ,simpleLowerCaseMapping:0x2297 + ,simpleTitleCaseMapping:0x2297 + }, + { code:0x2298 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2298 + ,simpleLowerCaseMapping:0x2298 + ,simpleTitleCaseMapping:0x2298 + }, + { code:0x2299 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2299 + ,simpleLowerCaseMapping:0x2299 + ,simpleTitleCaseMapping:0x2299 + }, + { code:0x229A + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x229A + ,simpleLowerCaseMapping:0x229A + ,simpleTitleCaseMapping:0x229A + }, + { code:0x229B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x229B + ,simpleLowerCaseMapping:0x229B + ,simpleTitleCaseMapping:0x229B + }, + { code:0x229C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x229C + ,simpleLowerCaseMapping:0x229C + ,simpleTitleCaseMapping:0x229C + }, + { code:0x229D + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x229D + ,simpleLowerCaseMapping:0x229D + ,simpleTitleCaseMapping:0x229D + }, + { code:0x229E + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x229E + ,simpleLowerCaseMapping:0x229E + ,simpleTitleCaseMapping:0x229E + }, + { code:0x229F + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x229F + ,simpleLowerCaseMapping:0x229F + ,simpleTitleCaseMapping:0x229F + }, + { code:0x22A0 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22A0 + ,simpleLowerCaseMapping:0x22A0 + ,simpleTitleCaseMapping:0x22A0 + }, + { code:0x22A1 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22A1 + ,simpleLowerCaseMapping:0x22A1 + ,simpleTitleCaseMapping:0x22A1 + }, + { code:0x22A2 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22A2 + ,simpleLowerCaseMapping:0x22A2 + ,simpleTitleCaseMapping:0x22A2 + }, + { code:0x22A3 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22A3 + ,simpleLowerCaseMapping:0x22A3 + ,simpleTitleCaseMapping:0x22A3 + }, + { code:0x22A4 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22A4 + ,simpleLowerCaseMapping:0x22A4 + ,simpleTitleCaseMapping:0x22A4 + }, + { code:0x22A5 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22A5 + ,simpleLowerCaseMapping:0x22A5 + ,simpleTitleCaseMapping:0x22A5 + }, + { code:0x22A6 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22A6 + ,simpleLowerCaseMapping:0x22A6 + ,simpleTitleCaseMapping:0x22A6 + }, + { code:0x22A7 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22A7 + ,simpleLowerCaseMapping:0x22A7 + ,simpleTitleCaseMapping:0x22A7 + }, + { code:0x22A8 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22A8 + ,simpleLowerCaseMapping:0x22A8 + ,simpleTitleCaseMapping:0x22A8 + }, + { code:0x22A9 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22A9 + ,simpleLowerCaseMapping:0x22A9 + ,simpleTitleCaseMapping:0x22A9 + }, + { code:0x22AA + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22AA + ,simpleLowerCaseMapping:0x22AA + ,simpleTitleCaseMapping:0x22AA + }, + { code:0x22AB + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22AB + ,simpleLowerCaseMapping:0x22AB + ,simpleTitleCaseMapping:0x22AB + }, + { code:0x22AC + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22AC + ,simpleLowerCaseMapping:0x22AC + ,simpleTitleCaseMapping:0x22AC + }, + { code:0x22AD + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22AD + ,simpleLowerCaseMapping:0x22AD + ,simpleTitleCaseMapping:0x22AD + }, + { code:0x22AE + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22AE + ,simpleLowerCaseMapping:0x22AE + ,simpleTitleCaseMapping:0x22AE + }, + { code:0x22AF + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22AF + ,simpleLowerCaseMapping:0x22AF + ,simpleTitleCaseMapping:0x22AF + }, + { code:0x22B0 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22B0 + ,simpleLowerCaseMapping:0x22B0 + ,simpleTitleCaseMapping:0x22B0 + }, + { code:0x22B1 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22B1 + ,simpleLowerCaseMapping:0x22B1 + ,simpleTitleCaseMapping:0x22B1 + }, + { code:0x22B2 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22B2 + ,simpleLowerCaseMapping:0x22B2 + ,simpleTitleCaseMapping:0x22B2 + }, + { code:0x22B3 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22B3 + ,simpleLowerCaseMapping:0x22B3 + ,simpleTitleCaseMapping:0x22B3 + }, + { code:0x22B4 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22B4 + ,simpleLowerCaseMapping:0x22B4 + ,simpleTitleCaseMapping:0x22B4 + }, + { code:0x22B5 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22B5 + ,simpleLowerCaseMapping:0x22B5 + ,simpleTitleCaseMapping:0x22B5 + }, + { code:0x22B6 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22B6 + ,simpleLowerCaseMapping:0x22B6 + ,simpleTitleCaseMapping:0x22B6 + }, + { code:0x22B7 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22B7 + ,simpleLowerCaseMapping:0x22B7 + ,simpleTitleCaseMapping:0x22B7 + }, + { code:0x22B8 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22B8 + ,simpleLowerCaseMapping:0x22B8 + ,simpleTitleCaseMapping:0x22B8 + }, + { code:0x22B9 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22B9 + ,simpleLowerCaseMapping:0x22B9 + ,simpleTitleCaseMapping:0x22B9 + }, + { code:0x22BA + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22BA + ,simpleLowerCaseMapping:0x22BA + ,simpleTitleCaseMapping:0x22BA + }, + { code:0x22BB + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22BB + ,simpleLowerCaseMapping:0x22BB + ,simpleTitleCaseMapping:0x22BB + }, + { code:0x22BC + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22BC + ,simpleLowerCaseMapping:0x22BC + ,simpleTitleCaseMapping:0x22BC + }, + { code:0x22BD + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22BD + ,simpleLowerCaseMapping:0x22BD + ,simpleTitleCaseMapping:0x22BD + }, + { code:0x22BE + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22BE + ,simpleLowerCaseMapping:0x22BE + ,simpleTitleCaseMapping:0x22BE + }, + { code:0x22BF + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22BF + ,simpleLowerCaseMapping:0x22BF + ,simpleTitleCaseMapping:0x22BF + }, + { code:0x22C0 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22C0 + ,simpleLowerCaseMapping:0x22C0 + ,simpleTitleCaseMapping:0x22C0 + }, + { code:0x22C1 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22C1 + ,simpleLowerCaseMapping:0x22C1 + ,simpleTitleCaseMapping:0x22C1 + }, + { code:0x22C2 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22C2 + ,simpleLowerCaseMapping:0x22C2 + ,simpleTitleCaseMapping:0x22C2 + }, + { code:0x22C3 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22C3 + ,simpleLowerCaseMapping:0x22C3 + ,simpleTitleCaseMapping:0x22C3 + }, + { code:0x22C4 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22C4 + ,simpleLowerCaseMapping:0x22C4 + ,simpleTitleCaseMapping:0x22C4 + }, + { code:0x22C5 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22C5 + ,simpleLowerCaseMapping:0x22C5 + ,simpleTitleCaseMapping:0x22C5 + }, + { code:0x22C6 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22C6 + ,simpleLowerCaseMapping:0x22C6 + ,simpleTitleCaseMapping:0x22C6 + }, + { code:0x22C7 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22C7 + ,simpleLowerCaseMapping:0x22C7 + ,simpleTitleCaseMapping:0x22C7 + }, + { code:0x22C8 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22C8 + ,simpleLowerCaseMapping:0x22C8 + ,simpleTitleCaseMapping:0x22C8 + }, + { code:0x22C9 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22C9 + ,simpleLowerCaseMapping:0x22C9 + ,simpleTitleCaseMapping:0x22C9 + }, + { code:0x22CA + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22CA + ,simpleLowerCaseMapping:0x22CA + ,simpleTitleCaseMapping:0x22CA + }, + { code:0x22CB + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22CB + ,simpleLowerCaseMapping:0x22CB + ,simpleTitleCaseMapping:0x22CB + }, + { code:0x22CC + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22CC + ,simpleLowerCaseMapping:0x22CC + ,simpleTitleCaseMapping:0x22CC + }, + { code:0x22CD + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22CD + ,simpleLowerCaseMapping:0x22CD + ,simpleTitleCaseMapping:0x22CD + }, + { code:0x22CE + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22CE + ,simpleLowerCaseMapping:0x22CE + ,simpleTitleCaseMapping:0x22CE + }, + { code:0x22CF + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22CF + ,simpleLowerCaseMapping:0x22CF + ,simpleTitleCaseMapping:0x22CF + }, + { code:0x22D0 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22D0 + ,simpleLowerCaseMapping:0x22D0 + ,simpleTitleCaseMapping:0x22D0 + }, + { code:0x22D1 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22D1 + ,simpleLowerCaseMapping:0x22D1 + ,simpleTitleCaseMapping:0x22D1 + }, + { code:0x22D2 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22D2 + ,simpleLowerCaseMapping:0x22D2 + ,simpleTitleCaseMapping:0x22D2 + }, + { code:0x22D3 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22D3 + ,simpleLowerCaseMapping:0x22D3 + ,simpleTitleCaseMapping:0x22D3 + }, + { code:0x22D4 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22D4 + ,simpleLowerCaseMapping:0x22D4 + ,simpleTitleCaseMapping:0x22D4 + }, + { code:0x22D5 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22D5 + ,simpleLowerCaseMapping:0x22D5 + ,simpleTitleCaseMapping:0x22D5 + }, + { code:0x22D6 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22D6 + ,simpleLowerCaseMapping:0x22D6 + ,simpleTitleCaseMapping:0x22D6 + }, + { code:0x22D7 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22D7 + ,simpleLowerCaseMapping:0x22D7 + ,simpleTitleCaseMapping:0x22D7 + }, + { code:0x22D8 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22D8 + ,simpleLowerCaseMapping:0x22D8 + ,simpleTitleCaseMapping:0x22D8 + }, + { code:0x22D9 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22D9 + ,simpleLowerCaseMapping:0x22D9 + ,simpleTitleCaseMapping:0x22D9 + }, + { code:0x22DA + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22DA + ,simpleLowerCaseMapping:0x22DA + ,simpleTitleCaseMapping:0x22DA + }, + { code:0x22DB + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22DB + ,simpleLowerCaseMapping:0x22DB + ,simpleTitleCaseMapping:0x22DB + }, + { code:0x22DC + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22DC + ,simpleLowerCaseMapping:0x22DC + ,simpleTitleCaseMapping:0x22DC + }, + { code:0x22DD + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22DD + ,simpleLowerCaseMapping:0x22DD + ,simpleTitleCaseMapping:0x22DD + }, + { code:0x22DE + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22DE + ,simpleLowerCaseMapping:0x22DE + ,simpleTitleCaseMapping:0x22DE + }, + { code:0x22DF + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22DF + ,simpleLowerCaseMapping:0x22DF + ,simpleTitleCaseMapping:0x22DF + }, + { code:0x22E0 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22E0 + ,simpleLowerCaseMapping:0x22E0 + ,simpleTitleCaseMapping:0x22E0 + }, + { code:0x22E1 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22E1 + ,simpleLowerCaseMapping:0x22E1 + ,simpleTitleCaseMapping:0x22E1 + }, + { code:0x22E2 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22E2 + ,simpleLowerCaseMapping:0x22E2 + ,simpleTitleCaseMapping:0x22E2 + }, + { code:0x22E3 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22E3 + ,simpleLowerCaseMapping:0x22E3 + ,simpleTitleCaseMapping:0x22E3 + }, + { code:0x22E4 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22E4 + ,simpleLowerCaseMapping:0x22E4 + ,simpleTitleCaseMapping:0x22E4 + }, + { code:0x22E5 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22E5 + ,simpleLowerCaseMapping:0x22E5 + ,simpleTitleCaseMapping:0x22E5 + }, + { code:0x22E6 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22E6 + ,simpleLowerCaseMapping:0x22E6 + ,simpleTitleCaseMapping:0x22E6 + }, + { code:0x22E7 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22E7 + ,simpleLowerCaseMapping:0x22E7 + ,simpleTitleCaseMapping:0x22E7 + }, + { code:0x22E8 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22E8 + ,simpleLowerCaseMapping:0x22E8 + ,simpleTitleCaseMapping:0x22E8 + }, + { code:0x22E9 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22E9 + ,simpleLowerCaseMapping:0x22E9 + ,simpleTitleCaseMapping:0x22E9 + }, + { code:0x22EA + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22EA + ,simpleLowerCaseMapping:0x22EA + ,simpleTitleCaseMapping:0x22EA + }, + { code:0x22EB + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22EB + ,simpleLowerCaseMapping:0x22EB + ,simpleTitleCaseMapping:0x22EB + }, + { code:0x22EC + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22EC + ,simpleLowerCaseMapping:0x22EC + ,simpleTitleCaseMapping:0x22EC + }, + { code:0x22ED + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22ED + ,simpleLowerCaseMapping:0x22ED + ,simpleTitleCaseMapping:0x22ED + }, + { code:0x22EE + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22EE + ,simpleLowerCaseMapping:0x22EE + ,simpleTitleCaseMapping:0x22EE + }, + { code:0x22EF + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22EF + ,simpleLowerCaseMapping:0x22EF + ,simpleTitleCaseMapping:0x22EF + }, + { code:0x22F0 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22F0 + ,simpleLowerCaseMapping:0x22F0 + ,simpleTitleCaseMapping:0x22F0 + }, + { code:0x22F1 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22F1 + ,simpleLowerCaseMapping:0x22F1 + ,simpleTitleCaseMapping:0x22F1 + }, + { code:0x22F2 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22F2 + ,simpleLowerCaseMapping:0x22F2 + ,simpleTitleCaseMapping:0x22F2 + }, + { code:0x22F3 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22F3 + ,simpleLowerCaseMapping:0x22F3 + ,simpleTitleCaseMapping:0x22F3 + }, + { code:0x22F4 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22F4 + ,simpleLowerCaseMapping:0x22F4 + ,simpleTitleCaseMapping:0x22F4 + }, + { code:0x22F5 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22F5 + ,simpleLowerCaseMapping:0x22F5 + ,simpleTitleCaseMapping:0x22F5 + }, + { code:0x22F6 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22F6 + ,simpleLowerCaseMapping:0x22F6 + ,simpleTitleCaseMapping:0x22F6 + }, + { code:0x22F7 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22F7 + ,simpleLowerCaseMapping:0x22F7 + ,simpleTitleCaseMapping:0x22F7 + }, + { code:0x22F8 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22F8 + ,simpleLowerCaseMapping:0x22F8 + ,simpleTitleCaseMapping:0x22F8 + }, + { code:0x22F9 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22F9 + ,simpleLowerCaseMapping:0x22F9 + ,simpleTitleCaseMapping:0x22F9 + }, + { code:0x22FA + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22FA + ,simpleLowerCaseMapping:0x22FA + ,simpleTitleCaseMapping:0x22FA + }, + { code:0x22FB + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22FB + ,simpleLowerCaseMapping:0x22FB + ,simpleTitleCaseMapping:0x22FB + }, + { code:0x22FC + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22FC + ,simpleLowerCaseMapping:0x22FC + ,simpleTitleCaseMapping:0x22FC + }, + { code:0x22FD + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22FD + ,simpleLowerCaseMapping:0x22FD + ,simpleTitleCaseMapping:0x22FD + }, + { code:0x22FE + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22FE + ,simpleLowerCaseMapping:0x22FE + ,simpleTitleCaseMapping:0x22FE + }, + { code:0x22FF + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x22FF + ,simpleLowerCaseMapping:0x22FF + ,simpleTitleCaseMapping:0x22FF + }, + { code:0x2300 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2300 + ,simpleLowerCaseMapping:0x2300 + ,simpleTitleCaseMapping:0x2300 + }, + { code:0x2301 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2301 + ,simpleLowerCaseMapping:0x2301 + ,simpleTitleCaseMapping:0x2301 + }, + { code:0x2302 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2302 + ,simpleLowerCaseMapping:0x2302 + ,simpleTitleCaseMapping:0x2302 + }, + { code:0x2303 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2303 + ,simpleLowerCaseMapping:0x2303 + ,simpleTitleCaseMapping:0x2303 + }, + { code:0x2304 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2304 + ,simpleLowerCaseMapping:0x2304 + ,simpleTitleCaseMapping:0x2304 + }, + { code:0x2305 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2305 + ,simpleLowerCaseMapping:0x2305 + ,simpleTitleCaseMapping:0x2305 + }, + { code:0x2306 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2306 + ,simpleLowerCaseMapping:0x2306 + ,simpleTitleCaseMapping:0x2306 + }, + { code:0x2307 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2307 + ,simpleLowerCaseMapping:0x2307 + ,simpleTitleCaseMapping:0x2307 + }, + { code:0x2308 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2308 + ,simpleLowerCaseMapping:0x2308 + ,simpleTitleCaseMapping:0x2308 + }, + { code:0x2309 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2309 + ,simpleLowerCaseMapping:0x2309 + ,simpleTitleCaseMapping:0x2309 + }, + { code:0x230A + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x230A + ,simpleLowerCaseMapping:0x230A + ,simpleTitleCaseMapping:0x230A + }, + { code:0x230B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x230B + ,simpleLowerCaseMapping:0x230B + ,simpleTitleCaseMapping:0x230B + }, + { code:0x230C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x230C + ,simpleLowerCaseMapping:0x230C + ,simpleTitleCaseMapping:0x230C + }, + { code:0x230D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x230D + ,simpleLowerCaseMapping:0x230D + ,simpleTitleCaseMapping:0x230D + }, + { code:0x230E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x230E + ,simpleLowerCaseMapping:0x230E + ,simpleTitleCaseMapping:0x230E + }, + { code:0x230F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x230F + ,simpleLowerCaseMapping:0x230F + ,simpleTitleCaseMapping:0x230F + }, + { code:0x2310 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2310 + ,simpleLowerCaseMapping:0x2310 + ,simpleTitleCaseMapping:0x2310 + }, + { code:0x2311 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2311 + ,simpleLowerCaseMapping:0x2311 + ,simpleTitleCaseMapping:0x2311 + }, + { code:0x2312 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2312 + ,simpleLowerCaseMapping:0x2312 + ,simpleTitleCaseMapping:0x2312 + }, + { code:0x2313 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2313 + ,simpleLowerCaseMapping:0x2313 + ,simpleTitleCaseMapping:0x2313 + }, + { code:0x2314 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2314 + ,simpleLowerCaseMapping:0x2314 + ,simpleTitleCaseMapping:0x2314 + }, + { code:0x2315 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2315 + ,simpleLowerCaseMapping:0x2315 + ,simpleTitleCaseMapping:0x2315 + }, + { code:0x2316 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2316 + ,simpleLowerCaseMapping:0x2316 + ,simpleTitleCaseMapping:0x2316 + }, + { code:0x2317 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2317 + ,simpleLowerCaseMapping:0x2317 + ,simpleTitleCaseMapping:0x2317 + }, + { code:0x2318 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2318 + ,simpleLowerCaseMapping:0x2318 + ,simpleTitleCaseMapping:0x2318 + }, + { code:0x2319 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2319 + ,simpleLowerCaseMapping:0x2319 + ,simpleTitleCaseMapping:0x2319 + }, + { code:0x231A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x231A + ,simpleLowerCaseMapping:0x231A + ,simpleTitleCaseMapping:0x231A + }, + { code:0x231B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x231B + ,simpleLowerCaseMapping:0x231B + ,simpleTitleCaseMapping:0x231B + }, + { code:0x231C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x231C + ,simpleLowerCaseMapping:0x231C + ,simpleTitleCaseMapping:0x231C + }, + { code:0x231D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x231D + ,simpleLowerCaseMapping:0x231D + ,simpleTitleCaseMapping:0x231D + }, + { code:0x231E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x231E + ,simpleLowerCaseMapping:0x231E + ,simpleTitleCaseMapping:0x231E + }, + { code:0x231F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x231F + ,simpleLowerCaseMapping:0x231F + ,simpleTitleCaseMapping:0x231F + }, + { code:0x2320 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2320 + ,simpleLowerCaseMapping:0x2320 + ,simpleTitleCaseMapping:0x2320 + }, + { code:0x2321 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2321 + ,simpleLowerCaseMapping:0x2321 + ,simpleTitleCaseMapping:0x2321 + }, + { code:0x2322 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2322 + ,simpleLowerCaseMapping:0x2322 + ,simpleTitleCaseMapping:0x2322 + }, + { code:0x2323 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2323 + ,simpleLowerCaseMapping:0x2323 + ,simpleTitleCaseMapping:0x2323 + }, + { code:0x2324 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2324 + ,simpleLowerCaseMapping:0x2324 + ,simpleTitleCaseMapping:0x2324 + }, + { code:0x2325 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2325 + ,simpleLowerCaseMapping:0x2325 + ,simpleTitleCaseMapping:0x2325 + }, + { code:0x2326 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2326 + ,simpleLowerCaseMapping:0x2326 + ,simpleTitleCaseMapping:0x2326 + }, + { code:0x2327 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2327 + ,simpleLowerCaseMapping:0x2327 + ,simpleTitleCaseMapping:0x2327 + }, + { code:0x2328 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2328 + ,simpleLowerCaseMapping:0x2328 + ,simpleTitleCaseMapping:0x2328 + }, + { code:0x2329 + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x2329 + ,simpleLowerCaseMapping:0x2329 + ,simpleTitleCaseMapping:0x2329 + }, + { code:0x232A + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x232A + ,simpleLowerCaseMapping:0x232A + ,simpleTitleCaseMapping:0x232A + }, + { code:0x232B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x232B + ,simpleLowerCaseMapping:0x232B + ,simpleTitleCaseMapping:0x232B + }, + { code:0x232C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x232C + ,simpleLowerCaseMapping:0x232C + ,simpleTitleCaseMapping:0x232C + }, + { code:0x232D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x232D + ,simpleLowerCaseMapping:0x232D + ,simpleTitleCaseMapping:0x232D + }, + { code:0x232E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x232E + ,simpleLowerCaseMapping:0x232E + ,simpleTitleCaseMapping:0x232E + }, + { code:0x232F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x232F + ,simpleLowerCaseMapping:0x232F + ,simpleTitleCaseMapping:0x232F + }, + { code:0x2330 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2330 + ,simpleLowerCaseMapping:0x2330 + ,simpleTitleCaseMapping:0x2330 + }, + { code:0x2331 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2331 + ,simpleLowerCaseMapping:0x2331 + ,simpleTitleCaseMapping:0x2331 + }, + { code:0x2332 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2332 + ,simpleLowerCaseMapping:0x2332 + ,simpleTitleCaseMapping:0x2332 + }, + { code:0x2333 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2333 + ,simpleLowerCaseMapping:0x2333 + ,simpleTitleCaseMapping:0x2333 + }, + { code:0x2334 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2334 + ,simpleLowerCaseMapping:0x2334 + ,simpleTitleCaseMapping:0x2334 + }, + { code:0x2335 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2335 + ,simpleLowerCaseMapping:0x2335 + ,simpleTitleCaseMapping:0x2335 + }, + { code:0x2336 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2336 + ,simpleLowerCaseMapping:0x2336 + ,simpleTitleCaseMapping:0x2336 + }, + { code:0x2337 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2337 + ,simpleLowerCaseMapping:0x2337 + ,simpleTitleCaseMapping:0x2337 + }, + { code:0x2338 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2338 + ,simpleLowerCaseMapping:0x2338 + ,simpleTitleCaseMapping:0x2338 + }, + { code:0x2339 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2339 + ,simpleLowerCaseMapping:0x2339 + ,simpleTitleCaseMapping:0x2339 + }, + { code:0x233A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x233A + ,simpleLowerCaseMapping:0x233A + ,simpleTitleCaseMapping:0x233A + }, + { code:0x233B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x233B + ,simpleLowerCaseMapping:0x233B + ,simpleTitleCaseMapping:0x233B + }, + { code:0x233C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x233C + ,simpleLowerCaseMapping:0x233C + ,simpleTitleCaseMapping:0x233C + }, + { code:0x233D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x233D + ,simpleLowerCaseMapping:0x233D + ,simpleTitleCaseMapping:0x233D + }, + { code:0x233E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x233E + ,simpleLowerCaseMapping:0x233E + ,simpleTitleCaseMapping:0x233E + }, + { code:0x233F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x233F + ,simpleLowerCaseMapping:0x233F + ,simpleTitleCaseMapping:0x233F + }, + { code:0x2340 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2340 + ,simpleLowerCaseMapping:0x2340 + ,simpleTitleCaseMapping:0x2340 + }, + { code:0x2341 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2341 + ,simpleLowerCaseMapping:0x2341 + ,simpleTitleCaseMapping:0x2341 + }, + { code:0x2342 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2342 + ,simpleLowerCaseMapping:0x2342 + ,simpleTitleCaseMapping:0x2342 + }, + { code:0x2343 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2343 + ,simpleLowerCaseMapping:0x2343 + ,simpleTitleCaseMapping:0x2343 + }, + { code:0x2344 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2344 + ,simpleLowerCaseMapping:0x2344 + ,simpleTitleCaseMapping:0x2344 + }, + { code:0x2345 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2345 + ,simpleLowerCaseMapping:0x2345 + ,simpleTitleCaseMapping:0x2345 + }, + { code:0x2346 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2346 + ,simpleLowerCaseMapping:0x2346 + ,simpleTitleCaseMapping:0x2346 + }, + { code:0x2347 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2347 + ,simpleLowerCaseMapping:0x2347 + ,simpleTitleCaseMapping:0x2347 + }, + { code:0x2348 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2348 + ,simpleLowerCaseMapping:0x2348 + ,simpleTitleCaseMapping:0x2348 + }, + { code:0x2349 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2349 + ,simpleLowerCaseMapping:0x2349 + ,simpleTitleCaseMapping:0x2349 + }, + { code:0x234A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x234A + ,simpleLowerCaseMapping:0x234A + ,simpleTitleCaseMapping:0x234A + }, + { code:0x234B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x234B + ,simpleLowerCaseMapping:0x234B + ,simpleTitleCaseMapping:0x234B + }, + { code:0x234C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x234C + ,simpleLowerCaseMapping:0x234C + ,simpleTitleCaseMapping:0x234C + }, + { code:0x234D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x234D + ,simpleLowerCaseMapping:0x234D + ,simpleTitleCaseMapping:0x234D + }, + { code:0x234E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x234E + ,simpleLowerCaseMapping:0x234E + ,simpleTitleCaseMapping:0x234E + }, + { code:0x234F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x234F + ,simpleLowerCaseMapping:0x234F + ,simpleTitleCaseMapping:0x234F + }, + { code:0x2350 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2350 + ,simpleLowerCaseMapping:0x2350 + ,simpleTitleCaseMapping:0x2350 + }, + { code:0x2351 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2351 + ,simpleLowerCaseMapping:0x2351 + ,simpleTitleCaseMapping:0x2351 + }, + { code:0x2352 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2352 + ,simpleLowerCaseMapping:0x2352 + ,simpleTitleCaseMapping:0x2352 + }, + { code:0x2353 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2353 + ,simpleLowerCaseMapping:0x2353 + ,simpleTitleCaseMapping:0x2353 + }, + { code:0x2354 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2354 + ,simpleLowerCaseMapping:0x2354 + ,simpleTitleCaseMapping:0x2354 + }, + { code:0x2355 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2355 + ,simpleLowerCaseMapping:0x2355 + ,simpleTitleCaseMapping:0x2355 + }, + { code:0x2356 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2356 + ,simpleLowerCaseMapping:0x2356 + ,simpleTitleCaseMapping:0x2356 + }, + { code:0x2357 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2357 + ,simpleLowerCaseMapping:0x2357 + ,simpleTitleCaseMapping:0x2357 + }, + { code:0x2358 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2358 + ,simpleLowerCaseMapping:0x2358 + ,simpleTitleCaseMapping:0x2358 + }, + { code:0x2359 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2359 + ,simpleLowerCaseMapping:0x2359 + ,simpleTitleCaseMapping:0x2359 + }, + { code:0x235A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x235A + ,simpleLowerCaseMapping:0x235A + ,simpleTitleCaseMapping:0x235A + }, + { code:0x235B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x235B + ,simpleLowerCaseMapping:0x235B + ,simpleTitleCaseMapping:0x235B + }, + { code:0x235C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x235C + ,simpleLowerCaseMapping:0x235C + ,simpleTitleCaseMapping:0x235C + }, + { code:0x235D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x235D + ,simpleLowerCaseMapping:0x235D + ,simpleTitleCaseMapping:0x235D + }, + { code:0x235E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x235E + ,simpleLowerCaseMapping:0x235E + ,simpleTitleCaseMapping:0x235E + }, + { code:0x235F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x235F + ,simpleLowerCaseMapping:0x235F + ,simpleTitleCaseMapping:0x235F + }, + { code:0x2360 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2360 + ,simpleLowerCaseMapping:0x2360 + ,simpleTitleCaseMapping:0x2360 + }, + { code:0x2361 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2361 + ,simpleLowerCaseMapping:0x2361 + ,simpleTitleCaseMapping:0x2361 + }, + { code:0x2362 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2362 + ,simpleLowerCaseMapping:0x2362 + ,simpleTitleCaseMapping:0x2362 + }, + { code:0x2363 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2363 + ,simpleLowerCaseMapping:0x2363 + ,simpleTitleCaseMapping:0x2363 + }, + { code:0x2364 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2364 + ,simpleLowerCaseMapping:0x2364 + ,simpleTitleCaseMapping:0x2364 + }, + { code:0x2365 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2365 + ,simpleLowerCaseMapping:0x2365 + ,simpleTitleCaseMapping:0x2365 + }, + { code:0x2366 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2366 + ,simpleLowerCaseMapping:0x2366 + ,simpleTitleCaseMapping:0x2366 + }, + { code:0x2367 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2367 + ,simpleLowerCaseMapping:0x2367 + ,simpleTitleCaseMapping:0x2367 + }, + { code:0x2368 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2368 + ,simpleLowerCaseMapping:0x2368 + ,simpleTitleCaseMapping:0x2368 + }, + { code:0x2369 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2369 + ,simpleLowerCaseMapping:0x2369 + ,simpleTitleCaseMapping:0x2369 + }, + { code:0x236A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x236A + ,simpleLowerCaseMapping:0x236A + ,simpleTitleCaseMapping:0x236A + }, + { code:0x236B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x236B + ,simpleLowerCaseMapping:0x236B + ,simpleTitleCaseMapping:0x236B + }, + { code:0x236C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x236C + ,simpleLowerCaseMapping:0x236C + ,simpleTitleCaseMapping:0x236C + }, + { code:0x236D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x236D + ,simpleLowerCaseMapping:0x236D + ,simpleTitleCaseMapping:0x236D + }, + { code:0x236E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x236E + ,simpleLowerCaseMapping:0x236E + ,simpleTitleCaseMapping:0x236E + }, + { code:0x236F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x236F + ,simpleLowerCaseMapping:0x236F + ,simpleTitleCaseMapping:0x236F + }, + { code:0x2370 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2370 + ,simpleLowerCaseMapping:0x2370 + ,simpleTitleCaseMapping:0x2370 + }, + { code:0x2371 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2371 + ,simpleLowerCaseMapping:0x2371 + ,simpleTitleCaseMapping:0x2371 + }, + { code:0x2372 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2372 + ,simpleLowerCaseMapping:0x2372 + ,simpleTitleCaseMapping:0x2372 + }, + { code:0x2373 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2373 + ,simpleLowerCaseMapping:0x2373 + ,simpleTitleCaseMapping:0x2373 + }, + { code:0x2374 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2374 + ,simpleLowerCaseMapping:0x2374 + ,simpleTitleCaseMapping:0x2374 + }, + { code:0x2375 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2375 + ,simpleLowerCaseMapping:0x2375 + ,simpleTitleCaseMapping:0x2375 + }, + { code:0x2376 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2376 + ,simpleLowerCaseMapping:0x2376 + ,simpleTitleCaseMapping:0x2376 + }, + { code:0x2377 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2377 + ,simpleLowerCaseMapping:0x2377 + ,simpleTitleCaseMapping:0x2377 + }, + { code:0x2378 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2378 + ,simpleLowerCaseMapping:0x2378 + ,simpleTitleCaseMapping:0x2378 + }, + { code:0x2379 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2379 + ,simpleLowerCaseMapping:0x2379 + ,simpleTitleCaseMapping:0x2379 + }, + { code:0x237A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x237A + ,simpleLowerCaseMapping:0x237A + ,simpleTitleCaseMapping:0x237A + }, + { code:0x237B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x237B + ,simpleLowerCaseMapping:0x237B + ,simpleTitleCaseMapping:0x237B + }, + { code:0x237C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x237C + ,simpleLowerCaseMapping:0x237C + ,simpleTitleCaseMapping:0x237C + }, + { code:0x237D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x237D + ,simpleLowerCaseMapping:0x237D + ,simpleTitleCaseMapping:0x237D + }, + { code:0x237E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x237E + ,simpleLowerCaseMapping:0x237E + ,simpleTitleCaseMapping:0x237E + }, + { code:0x237F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x237F + ,simpleLowerCaseMapping:0x237F + ,simpleTitleCaseMapping:0x237F + }, + { code:0x2380 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2380 + ,simpleLowerCaseMapping:0x2380 + ,simpleTitleCaseMapping:0x2380 + }, + { code:0x2381 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2381 + ,simpleLowerCaseMapping:0x2381 + ,simpleTitleCaseMapping:0x2381 + }, + { code:0x2382 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2382 + ,simpleLowerCaseMapping:0x2382 + ,simpleTitleCaseMapping:0x2382 + }, + { code:0x2383 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2383 + ,simpleLowerCaseMapping:0x2383 + ,simpleTitleCaseMapping:0x2383 + }, + { code:0x2384 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2384 + ,simpleLowerCaseMapping:0x2384 + ,simpleTitleCaseMapping:0x2384 + }, + { code:0x2385 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2385 + ,simpleLowerCaseMapping:0x2385 + ,simpleTitleCaseMapping:0x2385 + }, + { code:0x2386 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2386 + ,simpleLowerCaseMapping:0x2386 + ,simpleTitleCaseMapping:0x2386 + }, + { code:0x2387 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2387 + ,simpleLowerCaseMapping:0x2387 + ,simpleTitleCaseMapping:0x2387 + }, + { code:0x2388 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2388 + ,simpleLowerCaseMapping:0x2388 + ,simpleTitleCaseMapping:0x2388 + }, + { code:0x2389 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2389 + ,simpleLowerCaseMapping:0x2389 + ,simpleTitleCaseMapping:0x2389 + }, + { code:0x238A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x238A + ,simpleLowerCaseMapping:0x238A + ,simpleTitleCaseMapping:0x238A + }, + { code:0x238B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x238B + ,simpleLowerCaseMapping:0x238B + ,simpleTitleCaseMapping:0x238B + }, + { code:0x238C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x238C + ,simpleLowerCaseMapping:0x238C + ,simpleTitleCaseMapping:0x238C + }, + { code:0x238D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x238D + ,simpleLowerCaseMapping:0x238D + ,simpleTitleCaseMapping:0x238D + }, + { code:0x238E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x238E + ,simpleLowerCaseMapping:0x238E + ,simpleTitleCaseMapping:0x238E + }, + { code:0x238F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x238F + ,simpleLowerCaseMapping:0x238F + ,simpleTitleCaseMapping:0x238F + }, + { code:0x2390 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2390 + ,simpleLowerCaseMapping:0x2390 + ,simpleTitleCaseMapping:0x2390 + }, + { code:0x2391 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2391 + ,simpleLowerCaseMapping:0x2391 + ,simpleTitleCaseMapping:0x2391 + }, + { code:0x2392 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2392 + ,simpleLowerCaseMapping:0x2392 + ,simpleTitleCaseMapping:0x2392 + }, + { code:0x2393 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2393 + ,simpleLowerCaseMapping:0x2393 + ,simpleTitleCaseMapping:0x2393 + }, + { code:0x2394 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2394 + ,simpleLowerCaseMapping:0x2394 + ,simpleTitleCaseMapping:0x2394 + }, + { code:0x2395 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2395 + ,simpleLowerCaseMapping:0x2395 + ,simpleTitleCaseMapping:0x2395 + }, + { code:0x2396 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2396 + ,simpleLowerCaseMapping:0x2396 + ,simpleTitleCaseMapping:0x2396 + }, + { code:0x2397 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2397 + ,simpleLowerCaseMapping:0x2397 + ,simpleTitleCaseMapping:0x2397 + }, + { code:0x2398 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2398 + ,simpleLowerCaseMapping:0x2398 + ,simpleTitleCaseMapping:0x2398 + }, + { code:0x2399 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2399 + ,simpleLowerCaseMapping:0x2399 + ,simpleTitleCaseMapping:0x2399 + }, + { code:0x239A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x239A + ,simpleLowerCaseMapping:0x239A + ,simpleTitleCaseMapping:0x239A + }, + { code:0x239B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x239B + ,simpleLowerCaseMapping:0x239B + ,simpleTitleCaseMapping:0x239B + }, + { code:0x239C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x239C + ,simpleLowerCaseMapping:0x239C + ,simpleTitleCaseMapping:0x239C + }, + { code:0x239D + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x239D + ,simpleLowerCaseMapping:0x239D + ,simpleTitleCaseMapping:0x239D + }, + { code:0x239E + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x239E + ,simpleLowerCaseMapping:0x239E + ,simpleTitleCaseMapping:0x239E + }, + { code:0x239F + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x239F + ,simpleLowerCaseMapping:0x239F + ,simpleTitleCaseMapping:0x239F + }, + { code:0x23A0 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x23A0 + ,simpleLowerCaseMapping:0x23A0 + ,simpleTitleCaseMapping:0x23A0 + }, + { code:0x23A1 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x23A1 + ,simpleLowerCaseMapping:0x23A1 + ,simpleTitleCaseMapping:0x23A1 + }, + { code:0x23A2 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x23A2 + ,simpleLowerCaseMapping:0x23A2 + ,simpleTitleCaseMapping:0x23A2 + }, + { code:0x23A3 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x23A3 + ,simpleLowerCaseMapping:0x23A3 + ,simpleTitleCaseMapping:0x23A3 + }, + { code:0x23A4 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x23A4 + ,simpleLowerCaseMapping:0x23A4 + ,simpleTitleCaseMapping:0x23A4 + }, + { code:0x23A5 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x23A5 + ,simpleLowerCaseMapping:0x23A5 + ,simpleTitleCaseMapping:0x23A5 + }, + { code:0x23A6 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x23A6 + ,simpleLowerCaseMapping:0x23A6 + ,simpleTitleCaseMapping:0x23A6 + }, + { code:0x23A7 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x23A7 + ,simpleLowerCaseMapping:0x23A7 + ,simpleTitleCaseMapping:0x23A7 + }, + { code:0x23A8 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x23A8 + ,simpleLowerCaseMapping:0x23A8 + ,simpleTitleCaseMapping:0x23A8 + }, + { code:0x23A9 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x23A9 + ,simpleLowerCaseMapping:0x23A9 + ,simpleTitleCaseMapping:0x23A9 + }, + { code:0x23AA + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x23AA + ,simpleLowerCaseMapping:0x23AA + ,simpleTitleCaseMapping:0x23AA + }, + { code:0x23AB + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x23AB + ,simpleLowerCaseMapping:0x23AB + ,simpleTitleCaseMapping:0x23AB + }, + { code:0x23AC + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x23AC + ,simpleLowerCaseMapping:0x23AC + ,simpleTitleCaseMapping:0x23AC + }, + { code:0x23AD + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x23AD + ,simpleLowerCaseMapping:0x23AD + ,simpleTitleCaseMapping:0x23AD + }, + { code:0x23AE + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x23AE + ,simpleLowerCaseMapping:0x23AE + ,simpleTitleCaseMapping:0x23AE + }, + { code:0x23AF + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x23AF + ,simpleLowerCaseMapping:0x23AF + ,simpleTitleCaseMapping:0x23AF + }, + { code:0x23B0 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x23B0 + ,simpleLowerCaseMapping:0x23B0 + ,simpleTitleCaseMapping:0x23B0 + }, + { code:0x23B1 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x23B1 + ,simpleLowerCaseMapping:0x23B1 + ,simpleTitleCaseMapping:0x23B1 + }, + { code:0x23B2 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x23B2 + ,simpleLowerCaseMapping:0x23B2 + ,simpleTitleCaseMapping:0x23B2 + }, + { code:0x23B3 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x23B3 + ,simpleLowerCaseMapping:0x23B3 + ,simpleTitleCaseMapping:0x23B3 + }, + { code:0x23B4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23B4 + ,simpleLowerCaseMapping:0x23B4 + ,simpleTitleCaseMapping:0x23B4 + }, + { code:0x23B5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23B5 + ,simpleLowerCaseMapping:0x23B5 + ,simpleTitleCaseMapping:0x23B5 + }, + { code:0x23B6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23B6 + ,simpleLowerCaseMapping:0x23B6 + ,simpleTitleCaseMapping:0x23B6 + }, + { code:0x23B7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23B7 + ,simpleLowerCaseMapping:0x23B7 + ,simpleTitleCaseMapping:0x23B7 + }, + { code:0x23B8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23B8 + ,simpleLowerCaseMapping:0x23B8 + ,simpleTitleCaseMapping:0x23B8 + }, + { code:0x23B9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23B9 + ,simpleLowerCaseMapping:0x23B9 + ,simpleTitleCaseMapping:0x23B9 + }, + { code:0x23BA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23BA + ,simpleLowerCaseMapping:0x23BA + ,simpleTitleCaseMapping:0x23BA + }, + { code:0x23BB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23BB + ,simpleLowerCaseMapping:0x23BB + ,simpleTitleCaseMapping:0x23BB + }, + { code:0x23BC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23BC + ,simpleLowerCaseMapping:0x23BC + ,simpleTitleCaseMapping:0x23BC + }, + { code:0x23BD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23BD + ,simpleLowerCaseMapping:0x23BD + ,simpleTitleCaseMapping:0x23BD + }, + { code:0x23BE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23BE + ,simpleLowerCaseMapping:0x23BE + ,simpleTitleCaseMapping:0x23BE + }, + { code:0x23BF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23BF + ,simpleLowerCaseMapping:0x23BF + ,simpleTitleCaseMapping:0x23BF + }, + { code:0x23C0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23C0 + ,simpleLowerCaseMapping:0x23C0 + ,simpleTitleCaseMapping:0x23C0 + }, + { code:0x23C1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23C1 + ,simpleLowerCaseMapping:0x23C1 + ,simpleTitleCaseMapping:0x23C1 + }, + { code:0x23C2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23C2 + ,simpleLowerCaseMapping:0x23C2 + ,simpleTitleCaseMapping:0x23C2 + }, + { code:0x23C3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23C3 + ,simpleLowerCaseMapping:0x23C3 + ,simpleTitleCaseMapping:0x23C3 + }, + { code:0x23C4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23C4 + ,simpleLowerCaseMapping:0x23C4 + ,simpleTitleCaseMapping:0x23C4 + }, + { code:0x23C5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23C5 + ,simpleLowerCaseMapping:0x23C5 + ,simpleTitleCaseMapping:0x23C5 + }, + { code:0x23C6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23C6 + ,simpleLowerCaseMapping:0x23C6 + ,simpleTitleCaseMapping:0x23C6 + }, + { code:0x23C7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23C7 + ,simpleLowerCaseMapping:0x23C7 + ,simpleTitleCaseMapping:0x23C7 + }, + { code:0x23C8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23C8 + ,simpleLowerCaseMapping:0x23C8 + ,simpleTitleCaseMapping:0x23C8 + }, + { code:0x23C9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23C9 + ,simpleLowerCaseMapping:0x23C9 + ,simpleTitleCaseMapping:0x23C9 + }, + { code:0x23CA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23CA + ,simpleLowerCaseMapping:0x23CA + ,simpleTitleCaseMapping:0x23CA + }, + { code:0x23CB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23CB + ,simpleLowerCaseMapping:0x23CB + ,simpleTitleCaseMapping:0x23CB + }, + { code:0x23CC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23CC + ,simpleLowerCaseMapping:0x23CC + ,simpleTitleCaseMapping:0x23CC + }, + { code:0x23CD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23CD + ,simpleLowerCaseMapping:0x23CD + ,simpleTitleCaseMapping:0x23CD + }, + { code:0x23CE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23CE + ,simpleLowerCaseMapping:0x23CE + ,simpleTitleCaseMapping:0x23CE + }, + { code:0x23CF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23CF + ,simpleLowerCaseMapping:0x23CF + ,simpleTitleCaseMapping:0x23CF + }, + { code:0x23D0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23D0 + ,simpleLowerCaseMapping:0x23D0 + ,simpleTitleCaseMapping:0x23D0 + }, + { code:0x23D1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23D1 + ,simpleLowerCaseMapping:0x23D1 + ,simpleTitleCaseMapping:0x23D1 + }, + { code:0x23D2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23D2 + ,simpleLowerCaseMapping:0x23D2 + ,simpleTitleCaseMapping:0x23D2 + }, + { code:0x23D3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23D3 + ,simpleLowerCaseMapping:0x23D3 + ,simpleTitleCaseMapping:0x23D3 + }, + { code:0x23D4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23D4 + ,simpleLowerCaseMapping:0x23D4 + ,simpleTitleCaseMapping:0x23D4 + }, + { code:0x23D5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23D5 + ,simpleLowerCaseMapping:0x23D5 + ,simpleTitleCaseMapping:0x23D5 + }, + { code:0x23D6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23D6 + ,simpleLowerCaseMapping:0x23D6 + ,simpleTitleCaseMapping:0x23D6 + }, + { code:0x23D7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23D7 + ,simpleLowerCaseMapping:0x23D7 + ,simpleTitleCaseMapping:0x23D7 + }, + { code:0x23D8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23D8 + ,simpleLowerCaseMapping:0x23D8 + ,simpleTitleCaseMapping:0x23D8 + }, + { code:0x23D9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23D9 + ,simpleLowerCaseMapping:0x23D9 + ,simpleTitleCaseMapping:0x23D9 + }, + { code:0x23DA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23DA + ,simpleLowerCaseMapping:0x23DA + ,simpleTitleCaseMapping:0x23DA + }, + { code:0x23DB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23DB + ,simpleLowerCaseMapping:0x23DB + ,simpleTitleCaseMapping:0x23DB + }, + { code:0x23DC + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x23DC + ,simpleLowerCaseMapping:0x23DC + ,simpleTitleCaseMapping:0x23DC + }, + { code:0x23DD + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x23DD + ,simpleLowerCaseMapping:0x23DD + ,simpleTitleCaseMapping:0x23DD + }, + { code:0x23DE + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x23DE + ,simpleLowerCaseMapping:0x23DE + ,simpleTitleCaseMapping:0x23DE + }, + { code:0x23DF + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x23DF + ,simpleLowerCaseMapping:0x23DF + ,simpleTitleCaseMapping:0x23DF + }, + { code:0x23E0 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x23E0 + ,simpleLowerCaseMapping:0x23E0 + ,simpleTitleCaseMapping:0x23E0 + }, + { code:0x23E1 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x23E1 + ,simpleLowerCaseMapping:0x23E1 + ,simpleTitleCaseMapping:0x23E1 + }, + { code:0x23E2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23E2 + ,simpleLowerCaseMapping:0x23E2 + ,simpleTitleCaseMapping:0x23E2 + }, + { code:0x23E3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23E3 + ,simpleLowerCaseMapping:0x23E3 + ,simpleTitleCaseMapping:0x23E3 + }, + { code:0x23E4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23E4 + ,simpleLowerCaseMapping:0x23E4 + ,simpleTitleCaseMapping:0x23E4 + }, + { code:0x23E5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23E5 + ,simpleLowerCaseMapping:0x23E5 + ,simpleTitleCaseMapping:0x23E5 + }, + { code:0x23E6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23E6 + ,simpleLowerCaseMapping:0x23E6 + ,simpleTitleCaseMapping:0x23E6 + }, + { code:0x23E7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x23E7 + ,simpleLowerCaseMapping:0x23E7 + ,simpleTitleCaseMapping:0x23E7 + }, + { code:0x2400 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2400 + ,simpleLowerCaseMapping:0x2400 + ,simpleTitleCaseMapping:0x2400 + }, + { code:0x2401 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2401 + ,simpleLowerCaseMapping:0x2401 + ,simpleTitleCaseMapping:0x2401 + }, + { code:0x2402 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2402 + ,simpleLowerCaseMapping:0x2402 + ,simpleTitleCaseMapping:0x2402 + }, + { code:0x2403 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2403 + ,simpleLowerCaseMapping:0x2403 + ,simpleTitleCaseMapping:0x2403 + }, + { code:0x2404 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2404 + ,simpleLowerCaseMapping:0x2404 + ,simpleTitleCaseMapping:0x2404 + }, + { code:0x2405 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2405 + ,simpleLowerCaseMapping:0x2405 + ,simpleTitleCaseMapping:0x2405 + }, + { code:0x2406 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2406 + ,simpleLowerCaseMapping:0x2406 + ,simpleTitleCaseMapping:0x2406 + }, + { code:0x2407 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2407 + ,simpleLowerCaseMapping:0x2407 + ,simpleTitleCaseMapping:0x2407 + }, + { code:0x2408 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2408 + ,simpleLowerCaseMapping:0x2408 + ,simpleTitleCaseMapping:0x2408 + }, + { code:0x2409 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2409 + ,simpleLowerCaseMapping:0x2409 + ,simpleTitleCaseMapping:0x2409 + }, + { code:0x240A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x240A + ,simpleLowerCaseMapping:0x240A + ,simpleTitleCaseMapping:0x240A + }, + { code:0x240B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x240B + ,simpleLowerCaseMapping:0x240B + ,simpleTitleCaseMapping:0x240B + }, + { code:0x240C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x240C + ,simpleLowerCaseMapping:0x240C + ,simpleTitleCaseMapping:0x240C + }, + { code:0x240D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x240D + ,simpleLowerCaseMapping:0x240D + ,simpleTitleCaseMapping:0x240D + }, + { code:0x240E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x240E + ,simpleLowerCaseMapping:0x240E + ,simpleTitleCaseMapping:0x240E + }, + { code:0x240F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x240F + ,simpleLowerCaseMapping:0x240F + ,simpleTitleCaseMapping:0x240F + }, + { code:0x2410 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2410 + ,simpleLowerCaseMapping:0x2410 + ,simpleTitleCaseMapping:0x2410 + }, + { code:0x2411 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2411 + ,simpleLowerCaseMapping:0x2411 + ,simpleTitleCaseMapping:0x2411 + }, + { code:0x2412 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2412 + ,simpleLowerCaseMapping:0x2412 + ,simpleTitleCaseMapping:0x2412 + }, + { code:0x2413 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2413 + ,simpleLowerCaseMapping:0x2413 + ,simpleTitleCaseMapping:0x2413 + }, + { code:0x2414 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2414 + ,simpleLowerCaseMapping:0x2414 + ,simpleTitleCaseMapping:0x2414 + }, + { code:0x2415 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2415 + ,simpleLowerCaseMapping:0x2415 + ,simpleTitleCaseMapping:0x2415 + }, + { code:0x2416 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2416 + ,simpleLowerCaseMapping:0x2416 + ,simpleTitleCaseMapping:0x2416 + }, + { code:0x2417 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2417 + ,simpleLowerCaseMapping:0x2417 + ,simpleTitleCaseMapping:0x2417 + }, + { code:0x2418 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2418 + ,simpleLowerCaseMapping:0x2418 + ,simpleTitleCaseMapping:0x2418 + }, + { code:0x2419 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2419 + ,simpleLowerCaseMapping:0x2419 + ,simpleTitleCaseMapping:0x2419 + }, + { code:0x241A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x241A + ,simpleLowerCaseMapping:0x241A + ,simpleTitleCaseMapping:0x241A + }, + { code:0x241B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x241B + ,simpleLowerCaseMapping:0x241B + ,simpleTitleCaseMapping:0x241B + }, + { code:0x241C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x241C + ,simpleLowerCaseMapping:0x241C + ,simpleTitleCaseMapping:0x241C + }, + { code:0x241D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x241D + ,simpleLowerCaseMapping:0x241D + ,simpleTitleCaseMapping:0x241D + }, + { code:0x241E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x241E + ,simpleLowerCaseMapping:0x241E + ,simpleTitleCaseMapping:0x241E + }, + { code:0x241F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x241F + ,simpleLowerCaseMapping:0x241F + ,simpleTitleCaseMapping:0x241F + }, + { code:0x2420 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2420 + ,simpleLowerCaseMapping:0x2420 + ,simpleTitleCaseMapping:0x2420 + }, + { code:0x2421 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2421 + ,simpleLowerCaseMapping:0x2421 + ,simpleTitleCaseMapping:0x2421 + }, + { code:0x2422 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2422 + ,simpleLowerCaseMapping:0x2422 + ,simpleTitleCaseMapping:0x2422 + }, + { code:0x2423 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2423 + ,simpleLowerCaseMapping:0x2423 + ,simpleTitleCaseMapping:0x2423 + }, + { code:0x2424 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2424 + ,simpleLowerCaseMapping:0x2424 + ,simpleTitleCaseMapping:0x2424 + }, + { code:0x2425 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2425 + ,simpleLowerCaseMapping:0x2425 + ,simpleTitleCaseMapping:0x2425 + }, + { code:0x2426 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2426 + ,simpleLowerCaseMapping:0x2426 + ,simpleTitleCaseMapping:0x2426 + }, + { code:0x2440 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2440 + ,simpleLowerCaseMapping:0x2440 + ,simpleTitleCaseMapping:0x2440 + }, + { code:0x2441 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2441 + ,simpleLowerCaseMapping:0x2441 + ,simpleTitleCaseMapping:0x2441 + }, + { code:0x2442 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2442 + ,simpleLowerCaseMapping:0x2442 + ,simpleTitleCaseMapping:0x2442 + }, + { code:0x2443 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2443 + ,simpleLowerCaseMapping:0x2443 + ,simpleTitleCaseMapping:0x2443 + }, + { code:0x2444 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2444 + ,simpleLowerCaseMapping:0x2444 + ,simpleTitleCaseMapping:0x2444 + }, + { code:0x2445 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2445 + ,simpleLowerCaseMapping:0x2445 + ,simpleTitleCaseMapping:0x2445 + }, + { code:0x2446 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2446 + ,simpleLowerCaseMapping:0x2446 + ,simpleTitleCaseMapping:0x2446 + }, + { code:0x2447 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2447 + ,simpleLowerCaseMapping:0x2447 + ,simpleTitleCaseMapping:0x2447 + }, + { code:0x2448 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2448 + ,simpleLowerCaseMapping:0x2448 + ,simpleTitleCaseMapping:0x2448 + }, + { code:0x2449 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2449 + ,simpleLowerCaseMapping:0x2449 + ,simpleTitleCaseMapping:0x2449 + }, + { code:0x244A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x244A + ,simpleLowerCaseMapping:0x244A + ,simpleTitleCaseMapping:0x244A + }, + { code:0x2460 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2460 + ,simpleLowerCaseMapping:0x2460 + ,simpleTitleCaseMapping:0x2460 + }, + { code:0x2461 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2461 + ,simpleLowerCaseMapping:0x2461 + ,simpleTitleCaseMapping:0x2461 + }, + { code:0x2462 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2462 + ,simpleLowerCaseMapping:0x2462 + ,simpleTitleCaseMapping:0x2462 + }, + { code:0x2463 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2463 + ,simpleLowerCaseMapping:0x2463 + ,simpleTitleCaseMapping:0x2463 + }, + { code:0x2464 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2464 + ,simpleLowerCaseMapping:0x2464 + ,simpleTitleCaseMapping:0x2464 + }, + { code:0x2465 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2465 + ,simpleLowerCaseMapping:0x2465 + ,simpleTitleCaseMapping:0x2465 + }, + { code:0x2466 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2466 + ,simpleLowerCaseMapping:0x2466 + ,simpleTitleCaseMapping:0x2466 + }, + { code:0x2467 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2467 + ,simpleLowerCaseMapping:0x2467 + ,simpleTitleCaseMapping:0x2467 + }, + { code:0x2468 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2468 + ,simpleLowerCaseMapping:0x2468 + ,simpleTitleCaseMapping:0x2468 + }, + { code:0x2469 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2469 + ,simpleLowerCaseMapping:0x2469 + ,simpleTitleCaseMapping:0x2469 + }, + { code:0x246A + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x246A + ,simpleLowerCaseMapping:0x246A + ,simpleTitleCaseMapping:0x246A + }, + { code:0x246B + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x246B + ,simpleLowerCaseMapping:0x246B + ,simpleTitleCaseMapping:0x246B + }, + { code:0x246C + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x246C + ,simpleLowerCaseMapping:0x246C + ,simpleTitleCaseMapping:0x246C + }, + { code:0x246D + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x246D + ,simpleLowerCaseMapping:0x246D + ,simpleTitleCaseMapping:0x246D + }, + { code:0x246E + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x246E + ,simpleLowerCaseMapping:0x246E + ,simpleTitleCaseMapping:0x246E + }, + { code:0x246F + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x246F + ,simpleLowerCaseMapping:0x246F + ,simpleTitleCaseMapping:0x246F + }, + { code:0x2470 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2470 + ,simpleLowerCaseMapping:0x2470 + ,simpleTitleCaseMapping:0x2470 + }, + { code:0x2471 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2471 + ,simpleLowerCaseMapping:0x2471 + ,simpleTitleCaseMapping:0x2471 + }, + { code:0x2472 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2472 + ,simpleLowerCaseMapping:0x2472 + ,simpleTitleCaseMapping:0x2472 + }, + { code:0x2473 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2473 + ,simpleLowerCaseMapping:0x2473 + ,simpleTitleCaseMapping:0x2473 + }, + { code:0x2474 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2474 + ,simpleLowerCaseMapping:0x2474 + ,simpleTitleCaseMapping:0x2474 + }, + { code:0x2475 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2475 + ,simpleLowerCaseMapping:0x2475 + ,simpleTitleCaseMapping:0x2475 + }, + { code:0x2476 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2476 + ,simpleLowerCaseMapping:0x2476 + ,simpleTitleCaseMapping:0x2476 + }, + { code:0x2477 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2477 + ,simpleLowerCaseMapping:0x2477 + ,simpleTitleCaseMapping:0x2477 + }, + { code:0x2478 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2478 + ,simpleLowerCaseMapping:0x2478 + ,simpleTitleCaseMapping:0x2478 + }, + { code:0x2479 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2479 + ,simpleLowerCaseMapping:0x2479 + ,simpleTitleCaseMapping:0x2479 + }, + { code:0x247A + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x247A + ,simpleLowerCaseMapping:0x247A + ,simpleTitleCaseMapping:0x247A + }, + { code:0x247B + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x247B + ,simpleLowerCaseMapping:0x247B + ,simpleTitleCaseMapping:0x247B + }, + { code:0x247C + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x247C + ,simpleLowerCaseMapping:0x247C + ,simpleTitleCaseMapping:0x247C + }, + { code:0x247D + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x247D + ,simpleLowerCaseMapping:0x247D + ,simpleTitleCaseMapping:0x247D + }, + { code:0x247E + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x247E + ,simpleLowerCaseMapping:0x247E + ,simpleTitleCaseMapping:0x247E + }, + { code:0x247F + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x247F + ,simpleLowerCaseMapping:0x247F + ,simpleTitleCaseMapping:0x247F + }, + { code:0x2480 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2480 + ,simpleLowerCaseMapping:0x2480 + ,simpleTitleCaseMapping:0x2480 + }, + { code:0x2481 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2481 + ,simpleLowerCaseMapping:0x2481 + ,simpleTitleCaseMapping:0x2481 + }, + { code:0x2482 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2482 + ,simpleLowerCaseMapping:0x2482 + ,simpleTitleCaseMapping:0x2482 + }, + { code:0x2483 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2483 + ,simpleLowerCaseMapping:0x2483 + ,simpleTitleCaseMapping:0x2483 + }, + { code:0x2484 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2484 + ,simpleLowerCaseMapping:0x2484 + ,simpleTitleCaseMapping:0x2484 + }, + { code:0x2485 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2485 + ,simpleLowerCaseMapping:0x2485 + ,simpleTitleCaseMapping:0x2485 + }, + { code:0x2486 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2486 + ,simpleLowerCaseMapping:0x2486 + ,simpleTitleCaseMapping:0x2486 + }, + { code:0x2487 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2487 + ,simpleLowerCaseMapping:0x2487 + ,simpleTitleCaseMapping:0x2487 + }, + { code:0x2488 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2488 + ,simpleLowerCaseMapping:0x2488 + ,simpleTitleCaseMapping:0x2488 + }, + { code:0x2489 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2489 + ,simpleLowerCaseMapping:0x2489 + ,simpleTitleCaseMapping:0x2489 + }, + { code:0x248A + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x248A + ,simpleLowerCaseMapping:0x248A + ,simpleTitleCaseMapping:0x248A + }, + { code:0x248B + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x248B + ,simpleLowerCaseMapping:0x248B + ,simpleTitleCaseMapping:0x248B + }, + { code:0x248C + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x248C + ,simpleLowerCaseMapping:0x248C + ,simpleTitleCaseMapping:0x248C + }, + { code:0x248D + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x248D + ,simpleLowerCaseMapping:0x248D + ,simpleTitleCaseMapping:0x248D + }, + { code:0x248E + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x248E + ,simpleLowerCaseMapping:0x248E + ,simpleTitleCaseMapping:0x248E + }, + { code:0x248F + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x248F + ,simpleLowerCaseMapping:0x248F + ,simpleTitleCaseMapping:0x248F + }, + { code:0x2490 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2490 + ,simpleLowerCaseMapping:0x2490 + ,simpleTitleCaseMapping:0x2490 + }, + { code:0x2491 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2491 + ,simpleLowerCaseMapping:0x2491 + ,simpleTitleCaseMapping:0x2491 + }, + { code:0x2492 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2492 + ,simpleLowerCaseMapping:0x2492 + ,simpleTitleCaseMapping:0x2492 + }, + { code:0x2493 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2493 + ,simpleLowerCaseMapping:0x2493 + ,simpleTitleCaseMapping:0x2493 + }, + { code:0x2494 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2494 + ,simpleLowerCaseMapping:0x2494 + ,simpleTitleCaseMapping:0x2494 + }, + { code:0x2495 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2495 + ,simpleLowerCaseMapping:0x2495 + ,simpleTitleCaseMapping:0x2495 + }, + { code:0x2496 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2496 + ,simpleLowerCaseMapping:0x2496 + ,simpleTitleCaseMapping:0x2496 + }, + { code:0x2497 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2497 + ,simpleLowerCaseMapping:0x2497 + ,simpleTitleCaseMapping:0x2497 + }, + { code:0x2498 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2498 + ,simpleLowerCaseMapping:0x2498 + ,simpleTitleCaseMapping:0x2498 + }, + { code:0x2499 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2499 + ,simpleLowerCaseMapping:0x2499 + ,simpleTitleCaseMapping:0x2499 + }, + { code:0x249A + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x249A + ,simpleLowerCaseMapping:0x249A + ,simpleTitleCaseMapping:0x249A + }, + { code:0x249B + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x249B + ,simpleLowerCaseMapping:0x249B + ,simpleTitleCaseMapping:0x249B + }, + { code:0x249C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x249C + ,simpleLowerCaseMapping:0x249C + ,simpleTitleCaseMapping:0x249C + }, + { code:0x249D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x249D + ,simpleLowerCaseMapping:0x249D + ,simpleTitleCaseMapping:0x249D + }, + { code:0x249E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x249E + ,simpleLowerCaseMapping:0x249E + ,simpleTitleCaseMapping:0x249E + }, + { code:0x249F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x249F + ,simpleLowerCaseMapping:0x249F + ,simpleTitleCaseMapping:0x249F + }, + { code:0x24A0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24A0 + ,simpleLowerCaseMapping:0x24A0 + ,simpleTitleCaseMapping:0x24A0 + }, + { code:0x24A1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24A1 + ,simpleLowerCaseMapping:0x24A1 + ,simpleTitleCaseMapping:0x24A1 + }, + { code:0x24A2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24A2 + ,simpleLowerCaseMapping:0x24A2 + ,simpleTitleCaseMapping:0x24A2 + }, + { code:0x24A3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24A3 + ,simpleLowerCaseMapping:0x24A3 + ,simpleTitleCaseMapping:0x24A3 + }, + { code:0x24A4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24A4 + ,simpleLowerCaseMapping:0x24A4 + ,simpleTitleCaseMapping:0x24A4 + }, + { code:0x24A5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24A5 + ,simpleLowerCaseMapping:0x24A5 + ,simpleTitleCaseMapping:0x24A5 + }, + { code:0x24A6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24A6 + ,simpleLowerCaseMapping:0x24A6 + ,simpleTitleCaseMapping:0x24A6 + }, + { code:0x24A7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24A7 + ,simpleLowerCaseMapping:0x24A7 + ,simpleTitleCaseMapping:0x24A7 + }, + { code:0x24A8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24A8 + ,simpleLowerCaseMapping:0x24A8 + ,simpleTitleCaseMapping:0x24A8 + }, + { code:0x24A9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24A9 + ,simpleLowerCaseMapping:0x24A9 + ,simpleTitleCaseMapping:0x24A9 + }, + { code:0x24AA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24AA + ,simpleLowerCaseMapping:0x24AA + ,simpleTitleCaseMapping:0x24AA + }, + { code:0x24AB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24AB + ,simpleLowerCaseMapping:0x24AB + ,simpleTitleCaseMapping:0x24AB + }, + { code:0x24AC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24AC + ,simpleLowerCaseMapping:0x24AC + ,simpleTitleCaseMapping:0x24AC + }, + { code:0x24AD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24AD + ,simpleLowerCaseMapping:0x24AD + ,simpleTitleCaseMapping:0x24AD + }, + { code:0x24AE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24AE + ,simpleLowerCaseMapping:0x24AE + ,simpleTitleCaseMapping:0x24AE + }, + { code:0x24AF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24AF + ,simpleLowerCaseMapping:0x24AF + ,simpleTitleCaseMapping:0x24AF + }, + { code:0x24B0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24B0 + ,simpleLowerCaseMapping:0x24B0 + ,simpleTitleCaseMapping:0x24B0 + }, + { code:0x24B1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24B1 + ,simpleLowerCaseMapping:0x24B1 + ,simpleTitleCaseMapping:0x24B1 + }, + { code:0x24B2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24B2 + ,simpleLowerCaseMapping:0x24B2 + ,simpleTitleCaseMapping:0x24B2 + }, + { code:0x24B3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24B3 + ,simpleLowerCaseMapping:0x24B3 + ,simpleTitleCaseMapping:0x24B3 + }, + { code:0x24B4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24B4 + ,simpleLowerCaseMapping:0x24B4 + ,simpleTitleCaseMapping:0x24B4 + }, + { code:0x24B5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24B5 + ,simpleLowerCaseMapping:0x24B5 + ,simpleTitleCaseMapping:0x24B5 + }, + { code:0x24B6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24B6 + ,simpleLowerCaseMapping:0x24D0 + ,simpleTitleCaseMapping:0x24B6 + }, + { code:0x24B7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24B7 + ,simpleLowerCaseMapping:0x24D1 + ,simpleTitleCaseMapping:0x24B7 + }, + { code:0x24B8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24B8 + ,simpleLowerCaseMapping:0x24D2 + ,simpleTitleCaseMapping:0x24B8 + }, + { code:0x24B9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24B9 + ,simpleLowerCaseMapping:0x24D3 + ,simpleTitleCaseMapping:0x24B9 + }, + { code:0x24BA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24BA + ,simpleLowerCaseMapping:0x24D4 + ,simpleTitleCaseMapping:0x24BA + }, + { code:0x24BB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24BB + ,simpleLowerCaseMapping:0x24D5 + ,simpleTitleCaseMapping:0x24BB + }, + { code:0x24BC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24BC + ,simpleLowerCaseMapping:0x24D6 + ,simpleTitleCaseMapping:0x24BC + }, + { code:0x24BD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24BD + ,simpleLowerCaseMapping:0x24D7 + ,simpleTitleCaseMapping:0x24BD + }, + { code:0x24BE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24BE + ,simpleLowerCaseMapping:0x24D8 + ,simpleTitleCaseMapping:0x24BE + }, + { code:0x24BF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24BF + ,simpleLowerCaseMapping:0x24D9 + ,simpleTitleCaseMapping:0x24BF + }, + { code:0x24C0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24C0 + ,simpleLowerCaseMapping:0x24DA + ,simpleTitleCaseMapping:0x24C0 + }, + { code:0x24C1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24C1 + ,simpleLowerCaseMapping:0x24DB + ,simpleTitleCaseMapping:0x24C1 + }, + { code:0x24C2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24C2 + ,simpleLowerCaseMapping:0x24DC + ,simpleTitleCaseMapping:0x24C2 + }, + { code:0x24C3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24C3 + ,simpleLowerCaseMapping:0x24DD + ,simpleTitleCaseMapping:0x24C3 + }, + { code:0x24C4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24C4 + ,simpleLowerCaseMapping:0x24DE + ,simpleTitleCaseMapping:0x24C4 + }, + { code:0x24C5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24C5 + ,simpleLowerCaseMapping:0x24DF + ,simpleTitleCaseMapping:0x24C5 + }, + { code:0x24C6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24C6 + ,simpleLowerCaseMapping:0x24E0 + ,simpleTitleCaseMapping:0x24C6 + }, + { code:0x24C7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24C7 + ,simpleLowerCaseMapping:0x24E1 + ,simpleTitleCaseMapping:0x24C7 + }, + { code:0x24C8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24C8 + ,simpleLowerCaseMapping:0x24E2 + ,simpleTitleCaseMapping:0x24C8 + }, + { code:0x24C9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24C9 + ,simpleLowerCaseMapping:0x24E3 + ,simpleTitleCaseMapping:0x24C9 + }, + { code:0x24CA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24CA + ,simpleLowerCaseMapping:0x24E4 + ,simpleTitleCaseMapping:0x24CA + }, + { code:0x24CB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24CB + ,simpleLowerCaseMapping:0x24E5 + ,simpleTitleCaseMapping:0x24CB + }, + { code:0x24CC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24CC + ,simpleLowerCaseMapping:0x24E6 + ,simpleTitleCaseMapping:0x24CC + }, + { code:0x24CD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24CD + ,simpleLowerCaseMapping:0x24E7 + ,simpleTitleCaseMapping:0x24CD + }, + { code:0x24CE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24CE + ,simpleLowerCaseMapping:0x24E8 + ,simpleTitleCaseMapping:0x24CE + }, + { code:0x24CF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24CF + ,simpleLowerCaseMapping:0x24E9 + ,simpleTitleCaseMapping:0x24CF + }, + { code:0x24D0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24B6 + ,simpleLowerCaseMapping:0x24D0 + ,simpleTitleCaseMapping:0x24B6 + }, + { code:0x24D1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24B7 + ,simpleLowerCaseMapping:0x24D1 + ,simpleTitleCaseMapping:0x24B7 + }, + { code:0x24D2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24B8 + ,simpleLowerCaseMapping:0x24D2 + ,simpleTitleCaseMapping:0x24B8 + }, + { code:0x24D3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24B9 + ,simpleLowerCaseMapping:0x24D3 + ,simpleTitleCaseMapping:0x24B9 + }, + { code:0x24D4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24BA + ,simpleLowerCaseMapping:0x24D4 + ,simpleTitleCaseMapping:0x24BA + }, + { code:0x24D5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24BB + ,simpleLowerCaseMapping:0x24D5 + ,simpleTitleCaseMapping:0x24BB + }, + { code:0x24D6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24BC + ,simpleLowerCaseMapping:0x24D6 + ,simpleTitleCaseMapping:0x24BC + }, + { code:0x24D7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24BD + ,simpleLowerCaseMapping:0x24D7 + ,simpleTitleCaseMapping:0x24BD + }, + { code:0x24D8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24BE + ,simpleLowerCaseMapping:0x24D8 + ,simpleTitleCaseMapping:0x24BE + }, + { code:0x24D9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24BF + ,simpleLowerCaseMapping:0x24D9 + ,simpleTitleCaseMapping:0x24BF + }, + { code:0x24DA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24C0 + ,simpleLowerCaseMapping:0x24DA + ,simpleTitleCaseMapping:0x24C0 + }, + { code:0x24DB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24C1 + ,simpleLowerCaseMapping:0x24DB + ,simpleTitleCaseMapping:0x24C1 + }, + { code:0x24DC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24C2 + ,simpleLowerCaseMapping:0x24DC + ,simpleTitleCaseMapping:0x24C2 + }, + { code:0x24DD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24C3 + ,simpleLowerCaseMapping:0x24DD + ,simpleTitleCaseMapping:0x24C3 + }, + { code:0x24DE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24C4 + ,simpleLowerCaseMapping:0x24DE + ,simpleTitleCaseMapping:0x24C4 + }, + { code:0x24DF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24C5 + ,simpleLowerCaseMapping:0x24DF + ,simpleTitleCaseMapping:0x24C5 + }, + { code:0x24E0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24C6 + ,simpleLowerCaseMapping:0x24E0 + ,simpleTitleCaseMapping:0x24C6 + }, + { code:0x24E1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24C7 + ,simpleLowerCaseMapping:0x24E1 + ,simpleTitleCaseMapping:0x24C7 + }, + { code:0x24E2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24C8 + ,simpleLowerCaseMapping:0x24E2 + ,simpleTitleCaseMapping:0x24C8 + }, + { code:0x24E3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24C9 + ,simpleLowerCaseMapping:0x24E3 + ,simpleTitleCaseMapping:0x24C9 + }, + { code:0x24E4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24CA + ,simpleLowerCaseMapping:0x24E4 + ,simpleTitleCaseMapping:0x24CA + }, + { code:0x24E5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24CB + ,simpleLowerCaseMapping:0x24E5 + ,simpleTitleCaseMapping:0x24CB + }, + { code:0x24E6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24CC + ,simpleLowerCaseMapping:0x24E6 + ,simpleTitleCaseMapping:0x24CC + }, + { code:0x24E7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24CD + ,simpleLowerCaseMapping:0x24E7 + ,simpleTitleCaseMapping:0x24CD + }, + { code:0x24E8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24CE + ,simpleLowerCaseMapping:0x24E8 + ,simpleTitleCaseMapping:0x24CE + }, + { code:0x24E9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x24CF + ,simpleLowerCaseMapping:0x24E9 + ,simpleTitleCaseMapping:0x24CF + }, + { code:0x24EA + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x24EA + ,simpleLowerCaseMapping:0x24EA + ,simpleTitleCaseMapping:0x24EA + }, + { code:0x24EB + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x24EB + ,simpleLowerCaseMapping:0x24EB + ,simpleTitleCaseMapping:0x24EB + }, + { code:0x24EC + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x24EC + ,simpleLowerCaseMapping:0x24EC + ,simpleTitleCaseMapping:0x24EC + }, + { code:0x24ED + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x24ED + ,simpleLowerCaseMapping:0x24ED + ,simpleTitleCaseMapping:0x24ED + }, + { code:0x24EE + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x24EE + ,simpleLowerCaseMapping:0x24EE + ,simpleTitleCaseMapping:0x24EE + }, + { code:0x24EF + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x24EF + ,simpleLowerCaseMapping:0x24EF + ,simpleTitleCaseMapping:0x24EF + }, + { code:0x24F0 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x24F0 + ,simpleLowerCaseMapping:0x24F0 + ,simpleTitleCaseMapping:0x24F0 + }, + { code:0x24F1 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x24F1 + ,simpleLowerCaseMapping:0x24F1 + ,simpleTitleCaseMapping:0x24F1 + }, + { code:0x24F2 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x24F2 + ,simpleLowerCaseMapping:0x24F2 + ,simpleTitleCaseMapping:0x24F2 + }, + { code:0x24F3 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x24F3 + ,simpleLowerCaseMapping:0x24F3 + ,simpleTitleCaseMapping:0x24F3 + }, + { code:0x24F4 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x24F4 + ,simpleLowerCaseMapping:0x24F4 + ,simpleTitleCaseMapping:0x24F4 + }, + { code:0x24F5 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x24F5 + ,simpleLowerCaseMapping:0x24F5 + ,simpleTitleCaseMapping:0x24F5 + }, + { code:0x24F6 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x24F6 + ,simpleLowerCaseMapping:0x24F6 + ,simpleTitleCaseMapping:0x24F6 + }, + { code:0x24F7 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x24F7 + ,simpleLowerCaseMapping:0x24F7 + ,simpleTitleCaseMapping:0x24F7 + }, + { code:0x24F8 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x24F8 + ,simpleLowerCaseMapping:0x24F8 + ,simpleTitleCaseMapping:0x24F8 + }, + { code:0x24F9 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x24F9 + ,simpleLowerCaseMapping:0x24F9 + ,simpleTitleCaseMapping:0x24F9 + }, + { code:0x24FA + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x24FA + ,simpleLowerCaseMapping:0x24FA + ,simpleTitleCaseMapping:0x24FA + }, + { code:0x24FB + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x24FB + ,simpleLowerCaseMapping:0x24FB + ,simpleTitleCaseMapping:0x24FB + }, + { code:0x24FC + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x24FC + ,simpleLowerCaseMapping:0x24FC + ,simpleTitleCaseMapping:0x24FC + }, + { code:0x24FD + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x24FD + ,simpleLowerCaseMapping:0x24FD + ,simpleTitleCaseMapping:0x24FD + }, + { code:0x24FE + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x24FE + ,simpleLowerCaseMapping:0x24FE + ,simpleTitleCaseMapping:0x24FE + }, + { code:0x24FF + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x24FF + ,simpleLowerCaseMapping:0x24FF + ,simpleTitleCaseMapping:0x24FF + }, + { code:0x2500 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2500 + ,simpleLowerCaseMapping:0x2500 + ,simpleTitleCaseMapping:0x2500 + }, + { code:0x2501 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2501 + ,simpleLowerCaseMapping:0x2501 + ,simpleTitleCaseMapping:0x2501 + }, + { code:0x2502 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2502 + ,simpleLowerCaseMapping:0x2502 + ,simpleTitleCaseMapping:0x2502 + }, + { code:0x2503 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2503 + ,simpleLowerCaseMapping:0x2503 + ,simpleTitleCaseMapping:0x2503 + }, + { code:0x2504 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2504 + ,simpleLowerCaseMapping:0x2504 + ,simpleTitleCaseMapping:0x2504 + }, + { code:0x2505 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2505 + ,simpleLowerCaseMapping:0x2505 + ,simpleTitleCaseMapping:0x2505 + }, + { code:0x2506 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2506 + ,simpleLowerCaseMapping:0x2506 + ,simpleTitleCaseMapping:0x2506 + }, + { code:0x2507 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2507 + ,simpleLowerCaseMapping:0x2507 + ,simpleTitleCaseMapping:0x2507 + }, + { code:0x2508 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2508 + ,simpleLowerCaseMapping:0x2508 + ,simpleTitleCaseMapping:0x2508 + }, + { code:0x2509 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2509 + ,simpleLowerCaseMapping:0x2509 + ,simpleTitleCaseMapping:0x2509 + }, + { code:0x250A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x250A + ,simpleLowerCaseMapping:0x250A + ,simpleTitleCaseMapping:0x250A + }, + { code:0x250B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x250B + ,simpleLowerCaseMapping:0x250B + ,simpleTitleCaseMapping:0x250B + }, + { code:0x250C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x250C + ,simpleLowerCaseMapping:0x250C + ,simpleTitleCaseMapping:0x250C + }, + { code:0x250D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x250D + ,simpleLowerCaseMapping:0x250D + ,simpleTitleCaseMapping:0x250D + }, + { code:0x250E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x250E + ,simpleLowerCaseMapping:0x250E + ,simpleTitleCaseMapping:0x250E + }, + { code:0x250F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x250F + ,simpleLowerCaseMapping:0x250F + ,simpleTitleCaseMapping:0x250F + }, + { code:0x2510 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2510 + ,simpleLowerCaseMapping:0x2510 + ,simpleTitleCaseMapping:0x2510 + }, + { code:0x2511 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2511 + ,simpleLowerCaseMapping:0x2511 + ,simpleTitleCaseMapping:0x2511 + }, + { code:0x2512 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2512 + ,simpleLowerCaseMapping:0x2512 + ,simpleTitleCaseMapping:0x2512 + }, + { code:0x2513 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2513 + ,simpleLowerCaseMapping:0x2513 + ,simpleTitleCaseMapping:0x2513 + }, + { code:0x2514 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2514 + ,simpleLowerCaseMapping:0x2514 + ,simpleTitleCaseMapping:0x2514 + }, + { code:0x2515 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2515 + ,simpleLowerCaseMapping:0x2515 + ,simpleTitleCaseMapping:0x2515 + }, + { code:0x2516 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2516 + ,simpleLowerCaseMapping:0x2516 + ,simpleTitleCaseMapping:0x2516 + }, + { code:0x2517 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2517 + ,simpleLowerCaseMapping:0x2517 + ,simpleTitleCaseMapping:0x2517 + }, + { code:0x2518 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2518 + ,simpleLowerCaseMapping:0x2518 + ,simpleTitleCaseMapping:0x2518 + }, + { code:0x2519 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2519 + ,simpleLowerCaseMapping:0x2519 + ,simpleTitleCaseMapping:0x2519 + }, + { code:0x251A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x251A + ,simpleLowerCaseMapping:0x251A + ,simpleTitleCaseMapping:0x251A + }, + { code:0x251B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x251B + ,simpleLowerCaseMapping:0x251B + ,simpleTitleCaseMapping:0x251B + }, + { code:0x251C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x251C + ,simpleLowerCaseMapping:0x251C + ,simpleTitleCaseMapping:0x251C + }, + { code:0x251D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x251D + ,simpleLowerCaseMapping:0x251D + ,simpleTitleCaseMapping:0x251D + }, + { code:0x251E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x251E + ,simpleLowerCaseMapping:0x251E + ,simpleTitleCaseMapping:0x251E + }, + { code:0x251F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x251F + ,simpleLowerCaseMapping:0x251F + ,simpleTitleCaseMapping:0x251F + }, + { code:0x2520 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2520 + ,simpleLowerCaseMapping:0x2520 + ,simpleTitleCaseMapping:0x2520 + }, + { code:0x2521 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2521 + ,simpleLowerCaseMapping:0x2521 + ,simpleTitleCaseMapping:0x2521 + }, + { code:0x2522 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2522 + ,simpleLowerCaseMapping:0x2522 + ,simpleTitleCaseMapping:0x2522 + }, + { code:0x2523 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2523 + ,simpleLowerCaseMapping:0x2523 + ,simpleTitleCaseMapping:0x2523 + }, + { code:0x2524 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2524 + ,simpleLowerCaseMapping:0x2524 + ,simpleTitleCaseMapping:0x2524 + }, + { code:0x2525 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2525 + ,simpleLowerCaseMapping:0x2525 + ,simpleTitleCaseMapping:0x2525 + }, + { code:0x2526 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2526 + ,simpleLowerCaseMapping:0x2526 + ,simpleTitleCaseMapping:0x2526 + }, + { code:0x2527 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2527 + ,simpleLowerCaseMapping:0x2527 + ,simpleTitleCaseMapping:0x2527 + }, + { code:0x2528 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2528 + ,simpleLowerCaseMapping:0x2528 + ,simpleTitleCaseMapping:0x2528 + }, + { code:0x2529 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2529 + ,simpleLowerCaseMapping:0x2529 + ,simpleTitleCaseMapping:0x2529 + }, + { code:0x252A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x252A + ,simpleLowerCaseMapping:0x252A + ,simpleTitleCaseMapping:0x252A + }, + { code:0x252B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x252B + ,simpleLowerCaseMapping:0x252B + ,simpleTitleCaseMapping:0x252B + }, + { code:0x252C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x252C + ,simpleLowerCaseMapping:0x252C + ,simpleTitleCaseMapping:0x252C + }, + { code:0x252D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x252D + ,simpleLowerCaseMapping:0x252D + ,simpleTitleCaseMapping:0x252D + }, + { code:0x252E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x252E + ,simpleLowerCaseMapping:0x252E + ,simpleTitleCaseMapping:0x252E + }, + { code:0x252F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x252F + ,simpleLowerCaseMapping:0x252F + ,simpleTitleCaseMapping:0x252F + }, + { code:0x2530 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2530 + ,simpleLowerCaseMapping:0x2530 + ,simpleTitleCaseMapping:0x2530 + }, + { code:0x2531 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2531 + ,simpleLowerCaseMapping:0x2531 + ,simpleTitleCaseMapping:0x2531 + }, + { code:0x2532 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2532 + ,simpleLowerCaseMapping:0x2532 + ,simpleTitleCaseMapping:0x2532 + }, + { code:0x2533 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2533 + ,simpleLowerCaseMapping:0x2533 + ,simpleTitleCaseMapping:0x2533 + }, + { code:0x2534 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2534 + ,simpleLowerCaseMapping:0x2534 + ,simpleTitleCaseMapping:0x2534 + }, + { code:0x2535 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2535 + ,simpleLowerCaseMapping:0x2535 + ,simpleTitleCaseMapping:0x2535 + }, + { code:0x2536 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2536 + ,simpleLowerCaseMapping:0x2536 + ,simpleTitleCaseMapping:0x2536 + }, + { code:0x2537 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2537 + ,simpleLowerCaseMapping:0x2537 + ,simpleTitleCaseMapping:0x2537 + }, + { code:0x2538 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2538 + ,simpleLowerCaseMapping:0x2538 + ,simpleTitleCaseMapping:0x2538 + }, + { code:0x2539 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2539 + ,simpleLowerCaseMapping:0x2539 + ,simpleTitleCaseMapping:0x2539 + }, + { code:0x253A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x253A + ,simpleLowerCaseMapping:0x253A + ,simpleTitleCaseMapping:0x253A + }, + { code:0x253B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x253B + ,simpleLowerCaseMapping:0x253B + ,simpleTitleCaseMapping:0x253B + }, + { code:0x253C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x253C + ,simpleLowerCaseMapping:0x253C + ,simpleTitleCaseMapping:0x253C + }, + { code:0x253D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x253D + ,simpleLowerCaseMapping:0x253D + ,simpleTitleCaseMapping:0x253D + }, + { code:0x253E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x253E + ,simpleLowerCaseMapping:0x253E + ,simpleTitleCaseMapping:0x253E + }, + { code:0x253F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x253F + ,simpleLowerCaseMapping:0x253F + ,simpleTitleCaseMapping:0x253F + }, + { code:0x2540 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2540 + ,simpleLowerCaseMapping:0x2540 + ,simpleTitleCaseMapping:0x2540 + }, + { code:0x2541 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2541 + ,simpleLowerCaseMapping:0x2541 + ,simpleTitleCaseMapping:0x2541 + }, + { code:0x2542 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2542 + ,simpleLowerCaseMapping:0x2542 + ,simpleTitleCaseMapping:0x2542 + }, + { code:0x2543 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2543 + ,simpleLowerCaseMapping:0x2543 + ,simpleTitleCaseMapping:0x2543 + }, + { code:0x2544 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2544 + ,simpleLowerCaseMapping:0x2544 + ,simpleTitleCaseMapping:0x2544 + }, + { code:0x2545 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2545 + ,simpleLowerCaseMapping:0x2545 + ,simpleTitleCaseMapping:0x2545 + }, + { code:0x2546 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2546 + ,simpleLowerCaseMapping:0x2546 + ,simpleTitleCaseMapping:0x2546 + }, + { code:0x2547 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2547 + ,simpleLowerCaseMapping:0x2547 + ,simpleTitleCaseMapping:0x2547 + }, + { code:0x2548 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2548 + ,simpleLowerCaseMapping:0x2548 + ,simpleTitleCaseMapping:0x2548 + }, + { code:0x2549 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2549 + ,simpleLowerCaseMapping:0x2549 + ,simpleTitleCaseMapping:0x2549 + }, + { code:0x254A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x254A + ,simpleLowerCaseMapping:0x254A + ,simpleTitleCaseMapping:0x254A + }, + { code:0x254B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x254B + ,simpleLowerCaseMapping:0x254B + ,simpleTitleCaseMapping:0x254B + }, + { code:0x254C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x254C + ,simpleLowerCaseMapping:0x254C + ,simpleTitleCaseMapping:0x254C + }, + { code:0x254D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x254D + ,simpleLowerCaseMapping:0x254D + ,simpleTitleCaseMapping:0x254D + }, + { code:0x254E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x254E + ,simpleLowerCaseMapping:0x254E + ,simpleTitleCaseMapping:0x254E + }, + { code:0x254F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x254F + ,simpleLowerCaseMapping:0x254F + ,simpleTitleCaseMapping:0x254F + }, + { code:0x2550 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2550 + ,simpleLowerCaseMapping:0x2550 + ,simpleTitleCaseMapping:0x2550 + }, + { code:0x2551 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2551 + ,simpleLowerCaseMapping:0x2551 + ,simpleTitleCaseMapping:0x2551 + }, + { code:0x2552 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2552 + ,simpleLowerCaseMapping:0x2552 + ,simpleTitleCaseMapping:0x2552 + }, + { code:0x2553 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2553 + ,simpleLowerCaseMapping:0x2553 + ,simpleTitleCaseMapping:0x2553 + }, + { code:0x2554 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2554 + ,simpleLowerCaseMapping:0x2554 + ,simpleTitleCaseMapping:0x2554 + }, + { code:0x2555 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2555 + ,simpleLowerCaseMapping:0x2555 + ,simpleTitleCaseMapping:0x2555 + }, + { code:0x2556 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2556 + ,simpleLowerCaseMapping:0x2556 + ,simpleTitleCaseMapping:0x2556 + }, + { code:0x2557 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2557 + ,simpleLowerCaseMapping:0x2557 + ,simpleTitleCaseMapping:0x2557 + }, + { code:0x2558 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2558 + ,simpleLowerCaseMapping:0x2558 + ,simpleTitleCaseMapping:0x2558 + }, + { code:0x2559 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2559 + ,simpleLowerCaseMapping:0x2559 + ,simpleTitleCaseMapping:0x2559 + }, + { code:0x255A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x255A + ,simpleLowerCaseMapping:0x255A + ,simpleTitleCaseMapping:0x255A + }, + { code:0x255B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x255B + ,simpleLowerCaseMapping:0x255B + ,simpleTitleCaseMapping:0x255B + }, + { code:0x255C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x255C + ,simpleLowerCaseMapping:0x255C + ,simpleTitleCaseMapping:0x255C + }, + { code:0x255D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x255D + ,simpleLowerCaseMapping:0x255D + ,simpleTitleCaseMapping:0x255D + }, + { code:0x255E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x255E + ,simpleLowerCaseMapping:0x255E + ,simpleTitleCaseMapping:0x255E + }, + { code:0x255F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x255F + ,simpleLowerCaseMapping:0x255F + ,simpleTitleCaseMapping:0x255F + }, + { code:0x2560 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2560 + ,simpleLowerCaseMapping:0x2560 + ,simpleTitleCaseMapping:0x2560 + }, + { code:0x2561 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2561 + ,simpleLowerCaseMapping:0x2561 + ,simpleTitleCaseMapping:0x2561 + }, + { code:0x2562 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2562 + ,simpleLowerCaseMapping:0x2562 + ,simpleTitleCaseMapping:0x2562 + }, + { code:0x2563 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2563 + ,simpleLowerCaseMapping:0x2563 + ,simpleTitleCaseMapping:0x2563 + }, + { code:0x2564 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2564 + ,simpleLowerCaseMapping:0x2564 + ,simpleTitleCaseMapping:0x2564 + }, + { code:0x2565 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2565 + ,simpleLowerCaseMapping:0x2565 + ,simpleTitleCaseMapping:0x2565 + }, + { code:0x2566 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2566 + ,simpleLowerCaseMapping:0x2566 + ,simpleTitleCaseMapping:0x2566 + }, + { code:0x2567 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2567 + ,simpleLowerCaseMapping:0x2567 + ,simpleTitleCaseMapping:0x2567 + }, + { code:0x2568 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2568 + ,simpleLowerCaseMapping:0x2568 + ,simpleTitleCaseMapping:0x2568 + }, + { code:0x2569 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2569 + ,simpleLowerCaseMapping:0x2569 + ,simpleTitleCaseMapping:0x2569 + }, + { code:0x256A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x256A + ,simpleLowerCaseMapping:0x256A + ,simpleTitleCaseMapping:0x256A + }, + { code:0x256B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x256B + ,simpleLowerCaseMapping:0x256B + ,simpleTitleCaseMapping:0x256B + }, + { code:0x256C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x256C + ,simpleLowerCaseMapping:0x256C + ,simpleTitleCaseMapping:0x256C + }, + { code:0x256D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x256D + ,simpleLowerCaseMapping:0x256D + ,simpleTitleCaseMapping:0x256D + }, + { code:0x256E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x256E + ,simpleLowerCaseMapping:0x256E + ,simpleTitleCaseMapping:0x256E + }, + { code:0x256F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x256F + ,simpleLowerCaseMapping:0x256F + ,simpleTitleCaseMapping:0x256F + }, + { code:0x2570 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2570 + ,simpleLowerCaseMapping:0x2570 + ,simpleTitleCaseMapping:0x2570 + }, + { code:0x2571 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2571 + ,simpleLowerCaseMapping:0x2571 + ,simpleTitleCaseMapping:0x2571 + }, + { code:0x2572 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2572 + ,simpleLowerCaseMapping:0x2572 + ,simpleTitleCaseMapping:0x2572 + }, + { code:0x2573 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2573 + ,simpleLowerCaseMapping:0x2573 + ,simpleTitleCaseMapping:0x2573 + }, + { code:0x2574 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2574 + ,simpleLowerCaseMapping:0x2574 + ,simpleTitleCaseMapping:0x2574 + }, + { code:0x2575 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2575 + ,simpleLowerCaseMapping:0x2575 + ,simpleTitleCaseMapping:0x2575 + }, + { code:0x2576 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2576 + ,simpleLowerCaseMapping:0x2576 + ,simpleTitleCaseMapping:0x2576 + }, + { code:0x2577 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2577 + ,simpleLowerCaseMapping:0x2577 + ,simpleTitleCaseMapping:0x2577 + }, + { code:0x2578 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2578 + ,simpleLowerCaseMapping:0x2578 + ,simpleTitleCaseMapping:0x2578 + }, + { code:0x2579 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2579 + ,simpleLowerCaseMapping:0x2579 + ,simpleTitleCaseMapping:0x2579 + }, + { code:0x257A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x257A + ,simpleLowerCaseMapping:0x257A + ,simpleTitleCaseMapping:0x257A + }, + { code:0x257B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x257B + ,simpleLowerCaseMapping:0x257B + ,simpleTitleCaseMapping:0x257B + }, + { code:0x257C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x257C + ,simpleLowerCaseMapping:0x257C + ,simpleTitleCaseMapping:0x257C + }, + { code:0x257D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x257D + ,simpleLowerCaseMapping:0x257D + ,simpleTitleCaseMapping:0x257D + }, + { code:0x257E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x257E + ,simpleLowerCaseMapping:0x257E + ,simpleTitleCaseMapping:0x257E + }, + { code:0x257F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x257F + ,simpleLowerCaseMapping:0x257F + ,simpleTitleCaseMapping:0x257F + }, + { code:0x2580 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2580 + ,simpleLowerCaseMapping:0x2580 + ,simpleTitleCaseMapping:0x2580 + }, + { code:0x2581 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2581 + ,simpleLowerCaseMapping:0x2581 + ,simpleTitleCaseMapping:0x2581 + }, + { code:0x2582 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2582 + ,simpleLowerCaseMapping:0x2582 + ,simpleTitleCaseMapping:0x2582 + }, + { code:0x2583 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2583 + ,simpleLowerCaseMapping:0x2583 + ,simpleTitleCaseMapping:0x2583 + }, + { code:0x2584 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2584 + ,simpleLowerCaseMapping:0x2584 + ,simpleTitleCaseMapping:0x2584 + }, + { code:0x2585 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2585 + ,simpleLowerCaseMapping:0x2585 + ,simpleTitleCaseMapping:0x2585 + }, + { code:0x2586 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2586 + ,simpleLowerCaseMapping:0x2586 + ,simpleTitleCaseMapping:0x2586 + }, + { code:0x2587 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2587 + ,simpleLowerCaseMapping:0x2587 + ,simpleTitleCaseMapping:0x2587 + }, + { code:0x2588 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2588 + ,simpleLowerCaseMapping:0x2588 + ,simpleTitleCaseMapping:0x2588 + }, + { code:0x2589 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2589 + ,simpleLowerCaseMapping:0x2589 + ,simpleTitleCaseMapping:0x2589 + }, + { code:0x258A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x258A + ,simpleLowerCaseMapping:0x258A + ,simpleTitleCaseMapping:0x258A + }, + { code:0x258B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x258B + ,simpleLowerCaseMapping:0x258B + ,simpleTitleCaseMapping:0x258B + }, + { code:0x258C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x258C + ,simpleLowerCaseMapping:0x258C + ,simpleTitleCaseMapping:0x258C + }, + { code:0x258D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x258D + ,simpleLowerCaseMapping:0x258D + ,simpleTitleCaseMapping:0x258D + }, + { code:0x258E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x258E + ,simpleLowerCaseMapping:0x258E + ,simpleTitleCaseMapping:0x258E + }, + { code:0x258F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x258F + ,simpleLowerCaseMapping:0x258F + ,simpleTitleCaseMapping:0x258F + }, + { code:0x2590 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2590 + ,simpleLowerCaseMapping:0x2590 + ,simpleTitleCaseMapping:0x2590 + }, + { code:0x2591 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2591 + ,simpleLowerCaseMapping:0x2591 + ,simpleTitleCaseMapping:0x2591 + }, + { code:0x2592 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2592 + ,simpleLowerCaseMapping:0x2592 + ,simpleTitleCaseMapping:0x2592 + }, + { code:0x2593 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2593 + ,simpleLowerCaseMapping:0x2593 + ,simpleTitleCaseMapping:0x2593 + }, + { code:0x2594 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2594 + ,simpleLowerCaseMapping:0x2594 + ,simpleTitleCaseMapping:0x2594 + }, + { code:0x2595 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2595 + ,simpleLowerCaseMapping:0x2595 + ,simpleTitleCaseMapping:0x2595 + }, + { code:0x2596 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2596 + ,simpleLowerCaseMapping:0x2596 + ,simpleTitleCaseMapping:0x2596 + }, + { code:0x2597 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2597 + ,simpleLowerCaseMapping:0x2597 + ,simpleTitleCaseMapping:0x2597 + }, + { code:0x2598 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2598 + ,simpleLowerCaseMapping:0x2598 + ,simpleTitleCaseMapping:0x2598 + }, + { code:0x2599 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2599 + ,simpleLowerCaseMapping:0x2599 + ,simpleTitleCaseMapping:0x2599 + }, + { code:0x259A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x259A + ,simpleLowerCaseMapping:0x259A + ,simpleTitleCaseMapping:0x259A + }, + { code:0x259B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x259B + ,simpleLowerCaseMapping:0x259B + ,simpleTitleCaseMapping:0x259B + }, + { code:0x259C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x259C + ,simpleLowerCaseMapping:0x259C + ,simpleTitleCaseMapping:0x259C + }, + { code:0x259D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x259D + ,simpleLowerCaseMapping:0x259D + ,simpleTitleCaseMapping:0x259D + }, + { code:0x259E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x259E + ,simpleLowerCaseMapping:0x259E + ,simpleTitleCaseMapping:0x259E + }, + { code:0x259F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x259F + ,simpleLowerCaseMapping:0x259F + ,simpleTitleCaseMapping:0x259F + }, + { code:0x25A0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25A0 + ,simpleLowerCaseMapping:0x25A0 + ,simpleTitleCaseMapping:0x25A0 + }, + { code:0x25A1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25A1 + ,simpleLowerCaseMapping:0x25A1 + ,simpleTitleCaseMapping:0x25A1 + }, + { code:0x25A2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25A2 + ,simpleLowerCaseMapping:0x25A2 + ,simpleTitleCaseMapping:0x25A2 + }, + { code:0x25A3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25A3 + ,simpleLowerCaseMapping:0x25A3 + ,simpleTitleCaseMapping:0x25A3 + }, + { code:0x25A4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25A4 + ,simpleLowerCaseMapping:0x25A4 + ,simpleTitleCaseMapping:0x25A4 + }, + { code:0x25A5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25A5 + ,simpleLowerCaseMapping:0x25A5 + ,simpleTitleCaseMapping:0x25A5 + }, + { code:0x25A6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25A6 + ,simpleLowerCaseMapping:0x25A6 + ,simpleTitleCaseMapping:0x25A6 + }, + { code:0x25A7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25A7 + ,simpleLowerCaseMapping:0x25A7 + ,simpleTitleCaseMapping:0x25A7 + }, + { code:0x25A8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25A8 + ,simpleLowerCaseMapping:0x25A8 + ,simpleTitleCaseMapping:0x25A8 + }, + { code:0x25A9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25A9 + ,simpleLowerCaseMapping:0x25A9 + ,simpleTitleCaseMapping:0x25A9 + }, + { code:0x25AA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25AA + ,simpleLowerCaseMapping:0x25AA + ,simpleTitleCaseMapping:0x25AA + }, + { code:0x25AB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25AB + ,simpleLowerCaseMapping:0x25AB + ,simpleTitleCaseMapping:0x25AB + }, + { code:0x25AC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25AC + ,simpleLowerCaseMapping:0x25AC + ,simpleTitleCaseMapping:0x25AC + }, + { code:0x25AD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25AD + ,simpleLowerCaseMapping:0x25AD + ,simpleTitleCaseMapping:0x25AD + }, + { code:0x25AE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25AE + ,simpleLowerCaseMapping:0x25AE + ,simpleTitleCaseMapping:0x25AE + }, + { code:0x25AF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25AF + ,simpleLowerCaseMapping:0x25AF + ,simpleTitleCaseMapping:0x25AF + }, + { code:0x25B0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25B0 + ,simpleLowerCaseMapping:0x25B0 + ,simpleTitleCaseMapping:0x25B0 + }, + { code:0x25B1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25B1 + ,simpleLowerCaseMapping:0x25B1 + ,simpleTitleCaseMapping:0x25B1 + }, + { code:0x25B2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25B2 + ,simpleLowerCaseMapping:0x25B2 + ,simpleTitleCaseMapping:0x25B2 + }, + { code:0x25B3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25B3 + ,simpleLowerCaseMapping:0x25B3 + ,simpleTitleCaseMapping:0x25B3 + }, + { code:0x25B4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25B4 + ,simpleLowerCaseMapping:0x25B4 + ,simpleTitleCaseMapping:0x25B4 + }, + { code:0x25B5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25B5 + ,simpleLowerCaseMapping:0x25B5 + ,simpleTitleCaseMapping:0x25B5 + }, + { code:0x25B6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25B6 + ,simpleLowerCaseMapping:0x25B6 + ,simpleTitleCaseMapping:0x25B6 + }, + { code:0x25B7 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x25B7 + ,simpleLowerCaseMapping:0x25B7 + ,simpleTitleCaseMapping:0x25B7 + }, + { code:0x25B8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25B8 + ,simpleLowerCaseMapping:0x25B8 + ,simpleTitleCaseMapping:0x25B8 + }, + { code:0x25B9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25B9 + ,simpleLowerCaseMapping:0x25B9 + ,simpleTitleCaseMapping:0x25B9 + }, + { code:0x25BA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25BA + ,simpleLowerCaseMapping:0x25BA + ,simpleTitleCaseMapping:0x25BA + }, + { code:0x25BB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25BB + ,simpleLowerCaseMapping:0x25BB + ,simpleTitleCaseMapping:0x25BB + }, + { code:0x25BC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25BC + ,simpleLowerCaseMapping:0x25BC + ,simpleTitleCaseMapping:0x25BC + }, + { code:0x25BD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25BD + ,simpleLowerCaseMapping:0x25BD + ,simpleTitleCaseMapping:0x25BD + }, + { code:0x25BE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25BE + ,simpleLowerCaseMapping:0x25BE + ,simpleTitleCaseMapping:0x25BE + }, + { code:0x25BF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25BF + ,simpleLowerCaseMapping:0x25BF + ,simpleTitleCaseMapping:0x25BF + }, + { code:0x25C0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25C0 + ,simpleLowerCaseMapping:0x25C0 + ,simpleTitleCaseMapping:0x25C0 + }, + { code:0x25C1 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x25C1 + ,simpleLowerCaseMapping:0x25C1 + ,simpleTitleCaseMapping:0x25C1 + }, + { code:0x25C2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25C2 + ,simpleLowerCaseMapping:0x25C2 + ,simpleTitleCaseMapping:0x25C2 + }, + { code:0x25C3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25C3 + ,simpleLowerCaseMapping:0x25C3 + ,simpleTitleCaseMapping:0x25C3 + }, + { code:0x25C4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25C4 + ,simpleLowerCaseMapping:0x25C4 + ,simpleTitleCaseMapping:0x25C4 + }, + { code:0x25C5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25C5 + ,simpleLowerCaseMapping:0x25C5 + ,simpleTitleCaseMapping:0x25C5 + }, + { code:0x25C6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25C6 + ,simpleLowerCaseMapping:0x25C6 + ,simpleTitleCaseMapping:0x25C6 + }, + { code:0x25C7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25C7 + ,simpleLowerCaseMapping:0x25C7 + ,simpleTitleCaseMapping:0x25C7 + }, + { code:0x25C8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25C8 + ,simpleLowerCaseMapping:0x25C8 + ,simpleTitleCaseMapping:0x25C8 + }, + { code:0x25C9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25C9 + ,simpleLowerCaseMapping:0x25C9 + ,simpleTitleCaseMapping:0x25C9 + }, + { code:0x25CA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25CA + ,simpleLowerCaseMapping:0x25CA + ,simpleTitleCaseMapping:0x25CA + }, + { code:0x25CB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25CB + ,simpleLowerCaseMapping:0x25CB + ,simpleTitleCaseMapping:0x25CB + }, + { code:0x25CC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25CC + ,simpleLowerCaseMapping:0x25CC + ,simpleTitleCaseMapping:0x25CC + }, + { code:0x25CD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25CD + ,simpleLowerCaseMapping:0x25CD + ,simpleTitleCaseMapping:0x25CD + }, + { code:0x25CE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25CE + ,simpleLowerCaseMapping:0x25CE + ,simpleTitleCaseMapping:0x25CE + }, + { code:0x25CF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25CF + ,simpleLowerCaseMapping:0x25CF + ,simpleTitleCaseMapping:0x25CF + }, + { code:0x25D0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25D0 + ,simpleLowerCaseMapping:0x25D0 + ,simpleTitleCaseMapping:0x25D0 + }, + { code:0x25D1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25D1 + ,simpleLowerCaseMapping:0x25D1 + ,simpleTitleCaseMapping:0x25D1 + }, + { code:0x25D2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25D2 + ,simpleLowerCaseMapping:0x25D2 + ,simpleTitleCaseMapping:0x25D2 + }, + { code:0x25D3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25D3 + ,simpleLowerCaseMapping:0x25D3 + ,simpleTitleCaseMapping:0x25D3 + }, + { code:0x25D4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25D4 + ,simpleLowerCaseMapping:0x25D4 + ,simpleTitleCaseMapping:0x25D4 + }, + { code:0x25D5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25D5 + ,simpleLowerCaseMapping:0x25D5 + ,simpleTitleCaseMapping:0x25D5 + }, + { code:0x25D6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25D6 + ,simpleLowerCaseMapping:0x25D6 + ,simpleTitleCaseMapping:0x25D6 + }, + { code:0x25D7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25D7 + ,simpleLowerCaseMapping:0x25D7 + ,simpleTitleCaseMapping:0x25D7 + }, + { code:0x25D8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25D8 + ,simpleLowerCaseMapping:0x25D8 + ,simpleTitleCaseMapping:0x25D8 + }, + { code:0x25D9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25D9 + ,simpleLowerCaseMapping:0x25D9 + ,simpleTitleCaseMapping:0x25D9 + }, + { code:0x25DA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25DA + ,simpleLowerCaseMapping:0x25DA + ,simpleTitleCaseMapping:0x25DA + }, + { code:0x25DB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25DB + ,simpleLowerCaseMapping:0x25DB + ,simpleTitleCaseMapping:0x25DB + }, + { code:0x25DC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25DC + ,simpleLowerCaseMapping:0x25DC + ,simpleTitleCaseMapping:0x25DC + }, + { code:0x25DD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25DD + ,simpleLowerCaseMapping:0x25DD + ,simpleTitleCaseMapping:0x25DD + }, + { code:0x25DE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25DE + ,simpleLowerCaseMapping:0x25DE + ,simpleTitleCaseMapping:0x25DE + }, + { code:0x25DF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25DF + ,simpleLowerCaseMapping:0x25DF + ,simpleTitleCaseMapping:0x25DF + }, + { code:0x25E0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25E0 + ,simpleLowerCaseMapping:0x25E0 + ,simpleTitleCaseMapping:0x25E0 + }, + { code:0x25E1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25E1 + ,simpleLowerCaseMapping:0x25E1 + ,simpleTitleCaseMapping:0x25E1 + }, + { code:0x25E2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25E2 + ,simpleLowerCaseMapping:0x25E2 + ,simpleTitleCaseMapping:0x25E2 + }, + { code:0x25E3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25E3 + ,simpleLowerCaseMapping:0x25E3 + ,simpleTitleCaseMapping:0x25E3 + }, + { code:0x25E4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25E4 + ,simpleLowerCaseMapping:0x25E4 + ,simpleTitleCaseMapping:0x25E4 + }, + { code:0x25E5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25E5 + ,simpleLowerCaseMapping:0x25E5 + ,simpleTitleCaseMapping:0x25E5 + }, + { code:0x25E6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25E6 + ,simpleLowerCaseMapping:0x25E6 + ,simpleTitleCaseMapping:0x25E6 + }, + { code:0x25E7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25E7 + ,simpleLowerCaseMapping:0x25E7 + ,simpleTitleCaseMapping:0x25E7 + }, + { code:0x25E8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25E8 + ,simpleLowerCaseMapping:0x25E8 + ,simpleTitleCaseMapping:0x25E8 + }, + { code:0x25E9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25E9 + ,simpleLowerCaseMapping:0x25E9 + ,simpleTitleCaseMapping:0x25E9 + }, + { code:0x25EA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25EA + ,simpleLowerCaseMapping:0x25EA + ,simpleTitleCaseMapping:0x25EA + }, + { code:0x25EB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25EB + ,simpleLowerCaseMapping:0x25EB + ,simpleTitleCaseMapping:0x25EB + }, + { code:0x25EC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25EC + ,simpleLowerCaseMapping:0x25EC + ,simpleTitleCaseMapping:0x25EC + }, + { code:0x25ED + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25ED + ,simpleLowerCaseMapping:0x25ED + ,simpleTitleCaseMapping:0x25ED + }, + { code:0x25EE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25EE + ,simpleLowerCaseMapping:0x25EE + ,simpleTitleCaseMapping:0x25EE + }, + { code:0x25EF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25EF + ,simpleLowerCaseMapping:0x25EF + ,simpleTitleCaseMapping:0x25EF + }, + { code:0x25F0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25F0 + ,simpleLowerCaseMapping:0x25F0 + ,simpleTitleCaseMapping:0x25F0 + }, + { code:0x25F1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25F1 + ,simpleLowerCaseMapping:0x25F1 + ,simpleTitleCaseMapping:0x25F1 + }, + { code:0x25F2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25F2 + ,simpleLowerCaseMapping:0x25F2 + ,simpleTitleCaseMapping:0x25F2 + }, + { code:0x25F3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25F3 + ,simpleLowerCaseMapping:0x25F3 + ,simpleTitleCaseMapping:0x25F3 + }, + { code:0x25F4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25F4 + ,simpleLowerCaseMapping:0x25F4 + ,simpleTitleCaseMapping:0x25F4 + }, + { code:0x25F5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25F5 + ,simpleLowerCaseMapping:0x25F5 + ,simpleTitleCaseMapping:0x25F5 + }, + { code:0x25F6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25F6 + ,simpleLowerCaseMapping:0x25F6 + ,simpleTitleCaseMapping:0x25F6 + }, + { code:0x25F7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x25F7 + ,simpleLowerCaseMapping:0x25F7 + ,simpleTitleCaseMapping:0x25F7 + }, + { code:0x25F8 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x25F8 + ,simpleLowerCaseMapping:0x25F8 + ,simpleTitleCaseMapping:0x25F8 + }, + { code:0x25F9 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x25F9 + ,simpleLowerCaseMapping:0x25F9 + ,simpleTitleCaseMapping:0x25F9 + }, + { code:0x25FA + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x25FA + ,simpleLowerCaseMapping:0x25FA + ,simpleTitleCaseMapping:0x25FA + }, + { code:0x25FB + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x25FB + ,simpleLowerCaseMapping:0x25FB + ,simpleTitleCaseMapping:0x25FB + }, + { code:0x25FC + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x25FC + ,simpleLowerCaseMapping:0x25FC + ,simpleTitleCaseMapping:0x25FC + }, + { code:0x25FD + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x25FD + ,simpleLowerCaseMapping:0x25FD + ,simpleTitleCaseMapping:0x25FD + }, + { code:0x25FE + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x25FE + ,simpleLowerCaseMapping:0x25FE + ,simpleTitleCaseMapping:0x25FE + }, + { code:0x25FF + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x25FF + ,simpleLowerCaseMapping:0x25FF + ,simpleTitleCaseMapping:0x25FF + }, + { code:0x2600 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2600 + ,simpleLowerCaseMapping:0x2600 + ,simpleTitleCaseMapping:0x2600 + }, + { code:0x2601 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2601 + ,simpleLowerCaseMapping:0x2601 + ,simpleTitleCaseMapping:0x2601 + }, + { code:0x2602 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2602 + ,simpleLowerCaseMapping:0x2602 + ,simpleTitleCaseMapping:0x2602 + }, + { code:0x2603 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2603 + ,simpleLowerCaseMapping:0x2603 + ,simpleTitleCaseMapping:0x2603 + }, + { code:0x2604 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2604 + ,simpleLowerCaseMapping:0x2604 + ,simpleTitleCaseMapping:0x2604 + }, + { code:0x2605 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2605 + ,simpleLowerCaseMapping:0x2605 + ,simpleTitleCaseMapping:0x2605 + }, + { code:0x2606 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2606 + ,simpleLowerCaseMapping:0x2606 + ,simpleTitleCaseMapping:0x2606 + }, + { code:0x2607 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2607 + ,simpleLowerCaseMapping:0x2607 + ,simpleTitleCaseMapping:0x2607 + }, + { code:0x2608 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2608 + ,simpleLowerCaseMapping:0x2608 + ,simpleTitleCaseMapping:0x2608 + }, + { code:0x2609 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2609 + ,simpleLowerCaseMapping:0x2609 + ,simpleTitleCaseMapping:0x2609 + }, + { code:0x260A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x260A + ,simpleLowerCaseMapping:0x260A + ,simpleTitleCaseMapping:0x260A + }, + { code:0x260B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x260B + ,simpleLowerCaseMapping:0x260B + ,simpleTitleCaseMapping:0x260B + }, + { code:0x260C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x260C + ,simpleLowerCaseMapping:0x260C + ,simpleTitleCaseMapping:0x260C + }, + { code:0x260D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x260D + ,simpleLowerCaseMapping:0x260D + ,simpleTitleCaseMapping:0x260D + }, + { code:0x260E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x260E + ,simpleLowerCaseMapping:0x260E + ,simpleTitleCaseMapping:0x260E + }, + { code:0x260F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x260F + ,simpleLowerCaseMapping:0x260F + ,simpleTitleCaseMapping:0x260F + }, + { code:0x2610 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2610 + ,simpleLowerCaseMapping:0x2610 + ,simpleTitleCaseMapping:0x2610 + }, + { code:0x2611 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2611 + ,simpleLowerCaseMapping:0x2611 + ,simpleTitleCaseMapping:0x2611 + }, + { code:0x2612 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2612 + ,simpleLowerCaseMapping:0x2612 + ,simpleTitleCaseMapping:0x2612 + }, + { code:0x2613 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2613 + ,simpleLowerCaseMapping:0x2613 + ,simpleTitleCaseMapping:0x2613 + }, + { code:0x2614 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2614 + ,simpleLowerCaseMapping:0x2614 + ,simpleTitleCaseMapping:0x2614 + }, + { code:0x2615 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2615 + ,simpleLowerCaseMapping:0x2615 + ,simpleTitleCaseMapping:0x2615 + }, + { code:0x2616 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2616 + ,simpleLowerCaseMapping:0x2616 + ,simpleTitleCaseMapping:0x2616 + }, + { code:0x2617 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2617 + ,simpleLowerCaseMapping:0x2617 + ,simpleTitleCaseMapping:0x2617 + }, + { code:0x2618 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2618 + ,simpleLowerCaseMapping:0x2618 + ,simpleTitleCaseMapping:0x2618 + }, + { code:0x2619 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2619 + ,simpleLowerCaseMapping:0x2619 + ,simpleTitleCaseMapping:0x2619 + }, + { code:0x261A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x261A + ,simpleLowerCaseMapping:0x261A + ,simpleTitleCaseMapping:0x261A + }, + { code:0x261B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x261B + ,simpleLowerCaseMapping:0x261B + ,simpleTitleCaseMapping:0x261B + }, + { code:0x261C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x261C + ,simpleLowerCaseMapping:0x261C + ,simpleTitleCaseMapping:0x261C + }, + { code:0x261D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x261D + ,simpleLowerCaseMapping:0x261D + ,simpleTitleCaseMapping:0x261D + }, + { code:0x261E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x261E + ,simpleLowerCaseMapping:0x261E + ,simpleTitleCaseMapping:0x261E + }, + { code:0x261F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x261F + ,simpleLowerCaseMapping:0x261F + ,simpleTitleCaseMapping:0x261F + }, + { code:0x2620 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2620 + ,simpleLowerCaseMapping:0x2620 + ,simpleTitleCaseMapping:0x2620 + }, + { code:0x2621 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2621 + ,simpleLowerCaseMapping:0x2621 + ,simpleTitleCaseMapping:0x2621 + }, + { code:0x2622 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2622 + ,simpleLowerCaseMapping:0x2622 + ,simpleTitleCaseMapping:0x2622 + }, + { code:0x2623 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2623 + ,simpleLowerCaseMapping:0x2623 + ,simpleTitleCaseMapping:0x2623 + }, + { code:0x2624 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2624 + ,simpleLowerCaseMapping:0x2624 + ,simpleTitleCaseMapping:0x2624 + }, + { code:0x2625 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2625 + ,simpleLowerCaseMapping:0x2625 + ,simpleTitleCaseMapping:0x2625 + }, + { code:0x2626 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2626 + ,simpleLowerCaseMapping:0x2626 + ,simpleTitleCaseMapping:0x2626 + }, + { code:0x2627 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2627 + ,simpleLowerCaseMapping:0x2627 + ,simpleTitleCaseMapping:0x2627 + }, + { code:0x2628 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2628 + ,simpleLowerCaseMapping:0x2628 + ,simpleTitleCaseMapping:0x2628 + }, + { code:0x2629 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2629 + ,simpleLowerCaseMapping:0x2629 + ,simpleTitleCaseMapping:0x2629 + }, + { code:0x262A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x262A + ,simpleLowerCaseMapping:0x262A + ,simpleTitleCaseMapping:0x262A + }, + { code:0x262B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x262B + ,simpleLowerCaseMapping:0x262B + ,simpleTitleCaseMapping:0x262B + }, + { code:0x262C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x262C + ,simpleLowerCaseMapping:0x262C + ,simpleTitleCaseMapping:0x262C + }, + { code:0x262D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x262D + ,simpleLowerCaseMapping:0x262D + ,simpleTitleCaseMapping:0x262D + }, + { code:0x262E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x262E + ,simpleLowerCaseMapping:0x262E + ,simpleTitleCaseMapping:0x262E + }, + { code:0x262F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x262F + ,simpleLowerCaseMapping:0x262F + ,simpleTitleCaseMapping:0x262F + }, + { code:0x2630 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2630 + ,simpleLowerCaseMapping:0x2630 + ,simpleTitleCaseMapping:0x2630 + }, + { code:0x2631 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2631 + ,simpleLowerCaseMapping:0x2631 + ,simpleTitleCaseMapping:0x2631 + }, + { code:0x2632 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2632 + ,simpleLowerCaseMapping:0x2632 + ,simpleTitleCaseMapping:0x2632 + }, + { code:0x2633 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2633 + ,simpleLowerCaseMapping:0x2633 + ,simpleTitleCaseMapping:0x2633 + }, + { code:0x2634 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2634 + ,simpleLowerCaseMapping:0x2634 + ,simpleTitleCaseMapping:0x2634 + }, + { code:0x2635 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2635 + ,simpleLowerCaseMapping:0x2635 + ,simpleTitleCaseMapping:0x2635 + }, + { code:0x2636 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2636 + ,simpleLowerCaseMapping:0x2636 + ,simpleTitleCaseMapping:0x2636 + }, + { code:0x2637 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2637 + ,simpleLowerCaseMapping:0x2637 + ,simpleTitleCaseMapping:0x2637 + }, + { code:0x2638 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2638 + ,simpleLowerCaseMapping:0x2638 + ,simpleTitleCaseMapping:0x2638 + }, + { code:0x2639 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2639 + ,simpleLowerCaseMapping:0x2639 + ,simpleTitleCaseMapping:0x2639 + }, + { code:0x263A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x263A + ,simpleLowerCaseMapping:0x263A + ,simpleTitleCaseMapping:0x263A + }, + { code:0x263B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x263B + ,simpleLowerCaseMapping:0x263B + ,simpleTitleCaseMapping:0x263B + }, + { code:0x263C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x263C + ,simpleLowerCaseMapping:0x263C + ,simpleTitleCaseMapping:0x263C + }, + { code:0x263D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x263D + ,simpleLowerCaseMapping:0x263D + ,simpleTitleCaseMapping:0x263D + }, + { code:0x263E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x263E + ,simpleLowerCaseMapping:0x263E + ,simpleTitleCaseMapping:0x263E + }, + { code:0x263F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x263F + ,simpleLowerCaseMapping:0x263F + ,simpleTitleCaseMapping:0x263F + }, + { code:0x2640 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2640 + ,simpleLowerCaseMapping:0x2640 + ,simpleTitleCaseMapping:0x2640 + }, + { code:0x2641 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2641 + ,simpleLowerCaseMapping:0x2641 + ,simpleTitleCaseMapping:0x2641 + }, + { code:0x2642 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2642 + ,simpleLowerCaseMapping:0x2642 + ,simpleTitleCaseMapping:0x2642 + }, + { code:0x2643 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2643 + ,simpleLowerCaseMapping:0x2643 + ,simpleTitleCaseMapping:0x2643 + }, + { code:0x2644 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2644 + ,simpleLowerCaseMapping:0x2644 + ,simpleTitleCaseMapping:0x2644 + }, + { code:0x2645 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2645 + ,simpleLowerCaseMapping:0x2645 + ,simpleTitleCaseMapping:0x2645 + }, + { code:0x2646 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2646 + ,simpleLowerCaseMapping:0x2646 + ,simpleTitleCaseMapping:0x2646 + }, + { code:0x2647 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2647 + ,simpleLowerCaseMapping:0x2647 + ,simpleTitleCaseMapping:0x2647 + }, + { code:0x2648 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2648 + ,simpleLowerCaseMapping:0x2648 + ,simpleTitleCaseMapping:0x2648 + }, + { code:0x2649 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2649 + ,simpleLowerCaseMapping:0x2649 + ,simpleTitleCaseMapping:0x2649 + }, + { code:0x264A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x264A + ,simpleLowerCaseMapping:0x264A + ,simpleTitleCaseMapping:0x264A + }, + { code:0x264B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x264B + ,simpleLowerCaseMapping:0x264B + ,simpleTitleCaseMapping:0x264B + }, + { code:0x264C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x264C + ,simpleLowerCaseMapping:0x264C + ,simpleTitleCaseMapping:0x264C + }, + { code:0x264D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x264D + ,simpleLowerCaseMapping:0x264D + ,simpleTitleCaseMapping:0x264D + }, + { code:0x264E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x264E + ,simpleLowerCaseMapping:0x264E + ,simpleTitleCaseMapping:0x264E + }, + { code:0x264F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x264F + ,simpleLowerCaseMapping:0x264F + ,simpleTitleCaseMapping:0x264F + }, + { code:0x2650 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2650 + ,simpleLowerCaseMapping:0x2650 + ,simpleTitleCaseMapping:0x2650 + }, + { code:0x2651 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2651 + ,simpleLowerCaseMapping:0x2651 + ,simpleTitleCaseMapping:0x2651 + }, + { code:0x2652 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2652 + ,simpleLowerCaseMapping:0x2652 + ,simpleTitleCaseMapping:0x2652 + }, + { code:0x2653 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2653 + ,simpleLowerCaseMapping:0x2653 + ,simpleTitleCaseMapping:0x2653 + }, + { code:0x2654 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2654 + ,simpleLowerCaseMapping:0x2654 + ,simpleTitleCaseMapping:0x2654 + }, + { code:0x2655 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2655 + ,simpleLowerCaseMapping:0x2655 + ,simpleTitleCaseMapping:0x2655 + }, + { code:0x2656 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2656 + ,simpleLowerCaseMapping:0x2656 + ,simpleTitleCaseMapping:0x2656 + }, + { code:0x2657 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2657 + ,simpleLowerCaseMapping:0x2657 + ,simpleTitleCaseMapping:0x2657 + }, + { code:0x2658 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2658 + ,simpleLowerCaseMapping:0x2658 + ,simpleTitleCaseMapping:0x2658 + }, + { code:0x2659 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2659 + ,simpleLowerCaseMapping:0x2659 + ,simpleTitleCaseMapping:0x2659 + }, + { code:0x265A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x265A + ,simpleLowerCaseMapping:0x265A + ,simpleTitleCaseMapping:0x265A + }, + { code:0x265B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x265B + ,simpleLowerCaseMapping:0x265B + ,simpleTitleCaseMapping:0x265B + }, + { code:0x265C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x265C + ,simpleLowerCaseMapping:0x265C + ,simpleTitleCaseMapping:0x265C + }, + { code:0x265D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x265D + ,simpleLowerCaseMapping:0x265D + ,simpleTitleCaseMapping:0x265D + }, + { code:0x265E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x265E + ,simpleLowerCaseMapping:0x265E + ,simpleTitleCaseMapping:0x265E + }, + { code:0x265F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x265F + ,simpleLowerCaseMapping:0x265F + ,simpleTitleCaseMapping:0x265F + }, + { code:0x2660 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2660 + ,simpleLowerCaseMapping:0x2660 + ,simpleTitleCaseMapping:0x2660 + }, + { code:0x2661 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2661 + ,simpleLowerCaseMapping:0x2661 + ,simpleTitleCaseMapping:0x2661 + }, + { code:0x2662 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2662 + ,simpleLowerCaseMapping:0x2662 + ,simpleTitleCaseMapping:0x2662 + }, + { code:0x2663 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2663 + ,simpleLowerCaseMapping:0x2663 + ,simpleTitleCaseMapping:0x2663 + }, + { code:0x2664 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2664 + ,simpleLowerCaseMapping:0x2664 + ,simpleTitleCaseMapping:0x2664 + }, + { code:0x2665 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2665 + ,simpleLowerCaseMapping:0x2665 + ,simpleTitleCaseMapping:0x2665 + }, + { code:0x2666 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2666 + ,simpleLowerCaseMapping:0x2666 + ,simpleTitleCaseMapping:0x2666 + }, + { code:0x2667 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2667 + ,simpleLowerCaseMapping:0x2667 + ,simpleTitleCaseMapping:0x2667 + }, + { code:0x2668 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2668 + ,simpleLowerCaseMapping:0x2668 + ,simpleTitleCaseMapping:0x2668 + }, + { code:0x2669 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2669 + ,simpleLowerCaseMapping:0x2669 + ,simpleTitleCaseMapping:0x2669 + }, + { code:0x266A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x266A + ,simpleLowerCaseMapping:0x266A + ,simpleTitleCaseMapping:0x266A + }, + { code:0x266B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x266B + ,simpleLowerCaseMapping:0x266B + ,simpleTitleCaseMapping:0x266B + }, + { code:0x266C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x266C + ,simpleLowerCaseMapping:0x266C + ,simpleTitleCaseMapping:0x266C + }, + { code:0x266D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x266D + ,simpleLowerCaseMapping:0x266D + ,simpleTitleCaseMapping:0x266D + }, + { code:0x266E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x266E + ,simpleLowerCaseMapping:0x266E + ,simpleTitleCaseMapping:0x266E + }, + { code:0x266F + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x266F + ,simpleLowerCaseMapping:0x266F + ,simpleTitleCaseMapping:0x266F + }, + { code:0x2670 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2670 + ,simpleLowerCaseMapping:0x2670 + ,simpleTitleCaseMapping:0x2670 + }, + { code:0x2671 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2671 + ,simpleLowerCaseMapping:0x2671 + ,simpleTitleCaseMapping:0x2671 + }, + { code:0x2672 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2672 + ,simpleLowerCaseMapping:0x2672 + ,simpleTitleCaseMapping:0x2672 + }, + { code:0x2673 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2673 + ,simpleLowerCaseMapping:0x2673 + ,simpleTitleCaseMapping:0x2673 + }, + { code:0x2674 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2674 + ,simpleLowerCaseMapping:0x2674 + ,simpleTitleCaseMapping:0x2674 + }, + { code:0x2675 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2675 + ,simpleLowerCaseMapping:0x2675 + ,simpleTitleCaseMapping:0x2675 + }, + { code:0x2676 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2676 + ,simpleLowerCaseMapping:0x2676 + ,simpleTitleCaseMapping:0x2676 + }, + { code:0x2677 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2677 + ,simpleLowerCaseMapping:0x2677 + ,simpleTitleCaseMapping:0x2677 + }, + { code:0x2678 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2678 + ,simpleLowerCaseMapping:0x2678 + ,simpleTitleCaseMapping:0x2678 + }, + { code:0x2679 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2679 + ,simpleLowerCaseMapping:0x2679 + ,simpleTitleCaseMapping:0x2679 + }, + { code:0x267A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x267A + ,simpleLowerCaseMapping:0x267A + ,simpleTitleCaseMapping:0x267A + }, + { code:0x267B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x267B + ,simpleLowerCaseMapping:0x267B + ,simpleTitleCaseMapping:0x267B + }, + { code:0x267C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x267C + ,simpleLowerCaseMapping:0x267C + ,simpleTitleCaseMapping:0x267C + }, + { code:0x267D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x267D + ,simpleLowerCaseMapping:0x267D + ,simpleTitleCaseMapping:0x267D + }, + { code:0x267E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x267E + ,simpleLowerCaseMapping:0x267E + ,simpleTitleCaseMapping:0x267E + }, + { code:0x267F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x267F + ,simpleLowerCaseMapping:0x267F + ,simpleTitleCaseMapping:0x267F + }, + { code:0x2680 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2680 + ,simpleLowerCaseMapping:0x2680 + ,simpleTitleCaseMapping:0x2680 + }, + { code:0x2681 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2681 + ,simpleLowerCaseMapping:0x2681 + ,simpleTitleCaseMapping:0x2681 + }, + { code:0x2682 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2682 + ,simpleLowerCaseMapping:0x2682 + ,simpleTitleCaseMapping:0x2682 + }, + { code:0x2683 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2683 + ,simpleLowerCaseMapping:0x2683 + ,simpleTitleCaseMapping:0x2683 + }, + { code:0x2684 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2684 + ,simpleLowerCaseMapping:0x2684 + ,simpleTitleCaseMapping:0x2684 + }, + { code:0x2685 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2685 + ,simpleLowerCaseMapping:0x2685 + ,simpleTitleCaseMapping:0x2685 + }, + { code:0x2686 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2686 + ,simpleLowerCaseMapping:0x2686 + ,simpleTitleCaseMapping:0x2686 + }, + { code:0x2687 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2687 + ,simpleLowerCaseMapping:0x2687 + ,simpleTitleCaseMapping:0x2687 + }, + { code:0x2688 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2688 + ,simpleLowerCaseMapping:0x2688 + ,simpleTitleCaseMapping:0x2688 + }, + { code:0x2689 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2689 + ,simpleLowerCaseMapping:0x2689 + ,simpleTitleCaseMapping:0x2689 + }, + { code:0x268A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x268A + ,simpleLowerCaseMapping:0x268A + ,simpleTitleCaseMapping:0x268A + }, + { code:0x268B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x268B + ,simpleLowerCaseMapping:0x268B + ,simpleTitleCaseMapping:0x268B + }, + { code:0x268C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x268C + ,simpleLowerCaseMapping:0x268C + ,simpleTitleCaseMapping:0x268C + }, + { code:0x268D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x268D + ,simpleLowerCaseMapping:0x268D + ,simpleTitleCaseMapping:0x268D + }, + { code:0x268E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x268E + ,simpleLowerCaseMapping:0x268E + ,simpleTitleCaseMapping:0x268E + }, + { code:0x268F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x268F + ,simpleLowerCaseMapping:0x268F + ,simpleTitleCaseMapping:0x268F + }, + { code:0x2690 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2690 + ,simpleLowerCaseMapping:0x2690 + ,simpleTitleCaseMapping:0x2690 + }, + { code:0x2691 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2691 + ,simpleLowerCaseMapping:0x2691 + ,simpleTitleCaseMapping:0x2691 + }, + { code:0x2692 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2692 + ,simpleLowerCaseMapping:0x2692 + ,simpleTitleCaseMapping:0x2692 + }, + { code:0x2693 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2693 + ,simpleLowerCaseMapping:0x2693 + ,simpleTitleCaseMapping:0x2693 + }, + { code:0x2694 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2694 + ,simpleLowerCaseMapping:0x2694 + ,simpleTitleCaseMapping:0x2694 + }, + { code:0x2695 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2695 + ,simpleLowerCaseMapping:0x2695 + ,simpleTitleCaseMapping:0x2695 + }, + { code:0x2696 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2696 + ,simpleLowerCaseMapping:0x2696 + ,simpleTitleCaseMapping:0x2696 + }, + { code:0x2697 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2697 + ,simpleLowerCaseMapping:0x2697 + ,simpleTitleCaseMapping:0x2697 + }, + { code:0x2698 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2698 + ,simpleLowerCaseMapping:0x2698 + ,simpleTitleCaseMapping:0x2698 + }, + { code:0x2699 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2699 + ,simpleLowerCaseMapping:0x2699 + ,simpleTitleCaseMapping:0x2699 + }, + { code:0x269A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x269A + ,simpleLowerCaseMapping:0x269A + ,simpleTitleCaseMapping:0x269A + }, + { code:0x269B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x269B + ,simpleLowerCaseMapping:0x269B + ,simpleTitleCaseMapping:0x269B + }, + { code:0x269C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x269C + ,simpleLowerCaseMapping:0x269C + ,simpleTitleCaseMapping:0x269C + }, + { code:0x26A0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x26A0 + ,simpleLowerCaseMapping:0x26A0 + ,simpleTitleCaseMapping:0x26A0 + }, + { code:0x26A1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x26A1 + ,simpleLowerCaseMapping:0x26A1 + ,simpleTitleCaseMapping:0x26A1 + }, + { code:0x26A2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x26A2 + ,simpleLowerCaseMapping:0x26A2 + ,simpleTitleCaseMapping:0x26A2 + }, + { code:0x26A3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x26A3 + ,simpleLowerCaseMapping:0x26A3 + ,simpleTitleCaseMapping:0x26A3 + }, + { code:0x26A4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x26A4 + ,simpleLowerCaseMapping:0x26A4 + ,simpleTitleCaseMapping:0x26A4 + }, + { code:0x26A5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x26A5 + ,simpleLowerCaseMapping:0x26A5 + ,simpleTitleCaseMapping:0x26A5 + }, + { code:0x26A6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x26A6 + ,simpleLowerCaseMapping:0x26A6 + ,simpleTitleCaseMapping:0x26A6 + }, + { code:0x26A7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x26A7 + ,simpleLowerCaseMapping:0x26A7 + ,simpleTitleCaseMapping:0x26A7 + }, + { code:0x26A8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x26A8 + ,simpleLowerCaseMapping:0x26A8 + ,simpleTitleCaseMapping:0x26A8 + }, + { code:0x26A9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x26A9 + ,simpleLowerCaseMapping:0x26A9 + ,simpleTitleCaseMapping:0x26A9 + }, + { code:0x26AA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x26AA + ,simpleLowerCaseMapping:0x26AA + ,simpleTitleCaseMapping:0x26AA + }, + { code:0x26AB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x26AB + ,simpleLowerCaseMapping:0x26AB + ,simpleTitleCaseMapping:0x26AB + }, + { code:0x26AC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x26AC + ,simpleLowerCaseMapping:0x26AC + ,simpleTitleCaseMapping:0x26AC + }, + { code:0x26AD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x26AD + ,simpleLowerCaseMapping:0x26AD + ,simpleTitleCaseMapping:0x26AD + }, + { code:0x26AE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x26AE + ,simpleLowerCaseMapping:0x26AE + ,simpleTitleCaseMapping:0x26AE + }, + { code:0x26AF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x26AF + ,simpleLowerCaseMapping:0x26AF + ,simpleTitleCaseMapping:0x26AF + }, + { code:0x26B0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x26B0 + ,simpleLowerCaseMapping:0x26B0 + ,simpleTitleCaseMapping:0x26B0 + }, + { code:0x26B1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x26B1 + ,simpleLowerCaseMapping:0x26B1 + ,simpleTitleCaseMapping:0x26B1 + }, + { code:0x26B2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x26B2 + ,simpleLowerCaseMapping:0x26B2 + ,simpleTitleCaseMapping:0x26B2 + }, + { code:0x2701 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2701 + ,simpleLowerCaseMapping:0x2701 + ,simpleTitleCaseMapping:0x2701 + }, + { code:0x2702 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2702 + ,simpleLowerCaseMapping:0x2702 + ,simpleTitleCaseMapping:0x2702 + }, + { code:0x2703 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2703 + ,simpleLowerCaseMapping:0x2703 + ,simpleTitleCaseMapping:0x2703 + }, + { code:0x2704 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2704 + ,simpleLowerCaseMapping:0x2704 + ,simpleTitleCaseMapping:0x2704 + }, + { code:0x2706 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2706 + ,simpleLowerCaseMapping:0x2706 + ,simpleTitleCaseMapping:0x2706 + }, + { code:0x2707 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2707 + ,simpleLowerCaseMapping:0x2707 + ,simpleTitleCaseMapping:0x2707 + }, + { code:0x2708 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2708 + ,simpleLowerCaseMapping:0x2708 + ,simpleTitleCaseMapping:0x2708 + }, + { code:0x2709 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2709 + ,simpleLowerCaseMapping:0x2709 + ,simpleTitleCaseMapping:0x2709 + }, + { code:0x270C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x270C + ,simpleLowerCaseMapping:0x270C + ,simpleTitleCaseMapping:0x270C + }, + { code:0x270D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x270D + ,simpleLowerCaseMapping:0x270D + ,simpleTitleCaseMapping:0x270D + }, + { code:0x270E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x270E + ,simpleLowerCaseMapping:0x270E + ,simpleTitleCaseMapping:0x270E + }, + { code:0x270F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x270F + ,simpleLowerCaseMapping:0x270F + ,simpleTitleCaseMapping:0x270F + }, + { code:0x2710 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2710 + ,simpleLowerCaseMapping:0x2710 + ,simpleTitleCaseMapping:0x2710 + }, + { code:0x2711 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2711 + ,simpleLowerCaseMapping:0x2711 + ,simpleTitleCaseMapping:0x2711 + }, + { code:0x2712 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2712 + ,simpleLowerCaseMapping:0x2712 + ,simpleTitleCaseMapping:0x2712 + }, + { code:0x2713 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2713 + ,simpleLowerCaseMapping:0x2713 + ,simpleTitleCaseMapping:0x2713 + }, + { code:0x2714 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2714 + ,simpleLowerCaseMapping:0x2714 + ,simpleTitleCaseMapping:0x2714 + }, + { code:0x2715 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2715 + ,simpleLowerCaseMapping:0x2715 + ,simpleTitleCaseMapping:0x2715 + }, + { code:0x2716 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2716 + ,simpleLowerCaseMapping:0x2716 + ,simpleTitleCaseMapping:0x2716 + }, + { code:0x2717 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2717 + ,simpleLowerCaseMapping:0x2717 + ,simpleTitleCaseMapping:0x2717 + }, + { code:0x2718 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2718 + ,simpleLowerCaseMapping:0x2718 + ,simpleTitleCaseMapping:0x2718 + }, + { code:0x2719 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2719 + ,simpleLowerCaseMapping:0x2719 + ,simpleTitleCaseMapping:0x2719 + }, + { code:0x271A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x271A + ,simpleLowerCaseMapping:0x271A + ,simpleTitleCaseMapping:0x271A + }, + { code:0x271B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x271B + ,simpleLowerCaseMapping:0x271B + ,simpleTitleCaseMapping:0x271B + }, + { code:0x271C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x271C + ,simpleLowerCaseMapping:0x271C + ,simpleTitleCaseMapping:0x271C + }, + { code:0x271D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x271D + ,simpleLowerCaseMapping:0x271D + ,simpleTitleCaseMapping:0x271D + }, + { code:0x271E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x271E + ,simpleLowerCaseMapping:0x271E + ,simpleTitleCaseMapping:0x271E + }, + { code:0x271F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x271F + ,simpleLowerCaseMapping:0x271F + ,simpleTitleCaseMapping:0x271F + }, + { code:0x2720 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2720 + ,simpleLowerCaseMapping:0x2720 + ,simpleTitleCaseMapping:0x2720 + }, + { code:0x2721 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2721 + ,simpleLowerCaseMapping:0x2721 + ,simpleTitleCaseMapping:0x2721 + }, + { code:0x2722 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2722 + ,simpleLowerCaseMapping:0x2722 + ,simpleTitleCaseMapping:0x2722 + }, + { code:0x2723 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2723 + ,simpleLowerCaseMapping:0x2723 + ,simpleTitleCaseMapping:0x2723 + }, + { code:0x2724 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2724 + ,simpleLowerCaseMapping:0x2724 + ,simpleTitleCaseMapping:0x2724 + }, + { code:0x2725 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2725 + ,simpleLowerCaseMapping:0x2725 + ,simpleTitleCaseMapping:0x2725 + }, + { code:0x2726 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2726 + ,simpleLowerCaseMapping:0x2726 + ,simpleTitleCaseMapping:0x2726 + }, + { code:0x2727 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2727 + ,simpleLowerCaseMapping:0x2727 + ,simpleTitleCaseMapping:0x2727 + }, + { code:0x2729 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2729 + ,simpleLowerCaseMapping:0x2729 + ,simpleTitleCaseMapping:0x2729 + }, + { code:0x272A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x272A + ,simpleLowerCaseMapping:0x272A + ,simpleTitleCaseMapping:0x272A + }, + { code:0x272B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x272B + ,simpleLowerCaseMapping:0x272B + ,simpleTitleCaseMapping:0x272B + }, + { code:0x272C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x272C + ,simpleLowerCaseMapping:0x272C + ,simpleTitleCaseMapping:0x272C + }, + { code:0x272D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x272D + ,simpleLowerCaseMapping:0x272D + ,simpleTitleCaseMapping:0x272D + }, + { code:0x272E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x272E + ,simpleLowerCaseMapping:0x272E + ,simpleTitleCaseMapping:0x272E + }, + { code:0x272F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x272F + ,simpleLowerCaseMapping:0x272F + ,simpleTitleCaseMapping:0x272F + }, + { code:0x2730 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2730 + ,simpleLowerCaseMapping:0x2730 + ,simpleTitleCaseMapping:0x2730 + }, + { code:0x2731 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2731 + ,simpleLowerCaseMapping:0x2731 + ,simpleTitleCaseMapping:0x2731 + }, + { code:0x2732 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2732 + ,simpleLowerCaseMapping:0x2732 + ,simpleTitleCaseMapping:0x2732 + }, + { code:0x2733 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2733 + ,simpleLowerCaseMapping:0x2733 + ,simpleTitleCaseMapping:0x2733 + }, + { code:0x2734 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2734 + ,simpleLowerCaseMapping:0x2734 + ,simpleTitleCaseMapping:0x2734 + }, + { code:0x2735 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2735 + ,simpleLowerCaseMapping:0x2735 + ,simpleTitleCaseMapping:0x2735 + }, + { code:0x2736 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2736 + ,simpleLowerCaseMapping:0x2736 + ,simpleTitleCaseMapping:0x2736 + }, + { code:0x2737 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2737 + ,simpleLowerCaseMapping:0x2737 + ,simpleTitleCaseMapping:0x2737 + }, + { code:0x2738 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2738 + ,simpleLowerCaseMapping:0x2738 + ,simpleTitleCaseMapping:0x2738 + }, + { code:0x2739 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2739 + ,simpleLowerCaseMapping:0x2739 + ,simpleTitleCaseMapping:0x2739 + }, + { code:0x273A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x273A + ,simpleLowerCaseMapping:0x273A + ,simpleTitleCaseMapping:0x273A + }, + { code:0x273B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x273B + ,simpleLowerCaseMapping:0x273B + ,simpleTitleCaseMapping:0x273B + }, + { code:0x273C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x273C + ,simpleLowerCaseMapping:0x273C + ,simpleTitleCaseMapping:0x273C + }, + { code:0x273D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x273D + ,simpleLowerCaseMapping:0x273D + ,simpleTitleCaseMapping:0x273D + }, + { code:0x273E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x273E + ,simpleLowerCaseMapping:0x273E + ,simpleTitleCaseMapping:0x273E + }, + { code:0x273F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x273F + ,simpleLowerCaseMapping:0x273F + ,simpleTitleCaseMapping:0x273F + }, + { code:0x2740 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2740 + ,simpleLowerCaseMapping:0x2740 + ,simpleTitleCaseMapping:0x2740 + }, + { code:0x2741 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2741 + ,simpleLowerCaseMapping:0x2741 + ,simpleTitleCaseMapping:0x2741 + }, + { code:0x2742 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2742 + ,simpleLowerCaseMapping:0x2742 + ,simpleTitleCaseMapping:0x2742 + }, + { code:0x2743 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2743 + ,simpleLowerCaseMapping:0x2743 + ,simpleTitleCaseMapping:0x2743 + }, + { code:0x2744 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2744 + ,simpleLowerCaseMapping:0x2744 + ,simpleTitleCaseMapping:0x2744 + }, + { code:0x2745 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2745 + ,simpleLowerCaseMapping:0x2745 + ,simpleTitleCaseMapping:0x2745 + }, + { code:0x2746 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2746 + ,simpleLowerCaseMapping:0x2746 + ,simpleTitleCaseMapping:0x2746 + }, + { code:0x2747 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2747 + ,simpleLowerCaseMapping:0x2747 + ,simpleTitleCaseMapping:0x2747 + }, + { code:0x2748 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2748 + ,simpleLowerCaseMapping:0x2748 + ,simpleTitleCaseMapping:0x2748 + }, + { code:0x2749 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2749 + ,simpleLowerCaseMapping:0x2749 + ,simpleTitleCaseMapping:0x2749 + }, + { code:0x274A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x274A + ,simpleLowerCaseMapping:0x274A + ,simpleTitleCaseMapping:0x274A + }, + { code:0x274B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x274B + ,simpleLowerCaseMapping:0x274B + ,simpleTitleCaseMapping:0x274B + }, + { code:0x274D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x274D + ,simpleLowerCaseMapping:0x274D + ,simpleTitleCaseMapping:0x274D + }, + { code:0x274F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x274F + ,simpleLowerCaseMapping:0x274F + ,simpleTitleCaseMapping:0x274F + }, + { code:0x2750 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2750 + ,simpleLowerCaseMapping:0x2750 + ,simpleTitleCaseMapping:0x2750 + }, + { code:0x2751 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2751 + ,simpleLowerCaseMapping:0x2751 + ,simpleTitleCaseMapping:0x2751 + }, + { code:0x2752 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2752 + ,simpleLowerCaseMapping:0x2752 + ,simpleTitleCaseMapping:0x2752 + }, + { code:0x2756 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2756 + ,simpleLowerCaseMapping:0x2756 + ,simpleTitleCaseMapping:0x2756 + }, + { code:0x2758 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2758 + ,simpleLowerCaseMapping:0x2758 + ,simpleTitleCaseMapping:0x2758 + }, + { code:0x2759 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2759 + ,simpleLowerCaseMapping:0x2759 + ,simpleTitleCaseMapping:0x2759 + }, + { code:0x275A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x275A + ,simpleLowerCaseMapping:0x275A + ,simpleTitleCaseMapping:0x275A + }, + { code:0x275B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x275B + ,simpleLowerCaseMapping:0x275B + ,simpleTitleCaseMapping:0x275B + }, + { code:0x275C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x275C + ,simpleLowerCaseMapping:0x275C + ,simpleTitleCaseMapping:0x275C + }, + { code:0x275D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x275D + ,simpleLowerCaseMapping:0x275D + ,simpleTitleCaseMapping:0x275D + }, + { code:0x275E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x275E + ,simpleLowerCaseMapping:0x275E + ,simpleTitleCaseMapping:0x275E + }, + { code:0x2761 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2761 + ,simpleLowerCaseMapping:0x2761 + ,simpleTitleCaseMapping:0x2761 + }, + { code:0x2762 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2762 + ,simpleLowerCaseMapping:0x2762 + ,simpleTitleCaseMapping:0x2762 + }, + { code:0x2763 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2763 + ,simpleLowerCaseMapping:0x2763 + ,simpleTitleCaseMapping:0x2763 + }, + { code:0x2764 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2764 + ,simpleLowerCaseMapping:0x2764 + ,simpleTitleCaseMapping:0x2764 + }, + { code:0x2765 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2765 + ,simpleLowerCaseMapping:0x2765 + ,simpleTitleCaseMapping:0x2765 + }, + { code:0x2766 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2766 + ,simpleLowerCaseMapping:0x2766 + ,simpleTitleCaseMapping:0x2766 + }, + { code:0x2767 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2767 + ,simpleLowerCaseMapping:0x2767 + ,simpleTitleCaseMapping:0x2767 + }, + { code:0x2768 + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x2768 + ,simpleLowerCaseMapping:0x2768 + ,simpleTitleCaseMapping:0x2768 + }, + { code:0x2769 + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x2769 + ,simpleLowerCaseMapping:0x2769 + ,simpleTitleCaseMapping:0x2769 + }, + { code:0x276A + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x276A + ,simpleLowerCaseMapping:0x276A + ,simpleTitleCaseMapping:0x276A + }, + { code:0x276B + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x276B + ,simpleLowerCaseMapping:0x276B + ,simpleTitleCaseMapping:0x276B + }, + { code:0x276C + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x276C + ,simpleLowerCaseMapping:0x276C + ,simpleTitleCaseMapping:0x276C + }, + { code:0x276D + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x276D + ,simpleLowerCaseMapping:0x276D + ,simpleTitleCaseMapping:0x276D + }, + { code:0x276E + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x276E + ,simpleLowerCaseMapping:0x276E + ,simpleTitleCaseMapping:0x276E + }, + { code:0x276F + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x276F + ,simpleLowerCaseMapping:0x276F + ,simpleTitleCaseMapping:0x276F + }, + { code:0x2770 + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x2770 + ,simpleLowerCaseMapping:0x2770 + ,simpleTitleCaseMapping:0x2770 + }, + { code:0x2771 + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x2771 + ,simpleLowerCaseMapping:0x2771 + ,simpleTitleCaseMapping:0x2771 + }, + { code:0x2772 + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x2772 + ,simpleLowerCaseMapping:0x2772 + ,simpleTitleCaseMapping:0x2772 + }, + { code:0x2773 + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x2773 + ,simpleLowerCaseMapping:0x2773 + ,simpleTitleCaseMapping:0x2773 + }, + { code:0x2774 + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x2774 + ,simpleLowerCaseMapping:0x2774 + ,simpleTitleCaseMapping:0x2774 + }, + { code:0x2775 + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x2775 + ,simpleLowerCaseMapping:0x2775 + ,simpleTitleCaseMapping:0x2775 + }, + { code:0x2776 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2776 + ,simpleLowerCaseMapping:0x2776 + ,simpleTitleCaseMapping:0x2776 + }, + { code:0x2777 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2777 + ,simpleLowerCaseMapping:0x2777 + ,simpleTitleCaseMapping:0x2777 + }, + { code:0x2778 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2778 + ,simpleLowerCaseMapping:0x2778 + ,simpleTitleCaseMapping:0x2778 + }, + { code:0x2779 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2779 + ,simpleLowerCaseMapping:0x2779 + ,simpleTitleCaseMapping:0x2779 + }, + { code:0x277A + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x277A + ,simpleLowerCaseMapping:0x277A + ,simpleTitleCaseMapping:0x277A + }, + { code:0x277B + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x277B + ,simpleLowerCaseMapping:0x277B + ,simpleTitleCaseMapping:0x277B + }, + { code:0x277C + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x277C + ,simpleLowerCaseMapping:0x277C + ,simpleTitleCaseMapping:0x277C + }, + { code:0x277D + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x277D + ,simpleLowerCaseMapping:0x277D + ,simpleTitleCaseMapping:0x277D + }, + { code:0x277E + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x277E + ,simpleLowerCaseMapping:0x277E + ,simpleTitleCaseMapping:0x277E + }, + { code:0x277F + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x277F + ,simpleLowerCaseMapping:0x277F + ,simpleTitleCaseMapping:0x277F + }, + { code:0x2780 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2780 + ,simpleLowerCaseMapping:0x2780 + ,simpleTitleCaseMapping:0x2780 + }, + { code:0x2781 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2781 + ,simpleLowerCaseMapping:0x2781 + ,simpleTitleCaseMapping:0x2781 + }, + { code:0x2782 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2782 + ,simpleLowerCaseMapping:0x2782 + ,simpleTitleCaseMapping:0x2782 + }, + { code:0x2783 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2783 + ,simpleLowerCaseMapping:0x2783 + ,simpleTitleCaseMapping:0x2783 + }, + { code:0x2784 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2784 + ,simpleLowerCaseMapping:0x2784 + ,simpleTitleCaseMapping:0x2784 + }, + { code:0x2785 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2785 + ,simpleLowerCaseMapping:0x2785 + ,simpleTitleCaseMapping:0x2785 + }, + { code:0x2786 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2786 + ,simpleLowerCaseMapping:0x2786 + ,simpleTitleCaseMapping:0x2786 + }, + { code:0x2787 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2787 + ,simpleLowerCaseMapping:0x2787 + ,simpleTitleCaseMapping:0x2787 + }, + { code:0x2788 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2788 + ,simpleLowerCaseMapping:0x2788 + ,simpleTitleCaseMapping:0x2788 + }, + { code:0x2789 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2789 + ,simpleLowerCaseMapping:0x2789 + ,simpleTitleCaseMapping:0x2789 + }, + { code:0x278A + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x278A + ,simpleLowerCaseMapping:0x278A + ,simpleTitleCaseMapping:0x278A + }, + { code:0x278B + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x278B + ,simpleLowerCaseMapping:0x278B + ,simpleTitleCaseMapping:0x278B + }, + { code:0x278C + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x278C + ,simpleLowerCaseMapping:0x278C + ,simpleTitleCaseMapping:0x278C + }, + { code:0x278D + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x278D + ,simpleLowerCaseMapping:0x278D + ,simpleTitleCaseMapping:0x278D + }, + { code:0x278E + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x278E + ,simpleLowerCaseMapping:0x278E + ,simpleTitleCaseMapping:0x278E + }, + { code:0x278F + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x278F + ,simpleLowerCaseMapping:0x278F + ,simpleTitleCaseMapping:0x278F + }, + { code:0x2790 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2790 + ,simpleLowerCaseMapping:0x2790 + ,simpleTitleCaseMapping:0x2790 + }, + { code:0x2791 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2791 + ,simpleLowerCaseMapping:0x2791 + ,simpleTitleCaseMapping:0x2791 + }, + { code:0x2792 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2792 + ,simpleLowerCaseMapping:0x2792 + ,simpleTitleCaseMapping:0x2792 + }, + { code:0x2793 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2793 + ,simpleLowerCaseMapping:0x2793 + ,simpleTitleCaseMapping:0x2793 + }, + { code:0x2794 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2794 + ,simpleLowerCaseMapping:0x2794 + ,simpleTitleCaseMapping:0x2794 + }, + { code:0x2798 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2798 + ,simpleLowerCaseMapping:0x2798 + ,simpleTitleCaseMapping:0x2798 + }, + { code:0x2799 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2799 + ,simpleLowerCaseMapping:0x2799 + ,simpleTitleCaseMapping:0x2799 + }, + { code:0x279A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x279A + ,simpleLowerCaseMapping:0x279A + ,simpleTitleCaseMapping:0x279A + }, + { code:0x279B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x279B + ,simpleLowerCaseMapping:0x279B + ,simpleTitleCaseMapping:0x279B + }, + { code:0x279C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x279C + ,simpleLowerCaseMapping:0x279C + ,simpleTitleCaseMapping:0x279C + }, + { code:0x279D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x279D + ,simpleLowerCaseMapping:0x279D + ,simpleTitleCaseMapping:0x279D + }, + { code:0x279E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x279E + ,simpleLowerCaseMapping:0x279E + ,simpleTitleCaseMapping:0x279E + }, + { code:0x279F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x279F + ,simpleLowerCaseMapping:0x279F + ,simpleTitleCaseMapping:0x279F + }, + { code:0x27A0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x27A0 + ,simpleLowerCaseMapping:0x27A0 + ,simpleTitleCaseMapping:0x27A0 + }, + { code:0x27A1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x27A1 + ,simpleLowerCaseMapping:0x27A1 + ,simpleTitleCaseMapping:0x27A1 + }, + { code:0x27A2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x27A2 + ,simpleLowerCaseMapping:0x27A2 + ,simpleTitleCaseMapping:0x27A2 + }, + { code:0x27A3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x27A3 + ,simpleLowerCaseMapping:0x27A3 + ,simpleTitleCaseMapping:0x27A3 + }, + { code:0x27A4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x27A4 + ,simpleLowerCaseMapping:0x27A4 + ,simpleTitleCaseMapping:0x27A4 + }, + { code:0x27A5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x27A5 + ,simpleLowerCaseMapping:0x27A5 + ,simpleTitleCaseMapping:0x27A5 + }, + { code:0x27A6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x27A6 + ,simpleLowerCaseMapping:0x27A6 + ,simpleTitleCaseMapping:0x27A6 + }, + { code:0x27A7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x27A7 + ,simpleLowerCaseMapping:0x27A7 + ,simpleTitleCaseMapping:0x27A7 + }, + { code:0x27A8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x27A8 + ,simpleLowerCaseMapping:0x27A8 + ,simpleTitleCaseMapping:0x27A8 + }, + { code:0x27A9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x27A9 + ,simpleLowerCaseMapping:0x27A9 + ,simpleTitleCaseMapping:0x27A9 + }, + { code:0x27AA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x27AA + ,simpleLowerCaseMapping:0x27AA + ,simpleTitleCaseMapping:0x27AA + }, + { code:0x27AB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x27AB + ,simpleLowerCaseMapping:0x27AB + ,simpleTitleCaseMapping:0x27AB + }, + { code:0x27AC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x27AC + ,simpleLowerCaseMapping:0x27AC + ,simpleTitleCaseMapping:0x27AC + }, + { code:0x27AD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x27AD + ,simpleLowerCaseMapping:0x27AD + ,simpleTitleCaseMapping:0x27AD + }, + { code:0x27AE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x27AE + ,simpleLowerCaseMapping:0x27AE + ,simpleTitleCaseMapping:0x27AE + }, + { code:0x27AF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x27AF + ,simpleLowerCaseMapping:0x27AF + ,simpleTitleCaseMapping:0x27AF + }, + { code:0x27B1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x27B1 + ,simpleLowerCaseMapping:0x27B1 + ,simpleTitleCaseMapping:0x27B1 + }, + { code:0x27B2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x27B2 + ,simpleLowerCaseMapping:0x27B2 + ,simpleTitleCaseMapping:0x27B2 + }, + { code:0x27B3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x27B3 + ,simpleLowerCaseMapping:0x27B3 + ,simpleTitleCaseMapping:0x27B3 + }, + { code:0x27B4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x27B4 + ,simpleLowerCaseMapping:0x27B4 + ,simpleTitleCaseMapping:0x27B4 + }, + { code:0x27B5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x27B5 + ,simpleLowerCaseMapping:0x27B5 + ,simpleTitleCaseMapping:0x27B5 + }, + { code:0x27B6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x27B6 + ,simpleLowerCaseMapping:0x27B6 + ,simpleTitleCaseMapping:0x27B6 + }, + { code:0x27B7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x27B7 + ,simpleLowerCaseMapping:0x27B7 + ,simpleTitleCaseMapping:0x27B7 + }, + { code:0x27B8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x27B8 + ,simpleLowerCaseMapping:0x27B8 + ,simpleTitleCaseMapping:0x27B8 + }, + { code:0x27B9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x27B9 + ,simpleLowerCaseMapping:0x27B9 + ,simpleTitleCaseMapping:0x27B9 + }, + { code:0x27BA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x27BA + ,simpleLowerCaseMapping:0x27BA + ,simpleTitleCaseMapping:0x27BA + }, + { code:0x27BB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x27BB + ,simpleLowerCaseMapping:0x27BB + ,simpleTitleCaseMapping:0x27BB + }, + { code:0x27BC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x27BC + ,simpleLowerCaseMapping:0x27BC + ,simpleTitleCaseMapping:0x27BC + }, + { code:0x27BD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x27BD + ,simpleLowerCaseMapping:0x27BD + ,simpleTitleCaseMapping:0x27BD + }, + { code:0x27BE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x27BE + ,simpleLowerCaseMapping:0x27BE + ,simpleTitleCaseMapping:0x27BE + }, + { code:0x27C0 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27C0 + ,simpleLowerCaseMapping:0x27C0 + ,simpleTitleCaseMapping:0x27C0 + }, + { code:0x27C1 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27C1 + ,simpleLowerCaseMapping:0x27C1 + ,simpleTitleCaseMapping:0x27C1 + }, + { code:0x27C2 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27C2 + ,simpleLowerCaseMapping:0x27C2 + ,simpleTitleCaseMapping:0x27C2 + }, + { code:0x27C3 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27C3 + ,simpleLowerCaseMapping:0x27C3 + ,simpleTitleCaseMapping:0x27C3 + }, + { code:0x27C4 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27C4 + ,simpleLowerCaseMapping:0x27C4 + ,simpleTitleCaseMapping:0x27C4 + }, + { code:0x27C5 + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x27C5 + ,simpleLowerCaseMapping:0x27C5 + ,simpleTitleCaseMapping:0x27C5 + }, + { code:0x27C6 + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x27C6 + ,simpleLowerCaseMapping:0x27C6 + ,simpleTitleCaseMapping:0x27C6 + }, + { code:0x27C7 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27C7 + ,simpleLowerCaseMapping:0x27C7 + ,simpleTitleCaseMapping:0x27C7 + }, + { code:0x27C8 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27C8 + ,simpleLowerCaseMapping:0x27C8 + ,simpleTitleCaseMapping:0x27C8 + }, + { code:0x27C9 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27C9 + ,simpleLowerCaseMapping:0x27C9 + ,simpleTitleCaseMapping:0x27C9 + }, + { code:0x27CA + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27CA + ,simpleLowerCaseMapping:0x27CA + ,simpleTitleCaseMapping:0x27CA + }, + { code:0x27D0 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27D0 + ,simpleLowerCaseMapping:0x27D0 + ,simpleTitleCaseMapping:0x27D0 + }, + { code:0x27D1 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27D1 + ,simpleLowerCaseMapping:0x27D1 + ,simpleTitleCaseMapping:0x27D1 + }, + { code:0x27D2 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27D2 + ,simpleLowerCaseMapping:0x27D2 + ,simpleTitleCaseMapping:0x27D2 + }, + { code:0x27D3 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27D3 + ,simpleLowerCaseMapping:0x27D3 + ,simpleTitleCaseMapping:0x27D3 + }, + { code:0x27D4 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27D4 + ,simpleLowerCaseMapping:0x27D4 + ,simpleTitleCaseMapping:0x27D4 + }, + { code:0x27D5 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27D5 + ,simpleLowerCaseMapping:0x27D5 + ,simpleTitleCaseMapping:0x27D5 + }, + { code:0x27D6 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27D6 + ,simpleLowerCaseMapping:0x27D6 + ,simpleTitleCaseMapping:0x27D6 + }, + { code:0x27D7 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27D7 + ,simpleLowerCaseMapping:0x27D7 + ,simpleTitleCaseMapping:0x27D7 + }, + { code:0x27D8 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27D8 + ,simpleLowerCaseMapping:0x27D8 + ,simpleTitleCaseMapping:0x27D8 + }, + { code:0x27D9 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27D9 + ,simpleLowerCaseMapping:0x27D9 + ,simpleTitleCaseMapping:0x27D9 + }, + { code:0x27DA + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27DA + ,simpleLowerCaseMapping:0x27DA + ,simpleTitleCaseMapping:0x27DA + }, + { code:0x27DB + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27DB + ,simpleLowerCaseMapping:0x27DB + ,simpleTitleCaseMapping:0x27DB + }, + { code:0x27DC + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27DC + ,simpleLowerCaseMapping:0x27DC + ,simpleTitleCaseMapping:0x27DC + }, + { code:0x27DD + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27DD + ,simpleLowerCaseMapping:0x27DD + ,simpleTitleCaseMapping:0x27DD + }, + { code:0x27DE + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27DE + ,simpleLowerCaseMapping:0x27DE + ,simpleTitleCaseMapping:0x27DE + }, + { code:0x27DF + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27DF + ,simpleLowerCaseMapping:0x27DF + ,simpleTitleCaseMapping:0x27DF + }, + { code:0x27E0 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27E0 + ,simpleLowerCaseMapping:0x27E0 + ,simpleTitleCaseMapping:0x27E0 + }, + { code:0x27E1 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27E1 + ,simpleLowerCaseMapping:0x27E1 + ,simpleTitleCaseMapping:0x27E1 + }, + { code:0x27E2 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27E2 + ,simpleLowerCaseMapping:0x27E2 + ,simpleTitleCaseMapping:0x27E2 + }, + { code:0x27E3 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27E3 + ,simpleLowerCaseMapping:0x27E3 + ,simpleTitleCaseMapping:0x27E3 + }, + { code:0x27E4 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27E4 + ,simpleLowerCaseMapping:0x27E4 + ,simpleTitleCaseMapping:0x27E4 + }, + { code:0x27E5 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27E5 + ,simpleLowerCaseMapping:0x27E5 + ,simpleTitleCaseMapping:0x27E5 + }, + { code:0x27E6 + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x27E6 + ,simpleLowerCaseMapping:0x27E6 + ,simpleTitleCaseMapping:0x27E6 + }, + { code:0x27E7 + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x27E7 + ,simpleLowerCaseMapping:0x27E7 + ,simpleTitleCaseMapping:0x27E7 + }, + { code:0x27E8 + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x27E8 + ,simpleLowerCaseMapping:0x27E8 + ,simpleTitleCaseMapping:0x27E8 + }, + { code:0x27E9 + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x27E9 + ,simpleLowerCaseMapping:0x27E9 + ,simpleTitleCaseMapping:0x27E9 + }, + { code:0x27EA + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x27EA + ,simpleLowerCaseMapping:0x27EA + ,simpleTitleCaseMapping:0x27EA + }, + { code:0x27EB + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x27EB + ,simpleLowerCaseMapping:0x27EB + ,simpleTitleCaseMapping:0x27EB + }, + { code:0x27F0 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27F0 + ,simpleLowerCaseMapping:0x27F0 + ,simpleTitleCaseMapping:0x27F0 + }, + { code:0x27F1 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27F1 + ,simpleLowerCaseMapping:0x27F1 + ,simpleTitleCaseMapping:0x27F1 + }, + { code:0x27F2 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27F2 + ,simpleLowerCaseMapping:0x27F2 + ,simpleTitleCaseMapping:0x27F2 + }, + { code:0x27F3 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27F3 + ,simpleLowerCaseMapping:0x27F3 + ,simpleTitleCaseMapping:0x27F3 + }, + { code:0x27F4 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27F4 + ,simpleLowerCaseMapping:0x27F4 + ,simpleTitleCaseMapping:0x27F4 + }, + { code:0x27F5 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27F5 + ,simpleLowerCaseMapping:0x27F5 + ,simpleTitleCaseMapping:0x27F5 + }, + { code:0x27F6 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27F6 + ,simpleLowerCaseMapping:0x27F6 + ,simpleTitleCaseMapping:0x27F6 + }, + { code:0x27F7 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27F7 + ,simpleLowerCaseMapping:0x27F7 + ,simpleTitleCaseMapping:0x27F7 + }, + { code:0x27F8 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27F8 + ,simpleLowerCaseMapping:0x27F8 + ,simpleTitleCaseMapping:0x27F8 + }, + { code:0x27F9 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27F9 + ,simpleLowerCaseMapping:0x27F9 + ,simpleTitleCaseMapping:0x27F9 + }, + { code:0x27FA + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27FA + ,simpleLowerCaseMapping:0x27FA + ,simpleTitleCaseMapping:0x27FA + }, + { code:0x27FB + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27FB + ,simpleLowerCaseMapping:0x27FB + ,simpleTitleCaseMapping:0x27FB + }, + { code:0x27FC + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27FC + ,simpleLowerCaseMapping:0x27FC + ,simpleTitleCaseMapping:0x27FC + }, + { code:0x27FD + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27FD + ,simpleLowerCaseMapping:0x27FD + ,simpleTitleCaseMapping:0x27FD + }, + { code:0x27FE + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27FE + ,simpleLowerCaseMapping:0x27FE + ,simpleTitleCaseMapping:0x27FE + }, + { code:0x27FF + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x27FF + ,simpleLowerCaseMapping:0x27FF + ,simpleTitleCaseMapping:0x27FF + }, + { code:0x2800 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2800 + ,simpleLowerCaseMapping:0x2800 + ,simpleTitleCaseMapping:0x2800 + }, + { code:0x2801 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2801 + ,simpleLowerCaseMapping:0x2801 + ,simpleTitleCaseMapping:0x2801 + }, + { code:0x2802 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2802 + ,simpleLowerCaseMapping:0x2802 + ,simpleTitleCaseMapping:0x2802 + }, + { code:0x2803 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2803 + ,simpleLowerCaseMapping:0x2803 + ,simpleTitleCaseMapping:0x2803 + }, + { code:0x2804 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2804 + ,simpleLowerCaseMapping:0x2804 + ,simpleTitleCaseMapping:0x2804 + }, + { code:0x2805 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2805 + ,simpleLowerCaseMapping:0x2805 + ,simpleTitleCaseMapping:0x2805 + }, + { code:0x2806 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2806 + ,simpleLowerCaseMapping:0x2806 + ,simpleTitleCaseMapping:0x2806 + }, + { code:0x2807 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2807 + ,simpleLowerCaseMapping:0x2807 + ,simpleTitleCaseMapping:0x2807 + }, + { code:0x2808 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2808 + ,simpleLowerCaseMapping:0x2808 + ,simpleTitleCaseMapping:0x2808 + }, + { code:0x2809 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2809 + ,simpleLowerCaseMapping:0x2809 + ,simpleTitleCaseMapping:0x2809 + }, + { code:0x280A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x280A + ,simpleLowerCaseMapping:0x280A + ,simpleTitleCaseMapping:0x280A + }, + { code:0x280B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x280B + ,simpleLowerCaseMapping:0x280B + ,simpleTitleCaseMapping:0x280B + }, + { code:0x280C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x280C + ,simpleLowerCaseMapping:0x280C + ,simpleTitleCaseMapping:0x280C + }, + { code:0x280D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x280D + ,simpleLowerCaseMapping:0x280D + ,simpleTitleCaseMapping:0x280D + }, + { code:0x280E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x280E + ,simpleLowerCaseMapping:0x280E + ,simpleTitleCaseMapping:0x280E + }, + { code:0x280F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x280F + ,simpleLowerCaseMapping:0x280F + ,simpleTitleCaseMapping:0x280F + }, + { code:0x2810 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2810 + ,simpleLowerCaseMapping:0x2810 + ,simpleTitleCaseMapping:0x2810 + }, + { code:0x2811 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2811 + ,simpleLowerCaseMapping:0x2811 + ,simpleTitleCaseMapping:0x2811 + }, + { code:0x2812 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2812 + ,simpleLowerCaseMapping:0x2812 + ,simpleTitleCaseMapping:0x2812 + }, + { code:0x2813 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2813 + ,simpleLowerCaseMapping:0x2813 + ,simpleTitleCaseMapping:0x2813 + }, + { code:0x2814 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2814 + ,simpleLowerCaseMapping:0x2814 + ,simpleTitleCaseMapping:0x2814 + }, + { code:0x2815 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2815 + ,simpleLowerCaseMapping:0x2815 + ,simpleTitleCaseMapping:0x2815 + }, + { code:0x2816 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2816 + ,simpleLowerCaseMapping:0x2816 + ,simpleTitleCaseMapping:0x2816 + }, + { code:0x2817 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2817 + ,simpleLowerCaseMapping:0x2817 + ,simpleTitleCaseMapping:0x2817 + }, + { code:0x2818 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2818 + ,simpleLowerCaseMapping:0x2818 + ,simpleTitleCaseMapping:0x2818 + }, + { code:0x2819 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2819 + ,simpleLowerCaseMapping:0x2819 + ,simpleTitleCaseMapping:0x2819 + }, + { code:0x281A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x281A + ,simpleLowerCaseMapping:0x281A + ,simpleTitleCaseMapping:0x281A + }, + { code:0x281B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x281B + ,simpleLowerCaseMapping:0x281B + ,simpleTitleCaseMapping:0x281B + }, + { code:0x281C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x281C + ,simpleLowerCaseMapping:0x281C + ,simpleTitleCaseMapping:0x281C + }, + { code:0x281D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x281D + ,simpleLowerCaseMapping:0x281D + ,simpleTitleCaseMapping:0x281D + }, + { code:0x281E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x281E + ,simpleLowerCaseMapping:0x281E + ,simpleTitleCaseMapping:0x281E + }, + { code:0x281F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x281F + ,simpleLowerCaseMapping:0x281F + ,simpleTitleCaseMapping:0x281F + }, + { code:0x2820 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2820 + ,simpleLowerCaseMapping:0x2820 + ,simpleTitleCaseMapping:0x2820 + }, + { code:0x2821 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2821 + ,simpleLowerCaseMapping:0x2821 + ,simpleTitleCaseMapping:0x2821 + }, + { code:0x2822 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2822 + ,simpleLowerCaseMapping:0x2822 + ,simpleTitleCaseMapping:0x2822 + }, + { code:0x2823 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2823 + ,simpleLowerCaseMapping:0x2823 + ,simpleTitleCaseMapping:0x2823 + }, + { code:0x2824 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2824 + ,simpleLowerCaseMapping:0x2824 + ,simpleTitleCaseMapping:0x2824 + }, + { code:0x2825 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2825 + ,simpleLowerCaseMapping:0x2825 + ,simpleTitleCaseMapping:0x2825 + }, + { code:0x2826 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2826 + ,simpleLowerCaseMapping:0x2826 + ,simpleTitleCaseMapping:0x2826 + }, + { code:0x2827 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2827 + ,simpleLowerCaseMapping:0x2827 + ,simpleTitleCaseMapping:0x2827 + }, + { code:0x2828 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2828 + ,simpleLowerCaseMapping:0x2828 + ,simpleTitleCaseMapping:0x2828 + }, + { code:0x2829 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2829 + ,simpleLowerCaseMapping:0x2829 + ,simpleTitleCaseMapping:0x2829 + }, + { code:0x282A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x282A + ,simpleLowerCaseMapping:0x282A + ,simpleTitleCaseMapping:0x282A + }, + { code:0x282B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x282B + ,simpleLowerCaseMapping:0x282B + ,simpleTitleCaseMapping:0x282B + }, + { code:0x282C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x282C + ,simpleLowerCaseMapping:0x282C + ,simpleTitleCaseMapping:0x282C + }, + { code:0x282D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x282D + ,simpleLowerCaseMapping:0x282D + ,simpleTitleCaseMapping:0x282D + }, + { code:0x282E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x282E + ,simpleLowerCaseMapping:0x282E + ,simpleTitleCaseMapping:0x282E + }, + { code:0x282F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x282F + ,simpleLowerCaseMapping:0x282F + ,simpleTitleCaseMapping:0x282F + }, + { code:0x2830 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2830 + ,simpleLowerCaseMapping:0x2830 + ,simpleTitleCaseMapping:0x2830 + }, + { code:0x2831 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2831 + ,simpleLowerCaseMapping:0x2831 + ,simpleTitleCaseMapping:0x2831 + }, + { code:0x2832 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2832 + ,simpleLowerCaseMapping:0x2832 + ,simpleTitleCaseMapping:0x2832 + }, + { code:0x2833 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2833 + ,simpleLowerCaseMapping:0x2833 + ,simpleTitleCaseMapping:0x2833 + }, + { code:0x2834 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2834 + ,simpleLowerCaseMapping:0x2834 + ,simpleTitleCaseMapping:0x2834 + }, + { code:0x2835 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2835 + ,simpleLowerCaseMapping:0x2835 + ,simpleTitleCaseMapping:0x2835 + }, + { code:0x2836 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2836 + ,simpleLowerCaseMapping:0x2836 + ,simpleTitleCaseMapping:0x2836 + }, + { code:0x2837 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2837 + ,simpleLowerCaseMapping:0x2837 + ,simpleTitleCaseMapping:0x2837 + }, + { code:0x2838 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2838 + ,simpleLowerCaseMapping:0x2838 + ,simpleTitleCaseMapping:0x2838 + }, + { code:0x2839 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2839 + ,simpleLowerCaseMapping:0x2839 + ,simpleTitleCaseMapping:0x2839 + }, + { code:0x283A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x283A + ,simpleLowerCaseMapping:0x283A + ,simpleTitleCaseMapping:0x283A + }, + { code:0x283B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x283B + ,simpleLowerCaseMapping:0x283B + ,simpleTitleCaseMapping:0x283B + }, + { code:0x283C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x283C + ,simpleLowerCaseMapping:0x283C + ,simpleTitleCaseMapping:0x283C + }, + { code:0x283D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x283D + ,simpleLowerCaseMapping:0x283D + ,simpleTitleCaseMapping:0x283D + }, + { code:0x283E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x283E + ,simpleLowerCaseMapping:0x283E + ,simpleTitleCaseMapping:0x283E + }, + { code:0x283F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x283F + ,simpleLowerCaseMapping:0x283F + ,simpleTitleCaseMapping:0x283F + }, + { code:0x2840 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2840 + ,simpleLowerCaseMapping:0x2840 + ,simpleTitleCaseMapping:0x2840 + }, + { code:0x2841 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2841 + ,simpleLowerCaseMapping:0x2841 + ,simpleTitleCaseMapping:0x2841 + }, + { code:0x2842 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2842 + ,simpleLowerCaseMapping:0x2842 + ,simpleTitleCaseMapping:0x2842 + }, + { code:0x2843 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2843 + ,simpleLowerCaseMapping:0x2843 + ,simpleTitleCaseMapping:0x2843 + }, + { code:0x2844 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2844 + ,simpleLowerCaseMapping:0x2844 + ,simpleTitleCaseMapping:0x2844 + }, + { code:0x2845 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2845 + ,simpleLowerCaseMapping:0x2845 + ,simpleTitleCaseMapping:0x2845 + }, + { code:0x2846 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2846 + ,simpleLowerCaseMapping:0x2846 + ,simpleTitleCaseMapping:0x2846 + }, + { code:0x2847 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2847 + ,simpleLowerCaseMapping:0x2847 + ,simpleTitleCaseMapping:0x2847 + }, + { code:0x2848 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2848 + ,simpleLowerCaseMapping:0x2848 + ,simpleTitleCaseMapping:0x2848 + }, + { code:0x2849 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2849 + ,simpleLowerCaseMapping:0x2849 + ,simpleTitleCaseMapping:0x2849 + }, + { code:0x284A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x284A + ,simpleLowerCaseMapping:0x284A + ,simpleTitleCaseMapping:0x284A + }, + { code:0x284B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x284B + ,simpleLowerCaseMapping:0x284B + ,simpleTitleCaseMapping:0x284B + }, + { code:0x284C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x284C + ,simpleLowerCaseMapping:0x284C + ,simpleTitleCaseMapping:0x284C + }, + { code:0x284D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x284D + ,simpleLowerCaseMapping:0x284D + ,simpleTitleCaseMapping:0x284D + }, + { code:0x284E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x284E + ,simpleLowerCaseMapping:0x284E + ,simpleTitleCaseMapping:0x284E + }, + { code:0x284F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x284F + ,simpleLowerCaseMapping:0x284F + ,simpleTitleCaseMapping:0x284F + }, + { code:0x2850 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2850 + ,simpleLowerCaseMapping:0x2850 + ,simpleTitleCaseMapping:0x2850 + }, + { code:0x2851 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2851 + ,simpleLowerCaseMapping:0x2851 + ,simpleTitleCaseMapping:0x2851 + }, + { code:0x2852 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2852 + ,simpleLowerCaseMapping:0x2852 + ,simpleTitleCaseMapping:0x2852 + }, + { code:0x2853 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2853 + ,simpleLowerCaseMapping:0x2853 + ,simpleTitleCaseMapping:0x2853 + }, + { code:0x2854 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2854 + ,simpleLowerCaseMapping:0x2854 + ,simpleTitleCaseMapping:0x2854 + }, + { code:0x2855 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2855 + ,simpleLowerCaseMapping:0x2855 + ,simpleTitleCaseMapping:0x2855 + }, + { code:0x2856 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2856 + ,simpleLowerCaseMapping:0x2856 + ,simpleTitleCaseMapping:0x2856 + }, + { code:0x2857 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2857 + ,simpleLowerCaseMapping:0x2857 + ,simpleTitleCaseMapping:0x2857 + }, + { code:0x2858 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2858 + ,simpleLowerCaseMapping:0x2858 + ,simpleTitleCaseMapping:0x2858 + }, + { code:0x2859 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2859 + ,simpleLowerCaseMapping:0x2859 + ,simpleTitleCaseMapping:0x2859 + }, + { code:0x285A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x285A + ,simpleLowerCaseMapping:0x285A + ,simpleTitleCaseMapping:0x285A + }, + { code:0x285B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x285B + ,simpleLowerCaseMapping:0x285B + ,simpleTitleCaseMapping:0x285B + }, + { code:0x285C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x285C + ,simpleLowerCaseMapping:0x285C + ,simpleTitleCaseMapping:0x285C + }, + { code:0x285D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x285D + ,simpleLowerCaseMapping:0x285D + ,simpleTitleCaseMapping:0x285D + }, + { code:0x285E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x285E + ,simpleLowerCaseMapping:0x285E + ,simpleTitleCaseMapping:0x285E + }, + { code:0x285F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x285F + ,simpleLowerCaseMapping:0x285F + ,simpleTitleCaseMapping:0x285F + }, + { code:0x2860 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2860 + ,simpleLowerCaseMapping:0x2860 + ,simpleTitleCaseMapping:0x2860 + }, + { code:0x2861 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2861 + ,simpleLowerCaseMapping:0x2861 + ,simpleTitleCaseMapping:0x2861 + }, + { code:0x2862 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2862 + ,simpleLowerCaseMapping:0x2862 + ,simpleTitleCaseMapping:0x2862 + }, + { code:0x2863 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2863 + ,simpleLowerCaseMapping:0x2863 + ,simpleTitleCaseMapping:0x2863 + }, + { code:0x2864 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2864 + ,simpleLowerCaseMapping:0x2864 + ,simpleTitleCaseMapping:0x2864 + }, + { code:0x2865 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2865 + ,simpleLowerCaseMapping:0x2865 + ,simpleTitleCaseMapping:0x2865 + }, + { code:0x2866 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2866 + ,simpleLowerCaseMapping:0x2866 + ,simpleTitleCaseMapping:0x2866 + }, + { code:0x2867 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2867 + ,simpleLowerCaseMapping:0x2867 + ,simpleTitleCaseMapping:0x2867 + }, + { code:0x2868 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2868 + ,simpleLowerCaseMapping:0x2868 + ,simpleTitleCaseMapping:0x2868 + }, + { code:0x2869 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2869 + ,simpleLowerCaseMapping:0x2869 + ,simpleTitleCaseMapping:0x2869 + }, + { code:0x286A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x286A + ,simpleLowerCaseMapping:0x286A + ,simpleTitleCaseMapping:0x286A + }, + { code:0x286B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x286B + ,simpleLowerCaseMapping:0x286B + ,simpleTitleCaseMapping:0x286B + }, + { code:0x286C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x286C + ,simpleLowerCaseMapping:0x286C + ,simpleTitleCaseMapping:0x286C + }, + { code:0x286D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x286D + ,simpleLowerCaseMapping:0x286D + ,simpleTitleCaseMapping:0x286D + }, + { code:0x286E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x286E + ,simpleLowerCaseMapping:0x286E + ,simpleTitleCaseMapping:0x286E + }, + { code:0x286F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x286F + ,simpleLowerCaseMapping:0x286F + ,simpleTitleCaseMapping:0x286F + }, + { code:0x2870 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2870 + ,simpleLowerCaseMapping:0x2870 + ,simpleTitleCaseMapping:0x2870 + }, + { code:0x2871 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2871 + ,simpleLowerCaseMapping:0x2871 + ,simpleTitleCaseMapping:0x2871 + }, + { code:0x2872 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2872 + ,simpleLowerCaseMapping:0x2872 + ,simpleTitleCaseMapping:0x2872 + }, + { code:0x2873 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2873 + ,simpleLowerCaseMapping:0x2873 + ,simpleTitleCaseMapping:0x2873 + }, + { code:0x2874 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2874 + ,simpleLowerCaseMapping:0x2874 + ,simpleTitleCaseMapping:0x2874 + }, + { code:0x2875 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2875 + ,simpleLowerCaseMapping:0x2875 + ,simpleTitleCaseMapping:0x2875 + }, + { code:0x2876 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2876 + ,simpleLowerCaseMapping:0x2876 + ,simpleTitleCaseMapping:0x2876 + }, + { code:0x2877 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2877 + ,simpleLowerCaseMapping:0x2877 + ,simpleTitleCaseMapping:0x2877 + }, + { code:0x2878 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2878 + ,simpleLowerCaseMapping:0x2878 + ,simpleTitleCaseMapping:0x2878 + }, + { code:0x2879 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2879 + ,simpleLowerCaseMapping:0x2879 + ,simpleTitleCaseMapping:0x2879 + }, + { code:0x287A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x287A + ,simpleLowerCaseMapping:0x287A + ,simpleTitleCaseMapping:0x287A + }, + { code:0x287B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x287B + ,simpleLowerCaseMapping:0x287B + ,simpleTitleCaseMapping:0x287B + }, + { code:0x287C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x287C + ,simpleLowerCaseMapping:0x287C + ,simpleTitleCaseMapping:0x287C + }, + { code:0x287D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x287D + ,simpleLowerCaseMapping:0x287D + ,simpleTitleCaseMapping:0x287D + }, + { code:0x287E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x287E + ,simpleLowerCaseMapping:0x287E + ,simpleTitleCaseMapping:0x287E + }, + { code:0x287F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x287F + ,simpleLowerCaseMapping:0x287F + ,simpleTitleCaseMapping:0x287F + }, + { code:0x2880 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2880 + ,simpleLowerCaseMapping:0x2880 + ,simpleTitleCaseMapping:0x2880 + }, + { code:0x2881 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2881 + ,simpleLowerCaseMapping:0x2881 + ,simpleTitleCaseMapping:0x2881 + }, + { code:0x2882 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2882 + ,simpleLowerCaseMapping:0x2882 + ,simpleTitleCaseMapping:0x2882 + }, + { code:0x2883 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2883 + ,simpleLowerCaseMapping:0x2883 + ,simpleTitleCaseMapping:0x2883 + }, + { code:0x2884 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2884 + ,simpleLowerCaseMapping:0x2884 + ,simpleTitleCaseMapping:0x2884 + }, + { code:0x2885 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2885 + ,simpleLowerCaseMapping:0x2885 + ,simpleTitleCaseMapping:0x2885 + }, + { code:0x2886 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2886 + ,simpleLowerCaseMapping:0x2886 + ,simpleTitleCaseMapping:0x2886 + }, + { code:0x2887 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2887 + ,simpleLowerCaseMapping:0x2887 + ,simpleTitleCaseMapping:0x2887 + }, + { code:0x2888 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2888 + ,simpleLowerCaseMapping:0x2888 + ,simpleTitleCaseMapping:0x2888 + }, + { code:0x2889 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2889 + ,simpleLowerCaseMapping:0x2889 + ,simpleTitleCaseMapping:0x2889 + }, + { code:0x288A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x288A + ,simpleLowerCaseMapping:0x288A + ,simpleTitleCaseMapping:0x288A + }, + { code:0x288B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x288B + ,simpleLowerCaseMapping:0x288B + ,simpleTitleCaseMapping:0x288B + }, + { code:0x288C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x288C + ,simpleLowerCaseMapping:0x288C + ,simpleTitleCaseMapping:0x288C + }, + { code:0x288D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x288D + ,simpleLowerCaseMapping:0x288D + ,simpleTitleCaseMapping:0x288D + }, + { code:0x288E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x288E + ,simpleLowerCaseMapping:0x288E + ,simpleTitleCaseMapping:0x288E + }, + { code:0x288F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x288F + ,simpleLowerCaseMapping:0x288F + ,simpleTitleCaseMapping:0x288F + }, + { code:0x2890 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2890 + ,simpleLowerCaseMapping:0x2890 + ,simpleTitleCaseMapping:0x2890 + }, + { code:0x2891 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2891 + ,simpleLowerCaseMapping:0x2891 + ,simpleTitleCaseMapping:0x2891 + }, + { code:0x2892 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2892 + ,simpleLowerCaseMapping:0x2892 + ,simpleTitleCaseMapping:0x2892 + }, + { code:0x2893 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2893 + ,simpleLowerCaseMapping:0x2893 + ,simpleTitleCaseMapping:0x2893 + }, + { code:0x2894 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2894 + ,simpleLowerCaseMapping:0x2894 + ,simpleTitleCaseMapping:0x2894 + }, + { code:0x2895 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2895 + ,simpleLowerCaseMapping:0x2895 + ,simpleTitleCaseMapping:0x2895 + }, + { code:0x2896 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2896 + ,simpleLowerCaseMapping:0x2896 + ,simpleTitleCaseMapping:0x2896 + }, + { code:0x2897 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2897 + ,simpleLowerCaseMapping:0x2897 + ,simpleTitleCaseMapping:0x2897 + }, + { code:0x2898 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2898 + ,simpleLowerCaseMapping:0x2898 + ,simpleTitleCaseMapping:0x2898 + }, + { code:0x2899 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2899 + ,simpleLowerCaseMapping:0x2899 + ,simpleTitleCaseMapping:0x2899 + }, + { code:0x289A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x289A + ,simpleLowerCaseMapping:0x289A + ,simpleTitleCaseMapping:0x289A + }, + { code:0x289B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x289B + ,simpleLowerCaseMapping:0x289B + ,simpleTitleCaseMapping:0x289B + }, + { code:0x289C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x289C + ,simpleLowerCaseMapping:0x289C + ,simpleTitleCaseMapping:0x289C + }, + { code:0x289D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x289D + ,simpleLowerCaseMapping:0x289D + ,simpleTitleCaseMapping:0x289D + }, + { code:0x289E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x289E + ,simpleLowerCaseMapping:0x289E + ,simpleTitleCaseMapping:0x289E + }, + { code:0x289F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x289F + ,simpleLowerCaseMapping:0x289F + ,simpleTitleCaseMapping:0x289F + }, + { code:0x28A0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28A0 + ,simpleLowerCaseMapping:0x28A0 + ,simpleTitleCaseMapping:0x28A0 + }, + { code:0x28A1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28A1 + ,simpleLowerCaseMapping:0x28A1 + ,simpleTitleCaseMapping:0x28A1 + }, + { code:0x28A2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28A2 + ,simpleLowerCaseMapping:0x28A2 + ,simpleTitleCaseMapping:0x28A2 + }, + { code:0x28A3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28A3 + ,simpleLowerCaseMapping:0x28A3 + ,simpleTitleCaseMapping:0x28A3 + }, + { code:0x28A4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28A4 + ,simpleLowerCaseMapping:0x28A4 + ,simpleTitleCaseMapping:0x28A4 + }, + { code:0x28A5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28A5 + ,simpleLowerCaseMapping:0x28A5 + ,simpleTitleCaseMapping:0x28A5 + }, + { code:0x28A6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28A6 + ,simpleLowerCaseMapping:0x28A6 + ,simpleTitleCaseMapping:0x28A6 + }, + { code:0x28A7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28A7 + ,simpleLowerCaseMapping:0x28A7 + ,simpleTitleCaseMapping:0x28A7 + }, + { code:0x28A8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28A8 + ,simpleLowerCaseMapping:0x28A8 + ,simpleTitleCaseMapping:0x28A8 + }, + { code:0x28A9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28A9 + ,simpleLowerCaseMapping:0x28A9 + ,simpleTitleCaseMapping:0x28A9 + }, + { code:0x28AA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28AA + ,simpleLowerCaseMapping:0x28AA + ,simpleTitleCaseMapping:0x28AA + }, + { code:0x28AB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28AB + ,simpleLowerCaseMapping:0x28AB + ,simpleTitleCaseMapping:0x28AB + }, + { code:0x28AC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28AC + ,simpleLowerCaseMapping:0x28AC + ,simpleTitleCaseMapping:0x28AC + }, + { code:0x28AD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28AD + ,simpleLowerCaseMapping:0x28AD + ,simpleTitleCaseMapping:0x28AD + }, + { code:0x28AE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28AE + ,simpleLowerCaseMapping:0x28AE + ,simpleTitleCaseMapping:0x28AE + }, + { code:0x28AF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28AF + ,simpleLowerCaseMapping:0x28AF + ,simpleTitleCaseMapping:0x28AF + }, + { code:0x28B0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28B0 + ,simpleLowerCaseMapping:0x28B0 + ,simpleTitleCaseMapping:0x28B0 + }, + { code:0x28B1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28B1 + ,simpleLowerCaseMapping:0x28B1 + ,simpleTitleCaseMapping:0x28B1 + }, + { code:0x28B2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28B2 + ,simpleLowerCaseMapping:0x28B2 + ,simpleTitleCaseMapping:0x28B2 + }, + { code:0x28B3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28B3 + ,simpleLowerCaseMapping:0x28B3 + ,simpleTitleCaseMapping:0x28B3 + }, + { code:0x28B4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28B4 + ,simpleLowerCaseMapping:0x28B4 + ,simpleTitleCaseMapping:0x28B4 + }, + { code:0x28B5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28B5 + ,simpleLowerCaseMapping:0x28B5 + ,simpleTitleCaseMapping:0x28B5 + }, + { code:0x28B6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28B6 + ,simpleLowerCaseMapping:0x28B6 + ,simpleTitleCaseMapping:0x28B6 + }, + { code:0x28B7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28B7 + ,simpleLowerCaseMapping:0x28B7 + ,simpleTitleCaseMapping:0x28B7 + }, + { code:0x28B8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28B8 + ,simpleLowerCaseMapping:0x28B8 + ,simpleTitleCaseMapping:0x28B8 + }, + { code:0x28B9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28B9 + ,simpleLowerCaseMapping:0x28B9 + ,simpleTitleCaseMapping:0x28B9 + }, + { code:0x28BA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28BA + ,simpleLowerCaseMapping:0x28BA + ,simpleTitleCaseMapping:0x28BA + }, + { code:0x28BB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28BB + ,simpleLowerCaseMapping:0x28BB + ,simpleTitleCaseMapping:0x28BB + }, + { code:0x28BC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28BC + ,simpleLowerCaseMapping:0x28BC + ,simpleTitleCaseMapping:0x28BC + }, + { code:0x28BD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28BD + ,simpleLowerCaseMapping:0x28BD + ,simpleTitleCaseMapping:0x28BD + }, + { code:0x28BE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28BE + ,simpleLowerCaseMapping:0x28BE + ,simpleTitleCaseMapping:0x28BE + }, + { code:0x28BF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28BF + ,simpleLowerCaseMapping:0x28BF + ,simpleTitleCaseMapping:0x28BF + }, + { code:0x28C0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28C0 + ,simpleLowerCaseMapping:0x28C0 + ,simpleTitleCaseMapping:0x28C0 + }, + { code:0x28C1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28C1 + ,simpleLowerCaseMapping:0x28C1 + ,simpleTitleCaseMapping:0x28C1 + }, + { code:0x28C2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28C2 + ,simpleLowerCaseMapping:0x28C2 + ,simpleTitleCaseMapping:0x28C2 + }, + { code:0x28C3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28C3 + ,simpleLowerCaseMapping:0x28C3 + ,simpleTitleCaseMapping:0x28C3 + }, + { code:0x28C4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28C4 + ,simpleLowerCaseMapping:0x28C4 + ,simpleTitleCaseMapping:0x28C4 + }, + { code:0x28C5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28C5 + ,simpleLowerCaseMapping:0x28C5 + ,simpleTitleCaseMapping:0x28C5 + }, + { code:0x28C6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28C6 + ,simpleLowerCaseMapping:0x28C6 + ,simpleTitleCaseMapping:0x28C6 + }, + { code:0x28C7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28C7 + ,simpleLowerCaseMapping:0x28C7 + ,simpleTitleCaseMapping:0x28C7 + }, + { code:0x28C8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28C8 + ,simpleLowerCaseMapping:0x28C8 + ,simpleTitleCaseMapping:0x28C8 + }, + { code:0x28C9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28C9 + ,simpleLowerCaseMapping:0x28C9 + ,simpleTitleCaseMapping:0x28C9 + }, + { code:0x28CA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28CA + ,simpleLowerCaseMapping:0x28CA + ,simpleTitleCaseMapping:0x28CA + }, + { code:0x28CB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28CB + ,simpleLowerCaseMapping:0x28CB + ,simpleTitleCaseMapping:0x28CB + }, + { code:0x28CC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28CC + ,simpleLowerCaseMapping:0x28CC + ,simpleTitleCaseMapping:0x28CC + }, + { code:0x28CD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28CD + ,simpleLowerCaseMapping:0x28CD + ,simpleTitleCaseMapping:0x28CD + }, + { code:0x28CE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28CE + ,simpleLowerCaseMapping:0x28CE + ,simpleTitleCaseMapping:0x28CE + }, + { code:0x28CF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28CF + ,simpleLowerCaseMapping:0x28CF + ,simpleTitleCaseMapping:0x28CF + }, + { code:0x28D0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28D0 + ,simpleLowerCaseMapping:0x28D0 + ,simpleTitleCaseMapping:0x28D0 + }, + { code:0x28D1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28D1 + ,simpleLowerCaseMapping:0x28D1 + ,simpleTitleCaseMapping:0x28D1 + }, + { code:0x28D2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28D2 + ,simpleLowerCaseMapping:0x28D2 + ,simpleTitleCaseMapping:0x28D2 + }, + { code:0x28D3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28D3 + ,simpleLowerCaseMapping:0x28D3 + ,simpleTitleCaseMapping:0x28D3 + }, + { code:0x28D4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28D4 + ,simpleLowerCaseMapping:0x28D4 + ,simpleTitleCaseMapping:0x28D4 + }, + { code:0x28D5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28D5 + ,simpleLowerCaseMapping:0x28D5 + ,simpleTitleCaseMapping:0x28D5 + }, + { code:0x28D6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28D6 + ,simpleLowerCaseMapping:0x28D6 + ,simpleTitleCaseMapping:0x28D6 + }, + { code:0x28D7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28D7 + ,simpleLowerCaseMapping:0x28D7 + ,simpleTitleCaseMapping:0x28D7 + }, + { code:0x28D8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28D8 + ,simpleLowerCaseMapping:0x28D8 + ,simpleTitleCaseMapping:0x28D8 + }, + { code:0x28D9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28D9 + ,simpleLowerCaseMapping:0x28D9 + ,simpleTitleCaseMapping:0x28D9 + }, + { code:0x28DA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28DA + ,simpleLowerCaseMapping:0x28DA + ,simpleTitleCaseMapping:0x28DA + }, + { code:0x28DB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28DB + ,simpleLowerCaseMapping:0x28DB + ,simpleTitleCaseMapping:0x28DB + }, + { code:0x28DC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28DC + ,simpleLowerCaseMapping:0x28DC + ,simpleTitleCaseMapping:0x28DC + }, + { code:0x28DD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28DD + ,simpleLowerCaseMapping:0x28DD + ,simpleTitleCaseMapping:0x28DD + }, + { code:0x28DE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28DE + ,simpleLowerCaseMapping:0x28DE + ,simpleTitleCaseMapping:0x28DE + }, + { code:0x28DF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28DF + ,simpleLowerCaseMapping:0x28DF + ,simpleTitleCaseMapping:0x28DF + }, + { code:0x28E0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28E0 + ,simpleLowerCaseMapping:0x28E0 + ,simpleTitleCaseMapping:0x28E0 + }, + { code:0x28E1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28E1 + ,simpleLowerCaseMapping:0x28E1 + ,simpleTitleCaseMapping:0x28E1 + }, + { code:0x28E2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28E2 + ,simpleLowerCaseMapping:0x28E2 + ,simpleTitleCaseMapping:0x28E2 + }, + { code:0x28E3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28E3 + ,simpleLowerCaseMapping:0x28E3 + ,simpleTitleCaseMapping:0x28E3 + }, + { code:0x28E4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28E4 + ,simpleLowerCaseMapping:0x28E4 + ,simpleTitleCaseMapping:0x28E4 + }, + { code:0x28E5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28E5 + ,simpleLowerCaseMapping:0x28E5 + ,simpleTitleCaseMapping:0x28E5 + }, + { code:0x28E6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28E6 + ,simpleLowerCaseMapping:0x28E6 + ,simpleTitleCaseMapping:0x28E6 + }, + { code:0x28E7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28E7 + ,simpleLowerCaseMapping:0x28E7 + ,simpleTitleCaseMapping:0x28E7 + }, + { code:0x28E8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28E8 + ,simpleLowerCaseMapping:0x28E8 + ,simpleTitleCaseMapping:0x28E8 + }, + { code:0x28E9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28E9 + ,simpleLowerCaseMapping:0x28E9 + ,simpleTitleCaseMapping:0x28E9 + }, + { code:0x28EA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28EA + ,simpleLowerCaseMapping:0x28EA + ,simpleTitleCaseMapping:0x28EA + }, + { code:0x28EB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28EB + ,simpleLowerCaseMapping:0x28EB + ,simpleTitleCaseMapping:0x28EB + }, + { code:0x28EC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28EC + ,simpleLowerCaseMapping:0x28EC + ,simpleTitleCaseMapping:0x28EC + }, + { code:0x28ED + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28ED + ,simpleLowerCaseMapping:0x28ED + ,simpleTitleCaseMapping:0x28ED + }, + { code:0x28EE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28EE + ,simpleLowerCaseMapping:0x28EE + ,simpleTitleCaseMapping:0x28EE + }, + { code:0x28EF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28EF + ,simpleLowerCaseMapping:0x28EF + ,simpleTitleCaseMapping:0x28EF + }, + { code:0x28F0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28F0 + ,simpleLowerCaseMapping:0x28F0 + ,simpleTitleCaseMapping:0x28F0 + }, + { code:0x28F1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28F1 + ,simpleLowerCaseMapping:0x28F1 + ,simpleTitleCaseMapping:0x28F1 + }, + { code:0x28F2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28F2 + ,simpleLowerCaseMapping:0x28F2 + ,simpleTitleCaseMapping:0x28F2 + }, + { code:0x28F3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28F3 + ,simpleLowerCaseMapping:0x28F3 + ,simpleTitleCaseMapping:0x28F3 + }, + { code:0x28F4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28F4 + ,simpleLowerCaseMapping:0x28F4 + ,simpleTitleCaseMapping:0x28F4 + }, + { code:0x28F5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28F5 + ,simpleLowerCaseMapping:0x28F5 + ,simpleTitleCaseMapping:0x28F5 + }, + { code:0x28F6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28F6 + ,simpleLowerCaseMapping:0x28F6 + ,simpleTitleCaseMapping:0x28F6 + }, + { code:0x28F7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28F7 + ,simpleLowerCaseMapping:0x28F7 + ,simpleTitleCaseMapping:0x28F7 + }, + { code:0x28F8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28F8 + ,simpleLowerCaseMapping:0x28F8 + ,simpleTitleCaseMapping:0x28F8 + }, + { code:0x28F9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28F9 + ,simpleLowerCaseMapping:0x28F9 + ,simpleTitleCaseMapping:0x28F9 + }, + { code:0x28FA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28FA + ,simpleLowerCaseMapping:0x28FA + ,simpleTitleCaseMapping:0x28FA + }, + { code:0x28FB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28FB + ,simpleLowerCaseMapping:0x28FB + ,simpleTitleCaseMapping:0x28FB + }, + { code:0x28FC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28FC + ,simpleLowerCaseMapping:0x28FC + ,simpleTitleCaseMapping:0x28FC + }, + { code:0x28FD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28FD + ,simpleLowerCaseMapping:0x28FD + ,simpleTitleCaseMapping:0x28FD + }, + { code:0x28FE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28FE + ,simpleLowerCaseMapping:0x28FE + ,simpleTitleCaseMapping:0x28FE + }, + { code:0x28FF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x28FF + ,simpleLowerCaseMapping:0x28FF + ,simpleTitleCaseMapping:0x28FF + }, + { code:0x2900 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2900 + ,simpleLowerCaseMapping:0x2900 + ,simpleTitleCaseMapping:0x2900 + }, + { code:0x2901 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2901 + ,simpleLowerCaseMapping:0x2901 + ,simpleTitleCaseMapping:0x2901 + }, + { code:0x2902 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2902 + ,simpleLowerCaseMapping:0x2902 + ,simpleTitleCaseMapping:0x2902 + }, + { code:0x2903 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2903 + ,simpleLowerCaseMapping:0x2903 + ,simpleTitleCaseMapping:0x2903 + }, + { code:0x2904 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2904 + ,simpleLowerCaseMapping:0x2904 + ,simpleTitleCaseMapping:0x2904 + }, + { code:0x2905 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2905 + ,simpleLowerCaseMapping:0x2905 + ,simpleTitleCaseMapping:0x2905 + }, + { code:0x2906 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2906 + ,simpleLowerCaseMapping:0x2906 + ,simpleTitleCaseMapping:0x2906 + }, + { code:0x2907 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2907 + ,simpleLowerCaseMapping:0x2907 + ,simpleTitleCaseMapping:0x2907 + }, + { code:0x2908 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2908 + ,simpleLowerCaseMapping:0x2908 + ,simpleTitleCaseMapping:0x2908 + }, + { code:0x2909 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2909 + ,simpleLowerCaseMapping:0x2909 + ,simpleTitleCaseMapping:0x2909 + }, + { code:0x290A + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x290A + ,simpleLowerCaseMapping:0x290A + ,simpleTitleCaseMapping:0x290A + }, + { code:0x290B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x290B + ,simpleLowerCaseMapping:0x290B + ,simpleTitleCaseMapping:0x290B + }, + { code:0x290C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x290C + ,simpleLowerCaseMapping:0x290C + ,simpleTitleCaseMapping:0x290C + }, + { code:0x290D + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x290D + ,simpleLowerCaseMapping:0x290D + ,simpleTitleCaseMapping:0x290D + }, + { code:0x290E + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x290E + ,simpleLowerCaseMapping:0x290E + ,simpleTitleCaseMapping:0x290E + }, + { code:0x290F + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x290F + ,simpleLowerCaseMapping:0x290F + ,simpleTitleCaseMapping:0x290F + }, + { code:0x2910 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2910 + ,simpleLowerCaseMapping:0x2910 + ,simpleTitleCaseMapping:0x2910 + }, + { code:0x2911 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2911 + ,simpleLowerCaseMapping:0x2911 + ,simpleTitleCaseMapping:0x2911 + }, + { code:0x2912 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2912 + ,simpleLowerCaseMapping:0x2912 + ,simpleTitleCaseMapping:0x2912 + }, + { code:0x2913 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2913 + ,simpleLowerCaseMapping:0x2913 + ,simpleTitleCaseMapping:0x2913 + }, + { code:0x2914 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2914 + ,simpleLowerCaseMapping:0x2914 + ,simpleTitleCaseMapping:0x2914 + }, + { code:0x2915 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2915 + ,simpleLowerCaseMapping:0x2915 + ,simpleTitleCaseMapping:0x2915 + }, + { code:0x2916 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2916 + ,simpleLowerCaseMapping:0x2916 + ,simpleTitleCaseMapping:0x2916 + }, + { code:0x2917 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2917 + ,simpleLowerCaseMapping:0x2917 + ,simpleTitleCaseMapping:0x2917 + }, + { code:0x2918 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2918 + ,simpleLowerCaseMapping:0x2918 + ,simpleTitleCaseMapping:0x2918 + }, + { code:0x2919 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2919 + ,simpleLowerCaseMapping:0x2919 + ,simpleTitleCaseMapping:0x2919 + }, + { code:0x291A + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x291A + ,simpleLowerCaseMapping:0x291A + ,simpleTitleCaseMapping:0x291A + }, + { code:0x291B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x291B + ,simpleLowerCaseMapping:0x291B + ,simpleTitleCaseMapping:0x291B + }, + { code:0x291C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x291C + ,simpleLowerCaseMapping:0x291C + ,simpleTitleCaseMapping:0x291C + }, + { code:0x291D + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x291D + ,simpleLowerCaseMapping:0x291D + ,simpleTitleCaseMapping:0x291D + }, + { code:0x291E + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x291E + ,simpleLowerCaseMapping:0x291E + ,simpleTitleCaseMapping:0x291E + }, + { code:0x291F + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x291F + ,simpleLowerCaseMapping:0x291F + ,simpleTitleCaseMapping:0x291F + }, + { code:0x2920 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2920 + ,simpleLowerCaseMapping:0x2920 + ,simpleTitleCaseMapping:0x2920 + }, + { code:0x2921 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2921 + ,simpleLowerCaseMapping:0x2921 + ,simpleTitleCaseMapping:0x2921 + }, + { code:0x2922 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2922 + ,simpleLowerCaseMapping:0x2922 + ,simpleTitleCaseMapping:0x2922 + }, + { code:0x2923 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2923 + ,simpleLowerCaseMapping:0x2923 + ,simpleTitleCaseMapping:0x2923 + }, + { code:0x2924 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2924 + ,simpleLowerCaseMapping:0x2924 + ,simpleTitleCaseMapping:0x2924 + }, + { code:0x2925 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2925 + ,simpleLowerCaseMapping:0x2925 + ,simpleTitleCaseMapping:0x2925 + }, + { code:0x2926 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2926 + ,simpleLowerCaseMapping:0x2926 + ,simpleTitleCaseMapping:0x2926 + }, + { code:0x2927 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2927 + ,simpleLowerCaseMapping:0x2927 + ,simpleTitleCaseMapping:0x2927 + }, + { code:0x2928 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2928 + ,simpleLowerCaseMapping:0x2928 + ,simpleTitleCaseMapping:0x2928 + }, + { code:0x2929 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2929 + ,simpleLowerCaseMapping:0x2929 + ,simpleTitleCaseMapping:0x2929 + }, + { code:0x292A + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x292A + ,simpleLowerCaseMapping:0x292A + ,simpleTitleCaseMapping:0x292A + }, + { code:0x292B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x292B + ,simpleLowerCaseMapping:0x292B + ,simpleTitleCaseMapping:0x292B + }, + { code:0x292C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x292C + ,simpleLowerCaseMapping:0x292C + ,simpleTitleCaseMapping:0x292C + }, + { code:0x292D + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x292D + ,simpleLowerCaseMapping:0x292D + ,simpleTitleCaseMapping:0x292D + }, + { code:0x292E + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x292E + ,simpleLowerCaseMapping:0x292E + ,simpleTitleCaseMapping:0x292E + }, + { code:0x292F + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x292F + ,simpleLowerCaseMapping:0x292F + ,simpleTitleCaseMapping:0x292F + }, + { code:0x2930 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2930 + ,simpleLowerCaseMapping:0x2930 + ,simpleTitleCaseMapping:0x2930 + }, + { code:0x2931 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2931 + ,simpleLowerCaseMapping:0x2931 + ,simpleTitleCaseMapping:0x2931 + }, + { code:0x2932 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2932 + ,simpleLowerCaseMapping:0x2932 + ,simpleTitleCaseMapping:0x2932 + }, + { code:0x2933 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2933 + ,simpleLowerCaseMapping:0x2933 + ,simpleTitleCaseMapping:0x2933 + }, + { code:0x2934 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2934 + ,simpleLowerCaseMapping:0x2934 + ,simpleTitleCaseMapping:0x2934 + }, + { code:0x2935 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2935 + ,simpleLowerCaseMapping:0x2935 + ,simpleTitleCaseMapping:0x2935 + }, + { code:0x2936 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2936 + ,simpleLowerCaseMapping:0x2936 + ,simpleTitleCaseMapping:0x2936 + }, + { code:0x2937 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2937 + ,simpleLowerCaseMapping:0x2937 + ,simpleTitleCaseMapping:0x2937 + }, + { code:0x2938 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2938 + ,simpleLowerCaseMapping:0x2938 + ,simpleTitleCaseMapping:0x2938 + }, + { code:0x2939 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2939 + ,simpleLowerCaseMapping:0x2939 + ,simpleTitleCaseMapping:0x2939 + }, + { code:0x293A + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x293A + ,simpleLowerCaseMapping:0x293A + ,simpleTitleCaseMapping:0x293A + }, + { code:0x293B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x293B + ,simpleLowerCaseMapping:0x293B + ,simpleTitleCaseMapping:0x293B + }, + { code:0x293C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x293C + ,simpleLowerCaseMapping:0x293C + ,simpleTitleCaseMapping:0x293C + }, + { code:0x293D + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x293D + ,simpleLowerCaseMapping:0x293D + ,simpleTitleCaseMapping:0x293D + }, + { code:0x293E + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x293E + ,simpleLowerCaseMapping:0x293E + ,simpleTitleCaseMapping:0x293E + }, + { code:0x293F + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x293F + ,simpleLowerCaseMapping:0x293F + ,simpleTitleCaseMapping:0x293F + }, + { code:0x2940 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2940 + ,simpleLowerCaseMapping:0x2940 + ,simpleTitleCaseMapping:0x2940 + }, + { code:0x2941 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2941 + ,simpleLowerCaseMapping:0x2941 + ,simpleTitleCaseMapping:0x2941 + }, + { code:0x2942 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2942 + ,simpleLowerCaseMapping:0x2942 + ,simpleTitleCaseMapping:0x2942 + }, + { code:0x2943 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2943 + ,simpleLowerCaseMapping:0x2943 + ,simpleTitleCaseMapping:0x2943 + }, + { code:0x2944 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2944 + ,simpleLowerCaseMapping:0x2944 + ,simpleTitleCaseMapping:0x2944 + }, + { code:0x2945 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2945 + ,simpleLowerCaseMapping:0x2945 + ,simpleTitleCaseMapping:0x2945 + }, + { code:0x2946 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2946 + ,simpleLowerCaseMapping:0x2946 + ,simpleTitleCaseMapping:0x2946 + }, + { code:0x2947 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2947 + ,simpleLowerCaseMapping:0x2947 + ,simpleTitleCaseMapping:0x2947 + }, + { code:0x2948 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2948 + ,simpleLowerCaseMapping:0x2948 + ,simpleTitleCaseMapping:0x2948 + }, + { code:0x2949 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2949 + ,simpleLowerCaseMapping:0x2949 + ,simpleTitleCaseMapping:0x2949 + }, + { code:0x294A + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x294A + ,simpleLowerCaseMapping:0x294A + ,simpleTitleCaseMapping:0x294A + }, + { code:0x294B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x294B + ,simpleLowerCaseMapping:0x294B + ,simpleTitleCaseMapping:0x294B + }, + { code:0x294C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x294C + ,simpleLowerCaseMapping:0x294C + ,simpleTitleCaseMapping:0x294C + }, + { code:0x294D + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x294D + ,simpleLowerCaseMapping:0x294D + ,simpleTitleCaseMapping:0x294D + }, + { code:0x294E + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x294E + ,simpleLowerCaseMapping:0x294E + ,simpleTitleCaseMapping:0x294E + }, + { code:0x294F + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x294F + ,simpleLowerCaseMapping:0x294F + ,simpleTitleCaseMapping:0x294F + }, + { code:0x2950 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2950 + ,simpleLowerCaseMapping:0x2950 + ,simpleTitleCaseMapping:0x2950 + }, + { code:0x2951 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2951 + ,simpleLowerCaseMapping:0x2951 + ,simpleTitleCaseMapping:0x2951 + }, + { code:0x2952 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2952 + ,simpleLowerCaseMapping:0x2952 + ,simpleTitleCaseMapping:0x2952 + }, + { code:0x2953 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2953 + ,simpleLowerCaseMapping:0x2953 + ,simpleTitleCaseMapping:0x2953 + }, + { code:0x2954 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2954 + ,simpleLowerCaseMapping:0x2954 + ,simpleTitleCaseMapping:0x2954 + }, + { code:0x2955 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2955 + ,simpleLowerCaseMapping:0x2955 + ,simpleTitleCaseMapping:0x2955 + }, + { code:0x2956 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2956 + ,simpleLowerCaseMapping:0x2956 + ,simpleTitleCaseMapping:0x2956 + }, + { code:0x2957 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2957 + ,simpleLowerCaseMapping:0x2957 + ,simpleTitleCaseMapping:0x2957 + }, + { code:0x2958 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2958 + ,simpleLowerCaseMapping:0x2958 + ,simpleTitleCaseMapping:0x2958 + }, + { code:0x2959 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2959 + ,simpleLowerCaseMapping:0x2959 + ,simpleTitleCaseMapping:0x2959 + }, + { code:0x295A + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x295A + ,simpleLowerCaseMapping:0x295A + ,simpleTitleCaseMapping:0x295A + }, + { code:0x295B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x295B + ,simpleLowerCaseMapping:0x295B + ,simpleTitleCaseMapping:0x295B + }, + { code:0x295C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x295C + ,simpleLowerCaseMapping:0x295C + ,simpleTitleCaseMapping:0x295C + }, + { code:0x295D + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x295D + ,simpleLowerCaseMapping:0x295D + ,simpleTitleCaseMapping:0x295D + }, + { code:0x295E + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x295E + ,simpleLowerCaseMapping:0x295E + ,simpleTitleCaseMapping:0x295E + }, + { code:0x295F + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x295F + ,simpleLowerCaseMapping:0x295F + ,simpleTitleCaseMapping:0x295F + }, + { code:0x2960 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2960 + ,simpleLowerCaseMapping:0x2960 + ,simpleTitleCaseMapping:0x2960 + }, + { code:0x2961 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2961 + ,simpleLowerCaseMapping:0x2961 + ,simpleTitleCaseMapping:0x2961 + }, + { code:0x2962 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2962 + ,simpleLowerCaseMapping:0x2962 + ,simpleTitleCaseMapping:0x2962 + }, + { code:0x2963 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2963 + ,simpleLowerCaseMapping:0x2963 + ,simpleTitleCaseMapping:0x2963 + }, + { code:0x2964 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2964 + ,simpleLowerCaseMapping:0x2964 + ,simpleTitleCaseMapping:0x2964 + }, + { code:0x2965 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2965 + ,simpleLowerCaseMapping:0x2965 + ,simpleTitleCaseMapping:0x2965 + }, + { code:0x2966 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2966 + ,simpleLowerCaseMapping:0x2966 + ,simpleTitleCaseMapping:0x2966 + }, + { code:0x2967 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2967 + ,simpleLowerCaseMapping:0x2967 + ,simpleTitleCaseMapping:0x2967 + }, + { code:0x2968 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2968 + ,simpleLowerCaseMapping:0x2968 + ,simpleTitleCaseMapping:0x2968 + }, + { code:0x2969 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2969 + ,simpleLowerCaseMapping:0x2969 + ,simpleTitleCaseMapping:0x2969 + }, + { code:0x296A + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x296A + ,simpleLowerCaseMapping:0x296A + ,simpleTitleCaseMapping:0x296A + }, + { code:0x296B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x296B + ,simpleLowerCaseMapping:0x296B + ,simpleTitleCaseMapping:0x296B + }, + { code:0x296C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x296C + ,simpleLowerCaseMapping:0x296C + ,simpleTitleCaseMapping:0x296C + }, + { code:0x296D + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x296D + ,simpleLowerCaseMapping:0x296D + ,simpleTitleCaseMapping:0x296D + }, + { code:0x296E + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x296E + ,simpleLowerCaseMapping:0x296E + ,simpleTitleCaseMapping:0x296E + }, + { code:0x296F + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x296F + ,simpleLowerCaseMapping:0x296F + ,simpleTitleCaseMapping:0x296F + }, + { code:0x2970 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2970 + ,simpleLowerCaseMapping:0x2970 + ,simpleTitleCaseMapping:0x2970 + }, + { code:0x2971 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2971 + ,simpleLowerCaseMapping:0x2971 + ,simpleTitleCaseMapping:0x2971 + }, + { code:0x2972 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2972 + ,simpleLowerCaseMapping:0x2972 + ,simpleTitleCaseMapping:0x2972 + }, + { code:0x2973 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2973 + ,simpleLowerCaseMapping:0x2973 + ,simpleTitleCaseMapping:0x2973 + }, + { code:0x2974 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2974 + ,simpleLowerCaseMapping:0x2974 + ,simpleTitleCaseMapping:0x2974 + }, + { code:0x2975 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2975 + ,simpleLowerCaseMapping:0x2975 + ,simpleTitleCaseMapping:0x2975 + }, + { code:0x2976 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2976 + ,simpleLowerCaseMapping:0x2976 + ,simpleTitleCaseMapping:0x2976 + }, + { code:0x2977 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2977 + ,simpleLowerCaseMapping:0x2977 + ,simpleTitleCaseMapping:0x2977 + }, + { code:0x2978 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2978 + ,simpleLowerCaseMapping:0x2978 + ,simpleTitleCaseMapping:0x2978 + }, + { code:0x2979 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2979 + ,simpleLowerCaseMapping:0x2979 + ,simpleTitleCaseMapping:0x2979 + }, + { code:0x297A + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x297A + ,simpleLowerCaseMapping:0x297A + ,simpleTitleCaseMapping:0x297A + }, + { code:0x297B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x297B + ,simpleLowerCaseMapping:0x297B + ,simpleTitleCaseMapping:0x297B + }, + { code:0x297C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x297C + ,simpleLowerCaseMapping:0x297C + ,simpleTitleCaseMapping:0x297C + }, + { code:0x297D + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x297D + ,simpleLowerCaseMapping:0x297D + ,simpleTitleCaseMapping:0x297D + }, + { code:0x297E + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x297E + ,simpleLowerCaseMapping:0x297E + ,simpleTitleCaseMapping:0x297E + }, + { code:0x297F + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x297F + ,simpleLowerCaseMapping:0x297F + ,simpleTitleCaseMapping:0x297F + }, + { code:0x2980 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2980 + ,simpleLowerCaseMapping:0x2980 + ,simpleTitleCaseMapping:0x2980 + }, + { code:0x2981 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2981 + ,simpleLowerCaseMapping:0x2981 + ,simpleTitleCaseMapping:0x2981 + }, + { code:0x2982 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2982 + ,simpleLowerCaseMapping:0x2982 + ,simpleTitleCaseMapping:0x2982 + }, + { code:0x2983 + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x2983 + ,simpleLowerCaseMapping:0x2983 + ,simpleTitleCaseMapping:0x2983 + }, + { code:0x2984 + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x2984 + ,simpleLowerCaseMapping:0x2984 + ,simpleTitleCaseMapping:0x2984 + }, + { code:0x2985 + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x2985 + ,simpleLowerCaseMapping:0x2985 + ,simpleTitleCaseMapping:0x2985 + }, + { code:0x2986 + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x2986 + ,simpleLowerCaseMapping:0x2986 + ,simpleTitleCaseMapping:0x2986 + }, + { code:0x2987 + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x2987 + ,simpleLowerCaseMapping:0x2987 + ,simpleTitleCaseMapping:0x2987 + }, + { code:0x2988 + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x2988 + ,simpleLowerCaseMapping:0x2988 + ,simpleTitleCaseMapping:0x2988 + }, + { code:0x2989 + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x2989 + ,simpleLowerCaseMapping:0x2989 + ,simpleTitleCaseMapping:0x2989 + }, + { code:0x298A + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x298A + ,simpleLowerCaseMapping:0x298A + ,simpleTitleCaseMapping:0x298A + }, + { code:0x298B + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x298B + ,simpleLowerCaseMapping:0x298B + ,simpleTitleCaseMapping:0x298B + }, + { code:0x298C + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x298C + ,simpleLowerCaseMapping:0x298C + ,simpleTitleCaseMapping:0x298C + }, + { code:0x298D + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x298D + ,simpleLowerCaseMapping:0x298D + ,simpleTitleCaseMapping:0x298D + }, + { code:0x298E + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x298E + ,simpleLowerCaseMapping:0x298E + ,simpleTitleCaseMapping:0x298E + }, + { code:0x298F + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x298F + ,simpleLowerCaseMapping:0x298F + ,simpleTitleCaseMapping:0x298F + }, + { code:0x2990 + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x2990 + ,simpleLowerCaseMapping:0x2990 + ,simpleTitleCaseMapping:0x2990 + }, + { code:0x2991 + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x2991 + ,simpleLowerCaseMapping:0x2991 + ,simpleTitleCaseMapping:0x2991 + }, + { code:0x2992 + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x2992 + ,simpleLowerCaseMapping:0x2992 + ,simpleTitleCaseMapping:0x2992 + }, + { code:0x2993 + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x2993 + ,simpleLowerCaseMapping:0x2993 + ,simpleTitleCaseMapping:0x2993 + }, + { code:0x2994 + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x2994 + ,simpleLowerCaseMapping:0x2994 + ,simpleTitleCaseMapping:0x2994 + }, + { code:0x2995 + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x2995 + ,simpleLowerCaseMapping:0x2995 + ,simpleTitleCaseMapping:0x2995 + }, + { code:0x2996 + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x2996 + ,simpleLowerCaseMapping:0x2996 + ,simpleTitleCaseMapping:0x2996 + }, + { code:0x2997 + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x2997 + ,simpleLowerCaseMapping:0x2997 + ,simpleTitleCaseMapping:0x2997 + }, + { code:0x2998 + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x2998 + ,simpleLowerCaseMapping:0x2998 + ,simpleTitleCaseMapping:0x2998 + }, + { code:0x2999 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2999 + ,simpleLowerCaseMapping:0x2999 + ,simpleTitleCaseMapping:0x2999 + }, + { code:0x299A + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x299A + ,simpleLowerCaseMapping:0x299A + ,simpleTitleCaseMapping:0x299A + }, + { code:0x299B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x299B + ,simpleLowerCaseMapping:0x299B + ,simpleTitleCaseMapping:0x299B + }, + { code:0x299C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x299C + ,simpleLowerCaseMapping:0x299C + ,simpleTitleCaseMapping:0x299C + }, + { code:0x299D + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x299D + ,simpleLowerCaseMapping:0x299D + ,simpleTitleCaseMapping:0x299D + }, + { code:0x299E + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x299E + ,simpleLowerCaseMapping:0x299E + ,simpleTitleCaseMapping:0x299E + }, + { code:0x299F + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x299F + ,simpleLowerCaseMapping:0x299F + ,simpleTitleCaseMapping:0x299F + }, + { code:0x29A0 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29A0 + ,simpleLowerCaseMapping:0x29A0 + ,simpleTitleCaseMapping:0x29A0 + }, + { code:0x29A1 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29A1 + ,simpleLowerCaseMapping:0x29A1 + ,simpleTitleCaseMapping:0x29A1 + }, + { code:0x29A2 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29A2 + ,simpleLowerCaseMapping:0x29A2 + ,simpleTitleCaseMapping:0x29A2 + }, + { code:0x29A3 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29A3 + ,simpleLowerCaseMapping:0x29A3 + ,simpleTitleCaseMapping:0x29A3 + }, + { code:0x29A4 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29A4 + ,simpleLowerCaseMapping:0x29A4 + ,simpleTitleCaseMapping:0x29A4 + }, + { code:0x29A5 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29A5 + ,simpleLowerCaseMapping:0x29A5 + ,simpleTitleCaseMapping:0x29A5 + }, + { code:0x29A6 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29A6 + ,simpleLowerCaseMapping:0x29A6 + ,simpleTitleCaseMapping:0x29A6 + }, + { code:0x29A7 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29A7 + ,simpleLowerCaseMapping:0x29A7 + ,simpleTitleCaseMapping:0x29A7 + }, + { code:0x29A8 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29A8 + ,simpleLowerCaseMapping:0x29A8 + ,simpleTitleCaseMapping:0x29A8 + }, + { code:0x29A9 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29A9 + ,simpleLowerCaseMapping:0x29A9 + ,simpleTitleCaseMapping:0x29A9 + }, + { code:0x29AA + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29AA + ,simpleLowerCaseMapping:0x29AA + ,simpleTitleCaseMapping:0x29AA + }, + { code:0x29AB + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29AB + ,simpleLowerCaseMapping:0x29AB + ,simpleTitleCaseMapping:0x29AB + }, + { code:0x29AC + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29AC + ,simpleLowerCaseMapping:0x29AC + ,simpleTitleCaseMapping:0x29AC + }, + { code:0x29AD + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29AD + ,simpleLowerCaseMapping:0x29AD + ,simpleTitleCaseMapping:0x29AD + }, + { code:0x29AE + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29AE + ,simpleLowerCaseMapping:0x29AE + ,simpleTitleCaseMapping:0x29AE + }, + { code:0x29AF + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29AF + ,simpleLowerCaseMapping:0x29AF + ,simpleTitleCaseMapping:0x29AF + }, + { code:0x29B0 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29B0 + ,simpleLowerCaseMapping:0x29B0 + ,simpleTitleCaseMapping:0x29B0 + }, + { code:0x29B1 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29B1 + ,simpleLowerCaseMapping:0x29B1 + ,simpleTitleCaseMapping:0x29B1 + }, + { code:0x29B2 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29B2 + ,simpleLowerCaseMapping:0x29B2 + ,simpleTitleCaseMapping:0x29B2 + }, + { code:0x29B3 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29B3 + ,simpleLowerCaseMapping:0x29B3 + ,simpleTitleCaseMapping:0x29B3 + }, + { code:0x29B4 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29B4 + ,simpleLowerCaseMapping:0x29B4 + ,simpleTitleCaseMapping:0x29B4 + }, + { code:0x29B5 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29B5 + ,simpleLowerCaseMapping:0x29B5 + ,simpleTitleCaseMapping:0x29B5 + }, + { code:0x29B6 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29B6 + ,simpleLowerCaseMapping:0x29B6 + ,simpleTitleCaseMapping:0x29B6 + }, + { code:0x29B7 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29B7 + ,simpleLowerCaseMapping:0x29B7 + ,simpleTitleCaseMapping:0x29B7 + }, + { code:0x29B8 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29B8 + ,simpleLowerCaseMapping:0x29B8 + ,simpleTitleCaseMapping:0x29B8 + }, + { code:0x29B9 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29B9 + ,simpleLowerCaseMapping:0x29B9 + ,simpleTitleCaseMapping:0x29B9 + }, + { code:0x29BA + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29BA + ,simpleLowerCaseMapping:0x29BA + ,simpleTitleCaseMapping:0x29BA + }, + { code:0x29BB + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29BB + ,simpleLowerCaseMapping:0x29BB + ,simpleTitleCaseMapping:0x29BB + }, + { code:0x29BC + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29BC + ,simpleLowerCaseMapping:0x29BC + ,simpleTitleCaseMapping:0x29BC + }, + { code:0x29BD + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29BD + ,simpleLowerCaseMapping:0x29BD + ,simpleTitleCaseMapping:0x29BD + }, + { code:0x29BE + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29BE + ,simpleLowerCaseMapping:0x29BE + ,simpleTitleCaseMapping:0x29BE + }, + { code:0x29BF + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29BF + ,simpleLowerCaseMapping:0x29BF + ,simpleTitleCaseMapping:0x29BF + }, + { code:0x29C0 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29C0 + ,simpleLowerCaseMapping:0x29C0 + ,simpleTitleCaseMapping:0x29C0 + }, + { code:0x29C1 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29C1 + ,simpleLowerCaseMapping:0x29C1 + ,simpleTitleCaseMapping:0x29C1 + }, + { code:0x29C2 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29C2 + ,simpleLowerCaseMapping:0x29C2 + ,simpleTitleCaseMapping:0x29C2 + }, + { code:0x29C3 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29C3 + ,simpleLowerCaseMapping:0x29C3 + ,simpleTitleCaseMapping:0x29C3 + }, + { code:0x29C4 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29C4 + ,simpleLowerCaseMapping:0x29C4 + ,simpleTitleCaseMapping:0x29C4 + }, + { code:0x29C5 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29C5 + ,simpleLowerCaseMapping:0x29C5 + ,simpleTitleCaseMapping:0x29C5 + }, + { code:0x29C6 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29C6 + ,simpleLowerCaseMapping:0x29C6 + ,simpleTitleCaseMapping:0x29C6 + }, + { code:0x29C7 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29C7 + ,simpleLowerCaseMapping:0x29C7 + ,simpleTitleCaseMapping:0x29C7 + }, + { code:0x29C8 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29C8 + ,simpleLowerCaseMapping:0x29C8 + ,simpleTitleCaseMapping:0x29C8 + }, + { code:0x29C9 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29C9 + ,simpleLowerCaseMapping:0x29C9 + ,simpleTitleCaseMapping:0x29C9 + }, + { code:0x29CA + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29CA + ,simpleLowerCaseMapping:0x29CA + ,simpleTitleCaseMapping:0x29CA + }, + { code:0x29CB + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29CB + ,simpleLowerCaseMapping:0x29CB + ,simpleTitleCaseMapping:0x29CB + }, + { code:0x29CC + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29CC + ,simpleLowerCaseMapping:0x29CC + ,simpleTitleCaseMapping:0x29CC + }, + { code:0x29CD + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29CD + ,simpleLowerCaseMapping:0x29CD + ,simpleTitleCaseMapping:0x29CD + }, + { code:0x29CE + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29CE + ,simpleLowerCaseMapping:0x29CE + ,simpleTitleCaseMapping:0x29CE + }, + { code:0x29CF + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29CF + ,simpleLowerCaseMapping:0x29CF + ,simpleTitleCaseMapping:0x29CF + }, + { code:0x29D0 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29D0 + ,simpleLowerCaseMapping:0x29D0 + ,simpleTitleCaseMapping:0x29D0 + }, + { code:0x29D1 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29D1 + ,simpleLowerCaseMapping:0x29D1 + ,simpleTitleCaseMapping:0x29D1 + }, + { code:0x29D2 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29D2 + ,simpleLowerCaseMapping:0x29D2 + ,simpleTitleCaseMapping:0x29D2 + }, + { code:0x29D3 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29D3 + ,simpleLowerCaseMapping:0x29D3 + ,simpleTitleCaseMapping:0x29D3 + }, + { code:0x29D4 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29D4 + ,simpleLowerCaseMapping:0x29D4 + ,simpleTitleCaseMapping:0x29D4 + }, + { code:0x29D5 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29D5 + ,simpleLowerCaseMapping:0x29D5 + ,simpleTitleCaseMapping:0x29D5 + }, + { code:0x29D6 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29D6 + ,simpleLowerCaseMapping:0x29D6 + ,simpleTitleCaseMapping:0x29D6 + }, + { code:0x29D7 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29D7 + ,simpleLowerCaseMapping:0x29D7 + ,simpleTitleCaseMapping:0x29D7 + }, + { code:0x29D8 + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x29D8 + ,simpleLowerCaseMapping:0x29D8 + ,simpleTitleCaseMapping:0x29D8 + }, + { code:0x29D9 + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x29D9 + ,simpleLowerCaseMapping:0x29D9 + ,simpleTitleCaseMapping:0x29D9 + }, + { code:0x29DA + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x29DA + ,simpleLowerCaseMapping:0x29DA + ,simpleTitleCaseMapping:0x29DA + }, + { code:0x29DB + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x29DB + ,simpleLowerCaseMapping:0x29DB + ,simpleTitleCaseMapping:0x29DB + }, + { code:0x29DC + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29DC + ,simpleLowerCaseMapping:0x29DC + ,simpleTitleCaseMapping:0x29DC + }, + { code:0x29DD + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29DD + ,simpleLowerCaseMapping:0x29DD + ,simpleTitleCaseMapping:0x29DD + }, + { code:0x29DE + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29DE + ,simpleLowerCaseMapping:0x29DE + ,simpleTitleCaseMapping:0x29DE + }, + { code:0x29DF + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29DF + ,simpleLowerCaseMapping:0x29DF + ,simpleTitleCaseMapping:0x29DF + }, + { code:0x29E0 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29E0 + ,simpleLowerCaseMapping:0x29E0 + ,simpleTitleCaseMapping:0x29E0 + }, + { code:0x29E1 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29E1 + ,simpleLowerCaseMapping:0x29E1 + ,simpleTitleCaseMapping:0x29E1 + }, + { code:0x29E2 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29E2 + ,simpleLowerCaseMapping:0x29E2 + ,simpleTitleCaseMapping:0x29E2 + }, + { code:0x29E3 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29E3 + ,simpleLowerCaseMapping:0x29E3 + ,simpleTitleCaseMapping:0x29E3 + }, + { code:0x29E4 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29E4 + ,simpleLowerCaseMapping:0x29E4 + ,simpleTitleCaseMapping:0x29E4 + }, + { code:0x29E5 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29E5 + ,simpleLowerCaseMapping:0x29E5 + ,simpleTitleCaseMapping:0x29E5 + }, + { code:0x29E6 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29E6 + ,simpleLowerCaseMapping:0x29E6 + ,simpleTitleCaseMapping:0x29E6 + }, + { code:0x29E7 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29E7 + ,simpleLowerCaseMapping:0x29E7 + ,simpleTitleCaseMapping:0x29E7 + }, + { code:0x29E8 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29E8 + ,simpleLowerCaseMapping:0x29E8 + ,simpleTitleCaseMapping:0x29E8 + }, + { code:0x29E9 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29E9 + ,simpleLowerCaseMapping:0x29E9 + ,simpleTitleCaseMapping:0x29E9 + }, + { code:0x29EA + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29EA + ,simpleLowerCaseMapping:0x29EA + ,simpleTitleCaseMapping:0x29EA + }, + { code:0x29EB + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29EB + ,simpleLowerCaseMapping:0x29EB + ,simpleTitleCaseMapping:0x29EB + }, + { code:0x29EC + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29EC + ,simpleLowerCaseMapping:0x29EC + ,simpleTitleCaseMapping:0x29EC + }, + { code:0x29ED + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29ED + ,simpleLowerCaseMapping:0x29ED + ,simpleTitleCaseMapping:0x29ED + }, + { code:0x29EE + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29EE + ,simpleLowerCaseMapping:0x29EE + ,simpleTitleCaseMapping:0x29EE + }, + { code:0x29EF + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29EF + ,simpleLowerCaseMapping:0x29EF + ,simpleTitleCaseMapping:0x29EF + }, + { code:0x29F0 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29F0 + ,simpleLowerCaseMapping:0x29F0 + ,simpleTitleCaseMapping:0x29F0 + }, + { code:0x29F1 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29F1 + ,simpleLowerCaseMapping:0x29F1 + ,simpleTitleCaseMapping:0x29F1 + }, + { code:0x29F2 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29F2 + ,simpleLowerCaseMapping:0x29F2 + ,simpleTitleCaseMapping:0x29F2 + }, + { code:0x29F3 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29F3 + ,simpleLowerCaseMapping:0x29F3 + ,simpleTitleCaseMapping:0x29F3 + }, + { code:0x29F4 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29F4 + ,simpleLowerCaseMapping:0x29F4 + ,simpleTitleCaseMapping:0x29F4 + }, + { code:0x29F5 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29F5 + ,simpleLowerCaseMapping:0x29F5 + ,simpleTitleCaseMapping:0x29F5 + }, + { code:0x29F6 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29F6 + ,simpleLowerCaseMapping:0x29F6 + ,simpleTitleCaseMapping:0x29F6 + }, + { code:0x29F7 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29F7 + ,simpleLowerCaseMapping:0x29F7 + ,simpleTitleCaseMapping:0x29F7 + }, + { code:0x29F8 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29F8 + ,simpleLowerCaseMapping:0x29F8 + ,simpleTitleCaseMapping:0x29F8 + }, + { code:0x29F9 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29F9 + ,simpleLowerCaseMapping:0x29F9 + ,simpleTitleCaseMapping:0x29F9 + }, + { code:0x29FA + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29FA + ,simpleLowerCaseMapping:0x29FA + ,simpleTitleCaseMapping:0x29FA + }, + { code:0x29FB + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29FB + ,simpleLowerCaseMapping:0x29FB + ,simpleTitleCaseMapping:0x29FB + }, + { code:0x29FC + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x29FC + ,simpleLowerCaseMapping:0x29FC + ,simpleTitleCaseMapping:0x29FC + }, + { code:0x29FD + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x29FD + ,simpleLowerCaseMapping:0x29FD + ,simpleTitleCaseMapping:0x29FD + }, + { code:0x29FE + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29FE + ,simpleLowerCaseMapping:0x29FE + ,simpleTitleCaseMapping:0x29FE + }, + { code:0x29FF + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x29FF + ,simpleLowerCaseMapping:0x29FF + ,simpleTitleCaseMapping:0x29FF + }, + { code:0x2A00 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A00 + ,simpleLowerCaseMapping:0x2A00 + ,simpleTitleCaseMapping:0x2A00 + }, + { code:0x2A01 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A01 + ,simpleLowerCaseMapping:0x2A01 + ,simpleTitleCaseMapping:0x2A01 + }, + { code:0x2A02 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A02 + ,simpleLowerCaseMapping:0x2A02 + ,simpleTitleCaseMapping:0x2A02 + }, + { code:0x2A03 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A03 + ,simpleLowerCaseMapping:0x2A03 + ,simpleTitleCaseMapping:0x2A03 + }, + { code:0x2A04 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A04 + ,simpleLowerCaseMapping:0x2A04 + ,simpleTitleCaseMapping:0x2A04 + }, + { code:0x2A05 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A05 + ,simpleLowerCaseMapping:0x2A05 + ,simpleTitleCaseMapping:0x2A05 + }, + { code:0x2A06 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A06 + ,simpleLowerCaseMapping:0x2A06 + ,simpleTitleCaseMapping:0x2A06 + }, + { code:0x2A07 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A07 + ,simpleLowerCaseMapping:0x2A07 + ,simpleTitleCaseMapping:0x2A07 + }, + { code:0x2A08 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A08 + ,simpleLowerCaseMapping:0x2A08 + ,simpleTitleCaseMapping:0x2A08 + }, + { code:0x2A09 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A09 + ,simpleLowerCaseMapping:0x2A09 + ,simpleTitleCaseMapping:0x2A09 + }, + { code:0x2A0A + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A0A + ,simpleLowerCaseMapping:0x2A0A + ,simpleTitleCaseMapping:0x2A0A + }, + { code:0x2A0B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A0B + ,simpleLowerCaseMapping:0x2A0B + ,simpleTitleCaseMapping:0x2A0B + }, + { code:0x2A0C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A0C + ,simpleLowerCaseMapping:0x2A0C + ,simpleTitleCaseMapping:0x2A0C + }, + { code:0x2A0D + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A0D + ,simpleLowerCaseMapping:0x2A0D + ,simpleTitleCaseMapping:0x2A0D + }, + { code:0x2A0E + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A0E + ,simpleLowerCaseMapping:0x2A0E + ,simpleTitleCaseMapping:0x2A0E + }, + { code:0x2A0F + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A0F + ,simpleLowerCaseMapping:0x2A0F + ,simpleTitleCaseMapping:0x2A0F + }, + { code:0x2A10 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A10 + ,simpleLowerCaseMapping:0x2A10 + ,simpleTitleCaseMapping:0x2A10 + }, + { code:0x2A11 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A11 + ,simpleLowerCaseMapping:0x2A11 + ,simpleTitleCaseMapping:0x2A11 + }, + { code:0x2A12 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A12 + ,simpleLowerCaseMapping:0x2A12 + ,simpleTitleCaseMapping:0x2A12 + }, + { code:0x2A13 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A13 + ,simpleLowerCaseMapping:0x2A13 + ,simpleTitleCaseMapping:0x2A13 + }, + { code:0x2A14 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A14 + ,simpleLowerCaseMapping:0x2A14 + ,simpleTitleCaseMapping:0x2A14 + }, + { code:0x2A15 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A15 + ,simpleLowerCaseMapping:0x2A15 + ,simpleTitleCaseMapping:0x2A15 + }, + { code:0x2A16 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A16 + ,simpleLowerCaseMapping:0x2A16 + ,simpleTitleCaseMapping:0x2A16 + }, + { code:0x2A17 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A17 + ,simpleLowerCaseMapping:0x2A17 + ,simpleTitleCaseMapping:0x2A17 + }, + { code:0x2A18 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A18 + ,simpleLowerCaseMapping:0x2A18 + ,simpleTitleCaseMapping:0x2A18 + }, + { code:0x2A19 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A19 + ,simpleLowerCaseMapping:0x2A19 + ,simpleTitleCaseMapping:0x2A19 + }, + { code:0x2A1A + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A1A + ,simpleLowerCaseMapping:0x2A1A + ,simpleTitleCaseMapping:0x2A1A + }, + { code:0x2A1B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A1B + ,simpleLowerCaseMapping:0x2A1B + ,simpleTitleCaseMapping:0x2A1B + }, + { code:0x2A1C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A1C + ,simpleLowerCaseMapping:0x2A1C + ,simpleTitleCaseMapping:0x2A1C + }, + { code:0x2A1D + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A1D + ,simpleLowerCaseMapping:0x2A1D + ,simpleTitleCaseMapping:0x2A1D + }, + { code:0x2A1E + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A1E + ,simpleLowerCaseMapping:0x2A1E + ,simpleTitleCaseMapping:0x2A1E + }, + { code:0x2A1F + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A1F + ,simpleLowerCaseMapping:0x2A1F + ,simpleTitleCaseMapping:0x2A1F + }, + { code:0x2A20 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A20 + ,simpleLowerCaseMapping:0x2A20 + ,simpleTitleCaseMapping:0x2A20 + }, + { code:0x2A21 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A21 + ,simpleLowerCaseMapping:0x2A21 + ,simpleTitleCaseMapping:0x2A21 + }, + { code:0x2A22 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A22 + ,simpleLowerCaseMapping:0x2A22 + ,simpleTitleCaseMapping:0x2A22 + }, + { code:0x2A23 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A23 + ,simpleLowerCaseMapping:0x2A23 + ,simpleTitleCaseMapping:0x2A23 + }, + { code:0x2A24 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A24 + ,simpleLowerCaseMapping:0x2A24 + ,simpleTitleCaseMapping:0x2A24 + }, + { code:0x2A25 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A25 + ,simpleLowerCaseMapping:0x2A25 + ,simpleTitleCaseMapping:0x2A25 + }, + { code:0x2A26 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A26 + ,simpleLowerCaseMapping:0x2A26 + ,simpleTitleCaseMapping:0x2A26 + }, + { code:0x2A27 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A27 + ,simpleLowerCaseMapping:0x2A27 + ,simpleTitleCaseMapping:0x2A27 + }, + { code:0x2A28 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A28 + ,simpleLowerCaseMapping:0x2A28 + ,simpleTitleCaseMapping:0x2A28 + }, + { code:0x2A29 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A29 + ,simpleLowerCaseMapping:0x2A29 + ,simpleTitleCaseMapping:0x2A29 + }, + { code:0x2A2A + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A2A + ,simpleLowerCaseMapping:0x2A2A + ,simpleTitleCaseMapping:0x2A2A + }, + { code:0x2A2B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A2B + ,simpleLowerCaseMapping:0x2A2B + ,simpleTitleCaseMapping:0x2A2B + }, + { code:0x2A2C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A2C + ,simpleLowerCaseMapping:0x2A2C + ,simpleTitleCaseMapping:0x2A2C + }, + { code:0x2A2D + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A2D + ,simpleLowerCaseMapping:0x2A2D + ,simpleTitleCaseMapping:0x2A2D + }, + { code:0x2A2E + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A2E + ,simpleLowerCaseMapping:0x2A2E + ,simpleTitleCaseMapping:0x2A2E + }, + { code:0x2A2F + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A2F + ,simpleLowerCaseMapping:0x2A2F + ,simpleTitleCaseMapping:0x2A2F + }, + { code:0x2A30 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A30 + ,simpleLowerCaseMapping:0x2A30 + ,simpleTitleCaseMapping:0x2A30 + }, + { code:0x2A31 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A31 + ,simpleLowerCaseMapping:0x2A31 + ,simpleTitleCaseMapping:0x2A31 + }, + { code:0x2A32 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A32 + ,simpleLowerCaseMapping:0x2A32 + ,simpleTitleCaseMapping:0x2A32 + }, + { code:0x2A33 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A33 + ,simpleLowerCaseMapping:0x2A33 + ,simpleTitleCaseMapping:0x2A33 + }, + { code:0x2A34 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A34 + ,simpleLowerCaseMapping:0x2A34 + ,simpleTitleCaseMapping:0x2A34 + }, + { code:0x2A35 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A35 + ,simpleLowerCaseMapping:0x2A35 + ,simpleTitleCaseMapping:0x2A35 + }, + { code:0x2A36 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A36 + ,simpleLowerCaseMapping:0x2A36 + ,simpleTitleCaseMapping:0x2A36 + }, + { code:0x2A37 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A37 + ,simpleLowerCaseMapping:0x2A37 + ,simpleTitleCaseMapping:0x2A37 + }, + { code:0x2A38 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A38 + ,simpleLowerCaseMapping:0x2A38 + ,simpleTitleCaseMapping:0x2A38 + }, + { code:0x2A39 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A39 + ,simpleLowerCaseMapping:0x2A39 + ,simpleTitleCaseMapping:0x2A39 + }, + { code:0x2A3A + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A3A + ,simpleLowerCaseMapping:0x2A3A + ,simpleTitleCaseMapping:0x2A3A + }, + { code:0x2A3B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A3B + ,simpleLowerCaseMapping:0x2A3B + ,simpleTitleCaseMapping:0x2A3B + }, + { code:0x2A3C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A3C + ,simpleLowerCaseMapping:0x2A3C + ,simpleTitleCaseMapping:0x2A3C + }, + { code:0x2A3D + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A3D + ,simpleLowerCaseMapping:0x2A3D + ,simpleTitleCaseMapping:0x2A3D + }, + { code:0x2A3E + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A3E + ,simpleLowerCaseMapping:0x2A3E + ,simpleTitleCaseMapping:0x2A3E + }, + { code:0x2A3F + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A3F + ,simpleLowerCaseMapping:0x2A3F + ,simpleTitleCaseMapping:0x2A3F + }, + { code:0x2A40 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A40 + ,simpleLowerCaseMapping:0x2A40 + ,simpleTitleCaseMapping:0x2A40 + }, + { code:0x2A41 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A41 + ,simpleLowerCaseMapping:0x2A41 + ,simpleTitleCaseMapping:0x2A41 + }, + { code:0x2A42 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A42 + ,simpleLowerCaseMapping:0x2A42 + ,simpleTitleCaseMapping:0x2A42 + }, + { code:0x2A43 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A43 + ,simpleLowerCaseMapping:0x2A43 + ,simpleTitleCaseMapping:0x2A43 + }, + { code:0x2A44 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A44 + ,simpleLowerCaseMapping:0x2A44 + ,simpleTitleCaseMapping:0x2A44 + }, + { code:0x2A45 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A45 + ,simpleLowerCaseMapping:0x2A45 + ,simpleTitleCaseMapping:0x2A45 + }, + { code:0x2A46 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A46 + ,simpleLowerCaseMapping:0x2A46 + ,simpleTitleCaseMapping:0x2A46 + }, + { code:0x2A47 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A47 + ,simpleLowerCaseMapping:0x2A47 + ,simpleTitleCaseMapping:0x2A47 + }, + { code:0x2A48 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A48 + ,simpleLowerCaseMapping:0x2A48 + ,simpleTitleCaseMapping:0x2A48 + }, + { code:0x2A49 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A49 + ,simpleLowerCaseMapping:0x2A49 + ,simpleTitleCaseMapping:0x2A49 + }, + { code:0x2A4A + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A4A + ,simpleLowerCaseMapping:0x2A4A + ,simpleTitleCaseMapping:0x2A4A + }, + { code:0x2A4B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A4B + ,simpleLowerCaseMapping:0x2A4B + ,simpleTitleCaseMapping:0x2A4B + }, + { code:0x2A4C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A4C + ,simpleLowerCaseMapping:0x2A4C + ,simpleTitleCaseMapping:0x2A4C + }, + { code:0x2A4D + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A4D + ,simpleLowerCaseMapping:0x2A4D + ,simpleTitleCaseMapping:0x2A4D + }, + { code:0x2A4E + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A4E + ,simpleLowerCaseMapping:0x2A4E + ,simpleTitleCaseMapping:0x2A4E + }, + { code:0x2A4F + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A4F + ,simpleLowerCaseMapping:0x2A4F + ,simpleTitleCaseMapping:0x2A4F + }, + { code:0x2A50 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A50 + ,simpleLowerCaseMapping:0x2A50 + ,simpleTitleCaseMapping:0x2A50 + }, + { code:0x2A51 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A51 + ,simpleLowerCaseMapping:0x2A51 + ,simpleTitleCaseMapping:0x2A51 + }, + { code:0x2A52 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A52 + ,simpleLowerCaseMapping:0x2A52 + ,simpleTitleCaseMapping:0x2A52 + }, + { code:0x2A53 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A53 + ,simpleLowerCaseMapping:0x2A53 + ,simpleTitleCaseMapping:0x2A53 + }, + { code:0x2A54 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A54 + ,simpleLowerCaseMapping:0x2A54 + ,simpleTitleCaseMapping:0x2A54 + }, + { code:0x2A55 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A55 + ,simpleLowerCaseMapping:0x2A55 + ,simpleTitleCaseMapping:0x2A55 + }, + { code:0x2A56 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A56 + ,simpleLowerCaseMapping:0x2A56 + ,simpleTitleCaseMapping:0x2A56 + }, + { code:0x2A57 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A57 + ,simpleLowerCaseMapping:0x2A57 + ,simpleTitleCaseMapping:0x2A57 + }, + { code:0x2A58 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A58 + ,simpleLowerCaseMapping:0x2A58 + ,simpleTitleCaseMapping:0x2A58 + }, + { code:0x2A59 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A59 + ,simpleLowerCaseMapping:0x2A59 + ,simpleTitleCaseMapping:0x2A59 + }, + { code:0x2A5A + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A5A + ,simpleLowerCaseMapping:0x2A5A + ,simpleTitleCaseMapping:0x2A5A + }, + { code:0x2A5B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A5B + ,simpleLowerCaseMapping:0x2A5B + ,simpleTitleCaseMapping:0x2A5B + }, + { code:0x2A5C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A5C + ,simpleLowerCaseMapping:0x2A5C + ,simpleTitleCaseMapping:0x2A5C + }, + { code:0x2A5D + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A5D + ,simpleLowerCaseMapping:0x2A5D + ,simpleTitleCaseMapping:0x2A5D + }, + { code:0x2A5E + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A5E + ,simpleLowerCaseMapping:0x2A5E + ,simpleTitleCaseMapping:0x2A5E + }, + { code:0x2A5F + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A5F + ,simpleLowerCaseMapping:0x2A5F + ,simpleTitleCaseMapping:0x2A5F + }, + { code:0x2A60 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A60 + ,simpleLowerCaseMapping:0x2A60 + ,simpleTitleCaseMapping:0x2A60 + }, + { code:0x2A61 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A61 + ,simpleLowerCaseMapping:0x2A61 + ,simpleTitleCaseMapping:0x2A61 + }, + { code:0x2A62 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A62 + ,simpleLowerCaseMapping:0x2A62 + ,simpleTitleCaseMapping:0x2A62 + }, + { code:0x2A63 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A63 + ,simpleLowerCaseMapping:0x2A63 + ,simpleTitleCaseMapping:0x2A63 + }, + { code:0x2A64 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A64 + ,simpleLowerCaseMapping:0x2A64 + ,simpleTitleCaseMapping:0x2A64 + }, + { code:0x2A65 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A65 + ,simpleLowerCaseMapping:0x2A65 + ,simpleTitleCaseMapping:0x2A65 + }, + { code:0x2A66 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A66 + ,simpleLowerCaseMapping:0x2A66 + ,simpleTitleCaseMapping:0x2A66 + }, + { code:0x2A67 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A67 + ,simpleLowerCaseMapping:0x2A67 + ,simpleTitleCaseMapping:0x2A67 + }, + { code:0x2A68 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A68 + ,simpleLowerCaseMapping:0x2A68 + ,simpleTitleCaseMapping:0x2A68 + }, + { code:0x2A69 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A69 + ,simpleLowerCaseMapping:0x2A69 + ,simpleTitleCaseMapping:0x2A69 + }, + { code:0x2A6A + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A6A + ,simpleLowerCaseMapping:0x2A6A + ,simpleTitleCaseMapping:0x2A6A + }, + { code:0x2A6B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A6B + ,simpleLowerCaseMapping:0x2A6B + ,simpleTitleCaseMapping:0x2A6B + }, + { code:0x2A6C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A6C + ,simpleLowerCaseMapping:0x2A6C + ,simpleTitleCaseMapping:0x2A6C + }, + { code:0x2A6D + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A6D + ,simpleLowerCaseMapping:0x2A6D + ,simpleTitleCaseMapping:0x2A6D + }, + { code:0x2A6E + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A6E + ,simpleLowerCaseMapping:0x2A6E + ,simpleTitleCaseMapping:0x2A6E + }, + { code:0x2A6F + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A6F + ,simpleLowerCaseMapping:0x2A6F + ,simpleTitleCaseMapping:0x2A6F + }, + { code:0x2A70 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A70 + ,simpleLowerCaseMapping:0x2A70 + ,simpleTitleCaseMapping:0x2A70 + }, + { code:0x2A71 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A71 + ,simpleLowerCaseMapping:0x2A71 + ,simpleTitleCaseMapping:0x2A71 + }, + { code:0x2A72 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A72 + ,simpleLowerCaseMapping:0x2A72 + ,simpleTitleCaseMapping:0x2A72 + }, + { code:0x2A73 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A73 + ,simpleLowerCaseMapping:0x2A73 + ,simpleTitleCaseMapping:0x2A73 + }, + { code:0x2A74 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A74 + ,simpleLowerCaseMapping:0x2A74 + ,simpleTitleCaseMapping:0x2A74 + }, + { code:0x2A75 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A75 + ,simpleLowerCaseMapping:0x2A75 + ,simpleTitleCaseMapping:0x2A75 + }, + { code:0x2A76 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A76 + ,simpleLowerCaseMapping:0x2A76 + ,simpleTitleCaseMapping:0x2A76 + }, + { code:0x2A77 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A77 + ,simpleLowerCaseMapping:0x2A77 + ,simpleTitleCaseMapping:0x2A77 + }, + { code:0x2A78 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A78 + ,simpleLowerCaseMapping:0x2A78 + ,simpleTitleCaseMapping:0x2A78 + }, + { code:0x2A79 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A79 + ,simpleLowerCaseMapping:0x2A79 + ,simpleTitleCaseMapping:0x2A79 + }, + { code:0x2A7A + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A7A + ,simpleLowerCaseMapping:0x2A7A + ,simpleTitleCaseMapping:0x2A7A + }, + { code:0x2A7B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A7B + ,simpleLowerCaseMapping:0x2A7B + ,simpleTitleCaseMapping:0x2A7B + }, + { code:0x2A7C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A7C + ,simpleLowerCaseMapping:0x2A7C + ,simpleTitleCaseMapping:0x2A7C + }, + { code:0x2A7D + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A7D + ,simpleLowerCaseMapping:0x2A7D + ,simpleTitleCaseMapping:0x2A7D + }, + { code:0x2A7E + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A7E + ,simpleLowerCaseMapping:0x2A7E + ,simpleTitleCaseMapping:0x2A7E + }, + { code:0x2A7F + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A7F + ,simpleLowerCaseMapping:0x2A7F + ,simpleTitleCaseMapping:0x2A7F + }, + { code:0x2A80 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A80 + ,simpleLowerCaseMapping:0x2A80 + ,simpleTitleCaseMapping:0x2A80 + }, + { code:0x2A81 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A81 + ,simpleLowerCaseMapping:0x2A81 + ,simpleTitleCaseMapping:0x2A81 + }, + { code:0x2A82 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A82 + ,simpleLowerCaseMapping:0x2A82 + ,simpleTitleCaseMapping:0x2A82 + }, + { code:0x2A83 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A83 + ,simpleLowerCaseMapping:0x2A83 + ,simpleTitleCaseMapping:0x2A83 + }, + { code:0x2A84 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A84 + ,simpleLowerCaseMapping:0x2A84 + ,simpleTitleCaseMapping:0x2A84 + }, + { code:0x2A85 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A85 + ,simpleLowerCaseMapping:0x2A85 + ,simpleTitleCaseMapping:0x2A85 + }, + { code:0x2A86 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A86 + ,simpleLowerCaseMapping:0x2A86 + ,simpleTitleCaseMapping:0x2A86 + }, + { code:0x2A87 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A87 + ,simpleLowerCaseMapping:0x2A87 + ,simpleTitleCaseMapping:0x2A87 + }, + { code:0x2A88 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A88 + ,simpleLowerCaseMapping:0x2A88 + ,simpleTitleCaseMapping:0x2A88 + }, + { code:0x2A89 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A89 + ,simpleLowerCaseMapping:0x2A89 + ,simpleTitleCaseMapping:0x2A89 + }, + { code:0x2A8A + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A8A + ,simpleLowerCaseMapping:0x2A8A + ,simpleTitleCaseMapping:0x2A8A + }, + { code:0x2A8B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A8B + ,simpleLowerCaseMapping:0x2A8B + ,simpleTitleCaseMapping:0x2A8B + }, + { code:0x2A8C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A8C + ,simpleLowerCaseMapping:0x2A8C + ,simpleTitleCaseMapping:0x2A8C + }, + { code:0x2A8D + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A8D + ,simpleLowerCaseMapping:0x2A8D + ,simpleTitleCaseMapping:0x2A8D + }, + { code:0x2A8E + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A8E + ,simpleLowerCaseMapping:0x2A8E + ,simpleTitleCaseMapping:0x2A8E + }, + { code:0x2A8F + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A8F + ,simpleLowerCaseMapping:0x2A8F + ,simpleTitleCaseMapping:0x2A8F + }, + { code:0x2A90 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A90 + ,simpleLowerCaseMapping:0x2A90 + ,simpleTitleCaseMapping:0x2A90 + }, + { code:0x2A91 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A91 + ,simpleLowerCaseMapping:0x2A91 + ,simpleTitleCaseMapping:0x2A91 + }, + { code:0x2A92 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A92 + ,simpleLowerCaseMapping:0x2A92 + ,simpleTitleCaseMapping:0x2A92 + }, + { code:0x2A93 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A93 + ,simpleLowerCaseMapping:0x2A93 + ,simpleTitleCaseMapping:0x2A93 + }, + { code:0x2A94 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A94 + ,simpleLowerCaseMapping:0x2A94 + ,simpleTitleCaseMapping:0x2A94 + }, + { code:0x2A95 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A95 + ,simpleLowerCaseMapping:0x2A95 + ,simpleTitleCaseMapping:0x2A95 + }, + { code:0x2A96 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A96 + ,simpleLowerCaseMapping:0x2A96 + ,simpleTitleCaseMapping:0x2A96 + }, + { code:0x2A97 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A97 + ,simpleLowerCaseMapping:0x2A97 + ,simpleTitleCaseMapping:0x2A97 + }, + { code:0x2A98 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A98 + ,simpleLowerCaseMapping:0x2A98 + ,simpleTitleCaseMapping:0x2A98 + }, + { code:0x2A99 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A99 + ,simpleLowerCaseMapping:0x2A99 + ,simpleTitleCaseMapping:0x2A99 + }, + { code:0x2A9A + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A9A + ,simpleLowerCaseMapping:0x2A9A + ,simpleTitleCaseMapping:0x2A9A + }, + { code:0x2A9B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A9B + ,simpleLowerCaseMapping:0x2A9B + ,simpleTitleCaseMapping:0x2A9B + }, + { code:0x2A9C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A9C + ,simpleLowerCaseMapping:0x2A9C + ,simpleTitleCaseMapping:0x2A9C + }, + { code:0x2A9D + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A9D + ,simpleLowerCaseMapping:0x2A9D + ,simpleTitleCaseMapping:0x2A9D + }, + { code:0x2A9E + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A9E + ,simpleLowerCaseMapping:0x2A9E + ,simpleTitleCaseMapping:0x2A9E + }, + { code:0x2A9F + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2A9F + ,simpleLowerCaseMapping:0x2A9F + ,simpleTitleCaseMapping:0x2A9F + }, + { code:0x2AA0 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AA0 + ,simpleLowerCaseMapping:0x2AA0 + ,simpleTitleCaseMapping:0x2AA0 + }, + { code:0x2AA1 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AA1 + ,simpleLowerCaseMapping:0x2AA1 + ,simpleTitleCaseMapping:0x2AA1 + }, + { code:0x2AA2 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AA2 + ,simpleLowerCaseMapping:0x2AA2 + ,simpleTitleCaseMapping:0x2AA2 + }, + { code:0x2AA3 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AA3 + ,simpleLowerCaseMapping:0x2AA3 + ,simpleTitleCaseMapping:0x2AA3 + }, + { code:0x2AA4 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AA4 + ,simpleLowerCaseMapping:0x2AA4 + ,simpleTitleCaseMapping:0x2AA4 + }, + { code:0x2AA5 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AA5 + ,simpleLowerCaseMapping:0x2AA5 + ,simpleTitleCaseMapping:0x2AA5 + }, + { code:0x2AA6 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AA6 + ,simpleLowerCaseMapping:0x2AA6 + ,simpleTitleCaseMapping:0x2AA6 + }, + { code:0x2AA7 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AA7 + ,simpleLowerCaseMapping:0x2AA7 + ,simpleTitleCaseMapping:0x2AA7 + }, + { code:0x2AA8 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AA8 + ,simpleLowerCaseMapping:0x2AA8 + ,simpleTitleCaseMapping:0x2AA8 + }, + { code:0x2AA9 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AA9 + ,simpleLowerCaseMapping:0x2AA9 + ,simpleTitleCaseMapping:0x2AA9 + }, + { code:0x2AAA + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AAA + ,simpleLowerCaseMapping:0x2AAA + ,simpleTitleCaseMapping:0x2AAA + }, + { code:0x2AAB + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AAB + ,simpleLowerCaseMapping:0x2AAB + ,simpleTitleCaseMapping:0x2AAB + }, + { code:0x2AAC + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AAC + ,simpleLowerCaseMapping:0x2AAC + ,simpleTitleCaseMapping:0x2AAC + }, + { code:0x2AAD + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AAD + ,simpleLowerCaseMapping:0x2AAD + ,simpleTitleCaseMapping:0x2AAD + }, + { code:0x2AAE + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AAE + ,simpleLowerCaseMapping:0x2AAE + ,simpleTitleCaseMapping:0x2AAE + }, + { code:0x2AAF + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AAF + ,simpleLowerCaseMapping:0x2AAF + ,simpleTitleCaseMapping:0x2AAF + }, + { code:0x2AB0 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AB0 + ,simpleLowerCaseMapping:0x2AB0 + ,simpleTitleCaseMapping:0x2AB0 + }, + { code:0x2AB1 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AB1 + ,simpleLowerCaseMapping:0x2AB1 + ,simpleTitleCaseMapping:0x2AB1 + }, + { code:0x2AB2 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AB2 + ,simpleLowerCaseMapping:0x2AB2 + ,simpleTitleCaseMapping:0x2AB2 + }, + { code:0x2AB3 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AB3 + ,simpleLowerCaseMapping:0x2AB3 + ,simpleTitleCaseMapping:0x2AB3 + }, + { code:0x2AB4 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AB4 + ,simpleLowerCaseMapping:0x2AB4 + ,simpleTitleCaseMapping:0x2AB4 + }, + { code:0x2AB5 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AB5 + ,simpleLowerCaseMapping:0x2AB5 + ,simpleTitleCaseMapping:0x2AB5 + }, + { code:0x2AB6 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AB6 + ,simpleLowerCaseMapping:0x2AB6 + ,simpleTitleCaseMapping:0x2AB6 + }, + { code:0x2AB7 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AB7 + ,simpleLowerCaseMapping:0x2AB7 + ,simpleTitleCaseMapping:0x2AB7 + }, + { code:0x2AB8 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AB8 + ,simpleLowerCaseMapping:0x2AB8 + ,simpleTitleCaseMapping:0x2AB8 + }, + { code:0x2AB9 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AB9 + ,simpleLowerCaseMapping:0x2AB9 + ,simpleTitleCaseMapping:0x2AB9 + }, + { code:0x2ABA + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2ABA + ,simpleLowerCaseMapping:0x2ABA + ,simpleTitleCaseMapping:0x2ABA + }, + { code:0x2ABB + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2ABB + ,simpleLowerCaseMapping:0x2ABB + ,simpleTitleCaseMapping:0x2ABB + }, + { code:0x2ABC + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2ABC + ,simpleLowerCaseMapping:0x2ABC + ,simpleTitleCaseMapping:0x2ABC + }, + { code:0x2ABD + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2ABD + ,simpleLowerCaseMapping:0x2ABD + ,simpleTitleCaseMapping:0x2ABD + }, + { code:0x2ABE + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2ABE + ,simpleLowerCaseMapping:0x2ABE + ,simpleTitleCaseMapping:0x2ABE + }, + { code:0x2ABF + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2ABF + ,simpleLowerCaseMapping:0x2ABF + ,simpleTitleCaseMapping:0x2ABF + }, + { code:0x2AC0 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AC0 + ,simpleLowerCaseMapping:0x2AC0 + ,simpleTitleCaseMapping:0x2AC0 + }, + { code:0x2AC1 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AC1 + ,simpleLowerCaseMapping:0x2AC1 + ,simpleTitleCaseMapping:0x2AC1 + }, + { code:0x2AC2 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AC2 + ,simpleLowerCaseMapping:0x2AC2 + ,simpleTitleCaseMapping:0x2AC2 + }, + { code:0x2AC3 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AC3 + ,simpleLowerCaseMapping:0x2AC3 + ,simpleTitleCaseMapping:0x2AC3 + }, + { code:0x2AC4 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AC4 + ,simpleLowerCaseMapping:0x2AC4 + ,simpleTitleCaseMapping:0x2AC4 + }, + { code:0x2AC5 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AC5 + ,simpleLowerCaseMapping:0x2AC5 + ,simpleTitleCaseMapping:0x2AC5 + }, + { code:0x2AC6 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AC6 + ,simpleLowerCaseMapping:0x2AC6 + ,simpleTitleCaseMapping:0x2AC6 + }, + { code:0x2AC7 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AC7 + ,simpleLowerCaseMapping:0x2AC7 + ,simpleTitleCaseMapping:0x2AC7 + }, + { code:0x2AC8 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AC8 + ,simpleLowerCaseMapping:0x2AC8 + ,simpleTitleCaseMapping:0x2AC8 + }, + { code:0x2AC9 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AC9 + ,simpleLowerCaseMapping:0x2AC9 + ,simpleTitleCaseMapping:0x2AC9 + }, + { code:0x2ACA + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2ACA + ,simpleLowerCaseMapping:0x2ACA + ,simpleTitleCaseMapping:0x2ACA + }, + { code:0x2ACB + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2ACB + ,simpleLowerCaseMapping:0x2ACB + ,simpleTitleCaseMapping:0x2ACB + }, + { code:0x2ACC + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2ACC + ,simpleLowerCaseMapping:0x2ACC + ,simpleTitleCaseMapping:0x2ACC + }, + { code:0x2ACD + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2ACD + ,simpleLowerCaseMapping:0x2ACD + ,simpleTitleCaseMapping:0x2ACD + }, + { code:0x2ACE + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2ACE + ,simpleLowerCaseMapping:0x2ACE + ,simpleTitleCaseMapping:0x2ACE + }, + { code:0x2ACF + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2ACF + ,simpleLowerCaseMapping:0x2ACF + ,simpleTitleCaseMapping:0x2ACF + }, + { code:0x2AD0 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AD0 + ,simpleLowerCaseMapping:0x2AD0 + ,simpleTitleCaseMapping:0x2AD0 + }, + { code:0x2AD1 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AD1 + ,simpleLowerCaseMapping:0x2AD1 + ,simpleTitleCaseMapping:0x2AD1 + }, + { code:0x2AD2 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AD2 + ,simpleLowerCaseMapping:0x2AD2 + ,simpleTitleCaseMapping:0x2AD2 + }, + { code:0x2AD3 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AD3 + ,simpleLowerCaseMapping:0x2AD3 + ,simpleTitleCaseMapping:0x2AD3 + }, + { code:0x2AD4 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AD4 + ,simpleLowerCaseMapping:0x2AD4 + ,simpleTitleCaseMapping:0x2AD4 + }, + { code:0x2AD5 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AD5 + ,simpleLowerCaseMapping:0x2AD5 + ,simpleTitleCaseMapping:0x2AD5 + }, + { code:0x2AD6 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AD6 + ,simpleLowerCaseMapping:0x2AD6 + ,simpleTitleCaseMapping:0x2AD6 + }, + { code:0x2AD7 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AD7 + ,simpleLowerCaseMapping:0x2AD7 + ,simpleTitleCaseMapping:0x2AD7 + }, + { code:0x2AD8 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AD8 + ,simpleLowerCaseMapping:0x2AD8 + ,simpleTitleCaseMapping:0x2AD8 + }, + { code:0x2AD9 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AD9 + ,simpleLowerCaseMapping:0x2AD9 + ,simpleTitleCaseMapping:0x2AD9 + }, + { code:0x2ADA + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2ADA + ,simpleLowerCaseMapping:0x2ADA + ,simpleTitleCaseMapping:0x2ADA + }, + { code:0x2ADB + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2ADB + ,simpleLowerCaseMapping:0x2ADB + ,simpleTitleCaseMapping:0x2ADB + }, + { code:0x2ADC + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2ADC + ,simpleLowerCaseMapping:0x2ADC + ,simpleTitleCaseMapping:0x2ADC + }, + { code:0x2ADD + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2ADD + ,simpleLowerCaseMapping:0x2ADD + ,simpleTitleCaseMapping:0x2ADD + }, + { code:0x2ADE + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2ADE + ,simpleLowerCaseMapping:0x2ADE + ,simpleTitleCaseMapping:0x2ADE + }, + { code:0x2ADF + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2ADF + ,simpleLowerCaseMapping:0x2ADF + ,simpleTitleCaseMapping:0x2ADF + }, + { code:0x2AE0 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AE0 + ,simpleLowerCaseMapping:0x2AE0 + ,simpleTitleCaseMapping:0x2AE0 + }, + { code:0x2AE1 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AE1 + ,simpleLowerCaseMapping:0x2AE1 + ,simpleTitleCaseMapping:0x2AE1 + }, + { code:0x2AE2 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AE2 + ,simpleLowerCaseMapping:0x2AE2 + ,simpleTitleCaseMapping:0x2AE2 + }, + { code:0x2AE3 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AE3 + ,simpleLowerCaseMapping:0x2AE3 + ,simpleTitleCaseMapping:0x2AE3 + }, + { code:0x2AE4 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AE4 + ,simpleLowerCaseMapping:0x2AE4 + ,simpleTitleCaseMapping:0x2AE4 + }, + { code:0x2AE5 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AE5 + ,simpleLowerCaseMapping:0x2AE5 + ,simpleTitleCaseMapping:0x2AE5 + }, + { code:0x2AE6 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AE6 + ,simpleLowerCaseMapping:0x2AE6 + ,simpleTitleCaseMapping:0x2AE6 + }, + { code:0x2AE7 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AE7 + ,simpleLowerCaseMapping:0x2AE7 + ,simpleTitleCaseMapping:0x2AE7 + }, + { code:0x2AE8 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AE8 + ,simpleLowerCaseMapping:0x2AE8 + ,simpleTitleCaseMapping:0x2AE8 + }, + { code:0x2AE9 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AE9 + ,simpleLowerCaseMapping:0x2AE9 + ,simpleTitleCaseMapping:0x2AE9 + }, + { code:0x2AEA + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AEA + ,simpleLowerCaseMapping:0x2AEA + ,simpleTitleCaseMapping:0x2AEA + }, + { code:0x2AEB + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AEB + ,simpleLowerCaseMapping:0x2AEB + ,simpleTitleCaseMapping:0x2AEB + }, + { code:0x2AEC + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AEC + ,simpleLowerCaseMapping:0x2AEC + ,simpleTitleCaseMapping:0x2AEC + }, + { code:0x2AED + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AED + ,simpleLowerCaseMapping:0x2AED + ,simpleTitleCaseMapping:0x2AED + }, + { code:0x2AEE + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AEE + ,simpleLowerCaseMapping:0x2AEE + ,simpleTitleCaseMapping:0x2AEE + }, + { code:0x2AEF + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AEF + ,simpleLowerCaseMapping:0x2AEF + ,simpleTitleCaseMapping:0x2AEF + }, + { code:0x2AF0 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AF0 + ,simpleLowerCaseMapping:0x2AF0 + ,simpleTitleCaseMapping:0x2AF0 + }, + { code:0x2AF1 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AF1 + ,simpleLowerCaseMapping:0x2AF1 + ,simpleTitleCaseMapping:0x2AF1 + }, + { code:0x2AF2 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AF2 + ,simpleLowerCaseMapping:0x2AF2 + ,simpleTitleCaseMapping:0x2AF2 + }, + { code:0x2AF3 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AF3 + ,simpleLowerCaseMapping:0x2AF3 + ,simpleTitleCaseMapping:0x2AF3 + }, + { code:0x2AF4 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AF4 + ,simpleLowerCaseMapping:0x2AF4 + ,simpleTitleCaseMapping:0x2AF4 + }, + { code:0x2AF5 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AF5 + ,simpleLowerCaseMapping:0x2AF5 + ,simpleTitleCaseMapping:0x2AF5 + }, + { code:0x2AF6 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AF6 + ,simpleLowerCaseMapping:0x2AF6 + ,simpleTitleCaseMapping:0x2AF6 + }, + { code:0x2AF7 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AF7 + ,simpleLowerCaseMapping:0x2AF7 + ,simpleTitleCaseMapping:0x2AF7 + }, + { code:0x2AF8 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AF8 + ,simpleLowerCaseMapping:0x2AF8 + ,simpleTitleCaseMapping:0x2AF8 + }, + { code:0x2AF9 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AF9 + ,simpleLowerCaseMapping:0x2AF9 + ,simpleTitleCaseMapping:0x2AF9 + }, + { code:0x2AFA + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AFA + ,simpleLowerCaseMapping:0x2AFA + ,simpleTitleCaseMapping:0x2AFA + }, + { code:0x2AFB + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AFB + ,simpleLowerCaseMapping:0x2AFB + ,simpleTitleCaseMapping:0x2AFB + }, + { code:0x2AFC + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AFC + ,simpleLowerCaseMapping:0x2AFC + ,simpleTitleCaseMapping:0x2AFC + }, + { code:0x2AFD + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AFD + ,simpleLowerCaseMapping:0x2AFD + ,simpleTitleCaseMapping:0x2AFD + }, + { code:0x2AFE + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AFE + ,simpleLowerCaseMapping:0x2AFE + ,simpleTitleCaseMapping:0x2AFE + }, + { code:0x2AFF + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x2AFF + ,simpleLowerCaseMapping:0x2AFF + ,simpleTitleCaseMapping:0x2AFF + }, + { code:0x2B00 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2B00 + ,simpleLowerCaseMapping:0x2B00 + ,simpleTitleCaseMapping:0x2B00 + }, + { code:0x2B01 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2B01 + ,simpleLowerCaseMapping:0x2B01 + ,simpleTitleCaseMapping:0x2B01 + }, + { code:0x2B02 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2B02 + ,simpleLowerCaseMapping:0x2B02 + ,simpleTitleCaseMapping:0x2B02 + }, + { code:0x2B03 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2B03 + ,simpleLowerCaseMapping:0x2B03 + ,simpleTitleCaseMapping:0x2B03 + }, + { code:0x2B04 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2B04 + ,simpleLowerCaseMapping:0x2B04 + ,simpleTitleCaseMapping:0x2B04 + }, + { code:0x2B05 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2B05 + ,simpleLowerCaseMapping:0x2B05 + ,simpleTitleCaseMapping:0x2B05 + }, + { code:0x2B06 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2B06 + ,simpleLowerCaseMapping:0x2B06 + ,simpleTitleCaseMapping:0x2B06 + }, + { code:0x2B07 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2B07 + ,simpleLowerCaseMapping:0x2B07 + ,simpleTitleCaseMapping:0x2B07 + }, + { code:0x2B08 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2B08 + ,simpleLowerCaseMapping:0x2B08 + ,simpleTitleCaseMapping:0x2B08 + }, + { code:0x2B09 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2B09 + ,simpleLowerCaseMapping:0x2B09 + ,simpleTitleCaseMapping:0x2B09 + }, + { code:0x2B0A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2B0A + ,simpleLowerCaseMapping:0x2B0A + ,simpleTitleCaseMapping:0x2B0A + }, + { code:0x2B0B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2B0B + ,simpleLowerCaseMapping:0x2B0B + ,simpleTitleCaseMapping:0x2B0B + }, + { code:0x2B0C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2B0C + ,simpleLowerCaseMapping:0x2B0C + ,simpleTitleCaseMapping:0x2B0C + }, + { code:0x2B0D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2B0D + ,simpleLowerCaseMapping:0x2B0D + ,simpleTitleCaseMapping:0x2B0D + }, + { code:0x2B0E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2B0E + ,simpleLowerCaseMapping:0x2B0E + ,simpleTitleCaseMapping:0x2B0E + }, + { code:0x2B0F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2B0F + ,simpleLowerCaseMapping:0x2B0F + ,simpleTitleCaseMapping:0x2B0F + }, + { code:0x2B10 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2B10 + ,simpleLowerCaseMapping:0x2B10 + ,simpleTitleCaseMapping:0x2B10 + }, + { code:0x2B11 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2B11 + ,simpleLowerCaseMapping:0x2B11 + ,simpleTitleCaseMapping:0x2B11 + }, + { code:0x2B12 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2B12 + ,simpleLowerCaseMapping:0x2B12 + ,simpleTitleCaseMapping:0x2B12 + }, + { code:0x2B13 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2B13 + ,simpleLowerCaseMapping:0x2B13 + ,simpleTitleCaseMapping:0x2B13 + }, + { code:0x2B14 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2B14 + ,simpleLowerCaseMapping:0x2B14 + ,simpleTitleCaseMapping:0x2B14 + }, + { code:0x2B15 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2B15 + ,simpleLowerCaseMapping:0x2B15 + ,simpleTitleCaseMapping:0x2B15 + }, + { code:0x2B16 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2B16 + ,simpleLowerCaseMapping:0x2B16 + ,simpleTitleCaseMapping:0x2B16 + }, + { code:0x2B17 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2B17 + ,simpleLowerCaseMapping:0x2B17 + ,simpleTitleCaseMapping:0x2B17 + }, + { code:0x2B18 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2B18 + ,simpleLowerCaseMapping:0x2B18 + ,simpleTitleCaseMapping:0x2B18 + }, + { code:0x2B19 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2B19 + ,simpleLowerCaseMapping:0x2B19 + ,simpleTitleCaseMapping:0x2B19 + }, + { code:0x2B1A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2B1A + ,simpleLowerCaseMapping:0x2B1A + ,simpleTitleCaseMapping:0x2B1A + }, + { code:0x2B20 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2B20 + ,simpleLowerCaseMapping:0x2B20 + ,simpleTitleCaseMapping:0x2B20 + }, + { code:0x2B21 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2B21 + ,simpleLowerCaseMapping:0x2B21 + ,simpleTitleCaseMapping:0x2B21 + }, + { code:0x2B22 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2B22 + ,simpleLowerCaseMapping:0x2B22 + ,simpleTitleCaseMapping:0x2B22 + }, + { code:0x2B23 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2B23 + ,simpleLowerCaseMapping:0x2B23 + ,simpleTitleCaseMapping:0x2B23 + }, + { code:0x2C00 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C00 + ,simpleLowerCaseMapping:0x2C30 + ,simpleTitleCaseMapping:0x2C00 + }, + { code:0x2C01 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C01 + ,simpleLowerCaseMapping:0x2C31 + ,simpleTitleCaseMapping:0x2C01 + }, + { code:0x2C02 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C02 + ,simpleLowerCaseMapping:0x2C32 + ,simpleTitleCaseMapping:0x2C02 + }, + { code:0x2C03 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C03 + ,simpleLowerCaseMapping:0x2C33 + ,simpleTitleCaseMapping:0x2C03 + }, + { code:0x2C04 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C04 + ,simpleLowerCaseMapping:0x2C34 + ,simpleTitleCaseMapping:0x2C04 + }, + { code:0x2C05 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C05 + ,simpleLowerCaseMapping:0x2C35 + ,simpleTitleCaseMapping:0x2C05 + }, + { code:0x2C06 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C06 + ,simpleLowerCaseMapping:0x2C36 + ,simpleTitleCaseMapping:0x2C06 + }, + { code:0x2C07 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C07 + ,simpleLowerCaseMapping:0x2C37 + ,simpleTitleCaseMapping:0x2C07 + }, + { code:0x2C08 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C08 + ,simpleLowerCaseMapping:0x2C38 + ,simpleTitleCaseMapping:0x2C08 + }, + { code:0x2C09 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C09 + ,simpleLowerCaseMapping:0x2C39 + ,simpleTitleCaseMapping:0x2C09 + }, + { code:0x2C0A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C0A + ,simpleLowerCaseMapping:0x2C3A + ,simpleTitleCaseMapping:0x2C0A + }, + { code:0x2C0B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C0B + ,simpleLowerCaseMapping:0x2C3B + ,simpleTitleCaseMapping:0x2C0B + }, + { code:0x2C0C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C0C + ,simpleLowerCaseMapping:0x2C3C + ,simpleTitleCaseMapping:0x2C0C + }, + { code:0x2C0D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C0D + ,simpleLowerCaseMapping:0x2C3D + ,simpleTitleCaseMapping:0x2C0D + }, + { code:0x2C0E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C0E + ,simpleLowerCaseMapping:0x2C3E + ,simpleTitleCaseMapping:0x2C0E + }, + { code:0x2C0F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C0F + ,simpleLowerCaseMapping:0x2C3F + ,simpleTitleCaseMapping:0x2C0F + }, + { code:0x2C10 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C10 + ,simpleLowerCaseMapping:0x2C40 + ,simpleTitleCaseMapping:0x2C10 + }, + { code:0x2C11 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C11 + ,simpleLowerCaseMapping:0x2C41 + ,simpleTitleCaseMapping:0x2C11 + }, + { code:0x2C12 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C12 + ,simpleLowerCaseMapping:0x2C42 + ,simpleTitleCaseMapping:0x2C12 + }, + { code:0x2C13 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C13 + ,simpleLowerCaseMapping:0x2C43 + ,simpleTitleCaseMapping:0x2C13 + }, + { code:0x2C14 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C14 + ,simpleLowerCaseMapping:0x2C44 + ,simpleTitleCaseMapping:0x2C14 + }, + { code:0x2C15 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C15 + ,simpleLowerCaseMapping:0x2C45 + ,simpleTitleCaseMapping:0x2C15 + }, + { code:0x2C16 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C16 + ,simpleLowerCaseMapping:0x2C46 + ,simpleTitleCaseMapping:0x2C16 + }, + { code:0x2C17 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C17 + ,simpleLowerCaseMapping:0x2C47 + ,simpleTitleCaseMapping:0x2C17 + }, + { code:0x2C18 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C18 + ,simpleLowerCaseMapping:0x2C48 + ,simpleTitleCaseMapping:0x2C18 + }, + { code:0x2C19 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C19 + ,simpleLowerCaseMapping:0x2C49 + ,simpleTitleCaseMapping:0x2C19 + }, + { code:0x2C1A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C1A + ,simpleLowerCaseMapping:0x2C4A + ,simpleTitleCaseMapping:0x2C1A + }, + { code:0x2C1B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C1B + ,simpleLowerCaseMapping:0x2C4B + ,simpleTitleCaseMapping:0x2C1B + }, + { code:0x2C1C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C1C + ,simpleLowerCaseMapping:0x2C4C + ,simpleTitleCaseMapping:0x2C1C + }, + { code:0x2C1D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C1D + ,simpleLowerCaseMapping:0x2C4D + ,simpleTitleCaseMapping:0x2C1D + }, + { code:0x2C1E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C1E + ,simpleLowerCaseMapping:0x2C4E + ,simpleTitleCaseMapping:0x2C1E + }, + { code:0x2C1F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C1F + ,simpleLowerCaseMapping:0x2C4F + ,simpleTitleCaseMapping:0x2C1F + }, + { code:0x2C20 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C20 + ,simpleLowerCaseMapping:0x2C50 + ,simpleTitleCaseMapping:0x2C20 + }, + { code:0x2C21 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C21 + ,simpleLowerCaseMapping:0x2C51 + ,simpleTitleCaseMapping:0x2C21 + }, + { code:0x2C22 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C22 + ,simpleLowerCaseMapping:0x2C52 + ,simpleTitleCaseMapping:0x2C22 + }, + { code:0x2C23 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C23 + ,simpleLowerCaseMapping:0x2C53 + ,simpleTitleCaseMapping:0x2C23 + }, + { code:0x2C24 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C24 + ,simpleLowerCaseMapping:0x2C54 + ,simpleTitleCaseMapping:0x2C24 + }, + { code:0x2C25 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C25 + ,simpleLowerCaseMapping:0x2C55 + ,simpleTitleCaseMapping:0x2C25 + }, + { code:0x2C26 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C26 + ,simpleLowerCaseMapping:0x2C56 + ,simpleTitleCaseMapping:0x2C26 + }, + { code:0x2C27 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C27 + ,simpleLowerCaseMapping:0x2C57 + ,simpleTitleCaseMapping:0x2C27 + }, + { code:0x2C28 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C28 + ,simpleLowerCaseMapping:0x2C58 + ,simpleTitleCaseMapping:0x2C28 + }, + { code:0x2C29 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C29 + ,simpleLowerCaseMapping:0x2C59 + ,simpleTitleCaseMapping:0x2C29 + }, + { code:0x2C2A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C2A + ,simpleLowerCaseMapping:0x2C5A + ,simpleTitleCaseMapping:0x2C2A + }, + { code:0x2C2B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C2B + ,simpleLowerCaseMapping:0x2C5B + ,simpleTitleCaseMapping:0x2C2B + }, + { code:0x2C2C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C2C + ,simpleLowerCaseMapping:0x2C5C + ,simpleTitleCaseMapping:0x2C2C + }, + { code:0x2C2D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C2D + ,simpleLowerCaseMapping:0x2C5D + ,simpleTitleCaseMapping:0x2C2D + }, + { code:0x2C2E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C2E + ,simpleLowerCaseMapping:0x2C5E + ,simpleTitleCaseMapping:0x2C2E + }, + { code:0x2C30 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C00 + ,simpleLowerCaseMapping:0x2C30 + ,simpleTitleCaseMapping:0x2C00 + }, + { code:0x2C31 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C01 + ,simpleLowerCaseMapping:0x2C31 + ,simpleTitleCaseMapping:0x2C01 + }, + { code:0x2C32 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C02 + ,simpleLowerCaseMapping:0x2C32 + ,simpleTitleCaseMapping:0x2C02 + }, + { code:0x2C33 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C03 + ,simpleLowerCaseMapping:0x2C33 + ,simpleTitleCaseMapping:0x2C03 + }, + { code:0x2C34 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C04 + ,simpleLowerCaseMapping:0x2C34 + ,simpleTitleCaseMapping:0x2C04 + }, + { code:0x2C35 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C05 + ,simpleLowerCaseMapping:0x2C35 + ,simpleTitleCaseMapping:0x2C05 + }, + { code:0x2C36 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C06 + ,simpleLowerCaseMapping:0x2C36 + ,simpleTitleCaseMapping:0x2C06 + }, + { code:0x2C37 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C07 + ,simpleLowerCaseMapping:0x2C37 + ,simpleTitleCaseMapping:0x2C07 + }, + { code:0x2C38 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C08 + ,simpleLowerCaseMapping:0x2C38 + ,simpleTitleCaseMapping:0x2C08 + }, + { code:0x2C39 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C09 + ,simpleLowerCaseMapping:0x2C39 + ,simpleTitleCaseMapping:0x2C09 + }, + { code:0x2C3A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C0A + ,simpleLowerCaseMapping:0x2C3A + ,simpleTitleCaseMapping:0x2C0A + }, + { code:0x2C3B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C0B + ,simpleLowerCaseMapping:0x2C3B + ,simpleTitleCaseMapping:0x2C0B + }, + { code:0x2C3C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C0C + ,simpleLowerCaseMapping:0x2C3C + ,simpleTitleCaseMapping:0x2C0C + }, + { code:0x2C3D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C0D + ,simpleLowerCaseMapping:0x2C3D + ,simpleTitleCaseMapping:0x2C0D + }, + { code:0x2C3E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C0E + ,simpleLowerCaseMapping:0x2C3E + ,simpleTitleCaseMapping:0x2C0E + }, + { code:0x2C3F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C0F + ,simpleLowerCaseMapping:0x2C3F + ,simpleTitleCaseMapping:0x2C0F + }, + { code:0x2C40 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C10 + ,simpleLowerCaseMapping:0x2C40 + ,simpleTitleCaseMapping:0x2C10 + }, + { code:0x2C41 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C11 + ,simpleLowerCaseMapping:0x2C41 + ,simpleTitleCaseMapping:0x2C11 + }, + { code:0x2C42 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C12 + ,simpleLowerCaseMapping:0x2C42 + ,simpleTitleCaseMapping:0x2C12 + }, + { code:0x2C43 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C13 + ,simpleLowerCaseMapping:0x2C43 + ,simpleTitleCaseMapping:0x2C13 + }, + { code:0x2C44 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C14 + ,simpleLowerCaseMapping:0x2C44 + ,simpleTitleCaseMapping:0x2C14 + }, + { code:0x2C45 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C15 + ,simpleLowerCaseMapping:0x2C45 + ,simpleTitleCaseMapping:0x2C15 + }, + { code:0x2C46 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C16 + ,simpleLowerCaseMapping:0x2C46 + ,simpleTitleCaseMapping:0x2C16 + }, + { code:0x2C47 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C17 + ,simpleLowerCaseMapping:0x2C47 + ,simpleTitleCaseMapping:0x2C17 + }, + { code:0x2C48 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C18 + ,simpleLowerCaseMapping:0x2C48 + ,simpleTitleCaseMapping:0x2C18 + }, + { code:0x2C49 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C19 + ,simpleLowerCaseMapping:0x2C49 + ,simpleTitleCaseMapping:0x2C19 + }, + { code:0x2C4A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C1A + ,simpleLowerCaseMapping:0x2C4A + ,simpleTitleCaseMapping:0x2C1A + }, + { code:0x2C4B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C1B + ,simpleLowerCaseMapping:0x2C4B + ,simpleTitleCaseMapping:0x2C1B + }, + { code:0x2C4C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C1C + ,simpleLowerCaseMapping:0x2C4C + ,simpleTitleCaseMapping:0x2C1C + }, + { code:0x2C4D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C1D + ,simpleLowerCaseMapping:0x2C4D + ,simpleTitleCaseMapping:0x2C1D + }, + { code:0x2C4E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C1E + ,simpleLowerCaseMapping:0x2C4E + ,simpleTitleCaseMapping:0x2C1E + }, + { code:0x2C4F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C1F + ,simpleLowerCaseMapping:0x2C4F + ,simpleTitleCaseMapping:0x2C1F + }, + { code:0x2C50 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C20 + ,simpleLowerCaseMapping:0x2C50 + ,simpleTitleCaseMapping:0x2C20 + }, + { code:0x2C51 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C21 + ,simpleLowerCaseMapping:0x2C51 + ,simpleTitleCaseMapping:0x2C21 + }, + { code:0x2C52 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C22 + ,simpleLowerCaseMapping:0x2C52 + ,simpleTitleCaseMapping:0x2C22 + }, + { code:0x2C53 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C23 + ,simpleLowerCaseMapping:0x2C53 + ,simpleTitleCaseMapping:0x2C23 + }, + { code:0x2C54 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C24 + ,simpleLowerCaseMapping:0x2C54 + ,simpleTitleCaseMapping:0x2C24 + }, + { code:0x2C55 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C25 + ,simpleLowerCaseMapping:0x2C55 + ,simpleTitleCaseMapping:0x2C25 + }, + { code:0x2C56 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C26 + ,simpleLowerCaseMapping:0x2C56 + ,simpleTitleCaseMapping:0x2C26 + }, + { code:0x2C57 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C27 + ,simpleLowerCaseMapping:0x2C57 + ,simpleTitleCaseMapping:0x2C27 + }, + { code:0x2C58 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C28 + ,simpleLowerCaseMapping:0x2C58 + ,simpleTitleCaseMapping:0x2C28 + }, + { code:0x2C59 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C29 + ,simpleLowerCaseMapping:0x2C59 + ,simpleTitleCaseMapping:0x2C29 + }, + { code:0x2C5A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C2A + ,simpleLowerCaseMapping:0x2C5A + ,simpleTitleCaseMapping:0x2C2A + }, + { code:0x2C5B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C2B + ,simpleLowerCaseMapping:0x2C5B + ,simpleTitleCaseMapping:0x2C2B + }, + { code:0x2C5C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C2C + ,simpleLowerCaseMapping:0x2C5C + ,simpleTitleCaseMapping:0x2C2C + }, + { code:0x2C5D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C2D + ,simpleLowerCaseMapping:0x2C5D + ,simpleTitleCaseMapping:0x2C2D + }, + { code:0x2C5E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C2E + ,simpleLowerCaseMapping:0x2C5E + ,simpleTitleCaseMapping:0x2C2E + }, + { code:0x2C60 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C60 + ,simpleLowerCaseMapping:0x2C61 + ,simpleTitleCaseMapping:0x2C60 + }, + { code:0x2C61 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C60 + ,simpleLowerCaseMapping:0x2C61 + ,simpleTitleCaseMapping:0x2C60 + }, + { code:0x2C62 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C62 + ,simpleLowerCaseMapping:0x026B + ,simpleTitleCaseMapping:0x2C62 + }, + { code:0x2C63 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C63 + ,simpleLowerCaseMapping:0x1D7D + ,simpleTitleCaseMapping:0x2C63 + }, + { code:0x2C64 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C64 + ,simpleLowerCaseMapping:0x027D + ,simpleTitleCaseMapping:0x2C64 + }, + { code:0x2C65 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x023A + ,simpleLowerCaseMapping:0x2C65 + ,simpleTitleCaseMapping:0x023A + }, + { code:0x2C66 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x023E + ,simpleLowerCaseMapping:0x2C66 + ,simpleTitleCaseMapping:0x023E + }, + { code:0x2C67 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C67 + ,simpleLowerCaseMapping:0x2C68 + ,simpleTitleCaseMapping:0x2C67 + }, + { code:0x2C68 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C67 + ,simpleLowerCaseMapping:0x2C68 + ,simpleTitleCaseMapping:0x2C67 + }, + { code:0x2C69 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C69 + ,simpleLowerCaseMapping:0x2C6A + ,simpleTitleCaseMapping:0x2C69 + }, + { code:0x2C6A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C69 + ,simpleLowerCaseMapping:0x2C6A + ,simpleTitleCaseMapping:0x2C69 + }, + { code:0x2C6B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C6B + ,simpleLowerCaseMapping:0x2C6C + ,simpleTitleCaseMapping:0x2C6B + }, + { code:0x2C6C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C6B + ,simpleLowerCaseMapping:0x2C6C + ,simpleTitleCaseMapping:0x2C6B + }, + { code:0x2C74 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C74 + ,simpleLowerCaseMapping:0x2C74 + ,simpleTitleCaseMapping:0x2C74 + }, + { code:0x2C75 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C75 + ,simpleLowerCaseMapping:0x2C76 + ,simpleTitleCaseMapping:0x2C75 + }, + { code:0x2C76 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C75 + ,simpleLowerCaseMapping:0x2C76 + ,simpleTitleCaseMapping:0x2C75 + }, + { code:0x2C77 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C77 + ,simpleLowerCaseMapping:0x2C77 + ,simpleTitleCaseMapping:0x2C77 + }, + { code:0x2C80 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C80 + ,simpleLowerCaseMapping:0x2C81 + ,simpleTitleCaseMapping:0x2C80 + }, + { code:0x2C81 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C80 + ,simpleLowerCaseMapping:0x2C81 + ,simpleTitleCaseMapping:0x2C80 + }, + { code:0x2C82 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C82 + ,simpleLowerCaseMapping:0x2C83 + ,simpleTitleCaseMapping:0x2C82 + }, + { code:0x2C83 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C82 + ,simpleLowerCaseMapping:0x2C83 + ,simpleTitleCaseMapping:0x2C82 + }, + { code:0x2C84 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C84 + ,simpleLowerCaseMapping:0x2C85 + ,simpleTitleCaseMapping:0x2C84 + }, + { code:0x2C85 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C84 + ,simpleLowerCaseMapping:0x2C85 + ,simpleTitleCaseMapping:0x2C84 + }, + { code:0x2C86 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C86 + ,simpleLowerCaseMapping:0x2C87 + ,simpleTitleCaseMapping:0x2C86 + }, + { code:0x2C87 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C86 + ,simpleLowerCaseMapping:0x2C87 + ,simpleTitleCaseMapping:0x2C86 + }, + { code:0x2C88 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C88 + ,simpleLowerCaseMapping:0x2C89 + ,simpleTitleCaseMapping:0x2C88 + }, + { code:0x2C89 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C88 + ,simpleLowerCaseMapping:0x2C89 + ,simpleTitleCaseMapping:0x2C88 + }, + { code:0x2C8A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C8A + ,simpleLowerCaseMapping:0x2C8B + ,simpleTitleCaseMapping:0x2C8A + }, + { code:0x2C8B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C8A + ,simpleLowerCaseMapping:0x2C8B + ,simpleTitleCaseMapping:0x2C8A + }, + { code:0x2C8C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C8C + ,simpleLowerCaseMapping:0x2C8D + ,simpleTitleCaseMapping:0x2C8C + }, + { code:0x2C8D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C8C + ,simpleLowerCaseMapping:0x2C8D + ,simpleTitleCaseMapping:0x2C8C + }, + { code:0x2C8E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C8E + ,simpleLowerCaseMapping:0x2C8F + ,simpleTitleCaseMapping:0x2C8E + }, + { code:0x2C8F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C8E + ,simpleLowerCaseMapping:0x2C8F + ,simpleTitleCaseMapping:0x2C8E + }, + { code:0x2C90 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C90 + ,simpleLowerCaseMapping:0x2C91 + ,simpleTitleCaseMapping:0x2C90 + }, + { code:0x2C91 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C90 + ,simpleLowerCaseMapping:0x2C91 + ,simpleTitleCaseMapping:0x2C90 + }, + { code:0x2C92 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C92 + ,simpleLowerCaseMapping:0x2C93 + ,simpleTitleCaseMapping:0x2C92 + }, + { code:0x2C93 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C92 + ,simpleLowerCaseMapping:0x2C93 + ,simpleTitleCaseMapping:0x2C92 + }, + { code:0x2C94 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C94 + ,simpleLowerCaseMapping:0x2C95 + ,simpleTitleCaseMapping:0x2C94 + }, + { code:0x2C95 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C94 + ,simpleLowerCaseMapping:0x2C95 + ,simpleTitleCaseMapping:0x2C94 + }, + { code:0x2C96 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C96 + ,simpleLowerCaseMapping:0x2C97 + ,simpleTitleCaseMapping:0x2C96 + }, + { code:0x2C97 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C96 + ,simpleLowerCaseMapping:0x2C97 + ,simpleTitleCaseMapping:0x2C96 + }, + { code:0x2C98 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C98 + ,simpleLowerCaseMapping:0x2C99 + ,simpleTitleCaseMapping:0x2C98 + }, + { code:0x2C99 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C98 + ,simpleLowerCaseMapping:0x2C99 + ,simpleTitleCaseMapping:0x2C98 + }, + { code:0x2C9A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C9A + ,simpleLowerCaseMapping:0x2C9B + ,simpleTitleCaseMapping:0x2C9A + }, + { code:0x2C9B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C9A + ,simpleLowerCaseMapping:0x2C9B + ,simpleTitleCaseMapping:0x2C9A + }, + { code:0x2C9C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C9C + ,simpleLowerCaseMapping:0x2C9D + ,simpleTitleCaseMapping:0x2C9C + }, + { code:0x2C9D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C9C + ,simpleLowerCaseMapping:0x2C9D + ,simpleTitleCaseMapping:0x2C9C + }, + { code:0x2C9E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2C9E + ,simpleLowerCaseMapping:0x2C9F + ,simpleTitleCaseMapping:0x2C9E + }, + { code:0x2C9F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2C9E + ,simpleLowerCaseMapping:0x2C9F + ,simpleTitleCaseMapping:0x2C9E + }, + { code:0x2CA0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2CA0 + ,simpleLowerCaseMapping:0x2CA1 + ,simpleTitleCaseMapping:0x2CA0 + }, + { code:0x2CA1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CA0 + ,simpleLowerCaseMapping:0x2CA1 + ,simpleTitleCaseMapping:0x2CA0 + }, + { code:0x2CA2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2CA2 + ,simpleLowerCaseMapping:0x2CA3 + ,simpleTitleCaseMapping:0x2CA2 + }, + { code:0x2CA3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CA2 + ,simpleLowerCaseMapping:0x2CA3 + ,simpleTitleCaseMapping:0x2CA2 + }, + { code:0x2CA4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2CA4 + ,simpleLowerCaseMapping:0x2CA5 + ,simpleTitleCaseMapping:0x2CA4 + }, + { code:0x2CA5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CA4 + ,simpleLowerCaseMapping:0x2CA5 + ,simpleTitleCaseMapping:0x2CA4 + }, + { code:0x2CA6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2CA6 + ,simpleLowerCaseMapping:0x2CA7 + ,simpleTitleCaseMapping:0x2CA6 + }, + { code:0x2CA7 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CA6 + ,simpleLowerCaseMapping:0x2CA7 + ,simpleTitleCaseMapping:0x2CA6 + }, + { code:0x2CA8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2CA8 + ,simpleLowerCaseMapping:0x2CA9 + ,simpleTitleCaseMapping:0x2CA8 + }, + { code:0x2CA9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CA8 + ,simpleLowerCaseMapping:0x2CA9 + ,simpleTitleCaseMapping:0x2CA8 + }, + { code:0x2CAA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2CAA + ,simpleLowerCaseMapping:0x2CAB + ,simpleTitleCaseMapping:0x2CAA + }, + { code:0x2CAB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CAA + ,simpleLowerCaseMapping:0x2CAB + ,simpleTitleCaseMapping:0x2CAA + }, + { code:0x2CAC + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2CAC + ,simpleLowerCaseMapping:0x2CAD + ,simpleTitleCaseMapping:0x2CAC + }, + { code:0x2CAD + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CAC + ,simpleLowerCaseMapping:0x2CAD + ,simpleTitleCaseMapping:0x2CAC + }, + { code:0x2CAE + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2CAE + ,simpleLowerCaseMapping:0x2CAF + ,simpleTitleCaseMapping:0x2CAE + }, + { code:0x2CAF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CAE + ,simpleLowerCaseMapping:0x2CAF + ,simpleTitleCaseMapping:0x2CAE + }, + { code:0x2CB0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2CB0 + ,simpleLowerCaseMapping:0x2CB1 + ,simpleTitleCaseMapping:0x2CB0 + }, + { code:0x2CB1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CB0 + ,simpleLowerCaseMapping:0x2CB1 + ,simpleTitleCaseMapping:0x2CB0 + }, + { code:0x2CB2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2CB2 + ,simpleLowerCaseMapping:0x2CB3 + ,simpleTitleCaseMapping:0x2CB2 + }, + { code:0x2CB3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CB2 + ,simpleLowerCaseMapping:0x2CB3 + ,simpleTitleCaseMapping:0x2CB2 + }, + { code:0x2CB4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2CB4 + ,simpleLowerCaseMapping:0x2CB5 + ,simpleTitleCaseMapping:0x2CB4 + }, + { code:0x2CB5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CB4 + ,simpleLowerCaseMapping:0x2CB5 + ,simpleTitleCaseMapping:0x2CB4 + }, + { code:0x2CB6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2CB6 + ,simpleLowerCaseMapping:0x2CB7 + ,simpleTitleCaseMapping:0x2CB6 + }, + { code:0x2CB7 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CB6 + ,simpleLowerCaseMapping:0x2CB7 + ,simpleTitleCaseMapping:0x2CB6 + }, + { code:0x2CB8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2CB8 + ,simpleLowerCaseMapping:0x2CB9 + ,simpleTitleCaseMapping:0x2CB8 + }, + { code:0x2CB9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CB8 + ,simpleLowerCaseMapping:0x2CB9 + ,simpleTitleCaseMapping:0x2CB8 + }, + { code:0x2CBA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2CBA + ,simpleLowerCaseMapping:0x2CBB + ,simpleTitleCaseMapping:0x2CBA + }, + { code:0x2CBB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CBA + ,simpleLowerCaseMapping:0x2CBB + ,simpleTitleCaseMapping:0x2CBA + }, + { code:0x2CBC + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2CBC + ,simpleLowerCaseMapping:0x2CBD + ,simpleTitleCaseMapping:0x2CBC + }, + { code:0x2CBD + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CBC + ,simpleLowerCaseMapping:0x2CBD + ,simpleTitleCaseMapping:0x2CBC + }, + { code:0x2CBE + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2CBE + ,simpleLowerCaseMapping:0x2CBF + ,simpleTitleCaseMapping:0x2CBE + }, + { code:0x2CBF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CBE + ,simpleLowerCaseMapping:0x2CBF + ,simpleTitleCaseMapping:0x2CBE + }, + { code:0x2CC0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2CC0 + ,simpleLowerCaseMapping:0x2CC1 + ,simpleTitleCaseMapping:0x2CC0 + }, + { code:0x2CC1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CC0 + ,simpleLowerCaseMapping:0x2CC1 + ,simpleTitleCaseMapping:0x2CC0 + }, + { code:0x2CC2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2CC2 + ,simpleLowerCaseMapping:0x2CC3 + ,simpleTitleCaseMapping:0x2CC2 + }, + { code:0x2CC3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CC2 + ,simpleLowerCaseMapping:0x2CC3 + ,simpleTitleCaseMapping:0x2CC2 + }, + { code:0x2CC4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2CC4 + ,simpleLowerCaseMapping:0x2CC5 + ,simpleTitleCaseMapping:0x2CC4 + }, + { code:0x2CC5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CC4 + ,simpleLowerCaseMapping:0x2CC5 + ,simpleTitleCaseMapping:0x2CC4 + }, + { code:0x2CC6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2CC6 + ,simpleLowerCaseMapping:0x2CC7 + ,simpleTitleCaseMapping:0x2CC6 + }, + { code:0x2CC7 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CC6 + ,simpleLowerCaseMapping:0x2CC7 + ,simpleTitleCaseMapping:0x2CC6 + }, + { code:0x2CC8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2CC8 + ,simpleLowerCaseMapping:0x2CC9 + ,simpleTitleCaseMapping:0x2CC8 + }, + { code:0x2CC9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CC8 + ,simpleLowerCaseMapping:0x2CC9 + ,simpleTitleCaseMapping:0x2CC8 + }, + { code:0x2CCA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2CCA + ,simpleLowerCaseMapping:0x2CCB + ,simpleTitleCaseMapping:0x2CCA + }, + { code:0x2CCB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CCA + ,simpleLowerCaseMapping:0x2CCB + ,simpleTitleCaseMapping:0x2CCA + }, + { code:0x2CCC + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2CCC + ,simpleLowerCaseMapping:0x2CCD + ,simpleTitleCaseMapping:0x2CCC + }, + { code:0x2CCD + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CCC + ,simpleLowerCaseMapping:0x2CCD + ,simpleTitleCaseMapping:0x2CCC + }, + { code:0x2CCE + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2CCE + ,simpleLowerCaseMapping:0x2CCF + ,simpleTitleCaseMapping:0x2CCE + }, + { code:0x2CCF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CCE + ,simpleLowerCaseMapping:0x2CCF + ,simpleTitleCaseMapping:0x2CCE + }, + { code:0x2CD0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2CD0 + ,simpleLowerCaseMapping:0x2CD1 + ,simpleTitleCaseMapping:0x2CD0 + }, + { code:0x2CD1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CD0 + ,simpleLowerCaseMapping:0x2CD1 + ,simpleTitleCaseMapping:0x2CD0 + }, + { code:0x2CD2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2CD2 + ,simpleLowerCaseMapping:0x2CD3 + ,simpleTitleCaseMapping:0x2CD2 + }, + { code:0x2CD3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CD2 + ,simpleLowerCaseMapping:0x2CD3 + ,simpleTitleCaseMapping:0x2CD2 + }, + { code:0x2CD4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2CD4 + ,simpleLowerCaseMapping:0x2CD5 + ,simpleTitleCaseMapping:0x2CD4 + }, + { code:0x2CD5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CD4 + ,simpleLowerCaseMapping:0x2CD5 + ,simpleTitleCaseMapping:0x2CD4 + }, + { code:0x2CD6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2CD6 + ,simpleLowerCaseMapping:0x2CD7 + ,simpleTitleCaseMapping:0x2CD6 + }, + { code:0x2CD7 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CD6 + ,simpleLowerCaseMapping:0x2CD7 + ,simpleTitleCaseMapping:0x2CD6 + }, + { code:0x2CD8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2CD8 + ,simpleLowerCaseMapping:0x2CD9 + ,simpleTitleCaseMapping:0x2CD8 + }, + { code:0x2CD9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CD8 + ,simpleLowerCaseMapping:0x2CD9 + ,simpleTitleCaseMapping:0x2CD8 + }, + { code:0x2CDA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2CDA + ,simpleLowerCaseMapping:0x2CDB + ,simpleTitleCaseMapping:0x2CDA + }, + { code:0x2CDB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CDA + ,simpleLowerCaseMapping:0x2CDB + ,simpleTitleCaseMapping:0x2CDA + }, + { code:0x2CDC + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2CDC + ,simpleLowerCaseMapping:0x2CDD + ,simpleTitleCaseMapping:0x2CDC + }, + { code:0x2CDD + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CDC + ,simpleLowerCaseMapping:0x2CDD + ,simpleTitleCaseMapping:0x2CDC + }, + { code:0x2CDE + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2CDE + ,simpleLowerCaseMapping:0x2CDF + ,simpleTitleCaseMapping:0x2CDE + }, + { code:0x2CDF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CDE + ,simpleLowerCaseMapping:0x2CDF + ,simpleTitleCaseMapping:0x2CDE + }, + { code:0x2CE0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2CE0 + ,simpleLowerCaseMapping:0x2CE1 + ,simpleTitleCaseMapping:0x2CE0 + }, + { code:0x2CE1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CE0 + ,simpleLowerCaseMapping:0x2CE1 + ,simpleTitleCaseMapping:0x2CE0 + }, + { code:0x2CE2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x2CE2 + ,simpleLowerCaseMapping:0x2CE3 + ,simpleTitleCaseMapping:0x2CE2 + }, + { code:0x2CE3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CE2 + ,simpleLowerCaseMapping:0x2CE3 + ,simpleTitleCaseMapping:0x2CE2 + }, + { code:0x2CE4 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x2CE4 + ,simpleLowerCaseMapping:0x2CE4 + ,simpleTitleCaseMapping:0x2CE4 + }, + { code:0x2CE5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2CE5 + ,simpleLowerCaseMapping:0x2CE5 + ,simpleTitleCaseMapping:0x2CE5 + }, + { code:0x2CE6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2CE6 + ,simpleLowerCaseMapping:0x2CE6 + ,simpleTitleCaseMapping:0x2CE6 + }, + { code:0x2CE7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2CE7 + ,simpleLowerCaseMapping:0x2CE7 + ,simpleTitleCaseMapping:0x2CE7 + }, + { code:0x2CE8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2CE8 + ,simpleLowerCaseMapping:0x2CE8 + ,simpleTitleCaseMapping:0x2CE8 + }, + { code:0x2CE9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2CE9 + ,simpleLowerCaseMapping:0x2CE9 + ,simpleTitleCaseMapping:0x2CE9 + }, + { code:0x2CEA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2CEA + ,simpleLowerCaseMapping:0x2CEA + ,simpleTitleCaseMapping:0x2CEA + }, + { code:0x2CF9 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2CF9 + ,simpleLowerCaseMapping:0x2CF9 + ,simpleTitleCaseMapping:0x2CF9 + }, + { code:0x2CFA + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2CFA + ,simpleLowerCaseMapping:0x2CFA + ,simpleTitleCaseMapping:0x2CFA + }, + { code:0x2CFB + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2CFB + ,simpleLowerCaseMapping:0x2CFB + ,simpleTitleCaseMapping:0x2CFB + }, + { code:0x2CFC + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2CFC + ,simpleLowerCaseMapping:0x2CFC + ,simpleTitleCaseMapping:0x2CFC + }, + { code:0x2CFD + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x2CFD + ,simpleLowerCaseMapping:0x2CFD + ,simpleTitleCaseMapping:0x2CFD + }, + { code:0x2CFE + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2CFE + ,simpleLowerCaseMapping:0x2CFE + ,simpleTitleCaseMapping:0x2CFE + }, + { code:0x2CFF + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2CFF + ,simpleLowerCaseMapping:0x2CFF + ,simpleTitleCaseMapping:0x2CFF + }, + { code:0x2D00 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10A0 + ,simpleLowerCaseMapping:0x2D00 + ,simpleTitleCaseMapping:0x10A0 + }, + { code:0x2D01 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10A1 + ,simpleLowerCaseMapping:0x2D01 + ,simpleTitleCaseMapping:0x10A1 + }, + { code:0x2D02 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10A2 + ,simpleLowerCaseMapping:0x2D02 + ,simpleTitleCaseMapping:0x10A2 + }, + { code:0x2D03 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10A3 + ,simpleLowerCaseMapping:0x2D03 + ,simpleTitleCaseMapping:0x10A3 + }, + { code:0x2D04 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10A4 + ,simpleLowerCaseMapping:0x2D04 + ,simpleTitleCaseMapping:0x10A4 + }, + { code:0x2D05 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10A5 + ,simpleLowerCaseMapping:0x2D05 + ,simpleTitleCaseMapping:0x10A5 + }, + { code:0x2D06 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10A6 + ,simpleLowerCaseMapping:0x2D06 + ,simpleTitleCaseMapping:0x10A6 + }, + { code:0x2D07 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10A7 + ,simpleLowerCaseMapping:0x2D07 + ,simpleTitleCaseMapping:0x10A7 + }, + { code:0x2D08 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10A8 + ,simpleLowerCaseMapping:0x2D08 + ,simpleTitleCaseMapping:0x10A8 + }, + { code:0x2D09 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10A9 + ,simpleLowerCaseMapping:0x2D09 + ,simpleTitleCaseMapping:0x10A9 + }, + { code:0x2D0A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10AA + ,simpleLowerCaseMapping:0x2D0A + ,simpleTitleCaseMapping:0x10AA + }, + { code:0x2D0B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10AB + ,simpleLowerCaseMapping:0x2D0B + ,simpleTitleCaseMapping:0x10AB + }, + { code:0x2D0C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10AC + ,simpleLowerCaseMapping:0x2D0C + ,simpleTitleCaseMapping:0x10AC + }, + { code:0x2D0D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10AD + ,simpleLowerCaseMapping:0x2D0D + ,simpleTitleCaseMapping:0x10AD + }, + { code:0x2D0E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10AE + ,simpleLowerCaseMapping:0x2D0E + ,simpleTitleCaseMapping:0x10AE + }, + { code:0x2D0F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10AF + ,simpleLowerCaseMapping:0x2D0F + ,simpleTitleCaseMapping:0x10AF + }, + { code:0x2D10 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10B0 + ,simpleLowerCaseMapping:0x2D10 + ,simpleTitleCaseMapping:0x10B0 + }, + { code:0x2D11 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10B1 + ,simpleLowerCaseMapping:0x2D11 + ,simpleTitleCaseMapping:0x10B1 + }, + { code:0x2D12 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10B2 + ,simpleLowerCaseMapping:0x2D12 + ,simpleTitleCaseMapping:0x10B2 + }, + { code:0x2D13 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10B3 + ,simpleLowerCaseMapping:0x2D13 + ,simpleTitleCaseMapping:0x10B3 + }, + { code:0x2D14 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10B4 + ,simpleLowerCaseMapping:0x2D14 + ,simpleTitleCaseMapping:0x10B4 + }, + { code:0x2D15 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10B5 + ,simpleLowerCaseMapping:0x2D15 + ,simpleTitleCaseMapping:0x10B5 + }, + { code:0x2D16 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10B6 + ,simpleLowerCaseMapping:0x2D16 + ,simpleTitleCaseMapping:0x10B6 + }, + { code:0x2D17 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10B7 + ,simpleLowerCaseMapping:0x2D17 + ,simpleTitleCaseMapping:0x10B7 + }, + { code:0x2D18 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10B8 + ,simpleLowerCaseMapping:0x2D18 + ,simpleTitleCaseMapping:0x10B8 + }, + { code:0x2D19 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10B9 + ,simpleLowerCaseMapping:0x2D19 + ,simpleTitleCaseMapping:0x10B9 + }, + { code:0x2D1A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10BA + ,simpleLowerCaseMapping:0x2D1A + ,simpleTitleCaseMapping:0x10BA + }, + { code:0x2D1B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10BB + ,simpleLowerCaseMapping:0x2D1B + ,simpleTitleCaseMapping:0x10BB + }, + { code:0x2D1C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10BC + ,simpleLowerCaseMapping:0x2D1C + ,simpleTitleCaseMapping:0x10BC + }, + { code:0x2D1D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10BD + ,simpleLowerCaseMapping:0x2D1D + ,simpleTitleCaseMapping:0x10BD + }, + { code:0x2D1E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10BE + ,simpleLowerCaseMapping:0x2D1E + ,simpleTitleCaseMapping:0x10BE + }, + { code:0x2D1F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10BF + ,simpleLowerCaseMapping:0x2D1F + ,simpleTitleCaseMapping:0x10BF + }, + { code:0x2D20 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10C0 + ,simpleLowerCaseMapping:0x2D20 + ,simpleTitleCaseMapping:0x10C0 + }, + { code:0x2D21 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10C1 + ,simpleLowerCaseMapping:0x2D21 + ,simpleTitleCaseMapping:0x10C1 + }, + { code:0x2D22 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10C2 + ,simpleLowerCaseMapping:0x2D22 + ,simpleTitleCaseMapping:0x10C2 + }, + { code:0x2D23 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10C3 + ,simpleLowerCaseMapping:0x2D23 + ,simpleTitleCaseMapping:0x10C3 + }, + { code:0x2D24 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10C4 + ,simpleLowerCaseMapping:0x2D24 + ,simpleTitleCaseMapping:0x10C4 + }, + { code:0x2D25 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10C5 + ,simpleLowerCaseMapping:0x2D25 + ,simpleTitleCaseMapping:0x10C5 + }, + { code:0x2D30 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D30 + ,simpleLowerCaseMapping:0x2D30 + ,simpleTitleCaseMapping:0x2D30 + }, + { code:0x2D31 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D31 + ,simpleLowerCaseMapping:0x2D31 + ,simpleTitleCaseMapping:0x2D31 + }, + { code:0x2D32 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D32 + ,simpleLowerCaseMapping:0x2D32 + ,simpleTitleCaseMapping:0x2D32 + }, + { code:0x2D33 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D33 + ,simpleLowerCaseMapping:0x2D33 + ,simpleTitleCaseMapping:0x2D33 + }, + { code:0x2D34 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D34 + ,simpleLowerCaseMapping:0x2D34 + ,simpleTitleCaseMapping:0x2D34 + }, + { code:0x2D35 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D35 + ,simpleLowerCaseMapping:0x2D35 + ,simpleTitleCaseMapping:0x2D35 + }, + { code:0x2D36 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D36 + ,simpleLowerCaseMapping:0x2D36 + ,simpleTitleCaseMapping:0x2D36 + }, + { code:0x2D37 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D37 + ,simpleLowerCaseMapping:0x2D37 + ,simpleTitleCaseMapping:0x2D37 + }, + { code:0x2D38 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D38 + ,simpleLowerCaseMapping:0x2D38 + ,simpleTitleCaseMapping:0x2D38 + }, + { code:0x2D39 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D39 + ,simpleLowerCaseMapping:0x2D39 + ,simpleTitleCaseMapping:0x2D39 + }, + { code:0x2D3A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D3A + ,simpleLowerCaseMapping:0x2D3A + ,simpleTitleCaseMapping:0x2D3A + }, + { code:0x2D3B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D3B + ,simpleLowerCaseMapping:0x2D3B + ,simpleTitleCaseMapping:0x2D3B + }, + { code:0x2D3C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D3C + ,simpleLowerCaseMapping:0x2D3C + ,simpleTitleCaseMapping:0x2D3C + }, + { code:0x2D3D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D3D + ,simpleLowerCaseMapping:0x2D3D + ,simpleTitleCaseMapping:0x2D3D + }, + { code:0x2D3E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D3E + ,simpleLowerCaseMapping:0x2D3E + ,simpleTitleCaseMapping:0x2D3E + }, + { code:0x2D3F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D3F + ,simpleLowerCaseMapping:0x2D3F + ,simpleTitleCaseMapping:0x2D3F + }, + { code:0x2D40 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D40 + ,simpleLowerCaseMapping:0x2D40 + ,simpleTitleCaseMapping:0x2D40 + }, + { code:0x2D41 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D41 + ,simpleLowerCaseMapping:0x2D41 + ,simpleTitleCaseMapping:0x2D41 + }, + { code:0x2D42 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D42 + ,simpleLowerCaseMapping:0x2D42 + ,simpleTitleCaseMapping:0x2D42 + }, + { code:0x2D43 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D43 + ,simpleLowerCaseMapping:0x2D43 + ,simpleTitleCaseMapping:0x2D43 + }, + { code:0x2D44 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D44 + ,simpleLowerCaseMapping:0x2D44 + ,simpleTitleCaseMapping:0x2D44 + }, + { code:0x2D45 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D45 + ,simpleLowerCaseMapping:0x2D45 + ,simpleTitleCaseMapping:0x2D45 + }, + { code:0x2D46 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D46 + ,simpleLowerCaseMapping:0x2D46 + ,simpleTitleCaseMapping:0x2D46 + }, + { code:0x2D47 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D47 + ,simpleLowerCaseMapping:0x2D47 + ,simpleTitleCaseMapping:0x2D47 + }, + { code:0x2D48 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D48 + ,simpleLowerCaseMapping:0x2D48 + ,simpleTitleCaseMapping:0x2D48 + }, + { code:0x2D49 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D49 + ,simpleLowerCaseMapping:0x2D49 + ,simpleTitleCaseMapping:0x2D49 + }, + { code:0x2D4A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D4A + ,simpleLowerCaseMapping:0x2D4A + ,simpleTitleCaseMapping:0x2D4A + }, + { code:0x2D4B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D4B + ,simpleLowerCaseMapping:0x2D4B + ,simpleTitleCaseMapping:0x2D4B + }, + { code:0x2D4C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D4C + ,simpleLowerCaseMapping:0x2D4C + ,simpleTitleCaseMapping:0x2D4C + }, + { code:0x2D4D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D4D + ,simpleLowerCaseMapping:0x2D4D + ,simpleTitleCaseMapping:0x2D4D + }, + { code:0x2D4E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D4E + ,simpleLowerCaseMapping:0x2D4E + ,simpleTitleCaseMapping:0x2D4E + }, + { code:0x2D4F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D4F + ,simpleLowerCaseMapping:0x2D4F + ,simpleTitleCaseMapping:0x2D4F + }, + { code:0x2D50 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D50 + ,simpleLowerCaseMapping:0x2D50 + ,simpleTitleCaseMapping:0x2D50 + }, + { code:0x2D51 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D51 + ,simpleLowerCaseMapping:0x2D51 + ,simpleTitleCaseMapping:0x2D51 + }, + { code:0x2D52 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D52 + ,simpleLowerCaseMapping:0x2D52 + ,simpleTitleCaseMapping:0x2D52 + }, + { code:0x2D53 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D53 + ,simpleLowerCaseMapping:0x2D53 + ,simpleTitleCaseMapping:0x2D53 + }, + { code:0x2D54 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D54 + ,simpleLowerCaseMapping:0x2D54 + ,simpleTitleCaseMapping:0x2D54 + }, + { code:0x2D55 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D55 + ,simpleLowerCaseMapping:0x2D55 + ,simpleTitleCaseMapping:0x2D55 + }, + { code:0x2D56 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D56 + ,simpleLowerCaseMapping:0x2D56 + ,simpleTitleCaseMapping:0x2D56 + }, + { code:0x2D57 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D57 + ,simpleLowerCaseMapping:0x2D57 + ,simpleTitleCaseMapping:0x2D57 + }, + { code:0x2D58 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D58 + ,simpleLowerCaseMapping:0x2D58 + ,simpleTitleCaseMapping:0x2D58 + }, + { code:0x2D59 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D59 + ,simpleLowerCaseMapping:0x2D59 + ,simpleTitleCaseMapping:0x2D59 + }, + { code:0x2D5A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D5A + ,simpleLowerCaseMapping:0x2D5A + ,simpleTitleCaseMapping:0x2D5A + }, + { code:0x2D5B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D5B + ,simpleLowerCaseMapping:0x2D5B + ,simpleTitleCaseMapping:0x2D5B + }, + { code:0x2D5C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D5C + ,simpleLowerCaseMapping:0x2D5C + ,simpleTitleCaseMapping:0x2D5C + }, + { code:0x2D5D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D5D + ,simpleLowerCaseMapping:0x2D5D + ,simpleTitleCaseMapping:0x2D5D + }, + { code:0x2D5E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D5E + ,simpleLowerCaseMapping:0x2D5E + ,simpleTitleCaseMapping:0x2D5E + }, + { code:0x2D5F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D5F + ,simpleLowerCaseMapping:0x2D5F + ,simpleTitleCaseMapping:0x2D5F + }, + { code:0x2D60 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D60 + ,simpleLowerCaseMapping:0x2D60 + ,simpleTitleCaseMapping:0x2D60 + }, + { code:0x2D61 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D61 + ,simpleLowerCaseMapping:0x2D61 + ,simpleTitleCaseMapping:0x2D61 + }, + { code:0x2D62 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D62 + ,simpleLowerCaseMapping:0x2D62 + ,simpleTitleCaseMapping:0x2D62 + }, + { code:0x2D63 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D63 + ,simpleLowerCaseMapping:0x2D63 + ,simpleTitleCaseMapping:0x2D63 + }, + { code:0x2D64 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D64 + ,simpleLowerCaseMapping:0x2D64 + ,simpleTitleCaseMapping:0x2D64 + }, + { code:0x2D65 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D65 + ,simpleLowerCaseMapping:0x2D65 + ,simpleTitleCaseMapping:0x2D65 + }, + { code:0x2D6F + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x2D6F + ,simpleLowerCaseMapping:0x2D6F + ,simpleTitleCaseMapping:0x2D6F + }, + { code:0x2D80 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D80 + ,simpleLowerCaseMapping:0x2D80 + ,simpleTitleCaseMapping:0x2D80 + }, + { code:0x2D81 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D81 + ,simpleLowerCaseMapping:0x2D81 + ,simpleTitleCaseMapping:0x2D81 + }, + { code:0x2D82 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D82 + ,simpleLowerCaseMapping:0x2D82 + ,simpleTitleCaseMapping:0x2D82 + }, + { code:0x2D83 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D83 + ,simpleLowerCaseMapping:0x2D83 + ,simpleTitleCaseMapping:0x2D83 + }, + { code:0x2D84 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D84 + ,simpleLowerCaseMapping:0x2D84 + ,simpleTitleCaseMapping:0x2D84 + }, + { code:0x2D85 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D85 + ,simpleLowerCaseMapping:0x2D85 + ,simpleTitleCaseMapping:0x2D85 + }, + { code:0x2D86 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D86 + ,simpleLowerCaseMapping:0x2D86 + ,simpleTitleCaseMapping:0x2D86 + }, + { code:0x2D87 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D87 + ,simpleLowerCaseMapping:0x2D87 + ,simpleTitleCaseMapping:0x2D87 + }, + { code:0x2D88 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D88 + ,simpleLowerCaseMapping:0x2D88 + ,simpleTitleCaseMapping:0x2D88 + }, + { code:0x2D89 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D89 + ,simpleLowerCaseMapping:0x2D89 + ,simpleTitleCaseMapping:0x2D89 + }, + { code:0x2D8A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D8A + ,simpleLowerCaseMapping:0x2D8A + ,simpleTitleCaseMapping:0x2D8A + }, + { code:0x2D8B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D8B + ,simpleLowerCaseMapping:0x2D8B + ,simpleTitleCaseMapping:0x2D8B + }, + { code:0x2D8C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D8C + ,simpleLowerCaseMapping:0x2D8C + ,simpleTitleCaseMapping:0x2D8C + }, + { code:0x2D8D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D8D + ,simpleLowerCaseMapping:0x2D8D + ,simpleTitleCaseMapping:0x2D8D + }, + { code:0x2D8E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D8E + ,simpleLowerCaseMapping:0x2D8E + ,simpleTitleCaseMapping:0x2D8E + }, + { code:0x2D8F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D8F + ,simpleLowerCaseMapping:0x2D8F + ,simpleTitleCaseMapping:0x2D8F + }, + { code:0x2D90 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D90 + ,simpleLowerCaseMapping:0x2D90 + ,simpleTitleCaseMapping:0x2D90 + }, + { code:0x2D91 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D91 + ,simpleLowerCaseMapping:0x2D91 + ,simpleTitleCaseMapping:0x2D91 + }, + { code:0x2D92 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D92 + ,simpleLowerCaseMapping:0x2D92 + ,simpleTitleCaseMapping:0x2D92 + }, + { code:0x2D93 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D93 + ,simpleLowerCaseMapping:0x2D93 + ,simpleTitleCaseMapping:0x2D93 + }, + { code:0x2D94 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D94 + ,simpleLowerCaseMapping:0x2D94 + ,simpleTitleCaseMapping:0x2D94 + }, + { code:0x2D95 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D95 + ,simpleLowerCaseMapping:0x2D95 + ,simpleTitleCaseMapping:0x2D95 + }, + { code:0x2D96 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2D96 + ,simpleLowerCaseMapping:0x2D96 + ,simpleTitleCaseMapping:0x2D96 + }, + { code:0x2DA0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DA0 + ,simpleLowerCaseMapping:0x2DA0 + ,simpleTitleCaseMapping:0x2DA0 + }, + { code:0x2DA1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DA1 + ,simpleLowerCaseMapping:0x2DA1 + ,simpleTitleCaseMapping:0x2DA1 + }, + { code:0x2DA2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DA2 + ,simpleLowerCaseMapping:0x2DA2 + ,simpleTitleCaseMapping:0x2DA2 + }, + { code:0x2DA3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DA3 + ,simpleLowerCaseMapping:0x2DA3 + ,simpleTitleCaseMapping:0x2DA3 + }, + { code:0x2DA4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DA4 + ,simpleLowerCaseMapping:0x2DA4 + ,simpleTitleCaseMapping:0x2DA4 + }, + { code:0x2DA5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DA5 + ,simpleLowerCaseMapping:0x2DA5 + ,simpleTitleCaseMapping:0x2DA5 + }, + { code:0x2DA6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DA6 + ,simpleLowerCaseMapping:0x2DA6 + ,simpleTitleCaseMapping:0x2DA6 + }, + { code:0x2DA8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DA8 + ,simpleLowerCaseMapping:0x2DA8 + ,simpleTitleCaseMapping:0x2DA8 + }, + { code:0x2DA9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DA9 + ,simpleLowerCaseMapping:0x2DA9 + ,simpleTitleCaseMapping:0x2DA9 + }, + { code:0x2DAA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DAA + ,simpleLowerCaseMapping:0x2DAA + ,simpleTitleCaseMapping:0x2DAA + }, + { code:0x2DAB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DAB + ,simpleLowerCaseMapping:0x2DAB + ,simpleTitleCaseMapping:0x2DAB + }, + { code:0x2DAC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DAC + ,simpleLowerCaseMapping:0x2DAC + ,simpleTitleCaseMapping:0x2DAC + }, + { code:0x2DAD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DAD + ,simpleLowerCaseMapping:0x2DAD + ,simpleTitleCaseMapping:0x2DAD + }, + { code:0x2DAE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DAE + ,simpleLowerCaseMapping:0x2DAE + ,simpleTitleCaseMapping:0x2DAE + }, + { code:0x2DB0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DB0 + ,simpleLowerCaseMapping:0x2DB0 + ,simpleTitleCaseMapping:0x2DB0 + }, + { code:0x2DB1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DB1 + ,simpleLowerCaseMapping:0x2DB1 + ,simpleTitleCaseMapping:0x2DB1 + }, + { code:0x2DB2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DB2 + ,simpleLowerCaseMapping:0x2DB2 + ,simpleTitleCaseMapping:0x2DB2 + }, + { code:0x2DB3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DB3 + ,simpleLowerCaseMapping:0x2DB3 + ,simpleTitleCaseMapping:0x2DB3 + }, + { code:0x2DB4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DB4 + ,simpleLowerCaseMapping:0x2DB4 + ,simpleTitleCaseMapping:0x2DB4 + }, + { code:0x2DB5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DB5 + ,simpleLowerCaseMapping:0x2DB5 + ,simpleTitleCaseMapping:0x2DB5 + }, + { code:0x2DB6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DB6 + ,simpleLowerCaseMapping:0x2DB6 + ,simpleTitleCaseMapping:0x2DB6 + }, + { code:0x2DB8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DB8 + ,simpleLowerCaseMapping:0x2DB8 + ,simpleTitleCaseMapping:0x2DB8 + }, + { code:0x2DB9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DB9 + ,simpleLowerCaseMapping:0x2DB9 + ,simpleTitleCaseMapping:0x2DB9 + }, + { code:0x2DBA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DBA + ,simpleLowerCaseMapping:0x2DBA + ,simpleTitleCaseMapping:0x2DBA + }, + { code:0x2DBB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DBB + ,simpleLowerCaseMapping:0x2DBB + ,simpleTitleCaseMapping:0x2DBB + }, + { code:0x2DBC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DBC + ,simpleLowerCaseMapping:0x2DBC + ,simpleTitleCaseMapping:0x2DBC + }, + { code:0x2DBD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DBD + ,simpleLowerCaseMapping:0x2DBD + ,simpleTitleCaseMapping:0x2DBD + }, + { code:0x2DBE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DBE + ,simpleLowerCaseMapping:0x2DBE + ,simpleTitleCaseMapping:0x2DBE + }, + { code:0x2DC0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DC0 + ,simpleLowerCaseMapping:0x2DC0 + ,simpleTitleCaseMapping:0x2DC0 + }, + { code:0x2DC1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DC1 + ,simpleLowerCaseMapping:0x2DC1 + ,simpleTitleCaseMapping:0x2DC1 + }, + { code:0x2DC2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DC2 + ,simpleLowerCaseMapping:0x2DC2 + ,simpleTitleCaseMapping:0x2DC2 + }, + { code:0x2DC3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DC3 + ,simpleLowerCaseMapping:0x2DC3 + ,simpleTitleCaseMapping:0x2DC3 + }, + { code:0x2DC4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DC4 + ,simpleLowerCaseMapping:0x2DC4 + ,simpleTitleCaseMapping:0x2DC4 + }, + { code:0x2DC5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DC5 + ,simpleLowerCaseMapping:0x2DC5 + ,simpleTitleCaseMapping:0x2DC5 + }, + { code:0x2DC6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DC6 + ,simpleLowerCaseMapping:0x2DC6 + ,simpleTitleCaseMapping:0x2DC6 + }, + { code:0x2DC8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DC8 + ,simpleLowerCaseMapping:0x2DC8 + ,simpleTitleCaseMapping:0x2DC8 + }, + { code:0x2DC9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DC9 + ,simpleLowerCaseMapping:0x2DC9 + ,simpleTitleCaseMapping:0x2DC9 + }, + { code:0x2DCA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DCA + ,simpleLowerCaseMapping:0x2DCA + ,simpleTitleCaseMapping:0x2DCA + }, + { code:0x2DCB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DCB + ,simpleLowerCaseMapping:0x2DCB + ,simpleTitleCaseMapping:0x2DCB + }, + { code:0x2DCC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DCC + ,simpleLowerCaseMapping:0x2DCC + ,simpleTitleCaseMapping:0x2DCC + }, + { code:0x2DCD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DCD + ,simpleLowerCaseMapping:0x2DCD + ,simpleTitleCaseMapping:0x2DCD + }, + { code:0x2DCE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DCE + ,simpleLowerCaseMapping:0x2DCE + ,simpleTitleCaseMapping:0x2DCE + }, + { code:0x2DD0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DD0 + ,simpleLowerCaseMapping:0x2DD0 + ,simpleTitleCaseMapping:0x2DD0 + }, + { code:0x2DD1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DD1 + ,simpleLowerCaseMapping:0x2DD1 + ,simpleTitleCaseMapping:0x2DD1 + }, + { code:0x2DD2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DD2 + ,simpleLowerCaseMapping:0x2DD2 + ,simpleTitleCaseMapping:0x2DD2 + }, + { code:0x2DD3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DD3 + ,simpleLowerCaseMapping:0x2DD3 + ,simpleTitleCaseMapping:0x2DD3 + }, + { code:0x2DD4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DD4 + ,simpleLowerCaseMapping:0x2DD4 + ,simpleTitleCaseMapping:0x2DD4 + }, + { code:0x2DD5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DD5 + ,simpleLowerCaseMapping:0x2DD5 + ,simpleTitleCaseMapping:0x2DD5 + }, + { code:0x2DD6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DD6 + ,simpleLowerCaseMapping:0x2DD6 + ,simpleTitleCaseMapping:0x2DD6 + }, + { code:0x2DD8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DD8 + ,simpleLowerCaseMapping:0x2DD8 + ,simpleTitleCaseMapping:0x2DD8 + }, + { code:0x2DD9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DD9 + ,simpleLowerCaseMapping:0x2DD9 + ,simpleTitleCaseMapping:0x2DD9 + }, + { code:0x2DDA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DDA + ,simpleLowerCaseMapping:0x2DDA + ,simpleTitleCaseMapping:0x2DDA + }, + { code:0x2DDB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DDB + ,simpleLowerCaseMapping:0x2DDB + ,simpleTitleCaseMapping:0x2DDB + }, + { code:0x2DDC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DDC + ,simpleLowerCaseMapping:0x2DDC + ,simpleTitleCaseMapping:0x2DDC + }, + { code:0x2DDD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DDD + ,simpleLowerCaseMapping:0x2DDD + ,simpleTitleCaseMapping:0x2DDD + }, + { code:0x2DDE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2DDE + ,simpleLowerCaseMapping:0x2DDE + ,simpleTitleCaseMapping:0x2DDE + }, + { code:0x2E00 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2E00 + ,simpleLowerCaseMapping:0x2E00 + ,simpleTitleCaseMapping:0x2E00 + }, + { code:0x2E01 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2E01 + ,simpleLowerCaseMapping:0x2E01 + ,simpleTitleCaseMapping:0x2E01 + }, + { code:0x2E02 + ,generalCategory:UnicodeData.GeneralCategory.Pi + ,simpleUpperCaseMapping:0x2E02 + ,simpleLowerCaseMapping:0x2E02 + ,simpleTitleCaseMapping:0x2E02 + }, + { code:0x2E03 + ,generalCategory:UnicodeData.GeneralCategory.Pf + ,simpleUpperCaseMapping:0x2E03 + ,simpleLowerCaseMapping:0x2E03 + ,simpleTitleCaseMapping:0x2E03 + }, + { code:0x2E04 + ,generalCategory:UnicodeData.GeneralCategory.Pi + ,simpleUpperCaseMapping:0x2E04 + ,simpleLowerCaseMapping:0x2E04 + ,simpleTitleCaseMapping:0x2E04 + }, + { code:0x2E05 + ,generalCategory:UnicodeData.GeneralCategory.Pf + ,simpleUpperCaseMapping:0x2E05 + ,simpleLowerCaseMapping:0x2E05 + ,simpleTitleCaseMapping:0x2E05 + }, + { code:0x2E06 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2E06 + ,simpleLowerCaseMapping:0x2E06 + ,simpleTitleCaseMapping:0x2E06 + }, + { code:0x2E07 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2E07 + ,simpleLowerCaseMapping:0x2E07 + ,simpleTitleCaseMapping:0x2E07 + }, + { code:0x2E08 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2E08 + ,simpleLowerCaseMapping:0x2E08 + ,simpleTitleCaseMapping:0x2E08 + }, + { code:0x2E09 + ,generalCategory:UnicodeData.GeneralCategory.Pi + ,simpleUpperCaseMapping:0x2E09 + ,simpleLowerCaseMapping:0x2E09 + ,simpleTitleCaseMapping:0x2E09 + }, + { code:0x2E0A + ,generalCategory:UnicodeData.GeneralCategory.Pf + ,simpleUpperCaseMapping:0x2E0A + ,simpleLowerCaseMapping:0x2E0A + ,simpleTitleCaseMapping:0x2E0A + }, + { code:0x2E0B + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2E0B + ,simpleLowerCaseMapping:0x2E0B + ,simpleTitleCaseMapping:0x2E0B + }, + { code:0x2E0C + ,generalCategory:UnicodeData.GeneralCategory.Pi + ,simpleUpperCaseMapping:0x2E0C + ,simpleLowerCaseMapping:0x2E0C + ,simpleTitleCaseMapping:0x2E0C + }, + { code:0x2E0D + ,generalCategory:UnicodeData.GeneralCategory.Pf + ,simpleUpperCaseMapping:0x2E0D + ,simpleLowerCaseMapping:0x2E0D + ,simpleTitleCaseMapping:0x2E0D + }, + { code:0x2E0E + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2E0E + ,simpleLowerCaseMapping:0x2E0E + ,simpleTitleCaseMapping:0x2E0E + }, + { code:0x2E0F + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2E0F + ,simpleLowerCaseMapping:0x2E0F + ,simpleTitleCaseMapping:0x2E0F + }, + { code:0x2E10 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2E10 + ,simpleLowerCaseMapping:0x2E10 + ,simpleTitleCaseMapping:0x2E10 + }, + { code:0x2E11 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2E11 + ,simpleLowerCaseMapping:0x2E11 + ,simpleTitleCaseMapping:0x2E11 + }, + { code:0x2E12 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2E12 + ,simpleLowerCaseMapping:0x2E12 + ,simpleTitleCaseMapping:0x2E12 + }, + { code:0x2E13 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2E13 + ,simpleLowerCaseMapping:0x2E13 + ,simpleTitleCaseMapping:0x2E13 + }, + { code:0x2E14 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2E14 + ,simpleLowerCaseMapping:0x2E14 + ,simpleTitleCaseMapping:0x2E14 + }, + { code:0x2E15 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2E15 + ,simpleLowerCaseMapping:0x2E15 + ,simpleTitleCaseMapping:0x2E15 + }, + { code:0x2E16 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x2E16 + ,simpleLowerCaseMapping:0x2E16 + ,simpleTitleCaseMapping:0x2E16 + }, + { code:0x2E17 + ,generalCategory:UnicodeData.GeneralCategory.Pd + ,simpleUpperCaseMapping:0x2E17 + ,simpleLowerCaseMapping:0x2E17 + ,simpleTitleCaseMapping:0x2E17 + }, + { code:0x2E1C + ,generalCategory:UnicodeData.GeneralCategory.Pi + ,simpleUpperCaseMapping:0x2E1C + ,simpleLowerCaseMapping:0x2E1C + ,simpleTitleCaseMapping:0x2E1C + }, + { code:0x2E1D + ,generalCategory:UnicodeData.GeneralCategory.Pf + ,simpleUpperCaseMapping:0x2E1D + ,simpleLowerCaseMapping:0x2E1D + ,simpleTitleCaseMapping:0x2E1D + }, + { code:0x2E80 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2E80 + ,simpleLowerCaseMapping:0x2E80 + ,simpleTitleCaseMapping:0x2E80 + }, + { code:0x2E81 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2E81 + ,simpleLowerCaseMapping:0x2E81 + ,simpleTitleCaseMapping:0x2E81 + }, + { code:0x2E82 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2E82 + ,simpleLowerCaseMapping:0x2E82 + ,simpleTitleCaseMapping:0x2E82 + }, + { code:0x2E83 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2E83 + ,simpleLowerCaseMapping:0x2E83 + ,simpleTitleCaseMapping:0x2E83 + }, + { code:0x2E84 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2E84 + ,simpleLowerCaseMapping:0x2E84 + ,simpleTitleCaseMapping:0x2E84 + }, + { code:0x2E85 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2E85 + ,simpleLowerCaseMapping:0x2E85 + ,simpleTitleCaseMapping:0x2E85 + }, + { code:0x2E86 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2E86 + ,simpleLowerCaseMapping:0x2E86 + ,simpleTitleCaseMapping:0x2E86 + }, + { code:0x2E87 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2E87 + ,simpleLowerCaseMapping:0x2E87 + ,simpleTitleCaseMapping:0x2E87 + }, + { code:0x2E88 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2E88 + ,simpleLowerCaseMapping:0x2E88 + ,simpleTitleCaseMapping:0x2E88 + }, + { code:0x2E89 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2E89 + ,simpleLowerCaseMapping:0x2E89 + ,simpleTitleCaseMapping:0x2E89 + }, + { code:0x2E8A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2E8A + ,simpleLowerCaseMapping:0x2E8A + ,simpleTitleCaseMapping:0x2E8A + }, + { code:0x2E8B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2E8B + ,simpleLowerCaseMapping:0x2E8B + ,simpleTitleCaseMapping:0x2E8B + }, + { code:0x2E8C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2E8C + ,simpleLowerCaseMapping:0x2E8C + ,simpleTitleCaseMapping:0x2E8C + }, + { code:0x2E8D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2E8D + ,simpleLowerCaseMapping:0x2E8D + ,simpleTitleCaseMapping:0x2E8D + }, + { code:0x2E8E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2E8E + ,simpleLowerCaseMapping:0x2E8E + ,simpleTitleCaseMapping:0x2E8E + }, + { code:0x2E8F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2E8F + ,simpleLowerCaseMapping:0x2E8F + ,simpleTitleCaseMapping:0x2E8F + }, + { code:0x2E90 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2E90 + ,simpleLowerCaseMapping:0x2E90 + ,simpleTitleCaseMapping:0x2E90 + }, + { code:0x2E91 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2E91 + ,simpleLowerCaseMapping:0x2E91 + ,simpleTitleCaseMapping:0x2E91 + }, + { code:0x2E92 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2E92 + ,simpleLowerCaseMapping:0x2E92 + ,simpleTitleCaseMapping:0x2E92 + }, + { code:0x2E93 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2E93 + ,simpleLowerCaseMapping:0x2E93 + ,simpleTitleCaseMapping:0x2E93 + }, + { code:0x2E94 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2E94 + ,simpleLowerCaseMapping:0x2E94 + ,simpleTitleCaseMapping:0x2E94 + }, + { code:0x2E95 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2E95 + ,simpleLowerCaseMapping:0x2E95 + ,simpleTitleCaseMapping:0x2E95 + }, + { code:0x2E96 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2E96 + ,simpleLowerCaseMapping:0x2E96 + ,simpleTitleCaseMapping:0x2E96 + }, + { code:0x2E97 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2E97 + ,simpleLowerCaseMapping:0x2E97 + ,simpleTitleCaseMapping:0x2E97 + }, + { code:0x2E98 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2E98 + ,simpleLowerCaseMapping:0x2E98 + ,simpleTitleCaseMapping:0x2E98 + }, + { code:0x2E99 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2E99 + ,simpleLowerCaseMapping:0x2E99 + ,simpleTitleCaseMapping:0x2E99 + }, + { code:0x2E9B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2E9B + ,simpleLowerCaseMapping:0x2E9B + ,simpleTitleCaseMapping:0x2E9B + }, + { code:0x2E9C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2E9C + ,simpleLowerCaseMapping:0x2E9C + ,simpleTitleCaseMapping:0x2E9C + }, + { code:0x2E9D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2E9D + ,simpleLowerCaseMapping:0x2E9D + ,simpleTitleCaseMapping:0x2E9D + }, + { code:0x2E9E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2E9E + ,simpleLowerCaseMapping:0x2E9E + ,simpleTitleCaseMapping:0x2E9E + }, + { code:0x2E9F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2E9F + ,simpleLowerCaseMapping:0x2E9F + ,simpleTitleCaseMapping:0x2E9F + }, + { code:0x2EA0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EA0 + ,simpleLowerCaseMapping:0x2EA0 + ,simpleTitleCaseMapping:0x2EA0 + }, + { code:0x2EA1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EA1 + ,simpleLowerCaseMapping:0x2EA1 + ,simpleTitleCaseMapping:0x2EA1 + }, + { code:0x2EA2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EA2 + ,simpleLowerCaseMapping:0x2EA2 + ,simpleTitleCaseMapping:0x2EA2 + }, + { code:0x2EA3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EA3 + ,simpleLowerCaseMapping:0x2EA3 + ,simpleTitleCaseMapping:0x2EA3 + }, + { code:0x2EA4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EA4 + ,simpleLowerCaseMapping:0x2EA4 + ,simpleTitleCaseMapping:0x2EA4 + }, + { code:0x2EA5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EA5 + ,simpleLowerCaseMapping:0x2EA5 + ,simpleTitleCaseMapping:0x2EA5 + }, + { code:0x2EA6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EA6 + ,simpleLowerCaseMapping:0x2EA6 + ,simpleTitleCaseMapping:0x2EA6 + }, + { code:0x2EA7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EA7 + ,simpleLowerCaseMapping:0x2EA7 + ,simpleTitleCaseMapping:0x2EA7 + }, + { code:0x2EA8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EA8 + ,simpleLowerCaseMapping:0x2EA8 + ,simpleTitleCaseMapping:0x2EA8 + }, + { code:0x2EA9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EA9 + ,simpleLowerCaseMapping:0x2EA9 + ,simpleTitleCaseMapping:0x2EA9 + }, + { code:0x2EAA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EAA + ,simpleLowerCaseMapping:0x2EAA + ,simpleTitleCaseMapping:0x2EAA + }, + { code:0x2EAB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EAB + ,simpleLowerCaseMapping:0x2EAB + ,simpleTitleCaseMapping:0x2EAB + }, + { code:0x2EAC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EAC + ,simpleLowerCaseMapping:0x2EAC + ,simpleTitleCaseMapping:0x2EAC + }, + { code:0x2EAD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EAD + ,simpleLowerCaseMapping:0x2EAD + ,simpleTitleCaseMapping:0x2EAD + }, + { code:0x2EAE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EAE + ,simpleLowerCaseMapping:0x2EAE + ,simpleTitleCaseMapping:0x2EAE + }, + { code:0x2EAF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EAF + ,simpleLowerCaseMapping:0x2EAF + ,simpleTitleCaseMapping:0x2EAF + }, + { code:0x2EB0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EB0 + ,simpleLowerCaseMapping:0x2EB0 + ,simpleTitleCaseMapping:0x2EB0 + }, + { code:0x2EB1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EB1 + ,simpleLowerCaseMapping:0x2EB1 + ,simpleTitleCaseMapping:0x2EB1 + }, + { code:0x2EB2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EB2 + ,simpleLowerCaseMapping:0x2EB2 + ,simpleTitleCaseMapping:0x2EB2 + }, + { code:0x2EB3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EB3 + ,simpleLowerCaseMapping:0x2EB3 + ,simpleTitleCaseMapping:0x2EB3 + }, + { code:0x2EB4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EB4 + ,simpleLowerCaseMapping:0x2EB4 + ,simpleTitleCaseMapping:0x2EB4 + }, + { code:0x2EB5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EB5 + ,simpleLowerCaseMapping:0x2EB5 + ,simpleTitleCaseMapping:0x2EB5 + }, + { code:0x2EB6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EB6 + ,simpleLowerCaseMapping:0x2EB6 + ,simpleTitleCaseMapping:0x2EB6 + }, + { code:0x2EB7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EB7 + ,simpleLowerCaseMapping:0x2EB7 + ,simpleTitleCaseMapping:0x2EB7 + }, + { code:0x2EB8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EB8 + ,simpleLowerCaseMapping:0x2EB8 + ,simpleTitleCaseMapping:0x2EB8 + }, + { code:0x2EB9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EB9 + ,simpleLowerCaseMapping:0x2EB9 + ,simpleTitleCaseMapping:0x2EB9 + }, + { code:0x2EBA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EBA + ,simpleLowerCaseMapping:0x2EBA + ,simpleTitleCaseMapping:0x2EBA + }, + { code:0x2EBB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EBB + ,simpleLowerCaseMapping:0x2EBB + ,simpleTitleCaseMapping:0x2EBB + }, + { code:0x2EBC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EBC + ,simpleLowerCaseMapping:0x2EBC + ,simpleTitleCaseMapping:0x2EBC + }, + { code:0x2EBD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EBD + ,simpleLowerCaseMapping:0x2EBD + ,simpleTitleCaseMapping:0x2EBD + }, + { code:0x2EBE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EBE + ,simpleLowerCaseMapping:0x2EBE + ,simpleTitleCaseMapping:0x2EBE + }, + { code:0x2EBF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EBF + ,simpleLowerCaseMapping:0x2EBF + ,simpleTitleCaseMapping:0x2EBF + }, + { code:0x2EC0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EC0 + ,simpleLowerCaseMapping:0x2EC0 + ,simpleTitleCaseMapping:0x2EC0 + }, + { code:0x2EC1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EC1 + ,simpleLowerCaseMapping:0x2EC1 + ,simpleTitleCaseMapping:0x2EC1 + }, + { code:0x2EC2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EC2 + ,simpleLowerCaseMapping:0x2EC2 + ,simpleTitleCaseMapping:0x2EC2 + }, + { code:0x2EC3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EC3 + ,simpleLowerCaseMapping:0x2EC3 + ,simpleTitleCaseMapping:0x2EC3 + }, + { code:0x2EC4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EC4 + ,simpleLowerCaseMapping:0x2EC4 + ,simpleTitleCaseMapping:0x2EC4 + }, + { code:0x2EC5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EC5 + ,simpleLowerCaseMapping:0x2EC5 + ,simpleTitleCaseMapping:0x2EC5 + }, + { code:0x2EC6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EC6 + ,simpleLowerCaseMapping:0x2EC6 + ,simpleTitleCaseMapping:0x2EC6 + }, + { code:0x2EC7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EC7 + ,simpleLowerCaseMapping:0x2EC7 + ,simpleTitleCaseMapping:0x2EC7 + }, + { code:0x2EC8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EC8 + ,simpleLowerCaseMapping:0x2EC8 + ,simpleTitleCaseMapping:0x2EC8 + }, + { code:0x2EC9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EC9 + ,simpleLowerCaseMapping:0x2EC9 + ,simpleTitleCaseMapping:0x2EC9 + }, + { code:0x2ECA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2ECA + ,simpleLowerCaseMapping:0x2ECA + ,simpleTitleCaseMapping:0x2ECA + }, + { code:0x2ECB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2ECB + ,simpleLowerCaseMapping:0x2ECB + ,simpleTitleCaseMapping:0x2ECB + }, + { code:0x2ECC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2ECC + ,simpleLowerCaseMapping:0x2ECC + ,simpleTitleCaseMapping:0x2ECC + }, + { code:0x2ECD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2ECD + ,simpleLowerCaseMapping:0x2ECD + ,simpleTitleCaseMapping:0x2ECD + }, + { code:0x2ECE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2ECE + ,simpleLowerCaseMapping:0x2ECE + ,simpleTitleCaseMapping:0x2ECE + }, + { code:0x2ECF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2ECF + ,simpleLowerCaseMapping:0x2ECF + ,simpleTitleCaseMapping:0x2ECF + }, + { code:0x2ED0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2ED0 + ,simpleLowerCaseMapping:0x2ED0 + ,simpleTitleCaseMapping:0x2ED0 + }, + { code:0x2ED1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2ED1 + ,simpleLowerCaseMapping:0x2ED1 + ,simpleTitleCaseMapping:0x2ED1 + }, + { code:0x2ED2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2ED2 + ,simpleLowerCaseMapping:0x2ED2 + ,simpleTitleCaseMapping:0x2ED2 + }, + { code:0x2ED3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2ED3 + ,simpleLowerCaseMapping:0x2ED3 + ,simpleTitleCaseMapping:0x2ED3 + }, + { code:0x2ED4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2ED4 + ,simpleLowerCaseMapping:0x2ED4 + ,simpleTitleCaseMapping:0x2ED4 + }, + { code:0x2ED5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2ED5 + ,simpleLowerCaseMapping:0x2ED5 + ,simpleTitleCaseMapping:0x2ED5 + }, + { code:0x2ED6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2ED6 + ,simpleLowerCaseMapping:0x2ED6 + ,simpleTitleCaseMapping:0x2ED6 + }, + { code:0x2ED7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2ED7 + ,simpleLowerCaseMapping:0x2ED7 + ,simpleTitleCaseMapping:0x2ED7 + }, + { code:0x2ED8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2ED8 + ,simpleLowerCaseMapping:0x2ED8 + ,simpleTitleCaseMapping:0x2ED8 + }, + { code:0x2ED9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2ED9 + ,simpleLowerCaseMapping:0x2ED9 + ,simpleTitleCaseMapping:0x2ED9 + }, + { code:0x2EDA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EDA + ,simpleLowerCaseMapping:0x2EDA + ,simpleTitleCaseMapping:0x2EDA + }, + { code:0x2EDB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EDB + ,simpleLowerCaseMapping:0x2EDB + ,simpleTitleCaseMapping:0x2EDB + }, + { code:0x2EDC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EDC + ,simpleLowerCaseMapping:0x2EDC + ,simpleTitleCaseMapping:0x2EDC + }, + { code:0x2EDD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EDD + ,simpleLowerCaseMapping:0x2EDD + ,simpleTitleCaseMapping:0x2EDD + }, + { code:0x2EDE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EDE + ,simpleLowerCaseMapping:0x2EDE + ,simpleTitleCaseMapping:0x2EDE + }, + { code:0x2EDF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EDF + ,simpleLowerCaseMapping:0x2EDF + ,simpleTitleCaseMapping:0x2EDF + }, + { code:0x2EE0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EE0 + ,simpleLowerCaseMapping:0x2EE0 + ,simpleTitleCaseMapping:0x2EE0 + }, + { code:0x2EE1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EE1 + ,simpleLowerCaseMapping:0x2EE1 + ,simpleTitleCaseMapping:0x2EE1 + }, + { code:0x2EE2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EE2 + ,simpleLowerCaseMapping:0x2EE2 + ,simpleTitleCaseMapping:0x2EE2 + }, + { code:0x2EE3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EE3 + ,simpleLowerCaseMapping:0x2EE3 + ,simpleTitleCaseMapping:0x2EE3 + }, + { code:0x2EE4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EE4 + ,simpleLowerCaseMapping:0x2EE4 + ,simpleTitleCaseMapping:0x2EE4 + }, + { code:0x2EE5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EE5 + ,simpleLowerCaseMapping:0x2EE5 + ,simpleTitleCaseMapping:0x2EE5 + }, + { code:0x2EE6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EE6 + ,simpleLowerCaseMapping:0x2EE6 + ,simpleTitleCaseMapping:0x2EE6 + }, + { code:0x2EE7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EE7 + ,simpleLowerCaseMapping:0x2EE7 + ,simpleTitleCaseMapping:0x2EE7 + }, + { code:0x2EE8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EE8 + ,simpleLowerCaseMapping:0x2EE8 + ,simpleTitleCaseMapping:0x2EE8 + }, + { code:0x2EE9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EE9 + ,simpleLowerCaseMapping:0x2EE9 + ,simpleTitleCaseMapping:0x2EE9 + }, + { code:0x2EEA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EEA + ,simpleLowerCaseMapping:0x2EEA + ,simpleTitleCaseMapping:0x2EEA + }, + { code:0x2EEB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EEB + ,simpleLowerCaseMapping:0x2EEB + ,simpleTitleCaseMapping:0x2EEB + }, + { code:0x2EEC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EEC + ,simpleLowerCaseMapping:0x2EEC + ,simpleTitleCaseMapping:0x2EEC + }, + { code:0x2EED + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EED + ,simpleLowerCaseMapping:0x2EED + ,simpleTitleCaseMapping:0x2EED + }, + { code:0x2EEE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EEE + ,simpleLowerCaseMapping:0x2EEE + ,simpleTitleCaseMapping:0x2EEE + }, + { code:0x2EEF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EEF + ,simpleLowerCaseMapping:0x2EEF + ,simpleTitleCaseMapping:0x2EEF + }, + { code:0x2EF0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EF0 + ,simpleLowerCaseMapping:0x2EF0 + ,simpleTitleCaseMapping:0x2EF0 + }, + { code:0x2EF1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EF1 + ,simpleLowerCaseMapping:0x2EF1 + ,simpleTitleCaseMapping:0x2EF1 + }, + { code:0x2EF2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EF2 + ,simpleLowerCaseMapping:0x2EF2 + ,simpleTitleCaseMapping:0x2EF2 + }, + { code:0x2EF3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2EF3 + ,simpleLowerCaseMapping:0x2EF3 + ,simpleTitleCaseMapping:0x2EF3 + }, + { code:0x2F00 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F00 + ,simpleLowerCaseMapping:0x2F00 + ,simpleTitleCaseMapping:0x2F00 + }, + { code:0x2F01 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F01 + ,simpleLowerCaseMapping:0x2F01 + ,simpleTitleCaseMapping:0x2F01 + }, + { code:0x2F02 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F02 + ,simpleLowerCaseMapping:0x2F02 + ,simpleTitleCaseMapping:0x2F02 + }, + { code:0x2F03 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F03 + ,simpleLowerCaseMapping:0x2F03 + ,simpleTitleCaseMapping:0x2F03 + }, + { code:0x2F04 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F04 + ,simpleLowerCaseMapping:0x2F04 + ,simpleTitleCaseMapping:0x2F04 + }, + { code:0x2F05 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F05 + ,simpleLowerCaseMapping:0x2F05 + ,simpleTitleCaseMapping:0x2F05 + }, + { code:0x2F06 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F06 + ,simpleLowerCaseMapping:0x2F06 + ,simpleTitleCaseMapping:0x2F06 + }, + { code:0x2F07 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F07 + ,simpleLowerCaseMapping:0x2F07 + ,simpleTitleCaseMapping:0x2F07 + }, + { code:0x2F08 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F08 + ,simpleLowerCaseMapping:0x2F08 + ,simpleTitleCaseMapping:0x2F08 + }, + { code:0x2F09 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F09 + ,simpleLowerCaseMapping:0x2F09 + ,simpleTitleCaseMapping:0x2F09 + }, + { code:0x2F0A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F0A + ,simpleLowerCaseMapping:0x2F0A + ,simpleTitleCaseMapping:0x2F0A + }, + { code:0x2F0B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F0B + ,simpleLowerCaseMapping:0x2F0B + ,simpleTitleCaseMapping:0x2F0B + }, + { code:0x2F0C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F0C + ,simpleLowerCaseMapping:0x2F0C + ,simpleTitleCaseMapping:0x2F0C + }, + { code:0x2F0D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F0D + ,simpleLowerCaseMapping:0x2F0D + ,simpleTitleCaseMapping:0x2F0D + }, + { code:0x2F0E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F0E + ,simpleLowerCaseMapping:0x2F0E + ,simpleTitleCaseMapping:0x2F0E + }, + { code:0x2F0F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F0F + ,simpleLowerCaseMapping:0x2F0F + ,simpleTitleCaseMapping:0x2F0F + }, + { code:0x2F10 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F10 + ,simpleLowerCaseMapping:0x2F10 + ,simpleTitleCaseMapping:0x2F10 + }, + { code:0x2F11 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F11 + ,simpleLowerCaseMapping:0x2F11 + ,simpleTitleCaseMapping:0x2F11 + }, + { code:0x2F12 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F12 + ,simpleLowerCaseMapping:0x2F12 + ,simpleTitleCaseMapping:0x2F12 + }, + { code:0x2F13 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F13 + ,simpleLowerCaseMapping:0x2F13 + ,simpleTitleCaseMapping:0x2F13 + }, + { code:0x2F14 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F14 + ,simpleLowerCaseMapping:0x2F14 + ,simpleTitleCaseMapping:0x2F14 + }, + { code:0x2F15 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F15 + ,simpleLowerCaseMapping:0x2F15 + ,simpleTitleCaseMapping:0x2F15 + }, + { code:0x2F16 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F16 + ,simpleLowerCaseMapping:0x2F16 + ,simpleTitleCaseMapping:0x2F16 + }, + { code:0x2F17 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F17 + ,simpleLowerCaseMapping:0x2F17 + ,simpleTitleCaseMapping:0x2F17 + }, + { code:0x2F18 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F18 + ,simpleLowerCaseMapping:0x2F18 + ,simpleTitleCaseMapping:0x2F18 + }, + { code:0x2F19 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F19 + ,simpleLowerCaseMapping:0x2F19 + ,simpleTitleCaseMapping:0x2F19 + }, + { code:0x2F1A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F1A + ,simpleLowerCaseMapping:0x2F1A + ,simpleTitleCaseMapping:0x2F1A + }, + { code:0x2F1B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F1B + ,simpleLowerCaseMapping:0x2F1B + ,simpleTitleCaseMapping:0x2F1B + }, + { code:0x2F1C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F1C + ,simpleLowerCaseMapping:0x2F1C + ,simpleTitleCaseMapping:0x2F1C + }, + { code:0x2F1D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F1D + ,simpleLowerCaseMapping:0x2F1D + ,simpleTitleCaseMapping:0x2F1D + }, + { code:0x2F1E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F1E + ,simpleLowerCaseMapping:0x2F1E + ,simpleTitleCaseMapping:0x2F1E + }, + { code:0x2F1F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F1F + ,simpleLowerCaseMapping:0x2F1F + ,simpleTitleCaseMapping:0x2F1F + }, + { code:0x2F20 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F20 + ,simpleLowerCaseMapping:0x2F20 + ,simpleTitleCaseMapping:0x2F20 + }, + { code:0x2F21 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F21 + ,simpleLowerCaseMapping:0x2F21 + ,simpleTitleCaseMapping:0x2F21 + }, + { code:0x2F22 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F22 + ,simpleLowerCaseMapping:0x2F22 + ,simpleTitleCaseMapping:0x2F22 + }, + { code:0x2F23 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F23 + ,simpleLowerCaseMapping:0x2F23 + ,simpleTitleCaseMapping:0x2F23 + }, + { code:0x2F24 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F24 + ,simpleLowerCaseMapping:0x2F24 + ,simpleTitleCaseMapping:0x2F24 + }, + { code:0x2F25 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F25 + ,simpleLowerCaseMapping:0x2F25 + ,simpleTitleCaseMapping:0x2F25 + }, + { code:0x2F26 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F26 + ,simpleLowerCaseMapping:0x2F26 + ,simpleTitleCaseMapping:0x2F26 + }, + { code:0x2F27 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F27 + ,simpleLowerCaseMapping:0x2F27 + ,simpleTitleCaseMapping:0x2F27 + }, + { code:0x2F28 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F28 + ,simpleLowerCaseMapping:0x2F28 + ,simpleTitleCaseMapping:0x2F28 + }, + { code:0x2F29 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F29 + ,simpleLowerCaseMapping:0x2F29 + ,simpleTitleCaseMapping:0x2F29 + }, + { code:0x2F2A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F2A + ,simpleLowerCaseMapping:0x2F2A + ,simpleTitleCaseMapping:0x2F2A + }, + { code:0x2F2B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F2B + ,simpleLowerCaseMapping:0x2F2B + ,simpleTitleCaseMapping:0x2F2B + }, + { code:0x2F2C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F2C + ,simpleLowerCaseMapping:0x2F2C + ,simpleTitleCaseMapping:0x2F2C + }, + { code:0x2F2D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F2D + ,simpleLowerCaseMapping:0x2F2D + ,simpleTitleCaseMapping:0x2F2D + }, + { code:0x2F2E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F2E + ,simpleLowerCaseMapping:0x2F2E + ,simpleTitleCaseMapping:0x2F2E + }, + { code:0x2F2F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F2F + ,simpleLowerCaseMapping:0x2F2F + ,simpleTitleCaseMapping:0x2F2F + }, + { code:0x2F30 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F30 + ,simpleLowerCaseMapping:0x2F30 + ,simpleTitleCaseMapping:0x2F30 + }, + { code:0x2F31 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F31 + ,simpleLowerCaseMapping:0x2F31 + ,simpleTitleCaseMapping:0x2F31 + }, + { code:0x2F32 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F32 + ,simpleLowerCaseMapping:0x2F32 + ,simpleTitleCaseMapping:0x2F32 + }, + { code:0x2F33 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F33 + ,simpleLowerCaseMapping:0x2F33 + ,simpleTitleCaseMapping:0x2F33 + }, + { code:0x2F34 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F34 + ,simpleLowerCaseMapping:0x2F34 + ,simpleTitleCaseMapping:0x2F34 + }, + { code:0x2F35 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F35 + ,simpleLowerCaseMapping:0x2F35 + ,simpleTitleCaseMapping:0x2F35 + }, + { code:0x2F36 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F36 + ,simpleLowerCaseMapping:0x2F36 + ,simpleTitleCaseMapping:0x2F36 + }, + { code:0x2F37 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F37 + ,simpleLowerCaseMapping:0x2F37 + ,simpleTitleCaseMapping:0x2F37 + }, + { code:0x2F38 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F38 + ,simpleLowerCaseMapping:0x2F38 + ,simpleTitleCaseMapping:0x2F38 + }, + { code:0x2F39 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F39 + ,simpleLowerCaseMapping:0x2F39 + ,simpleTitleCaseMapping:0x2F39 + }, + { code:0x2F3A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F3A + ,simpleLowerCaseMapping:0x2F3A + ,simpleTitleCaseMapping:0x2F3A + }, + { code:0x2F3B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F3B + ,simpleLowerCaseMapping:0x2F3B + ,simpleTitleCaseMapping:0x2F3B + }, + { code:0x2F3C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F3C + ,simpleLowerCaseMapping:0x2F3C + ,simpleTitleCaseMapping:0x2F3C + }, + { code:0x2F3D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F3D + ,simpleLowerCaseMapping:0x2F3D + ,simpleTitleCaseMapping:0x2F3D + }, + { code:0x2F3E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F3E + ,simpleLowerCaseMapping:0x2F3E + ,simpleTitleCaseMapping:0x2F3E + }, + { code:0x2F3F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F3F + ,simpleLowerCaseMapping:0x2F3F + ,simpleTitleCaseMapping:0x2F3F + }, + { code:0x2F40 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F40 + ,simpleLowerCaseMapping:0x2F40 + ,simpleTitleCaseMapping:0x2F40 + }, + { code:0x2F41 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F41 + ,simpleLowerCaseMapping:0x2F41 + ,simpleTitleCaseMapping:0x2F41 + }, + { code:0x2F42 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F42 + ,simpleLowerCaseMapping:0x2F42 + ,simpleTitleCaseMapping:0x2F42 + }, + { code:0x2F43 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F43 + ,simpleLowerCaseMapping:0x2F43 + ,simpleTitleCaseMapping:0x2F43 + }, + { code:0x2F44 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F44 + ,simpleLowerCaseMapping:0x2F44 + ,simpleTitleCaseMapping:0x2F44 + }, + { code:0x2F45 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F45 + ,simpleLowerCaseMapping:0x2F45 + ,simpleTitleCaseMapping:0x2F45 + }, + { code:0x2F46 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F46 + ,simpleLowerCaseMapping:0x2F46 + ,simpleTitleCaseMapping:0x2F46 + }, + { code:0x2F47 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F47 + ,simpleLowerCaseMapping:0x2F47 + ,simpleTitleCaseMapping:0x2F47 + }, + { code:0x2F48 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F48 + ,simpleLowerCaseMapping:0x2F48 + ,simpleTitleCaseMapping:0x2F48 + }, + { code:0x2F49 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F49 + ,simpleLowerCaseMapping:0x2F49 + ,simpleTitleCaseMapping:0x2F49 + }, + { code:0x2F4A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F4A + ,simpleLowerCaseMapping:0x2F4A + ,simpleTitleCaseMapping:0x2F4A + }, + { code:0x2F4B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F4B + ,simpleLowerCaseMapping:0x2F4B + ,simpleTitleCaseMapping:0x2F4B + }, + { code:0x2F4C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F4C + ,simpleLowerCaseMapping:0x2F4C + ,simpleTitleCaseMapping:0x2F4C + }, + { code:0x2F4D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F4D + ,simpleLowerCaseMapping:0x2F4D + ,simpleTitleCaseMapping:0x2F4D + }, + { code:0x2F4E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F4E + ,simpleLowerCaseMapping:0x2F4E + ,simpleTitleCaseMapping:0x2F4E + }, + { code:0x2F4F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F4F + ,simpleLowerCaseMapping:0x2F4F + ,simpleTitleCaseMapping:0x2F4F + }, + { code:0x2F50 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F50 + ,simpleLowerCaseMapping:0x2F50 + ,simpleTitleCaseMapping:0x2F50 + }, + { code:0x2F51 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F51 + ,simpleLowerCaseMapping:0x2F51 + ,simpleTitleCaseMapping:0x2F51 + }, + { code:0x2F52 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F52 + ,simpleLowerCaseMapping:0x2F52 + ,simpleTitleCaseMapping:0x2F52 + }, + { code:0x2F53 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F53 + ,simpleLowerCaseMapping:0x2F53 + ,simpleTitleCaseMapping:0x2F53 + }, + { code:0x2F54 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F54 + ,simpleLowerCaseMapping:0x2F54 + ,simpleTitleCaseMapping:0x2F54 + }, + { code:0x2F55 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F55 + ,simpleLowerCaseMapping:0x2F55 + ,simpleTitleCaseMapping:0x2F55 + }, + { code:0x2F56 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F56 + ,simpleLowerCaseMapping:0x2F56 + ,simpleTitleCaseMapping:0x2F56 + }, + { code:0x2F57 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F57 + ,simpleLowerCaseMapping:0x2F57 + ,simpleTitleCaseMapping:0x2F57 + }, + { code:0x2F58 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F58 + ,simpleLowerCaseMapping:0x2F58 + ,simpleTitleCaseMapping:0x2F58 + }, + { code:0x2F59 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F59 + ,simpleLowerCaseMapping:0x2F59 + ,simpleTitleCaseMapping:0x2F59 + }, + { code:0x2F5A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F5A + ,simpleLowerCaseMapping:0x2F5A + ,simpleTitleCaseMapping:0x2F5A + }, + { code:0x2F5B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F5B + ,simpleLowerCaseMapping:0x2F5B + ,simpleTitleCaseMapping:0x2F5B + }, + { code:0x2F5C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F5C + ,simpleLowerCaseMapping:0x2F5C + ,simpleTitleCaseMapping:0x2F5C + }, + { code:0x2F5D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F5D + ,simpleLowerCaseMapping:0x2F5D + ,simpleTitleCaseMapping:0x2F5D + }, + { code:0x2F5E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F5E + ,simpleLowerCaseMapping:0x2F5E + ,simpleTitleCaseMapping:0x2F5E + }, + { code:0x2F5F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F5F + ,simpleLowerCaseMapping:0x2F5F + ,simpleTitleCaseMapping:0x2F5F + }, + { code:0x2F60 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F60 + ,simpleLowerCaseMapping:0x2F60 + ,simpleTitleCaseMapping:0x2F60 + }, + { code:0x2F61 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F61 + ,simpleLowerCaseMapping:0x2F61 + ,simpleTitleCaseMapping:0x2F61 + }, + { code:0x2F62 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F62 + ,simpleLowerCaseMapping:0x2F62 + ,simpleTitleCaseMapping:0x2F62 + }, + { code:0x2F63 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F63 + ,simpleLowerCaseMapping:0x2F63 + ,simpleTitleCaseMapping:0x2F63 + }, + { code:0x2F64 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F64 + ,simpleLowerCaseMapping:0x2F64 + ,simpleTitleCaseMapping:0x2F64 + }, + { code:0x2F65 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F65 + ,simpleLowerCaseMapping:0x2F65 + ,simpleTitleCaseMapping:0x2F65 + }, + { code:0x2F66 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F66 + ,simpleLowerCaseMapping:0x2F66 + ,simpleTitleCaseMapping:0x2F66 + }, + { code:0x2F67 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F67 + ,simpleLowerCaseMapping:0x2F67 + ,simpleTitleCaseMapping:0x2F67 + }, + { code:0x2F68 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F68 + ,simpleLowerCaseMapping:0x2F68 + ,simpleTitleCaseMapping:0x2F68 + }, + { code:0x2F69 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F69 + ,simpleLowerCaseMapping:0x2F69 + ,simpleTitleCaseMapping:0x2F69 + }, + { code:0x2F6A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F6A + ,simpleLowerCaseMapping:0x2F6A + ,simpleTitleCaseMapping:0x2F6A + }, + { code:0x2F6B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F6B + ,simpleLowerCaseMapping:0x2F6B + ,simpleTitleCaseMapping:0x2F6B + }, + { code:0x2F6C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F6C + ,simpleLowerCaseMapping:0x2F6C + ,simpleTitleCaseMapping:0x2F6C + }, + { code:0x2F6D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F6D + ,simpleLowerCaseMapping:0x2F6D + ,simpleTitleCaseMapping:0x2F6D + }, + { code:0x2F6E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F6E + ,simpleLowerCaseMapping:0x2F6E + ,simpleTitleCaseMapping:0x2F6E + }, + { code:0x2F6F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F6F + ,simpleLowerCaseMapping:0x2F6F + ,simpleTitleCaseMapping:0x2F6F + }, + { code:0x2F70 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F70 + ,simpleLowerCaseMapping:0x2F70 + ,simpleTitleCaseMapping:0x2F70 + }, + { code:0x2F71 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F71 + ,simpleLowerCaseMapping:0x2F71 + ,simpleTitleCaseMapping:0x2F71 + }, + { code:0x2F72 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F72 + ,simpleLowerCaseMapping:0x2F72 + ,simpleTitleCaseMapping:0x2F72 + }, + { code:0x2F73 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F73 + ,simpleLowerCaseMapping:0x2F73 + ,simpleTitleCaseMapping:0x2F73 + }, + { code:0x2F74 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F74 + ,simpleLowerCaseMapping:0x2F74 + ,simpleTitleCaseMapping:0x2F74 + }, + { code:0x2F75 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F75 + ,simpleLowerCaseMapping:0x2F75 + ,simpleTitleCaseMapping:0x2F75 + }, + { code:0x2F76 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F76 + ,simpleLowerCaseMapping:0x2F76 + ,simpleTitleCaseMapping:0x2F76 + }, + { code:0x2F77 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F77 + ,simpleLowerCaseMapping:0x2F77 + ,simpleTitleCaseMapping:0x2F77 + }, + { code:0x2F78 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F78 + ,simpleLowerCaseMapping:0x2F78 + ,simpleTitleCaseMapping:0x2F78 + }, + { code:0x2F79 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F79 + ,simpleLowerCaseMapping:0x2F79 + ,simpleTitleCaseMapping:0x2F79 + }, + { code:0x2F7A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F7A + ,simpleLowerCaseMapping:0x2F7A + ,simpleTitleCaseMapping:0x2F7A + }, + { code:0x2F7B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F7B + ,simpleLowerCaseMapping:0x2F7B + ,simpleTitleCaseMapping:0x2F7B + }, + { code:0x2F7C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F7C + ,simpleLowerCaseMapping:0x2F7C + ,simpleTitleCaseMapping:0x2F7C + }, + { code:0x2F7D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F7D + ,simpleLowerCaseMapping:0x2F7D + ,simpleTitleCaseMapping:0x2F7D + }, + { code:0x2F7E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F7E + ,simpleLowerCaseMapping:0x2F7E + ,simpleTitleCaseMapping:0x2F7E + }, + { code:0x2F7F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F7F + ,simpleLowerCaseMapping:0x2F7F + ,simpleTitleCaseMapping:0x2F7F + }, + { code:0x2F80 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F80 + ,simpleLowerCaseMapping:0x2F80 + ,simpleTitleCaseMapping:0x2F80 + }, + { code:0x2F81 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F81 + ,simpleLowerCaseMapping:0x2F81 + ,simpleTitleCaseMapping:0x2F81 + }, + { code:0x2F82 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F82 + ,simpleLowerCaseMapping:0x2F82 + ,simpleTitleCaseMapping:0x2F82 + }, + { code:0x2F83 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F83 + ,simpleLowerCaseMapping:0x2F83 + ,simpleTitleCaseMapping:0x2F83 + }, + { code:0x2F84 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F84 + ,simpleLowerCaseMapping:0x2F84 + ,simpleTitleCaseMapping:0x2F84 + }, + { code:0x2F85 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F85 + ,simpleLowerCaseMapping:0x2F85 + ,simpleTitleCaseMapping:0x2F85 + }, + { code:0x2F86 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F86 + ,simpleLowerCaseMapping:0x2F86 + ,simpleTitleCaseMapping:0x2F86 + }, + { code:0x2F87 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F87 + ,simpleLowerCaseMapping:0x2F87 + ,simpleTitleCaseMapping:0x2F87 + }, + { code:0x2F88 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F88 + ,simpleLowerCaseMapping:0x2F88 + ,simpleTitleCaseMapping:0x2F88 + }, + { code:0x2F89 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F89 + ,simpleLowerCaseMapping:0x2F89 + ,simpleTitleCaseMapping:0x2F89 + }, + { code:0x2F8A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F8A + ,simpleLowerCaseMapping:0x2F8A + ,simpleTitleCaseMapping:0x2F8A + }, + { code:0x2F8B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F8B + ,simpleLowerCaseMapping:0x2F8B + ,simpleTitleCaseMapping:0x2F8B + }, + { code:0x2F8C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F8C + ,simpleLowerCaseMapping:0x2F8C + ,simpleTitleCaseMapping:0x2F8C + }, + { code:0x2F8D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F8D + ,simpleLowerCaseMapping:0x2F8D + ,simpleTitleCaseMapping:0x2F8D + }, + { code:0x2F8E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F8E + ,simpleLowerCaseMapping:0x2F8E + ,simpleTitleCaseMapping:0x2F8E + }, + { code:0x2F8F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F8F + ,simpleLowerCaseMapping:0x2F8F + ,simpleTitleCaseMapping:0x2F8F + }, + { code:0x2F90 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F90 + ,simpleLowerCaseMapping:0x2F90 + ,simpleTitleCaseMapping:0x2F90 + }, + { code:0x2F91 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F91 + ,simpleLowerCaseMapping:0x2F91 + ,simpleTitleCaseMapping:0x2F91 + }, + { code:0x2F92 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F92 + ,simpleLowerCaseMapping:0x2F92 + ,simpleTitleCaseMapping:0x2F92 + }, + { code:0x2F93 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F93 + ,simpleLowerCaseMapping:0x2F93 + ,simpleTitleCaseMapping:0x2F93 + }, + { code:0x2F94 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F94 + ,simpleLowerCaseMapping:0x2F94 + ,simpleTitleCaseMapping:0x2F94 + }, + { code:0x2F95 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F95 + ,simpleLowerCaseMapping:0x2F95 + ,simpleTitleCaseMapping:0x2F95 + }, + { code:0x2F96 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F96 + ,simpleLowerCaseMapping:0x2F96 + ,simpleTitleCaseMapping:0x2F96 + }, + { code:0x2F97 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F97 + ,simpleLowerCaseMapping:0x2F97 + ,simpleTitleCaseMapping:0x2F97 + }, + { code:0x2F98 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F98 + ,simpleLowerCaseMapping:0x2F98 + ,simpleTitleCaseMapping:0x2F98 + }, + { code:0x2F99 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F99 + ,simpleLowerCaseMapping:0x2F99 + ,simpleTitleCaseMapping:0x2F99 + }, + { code:0x2F9A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F9A + ,simpleLowerCaseMapping:0x2F9A + ,simpleTitleCaseMapping:0x2F9A + }, + { code:0x2F9B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F9B + ,simpleLowerCaseMapping:0x2F9B + ,simpleTitleCaseMapping:0x2F9B + }, + { code:0x2F9C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F9C + ,simpleLowerCaseMapping:0x2F9C + ,simpleTitleCaseMapping:0x2F9C + }, + { code:0x2F9D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F9D + ,simpleLowerCaseMapping:0x2F9D + ,simpleTitleCaseMapping:0x2F9D + }, + { code:0x2F9E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F9E + ,simpleLowerCaseMapping:0x2F9E + ,simpleTitleCaseMapping:0x2F9E + }, + { code:0x2F9F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2F9F + ,simpleLowerCaseMapping:0x2F9F + ,simpleTitleCaseMapping:0x2F9F + }, + { code:0x2FA0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FA0 + ,simpleLowerCaseMapping:0x2FA0 + ,simpleTitleCaseMapping:0x2FA0 + }, + { code:0x2FA1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FA1 + ,simpleLowerCaseMapping:0x2FA1 + ,simpleTitleCaseMapping:0x2FA1 + }, + { code:0x2FA2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FA2 + ,simpleLowerCaseMapping:0x2FA2 + ,simpleTitleCaseMapping:0x2FA2 + }, + { code:0x2FA3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FA3 + ,simpleLowerCaseMapping:0x2FA3 + ,simpleTitleCaseMapping:0x2FA3 + }, + { code:0x2FA4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FA4 + ,simpleLowerCaseMapping:0x2FA4 + ,simpleTitleCaseMapping:0x2FA4 + }, + { code:0x2FA5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FA5 + ,simpleLowerCaseMapping:0x2FA5 + ,simpleTitleCaseMapping:0x2FA5 + }, + { code:0x2FA6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FA6 + ,simpleLowerCaseMapping:0x2FA6 + ,simpleTitleCaseMapping:0x2FA6 + }, + { code:0x2FA7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FA7 + ,simpleLowerCaseMapping:0x2FA7 + ,simpleTitleCaseMapping:0x2FA7 + }, + { code:0x2FA8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FA8 + ,simpleLowerCaseMapping:0x2FA8 + ,simpleTitleCaseMapping:0x2FA8 + }, + { code:0x2FA9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FA9 + ,simpleLowerCaseMapping:0x2FA9 + ,simpleTitleCaseMapping:0x2FA9 + }, + { code:0x2FAA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FAA + ,simpleLowerCaseMapping:0x2FAA + ,simpleTitleCaseMapping:0x2FAA + }, + { code:0x2FAB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FAB + ,simpleLowerCaseMapping:0x2FAB + ,simpleTitleCaseMapping:0x2FAB + }, + { code:0x2FAC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FAC + ,simpleLowerCaseMapping:0x2FAC + ,simpleTitleCaseMapping:0x2FAC + }, + { code:0x2FAD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FAD + ,simpleLowerCaseMapping:0x2FAD + ,simpleTitleCaseMapping:0x2FAD + }, + { code:0x2FAE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FAE + ,simpleLowerCaseMapping:0x2FAE + ,simpleTitleCaseMapping:0x2FAE + }, + { code:0x2FAF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FAF + ,simpleLowerCaseMapping:0x2FAF + ,simpleTitleCaseMapping:0x2FAF + }, + { code:0x2FB0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FB0 + ,simpleLowerCaseMapping:0x2FB0 + ,simpleTitleCaseMapping:0x2FB0 + }, + { code:0x2FB1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FB1 + ,simpleLowerCaseMapping:0x2FB1 + ,simpleTitleCaseMapping:0x2FB1 + }, + { code:0x2FB2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FB2 + ,simpleLowerCaseMapping:0x2FB2 + ,simpleTitleCaseMapping:0x2FB2 + }, + { code:0x2FB3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FB3 + ,simpleLowerCaseMapping:0x2FB3 + ,simpleTitleCaseMapping:0x2FB3 + }, + { code:0x2FB4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FB4 + ,simpleLowerCaseMapping:0x2FB4 + ,simpleTitleCaseMapping:0x2FB4 + }, + { code:0x2FB5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FB5 + ,simpleLowerCaseMapping:0x2FB5 + ,simpleTitleCaseMapping:0x2FB5 + }, + { code:0x2FB6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FB6 + ,simpleLowerCaseMapping:0x2FB6 + ,simpleTitleCaseMapping:0x2FB6 + }, + { code:0x2FB7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FB7 + ,simpleLowerCaseMapping:0x2FB7 + ,simpleTitleCaseMapping:0x2FB7 + }, + { code:0x2FB8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FB8 + ,simpleLowerCaseMapping:0x2FB8 + ,simpleTitleCaseMapping:0x2FB8 + }, + { code:0x2FB9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FB9 + ,simpleLowerCaseMapping:0x2FB9 + ,simpleTitleCaseMapping:0x2FB9 + }, + { code:0x2FBA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FBA + ,simpleLowerCaseMapping:0x2FBA + ,simpleTitleCaseMapping:0x2FBA + }, + { code:0x2FBB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FBB + ,simpleLowerCaseMapping:0x2FBB + ,simpleTitleCaseMapping:0x2FBB + }, + { code:0x2FBC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FBC + ,simpleLowerCaseMapping:0x2FBC + ,simpleTitleCaseMapping:0x2FBC + }, + { code:0x2FBD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FBD + ,simpleLowerCaseMapping:0x2FBD + ,simpleTitleCaseMapping:0x2FBD + }, + { code:0x2FBE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FBE + ,simpleLowerCaseMapping:0x2FBE + ,simpleTitleCaseMapping:0x2FBE + }, + { code:0x2FBF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FBF + ,simpleLowerCaseMapping:0x2FBF + ,simpleTitleCaseMapping:0x2FBF + }, + { code:0x2FC0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FC0 + ,simpleLowerCaseMapping:0x2FC0 + ,simpleTitleCaseMapping:0x2FC0 + }, + { code:0x2FC1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FC1 + ,simpleLowerCaseMapping:0x2FC1 + ,simpleTitleCaseMapping:0x2FC1 + }, + { code:0x2FC2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FC2 + ,simpleLowerCaseMapping:0x2FC2 + ,simpleTitleCaseMapping:0x2FC2 + }, + { code:0x2FC3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FC3 + ,simpleLowerCaseMapping:0x2FC3 + ,simpleTitleCaseMapping:0x2FC3 + }, + { code:0x2FC4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FC4 + ,simpleLowerCaseMapping:0x2FC4 + ,simpleTitleCaseMapping:0x2FC4 + }, + { code:0x2FC5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FC5 + ,simpleLowerCaseMapping:0x2FC5 + ,simpleTitleCaseMapping:0x2FC5 + }, + { code:0x2FC6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FC6 + ,simpleLowerCaseMapping:0x2FC6 + ,simpleTitleCaseMapping:0x2FC6 + }, + { code:0x2FC7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FC7 + ,simpleLowerCaseMapping:0x2FC7 + ,simpleTitleCaseMapping:0x2FC7 + }, + { code:0x2FC8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FC8 + ,simpleLowerCaseMapping:0x2FC8 + ,simpleTitleCaseMapping:0x2FC8 + }, + { code:0x2FC9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FC9 + ,simpleLowerCaseMapping:0x2FC9 + ,simpleTitleCaseMapping:0x2FC9 + }, + { code:0x2FCA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FCA + ,simpleLowerCaseMapping:0x2FCA + ,simpleTitleCaseMapping:0x2FCA + }, + { code:0x2FCB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FCB + ,simpleLowerCaseMapping:0x2FCB + ,simpleTitleCaseMapping:0x2FCB + }, + { code:0x2FCC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FCC + ,simpleLowerCaseMapping:0x2FCC + ,simpleTitleCaseMapping:0x2FCC + }, + { code:0x2FCD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FCD + ,simpleLowerCaseMapping:0x2FCD + ,simpleTitleCaseMapping:0x2FCD + }, + { code:0x2FCE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FCE + ,simpleLowerCaseMapping:0x2FCE + ,simpleTitleCaseMapping:0x2FCE + }, + { code:0x2FCF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FCF + ,simpleLowerCaseMapping:0x2FCF + ,simpleTitleCaseMapping:0x2FCF + }, + { code:0x2FD0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FD0 + ,simpleLowerCaseMapping:0x2FD0 + ,simpleTitleCaseMapping:0x2FD0 + }, + { code:0x2FD1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FD1 + ,simpleLowerCaseMapping:0x2FD1 + ,simpleTitleCaseMapping:0x2FD1 + }, + { code:0x2FD2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FD2 + ,simpleLowerCaseMapping:0x2FD2 + ,simpleTitleCaseMapping:0x2FD2 + }, + { code:0x2FD3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FD3 + ,simpleLowerCaseMapping:0x2FD3 + ,simpleTitleCaseMapping:0x2FD3 + }, + { code:0x2FD4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FD4 + ,simpleLowerCaseMapping:0x2FD4 + ,simpleTitleCaseMapping:0x2FD4 + }, + { code:0x2FD5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FD5 + ,simpleLowerCaseMapping:0x2FD5 + ,simpleTitleCaseMapping:0x2FD5 + }, + { code:0x2FF0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FF0 + ,simpleLowerCaseMapping:0x2FF0 + ,simpleTitleCaseMapping:0x2FF0 + }, + { code:0x2FF1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FF1 + ,simpleLowerCaseMapping:0x2FF1 + ,simpleTitleCaseMapping:0x2FF1 + }, + { code:0x2FF2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FF2 + ,simpleLowerCaseMapping:0x2FF2 + ,simpleTitleCaseMapping:0x2FF2 + }, + { code:0x2FF3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FF3 + ,simpleLowerCaseMapping:0x2FF3 + ,simpleTitleCaseMapping:0x2FF3 + }, + { code:0x2FF4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FF4 + ,simpleLowerCaseMapping:0x2FF4 + ,simpleTitleCaseMapping:0x2FF4 + }, + { code:0x2FF5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FF5 + ,simpleLowerCaseMapping:0x2FF5 + ,simpleTitleCaseMapping:0x2FF5 + }, + { code:0x2FF6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FF6 + ,simpleLowerCaseMapping:0x2FF6 + ,simpleTitleCaseMapping:0x2FF6 + }, + { code:0x2FF7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FF7 + ,simpleLowerCaseMapping:0x2FF7 + ,simpleTitleCaseMapping:0x2FF7 + }, + { code:0x2FF8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FF8 + ,simpleLowerCaseMapping:0x2FF8 + ,simpleTitleCaseMapping:0x2FF8 + }, + { code:0x2FF9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FF9 + ,simpleLowerCaseMapping:0x2FF9 + ,simpleTitleCaseMapping:0x2FF9 + }, + { code:0x2FFA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FFA + ,simpleLowerCaseMapping:0x2FFA + ,simpleTitleCaseMapping:0x2FFA + }, + { code:0x2FFB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x2FFB + ,simpleLowerCaseMapping:0x2FFB + ,simpleTitleCaseMapping:0x2FFB + }, + { code:0x3000 + ,generalCategory:UnicodeData.GeneralCategory.Zs + ,simpleUpperCaseMapping:0x3000 + ,simpleLowerCaseMapping:0x3000 + ,simpleTitleCaseMapping:0x3000 + }, + { code:0x3001 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x3001 + ,simpleLowerCaseMapping:0x3001 + ,simpleTitleCaseMapping:0x3001 + }, + { code:0x3002 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x3002 + ,simpleLowerCaseMapping:0x3002 + ,simpleTitleCaseMapping:0x3002 + }, + { code:0x3003 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x3003 + ,simpleLowerCaseMapping:0x3003 + ,simpleTitleCaseMapping:0x3003 + }, + { code:0x3004 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3004 + ,simpleLowerCaseMapping:0x3004 + ,simpleTitleCaseMapping:0x3004 + }, + { code:0x3005 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x3005 + ,simpleLowerCaseMapping:0x3005 + ,simpleTitleCaseMapping:0x3005 + }, + { code:0x3006 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3006 + ,simpleLowerCaseMapping:0x3006 + ,simpleTitleCaseMapping:0x3006 + }, + { code:0x3007 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x3007 + ,simpleLowerCaseMapping:0x3007 + ,simpleTitleCaseMapping:0x3007 + }, + { code:0x3008 + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x3008 + ,simpleLowerCaseMapping:0x3008 + ,simpleTitleCaseMapping:0x3008 + }, + { code:0x3009 + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x3009 + ,simpleLowerCaseMapping:0x3009 + ,simpleTitleCaseMapping:0x3009 + }, + { code:0x300A + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x300A + ,simpleLowerCaseMapping:0x300A + ,simpleTitleCaseMapping:0x300A + }, + { code:0x300B + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x300B + ,simpleLowerCaseMapping:0x300B + ,simpleTitleCaseMapping:0x300B + }, + { code:0x300C + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x300C + ,simpleLowerCaseMapping:0x300C + ,simpleTitleCaseMapping:0x300C + }, + { code:0x300D + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x300D + ,simpleLowerCaseMapping:0x300D + ,simpleTitleCaseMapping:0x300D + }, + { code:0x300E + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x300E + ,simpleLowerCaseMapping:0x300E + ,simpleTitleCaseMapping:0x300E + }, + { code:0x300F + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x300F + ,simpleLowerCaseMapping:0x300F + ,simpleTitleCaseMapping:0x300F + }, + { code:0x3010 + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x3010 + ,simpleLowerCaseMapping:0x3010 + ,simpleTitleCaseMapping:0x3010 + }, + { code:0x3011 + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x3011 + ,simpleLowerCaseMapping:0x3011 + ,simpleTitleCaseMapping:0x3011 + }, + { code:0x3012 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3012 + ,simpleLowerCaseMapping:0x3012 + ,simpleTitleCaseMapping:0x3012 + }, + { code:0x3013 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3013 + ,simpleLowerCaseMapping:0x3013 + ,simpleTitleCaseMapping:0x3013 + }, + { code:0x3014 + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x3014 + ,simpleLowerCaseMapping:0x3014 + ,simpleTitleCaseMapping:0x3014 + }, + { code:0x3015 + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x3015 + ,simpleLowerCaseMapping:0x3015 + ,simpleTitleCaseMapping:0x3015 + }, + { code:0x3016 + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x3016 + ,simpleLowerCaseMapping:0x3016 + ,simpleTitleCaseMapping:0x3016 + }, + { code:0x3017 + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x3017 + ,simpleLowerCaseMapping:0x3017 + ,simpleTitleCaseMapping:0x3017 + }, + { code:0x3018 + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x3018 + ,simpleLowerCaseMapping:0x3018 + ,simpleTitleCaseMapping:0x3018 + }, + { code:0x3019 + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x3019 + ,simpleLowerCaseMapping:0x3019 + ,simpleTitleCaseMapping:0x3019 + }, + { code:0x301A + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x301A + ,simpleLowerCaseMapping:0x301A + ,simpleTitleCaseMapping:0x301A + }, + { code:0x301B + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x301B + ,simpleLowerCaseMapping:0x301B + ,simpleTitleCaseMapping:0x301B + }, + { code:0x301C + ,generalCategory:UnicodeData.GeneralCategory.Pd + ,simpleUpperCaseMapping:0x301C + ,simpleLowerCaseMapping:0x301C + ,simpleTitleCaseMapping:0x301C + }, + { code:0x301D + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0x301D + ,simpleLowerCaseMapping:0x301D + ,simpleTitleCaseMapping:0x301D + }, + { code:0x301E + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x301E + ,simpleLowerCaseMapping:0x301E + ,simpleTitleCaseMapping:0x301E + }, + { code:0x301F + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0x301F + ,simpleLowerCaseMapping:0x301F + ,simpleTitleCaseMapping:0x301F + }, + { code:0x3020 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3020 + ,simpleLowerCaseMapping:0x3020 + ,simpleTitleCaseMapping:0x3020 + }, + { code:0x3021 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x3021 + ,simpleLowerCaseMapping:0x3021 + ,simpleTitleCaseMapping:0x3021 + }, + { code:0x3022 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x3022 + ,simpleLowerCaseMapping:0x3022 + ,simpleTitleCaseMapping:0x3022 + }, + { code:0x3023 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x3023 + ,simpleLowerCaseMapping:0x3023 + ,simpleTitleCaseMapping:0x3023 + }, + { code:0x3024 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x3024 + ,simpleLowerCaseMapping:0x3024 + ,simpleTitleCaseMapping:0x3024 + }, + { code:0x3025 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x3025 + ,simpleLowerCaseMapping:0x3025 + ,simpleTitleCaseMapping:0x3025 + }, + { code:0x3026 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x3026 + ,simpleLowerCaseMapping:0x3026 + ,simpleTitleCaseMapping:0x3026 + }, + { code:0x3027 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x3027 + ,simpleLowerCaseMapping:0x3027 + ,simpleTitleCaseMapping:0x3027 + }, + { code:0x3028 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x3028 + ,simpleLowerCaseMapping:0x3028 + ,simpleTitleCaseMapping:0x3028 + }, + { code:0x3029 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x3029 + ,simpleLowerCaseMapping:0x3029 + ,simpleTitleCaseMapping:0x3029 + }, + { code:0x302A + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x302A + ,simpleLowerCaseMapping:0x302A + ,simpleTitleCaseMapping:0x302A + }, + { code:0x302B + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x302B + ,simpleLowerCaseMapping:0x302B + ,simpleTitleCaseMapping:0x302B + }, + { code:0x302C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x302C + ,simpleLowerCaseMapping:0x302C + ,simpleTitleCaseMapping:0x302C + }, + { code:0x302D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x302D + ,simpleLowerCaseMapping:0x302D + ,simpleTitleCaseMapping:0x302D + }, + { code:0x302E + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x302E + ,simpleLowerCaseMapping:0x302E + ,simpleTitleCaseMapping:0x302E + }, + { code:0x302F + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x302F + ,simpleLowerCaseMapping:0x302F + ,simpleTitleCaseMapping:0x302F + }, + { code:0x3030 + ,generalCategory:UnicodeData.GeneralCategory.Pd + ,simpleUpperCaseMapping:0x3030 + ,simpleLowerCaseMapping:0x3030 + ,simpleTitleCaseMapping:0x3030 + }, + { code:0x3031 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x3031 + ,simpleLowerCaseMapping:0x3031 + ,simpleTitleCaseMapping:0x3031 + }, + { code:0x3032 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x3032 + ,simpleLowerCaseMapping:0x3032 + ,simpleTitleCaseMapping:0x3032 + }, + { code:0x3033 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x3033 + ,simpleLowerCaseMapping:0x3033 + ,simpleTitleCaseMapping:0x3033 + }, + { code:0x3034 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x3034 + ,simpleLowerCaseMapping:0x3034 + ,simpleTitleCaseMapping:0x3034 + }, + { code:0x3035 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x3035 + ,simpleLowerCaseMapping:0x3035 + ,simpleTitleCaseMapping:0x3035 + }, + { code:0x3036 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3036 + ,simpleLowerCaseMapping:0x3036 + ,simpleTitleCaseMapping:0x3036 + }, + { code:0x3037 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3037 + ,simpleLowerCaseMapping:0x3037 + ,simpleTitleCaseMapping:0x3037 + }, + { code:0x3038 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x3038 + ,simpleLowerCaseMapping:0x3038 + ,simpleTitleCaseMapping:0x3038 + }, + { code:0x3039 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x3039 + ,simpleLowerCaseMapping:0x3039 + ,simpleTitleCaseMapping:0x3039 + }, + { code:0x303A + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x303A + ,simpleLowerCaseMapping:0x303A + ,simpleTitleCaseMapping:0x303A + }, + { code:0x303B + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x303B + ,simpleLowerCaseMapping:0x303B + ,simpleTitleCaseMapping:0x303B + }, + { code:0x303C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x303C + ,simpleLowerCaseMapping:0x303C + ,simpleTitleCaseMapping:0x303C + }, + { code:0x303D + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x303D + ,simpleLowerCaseMapping:0x303D + ,simpleTitleCaseMapping:0x303D + }, + { code:0x303E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x303E + ,simpleLowerCaseMapping:0x303E + ,simpleTitleCaseMapping:0x303E + }, + { code:0x303F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x303F + ,simpleLowerCaseMapping:0x303F + ,simpleTitleCaseMapping:0x303F + }, + { code:0x3041 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3041 + ,simpleLowerCaseMapping:0x3041 + ,simpleTitleCaseMapping:0x3041 + }, + { code:0x3042 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3042 + ,simpleLowerCaseMapping:0x3042 + ,simpleTitleCaseMapping:0x3042 + }, + { code:0x3043 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3043 + ,simpleLowerCaseMapping:0x3043 + ,simpleTitleCaseMapping:0x3043 + }, + { code:0x3044 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3044 + ,simpleLowerCaseMapping:0x3044 + ,simpleTitleCaseMapping:0x3044 + }, + { code:0x3045 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3045 + ,simpleLowerCaseMapping:0x3045 + ,simpleTitleCaseMapping:0x3045 + }, + { code:0x3046 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3046 + ,simpleLowerCaseMapping:0x3046 + ,simpleTitleCaseMapping:0x3046 + }, + { code:0x3047 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3047 + ,simpleLowerCaseMapping:0x3047 + ,simpleTitleCaseMapping:0x3047 + }, + { code:0x3048 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3048 + ,simpleLowerCaseMapping:0x3048 + ,simpleTitleCaseMapping:0x3048 + }, + { code:0x3049 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3049 + ,simpleLowerCaseMapping:0x3049 + ,simpleTitleCaseMapping:0x3049 + }, + { code:0x304A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x304A + ,simpleLowerCaseMapping:0x304A + ,simpleTitleCaseMapping:0x304A + }, + { code:0x304B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x304B + ,simpleLowerCaseMapping:0x304B + ,simpleTitleCaseMapping:0x304B + }, + { code:0x304C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x304C + ,simpleLowerCaseMapping:0x304C + ,simpleTitleCaseMapping:0x304C + }, + { code:0x304D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x304D + ,simpleLowerCaseMapping:0x304D + ,simpleTitleCaseMapping:0x304D + }, + { code:0x304E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x304E + ,simpleLowerCaseMapping:0x304E + ,simpleTitleCaseMapping:0x304E + }, + { code:0x304F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x304F + ,simpleLowerCaseMapping:0x304F + ,simpleTitleCaseMapping:0x304F + }, + { code:0x3050 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3050 + ,simpleLowerCaseMapping:0x3050 + ,simpleTitleCaseMapping:0x3050 + }, + { code:0x3051 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3051 + ,simpleLowerCaseMapping:0x3051 + ,simpleTitleCaseMapping:0x3051 + }, + { code:0x3052 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3052 + ,simpleLowerCaseMapping:0x3052 + ,simpleTitleCaseMapping:0x3052 + }, + { code:0x3053 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3053 + ,simpleLowerCaseMapping:0x3053 + ,simpleTitleCaseMapping:0x3053 + }, + { code:0x3054 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3054 + ,simpleLowerCaseMapping:0x3054 + ,simpleTitleCaseMapping:0x3054 + }, + { code:0x3055 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3055 + ,simpleLowerCaseMapping:0x3055 + ,simpleTitleCaseMapping:0x3055 + }, + { code:0x3056 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3056 + ,simpleLowerCaseMapping:0x3056 + ,simpleTitleCaseMapping:0x3056 + }, + { code:0x3057 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3057 + ,simpleLowerCaseMapping:0x3057 + ,simpleTitleCaseMapping:0x3057 + }, + { code:0x3058 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3058 + ,simpleLowerCaseMapping:0x3058 + ,simpleTitleCaseMapping:0x3058 + }, + { code:0x3059 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3059 + ,simpleLowerCaseMapping:0x3059 + ,simpleTitleCaseMapping:0x3059 + }, + { code:0x305A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x305A + ,simpleLowerCaseMapping:0x305A + ,simpleTitleCaseMapping:0x305A + }, + { code:0x305B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x305B + ,simpleLowerCaseMapping:0x305B + ,simpleTitleCaseMapping:0x305B + }, + { code:0x305C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x305C + ,simpleLowerCaseMapping:0x305C + ,simpleTitleCaseMapping:0x305C + }, + { code:0x305D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x305D + ,simpleLowerCaseMapping:0x305D + ,simpleTitleCaseMapping:0x305D + }, + { code:0x305E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x305E + ,simpleLowerCaseMapping:0x305E + ,simpleTitleCaseMapping:0x305E + }, + { code:0x305F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x305F + ,simpleLowerCaseMapping:0x305F + ,simpleTitleCaseMapping:0x305F + }, + { code:0x3060 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3060 + ,simpleLowerCaseMapping:0x3060 + ,simpleTitleCaseMapping:0x3060 + }, + { code:0x3061 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3061 + ,simpleLowerCaseMapping:0x3061 + ,simpleTitleCaseMapping:0x3061 + }, + { code:0x3062 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3062 + ,simpleLowerCaseMapping:0x3062 + ,simpleTitleCaseMapping:0x3062 + }, + { code:0x3063 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3063 + ,simpleLowerCaseMapping:0x3063 + ,simpleTitleCaseMapping:0x3063 + }, + { code:0x3064 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3064 + ,simpleLowerCaseMapping:0x3064 + ,simpleTitleCaseMapping:0x3064 + }, + { code:0x3065 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3065 + ,simpleLowerCaseMapping:0x3065 + ,simpleTitleCaseMapping:0x3065 + }, + { code:0x3066 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3066 + ,simpleLowerCaseMapping:0x3066 + ,simpleTitleCaseMapping:0x3066 + }, + { code:0x3067 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3067 + ,simpleLowerCaseMapping:0x3067 + ,simpleTitleCaseMapping:0x3067 + }, + { code:0x3068 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3068 + ,simpleLowerCaseMapping:0x3068 + ,simpleTitleCaseMapping:0x3068 + }, + { code:0x3069 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3069 + ,simpleLowerCaseMapping:0x3069 + ,simpleTitleCaseMapping:0x3069 + }, + { code:0x306A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x306A + ,simpleLowerCaseMapping:0x306A + ,simpleTitleCaseMapping:0x306A + }, + { code:0x306B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x306B + ,simpleLowerCaseMapping:0x306B + ,simpleTitleCaseMapping:0x306B + }, + { code:0x306C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x306C + ,simpleLowerCaseMapping:0x306C + ,simpleTitleCaseMapping:0x306C + }, + { code:0x306D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x306D + ,simpleLowerCaseMapping:0x306D + ,simpleTitleCaseMapping:0x306D + }, + { code:0x306E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x306E + ,simpleLowerCaseMapping:0x306E + ,simpleTitleCaseMapping:0x306E + }, + { code:0x306F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x306F + ,simpleLowerCaseMapping:0x306F + ,simpleTitleCaseMapping:0x306F + }, + { code:0x3070 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3070 + ,simpleLowerCaseMapping:0x3070 + ,simpleTitleCaseMapping:0x3070 + }, + { code:0x3071 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3071 + ,simpleLowerCaseMapping:0x3071 + ,simpleTitleCaseMapping:0x3071 + }, + { code:0x3072 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3072 + ,simpleLowerCaseMapping:0x3072 + ,simpleTitleCaseMapping:0x3072 + }, + { code:0x3073 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3073 + ,simpleLowerCaseMapping:0x3073 + ,simpleTitleCaseMapping:0x3073 + }, + { code:0x3074 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3074 + ,simpleLowerCaseMapping:0x3074 + ,simpleTitleCaseMapping:0x3074 + }, + { code:0x3075 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3075 + ,simpleLowerCaseMapping:0x3075 + ,simpleTitleCaseMapping:0x3075 + }, + { code:0x3076 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3076 + ,simpleLowerCaseMapping:0x3076 + ,simpleTitleCaseMapping:0x3076 + }, + { code:0x3077 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3077 + ,simpleLowerCaseMapping:0x3077 + ,simpleTitleCaseMapping:0x3077 + }, + { code:0x3078 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3078 + ,simpleLowerCaseMapping:0x3078 + ,simpleTitleCaseMapping:0x3078 + }, + { code:0x3079 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3079 + ,simpleLowerCaseMapping:0x3079 + ,simpleTitleCaseMapping:0x3079 + }, + { code:0x307A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x307A + ,simpleLowerCaseMapping:0x307A + ,simpleTitleCaseMapping:0x307A + }, + { code:0x307B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x307B + ,simpleLowerCaseMapping:0x307B + ,simpleTitleCaseMapping:0x307B + }, + { code:0x307C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x307C + ,simpleLowerCaseMapping:0x307C + ,simpleTitleCaseMapping:0x307C + }, + { code:0x307D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x307D + ,simpleLowerCaseMapping:0x307D + ,simpleTitleCaseMapping:0x307D + }, + { code:0x307E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x307E + ,simpleLowerCaseMapping:0x307E + ,simpleTitleCaseMapping:0x307E + }, + { code:0x307F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x307F + ,simpleLowerCaseMapping:0x307F + ,simpleTitleCaseMapping:0x307F + }, + { code:0x3080 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3080 + ,simpleLowerCaseMapping:0x3080 + ,simpleTitleCaseMapping:0x3080 + }, + { code:0x3081 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3081 + ,simpleLowerCaseMapping:0x3081 + ,simpleTitleCaseMapping:0x3081 + }, + { code:0x3082 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3082 + ,simpleLowerCaseMapping:0x3082 + ,simpleTitleCaseMapping:0x3082 + }, + { code:0x3083 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3083 + ,simpleLowerCaseMapping:0x3083 + ,simpleTitleCaseMapping:0x3083 + }, + { code:0x3084 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3084 + ,simpleLowerCaseMapping:0x3084 + ,simpleTitleCaseMapping:0x3084 + }, + { code:0x3085 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3085 + ,simpleLowerCaseMapping:0x3085 + ,simpleTitleCaseMapping:0x3085 + }, + { code:0x3086 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3086 + ,simpleLowerCaseMapping:0x3086 + ,simpleTitleCaseMapping:0x3086 + }, + { code:0x3087 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3087 + ,simpleLowerCaseMapping:0x3087 + ,simpleTitleCaseMapping:0x3087 + }, + { code:0x3088 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3088 + ,simpleLowerCaseMapping:0x3088 + ,simpleTitleCaseMapping:0x3088 + }, + { code:0x3089 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3089 + ,simpleLowerCaseMapping:0x3089 + ,simpleTitleCaseMapping:0x3089 + }, + { code:0x308A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x308A + ,simpleLowerCaseMapping:0x308A + ,simpleTitleCaseMapping:0x308A + }, + { code:0x308B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x308B + ,simpleLowerCaseMapping:0x308B + ,simpleTitleCaseMapping:0x308B + }, + { code:0x308C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x308C + ,simpleLowerCaseMapping:0x308C + ,simpleTitleCaseMapping:0x308C + }, + { code:0x308D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x308D + ,simpleLowerCaseMapping:0x308D + ,simpleTitleCaseMapping:0x308D + }, + { code:0x308E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x308E + ,simpleLowerCaseMapping:0x308E + ,simpleTitleCaseMapping:0x308E + }, + { code:0x308F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x308F + ,simpleLowerCaseMapping:0x308F + ,simpleTitleCaseMapping:0x308F + }, + { code:0x3090 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3090 + ,simpleLowerCaseMapping:0x3090 + ,simpleTitleCaseMapping:0x3090 + }, + { code:0x3091 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3091 + ,simpleLowerCaseMapping:0x3091 + ,simpleTitleCaseMapping:0x3091 + }, + { code:0x3092 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3092 + ,simpleLowerCaseMapping:0x3092 + ,simpleTitleCaseMapping:0x3092 + }, + { code:0x3093 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3093 + ,simpleLowerCaseMapping:0x3093 + ,simpleTitleCaseMapping:0x3093 + }, + { code:0x3094 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3094 + ,simpleLowerCaseMapping:0x3094 + ,simpleTitleCaseMapping:0x3094 + }, + { code:0x3095 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3095 + ,simpleLowerCaseMapping:0x3095 + ,simpleTitleCaseMapping:0x3095 + }, + { code:0x3096 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3096 + ,simpleLowerCaseMapping:0x3096 + ,simpleTitleCaseMapping:0x3096 + }, + { code:0x3099 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x3099 + ,simpleLowerCaseMapping:0x3099 + ,simpleTitleCaseMapping:0x3099 + }, + { code:0x309A + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x309A + ,simpleLowerCaseMapping:0x309A + ,simpleTitleCaseMapping:0x309A + }, + { code:0x309B + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x309B + ,simpleLowerCaseMapping:0x309B + ,simpleTitleCaseMapping:0x309B + }, + { code:0x309C + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0x309C + ,simpleLowerCaseMapping:0x309C + ,simpleTitleCaseMapping:0x309C + }, + { code:0x309D + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x309D + ,simpleLowerCaseMapping:0x309D + ,simpleTitleCaseMapping:0x309D + }, + { code:0x309E + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x309E + ,simpleLowerCaseMapping:0x309E + ,simpleTitleCaseMapping:0x309E + }, + { code:0x309F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x309F + ,simpleLowerCaseMapping:0x309F + ,simpleTitleCaseMapping:0x309F + }, + { code:0x30A0 + ,generalCategory:UnicodeData.GeneralCategory.Pd + ,simpleUpperCaseMapping:0x30A0 + ,simpleLowerCaseMapping:0x30A0 + ,simpleTitleCaseMapping:0x30A0 + }, + { code:0x30A1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30A1 + ,simpleLowerCaseMapping:0x30A1 + ,simpleTitleCaseMapping:0x30A1 + }, + { code:0x30A2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30A2 + ,simpleLowerCaseMapping:0x30A2 + ,simpleTitleCaseMapping:0x30A2 + }, + { code:0x30A3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30A3 + ,simpleLowerCaseMapping:0x30A3 + ,simpleTitleCaseMapping:0x30A3 + }, + { code:0x30A4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30A4 + ,simpleLowerCaseMapping:0x30A4 + ,simpleTitleCaseMapping:0x30A4 + }, + { code:0x30A5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30A5 + ,simpleLowerCaseMapping:0x30A5 + ,simpleTitleCaseMapping:0x30A5 + }, + { code:0x30A6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30A6 + ,simpleLowerCaseMapping:0x30A6 + ,simpleTitleCaseMapping:0x30A6 + }, + { code:0x30A7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30A7 + ,simpleLowerCaseMapping:0x30A7 + ,simpleTitleCaseMapping:0x30A7 + }, + { code:0x30A8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30A8 + ,simpleLowerCaseMapping:0x30A8 + ,simpleTitleCaseMapping:0x30A8 + }, + { code:0x30A9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30A9 + ,simpleLowerCaseMapping:0x30A9 + ,simpleTitleCaseMapping:0x30A9 + }, + { code:0x30AA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30AA + ,simpleLowerCaseMapping:0x30AA + ,simpleTitleCaseMapping:0x30AA + }, + { code:0x30AB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30AB + ,simpleLowerCaseMapping:0x30AB + ,simpleTitleCaseMapping:0x30AB + }, + { code:0x30AC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30AC + ,simpleLowerCaseMapping:0x30AC + ,simpleTitleCaseMapping:0x30AC + }, + { code:0x30AD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30AD + ,simpleLowerCaseMapping:0x30AD + ,simpleTitleCaseMapping:0x30AD + }, + { code:0x30AE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30AE + ,simpleLowerCaseMapping:0x30AE + ,simpleTitleCaseMapping:0x30AE + }, + { code:0x30AF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30AF + ,simpleLowerCaseMapping:0x30AF + ,simpleTitleCaseMapping:0x30AF + }, + { code:0x30B0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30B0 + ,simpleLowerCaseMapping:0x30B0 + ,simpleTitleCaseMapping:0x30B0 + }, + { code:0x30B1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30B1 + ,simpleLowerCaseMapping:0x30B1 + ,simpleTitleCaseMapping:0x30B1 + }, + { code:0x30B2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30B2 + ,simpleLowerCaseMapping:0x30B2 + ,simpleTitleCaseMapping:0x30B2 + }, + { code:0x30B3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30B3 + ,simpleLowerCaseMapping:0x30B3 + ,simpleTitleCaseMapping:0x30B3 + }, + { code:0x30B4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30B4 + ,simpleLowerCaseMapping:0x30B4 + ,simpleTitleCaseMapping:0x30B4 + }, + { code:0x30B5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30B5 + ,simpleLowerCaseMapping:0x30B5 + ,simpleTitleCaseMapping:0x30B5 + }, + { code:0x30B6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30B6 + ,simpleLowerCaseMapping:0x30B6 + ,simpleTitleCaseMapping:0x30B6 + }, + { code:0x30B7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30B7 + ,simpleLowerCaseMapping:0x30B7 + ,simpleTitleCaseMapping:0x30B7 + }, + { code:0x30B8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30B8 + ,simpleLowerCaseMapping:0x30B8 + ,simpleTitleCaseMapping:0x30B8 + }, + { code:0x30B9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30B9 + ,simpleLowerCaseMapping:0x30B9 + ,simpleTitleCaseMapping:0x30B9 + }, + { code:0x30BA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30BA + ,simpleLowerCaseMapping:0x30BA + ,simpleTitleCaseMapping:0x30BA + }, + { code:0x30BB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30BB + ,simpleLowerCaseMapping:0x30BB + ,simpleTitleCaseMapping:0x30BB + }, + { code:0x30BC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30BC + ,simpleLowerCaseMapping:0x30BC + ,simpleTitleCaseMapping:0x30BC + }, + { code:0x30BD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30BD + ,simpleLowerCaseMapping:0x30BD + ,simpleTitleCaseMapping:0x30BD + }, + { code:0x30BE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30BE + ,simpleLowerCaseMapping:0x30BE + ,simpleTitleCaseMapping:0x30BE + }, + { code:0x30BF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30BF + ,simpleLowerCaseMapping:0x30BF + ,simpleTitleCaseMapping:0x30BF + }, + { code:0x30C0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30C0 + ,simpleLowerCaseMapping:0x30C0 + ,simpleTitleCaseMapping:0x30C0 + }, + { code:0x30C1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30C1 + ,simpleLowerCaseMapping:0x30C1 + ,simpleTitleCaseMapping:0x30C1 + }, + { code:0x30C2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30C2 + ,simpleLowerCaseMapping:0x30C2 + ,simpleTitleCaseMapping:0x30C2 + }, + { code:0x30C3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30C3 + ,simpleLowerCaseMapping:0x30C3 + ,simpleTitleCaseMapping:0x30C3 + }, + { code:0x30C4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30C4 + ,simpleLowerCaseMapping:0x30C4 + ,simpleTitleCaseMapping:0x30C4 + }, + { code:0x30C5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30C5 + ,simpleLowerCaseMapping:0x30C5 + ,simpleTitleCaseMapping:0x30C5 + }, + { code:0x30C6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30C6 + ,simpleLowerCaseMapping:0x30C6 + ,simpleTitleCaseMapping:0x30C6 + }, + { code:0x30C7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30C7 + ,simpleLowerCaseMapping:0x30C7 + ,simpleTitleCaseMapping:0x30C7 + }, + { code:0x30C8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30C8 + ,simpleLowerCaseMapping:0x30C8 + ,simpleTitleCaseMapping:0x30C8 + }, + { code:0x30C9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30C9 + ,simpleLowerCaseMapping:0x30C9 + ,simpleTitleCaseMapping:0x30C9 + }, + { code:0x30CA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30CA + ,simpleLowerCaseMapping:0x30CA + ,simpleTitleCaseMapping:0x30CA + }, + { code:0x30CB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30CB + ,simpleLowerCaseMapping:0x30CB + ,simpleTitleCaseMapping:0x30CB + }, + { code:0x30CC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30CC + ,simpleLowerCaseMapping:0x30CC + ,simpleTitleCaseMapping:0x30CC + }, + { code:0x30CD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30CD + ,simpleLowerCaseMapping:0x30CD + ,simpleTitleCaseMapping:0x30CD + }, + { code:0x30CE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30CE + ,simpleLowerCaseMapping:0x30CE + ,simpleTitleCaseMapping:0x30CE + }, + { code:0x30CF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30CF + ,simpleLowerCaseMapping:0x30CF + ,simpleTitleCaseMapping:0x30CF + }, + { code:0x30D0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30D0 + ,simpleLowerCaseMapping:0x30D0 + ,simpleTitleCaseMapping:0x30D0 + }, + { code:0x30D1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30D1 + ,simpleLowerCaseMapping:0x30D1 + ,simpleTitleCaseMapping:0x30D1 + }, + { code:0x30D2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30D2 + ,simpleLowerCaseMapping:0x30D2 + ,simpleTitleCaseMapping:0x30D2 + }, + { code:0x30D3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30D3 + ,simpleLowerCaseMapping:0x30D3 + ,simpleTitleCaseMapping:0x30D3 + }, + { code:0x30D4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30D4 + ,simpleLowerCaseMapping:0x30D4 + ,simpleTitleCaseMapping:0x30D4 + }, + { code:0x30D5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30D5 + ,simpleLowerCaseMapping:0x30D5 + ,simpleTitleCaseMapping:0x30D5 + }, + { code:0x30D6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30D6 + ,simpleLowerCaseMapping:0x30D6 + ,simpleTitleCaseMapping:0x30D6 + }, + { code:0x30D7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30D7 + ,simpleLowerCaseMapping:0x30D7 + ,simpleTitleCaseMapping:0x30D7 + }, + { code:0x30D8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30D8 + ,simpleLowerCaseMapping:0x30D8 + ,simpleTitleCaseMapping:0x30D8 + }, + { code:0x30D9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30D9 + ,simpleLowerCaseMapping:0x30D9 + ,simpleTitleCaseMapping:0x30D9 + }, + { code:0x30DA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30DA + ,simpleLowerCaseMapping:0x30DA + ,simpleTitleCaseMapping:0x30DA + }, + { code:0x30DB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30DB + ,simpleLowerCaseMapping:0x30DB + ,simpleTitleCaseMapping:0x30DB + }, + { code:0x30DC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30DC + ,simpleLowerCaseMapping:0x30DC + ,simpleTitleCaseMapping:0x30DC + }, + { code:0x30DD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30DD + ,simpleLowerCaseMapping:0x30DD + ,simpleTitleCaseMapping:0x30DD + }, + { code:0x30DE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30DE + ,simpleLowerCaseMapping:0x30DE + ,simpleTitleCaseMapping:0x30DE + }, + { code:0x30DF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30DF + ,simpleLowerCaseMapping:0x30DF + ,simpleTitleCaseMapping:0x30DF + }, + { code:0x30E0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30E0 + ,simpleLowerCaseMapping:0x30E0 + ,simpleTitleCaseMapping:0x30E0 + }, + { code:0x30E1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30E1 + ,simpleLowerCaseMapping:0x30E1 + ,simpleTitleCaseMapping:0x30E1 + }, + { code:0x30E2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30E2 + ,simpleLowerCaseMapping:0x30E2 + ,simpleTitleCaseMapping:0x30E2 + }, + { code:0x30E3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30E3 + ,simpleLowerCaseMapping:0x30E3 + ,simpleTitleCaseMapping:0x30E3 + }, + { code:0x30E4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30E4 + ,simpleLowerCaseMapping:0x30E4 + ,simpleTitleCaseMapping:0x30E4 + }, + { code:0x30E5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30E5 + ,simpleLowerCaseMapping:0x30E5 + ,simpleTitleCaseMapping:0x30E5 + }, + { code:0x30E6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30E6 + ,simpleLowerCaseMapping:0x30E6 + ,simpleTitleCaseMapping:0x30E6 + }, + { code:0x30E7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30E7 + ,simpleLowerCaseMapping:0x30E7 + ,simpleTitleCaseMapping:0x30E7 + }, + { code:0x30E8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30E8 + ,simpleLowerCaseMapping:0x30E8 + ,simpleTitleCaseMapping:0x30E8 + }, + { code:0x30E9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30E9 + ,simpleLowerCaseMapping:0x30E9 + ,simpleTitleCaseMapping:0x30E9 + }, + { code:0x30EA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30EA + ,simpleLowerCaseMapping:0x30EA + ,simpleTitleCaseMapping:0x30EA + }, + { code:0x30EB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30EB + ,simpleLowerCaseMapping:0x30EB + ,simpleTitleCaseMapping:0x30EB + }, + { code:0x30EC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30EC + ,simpleLowerCaseMapping:0x30EC + ,simpleTitleCaseMapping:0x30EC + }, + { code:0x30ED + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30ED + ,simpleLowerCaseMapping:0x30ED + ,simpleTitleCaseMapping:0x30ED + }, + { code:0x30EE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30EE + ,simpleLowerCaseMapping:0x30EE + ,simpleTitleCaseMapping:0x30EE + }, + { code:0x30EF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30EF + ,simpleLowerCaseMapping:0x30EF + ,simpleTitleCaseMapping:0x30EF + }, + { code:0x30F0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30F0 + ,simpleLowerCaseMapping:0x30F0 + ,simpleTitleCaseMapping:0x30F0 + }, + { code:0x30F1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30F1 + ,simpleLowerCaseMapping:0x30F1 + ,simpleTitleCaseMapping:0x30F1 + }, + { code:0x30F2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30F2 + ,simpleLowerCaseMapping:0x30F2 + ,simpleTitleCaseMapping:0x30F2 + }, + { code:0x30F3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30F3 + ,simpleLowerCaseMapping:0x30F3 + ,simpleTitleCaseMapping:0x30F3 + }, + { code:0x30F4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30F4 + ,simpleLowerCaseMapping:0x30F4 + ,simpleTitleCaseMapping:0x30F4 + }, + { code:0x30F5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30F5 + ,simpleLowerCaseMapping:0x30F5 + ,simpleTitleCaseMapping:0x30F5 + }, + { code:0x30F6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30F6 + ,simpleLowerCaseMapping:0x30F6 + ,simpleTitleCaseMapping:0x30F6 + }, + { code:0x30F7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30F7 + ,simpleLowerCaseMapping:0x30F7 + ,simpleTitleCaseMapping:0x30F7 + }, + { code:0x30F8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30F8 + ,simpleLowerCaseMapping:0x30F8 + ,simpleTitleCaseMapping:0x30F8 + }, + { code:0x30F9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30F9 + ,simpleLowerCaseMapping:0x30F9 + ,simpleTitleCaseMapping:0x30F9 + }, + { code:0x30FA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30FA + ,simpleLowerCaseMapping:0x30FA + ,simpleTitleCaseMapping:0x30FA + }, + { code:0x30FB + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x30FB + ,simpleLowerCaseMapping:0x30FB + ,simpleTitleCaseMapping:0x30FB + }, + { code:0x30FC + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x30FC + ,simpleLowerCaseMapping:0x30FC + ,simpleTitleCaseMapping:0x30FC + }, + { code:0x30FD + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x30FD + ,simpleLowerCaseMapping:0x30FD + ,simpleTitleCaseMapping:0x30FD + }, + { code:0x30FE + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0x30FE + ,simpleLowerCaseMapping:0x30FE + ,simpleTitleCaseMapping:0x30FE + }, + { code:0x30FF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x30FF + ,simpleLowerCaseMapping:0x30FF + ,simpleTitleCaseMapping:0x30FF + }, + { code:0x3105 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3105 + ,simpleLowerCaseMapping:0x3105 + ,simpleTitleCaseMapping:0x3105 + }, + { code:0x3106 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3106 + ,simpleLowerCaseMapping:0x3106 + ,simpleTitleCaseMapping:0x3106 + }, + { code:0x3107 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3107 + ,simpleLowerCaseMapping:0x3107 + ,simpleTitleCaseMapping:0x3107 + }, + { code:0x3108 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3108 + ,simpleLowerCaseMapping:0x3108 + ,simpleTitleCaseMapping:0x3108 + }, + { code:0x3109 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3109 + ,simpleLowerCaseMapping:0x3109 + ,simpleTitleCaseMapping:0x3109 + }, + { code:0x310A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x310A + ,simpleLowerCaseMapping:0x310A + ,simpleTitleCaseMapping:0x310A + }, + { code:0x310B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x310B + ,simpleLowerCaseMapping:0x310B + ,simpleTitleCaseMapping:0x310B + }, + { code:0x310C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x310C + ,simpleLowerCaseMapping:0x310C + ,simpleTitleCaseMapping:0x310C + }, + { code:0x310D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x310D + ,simpleLowerCaseMapping:0x310D + ,simpleTitleCaseMapping:0x310D + }, + { code:0x310E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x310E + ,simpleLowerCaseMapping:0x310E + ,simpleTitleCaseMapping:0x310E + }, + { code:0x310F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x310F + ,simpleLowerCaseMapping:0x310F + ,simpleTitleCaseMapping:0x310F + }, + { code:0x3110 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3110 + ,simpleLowerCaseMapping:0x3110 + ,simpleTitleCaseMapping:0x3110 + }, + { code:0x3111 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3111 + ,simpleLowerCaseMapping:0x3111 + ,simpleTitleCaseMapping:0x3111 + }, + { code:0x3112 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3112 + ,simpleLowerCaseMapping:0x3112 + ,simpleTitleCaseMapping:0x3112 + }, + { code:0x3113 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3113 + ,simpleLowerCaseMapping:0x3113 + ,simpleTitleCaseMapping:0x3113 + }, + { code:0x3114 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3114 + ,simpleLowerCaseMapping:0x3114 + ,simpleTitleCaseMapping:0x3114 + }, + { code:0x3115 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3115 + ,simpleLowerCaseMapping:0x3115 + ,simpleTitleCaseMapping:0x3115 + }, + { code:0x3116 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3116 + ,simpleLowerCaseMapping:0x3116 + ,simpleTitleCaseMapping:0x3116 + }, + { code:0x3117 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3117 + ,simpleLowerCaseMapping:0x3117 + ,simpleTitleCaseMapping:0x3117 + }, + { code:0x3118 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3118 + ,simpleLowerCaseMapping:0x3118 + ,simpleTitleCaseMapping:0x3118 + }, + { code:0x3119 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3119 + ,simpleLowerCaseMapping:0x3119 + ,simpleTitleCaseMapping:0x3119 + }, + { code:0x311A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x311A + ,simpleLowerCaseMapping:0x311A + ,simpleTitleCaseMapping:0x311A + }, + { code:0x311B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x311B + ,simpleLowerCaseMapping:0x311B + ,simpleTitleCaseMapping:0x311B + }, + { code:0x311C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x311C + ,simpleLowerCaseMapping:0x311C + ,simpleTitleCaseMapping:0x311C + }, + { code:0x311D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x311D + ,simpleLowerCaseMapping:0x311D + ,simpleTitleCaseMapping:0x311D + }, + { code:0x311E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x311E + ,simpleLowerCaseMapping:0x311E + ,simpleTitleCaseMapping:0x311E + }, + { code:0x311F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x311F + ,simpleLowerCaseMapping:0x311F + ,simpleTitleCaseMapping:0x311F + }, + { code:0x3120 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3120 + ,simpleLowerCaseMapping:0x3120 + ,simpleTitleCaseMapping:0x3120 + }, + { code:0x3121 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3121 + ,simpleLowerCaseMapping:0x3121 + ,simpleTitleCaseMapping:0x3121 + }, + { code:0x3122 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3122 + ,simpleLowerCaseMapping:0x3122 + ,simpleTitleCaseMapping:0x3122 + }, + { code:0x3123 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3123 + ,simpleLowerCaseMapping:0x3123 + ,simpleTitleCaseMapping:0x3123 + }, + { code:0x3124 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3124 + ,simpleLowerCaseMapping:0x3124 + ,simpleTitleCaseMapping:0x3124 + }, + { code:0x3125 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3125 + ,simpleLowerCaseMapping:0x3125 + ,simpleTitleCaseMapping:0x3125 + }, + { code:0x3126 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3126 + ,simpleLowerCaseMapping:0x3126 + ,simpleTitleCaseMapping:0x3126 + }, + { code:0x3127 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3127 + ,simpleLowerCaseMapping:0x3127 + ,simpleTitleCaseMapping:0x3127 + }, + { code:0x3128 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3128 + ,simpleLowerCaseMapping:0x3128 + ,simpleTitleCaseMapping:0x3128 + }, + { code:0x3129 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3129 + ,simpleLowerCaseMapping:0x3129 + ,simpleTitleCaseMapping:0x3129 + }, + { code:0x312A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x312A + ,simpleLowerCaseMapping:0x312A + ,simpleTitleCaseMapping:0x312A + }, + { code:0x312B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x312B + ,simpleLowerCaseMapping:0x312B + ,simpleTitleCaseMapping:0x312B + }, + { code:0x312C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x312C + ,simpleLowerCaseMapping:0x312C + ,simpleTitleCaseMapping:0x312C + }, + { code:0x3131 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3131 + ,simpleLowerCaseMapping:0x3131 + ,simpleTitleCaseMapping:0x3131 + }, + { code:0x3132 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3132 + ,simpleLowerCaseMapping:0x3132 + ,simpleTitleCaseMapping:0x3132 + }, + { code:0x3133 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3133 + ,simpleLowerCaseMapping:0x3133 + ,simpleTitleCaseMapping:0x3133 + }, + { code:0x3134 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3134 + ,simpleLowerCaseMapping:0x3134 + ,simpleTitleCaseMapping:0x3134 + }, + { code:0x3135 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3135 + ,simpleLowerCaseMapping:0x3135 + ,simpleTitleCaseMapping:0x3135 + }, + { code:0x3136 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3136 + ,simpleLowerCaseMapping:0x3136 + ,simpleTitleCaseMapping:0x3136 + }, + { code:0x3137 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3137 + ,simpleLowerCaseMapping:0x3137 + ,simpleTitleCaseMapping:0x3137 + }, + { code:0x3138 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3138 + ,simpleLowerCaseMapping:0x3138 + ,simpleTitleCaseMapping:0x3138 + }, + { code:0x3139 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3139 + ,simpleLowerCaseMapping:0x3139 + ,simpleTitleCaseMapping:0x3139 + }, + { code:0x313A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x313A + ,simpleLowerCaseMapping:0x313A + ,simpleTitleCaseMapping:0x313A + }, + { code:0x313B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x313B + ,simpleLowerCaseMapping:0x313B + ,simpleTitleCaseMapping:0x313B + }, + { code:0x313C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x313C + ,simpleLowerCaseMapping:0x313C + ,simpleTitleCaseMapping:0x313C + }, + { code:0x313D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x313D + ,simpleLowerCaseMapping:0x313D + ,simpleTitleCaseMapping:0x313D + }, + { code:0x313E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x313E + ,simpleLowerCaseMapping:0x313E + ,simpleTitleCaseMapping:0x313E + }, + { code:0x313F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x313F + ,simpleLowerCaseMapping:0x313F + ,simpleTitleCaseMapping:0x313F + }, + { code:0x3140 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3140 + ,simpleLowerCaseMapping:0x3140 + ,simpleTitleCaseMapping:0x3140 + }, + { code:0x3141 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3141 + ,simpleLowerCaseMapping:0x3141 + ,simpleTitleCaseMapping:0x3141 + }, + { code:0x3142 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3142 + ,simpleLowerCaseMapping:0x3142 + ,simpleTitleCaseMapping:0x3142 + }, + { code:0x3143 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3143 + ,simpleLowerCaseMapping:0x3143 + ,simpleTitleCaseMapping:0x3143 + }, + { code:0x3144 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3144 + ,simpleLowerCaseMapping:0x3144 + ,simpleTitleCaseMapping:0x3144 + }, + { code:0x3145 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3145 + ,simpleLowerCaseMapping:0x3145 + ,simpleTitleCaseMapping:0x3145 + }, + { code:0x3146 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3146 + ,simpleLowerCaseMapping:0x3146 + ,simpleTitleCaseMapping:0x3146 + }, + { code:0x3147 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3147 + ,simpleLowerCaseMapping:0x3147 + ,simpleTitleCaseMapping:0x3147 + }, + { code:0x3148 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3148 + ,simpleLowerCaseMapping:0x3148 + ,simpleTitleCaseMapping:0x3148 + }, + { code:0x3149 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3149 + ,simpleLowerCaseMapping:0x3149 + ,simpleTitleCaseMapping:0x3149 + }, + { code:0x314A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x314A + ,simpleLowerCaseMapping:0x314A + ,simpleTitleCaseMapping:0x314A + }, + { code:0x314B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x314B + ,simpleLowerCaseMapping:0x314B + ,simpleTitleCaseMapping:0x314B + }, + { code:0x314C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x314C + ,simpleLowerCaseMapping:0x314C + ,simpleTitleCaseMapping:0x314C + }, + { code:0x314D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x314D + ,simpleLowerCaseMapping:0x314D + ,simpleTitleCaseMapping:0x314D + }, + { code:0x314E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x314E + ,simpleLowerCaseMapping:0x314E + ,simpleTitleCaseMapping:0x314E + }, + { code:0x314F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x314F + ,simpleLowerCaseMapping:0x314F + ,simpleTitleCaseMapping:0x314F + }, + { code:0x3150 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3150 + ,simpleLowerCaseMapping:0x3150 + ,simpleTitleCaseMapping:0x3150 + }, + { code:0x3151 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3151 + ,simpleLowerCaseMapping:0x3151 + ,simpleTitleCaseMapping:0x3151 + }, + { code:0x3152 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3152 + ,simpleLowerCaseMapping:0x3152 + ,simpleTitleCaseMapping:0x3152 + }, + { code:0x3153 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3153 + ,simpleLowerCaseMapping:0x3153 + ,simpleTitleCaseMapping:0x3153 + }, + { code:0x3154 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3154 + ,simpleLowerCaseMapping:0x3154 + ,simpleTitleCaseMapping:0x3154 + }, + { code:0x3155 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3155 + ,simpleLowerCaseMapping:0x3155 + ,simpleTitleCaseMapping:0x3155 + }, + { code:0x3156 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3156 + ,simpleLowerCaseMapping:0x3156 + ,simpleTitleCaseMapping:0x3156 + }, + { code:0x3157 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3157 + ,simpleLowerCaseMapping:0x3157 + ,simpleTitleCaseMapping:0x3157 + }, + { code:0x3158 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3158 + ,simpleLowerCaseMapping:0x3158 + ,simpleTitleCaseMapping:0x3158 + }, + { code:0x3159 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3159 + ,simpleLowerCaseMapping:0x3159 + ,simpleTitleCaseMapping:0x3159 + }, + { code:0x315A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x315A + ,simpleLowerCaseMapping:0x315A + ,simpleTitleCaseMapping:0x315A + }, + { code:0x315B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x315B + ,simpleLowerCaseMapping:0x315B + ,simpleTitleCaseMapping:0x315B + }, + { code:0x315C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x315C + ,simpleLowerCaseMapping:0x315C + ,simpleTitleCaseMapping:0x315C + }, + { code:0x315D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x315D + ,simpleLowerCaseMapping:0x315D + ,simpleTitleCaseMapping:0x315D + }, + { code:0x315E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x315E + ,simpleLowerCaseMapping:0x315E + ,simpleTitleCaseMapping:0x315E + }, + { code:0x315F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x315F + ,simpleLowerCaseMapping:0x315F + ,simpleTitleCaseMapping:0x315F + }, + { code:0x3160 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3160 + ,simpleLowerCaseMapping:0x3160 + ,simpleTitleCaseMapping:0x3160 + }, + { code:0x3161 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3161 + ,simpleLowerCaseMapping:0x3161 + ,simpleTitleCaseMapping:0x3161 + }, + { code:0x3162 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3162 + ,simpleLowerCaseMapping:0x3162 + ,simpleTitleCaseMapping:0x3162 + }, + { code:0x3163 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3163 + ,simpleLowerCaseMapping:0x3163 + ,simpleTitleCaseMapping:0x3163 + }, + { code:0x3164 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3164 + ,simpleLowerCaseMapping:0x3164 + ,simpleTitleCaseMapping:0x3164 + }, + { code:0x3165 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3165 + ,simpleLowerCaseMapping:0x3165 + ,simpleTitleCaseMapping:0x3165 + }, + { code:0x3166 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3166 + ,simpleLowerCaseMapping:0x3166 + ,simpleTitleCaseMapping:0x3166 + }, + { code:0x3167 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3167 + ,simpleLowerCaseMapping:0x3167 + ,simpleTitleCaseMapping:0x3167 + }, + { code:0x3168 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3168 + ,simpleLowerCaseMapping:0x3168 + ,simpleTitleCaseMapping:0x3168 + }, + { code:0x3169 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3169 + ,simpleLowerCaseMapping:0x3169 + ,simpleTitleCaseMapping:0x3169 + }, + { code:0x316A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x316A + ,simpleLowerCaseMapping:0x316A + ,simpleTitleCaseMapping:0x316A + }, + { code:0x316B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x316B + ,simpleLowerCaseMapping:0x316B + ,simpleTitleCaseMapping:0x316B + }, + { code:0x316C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x316C + ,simpleLowerCaseMapping:0x316C + ,simpleTitleCaseMapping:0x316C + }, + { code:0x316D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x316D + ,simpleLowerCaseMapping:0x316D + ,simpleTitleCaseMapping:0x316D + }, + { code:0x316E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x316E + ,simpleLowerCaseMapping:0x316E + ,simpleTitleCaseMapping:0x316E + }, + { code:0x316F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x316F + ,simpleLowerCaseMapping:0x316F + ,simpleTitleCaseMapping:0x316F + }, + { code:0x3170 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3170 + ,simpleLowerCaseMapping:0x3170 + ,simpleTitleCaseMapping:0x3170 + }, + { code:0x3171 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3171 + ,simpleLowerCaseMapping:0x3171 + ,simpleTitleCaseMapping:0x3171 + }, + { code:0x3172 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3172 + ,simpleLowerCaseMapping:0x3172 + ,simpleTitleCaseMapping:0x3172 + }, + { code:0x3173 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3173 + ,simpleLowerCaseMapping:0x3173 + ,simpleTitleCaseMapping:0x3173 + }, + { code:0x3174 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3174 + ,simpleLowerCaseMapping:0x3174 + ,simpleTitleCaseMapping:0x3174 + }, + { code:0x3175 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3175 + ,simpleLowerCaseMapping:0x3175 + ,simpleTitleCaseMapping:0x3175 + }, + { code:0x3176 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3176 + ,simpleLowerCaseMapping:0x3176 + ,simpleTitleCaseMapping:0x3176 + }, + { code:0x3177 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3177 + ,simpleLowerCaseMapping:0x3177 + ,simpleTitleCaseMapping:0x3177 + }, + { code:0x3178 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3178 + ,simpleLowerCaseMapping:0x3178 + ,simpleTitleCaseMapping:0x3178 + }, + { code:0x3179 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3179 + ,simpleLowerCaseMapping:0x3179 + ,simpleTitleCaseMapping:0x3179 + }, + { code:0x317A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x317A + ,simpleLowerCaseMapping:0x317A + ,simpleTitleCaseMapping:0x317A + }, + { code:0x317B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x317B + ,simpleLowerCaseMapping:0x317B + ,simpleTitleCaseMapping:0x317B + }, + { code:0x317C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x317C + ,simpleLowerCaseMapping:0x317C + ,simpleTitleCaseMapping:0x317C + }, + { code:0x317D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x317D + ,simpleLowerCaseMapping:0x317D + ,simpleTitleCaseMapping:0x317D + }, + { code:0x317E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x317E + ,simpleLowerCaseMapping:0x317E + ,simpleTitleCaseMapping:0x317E + }, + { code:0x317F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x317F + ,simpleLowerCaseMapping:0x317F + ,simpleTitleCaseMapping:0x317F + }, + { code:0x3180 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3180 + ,simpleLowerCaseMapping:0x3180 + ,simpleTitleCaseMapping:0x3180 + }, + { code:0x3181 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3181 + ,simpleLowerCaseMapping:0x3181 + ,simpleTitleCaseMapping:0x3181 + }, + { code:0x3182 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3182 + ,simpleLowerCaseMapping:0x3182 + ,simpleTitleCaseMapping:0x3182 + }, + { code:0x3183 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3183 + ,simpleLowerCaseMapping:0x3183 + ,simpleTitleCaseMapping:0x3183 + }, + { code:0x3184 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3184 + ,simpleLowerCaseMapping:0x3184 + ,simpleTitleCaseMapping:0x3184 + }, + { code:0x3185 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3185 + ,simpleLowerCaseMapping:0x3185 + ,simpleTitleCaseMapping:0x3185 + }, + { code:0x3186 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3186 + ,simpleLowerCaseMapping:0x3186 + ,simpleTitleCaseMapping:0x3186 + }, + { code:0x3187 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3187 + ,simpleLowerCaseMapping:0x3187 + ,simpleTitleCaseMapping:0x3187 + }, + { code:0x3188 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3188 + ,simpleLowerCaseMapping:0x3188 + ,simpleTitleCaseMapping:0x3188 + }, + { code:0x3189 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3189 + ,simpleLowerCaseMapping:0x3189 + ,simpleTitleCaseMapping:0x3189 + }, + { code:0x318A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x318A + ,simpleLowerCaseMapping:0x318A + ,simpleTitleCaseMapping:0x318A + }, + { code:0x318B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x318B + ,simpleLowerCaseMapping:0x318B + ,simpleTitleCaseMapping:0x318B + }, + { code:0x318C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x318C + ,simpleLowerCaseMapping:0x318C + ,simpleTitleCaseMapping:0x318C + }, + { code:0x318D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x318D + ,simpleLowerCaseMapping:0x318D + ,simpleTitleCaseMapping:0x318D + }, + { code:0x318E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x318E + ,simpleLowerCaseMapping:0x318E + ,simpleTitleCaseMapping:0x318E + }, + { code:0x3190 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3190 + ,simpleLowerCaseMapping:0x3190 + ,simpleTitleCaseMapping:0x3190 + }, + { code:0x3191 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3191 + ,simpleLowerCaseMapping:0x3191 + ,simpleTitleCaseMapping:0x3191 + }, + { code:0x3192 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x3192 + ,simpleLowerCaseMapping:0x3192 + ,simpleTitleCaseMapping:0x3192 + }, + { code:0x3193 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x3193 + ,simpleLowerCaseMapping:0x3193 + ,simpleTitleCaseMapping:0x3193 + }, + { code:0x3194 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x3194 + ,simpleLowerCaseMapping:0x3194 + ,simpleTitleCaseMapping:0x3194 + }, + { code:0x3195 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x3195 + ,simpleLowerCaseMapping:0x3195 + ,simpleTitleCaseMapping:0x3195 + }, + { code:0x3196 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3196 + ,simpleLowerCaseMapping:0x3196 + ,simpleTitleCaseMapping:0x3196 + }, + { code:0x3197 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3197 + ,simpleLowerCaseMapping:0x3197 + ,simpleTitleCaseMapping:0x3197 + }, + { code:0x3198 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3198 + ,simpleLowerCaseMapping:0x3198 + ,simpleTitleCaseMapping:0x3198 + }, + { code:0x3199 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3199 + ,simpleLowerCaseMapping:0x3199 + ,simpleTitleCaseMapping:0x3199 + }, + { code:0x319A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x319A + ,simpleLowerCaseMapping:0x319A + ,simpleTitleCaseMapping:0x319A + }, + { code:0x319B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x319B + ,simpleLowerCaseMapping:0x319B + ,simpleTitleCaseMapping:0x319B + }, + { code:0x319C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x319C + ,simpleLowerCaseMapping:0x319C + ,simpleTitleCaseMapping:0x319C + }, + { code:0x319D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x319D + ,simpleLowerCaseMapping:0x319D + ,simpleTitleCaseMapping:0x319D + }, + { code:0x319E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x319E + ,simpleLowerCaseMapping:0x319E + ,simpleTitleCaseMapping:0x319E + }, + { code:0x319F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x319F + ,simpleLowerCaseMapping:0x319F + ,simpleTitleCaseMapping:0x319F + }, + { code:0x31A0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31A0 + ,simpleLowerCaseMapping:0x31A0 + ,simpleTitleCaseMapping:0x31A0 + }, + { code:0x31A1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31A1 + ,simpleLowerCaseMapping:0x31A1 + ,simpleTitleCaseMapping:0x31A1 + }, + { code:0x31A2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31A2 + ,simpleLowerCaseMapping:0x31A2 + ,simpleTitleCaseMapping:0x31A2 + }, + { code:0x31A3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31A3 + ,simpleLowerCaseMapping:0x31A3 + ,simpleTitleCaseMapping:0x31A3 + }, + { code:0x31A4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31A4 + ,simpleLowerCaseMapping:0x31A4 + ,simpleTitleCaseMapping:0x31A4 + }, + { code:0x31A5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31A5 + ,simpleLowerCaseMapping:0x31A5 + ,simpleTitleCaseMapping:0x31A5 + }, + { code:0x31A6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31A6 + ,simpleLowerCaseMapping:0x31A6 + ,simpleTitleCaseMapping:0x31A6 + }, + { code:0x31A7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31A7 + ,simpleLowerCaseMapping:0x31A7 + ,simpleTitleCaseMapping:0x31A7 + }, + { code:0x31A8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31A8 + ,simpleLowerCaseMapping:0x31A8 + ,simpleTitleCaseMapping:0x31A8 + }, + { code:0x31A9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31A9 + ,simpleLowerCaseMapping:0x31A9 + ,simpleTitleCaseMapping:0x31A9 + }, + { code:0x31AA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31AA + ,simpleLowerCaseMapping:0x31AA + ,simpleTitleCaseMapping:0x31AA + }, + { code:0x31AB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31AB + ,simpleLowerCaseMapping:0x31AB + ,simpleTitleCaseMapping:0x31AB + }, + { code:0x31AC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31AC + ,simpleLowerCaseMapping:0x31AC + ,simpleTitleCaseMapping:0x31AC + }, + { code:0x31AD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31AD + ,simpleLowerCaseMapping:0x31AD + ,simpleTitleCaseMapping:0x31AD + }, + { code:0x31AE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31AE + ,simpleLowerCaseMapping:0x31AE + ,simpleTitleCaseMapping:0x31AE + }, + { code:0x31AF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31AF + ,simpleLowerCaseMapping:0x31AF + ,simpleTitleCaseMapping:0x31AF + }, + { code:0x31B0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31B0 + ,simpleLowerCaseMapping:0x31B0 + ,simpleTitleCaseMapping:0x31B0 + }, + { code:0x31B1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31B1 + ,simpleLowerCaseMapping:0x31B1 + ,simpleTitleCaseMapping:0x31B1 + }, + { code:0x31B2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31B2 + ,simpleLowerCaseMapping:0x31B2 + ,simpleTitleCaseMapping:0x31B2 + }, + { code:0x31B3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31B3 + ,simpleLowerCaseMapping:0x31B3 + ,simpleTitleCaseMapping:0x31B3 + }, + { code:0x31B4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31B4 + ,simpleLowerCaseMapping:0x31B4 + ,simpleTitleCaseMapping:0x31B4 + }, + { code:0x31B5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31B5 + ,simpleLowerCaseMapping:0x31B5 + ,simpleTitleCaseMapping:0x31B5 + }, + { code:0x31B6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31B6 + ,simpleLowerCaseMapping:0x31B6 + ,simpleTitleCaseMapping:0x31B6 + }, + { code:0x31B7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31B7 + ,simpleLowerCaseMapping:0x31B7 + ,simpleTitleCaseMapping:0x31B7 + }, + { code:0x31C0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x31C0 + ,simpleLowerCaseMapping:0x31C0 + ,simpleTitleCaseMapping:0x31C0 + }, + { code:0x31C1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x31C1 + ,simpleLowerCaseMapping:0x31C1 + ,simpleTitleCaseMapping:0x31C1 + }, + { code:0x31C2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x31C2 + ,simpleLowerCaseMapping:0x31C2 + ,simpleTitleCaseMapping:0x31C2 + }, + { code:0x31C3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x31C3 + ,simpleLowerCaseMapping:0x31C3 + ,simpleTitleCaseMapping:0x31C3 + }, + { code:0x31C4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x31C4 + ,simpleLowerCaseMapping:0x31C4 + ,simpleTitleCaseMapping:0x31C4 + }, + { code:0x31C5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x31C5 + ,simpleLowerCaseMapping:0x31C5 + ,simpleTitleCaseMapping:0x31C5 + }, + { code:0x31C6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x31C6 + ,simpleLowerCaseMapping:0x31C6 + ,simpleTitleCaseMapping:0x31C6 + }, + { code:0x31C7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x31C7 + ,simpleLowerCaseMapping:0x31C7 + ,simpleTitleCaseMapping:0x31C7 + }, + { code:0x31C8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x31C8 + ,simpleLowerCaseMapping:0x31C8 + ,simpleTitleCaseMapping:0x31C8 + }, + { code:0x31C9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x31C9 + ,simpleLowerCaseMapping:0x31C9 + ,simpleTitleCaseMapping:0x31C9 + }, + { code:0x31CA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x31CA + ,simpleLowerCaseMapping:0x31CA + ,simpleTitleCaseMapping:0x31CA + }, + { code:0x31CB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x31CB + ,simpleLowerCaseMapping:0x31CB + ,simpleTitleCaseMapping:0x31CB + }, + { code:0x31CC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x31CC + ,simpleLowerCaseMapping:0x31CC + ,simpleTitleCaseMapping:0x31CC + }, + { code:0x31CD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x31CD + ,simpleLowerCaseMapping:0x31CD + ,simpleTitleCaseMapping:0x31CD + }, + { code:0x31CE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x31CE + ,simpleLowerCaseMapping:0x31CE + ,simpleTitleCaseMapping:0x31CE + }, + { code:0x31CF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x31CF + ,simpleLowerCaseMapping:0x31CF + ,simpleTitleCaseMapping:0x31CF + }, + { code:0x31F0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31F0 + ,simpleLowerCaseMapping:0x31F0 + ,simpleTitleCaseMapping:0x31F0 + }, + { code:0x31F1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31F1 + ,simpleLowerCaseMapping:0x31F1 + ,simpleTitleCaseMapping:0x31F1 + }, + { code:0x31F2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31F2 + ,simpleLowerCaseMapping:0x31F2 + ,simpleTitleCaseMapping:0x31F2 + }, + { code:0x31F3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31F3 + ,simpleLowerCaseMapping:0x31F3 + ,simpleTitleCaseMapping:0x31F3 + }, + { code:0x31F4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31F4 + ,simpleLowerCaseMapping:0x31F4 + ,simpleTitleCaseMapping:0x31F4 + }, + { code:0x31F5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31F5 + ,simpleLowerCaseMapping:0x31F5 + ,simpleTitleCaseMapping:0x31F5 + }, + { code:0x31F6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31F6 + ,simpleLowerCaseMapping:0x31F6 + ,simpleTitleCaseMapping:0x31F6 + }, + { code:0x31F7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31F7 + ,simpleLowerCaseMapping:0x31F7 + ,simpleTitleCaseMapping:0x31F7 + }, + { code:0x31F8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31F8 + ,simpleLowerCaseMapping:0x31F8 + ,simpleTitleCaseMapping:0x31F8 + }, + { code:0x31F9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31F9 + ,simpleLowerCaseMapping:0x31F9 + ,simpleTitleCaseMapping:0x31F9 + }, + { code:0x31FA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31FA + ,simpleLowerCaseMapping:0x31FA + ,simpleTitleCaseMapping:0x31FA + }, + { code:0x31FB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31FB + ,simpleLowerCaseMapping:0x31FB + ,simpleTitleCaseMapping:0x31FB + }, + { code:0x31FC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31FC + ,simpleLowerCaseMapping:0x31FC + ,simpleTitleCaseMapping:0x31FC + }, + { code:0x31FD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31FD + ,simpleLowerCaseMapping:0x31FD + ,simpleTitleCaseMapping:0x31FD + }, + { code:0x31FE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31FE + ,simpleLowerCaseMapping:0x31FE + ,simpleTitleCaseMapping:0x31FE + }, + { code:0x31FF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x31FF + ,simpleLowerCaseMapping:0x31FF + ,simpleTitleCaseMapping:0x31FF + }, + { code:0x3200 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3200 + ,simpleLowerCaseMapping:0x3200 + ,simpleTitleCaseMapping:0x3200 + }, + { code:0x3201 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3201 + ,simpleLowerCaseMapping:0x3201 + ,simpleTitleCaseMapping:0x3201 + }, + { code:0x3202 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3202 + ,simpleLowerCaseMapping:0x3202 + ,simpleTitleCaseMapping:0x3202 + }, + { code:0x3203 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3203 + ,simpleLowerCaseMapping:0x3203 + ,simpleTitleCaseMapping:0x3203 + }, + { code:0x3204 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3204 + ,simpleLowerCaseMapping:0x3204 + ,simpleTitleCaseMapping:0x3204 + }, + { code:0x3205 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3205 + ,simpleLowerCaseMapping:0x3205 + ,simpleTitleCaseMapping:0x3205 + }, + { code:0x3206 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3206 + ,simpleLowerCaseMapping:0x3206 + ,simpleTitleCaseMapping:0x3206 + }, + { code:0x3207 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3207 + ,simpleLowerCaseMapping:0x3207 + ,simpleTitleCaseMapping:0x3207 + }, + { code:0x3208 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3208 + ,simpleLowerCaseMapping:0x3208 + ,simpleTitleCaseMapping:0x3208 + }, + { code:0x3209 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3209 + ,simpleLowerCaseMapping:0x3209 + ,simpleTitleCaseMapping:0x3209 + }, + { code:0x320A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x320A + ,simpleLowerCaseMapping:0x320A + ,simpleTitleCaseMapping:0x320A + }, + { code:0x320B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x320B + ,simpleLowerCaseMapping:0x320B + ,simpleTitleCaseMapping:0x320B + }, + { code:0x320C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x320C + ,simpleLowerCaseMapping:0x320C + ,simpleTitleCaseMapping:0x320C + }, + { code:0x320D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x320D + ,simpleLowerCaseMapping:0x320D + ,simpleTitleCaseMapping:0x320D + }, + { code:0x320E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x320E + ,simpleLowerCaseMapping:0x320E + ,simpleTitleCaseMapping:0x320E + }, + { code:0x320F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x320F + ,simpleLowerCaseMapping:0x320F + ,simpleTitleCaseMapping:0x320F + }, + { code:0x3210 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3210 + ,simpleLowerCaseMapping:0x3210 + ,simpleTitleCaseMapping:0x3210 + }, + { code:0x3211 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3211 + ,simpleLowerCaseMapping:0x3211 + ,simpleTitleCaseMapping:0x3211 + }, + { code:0x3212 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3212 + ,simpleLowerCaseMapping:0x3212 + ,simpleTitleCaseMapping:0x3212 + }, + { code:0x3213 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3213 + ,simpleLowerCaseMapping:0x3213 + ,simpleTitleCaseMapping:0x3213 + }, + { code:0x3214 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3214 + ,simpleLowerCaseMapping:0x3214 + ,simpleTitleCaseMapping:0x3214 + }, + { code:0x3215 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3215 + ,simpleLowerCaseMapping:0x3215 + ,simpleTitleCaseMapping:0x3215 + }, + { code:0x3216 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3216 + ,simpleLowerCaseMapping:0x3216 + ,simpleTitleCaseMapping:0x3216 + }, + { code:0x3217 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3217 + ,simpleLowerCaseMapping:0x3217 + ,simpleTitleCaseMapping:0x3217 + }, + { code:0x3218 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3218 + ,simpleLowerCaseMapping:0x3218 + ,simpleTitleCaseMapping:0x3218 + }, + { code:0x3219 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3219 + ,simpleLowerCaseMapping:0x3219 + ,simpleTitleCaseMapping:0x3219 + }, + { code:0x321A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x321A + ,simpleLowerCaseMapping:0x321A + ,simpleTitleCaseMapping:0x321A + }, + { code:0x321B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x321B + ,simpleLowerCaseMapping:0x321B + ,simpleTitleCaseMapping:0x321B + }, + { code:0x321C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x321C + ,simpleLowerCaseMapping:0x321C + ,simpleTitleCaseMapping:0x321C + }, + { code:0x321D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x321D + ,simpleLowerCaseMapping:0x321D + ,simpleTitleCaseMapping:0x321D + }, + { code:0x321E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x321E + ,simpleLowerCaseMapping:0x321E + ,simpleTitleCaseMapping:0x321E + }, + { code:0x3220 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x3220 + ,simpleLowerCaseMapping:0x3220 + ,simpleTitleCaseMapping:0x3220 + }, + { code:0x3221 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x3221 + ,simpleLowerCaseMapping:0x3221 + ,simpleTitleCaseMapping:0x3221 + }, + { code:0x3222 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x3222 + ,simpleLowerCaseMapping:0x3222 + ,simpleTitleCaseMapping:0x3222 + }, + { code:0x3223 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x3223 + ,simpleLowerCaseMapping:0x3223 + ,simpleTitleCaseMapping:0x3223 + }, + { code:0x3224 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x3224 + ,simpleLowerCaseMapping:0x3224 + ,simpleTitleCaseMapping:0x3224 + }, + { code:0x3225 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x3225 + ,simpleLowerCaseMapping:0x3225 + ,simpleTitleCaseMapping:0x3225 + }, + { code:0x3226 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x3226 + ,simpleLowerCaseMapping:0x3226 + ,simpleTitleCaseMapping:0x3226 + }, + { code:0x3227 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x3227 + ,simpleLowerCaseMapping:0x3227 + ,simpleTitleCaseMapping:0x3227 + }, + { code:0x3228 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x3228 + ,simpleLowerCaseMapping:0x3228 + ,simpleTitleCaseMapping:0x3228 + }, + { code:0x3229 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x3229 + ,simpleLowerCaseMapping:0x3229 + ,simpleTitleCaseMapping:0x3229 + }, + { code:0x322A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x322A + ,simpleLowerCaseMapping:0x322A + ,simpleTitleCaseMapping:0x322A + }, + { code:0x322B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x322B + ,simpleLowerCaseMapping:0x322B + ,simpleTitleCaseMapping:0x322B + }, + { code:0x322C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x322C + ,simpleLowerCaseMapping:0x322C + ,simpleTitleCaseMapping:0x322C + }, + { code:0x322D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x322D + ,simpleLowerCaseMapping:0x322D + ,simpleTitleCaseMapping:0x322D + }, + { code:0x322E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x322E + ,simpleLowerCaseMapping:0x322E + ,simpleTitleCaseMapping:0x322E + }, + { code:0x322F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x322F + ,simpleLowerCaseMapping:0x322F + ,simpleTitleCaseMapping:0x322F + }, + { code:0x3230 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3230 + ,simpleLowerCaseMapping:0x3230 + ,simpleTitleCaseMapping:0x3230 + }, + { code:0x3231 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3231 + ,simpleLowerCaseMapping:0x3231 + ,simpleTitleCaseMapping:0x3231 + }, + { code:0x3232 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3232 + ,simpleLowerCaseMapping:0x3232 + ,simpleTitleCaseMapping:0x3232 + }, + { code:0x3233 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3233 + ,simpleLowerCaseMapping:0x3233 + ,simpleTitleCaseMapping:0x3233 + }, + { code:0x3234 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3234 + ,simpleLowerCaseMapping:0x3234 + ,simpleTitleCaseMapping:0x3234 + }, + { code:0x3235 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3235 + ,simpleLowerCaseMapping:0x3235 + ,simpleTitleCaseMapping:0x3235 + }, + { code:0x3236 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3236 + ,simpleLowerCaseMapping:0x3236 + ,simpleTitleCaseMapping:0x3236 + }, + { code:0x3237 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3237 + ,simpleLowerCaseMapping:0x3237 + ,simpleTitleCaseMapping:0x3237 + }, + { code:0x3238 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3238 + ,simpleLowerCaseMapping:0x3238 + ,simpleTitleCaseMapping:0x3238 + }, + { code:0x3239 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3239 + ,simpleLowerCaseMapping:0x3239 + ,simpleTitleCaseMapping:0x3239 + }, + { code:0x323A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x323A + ,simpleLowerCaseMapping:0x323A + ,simpleTitleCaseMapping:0x323A + }, + { code:0x323B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x323B + ,simpleLowerCaseMapping:0x323B + ,simpleTitleCaseMapping:0x323B + }, + { code:0x323C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x323C + ,simpleLowerCaseMapping:0x323C + ,simpleTitleCaseMapping:0x323C + }, + { code:0x323D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x323D + ,simpleLowerCaseMapping:0x323D + ,simpleTitleCaseMapping:0x323D + }, + { code:0x323E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x323E + ,simpleLowerCaseMapping:0x323E + ,simpleTitleCaseMapping:0x323E + }, + { code:0x323F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x323F + ,simpleLowerCaseMapping:0x323F + ,simpleTitleCaseMapping:0x323F + }, + { code:0x3240 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3240 + ,simpleLowerCaseMapping:0x3240 + ,simpleTitleCaseMapping:0x3240 + }, + { code:0x3241 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3241 + ,simpleLowerCaseMapping:0x3241 + ,simpleTitleCaseMapping:0x3241 + }, + { code:0x3242 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3242 + ,simpleLowerCaseMapping:0x3242 + ,simpleTitleCaseMapping:0x3242 + }, + { code:0x3243 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3243 + ,simpleLowerCaseMapping:0x3243 + ,simpleTitleCaseMapping:0x3243 + }, + { code:0x3250 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3250 + ,simpleLowerCaseMapping:0x3250 + ,simpleTitleCaseMapping:0x3250 + }, + { code:0x3251 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x3251 + ,simpleLowerCaseMapping:0x3251 + ,simpleTitleCaseMapping:0x3251 + }, + { code:0x3252 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x3252 + ,simpleLowerCaseMapping:0x3252 + ,simpleTitleCaseMapping:0x3252 + }, + { code:0x3253 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x3253 + ,simpleLowerCaseMapping:0x3253 + ,simpleTitleCaseMapping:0x3253 + }, + { code:0x3254 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x3254 + ,simpleLowerCaseMapping:0x3254 + ,simpleTitleCaseMapping:0x3254 + }, + { code:0x3255 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x3255 + ,simpleLowerCaseMapping:0x3255 + ,simpleTitleCaseMapping:0x3255 + }, + { code:0x3256 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x3256 + ,simpleLowerCaseMapping:0x3256 + ,simpleTitleCaseMapping:0x3256 + }, + { code:0x3257 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x3257 + ,simpleLowerCaseMapping:0x3257 + ,simpleTitleCaseMapping:0x3257 + }, + { code:0x3258 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x3258 + ,simpleLowerCaseMapping:0x3258 + ,simpleTitleCaseMapping:0x3258 + }, + { code:0x3259 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x3259 + ,simpleLowerCaseMapping:0x3259 + ,simpleTitleCaseMapping:0x3259 + }, + { code:0x325A + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x325A + ,simpleLowerCaseMapping:0x325A + ,simpleTitleCaseMapping:0x325A + }, + { code:0x325B + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x325B + ,simpleLowerCaseMapping:0x325B + ,simpleTitleCaseMapping:0x325B + }, + { code:0x325C + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x325C + ,simpleLowerCaseMapping:0x325C + ,simpleTitleCaseMapping:0x325C + }, + { code:0x325D + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x325D + ,simpleLowerCaseMapping:0x325D + ,simpleTitleCaseMapping:0x325D + }, + { code:0x325E + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x325E + ,simpleLowerCaseMapping:0x325E + ,simpleTitleCaseMapping:0x325E + }, + { code:0x325F + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x325F + ,simpleLowerCaseMapping:0x325F + ,simpleTitleCaseMapping:0x325F + }, + { code:0x3260 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3260 + ,simpleLowerCaseMapping:0x3260 + ,simpleTitleCaseMapping:0x3260 + }, + { code:0x3261 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3261 + ,simpleLowerCaseMapping:0x3261 + ,simpleTitleCaseMapping:0x3261 + }, + { code:0x3262 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3262 + ,simpleLowerCaseMapping:0x3262 + ,simpleTitleCaseMapping:0x3262 + }, + { code:0x3263 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3263 + ,simpleLowerCaseMapping:0x3263 + ,simpleTitleCaseMapping:0x3263 + }, + { code:0x3264 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3264 + ,simpleLowerCaseMapping:0x3264 + ,simpleTitleCaseMapping:0x3264 + }, + { code:0x3265 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3265 + ,simpleLowerCaseMapping:0x3265 + ,simpleTitleCaseMapping:0x3265 + }, + { code:0x3266 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3266 + ,simpleLowerCaseMapping:0x3266 + ,simpleTitleCaseMapping:0x3266 + }, + { code:0x3267 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3267 + ,simpleLowerCaseMapping:0x3267 + ,simpleTitleCaseMapping:0x3267 + }, + { code:0x3268 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3268 + ,simpleLowerCaseMapping:0x3268 + ,simpleTitleCaseMapping:0x3268 + }, + { code:0x3269 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3269 + ,simpleLowerCaseMapping:0x3269 + ,simpleTitleCaseMapping:0x3269 + }, + { code:0x326A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x326A + ,simpleLowerCaseMapping:0x326A + ,simpleTitleCaseMapping:0x326A + }, + { code:0x326B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x326B + ,simpleLowerCaseMapping:0x326B + ,simpleTitleCaseMapping:0x326B + }, + { code:0x326C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x326C + ,simpleLowerCaseMapping:0x326C + ,simpleTitleCaseMapping:0x326C + }, + { code:0x326D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x326D + ,simpleLowerCaseMapping:0x326D + ,simpleTitleCaseMapping:0x326D + }, + { code:0x326E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x326E + ,simpleLowerCaseMapping:0x326E + ,simpleTitleCaseMapping:0x326E + }, + { code:0x326F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x326F + ,simpleLowerCaseMapping:0x326F + ,simpleTitleCaseMapping:0x326F + }, + { code:0x3270 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3270 + ,simpleLowerCaseMapping:0x3270 + ,simpleTitleCaseMapping:0x3270 + }, + { code:0x3271 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3271 + ,simpleLowerCaseMapping:0x3271 + ,simpleTitleCaseMapping:0x3271 + }, + { code:0x3272 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3272 + ,simpleLowerCaseMapping:0x3272 + ,simpleTitleCaseMapping:0x3272 + }, + { code:0x3273 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3273 + ,simpleLowerCaseMapping:0x3273 + ,simpleTitleCaseMapping:0x3273 + }, + { code:0x3274 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3274 + ,simpleLowerCaseMapping:0x3274 + ,simpleTitleCaseMapping:0x3274 + }, + { code:0x3275 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3275 + ,simpleLowerCaseMapping:0x3275 + ,simpleTitleCaseMapping:0x3275 + }, + { code:0x3276 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3276 + ,simpleLowerCaseMapping:0x3276 + ,simpleTitleCaseMapping:0x3276 + }, + { code:0x3277 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3277 + ,simpleLowerCaseMapping:0x3277 + ,simpleTitleCaseMapping:0x3277 + }, + { code:0x3278 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3278 + ,simpleLowerCaseMapping:0x3278 + ,simpleTitleCaseMapping:0x3278 + }, + { code:0x3279 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3279 + ,simpleLowerCaseMapping:0x3279 + ,simpleTitleCaseMapping:0x3279 + }, + { code:0x327A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x327A + ,simpleLowerCaseMapping:0x327A + ,simpleTitleCaseMapping:0x327A + }, + { code:0x327B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x327B + ,simpleLowerCaseMapping:0x327B + ,simpleTitleCaseMapping:0x327B + }, + { code:0x327C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x327C + ,simpleLowerCaseMapping:0x327C + ,simpleTitleCaseMapping:0x327C + }, + { code:0x327D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x327D + ,simpleLowerCaseMapping:0x327D + ,simpleTitleCaseMapping:0x327D + }, + { code:0x327E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x327E + ,simpleLowerCaseMapping:0x327E + ,simpleTitleCaseMapping:0x327E + }, + { code:0x327F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x327F + ,simpleLowerCaseMapping:0x327F + ,simpleTitleCaseMapping:0x327F + }, + { code:0x3280 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x3280 + ,simpleLowerCaseMapping:0x3280 + ,simpleTitleCaseMapping:0x3280 + }, + { code:0x3281 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x3281 + ,simpleLowerCaseMapping:0x3281 + ,simpleTitleCaseMapping:0x3281 + }, + { code:0x3282 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x3282 + ,simpleLowerCaseMapping:0x3282 + ,simpleTitleCaseMapping:0x3282 + }, + { code:0x3283 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x3283 + ,simpleLowerCaseMapping:0x3283 + ,simpleTitleCaseMapping:0x3283 + }, + { code:0x3284 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x3284 + ,simpleLowerCaseMapping:0x3284 + ,simpleTitleCaseMapping:0x3284 + }, + { code:0x3285 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x3285 + ,simpleLowerCaseMapping:0x3285 + ,simpleTitleCaseMapping:0x3285 + }, + { code:0x3286 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x3286 + ,simpleLowerCaseMapping:0x3286 + ,simpleTitleCaseMapping:0x3286 + }, + { code:0x3287 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x3287 + ,simpleLowerCaseMapping:0x3287 + ,simpleTitleCaseMapping:0x3287 + }, + { code:0x3288 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x3288 + ,simpleLowerCaseMapping:0x3288 + ,simpleTitleCaseMapping:0x3288 + }, + { code:0x3289 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x3289 + ,simpleLowerCaseMapping:0x3289 + ,simpleTitleCaseMapping:0x3289 + }, + { code:0x328A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x328A + ,simpleLowerCaseMapping:0x328A + ,simpleTitleCaseMapping:0x328A + }, + { code:0x328B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x328B + ,simpleLowerCaseMapping:0x328B + ,simpleTitleCaseMapping:0x328B + }, + { code:0x328C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x328C + ,simpleLowerCaseMapping:0x328C + ,simpleTitleCaseMapping:0x328C + }, + { code:0x328D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x328D + ,simpleLowerCaseMapping:0x328D + ,simpleTitleCaseMapping:0x328D + }, + { code:0x328E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x328E + ,simpleLowerCaseMapping:0x328E + ,simpleTitleCaseMapping:0x328E + }, + { code:0x328F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x328F + ,simpleLowerCaseMapping:0x328F + ,simpleTitleCaseMapping:0x328F + }, + { code:0x3290 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3290 + ,simpleLowerCaseMapping:0x3290 + ,simpleTitleCaseMapping:0x3290 + }, + { code:0x3291 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3291 + ,simpleLowerCaseMapping:0x3291 + ,simpleTitleCaseMapping:0x3291 + }, + { code:0x3292 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3292 + ,simpleLowerCaseMapping:0x3292 + ,simpleTitleCaseMapping:0x3292 + }, + { code:0x3293 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3293 + ,simpleLowerCaseMapping:0x3293 + ,simpleTitleCaseMapping:0x3293 + }, + { code:0x3294 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3294 + ,simpleLowerCaseMapping:0x3294 + ,simpleTitleCaseMapping:0x3294 + }, + { code:0x3295 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3295 + ,simpleLowerCaseMapping:0x3295 + ,simpleTitleCaseMapping:0x3295 + }, + { code:0x3296 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3296 + ,simpleLowerCaseMapping:0x3296 + ,simpleTitleCaseMapping:0x3296 + }, + { code:0x3297 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3297 + ,simpleLowerCaseMapping:0x3297 + ,simpleTitleCaseMapping:0x3297 + }, + { code:0x3298 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3298 + ,simpleLowerCaseMapping:0x3298 + ,simpleTitleCaseMapping:0x3298 + }, + { code:0x3299 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3299 + ,simpleLowerCaseMapping:0x3299 + ,simpleTitleCaseMapping:0x3299 + }, + { code:0x329A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x329A + ,simpleLowerCaseMapping:0x329A + ,simpleTitleCaseMapping:0x329A + }, + { code:0x329B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x329B + ,simpleLowerCaseMapping:0x329B + ,simpleTitleCaseMapping:0x329B + }, + { code:0x329C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x329C + ,simpleLowerCaseMapping:0x329C + ,simpleTitleCaseMapping:0x329C + }, + { code:0x329D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x329D + ,simpleLowerCaseMapping:0x329D + ,simpleTitleCaseMapping:0x329D + }, + { code:0x329E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x329E + ,simpleLowerCaseMapping:0x329E + ,simpleTitleCaseMapping:0x329E + }, + { code:0x329F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x329F + ,simpleLowerCaseMapping:0x329F + ,simpleTitleCaseMapping:0x329F + }, + { code:0x32A0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32A0 + ,simpleLowerCaseMapping:0x32A0 + ,simpleTitleCaseMapping:0x32A0 + }, + { code:0x32A1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32A1 + ,simpleLowerCaseMapping:0x32A1 + ,simpleTitleCaseMapping:0x32A1 + }, + { code:0x32A2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32A2 + ,simpleLowerCaseMapping:0x32A2 + ,simpleTitleCaseMapping:0x32A2 + }, + { code:0x32A3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32A3 + ,simpleLowerCaseMapping:0x32A3 + ,simpleTitleCaseMapping:0x32A3 + }, + { code:0x32A4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32A4 + ,simpleLowerCaseMapping:0x32A4 + ,simpleTitleCaseMapping:0x32A4 + }, + { code:0x32A5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32A5 + ,simpleLowerCaseMapping:0x32A5 + ,simpleTitleCaseMapping:0x32A5 + }, + { code:0x32A6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32A6 + ,simpleLowerCaseMapping:0x32A6 + ,simpleTitleCaseMapping:0x32A6 + }, + { code:0x32A7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32A7 + ,simpleLowerCaseMapping:0x32A7 + ,simpleTitleCaseMapping:0x32A7 + }, + { code:0x32A8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32A8 + ,simpleLowerCaseMapping:0x32A8 + ,simpleTitleCaseMapping:0x32A8 + }, + { code:0x32A9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32A9 + ,simpleLowerCaseMapping:0x32A9 + ,simpleTitleCaseMapping:0x32A9 + }, + { code:0x32AA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32AA + ,simpleLowerCaseMapping:0x32AA + ,simpleTitleCaseMapping:0x32AA + }, + { code:0x32AB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32AB + ,simpleLowerCaseMapping:0x32AB + ,simpleTitleCaseMapping:0x32AB + }, + { code:0x32AC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32AC + ,simpleLowerCaseMapping:0x32AC + ,simpleTitleCaseMapping:0x32AC + }, + { code:0x32AD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32AD + ,simpleLowerCaseMapping:0x32AD + ,simpleTitleCaseMapping:0x32AD + }, + { code:0x32AE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32AE + ,simpleLowerCaseMapping:0x32AE + ,simpleTitleCaseMapping:0x32AE + }, + { code:0x32AF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32AF + ,simpleLowerCaseMapping:0x32AF + ,simpleTitleCaseMapping:0x32AF + }, + { code:0x32B0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32B0 + ,simpleLowerCaseMapping:0x32B0 + ,simpleTitleCaseMapping:0x32B0 + }, + { code:0x32B1 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x32B1 + ,simpleLowerCaseMapping:0x32B1 + ,simpleTitleCaseMapping:0x32B1 + }, + { code:0x32B2 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x32B2 + ,simpleLowerCaseMapping:0x32B2 + ,simpleTitleCaseMapping:0x32B2 + }, + { code:0x32B3 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x32B3 + ,simpleLowerCaseMapping:0x32B3 + ,simpleTitleCaseMapping:0x32B3 + }, + { code:0x32B4 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x32B4 + ,simpleLowerCaseMapping:0x32B4 + ,simpleTitleCaseMapping:0x32B4 + }, + { code:0x32B5 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x32B5 + ,simpleLowerCaseMapping:0x32B5 + ,simpleTitleCaseMapping:0x32B5 + }, + { code:0x32B6 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x32B6 + ,simpleLowerCaseMapping:0x32B6 + ,simpleTitleCaseMapping:0x32B6 + }, + { code:0x32B7 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x32B7 + ,simpleLowerCaseMapping:0x32B7 + ,simpleTitleCaseMapping:0x32B7 + }, + { code:0x32B8 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x32B8 + ,simpleLowerCaseMapping:0x32B8 + ,simpleTitleCaseMapping:0x32B8 + }, + { code:0x32B9 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x32B9 + ,simpleLowerCaseMapping:0x32B9 + ,simpleTitleCaseMapping:0x32B9 + }, + { code:0x32BA + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x32BA + ,simpleLowerCaseMapping:0x32BA + ,simpleTitleCaseMapping:0x32BA + }, + { code:0x32BB + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x32BB + ,simpleLowerCaseMapping:0x32BB + ,simpleTitleCaseMapping:0x32BB + }, + { code:0x32BC + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x32BC + ,simpleLowerCaseMapping:0x32BC + ,simpleTitleCaseMapping:0x32BC + }, + { code:0x32BD + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x32BD + ,simpleLowerCaseMapping:0x32BD + ,simpleTitleCaseMapping:0x32BD + }, + { code:0x32BE + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x32BE + ,simpleLowerCaseMapping:0x32BE + ,simpleTitleCaseMapping:0x32BE + }, + { code:0x32BF + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x32BF + ,simpleLowerCaseMapping:0x32BF + ,simpleTitleCaseMapping:0x32BF + }, + { code:0x32C0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32C0 + ,simpleLowerCaseMapping:0x32C0 + ,simpleTitleCaseMapping:0x32C0 + }, + { code:0x32C1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32C1 + ,simpleLowerCaseMapping:0x32C1 + ,simpleTitleCaseMapping:0x32C1 + }, + { code:0x32C2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32C2 + ,simpleLowerCaseMapping:0x32C2 + ,simpleTitleCaseMapping:0x32C2 + }, + { code:0x32C3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32C3 + ,simpleLowerCaseMapping:0x32C3 + ,simpleTitleCaseMapping:0x32C3 + }, + { code:0x32C4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32C4 + ,simpleLowerCaseMapping:0x32C4 + ,simpleTitleCaseMapping:0x32C4 + }, + { code:0x32C5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32C5 + ,simpleLowerCaseMapping:0x32C5 + ,simpleTitleCaseMapping:0x32C5 + }, + { code:0x32C6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32C6 + ,simpleLowerCaseMapping:0x32C6 + ,simpleTitleCaseMapping:0x32C6 + }, + { code:0x32C7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32C7 + ,simpleLowerCaseMapping:0x32C7 + ,simpleTitleCaseMapping:0x32C7 + }, + { code:0x32C8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32C8 + ,simpleLowerCaseMapping:0x32C8 + ,simpleTitleCaseMapping:0x32C8 + }, + { code:0x32C9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32C9 + ,simpleLowerCaseMapping:0x32C9 + ,simpleTitleCaseMapping:0x32C9 + }, + { code:0x32CA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32CA + ,simpleLowerCaseMapping:0x32CA + ,simpleTitleCaseMapping:0x32CA + }, + { code:0x32CB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32CB + ,simpleLowerCaseMapping:0x32CB + ,simpleTitleCaseMapping:0x32CB + }, + { code:0x32CC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32CC + ,simpleLowerCaseMapping:0x32CC + ,simpleTitleCaseMapping:0x32CC + }, + { code:0x32CD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32CD + ,simpleLowerCaseMapping:0x32CD + ,simpleTitleCaseMapping:0x32CD + }, + { code:0x32CE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32CE + ,simpleLowerCaseMapping:0x32CE + ,simpleTitleCaseMapping:0x32CE + }, + { code:0x32CF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32CF + ,simpleLowerCaseMapping:0x32CF + ,simpleTitleCaseMapping:0x32CF + }, + { code:0x32D0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32D0 + ,simpleLowerCaseMapping:0x32D0 + ,simpleTitleCaseMapping:0x32D0 + }, + { code:0x32D1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32D1 + ,simpleLowerCaseMapping:0x32D1 + ,simpleTitleCaseMapping:0x32D1 + }, + { code:0x32D2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32D2 + ,simpleLowerCaseMapping:0x32D2 + ,simpleTitleCaseMapping:0x32D2 + }, + { code:0x32D3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32D3 + ,simpleLowerCaseMapping:0x32D3 + ,simpleTitleCaseMapping:0x32D3 + }, + { code:0x32D4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32D4 + ,simpleLowerCaseMapping:0x32D4 + ,simpleTitleCaseMapping:0x32D4 + }, + { code:0x32D5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32D5 + ,simpleLowerCaseMapping:0x32D5 + ,simpleTitleCaseMapping:0x32D5 + }, + { code:0x32D6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32D6 + ,simpleLowerCaseMapping:0x32D6 + ,simpleTitleCaseMapping:0x32D6 + }, + { code:0x32D7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32D7 + ,simpleLowerCaseMapping:0x32D7 + ,simpleTitleCaseMapping:0x32D7 + }, + { code:0x32D8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32D8 + ,simpleLowerCaseMapping:0x32D8 + ,simpleTitleCaseMapping:0x32D8 + }, + { code:0x32D9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32D9 + ,simpleLowerCaseMapping:0x32D9 + ,simpleTitleCaseMapping:0x32D9 + }, + { code:0x32DA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32DA + ,simpleLowerCaseMapping:0x32DA + ,simpleTitleCaseMapping:0x32DA + }, + { code:0x32DB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32DB + ,simpleLowerCaseMapping:0x32DB + ,simpleTitleCaseMapping:0x32DB + }, + { code:0x32DC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32DC + ,simpleLowerCaseMapping:0x32DC + ,simpleTitleCaseMapping:0x32DC + }, + { code:0x32DD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32DD + ,simpleLowerCaseMapping:0x32DD + ,simpleTitleCaseMapping:0x32DD + }, + { code:0x32DE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32DE + ,simpleLowerCaseMapping:0x32DE + ,simpleTitleCaseMapping:0x32DE + }, + { code:0x32DF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32DF + ,simpleLowerCaseMapping:0x32DF + ,simpleTitleCaseMapping:0x32DF + }, + { code:0x32E0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32E0 + ,simpleLowerCaseMapping:0x32E0 + ,simpleTitleCaseMapping:0x32E0 + }, + { code:0x32E1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32E1 + ,simpleLowerCaseMapping:0x32E1 + ,simpleTitleCaseMapping:0x32E1 + }, + { code:0x32E2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32E2 + ,simpleLowerCaseMapping:0x32E2 + ,simpleTitleCaseMapping:0x32E2 + }, + { code:0x32E3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32E3 + ,simpleLowerCaseMapping:0x32E3 + ,simpleTitleCaseMapping:0x32E3 + }, + { code:0x32E4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32E4 + ,simpleLowerCaseMapping:0x32E4 + ,simpleTitleCaseMapping:0x32E4 + }, + { code:0x32E5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32E5 + ,simpleLowerCaseMapping:0x32E5 + ,simpleTitleCaseMapping:0x32E5 + }, + { code:0x32E6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32E6 + ,simpleLowerCaseMapping:0x32E6 + ,simpleTitleCaseMapping:0x32E6 + }, + { code:0x32E7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32E7 + ,simpleLowerCaseMapping:0x32E7 + ,simpleTitleCaseMapping:0x32E7 + }, + { code:0x32E8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32E8 + ,simpleLowerCaseMapping:0x32E8 + ,simpleTitleCaseMapping:0x32E8 + }, + { code:0x32E9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32E9 + ,simpleLowerCaseMapping:0x32E9 + ,simpleTitleCaseMapping:0x32E9 + }, + { code:0x32EA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32EA + ,simpleLowerCaseMapping:0x32EA + ,simpleTitleCaseMapping:0x32EA + }, + { code:0x32EB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32EB + ,simpleLowerCaseMapping:0x32EB + ,simpleTitleCaseMapping:0x32EB + }, + { code:0x32EC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32EC + ,simpleLowerCaseMapping:0x32EC + ,simpleTitleCaseMapping:0x32EC + }, + { code:0x32ED + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32ED + ,simpleLowerCaseMapping:0x32ED + ,simpleTitleCaseMapping:0x32ED + }, + { code:0x32EE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32EE + ,simpleLowerCaseMapping:0x32EE + ,simpleTitleCaseMapping:0x32EE + }, + { code:0x32EF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32EF + ,simpleLowerCaseMapping:0x32EF + ,simpleTitleCaseMapping:0x32EF + }, + { code:0x32F0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32F0 + ,simpleLowerCaseMapping:0x32F0 + ,simpleTitleCaseMapping:0x32F0 + }, + { code:0x32F1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32F1 + ,simpleLowerCaseMapping:0x32F1 + ,simpleTitleCaseMapping:0x32F1 + }, + { code:0x32F2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32F2 + ,simpleLowerCaseMapping:0x32F2 + ,simpleTitleCaseMapping:0x32F2 + }, + { code:0x32F3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32F3 + ,simpleLowerCaseMapping:0x32F3 + ,simpleTitleCaseMapping:0x32F3 + }, + { code:0x32F4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32F4 + ,simpleLowerCaseMapping:0x32F4 + ,simpleTitleCaseMapping:0x32F4 + }, + { code:0x32F5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32F5 + ,simpleLowerCaseMapping:0x32F5 + ,simpleTitleCaseMapping:0x32F5 + }, + { code:0x32F6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32F6 + ,simpleLowerCaseMapping:0x32F6 + ,simpleTitleCaseMapping:0x32F6 + }, + { code:0x32F7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32F7 + ,simpleLowerCaseMapping:0x32F7 + ,simpleTitleCaseMapping:0x32F7 + }, + { code:0x32F8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32F8 + ,simpleLowerCaseMapping:0x32F8 + ,simpleTitleCaseMapping:0x32F8 + }, + { code:0x32F9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32F9 + ,simpleLowerCaseMapping:0x32F9 + ,simpleTitleCaseMapping:0x32F9 + }, + { code:0x32FA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32FA + ,simpleLowerCaseMapping:0x32FA + ,simpleTitleCaseMapping:0x32FA + }, + { code:0x32FB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32FB + ,simpleLowerCaseMapping:0x32FB + ,simpleTitleCaseMapping:0x32FB + }, + { code:0x32FC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32FC + ,simpleLowerCaseMapping:0x32FC + ,simpleTitleCaseMapping:0x32FC + }, + { code:0x32FD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32FD + ,simpleLowerCaseMapping:0x32FD + ,simpleTitleCaseMapping:0x32FD + }, + { code:0x32FE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x32FE + ,simpleLowerCaseMapping:0x32FE + ,simpleTitleCaseMapping:0x32FE + }, + { code:0x3300 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3300 + ,simpleLowerCaseMapping:0x3300 + ,simpleTitleCaseMapping:0x3300 + }, + { code:0x3301 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3301 + ,simpleLowerCaseMapping:0x3301 + ,simpleTitleCaseMapping:0x3301 + }, + { code:0x3302 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3302 + ,simpleLowerCaseMapping:0x3302 + ,simpleTitleCaseMapping:0x3302 + }, + { code:0x3303 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3303 + ,simpleLowerCaseMapping:0x3303 + ,simpleTitleCaseMapping:0x3303 + }, + { code:0x3304 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3304 + ,simpleLowerCaseMapping:0x3304 + ,simpleTitleCaseMapping:0x3304 + }, + { code:0x3305 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3305 + ,simpleLowerCaseMapping:0x3305 + ,simpleTitleCaseMapping:0x3305 + }, + { code:0x3306 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3306 + ,simpleLowerCaseMapping:0x3306 + ,simpleTitleCaseMapping:0x3306 + }, + { code:0x3307 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3307 + ,simpleLowerCaseMapping:0x3307 + ,simpleTitleCaseMapping:0x3307 + }, + { code:0x3308 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3308 + ,simpleLowerCaseMapping:0x3308 + ,simpleTitleCaseMapping:0x3308 + }, + { code:0x3309 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3309 + ,simpleLowerCaseMapping:0x3309 + ,simpleTitleCaseMapping:0x3309 + }, + { code:0x330A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x330A + ,simpleLowerCaseMapping:0x330A + ,simpleTitleCaseMapping:0x330A + }, + { code:0x330B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x330B + ,simpleLowerCaseMapping:0x330B + ,simpleTitleCaseMapping:0x330B + }, + { code:0x330C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x330C + ,simpleLowerCaseMapping:0x330C + ,simpleTitleCaseMapping:0x330C + }, + { code:0x330D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x330D + ,simpleLowerCaseMapping:0x330D + ,simpleTitleCaseMapping:0x330D + }, + { code:0x330E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x330E + ,simpleLowerCaseMapping:0x330E + ,simpleTitleCaseMapping:0x330E + }, + { code:0x330F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x330F + ,simpleLowerCaseMapping:0x330F + ,simpleTitleCaseMapping:0x330F + }, + { code:0x3310 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3310 + ,simpleLowerCaseMapping:0x3310 + ,simpleTitleCaseMapping:0x3310 + }, + { code:0x3311 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3311 + ,simpleLowerCaseMapping:0x3311 + ,simpleTitleCaseMapping:0x3311 + }, + { code:0x3312 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3312 + ,simpleLowerCaseMapping:0x3312 + ,simpleTitleCaseMapping:0x3312 + }, + { code:0x3313 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3313 + ,simpleLowerCaseMapping:0x3313 + ,simpleTitleCaseMapping:0x3313 + }, + { code:0x3314 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3314 + ,simpleLowerCaseMapping:0x3314 + ,simpleTitleCaseMapping:0x3314 + }, + { code:0x3315 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3315 + ,simpleLowerCaseMapping:0x3315 + ,simpleTitleCaseMapping:0x3315 + }, + { code:0x3316 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3316 + ,simpleLowerCaseMapping:0x3316 + ,simpleTitleCaseMapping:0x3316 + }, + { code:0x3317 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3317 + ,simpleLowerCaseMapping:0x3317 + ,simpleTitleCaseMapping:0x3317 + }, + { code:0x3318 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3318 + ,simpleLowerCaseMapping:0x3318 + ,simpleTitleCaseMapping:0x3318 + }, + { code:0x3319 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3319 + ,simpleLowerCaseMapping:0x3319 + ,simpleTitleCaseMapping:0x3319 + }, + { code:0x331A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x331A + ,simpleLowerCaseMapping:0x331A + ,simpleTitleCaseMapping:0x331A + }, + { code:0x331B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x331B + ,simpleLowerCaseMapping:0x331B + ,simpleTitleCaseMapping:0x331B + }, + { code:0x331C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x331C + ,simpleLowerCaseMapping:0x331C + ,simpleTitleCaseMapping:0x331C + }, + { code:0x331D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x331D + ,simpleLowerCaseMapping:0x331D + ,simpleTitleCaseMapping:0x331D + }, + { code:0x331E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x331E + ,simpleLowerCaseMapping:0x331E + ,simpleTitleCaseMapping:0x331E + }, + { code:0x331F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x331F + ,simpleLowerCaseMapping:0x331F + ,simpleTitleCaseMapping:0x331F + }, + { code:0x3320 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3320 + ,simpleLowerCaseMapping:0x3320 + ,simpleTitleCaseMapping:0x3320 + }, + { code:0x3321 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3321 + ,simpleLowerCaseMapping:0x3321 + ,simpleTitleCaseMapping:0x3321 + }, + { code:0x3322 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3322 + ,simpleLowerCaseMapping:0x3322 + ,simpleTitleCaseMapping:0x3322 + }, + { code:0x3323 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3323 + ,simpleLowerCaseMapping:0x3323 + ,simpleTitleCaseMapping:0x3323 + }, + { code:0x3324 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3324 + ,simpleLowerCaseMapping:0x3324 + ,simpleTitleCaseMapping:0x3324 + }, + { code:0x3325 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3325 + ,simpleLowerCaseMapping:0x3325 + ,simpleTitleCaseMapping:0x3325 + }, + { code:0x3326 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3326 + ,simpleLowerCaseMapping:0x3326 + ,simpleTitleCaseMapping:0x3326 + }, + { code:0x3327 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3327 + ,simpleLowerCaseMapping:0x3327 + ,simpleTitleCaseMapping:0x3327 + }, + { code:0x3328 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3328 + ,simpleLowerCaseMapping:0x3328 + ,simpleTitleCaseMapping:0x3328 + }, + { code:0x3329 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3329 + ,simpleLowerCaseMapping:0x3329 + ,simpleTitleCaseMapping:0x3329 + }, + { code:0x332A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x332A + ,simpleLowerCaseMapping:0x332A + ,simpleTitleCaseMapping:0x332A + }, + { code:0x332B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x332B + ,simpleLowerCaseMapping:0x332B + ,simpleTitleCaseMapping:0x332B + }, + { code:0x332C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x332C + ,simpleLowerCaseMapping:0x332C + ,simpleTitleCaseMapping:0x332C + }, + { code:0x332D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x332D + ,simpleLowerCaseMapping:0x332D + ,simpleTitleCaseMapping:0x332D + }, + { code:0x332E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x332E + ,simpleLowerCaseMapping:0x332E + ,simpleTitleCaseMapping:0x332E + }, + { code:0x332F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x332F + ,simpleLowerCaseMapping:0x332F + ,simpleTitleCaseMapping:0x332F + }, + { code:0x3330 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3330 + ,simpleLowerCaseMapping:0x3330 + ,simpleTitleCaseMapping:0x3330 + }, + { code:0x3331 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3331 + ,simpleLowerCaseMapping:0x3331 + ,simpleTitleCaseMapping:0x3331 + }, + { code:0x3332 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3332 + ,simpleLowerCaseMapping:0x3332 + ,simpleTitleCaseMapping:0x3332 + }, + { code:0x3333 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3333 + ,simpleLowerCaseMapping:0x3333 + ,simpleTitleCaseMapping:0x3333 + }, + { code:0x3334 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3334 + ,simpleLowerCaseMapping:0x3334 + ,simpleTitleCaseMapping:0x3334 + }, + { code:0x3335 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3335 + ,simpleLowerCaseMapping:0x3335 + ,simpleTitleCaseMapping:0x3335 + }, + { code:0x3336 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3336 + ,simpleLowerCaseMapping:0x3336 + ,simpleTitleCaseMapping:0x3336 + }, + { code:0x3337 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3337 + ,simpleLowerCaseMapping:0x3337 + ,simpleTitleCaseMapping:0x3337 + }, + { code:0x3338 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3338 + ,simpleLowerCaseMapping:0x3338 + ,simpleTitleCaseMapping:0x3338 + }, + { code:0x3339 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3339 + ,simpleLowerCaseMapping:0x3339 + ,simpleTitleCaseMapping:0x3339 + }, + { code:0x333A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x333A + ,simpleLowerCaseMapping:0x333A + ,simpleTitleCaseMapping:0x333A + }, + { code:0x333B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x333B + ,simpleLowerCaseMapping:0x333B + ,simpleTitleCaseMapping:0x333B + }, + { code:0x333C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x333C + ,simpleLowerCaseMapping:0x333C + ,simpleTitleCaseMapping:0x333C + }, + { code:0x333D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x333D + ,simpleLowerCaseMapping:0x333D + ,simpleTitleCaseMapping:0x333D + }, + { code:0x333E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x333E + ,simpleLowerCaseMapping:0x333E + ,simpleTitleCaseMapping:0x333E + }, + { code:0x333F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x333F + ,simpleLowerCaseMapping:0x333F + ,simpleTitleCaseMapping:0x333F + }, + { code:0x3340 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3340 + ,simpleLowerCaseMapping:0x3340 + ,simpleTitleCaseMapping:0x3340 + }, + { code:0x3341 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3341 + ,simpleLowerCaseMapping:0x3341 + ,simpleTitleCaseMapping:0x3341 + }, + { code:0x3342 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3342 + ,simpleLowerCaseMapping:0x3342 + ,simpleTitleCaseMapping:0x3342 + }, + { code:0x3343 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3343 + ,simpleLowerCaseMapping:0x3343 + ,simpleTitleCaseMapping:0x3343 + }, + { code:0x3344 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3344 + ,simpleLowerCaseMapping:0x3344 + ,simpleTitleCaseMapping:0x3344 + }, + { code:0x3345 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3345 + ,simpleLowerCaseMapping:0x3345 + ,simpleTitleCaseMapping:0x3345 + }, + { code:0x3346 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3346 + ,simpleLowerCaseMapping:0x3346 + ,simpleTitleCaseMapping:0x3346 + }, + { code:0x3347 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3347 + ,simpleLowerCaseMapping:0x3347 + ,simpleTitleCaseMapping:0x3347 + }, + { code:0x3348 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3348 + ,simpleLowerCaseMapping:0x3348 + ,simpleTitleCaseMapping:0x3348 + }, + { code:0x3349 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3349 + ,simpleLowerCaseMapping:0x3349 + ,simpleTitleCaseMapping:0x3349 + }, + { code:0x334A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x334A + ,simpleLowerCaseMapping:0x334A + ,simpleTitleCaseMapping:0x334A + }, + { code:0x334B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x334B + ,simpleLowerCaseMapping:0x334B + ,simpleTitleCaseMapping:0x334B + }, + { code:0x334C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x334C + ,simpleLowerCaseMapping:0x334C + ,simpleTitleCaseMapping:0x334C + }, + { code:0x334D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x334D + ,simpleLowerCaseMapping:0x334D + ,simpleTitleCaseMapping:0x334D + }, + { code:0x334E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x334E + ,simpleLowerCaseMapping:0x334E + ,simpleTitleCaseMapping:0x334E + }, + { code:0x334F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x334F + ,simpleLowerCaseMapping:0x334F + ,simpleTitleCaseMapping:0x334F + }, + { code:0x3350 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3350 + ,simpleLowerCaseMapping:0x3350 + ,simpleTitleCaseMapping:0x3350 + }, + { code:0x3351 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3351 + ,simpleLowerCaseMapping:0x3351 + ,simpleTitleCaseMapping:0x3351 + }, + { code:0x3352 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3352 + ,simpleLowerCaseMapping:0x3352 + ,simpleTitleCaseMapping:0x3352 + }, + { code:0x3353 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3353 + ,simpleLowerCaseMapping:0x3353 + ,simpleTitleCaseMapping:0x3353 + }, + { code:0x3354 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3354 + ,simpleLowerCaseMapping:0x3354 + ,simpleTitleCaseMapping:0x3354 + }, + { code:0x3355 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3355 + ,simpleLowerCaseMapping:0x3355 + ,simpleTitleCaseMapping:0x3355 + }, + { code:0x3356 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3356 + ,simpleLowerCaseMapping:0x3356 + ,simpleTitleCaseMapping:0x3356 + }, + { code:0x3357 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3357 + ,simpleLowerCaseMapping:0x3357 + ,simpleTitleCaseMapping:0x3357 + }, + { code:0x3358 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3358 + ,simpleLowerCaseMapping:0x3358 + ,simpleTitleCaseMapping:0x3358 + }, + { code:0x3359 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3359 + ,simpleLowerCaseMapping:0x3359 + ,simpleTitleCaseMapping:0x3359 + }, + { code:0x335A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x335A + ,simpleLowerCaseMapping:0x335A + ,simpleTitleCaseMapping:0x335A + }, + { code:0x335B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x335B + ,simpleLowerCaseMapping:0x335B + ,simpleTitleCaseMapping:0x335B + }, + { code:0x335C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x335C + ,simpleLowerCaseMapping:0x335C + ,simpleTitleCaseMapping:0x335C + }, + { code:0x335D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x335D + ,simpleLowerCaseMapping:0x335D + ,simpleTitleCaseMapping:0x335D + }, + { code:0x335E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x335E + ,simpleLowerCaseMapping:0x335E + ,simpleTitleCaseMapping:0x335E + }, + { code:0x335F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x335F + ,simpleLowerCaseMapping:0x335F + ,simpleTitleCaseMapping:0x335F + }, + { code:0x3360 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3360 + ,simpleLowerCaseMapping:0x3360 + ,simpleTitleCaseMapping:0x3360 + }, + { code:0x3361 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3361 + ,simpleLowerCaseMapping:0x3361 + ,simpleTitleCaseMapping:0x3361 + }, + { code:0x3362 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3362 + ,simpleLowerCaseMapping:0x3362 + ,simpleTitleCaseMapping:0x3362 + }, + { code:0x3363 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3363 + ,simpleLowerCaseMapping:0x3363 + ,simpleTitleCaseMapping:0x3363 + }, + { code:0x3364 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3364 + ,simpleLowerCaseMapping:0x3364 + ,simpleTitleCaseMapping:0x3364 + }, + { code:0x3365 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3365 + ,simpleLowerCaseMapping:0x3365 + ,simpleTitleCaseMapping:0x3365 + }, + { code:0x3366 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3366 + ,simpleLowerCaseMapping:0x3366 + ,simpleTitleCaseMapping:0x3366 + }, + { code:0x3367 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3367 + ,simpleLowerCaseMapping:0x3367 + ,simpleTitleCaseMapping:0x3367 + }, + { code:0x3368 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3368 + ,simpleLowerCaseMapping:0x3368 + ,simpleTitleCaseMapping:0x3368 + }, + { code:0x3369 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3369 + ,simpleLowerCaseMapping:0x3369 + ,simpleTitleCaseMapping:0x3369 + }, + { code:0x336A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x336A + ,simpleLowerCaseMapping:0x336A + ,simpleTitleCaseMapping:0x336A + }, + { code:0x336B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x336B + ,simpleLowerCaseMapping:0x336B + ,simpleTitleCaseMapping:0x336B + }, + { code:0x336C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x336C + ,simpleLowerCaseMapping:0x336C + ,simpleTitleCaseMapping:0x336C + }, + { code:0x336D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x336D + ,simpleLowerCaseMapping:0x336D + ,simpleTitleCaseMapping:0x336D + }, + { code:0x336E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x336E + ,simpleLowerCaseMapping:0x336E + ,simpleTitleCaseMapping:0x336E + }, + { code:0x336F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x336F + ,simpleLowerCaseMapping:0x336F + ,simpleTitleCaseMapping:0x336F + }, + { code:0x3370 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3370 + ,simpleLowerCaseMapping:0x3370 + ,simpleTitleCaseMapping:0x3370 + }, + { code:0x3371 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3371 + ,simpleLowerCaseMapping:0x3371 + ,simpleTitleCaseMapping:0x3371 + }, + { code:0x3372 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3372 + ,simpleLowerCaseMapping:0x3372 + ,simpleTitleCaseMapping:0x3372 + }, + { code:0x3373 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3373 + ,simpleLowerCaseMapping:0x3373 + ,simpleTitleCaseMapping:0x3373 + }, + { code:0x3374 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3374 + ,simpleLowerCaseMapping:0x3374 + ,simpleTitleCaseMapping:0x3374 + }, + { code:0x3375 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3375 + ,simpleLowerCaseMapping:0x3375 + ,simpleTitleCaseMapping:0x3375 + }, + { code:0x3376 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3376 + ,simpleLowerCaseMapping:0x3376 + ,simpleTitleCaseMapping:0x3376 + }, + { code:0x3377 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3377 + ,simpleLowerCaseMapping:0x3377 + ,simpleTitleCaseMapping:0x3377 + }, + { code:0x3378 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3378 + ,simpleLowerCaseMapping:0x3378 + ,simpleTitleCaseMapping:0x3378 + }, + { code:0x3379 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3379 + ,simpleLowerCaseMapping:0x3379 + ,simpleTitleCaseMapping:0x3379 + }, + { code:0x337A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x337A + ,simpleLowerCaseMapping:0x337A + ,simpleTitleCaseMapping:0x337A + }, + { code:0x337B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x337B + ,simpleLowerCaseMapping:0x337B + ,simpleTitleCaseMapping:0x337B + }, + { code:0x337C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x337C + ,simpleLowerCaseMapping:0x337C + ,simpleTitleCaseMapping:0x337C + }, + { code:0x337D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x337D + ,simpleLowerCaseMapping:0x337D + ,simpleTitleCaseMapping:0x337D + }, + { code:0x337E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x337E + ,simpleLowerCaseMapping:0x337E + ,simpleTitleCaseMapping:0x337E + }, + { code:0x337F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x337F + ,simpleLowerCaseMapping:0x337F + ,simpleTitleCaseMapping:0x337F + }, + { code:0x3380 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3380 + ,simpleLowerCaseMapping:0x3380 + ,simpleTitleCaseMapping:0x3380 + }, + { code:0x3381 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3381 + ,simpleLowerCaseMapping:0x3381 + ,simpleTitleCaseMapping:0x3381 + }, + { code:0x3382 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3382 + ,simpleLowerCaseMapping:0x3382 + ,simpleTitleCaseMapping:0x3382 + }, + { code:0x3383 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3383 + ,simpleLowerCaseMapping:0x3383 + ,simpleTitleCaseMapping:0x3383 + }, + { code:0x3384 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3384 + ,simpleLowerCaseMapping:0x3384 + ,simpleTitleCaseMapping:0x3384 + }, + { code:0x3385 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3385 + ,simpleLowerCaseMapping:0x3385 + ,simpleTitleCaseMapping:0x3385 + }, + { code:0x3386 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3386 + ,simpleLowerCaseMapping:0x3386 + ,simpleTitleCaseMapping:0x3386 + }, + { code:0x3387 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3387 + ,simpleLowerCaseMapping:0x3387 + ,simpleTitleCaseMapping:0x3387 + }, + { code:0x3388 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3388 + ,simpleLowerCaseMapping:0x3388 + ,simpleTitleCaseMapping:0x3388 + }, + { code:0x3389 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3389 + ,simpleLowerCaseMapping:0x3389 + ,simpleTitleCaseMapping:0x3389 + }, + { code:0x338A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x338A + ,simpleLowerCaseMapping:0x338A + ,simpleTitleCaseMapping:0x338A + }, + { code:0x338B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x338B + ,simpleLowerCaseMapping:0x338B + ,simpleTitleCaseMapping:0x338B + }, + { code:0x338C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x338C + ,simpleLowerCaseMapping:0x338C + ,simpleTitleCaseMapping:0x338C + }, + { code:0x338D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x338D + ,simpleLowerCaseMapping:0x338D + ,simpleTitleCaseMapping:0x338D + }, + { code:0x338E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x338E + ,simpleLowerCaseMapping:0x338E + ,simpleTitleCaseMapping:0x338E + }, + { code:0x338F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x338F + ,simpleLowerCaseMapping:0x338F + ,simpleTitleCaseMapping:0x338F + }, + { code:0x3390 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3390 + ,simpleLowerCaseMapping:0x3390 + ,simpleTitleCaseMapping:0x3390 + }, + { code:0x3391 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3391 + ,simpleLowerCaseMapping:0x3391 + ,simpleTitleCaseMapping:0x3391 + }, + { code:0x3392 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3392 + ,simpleLowerCaseMapping:0x3392 + ,simpleTitleCaseMapping:0x3392 + }, + { code:0x3393 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3393 + ,simpleLowerCaseMapping:0x3393 + ,simpleTitleCaseMapping:0x3393 + }, + { code:0x3394 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3394 + ,simpleLowerCaseMapping:0x3394 + ,simpleTitleCaseMapping:0x3394 + }, + { code:0x3395 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3395 + ,simpleLowerCaseMapping:0x3395 + ,simpleTitleCaseMapping:0x3395 + }, + { code:0x3396 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3396 + ,simpleLowerCaseMapping:0x3396 + ,simpleTitleCaseMapping:0x3396 + }, + { code:0x3397 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3397 + ,simpleLowerCaseMapping:0x3397 + ,simpleTitleCaseMapping:0x3397 + }, + { code:0x3398 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3398 + ,simpleLowerCaseMapping:0x3398 + ,simpleTitleCaseMapping:0x3398 + }, + { code:0x3399 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x3399 + ,simpleLowerCaseMapping:0x3399 + ,simpleTitleCaseMapping:0x3399 + }, + { code:0x339A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x339A + ,simpleLowerCaseMapping:0x339A + ,simpleTitleCaseMapping:0x339A + }, + { code:0x339B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x339B + ,simpleLowerCaseMapping:0x339B + ,simpleTitleCaseMapping:0x339B + }, + { code:0x339C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x339C + ,simpleLowerCaseMapping:0x339C + ,simpleTitleCaseMapping:0x339C + }, + { code:0x339D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x339D + ,simpleLowerCaseMapping:0x339D + ,simpleTitleCaseMapping:0x339D + }, + { code:0x339E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x339E + ,simpleLowerCaseMapping:0x339E + ,simpleTitleCaseMapping:0x339E + }, + { code:0x339F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x339F + ,simpleLowerCaseMapping:0x339F + ,simpleTitleCaseMapping:0x339F + }, + { code:0x33A0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33A0 + ,simpleLowerCaseMapping:0x33A0 + ,simpleTitleCaseMapping:0x33A0 + }, + { code:0x33A1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33A1 + ,simpleLowerCaseMapping:0x33A1 + ,simpleTitleCaseMapping:0x33A1 + }, + { code:0x33A2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33A2 + ,simpleLowerCaseMapping:0x33A2 + ,simpleTitleCaseMapping:0x33A2 + }, + { code:0x33A3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33A3 + ,simpleLowerCaseMapping:0x33A3 + ,simpleTitleCaseMapping:0x33A3 + }, + { code:0x33A4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33A4 + ,simpleLowerCaseMapping:0x33A4 + ,simpleTitleCaseMapping:0x33A4 + }, + { code:0x33A5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33A5 + ,simpleLowerCaseMapping:0x33A5 + ,simpleTitleCaseMapping:0x33A5 + }, + { code:0x33A6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33A6 + ,simpleLowerCaseMapping:0x33A6 + ,simpleTitleCaseMapping:0x33A6 + }, + { code:0x33A7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33A7 + ,simpleLowerCaseMapping:0x33A7 + ,simpleTitleCaseMapping:0x33A7 + }, + { code:0x33A8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33A8 + ,simpleLowerCaseMapping:0x33A8 + ,simpleTitleCaseMapping:0x33A8 + }, + { code:0x33A9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33A9 + ,simpleLowerCaseMapping:0x33A9 + ,simpleTitleCaseMapping:0x33A9 + }, + { code:0x33AA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33AA + ,simpleLowerCaseMapping:0x33AA + ,simpleTitleCaseMapping:0x33AA + }, + { code:0x33AB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33AB + ,simpleLowerCaseMapping:0x33AB + ,simpleTitleCaseMapping:0x33AB + }, + { code:0x33AC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33AC + ,simpleLowerCaseMapping:0x33AC + ,simpleTitleCaseMapping:0x33AC + }, + { code:0x33AD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33AD + ,simpleLowerCaseMapping:0x33AD + ,simpleTitleCaseMapping:0x33AD + }, + { code:0x33AE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33AE + ,simpleLowerCaseMapping:0x33AE + ,simpleTitleCaseMapping:0x33AE + }, + { code:0x33AF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33AF + ,simpleLowerCaseMapping:0x33AF + ,simpleTitleCaseMapping:0x33AF + }, + { code:0x33B0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33B0 + ,simpleLowerCaseMapping:0x33B0 + ,simpleTitleCaseMapping:0x33B0 + }, + { code:0x33B1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33B1 + ,simpleLowerCaseMapping:0x33B1 + ,simpleTitleCaseMapping:0x33B1 + }, + { code:0x33B2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33B2 + ,simpleLowerCaseMapping:0x33B2 + ,simpleTitleCaseMapping:0x33B2 + }, + { code:0x33B3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33B3 + ,simpleLowerCaseMapping:0x33B3 + ,simpleTitleCaseMapping:0x33B3 + }, + { code:0x33B4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33B4 + ,simpleLowerCaseMapping:0x33B4 + ,simpleTitleCaseMapping:0x33B4 + }, + { code:0x33B5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33B5 + ,simpleLowerCaseMapping:0x33B5 + ,simpleTitleCaseMapping:0x33B5 + }, + { code:0x33B6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33B6 + ,simpleLowerCaseMapping:0x33B6 + ,simpleTitleCaseMapping:0x33B6 + }, + { code:0x33B7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33B7 + ,simpleLowerCaseMapping:0x33B7 + ,simpleTitleCaseMapping:0x33B7 + }, + { code:0x33B8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33B8 + ,simpleLowerCaseMapping:0x33B8 + ,simpleTitleCaseMapping:0x33B8 + }, + { code:0x33B9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33B9 + ,simpleLowerCaseMapping:0x33B9 + ,simpleTitleCaseMapping:0x33B9 + }, + { code:0x33BA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33BA + ,simpleLowerCaseMapping:0x33BA + ,simpleTitleCaseMapping:0x33BA + }, + { code:0x33BB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33BB + ,simpleLowerCaseMapping:0x33BB + ,simpleTitleCaseMapping:0x33BB + }, + { code:0x33BC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33BC + ,simpleLowerCaseMapping:0x33BC + ,simpleTitleCaseMapping:0x33BC + }, + { code:0x33BD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33BD + ,simpleLowerCaseMapping:0x33BD + ,simpleTitleCaseMapping:0x33BD + }, + { code:0x33BE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33BE + ,simpleLowerCaseMapping:0x33BE + ,simpleTitleCaseMapping:0x33BE + }, + { code:0x33BF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33BF + ,simpleLowerCaseMapping:0x33BF + ,simpleTitleCaseMapping:0x33BF + }, + { code:0x33C0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33C0 + ,simpleLowerCaseMapping:0x33C0 + ,simpleTitleCaseMapping:0x33C0 + }, + { code:0x33C1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33C1 + ,simpleLowerCaseMapping:0x33C1 + ,simpleTitleCaseMapping:0x33C1 + }, + { code:0x33C2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33C2 + ,simpleLowerCaseMapping:0x33C2 + ,simpleTitleCaseMapping:0x33C2 + }, + { code:0x33C3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33C3 + ,simpleLowerCaseMapping:0x33C3 + ,simpleTitleCaseMapping:0x33C3 + }, + { code:0x33C4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33C4 + ,simpleLowerCaseMapping:0x33C4 + ,simpleTitleCaseMapping:0x33C4 + }, + { code:0x33C5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33C5 + ,simpleLowerCaseMapping:0x33C5 + ,simpleTitleCaseMapping:0x33C5 + }, + { code:0x33C6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33C6 + ,simpleLowerCaseMapping:0x33C6 + ,simpleTitleCaseMapping:0x33C6 + }, + { code:0x33C7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33C7 + ,simpleLowerCaseMapping:0x33C7 + ,simpleTitleCaseMapping:0x33C7 + }, + { code:0x33C8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33C8 + ,simpleLowerCaseMapping:0x33C8 + ,simpleTitleCaseMapping:0x33C8 + }, + { code:0x33C9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33C9 + ,simpleLowerCaseMapping:0x33C9 + ,simpleTitleCaseMapping:0x33C9 + }, + { code:0x33CA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33CA + ,simpleLowerCaseMapping:0x33CA + ,simpleTitleCaseMapping:0x33CA + }, + { code:0x33CB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33CB + ,simpleLowerCaseMapping:0x33CB + ,simpleTitleCaseMapping:0x33CB + }, + { code:0x33CC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33CC + ,simpleLowerCaseMapping:0x33CC + ,simpleTitleCaseMapping:0x33CC + }, + { code:0x33CD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33CD + ,simpleLowerCaseMapping:0x33CD + ,simpleTitleCaseMapping:0x33CD + }, + { code:0x33CE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33CE + ,simpleLowerCaseMapping:0x33CE + ,simpleTitleCaseMapping:0x33CE + }, + { code:0x33CF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33CF + ,simpleLowerCaseMapping:0x33CF + ,simpleTitleCaseMapping:0x33CF + }, + { code:0x33D0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33D0 + ,simpleLowerCaseMapping:0x33D0 + ,simpleTitleCaseMapping:0x33D0 + }, + { code:0x33D1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33D1 + ,simpleLowerCaseMapping:0x33D1 + ,simpleTitleCaseMapping:0x33D1 + }, + { code:0x33D2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33D2 + ,simpleLowerCaseMapping:0x33D2 + ,simpleTitleCaseMapping:0x33D2 + }, + { code:0x33D3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33D3 + ,simpleLowerCaseMapping:0x33D3 + ,simpleTitleCaseMapping:0x33D3 + }, + { code:0x33D4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33D4 + ,simpleLowerCaseMapping:0x33D4 + ,simpleTitleCaseMapping:0x33D4 + }, + { code:0x33D5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33D5 + ,simpleLowerCaseMapping:0x33D5 + ,simpleTitleCaseMapping:0x33D5 + }, + { code:0x33D6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33D6 + ,simpleLowerCaseMapping:0x33D6 + ,simpleTitleCaseMapping:0x33D6 + }, + { code:0x33D7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33D7 + ,simpleLowerCaseMapping:0x33D7 + ,simpleTitleCaseMapping:0x33D7 + }, + { code:0x33D8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33D8 + ,simpleLowerCaseMapping:0x33D8 + ,simpleTitleCaseMapping:0x33D8 + }, + { code:0x33D9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33D9 + ,simpleLowerCaseMapping:0x33D9 + ,simpleTitleCaseMapping:0x33D9 + }, + { code:0x33DA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33DA + ,simpleLowerCaseMapping:0x33DA + ,simpleTitleCaseMapping:0x33DA + }, + { code:0x33DB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33DB + ,simpleLowerCaseMapping:0x33DB + ,simpleTitleCaseMapping:0x33DB + }, + { code:0x33DC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33DC + ,simpleLowerCaseMapping:0x33DC + ,simpleTitleCaseMapping:0x33DC + }, + { code:0x33DD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33DD + ,simpleLowerCaseMapping:0x33DD + ,simpleTitleCaseMapping:0x33DD + }, + { code:0x33DE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33DE + ,simpleLowerCaseMapping:0x33DE + ,simpleTitleCaseMapping:0x33DE + }, + { code:0x33DF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33DF + ,simpleLowerCaseMapping:0x33DF + ,simpleTitleCaseMapping:0x33DF + }, + { code:0x33E0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33E0 + ,simpleLowerCaseMapping:0x33E0 + ,simpleTitleCaseMapping:0x33E0 + }, + { code:0x33E1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33E1 + ,simpleLowerCaseMapping:0x33E1 + ,simpleTitleCaseMapping:0x33E1 + }, + { code:0x33E2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33E2 + ,simpleLowerCaseMapping:0x33E2 + ,simpleTitleCaseMapping:0x33E2 + }, + { code:0x33E3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33E3 + ,simpleLowerCaseMapping:0x33E3 + ,simpleTitleCaseMapping:0x33E3 + }, + { code:0x33E4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33E4 + ,simpleLowerCaseMapping:0x33E4 + ,simpleTitleCaseMapping:0x33E4 + }, + { code:0x33E5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33E5 + ,simpleLowerCaseMapping:0x33E5 + ,simpleTitleCaseMapping:0x33E5 + }, + { code:0x33E6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33E6 + ,simpleLowerCaseMapping:0x33E6 + ,simpleTitleCaseMapping:0x33E6 + }, + { code:0x33E7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33E7 + ,simpleLowerCaseMapping:0x33E7 + ,simpleTitleCaseMapping:0x33E7 + }, + { code:0x33E8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33E8 + ,simpleLowerCaseMapping:0x33E8 + ,simpleTitleCaseMapping:0x33E8 + }, + { code:0x33E9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33E9 + ,simpleLowerCaseMapping:0x33E9 + ,simpleTitleCaseMapping:0x33E9 + }, + { code:0x33EA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33EA + ,simpleLowerCaseMapping:0x33EA + ,simpleTitleCaseMapping:0x33EA + }, + { code:0x33EB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33EB + ,simpleLowerCaseMapping:0x33EB + ,simpleTitleCaseMapping:0x33EB + }, + { code:0x33EC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33EC + ,simpleLowerCaseMapping:0x33EC + ,simpleTitleCaseMapping:0x33EC + }, + { code:0x33ED + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33ED + ,simpleLowerCaseMapping:0x33ED + ,simpleTitleCaseMapping:0x33ED + }, + { code:0x33EE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33EE + ,simpleLowerCaseMapping:0x33EE + ,simpleTitleCaseMapping:0x33EE + }, + { code:0x33EF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33EF + ,simpleLowerCaseMapping:0x33EF + ,simpleTitleCaseMapping:0x33EF + }, + { code:0x33F0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33F0 + ,simpleLowerCaseMapping:0x33F0 + ,simpleTitleCaseMapping:0x33F0 + }, + { code:0x33F1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33F1 + ,simpleLowerCaseMapping:0x33F1 + ,simpleTitleCaseMapping:0x33F1 + }, + { code:0x33F2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33F2 + ,simpleLowerCaseMapping:0x33F2 + ,simpleTitleCaseMapping:0x33F2 + }, + { code:0x33F3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33F3 + ,simpleLowerCaseMapping:0x33F3 + ,simpleTitleCaseMapping:0x33F3 + }, + { code:0x33F4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33F4 + ,simpleLowerCaseMapping:0x33F4 + ,simpleTitleCaseMapping:0x33F4 + }, + { code:0x33F5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33F5 + ,simpleLowerCaseMapping:0x33F5 + ,simpleTitleCaseMapping:0x33F5 + }, + { code:0x33F6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33F6 + ,simpleLowerCaseMapping:0x33F6 + ,simpleTitleCaseMapping:0x33F6 + }, + { code:0x33F7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33F7 + ,simpleLowerCaseMapping:0x33F7 + ,simpleTitleCaseMapping:0x33F7 + }, + { code:0x33F8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33F8 + ,simpleLowerCaseMapping:0x33F8 + ,simpleTitleCaseMapping:0x33F8 + }, + { code:0x33F9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33F9 + ,simpleLowerCaseMapping:0x33F9 + ,simpleTitleCaseMapping:0x33F9 + }, + { code:0x33FA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33FA + ,simpleLowerCaseMapping:0x33FA + ,simpleTitleCaseMapping:0x33FA + }, + { code:0x33FB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33FB + ,simpleLowerCaseMapping:0x33FB + ,simpleTitleCaseMapping:0x33FB + }, + { code:0x33FC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33FC + ,simpleLowerCaseMapping:0x33FC + ,simpleTitleCaseMapping:0x33FC + }, + { code:0x33FD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33FD + ,simpleLowerCaseMapping:0x33FD + ,simpleTitleCaseMapping:0x33FD + }, + { code:0x33FE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33FE + ,simpleLowerCaseMapping:0x33FE + ,simpleTitleCaseMapping:0x33FE + }, + { code:0x33FF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x33FF + ,simpleLowerCaseMapping:0x33FF + ,simpleTitleCaseMapping:0x33FF + }, + { code:0x3400 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x3400 + ,simpleLowerCaseMapping:0x3400 + ,simpleTitleCaseMapping:0x3400 + }, + { code:0x4DB5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x4DB5 + ,simpleLowerCaseMapping:0x4DB5 + ,simpleTitleCaseMapping:0x4DB5 + }, + { code:0x4DC0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DC0 + ,simpleLowerCaseMapping:0x4DC0 + ,simpleTitleCaseMapping:0x4DC0 + }, + { code:0x4DC1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DC1 + ,simpleLowerCaseMapping:0x4DC1 + ,simpleTitleCaseMapping:0x4DC1 + }, + { code:0x4DC2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DC2 + ,simpleLowerCaseMapping:0x4DC2 + ,simpleTitleCaseMapping:0x4DC2 + }, + { code:0x4DC3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DC3 + ,simpleLowerCaseMapping:0x4DC3 + ,simpleTitleCaseMapping:0x4DC3 + }, + { code:0x4DC4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DC4 + ,simpleLowerCaseMapping:0x4DC4 + ,simpleTitleCaseMapping:0x4DC4 + }, + { code:0x4DC5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DC5 + ,simpleLowerCaseMapping:0x4DC5 + ,simpleTitleCaseMapping:0x4DC5 + }, + { code:0x4DC6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DC6 + ,simpleLowerCaseMapping:0x4DC6 + ,simpleTitleCaseMapping:0x4DC6 + }, + { code:0x4DC7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DC7 + ,simpleLowerCaseMapping:0x4DC7 + ,simpleTitleCaseMapping:0x4DC7 + }, + { code:0x4DC8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DC8 + ,simpleLowerCaseMapping:0x4DC8 + ,simpleTitleCaseMapping:0x4DC8 + }, + { code:0x4DC9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DC9 + ,simpleLowerCaseMapping:0x4DC9 + ,simpleTitleCaseMapping:0x4DC9 + }, + { code:0x4DCA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DCA + ,simpleLowerCaseMapping:0x4DCA + ,simpleTitleCaseMapping:0x4DCA + }, + { code:0x4DCB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DCB + ,simpleLowerCaseMapping:0x4DCB + ,simpleTitleCaseMapping:0x4DCB + }, + { code:0x4DCC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DCC + ,simpleLowerCaseMapping:0x4DCC + ,simpleTitleCaseMapping:0x4DCC + }, + { code:0x4DCD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DCD + ,simpleLowerCaseMapping:0x4DCD + ,simpleTitleCaseMapping:0x4DCD + }, + { code:0x4DCE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DCE + ,simpleLowerCaseMapping:0x4DCE + ,simpleTitleCaseMapping:0x4DCE + }, + { code:0x4DCF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DCF + ,simpleLowerCaseMapping:0x4DCF + ,simpleTitleCaseMapping:0x4DCF + }, + { code:0x4DD0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DD0 + ,simpleLowerCaseMapping:0x4DD0 + ,simpleTitleCaseMapping:0x4DD0 + }, + { code:0x4DD1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DD1 + ,simpleLowerCaseMapping:0x4DD1 + ,simpleTitleCaseMapping:0x4DD1 + }, + { code:0x4DD2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DD2 + ,simpleLowerCaseMapping:0x4DD2 + ,simpleTitleCaseMapping:0x4DD2 + }, + { code:0x4DD3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DD3 + ,simpleLowerCaseMapping:0x4DD3 + ,simpleTitleCaseMapping:0x4DD3 + }, + { code:0x4DD4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DD4 + ,simpleLowerCaseMapping:0x4DD4 + ,simpleTitleCaseMapping:0x4DD4 + }, + { code:0x4DD5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DD5 + ,simpleLowerCaseMapping:0x4DD5 + ,simpleTitleCaseMapping:0x4DD5 + }, + { code:0x4DD6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DD6 + ,simpleLowerCaseMapping:0x4DD6 + ,simpleTitleCaseMapping:0x4DD6 + }, + { code:0x4DD7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DD7 + ,simpleLowerCaseMapping:0x4DD7 + ,simpleTitleCaseMapping:0x4DD7 + }, + { code:0x4DD8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DD8 + ,simpleLowerCaseMapping:0x4DD8 + ,simpleTitleCaseMapping:0x4DD8 + }, + { code:0x4DD9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DD9 + ,simpleLowerCaseMapping:0x4DD9 + ,simpleTitleCaseMapping:0x4DD9 + }, + { code:0x4DDA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DDA + ,simpleLowerCaseMapping:0x4DDA + ,simpleTitleCaseMapping:0x4DDA + }, + { code:0x4DDB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DDB + ,simpleLowerCaseMapping:0x4DDB + ,simpleTitleCaseMapping:0x4DDB + }, + { code:0x4DDC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DDC + ,simpleLowerCaseMapping:0x4DDC + ,simpleTitleCaseMapping:0x4DDC + }, + { code:0x4DDD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DDD + ,simpleLowerCaseMapping:0x4DDD + ,simpleTitleCaseMapping:0x4DDD + }, + { code:0x4DDE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DDE + ,simpleLowerCaseMapping:0x4DDE + ,simpleTitleCaseMapping:0x4DDE + }, + { code:0x4DDF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DDF + ,simpleLowerCaseMapping:0x4DDF + ,simpleTitleCaseMapping:0x4DDF + }, + { code:0x4DE0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DE0 + ,simpleLowerCaseMapping:0x4DE0 + ,simpleTitleCaseMapping:0x4DE0 + }, + { code:0x4DE1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DE1 + ,simpleLowerCaseMapping:0x4DE1 + ,simpleTitleCaseMapping:0x4DE1 + }, + { code:0x4DE2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DE2 + ,simpleLowerCaseMapping:0x4DE2 + ,simpleTitleCaseMapping:0x4DE2 + }, + { code:0x4DE3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DE3 + ,simpleLowerCaseMapping:0x4DE3 + ,simpleTitleCaseMapping:0x4DE3 + }, + { code:0x4DE4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DE4 + ,simpleLowerCaseMapping:0x4DE4 + ,simpleTitleCaseMapping:0x4DE4 + }, + { code:0x4DE5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DE5 + ,simpleLowerCaseMapping:0x4DE5 + ,simpleTitleCaseMapping:0x4DE5 + }, + { code:0x4DE6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DE6 + ,simpleLowerCaseMapping:0x4DE6 + ,simpleTitleCaseMapping:0x4DE6 + }, + { code:0x4DE7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DE7 + ,simpleLowerCaseMapping:0x4DE7 + ,simpleTitleCaseMapping:0x4DE7 + }, + { code:0x4DE8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DE8 + ,simpleLowerCaseMapping:0x4DE8 + ,simpleTitleCaseMapping:0x4DE8 + }, + { code:0x4DE9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DE9 + ,simpleLowerCaseMapping:0x4DE9 + ,simpleTitleCaseMapping:0x4DE9 + }, + { code:0x4DEA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DEA + ,simpleLowerCaseMapping:0x4DEA + ,simpleTitleCaseMapping:0x4DEA + }, + { code:0x4DEB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DEB + ,simpleLowerCaseMapping:0x4DEB + ,simpleTitleCaseMapping:0x4DEB + }, + { code:0x4DEC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DEC + ,simpleLowerCaseMapping:0x4DEC + ,simpleTitleCaseMapping:0x4DEC + }, + { code:0x4DED + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DED + ,simpleLowerCaseMapping:0x4DED + ,simpleTitleCaseMapping:0x4DED + }, + { code:0x4DEE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DEE + ,simpleLowerCaseMapping:0x4DEE + ,simpleTitleCaseMapping:0x4DEE + }, + { code:0x4DEF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DEF + ,simpleLowerCaseMapping:0x4DEF + ,simpleTitleCaseMapping:0x4DEF + }, + { code:0x4DF0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DF0 + ,simpleLowerCaseMapping:0x4DF0 + ,simpleTitleCaseMapping:0x4DF0 + }, + { code:0x4DF1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DF1 + ,simpleLowerCaseMapping:0x4DF1 + ,simpleTitleCaseMapping:0x4DF1 + }, + { code:0x4DF2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DF2 + ,simpleLowerCaseMapping:0x4DF2 + ,simpleTitleCaseMapping:0x4DF2 + }, + { code:0x4DF3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DF3 + ,simpleLowerCaseMapping:0x4DF3 + ,simpleTitleCaseMapping:0x4DF3 + }, + { code:0x4DF4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DF4 + ,simpleLowerCaseMapping:0x4DF4 + ,simpleTitleCaseMapping:0x4DF4 + }, + { code:0x4DF5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DF5 + ,simpleLowerCaseMapping:0x4DF5 + ,simpleTitleCaseMapping:0x4DF5 + }, + { code:0x4DF6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DF6 + ,simpleLowerCaseMapping:0x4DF6 + ,simpleTitleCaseMapping:0x4DF6 + }, + { code:0x4DF7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DF7 + ,simpleLowerCaseMapping:0x4DF7 + ,simpleTitleCaseMapping:0x4DF7 + }, + { code:0x4DF8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DF8 + ,simpleLowerCaseMapping:0x4DF8 + ,simpleTitleCaseMapping:0x4DF8 + }, + { code:0x4DF9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DF9 + ,simpleLowerCaseMapping:0x4DF9 + ,simpleTitleCaseMapping:0x4DF9 + }, + { code:0x4DFA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DFA + ,simpleLowerCaseMapping:0x4DFA + ,simpleTitleCaseMapping:0x4DFA + }, + { code:0x4DFB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DFB + ,simpleLowerCaseMapping:0x4DFB + ,simpleTitleCaseMapping:0x4DFB + }, + { code:0x4DFC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DFC + ,simpleLowerCaseMapping:0x4DFC + ,simpleTitleCaseMapping:0x4DFC + }, + { code:0x4DFD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DFD + ,simpleLowerCaseMapping:0x4DFD + ,simpleTitleCaseMapping:0x4DFD + }, + { code:0x4DFE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DFE + ,simpleLowerCaseMapping:0x4DFE + ,simpleTitleCaseMapping:0x4DFE + }, + { code:0x4DFF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x4DFF + ,simpleLowerCaseMapping:0x4DFF + ,simpleTitleCaseMapping:0x4DFF + }, + { code:0x4E00 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x4E00 + ,simpleLowerCaseMapping:0x4E00 + ,simpleTitleCaseMapping:0x4E00 + }, + { code:0x9FBB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x9FBB + ,simpleLowerCaseMapping:0x9FBB + ,simpleTitleCaseMapping:0x9FBB + }, + { code:0xA000 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA000 + ,simpleLowerCaseMapping:0xA000 + ,simpleTitleCaseMapping:0xA000 + }, + { code:0xA001 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA001 + ,simpleLowerCaseMapping:0xA001 + ,simpleTitleCaseMapping:0xA001 + }, + { code:0xA002 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA002 + ,simpleLowerCaseMapping:0xA002 + ,simpleTitleCaseMapping:0xA002 + }, + { code:0xA003 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA003 + ,simpleLowerCaseMapping:0xA003 + ,simpleTitleCaseMapping:0xA003 + }, + { code:0xA004 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA004 + ,simpleLowerCaseMapping:0xA004 + ,simpleTitleCaseMapping:0xA004 + }, + { code:0xA005 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA005 + ,simpleLowerCaseMapping:0xA005 + ,simpleTitleCaseMapping:0xA005 + }, + { code:0xA006 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA006 + ,simpleLowerCaseMapping:0xA006 + ,simpleTitleCaseMapping:0xA006 + }, + { code:0xA007 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA007 + ,simpleLowerCaseMapping:0xA007 + ,simpleTitleCaseMapping:0xA007 + }, + { code:0xA008 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA008 + ,simpleLowerCaseMapping:0xA008 + ,simpleTitleCaseMapping:0xA008 + }, + { code:0xA009 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA009 + ,simpleLowerCaseMapping:0xA009 + ,simpleTitleCaseMapping:0xA009 + }, + { code:0xA00A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA00A + ,simpleLowerCaseMapping:0xA00A + ,simpleTitleCaseMapping:0xA00A + }, + { code:0xA00B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA00B + ,simpleLowerCaseMapping:0xA00B + ,simpleTitleCaseMapping:0xA00B + }, + { code:0xA00C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA00C + ,simpleLowerCaseMapping:0xA00C + ,simpleTitleCaseMapping:0xA00C + }, + { code:0xA00D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA00D + ,simpleLowerCaseMapping:0xA00D + ,simpleTitleCaseMapping:0xA00D + }, + { code:0xA00E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA00E + ,simpleLowerCaseMapping:0xA00E + ,simpleTitleCaseMapping:0xA00E + }, + { code:0xA00F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA00F + ,simpleLowerCaseMapping:0xA00F + ,simpleTitleCaseMapping:0xA00F + }, + { code:0xA010 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA010 + ,simpleLowerCaseMapping:0xA010 + ,simpleTitleCaseMapping:0xA010 + }, + { code:0xA011 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA011 + ,simpleLowerCaseMapping:0xA011 + ,simpleTitleCaseMapping:0xA011 + }, + { code:0xA012 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA012 + ,simpleLowerCaseMapping:0xA012 + ,simpleTitleCaseMapping:0xA012 + }, + { code:0xA013 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA013 + ,simpleLowerCaseMapping:0xA013 + ,simpleTitleCaseMapping:0xA013 + }, + { code:0xA014 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA014 + ,simpleLowerCaseMapping:0xA014 + ,simpleTitleCaseMapping:0xA014 + }, + { code:0xA015 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0xA015 + ,simpleLowerCaseMapping:0xA015 + ,simpleTitleCaseMapping:0xA015 + }, + { code:0xA016 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA016 + ,simpleLowerCaseMapping:0xA016 + ,simpleTitleCaseMapping:0xA016 + }, + { code:0xA017 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA017 + ,simpleLowerCaseMapping:0xA017 + ,simpleTitleCaseMapping:0xA017 + }, + { code:0xA018 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA018 + ,simpleLowerCaseMapping:0xA018 + ,simpleTitleCaseMapping:0xA018 + }, + { code:0xA019 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA019 + ,simpleLowerCaseMapping:0xA019 + ,simpleTitleCaseMapping:0xA019 + }, + { code:0xA01A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA01A + ,simpleLowerCaseMapping:0xA01A + ,simpleTitleCaseMapping:0xA01A + }, + { code:0xA01B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA01B + ,simpleLowerCaseMapping:0xA01B + ,simpleTitleCaseMapping:0xA01B + }, + { code:0xA01C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA01C + ,simpleLowerCaseMapping:0xA01C + ,simpleTitleCaseMapping:0xA01C + }, + { code:0xA01D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA01D + ,simpleLowerCaseMapping:0xA01D + ,simpleTitleCaseMapping:0xA01D + }, + { code:0xA01E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA01E + ,simpleLowerCaseMapping:0xA01E + ,simpleTitleCaseMapping:0xA01E + }, + { code:0xA01F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA01F + ,simpleLowerCaseMapping:0xA01F + ,simpleTitleCaseMapping:0xA01F + }, + { code:0xA020 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA020 + ,simpleLowerCaseMapping:0xA020 + ,simpleTitleCaseMapping:0xA020 + }, + { code:0xA021 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA021 + ,simpleLowerCaseMapping:0xA021 + ,simpleTitleCaseMapping:0xA021 + }, + { code:0xA022 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA022 + ,simpleLowerCaseMapping:0xA022 + ,simpleTitleCaseMapping:0xA022 + }, + { code:0xA023 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA023 + ,simpleLowerCaseMapping:0xA023 + ,simpleTitleCaseMapping:0xA023 + }, + { code:0xA024 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA024 + ,simpleLowerCaseMapping:0xA024 + ,simpleTitleCaseMapping:0xA024 + }, + { code:0xA025 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA025 + ,simpleLowerCaseMapping:0xA025 + ,simpleTitleCaseMapping:0xA025 + }, + { code:0xA026 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA026 + ,simpleLowerCaseMapping:0xA026 + ,simpleTitleCaseMapping:0xA026 + }, + { code:0xA027 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA027 + ,simpleLowerCaseMapping:0xA027 + ,simpleTitleCaseMapping:0xA027 + }, + { code:0xA028 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA028 + ,simpleLowerCaseMapping:0xA028 + ,simpleTitleCaseMapping:0xA028 + }, + { code:0xA029 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA029 + ,simpleLowerCaseMapping:0xA029 + ,simpleTitleCaseMapping:0xA029 + }, + { code:0xA02A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA02A + ,simpleLowerCaseMapping:0xA02A + ,simpleTitleCaseMapping:0xA02A + }, + { code:0xA02B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA02B + ,simpleLowerCaseMapping:0xA02B + ,simpleTitleCaseMapping:0xA02B + }, + { code:0xA02C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA02C + ,simpleLowerCaseMapping:0xA02C + ,simpleTitleCaseMapping:0xA02C + }, + { code:0xA02D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA02D + ,simpleLowerCaseMapping:0xA02D + ,simpleTitleCaseMapping:0xA02D + }, + { code:0xA02E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA02E + ,simpleLowerCaseMapping:0xA02E + ,simpleTitleCaseMapping:0xA02E + }, + { code:0xA02F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA02F + ,simpleLowerCaseMapping:0xA02F + ,simpleTitleCaseMapping:0xA02F + }, + { code:0xA030 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA030 + ,simpleLowerCaseMapping:0xA030 + ,simpleTitleCaseMapping:0xA030 + }, + { code:0xA031 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA031 + ,simpleLowerCaseMapping:0xA031 + ,simpleTitleCaseMapping:0xA031 + }, + { code:0xA032 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA032 + ,simpleLowerCaseMapping:0xA032 + ,simpleTitleCaseMapping:0xA032 + }, + { code:0xA033 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA033 + ,simpleLowerCaseMapping:0xA033 + ,simpleTitleCaseMapping:0xA033 + }, + { code:0xA034 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA034 + ,simpleLowerCaseMapping:0xA034 + ,simpleTitleCaseMapping:0xA034 + }, + { code:0xA035 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA035 + ,simpleLowerCaseMapping:0xA035 + ,simpleTitleCaseMapping:0xA035 + }, + { code:0xA036 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA036 + ,simpleLowerCaseMapping:0xA036 + ,simpleTitleCaseMapping:0xA036 + }, + { code:0xA037 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA037 + ,simpleLowerCaseMapping:0xA037 + ,simpleTitleCaseMapping:0xA037 + }, + { code:0xA038 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA038 + ,simpleLowerCaseMapping:0xA038 + ,simpleTitleCaseMapping:0xA038 + }, + { code:0xA039 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA039 + ,simpleLowerCaseMapping:0xA039 + ,simpleTitleCaseMapping:0xA039 + }, + { code:0xA03A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA03A + ,simpleLowerCaseMapping:0xA03A + ,simpleTitleCaseMapping:0xA03A + }, + { code:0xA03B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA03B + ,simpleLowerCaseMapping:0xA03B + ,simpleTitleCaseMapping:0xA03B + }, + { code:0xA03C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA03C + ,simpleLowerCaseMapping:0xA03C + ,simpleTitleCaseMapping:0xA03C + }, + { code:0xA03D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA03D + ,simpleLowerCaseMapping:0xA03D + ,simpleTitleCaseMapping:0xA03D + }, + { code:0xA03E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA03E + ,simpleLowerCaseMapping:0xA03E + ,simpleTitleCaseMapping:0xA03E + }, + { code:0xA03F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA03F + ,simpleLowerCaseMapping:0xA03F + ,simpleTitleCaseMapping:0xA03F + }, + { code:0xA040 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA040 + ,simpleLowerCaseMapping:0xA040 + ,simpleTitleCaseMapping:0xA040 + }, + { code:0xA041 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA041 + ,simpleLowerCaseMapping:0xA041 + ,simpleTitleCaseMapping:0xA041 + }, + { code:0xA042 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA042 + ,simpleLowerCaseMapping:0xA042 + ,simpleTitleCaseMapping:0xA042 + }, + { code:0xA043 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA043 + ,simpleLowerCaseMapping:0xA043 + ,simpleTitleCaseMapping:0xA043 + }, + { code:0xA044 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA044 + ,simpleLowerCaseMapping:0xA044 + ,simpleTitleCaseMapping:0xA044 + }, + { code:0xA045 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA045 + ,simpleLowerCaseMapping:0xA045 + ,simpleTitleCaseMapping:0xA045 + }, + { code:0xA046 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA046 + ,simpleLowerCaseMapping:0xA046 + ,simpleTitleCaseMapping:0xA046 + }, + { code:0xA047 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA047 + ,simpleLowerCaseMapping:0xA047 + ,simpleTitleCaseMapping:0xA047 + }, + { code:0xA048 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA048 + ,simpleLowerCaseMapping:0xA048 + ,simpleTitleCaseMapping:0xA048 + }, + { code:0xA049 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA049 + ,simpleLowerCaseMapping:0xA049 + ,simpleTitleCaseMapping:0xA049 + }, + { code:0xA04A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA04A + ,simpleLowerCaseMapping:0xA04A + ,simpleTitleCaseMapping:0xA04A + }, + { code:0xA04B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA04B + ,simpleLowerCaseMapping:0xA04B + ,simpleTitleCaseMapping:0xA04B + }, + { code:0xA04C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA04C + ,simpleLowerCaseMapping:0xA04C + ,simpleTitleCaseMapping:0xA04C + }, + { code:0xA04D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA04D + ,simpleLowerCaseMapping:0xA04D + ,simpleTitleCaseMapping:0xA04D + }, + { code:0xA04E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA04E + ,simpleLowerCaseMapping:0xA04E + ,simpleTitleCaseMapping:0xA04E + }, + { code:0xA04F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA04F + ,simpleLowerCaseMapping:0xA04F + ,simpleTitleCaseMapping:0xA04F + }, + { code:0xA050 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA050 + ,simpleLowerCaseMapping:0xA050 + ,simpleTitleCaseMapping:0xA050 + }, + { code:0xA051 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA051 + ,simpleLowerCaseMapping:0xA051 + ,simpleTitleCaseMapping:0xA051 + }, + { code:0xA052 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA052 + ,simpleLowerCaseMapping:0xA052 + ,simpleTitleCaseMapping:0xA052 + }, + { code:0xA053 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA053 + ,simpleLowerCaseMapping:0xA053 + ,simpleTitleCaseMapping:0xA053 + }, + { code:0xA054 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA054 + ,simpleLowerCaseMapping:0xA054 + ,simpleTitleCaseMapping:0xA054 + }, + { code:0xA055 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA055 + ,simpleLowerCaseMapping:0xA055 + ,simpleTitleCaseMapping:0xA055 + }, + { code:0xA056 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA056 + ,simpleLowerCaseMapping:0xA056 + ,simpleTitleCaseMapping:0xA056 + }, + { code:0xA057 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA057 + ,simpleLowerCaseMapping:0xA057 + ,simpleTitleCaseMapping:0xA057 + }, + { code:0xA058 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA058 + ,simpleLowerCaseMapping:0xA058 + ,simpleTitleCaseMapping:0xA058 + }, + { code:0xA059 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA059 + ,simpleLowerCaseMapping:0xA059 + ,simpleTitleCaseMapping:0xA059 + }, + { code:0xA05A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA05A + ,simpleLowerCaseMapping:0xA05A + ,simpleTitleCaseMapping:0xA05A + }, + { code:0xA05B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA05B + ,simpleLowerCaseMapping:0xA05B + ,simpleTitleCaseMapping:0xA05B + }, + { code:0xA05C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA05C + ,simpleLowerCaseMapping:0xA05C + ,simpleTitleCaseMapping:0xA05C + }, + { code:0xA05D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA05D + ,simpleLowerCaseMapping:0xA05D + ,simpleTitleCaseMapping:0xA05D + }, + { code:0xA05E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA05E + ,simpleLowerCaseMapping:0xA05E + ,simpleTitleCaseMapping:0xA05E + }, + { code:0xA05F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA05F + ,simpleLowerCaseMapping:0xA05F + ,simpleTitleCaseMapping:0xA05F + }, + { code:0xA060 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA060 + ,simpleLowerCaseMapping:0xA060 + ,simpleTitleCaseMapping:0xA060 + }, + { code:0xA061 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA061 + ,simpleLowerCaseMapping:0xA061 + ,simpleTitleCaseMapping:0xA061 + }, + { code:0xA062 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA062 + ,simpleLowerCaseMapping:0xA062 + ,simpleTitleCaseMapping:0xA062 + }, + { code:0xA063 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA063 + ,simpleLowerCaseMapping:0xA063 + ,simpleTitleCaseMapping:0xA063 + }, + { code:0xA064 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA064 + ,simpleLowerCaseMapping:0xA064 + ,simpleTitleCaseMapping:0xA064 + }, + { code:0xA065 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA065 + ,simpleLowerCaseMapping:0xA065 + ,simpleTitleCaseMapping:0xA065 + }, + { code:0xA066 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA066 + ,simpleLowerCaseMapping:0xA066 + ,simpleTitleCaseMapping:0xA066 + }, + { code:0xA067 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA067 + ,simpleLowerCaseMapping:0xA067 + ,simpleTitleCaseMapping:0xA067 + }, + { code:0xA068 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA068 + ,simpleLowerCaseMapping:0xA068 + ,simpleTitleCaseMapping:0xA068 + }, + { code:0xA069 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA069 + ,simpleLowerCaseMapping:0xA069 + ,simpleTitleCaseMapping:0xA069 + }, + { code:0xA06A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA06A + ,simpleLowerCaseMapping:0xA06A + ,simpleTitleCaseMapping:0xA06A + }, + { code:0xA06B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA06B + ,simpleLowerCaseMapping:0xA06B + ,simpleTitleCaseMapping:0xA06B + }, + { code:0xA06C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA06C + ,simpleLowerCaseMapping:0xA06C + ,simpleTitleCaseMapping:0xA06C + }, + { code:0xA06D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA06D + ,simpleLowerCaseMapping:0xA06D + ,simpleTitleCaseMapping:0xA06D + }, + { code:0xA06E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA06E + ,simpleLowerCaseMapping:0xA06E + ,simpleTitleCaseMapping:0xA06E + }, + { code:0xA06F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA06F + ,simpleLowerCaseMapping:0xA06F + ,simpleTitleCaseMapping:0xA06F + }, + { code:0xA070 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA070 + ,simpleLowerCaseMapping:0xA070 + ,simpleTitleCaseMapping:0xA070 + }, + { code:0xA071 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA071 + ,simpleLowerCaseMapping:0xA071 + ,simpleTitleCaseMapping:0xA071 + }, + { code:0xA072 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA072 + ,simpleLowerCaseMapping:0xA072 + ,simpleTitleCaseMapping:0xA072 + }, + { code:0xA073 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA073 + ,simpleLowerCaseMapping:0xA073 + ,simpleTitleCaseMapping:0xA073 + }, + { code:0xA074 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA074 + ,simpleLowerCaseMapping:0xA074 + ,simpleTitleCaseMapping:0xA074 + }, + { code:0xA075 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA075 + ,simpleLowerCaseMapping:0xA075 + ,simpleTitleCaseMapping:0xA075 + }, + { code:0xA076 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA076 + ,simpleLowerCaseMapping:0xA076 + ,simpleTitleCaseMapping:0xA076 + }, + { code:0xA077 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA077 + ,simpleLowerCaseMapping:0xA077 + ,simpleTitleCaseMapping:0xA077 + }, + { code:0xA078 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA078 + ,simpleLowerCaseMapping:0xA078 + ,simpleTitleCaseMapping:0xA078 + }, + { code:0xA079 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA079 + ,simpleLowerCaseMapping:0xA079 + ,simpleTitleCaseMapping:0xA079 + }, + { code:0xA07A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA07A + ,simpleLowerCaseMapping:0xA07A + ,simpleTitleCaseMapping:0xA07A + }, + { code:0xA07B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA07B + ,simpleLowerCaseMapping:0xA07B + ,simpleTitleCaseMapping:0xA07B + }, + { code:0xA07C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA07C + ,simpleLowerCaseMapping:0xA07C + ,simpleTitleCaseMapping:0xA07C + }, + { code:0xA07D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA07D + ,simpleLowerCaseMapping:0xA07D + ,simpleTitleCaseMapping:0xA07D + }, + { code:0xA07E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA07E + ,simpleLowerCaseMapping:0xA07E + ,simpleTitleCaseMapping:0xA07E + }, + { code:0xA07F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA07F + ,simpleLowerCaseMapping:0xA07F + ,simpleTitleCaseMapping:0xA07F + }, + { code:0xA080 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA080 + ,simpleLowerCaseMapping:0xA080 + ,simpleTitleCaseMapping:0xA080 + }, + { code:0xA081 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA081 + ,simpleLowerCaseMapping:0xA081 + ,simpleTitleCaseMapping:0xA081 + }, + { code:0xA082 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA082 + ,simpleLowerCaseMapping:0xA082 + ,simpleTitleCaseMapping:0xA082 + }, + { code:0xA083 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA083 + ,simpleLowerCaseMapping:0xA083 + ,simpleTitleCaseMapping:0xA083 + }, + { code:0xA084 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA084 + ,simpleLowerCaseMapping:0xA084 + ,simpleTitleCaseMapping:0xA084 + }, + { code:0xA085 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA085 + ,simpleLowerCaseMapping:0xA085 + ,simpleTitleCaseMapping:0xA085 + }, + { code:0xA086 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA086 + ,simpleLowerCaseMapping:0xA086 + ,simpleTitleCaseMapping:0xA086 + }, + { code:0xA087 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA087 + ,simpleLowerCaseMapping:0xA087 + ,simpleTitleCaseMapping:0xA087 + }, + { code:0xA088 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA088 + ,simpleLowerCaseMapping:0xA088 + ,simpleTitleCaseMapping:0xA088 + }, + { code:0xA089 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA089 + ,simpleLowerCaseMapping:0xA089 + ,simpleTitleCaseMapping:0xA089 + }, + { code:0xA08A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA08A + ,simpleLowerCaseMapping:0xA08A + ,simpleTitleCaseMapping:0xA08A + }, + { code:0xA08B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA08B + ,simpleLowerCaseMapping:0xA08B + ,simpleTitleCaseMapping:0xA08B + }, + { code:0xA08C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA08C + ,simpleLowerCaseMapping:0xA08C + ,simpleTitleCaseMapping:0xA08C + }, + { code:0xA08D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA08D + ,simpleLowerCaseMapping:0xA08D + ,simpleTitleCaseMapping:0xA08D + }, + { code:0xA08E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA08E + ,simpleLowerCaseMapping:0xA08E + ,simpleTitleCaseMapping:0xA08E + }, + { code:0xA08F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA08F + ,simpleLowerCaseMapping:0xA08F + ,simpleTitleCaseMapping:0xA08F + }, + { code:0xA090 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA090 + ,simpleLowerCaseMapping:0xA090 + ,simpleTitleCaseMapping:0xA090 + }, + { code:0xA091 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA091 + ,simpleLowerCaseMapping:0xA091 + ,simpleTitleCaseMapping:0xA091 + }, + { code:0xA092 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA092 + ,simpleLowerCaseMapping:0xA092 + ,simpleTitleCaseMapping:0xA092 + }, + { code:0xA093 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA093 + ,simpleLowerCaseMapping:0xA093 + ,simpleTitleCaseMapping:0xA093 + }, + { code:0xA094 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA094 + ,simpleLowerCaseMapping:0xA094 + ,simpleTitleCaseMapping:0xA094 + }, + { code:0xA095 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA095 + ,simpleLowerCaseMapping:0xA095 + ,simpleTitleCaseMapping:0xA095 + }, + { code:0xA096 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA096 + ,simpleLowerCaseMapping:0xA096 + ,simpleTitleCaseMapping:0xA096 + }, + { code:0xA097 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA097 + ,simpleLowerCaseMapping:0xA097 + ,simpleTitleCaseMapping:0xA097 + }, + { code:0xA098 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA098 + ,simpleLowerCaseMapping:0xA098 + ,simpleTitleCaseMapping:0xA098 + }, + { code:0xA099 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA099 + ,simpleLowerCaseMapping:0xA099 + ,simpleTitleCaseMapping:0xA099 + }, + { code:0xA09A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA09A + ,simpleLowerCaseMapping:0xA09A + ,simpleTitleCaseMapping:0xA09A + }, + { code:0xA09B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA09B + ,simpleLowerCaseMapping:0xA09B + ,simpleTitleCaseMapping:0xA09B + }, + { code:0xA09C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA09C + ,simpleLowerCaseMapping:0xA09C + ,simpleTitleCaseMapping:0xA09C + }, + { code:0xA09D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA09D + ,simpleLowerCaseMapping:0xA09D + ,simpleTitleCaseMapping:0xA09D + }, + { code:0xA09E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA09E + ,simpleLowerCaseMapping:0xA09E + ,simpleTitleCaseMapping:0xA09E + }, + { code:0xA09F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA09F + ,simpleLowerCaseMapping:0xA09F + ,simpleTitleCaseMapping:0xA09F + }, + { code:0xA0A0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0A0 + ,simpleLowerCaseMapping:0xA0A0 + ,simpleTitleCaseMapping:0xA0A0 + }, + { code:0xA0A1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0A1 + ,simpleLowerCaseMapping:0xA0A1 + ,simpleTitleCaseMapping:0xA0A1 + }, + { code:0xA0A2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0A2 + ,simpleLowerCaseMapping:0xA0A2 + ,simpleTitleCaseMapping:0xA0A2 + }, + { code:0xA0A3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0A3 + ,simpleLowerCaseMapping:0xA0A3 + ,simpleTitleCaseMapping:0xA0A3 + }, + { code:0xA0A4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0A4 + ,simpleLowerCaseMapping:0xA0A4 + ,simpleTitleCaseMapping:0xA0A4 + }, + { code:0xA0A5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0A5 + ,simpleLowerCaseMapping:0xA0A5 + ,simpleTitleCaseMapping:0xA0A5 + }, + { code:0xA0A6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0A6 + ,simpleLowerCaseMapping:0xA0A6 + ,simpleTitleCaseMapping:0xA0A6 + }, + { code:0xA0A7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0A7 + ,simpleLowerCaseMapping:0xA0A7 + ,simpleTitleCaseMapping:0xA0A7 + }, + { code:0xA0A8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0A8 + ,simpleLowerCaseMapping:0xA0A8 + ,simpleTitleCaseMapping:0xA0A8 + }, + { code:0xA0A9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0A9 + ,simpleLowerCaseMapping:0xA0A9 + ,simpleTitleCaseMapping:0xA0A9 + }, + { code:0xA0AA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0AA + ,simpleLowerCaseMapping:0xA0AA + ,simpleTitleCaseMapping:0xA0AA + }, + { code:0xA0AB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0AB + ,simpleLowerCaseMapping:0xA0AB + ,simpleTitleCaseMapping:0xA0AB + }, + { code:0xA0AC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0AC + ,simpleLowerCaseMapping:0xA0AC + ,simpleTitleCaseMapping:0xA0AC + }, + { code:0xA0AD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0AD + ,simpleLowerCaseMapping:0xA0AD + ,simpleTitleCaseMapping:0xA0AD + }, + { code:0xA0AE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0AE + ,simpleLowerCaseMapping:0xA0AE + ,simpleTitleCaseMapping:0xA0AE + }, + { code:0xA0AF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0AF + ,simpleLowerCaseMapping:0xA0AF + ,simpleTitleCaseMapping:0xA0AF + }, + { code:0xA0B0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0B0 + ,simpleLowerCaseMapping:0xA0B0 + ,simpleTitleCaseMapping:0xA0B0 + }, + { code:0xA0B1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0B1 + ,simpleLowerCaseMapping:0xA0B1 + ,simpleTitleCaseMapping:0xA0B1 + }, + { code:0xA0B2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0B2 + ,simpleLowerCaseMapping:0xA0B2 + ,simpleTitleCaseMapping:0xA0B2 + }, + { code:0xA0B3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0B3 + ,simpleLowerCaseMapping:0xA0B3 + ,simpleTitleCaseMapping:0xA0B3 + }, + { code:0xA0B4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0B4 + ,simpleLowerCaseMapping:0xA0B4 + ,simpleTitleCaseMapping:0xA0B4 + }, + { code:0xA0B5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0B5 + ,simpleLowerCaseMapping:0xA0B5 + ,simpleTitleCaseMapping:0xA0B5 + }, + { code:0xA0B6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0B6 + ,simpleLowerCaseMapping:0xA0B6 + ,simpleTitleCaseMapping:0xA0B6 + }, + { code:0xA0B7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0B7 + ,simpleLowerCaseMapping:0xA0B7 + ,simpleTitleCaseMapping:0xA0B7 + }, + { code:0xA0B8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0B8 + ,simpleLowerCaseMapping:0xA0B8 + ,simpleTitleCaseMapping:0xA0B8 + }, + { code:0xA0B9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0B9 + ,simpleLowerCaseMapping:0xA0B9 + ,simpleTitleCaseMapping:0xA0B9 + }, + { code:0xA0BA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0BA + ,simpleLowerCaseMapping:0xA0BA + ,simpleTitleCaseMapping:0xA0BA + }, + { code:0xA0BB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0BB + ,simpleLowerCaseMapping:0xA0BB + ,simpleTitleCaseMapping:0xA0BB + }, + { code:0xA0BC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0BC + ,simpleLowerCaseMapping:0xA0BC + ,simpleTitleCaseMapping:0xA0BC + }, + { code:0xA0BD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0BD + ,simpleLowerCaseMapping:0xA0BD + ,simpleTitleCaseMapping:0xA0BD + }, + { code:0xA0BE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0BE + ,simpleLowerCaseMapping:0xA0BE + ,simpleTitleCaseMapping:0xA0BE + }, + { code:0xA0BF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0BF + ,simpleLowerCaseMapping:0xA0BF + ,simpleTitleCaseMapping:0xA0BF + }, + { code:0xA0C0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0C0 + ,simpleLowerCaseMapping:0xA0C0 + ,simpleTitleCaseMapping:0xA0C0 + }, + { code:0xA0C1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0C1 + ,simpleLowerCaseMapping:0xA0C1 + ,simpleTitleCaseMapping:0xA0C1 + }, + { code:0xA0C2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0C2 + ,simpleLowerCaseMapping:0xA0C2 + ,simpleTitleCaseMapping:0xA0C2 + }, + { code:0xA0C3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0C3 + ,simpleLowerCaseMapping:0xA0C3 + ,simpleTitleCaseMapping:0xA0C3 + }, + { code:0xA0C4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0C4 + ,simpleLowerCaseMapping:0xA0C4 + ,simpleTitleCaseMapping:0xA0C4 + }, + { code:0xA0C5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0C5 + ,simpleLowerCaseMapping:0xA0C5 + ,simpleTitleCaseMapping:0xA0C5 + }, + { code:0xA0C6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0C6 + ,simpleLowerCaseMapping:0xA0C6 + ,simpleTitleCaseMapping:0xA0C6 + }, + { code:0xA0C7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0C7 + ,simpleLowerCaseMapping:0xA0C7 + ,simpleTitleCaseMapping:0xA0C7 + }, + { code:0xA0C8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0C8 + ,simpleLowerCaseMapping:0xA0C8 + ,simpleTitleCaseMapping:0xA0C8 + }, + { code:0xA0C9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0C9 + ,simpleLowerCaseMapping:0xA0C9 + ,simpleTitleCaseMapping:0xA0C9 + }, + { code:0xA0CA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0CA + ,simpleLowerCaseMapping:0xA0CA + ,simpleTitleCaseMapping:0xA0CA + }, + { code:0xA0CB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0CB + ,simpleLowerCaseMapping:0xA0CB + ,simpleTitleCaseMapping:0xA0CB + }, + { code:0xA0CC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0CC + ,simpleLowerCaseMapping:0xA0CC + ,simpleTitleCaseMapping:0xA0CC + }, + { code:0xA0CD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0CD + ,simpleLowerCaseMapping:0xA0CD + ,simpleTitleCaseMapping:0xA0CD + }, + { code:0xA0CE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0CE + ,simpleLowerCaseMapping:0xA0CE + ,simpleTitleCaseMapping:0xA0CE + }, + { code:0xA0CF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0CF + ,simpleLowerCaseMapping:0xA0CF + ,simpleTitleCaseMapping:0xA0CF + }, + { code:0xA0D0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0D0 + ,simpleLowerCaseMapping:0xA0D0 + ,simpleTitleCaseMapping:0xA0D0 + }, + { code:0xA0D1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0D1 + ,simpleLowerCaseMapping:0xA0D1 + ,simpleTitleCaseMapping:0xA0D1 + }, + { code:0xA0D2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0D2 + ,simpleLowerCaseMapping:0xA0D2 + ,simpleTitleCaseMapping:0xA0D2 + }, + { code:0xA0D3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0D3 + ,simpleLowerCaseMapping:0xA0D3 + ,simpleTitleCaseMapping:0xA0D3 + }, + { code:0xA0D4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0D4 + ,simpleLowerCaseMapping:0xA0D4 + ,simpleTitleCaseMapping:0xA0D4 + }, + { code:0xA0D5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0D5 + ,simpleLowerCaseMapping:0xA0D5 + ,simpleTitleCaseMapping:0xA0D5 + }, + { code:0xA0D6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0D6 + ,simpleLowerCaseMapping:0xA0D6 + ,simpleTitleCaseMapping:0xA0D6 + }, + { code:0xA0D7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0D7 + ,simpleLowerCaseMapping:0xA0D7 + ,simpleTitleCaseMapping:0xA0D7 + }, + { code:0xA0D8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0D8 + ,simpleLowerCaseMapping:0xA0D8 + ,simpleTitleCaseMapping:0xA0D8 + }, + { code:0xA0D9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0D9 + ,simpleLowerCaseMapping:0xA0D9 + ,simpleTitleCaseMapping:0xA0D9 + }, + { code:0xA0DA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0DA + ,simpleLowerCaseMapping:0xA0DA + ,simpleTitleCaseMapping:0xA0DA + }, + { code:0xA0DB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0DB + ,simpleLowerCaseMapping:0xA0DB + ,simpleTitleCaseMapping:0xA0DB + }, + { code:0xA0DC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0DC + ,simpleLowerCaseMapping:0xA0DC + ,simpleTitleCaseMapping:0xA0DC + }, + { code:0xA0DD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0DD + ,simpleLowerCaseMapping:0xA0DD + ,simpleTitleCaseMapping:0xA0DD + }, + { code:0xA0DE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0DE + ,simpleLowerCaseMapping:0xA0DE + ,simpleTitleCaseMapping:0xA0DE + }, + { code:0xA0DF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0DF + ,simpleLowerCaseMapping:0xA0DF + ,simpleTitleCaseMapping:0xA0DF + }, + { code:0xA0E0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0E0 + ,simpleLowerCaseMapping:0xA0E0 + ,simpleTitleCaseMapping:0xA0E0 + }, + { code:0xA0E1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0E1 + ,simpleLowerCaseMapping:0xA0E1 + ,simpleTitleCaseMapping:0xA0E1 + }, + { code:0xA0E2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0E2 + ,simpleLowerCaseMapping:0xA0E2 + ,simpleTitleCaseMapping:0xA0E2 + }, + { code:0xA0E3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0E3 + ,simpleLowerCaseMapping:0xA0E3 + ,simpleTitleCaseMapping:0xA0E3 + }, + { code:0xA0E4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0E4 + ,simpleLowerCaseMapping:0xA0E4 + ,simpleTitleCaseMapping:0xA0E4 + }, + { code:0xA0E5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0E5 + ,simpleLowerCaseMapping:0xA0E5 + ,simpleTitleCaseMapping:0xA0E5 + }, + { code:0xA0E6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0E6 + ,simpleLowerCaseMapping:0xA0E6 + ,simpleTitleCaseMapping:0xA0E6 + }, + { code:0xA0E7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0E7 + ,simpleLowerCaseMapping:0xA0E7 + ,simpleTitleCaseMapping:0xA0E7 + }, + { code:0xA0E8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0E8 + ,simpleLowerCaseMapping:0xA0E8 + ,simpleTitleCaseMapping:0xA0E8 + }, + { code:0xA0E9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0E9 + ,simpleLowerCaseMapping:0xA0E9 + ,simpleTitleCaseMapping:0xA0E9 + }, + { code:0xA0EA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0EA + ,simpleLowerCaseMapping:0xA0EA + ,simpleTitleCaseMapping:0xA0EA + }, + { code:0xA0EB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0EB + ,simpleLowerCaseMapping:0xA0EB + ,simpleTitleCaseMapping:0xA0EB + }, + { code:0xA0EC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0EC + ,simpleLowerCaseMapping:0xA0EC + ,simpleTitleCaseMapping:0xA0EC + }, + { code:0xA0ED + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0ED + ,simpleLowerCaseMapping:0xA0ED + ,simpleTitleCaseMapping:0xA0ED + }, + { code:0xA0EE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0EE + ,simpleLowerCaseMapping:0xA0EE + ,simpleTitleCaseMapping:0xA0EE + }, + { code:0xA0EF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0EF + ,simpleLowerCaseMapping:0xA0EF + ,simpleTitleCaseMapping:0xA0EF + }, + { code:0xA0F0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0F0 + ,simpleLowerCaseMapping:0xA0F0 + ,simpleTitleCaseMapping:0xA0F0 + }, + { code:0xA0F1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0F1 + ,simpleLowerCaseMapping:0xA0F1 + ,simpleTitleCaseMapping:0xA0F1 + }, + { code:0xA0F2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0F2 + ,simpleLowerCaseMapping:0xA0F2 + ,simpleTitleCaseMapping:0xA0F2 + }, + { code:0xA0F3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0F3 + ,simpleLowerCaseMapping:0xA0F3 + ,simpleTitleCaseMapping:0xA0F3 + }, + { code:0xA0F4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0F4 + ,simpleLowerCaseMapping:0xA0F4 + ,simpleTitleCaseMapping:0xA0F4 + }, + { code:0xA0F5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0F5 + ,simpleLowerCaseMapping:0xA0F5 + ,simpleTitleCaseMapping:0xA0F5 + }, + { code:0xA0F6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0F6 + ,simpleLowerCaseMapping:0xA0F6 + ,simpleTitleCaseMapping:0xA0F6 + }, + { code:0xA0F7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0F7 + ,simpleLowerCaseMapping:0xA0F7 + ,simpleTitleCaseMapping:0xA0F7 + }, + { code:0xA0F8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0F8 + ,simpleLowerCaseMapping:0xA0F8 + ,simpleTitleCaseMapping:0xA0F8 + }, + { code:0xA0F9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0F9 + ,simpleLowerCaseMapping:0xA0F9 + ,simpleTitleCaseMapping:0xA0F9 + }, + { code:0xA0FA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0FA + ,simpleLowerCaseMapping:0xA0FA + ,simpleTitleCaseMapping:0xA0FA + }, + { code:0xA0FB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0FB + ,simpleLowerCaseMapping:0xA0FB + ,simpleTitleCaseMapping:0xA0FB + }, + { code:0xA0FC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0FC + ,simpleLowerCaseMapping:0xA0FC + ,simpleTitleCaseMapping:0xA0FC + }, + { code:0xA0FD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0FD + ,simpleLowerCaseMapping:0xA0FD + ,simpleTitleCaseMapping:0xA0FD + }, + { code:0xA0FE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0FE + ,simpleLowerCaseMapping:0xA0FE + ,simpleTitleCaseMapping:0xA0FE + }, + { code:0xA0FF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA0FF + ,simpleLowerCaseMapping:0xA0FF + ,simpleTitleCaseMapping:0xA0FF + }, + { code:0xA100 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA100 + ,simpleLowerCaseMapping:0xA100 + ,simpleTitleCaseMapping:0xA100 + }, + { code:0xA101 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA101 + ,simpleLowerCaseMapping:0xA101 + ,simpleTitleCaseMapping:0xA101 + }, + { code:0xA102 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA102 + ,simpleLowerCaseMapping:0xA102 + ,simpleTitleCaseMapping:0xA102 + }, + { code:0xA103 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA103 + ,simpleLowerCaseMapping:0xA103 + ,simpleTitleCaseMapping:0xA103 + }, + { code:0xA104 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA104 + ,simpleLowerCaseMapping:0xA104 + ,simpleTitleCaseMapping:0xA104 + }, + { code:0xA105 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA105 + ,simpleLowerCaseMapping:0xA105 + ,simpleTitleCaseMapping:0xA105 + }, + { code:0xA106 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA106 + ,simpleLowerCaseMapping:0xA106 + ,simpleTitleCaseMapping:0xA106 + }, + { code:0xA107 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA107 + ,simpleLowerCaseMapping:0xA107 + ,simpleTitleCaseMapping:0xA107 + }, + { code:0xA108 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA108 + ,simpleLowerCaseMapping:0xA108 + ,simpleTitleCaseMapping:0xA108 + }, + { code:0xA109 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA109 + ,simpleLowerCaseMapping:0xA109 + ,simpleTitleCaseMapping:0xA109 + }, + { code:0xA10A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA10A + ,simpleLowerCaseMapping:0xA10A + ,simpleTitleCaseMapping:0xA10A + }, + { code:0xA10B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA10B + ,simpleLowerCaseMapping:0xA10B + ,simpleTitleCaseMapping:0xA10B + }, + { code:0xA10C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA10C + ,simpleLowerCaseMapping:0xA10C + ,simpleTitleCaseMapping:0xA10C + }, + { code:0xA10D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA10D + ,simpleLowerCaseMapping:0xA10D + ,simpleTitleCaseMapping:0xA10D + }, + { code:0xA10E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA10E + ,simpleLowerCaseMapping:0xA10E + ,simpleTitleCaseMapping:0xA10E + }, + { code:0xA10F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA10F + ,simpleLowerCaseMapping:0xA10F + ,simpleTitleCaseMapping:0xA10F + }, + { code:0xA110 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA110 + ,simpleLowerCaseMapping:0xA110 + ,simpleTitleCaseMapping:0xA110 + }, + { code:0xA111 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA111 + ,simpleLowerCaseMapping:0xA111 + ,simpleTitleCaseMapping:0xA111 + }, + { code:0xA112 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA112 + ,simpleLowerCaseMapping:0xA112 + ,simpleTitleCaseMapping:0xA112 + }, + { code:0xA113 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA113 + ,simpleLowerCaseMapping:0xA113 + ,simpleTitleCaseMapping:0xA113 + }, + { code:0xA114 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA114 + ,simpleLowerCaseMapping:0xA114 + ,simpleTitleCaseMapping:0xA114 + }, + { code:0xA115 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA115 + ,simpleLowerCaseMapping:0xA115 + ,simpleTitleCaseMapping:0xA115 + }, + { code:0xA116 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA116 + ,simpleLowerCaseMapping:0xA116 + ,simpleTitleCaseMapping:0xA116 + }, + { code:0xA117 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA117 + ,simpleLowerCaseMapping:0xA117 + ,simpleTitleCaseMapping:0xA117 + }, + { code:0xA118 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA118 + ,simpleLowerCaseMapping:0xA118 + ,simpleTitleCaseMapping:0xA118 + }, + { code:0xA119 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA119 + ,simpleLowerCaseMapping:0xA119 + ,simpleTitleCaseMapping:0xA119 + }, + { code:0xA11A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA11A + ,simpleLowerCaseMapping:0xA11A + ,simpleTitleCaseMapping:0xA11A + }, + { code:0xA11B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA11B + ,simpleLowerCaseMapping:0xA11B + ,simpleTitleCaseMapping:0xA11B + }, + { code:0xA11C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA11C + ,simpleLowerCaseMapping:0xA11C + ,simpleTitleCaseMapping:0xA11C + }, + { code:0xA11D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA11D + ,simpleLowerCaseMapping:0xA11D + ,simpleTitleCaseMapping:0xA11D + }, + { code:0xA11E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA11E + ,simpleLowerCaseMapping:0xA11E + ,simpleTitleCaseMapping:0xA11E + }, + { code:0xA11F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA11F + ,simpleLowerCaseMapping:0xA11F + ,simpleTitleCaseMapping:0xA11F + }, + { code:0xA120 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA120 + ,simpleLowerCaseMapping:0xA120 + ,simpleTitleCaseMapping:0xA120 + }, + { code:0xA121 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA121 + ,simpleLowerCaseMapping:0xA121 + ,simpleTitleCaseMapping:0xA121 + }, + { code:0xA122 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA122 + ,simpleLowerCaseMapping:0xA122 + ,simpleTitleCaseMapping:0xA122 + }, + { code:0xA123 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA123 + ,simpleLowerCaseMapping:0xA123 + ,simpleTitleCaseMapping:0xA123 + }, + { code:0xA124 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA124 + ,simpleLowerCaseMapping:0xA124 + ,simpleTitleCaseMapping:0xA124 + }, + { code:0xA125 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA125 + ,simpleLowerCaseMapping:0xA125 + ,simpleTitleCaseMapping:0xA125 + }, + { code:0xA126 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA126 + ,simpleLowerCaseMapping:0xA126 + ,simpleTitleCaseMapping:0xA126 + }, + { code:0xA127 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA127 + ,simpleLowerCaseMapping:0xA127 + ,simpleTitleCaseMapping:0xA127 + }, + { code:0xA128 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA128 + ,simpleLowerCaseMapping:0xA128 + ,simpleTitleCaseMapping:0xA128 + }, + { code:0xA129 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA129 + ,simpleLowerCaseMapping:0xA129 + ,simpleTitleCaseMapping:0xA129 + }, + { code:0xA12A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA12A + ,simpleLowerCaseMapping:0xA12A + ,simpleTitleCaseMapping:0xA12A + }, + { code:0xA12B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA12B + ,simpleLowerCaseMapping:0xA12B + ,simpleTitleCaseMapping:0xA12B + }, + { code:0xA12C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA12C + ,simpleLowerCaseMapping:0xA12C + ,simpleTitleCaseMapping:0xA12C + }, + { code:0xA12D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA12D + ,simpleLowerCaseMapping:0xA12D + ,simpleTitleCaseMapping:0xA12D + }, + { code:0xA12E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA12E + ,simpleLowerCaseMapping:0xA12E + ,simpleTitleCaseMapping:0xA12E + }, + { code:0xA12F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA12F + ,simpleLowerCaseMapping:0xA12F + ,simpleTitleCaseMapping:0xA12F + }, + { code:0xA130 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA130 + ,simpleLowerCaseMapping:0xA130 + ,simpleTitleCaseMapping:0xA130 + }, + { code:0xA131 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA131 + ,simpleLowerCaseMapping:0xA131 + ,simpleTitleCaseMapping:0xA131 + }, + { code:0xA132 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA132 + ,simpleLowerCaseMapping:0xA132 + ,simpleTitleCaseMapping:0xA132 + }, + { code:0xA133 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA133 + ,simpleLowerCaseMapping:0xA133 + ,simpleTitleCaseMapping:0xA133 + }, + { code:0xA134 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA134 + ,simpleLowerCaseMapping:0xA134 + ,simpleTitleCaseMapping:0xA134 + }, + { code:0xA135 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA135 + ,simpleLowerCaseMapping:0xA135 + ,simpleTitleCaseMapping:0xA135 + }, + { code:0xA136 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA136 + ,simpleLowerCaseMapping:0xA136 + ,simpleTitleCaseMapping:0xA136 + }, + { code:0xA137 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA137 + ,simpleLowerCaseMapping:0xA137 + ,simpleTitleCaseMapping:0xA137 + }, + { code:0xA138 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA138 + ,simpleLowerCaseMapping:0xA138 + ,simpleTitleCaseMapping:0xA138 + }, + { code:0xA139 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA139 + ,simpleLowerCaseMapping:0xA139 + ,simpleTitleCaseMapping:0xA139 + }, + { code:0xA13A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA13A + ,simpleLowerCaseMapping:0xA13A + ,simpleTitleCaseMapping:0xA13A + }, + { code:0xA13B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA13B + ,simpleLowerCaseMapping:0xA13B + ,simpleTitleCaseMapping:0xA13B + }, + { code:0xA13C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA13C + ,simpleLowerCaseMapping:0xA13C + ,simpleTitleCaseMapping:0xA13C + }, + { code:0xA13D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA13D + ,simpleLowerCaseMapping:0xA13D + ,simpleTitleCaseMapping:0xA13D + }, + { code:0xA13E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA13E + ,simpleLowerCaseMapping:0xA13E + ,simpleTitleCaseMapping:0xA13E + }, + { code:0xA13F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA13F + ,simpleLowerCaseMapping:0xA13F + ,simpleTitleCaseMapping:0xA13F + }, + { code:0xA140 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA140 + ,simpleLowerCaseMapping:0xA140 + ,simpleTitleCaseMapping:0xA140 + }, + { code:0xA141 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA141 + ,simpleLowerCaseMapping:0xA141 + ,simpleTitleCaseMapping:0xA141 + }, + { code:0xA142 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA142 + ,simpleLowerCaseMapping:0xA142 + ,simpleTitleCaseMapping:0xA142 + }, + { code:0xA143 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA143 + ,simpleLowerCaseMapping:0xA143 + ,simpleTitleCaseMapping:0xA143 + }, + { code:0xA144 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA144 + ,simpleLowerCaseMapping:0xA144 + ,simpleTitleCaseMapping:0xA144 + }, + { code:0xA145 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA145 + ,simpleLowerCaseMapping:0xA145 + ,simpleTitleCaseMapping:0xA145 + }, + { code:0xA146 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA146 + ,simpleLowerCaseMapping:0xA146 + ,simpleTitleCaseMapping:0xA146 + }, + { code:0xA147 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA147 + ,simpleLowerCaseMapping:0xA147 + ,simpleTitleCaseMapping:0xA147 + }, + { code:0xA148 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA148 + ,simpleLowerCaseMapping:0xA148 + ,simpleTitleCaseMapping:0xA148 + }, + { code:0xA149 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA149 + ,simpleLowerCaseMapping:0xA149 + ,simpleTitleCaseMapping:0xA149 + }, + { code:0xA14A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA14A + ,simpleLowerCaseMapping:0xA14A + ,simpleTitleCaseMapping:0xA14A + }, + { code:0xA14B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA14B + ,simpleLowerCaseMapping:0xA14B + ,simpleTitleCaseMapping:0xA14B + }, + { code:0xA14C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA14C + ,simpleLowerCaseMapping:0xA14C + ,simpleTitleCaseMapping:0xA14C + }, + { code:0xA14D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA14D + ,simpleLowerCaseMapping:0xA14D + ,simpleTitleCaseMapping:0xA14D + }, + { code:0xA14E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA14E + ,simpleLowerCaseMapping:0xA14E + ,simpleTitleCaseMapping:0xA14E + }, + { code:0xA14F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA14F + ,simpleLowerCaseMapping:0xA14F + ,simpleTitleCaseMapping:0xA14F + }, + { code:0xA150 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA150 + ,simpleLowerCaseMapping:0xA150 + ,simpleTitleCaseMapping:0xA150 + }, + { code:0xA151 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA151 + ,simpleLowerCaseMapping:0xA151 + ,simpleTitleCaseMapping:0xA151 + }, + { code:0xA152 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA152 + ,simpleLowerCaseMapping:0xA152 + ,simpleTitleCaseMapping:0xA152 + }, + { code:0xA153 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA153 + ,simpleLowerCaseMapping:0xA153 + ,simpleTitleCaseMapping:0xA153 + }, + { code:0xA154 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA154 + ,simpleLowerCaseMapping:0xA154 + ,simpleTitleCaseMapping:0xA154 + }, + { code:0xA155 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA155 + ,simpleLowerCaseMapping:0xA155 + ,simpleTitleCaseMapping:0xA155 + }, + { code:0xA156 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA156 + ,simpleLowerCaseMapping:0xA156 + ,simpleTitleCaseMapping:0xA156 + }, + { code:0xA157 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA157 + ,simpleLowerCaseMapping:0xA157 + ,simpleTitleCaseMapping:0xA157 + }, + { code:0xA158 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA158 + ,simpleLowerCaseMapping:0xA158 + ,simpleTitleCaseMapping:0xA158 + }, + { code:0xA159 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA159 + ,simpleLowerCaseMapping:0xA159 + ,simpleTitleCaseMapping:0xA159 + }, + { code:0xA15A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA15A + ,simpleLowerCaseMapping:0xA15A + ,simpleTitleCaseMapping:0xA15A + }, + { code:0xA15B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA15B + ,simpleLowerCaseMapping:0xA15B + ,simpleTitleCaseMapping:0xA15B + }, + { code:0xA15C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA15C + ,simpleLowerCaseMapping:0xA15C + ,simpleTitleCaseMapping:0xA15C + }, + { code:0xA15D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA15D + ,simpleLowerCaseMapping:0xA15D + ,simpleTitleCaseMapping:0xA15D + }, + { code:0xA15E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA15E + ,simpleLowerCaseMapping:0xA15E + ,simpleTitleCaseMapping:0xA15E + }, + { code:0xA15F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA15F + ,simpleLowerCaseMapping:0xA15F + ,simpleTitleCaseMapping:0xA15F + }, + { code:0xA160 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA160 + ,simpleLowerCaseMapping:0xA160 + ,simpleTitleCaseMapping:0xA160 + }, + { code:0xA161 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA161 + ,simpleLowerCaseMapping:0xA161 + ,simpleTitleCaseMapping:0xA161 + }, + { code:0xA162 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA162 + ,simpleLowerCaseMapping:0xA162 + ,simpleTitleCaseMapping:0xA162 + }, + { code:0xA163 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA163 + ,simpleLowerCaseMapping:0xA163 + ,simpleTitleCaseMapping:0xA163 + }, + { code:0xA164 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA164 + ,simpleLowerCaseMapping:0xA164 + ,simpleTitleCaseMapping:0xA164 + }, + { code:0xA165 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA165 + ,simpleLowerCaseMapping:0xA165 + ,simpleTitleCaseMapping:0xA165 + }, + { code:0xA166 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA166 + ,simpleLowerCaseMapping:0xA166 + ,simpleTitleCaseMapping:0xA166 + }, + { code:0xA167 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA167 + ,simpleLowerCaseMapping:0xA167 + ,simpleTitleCaseMapping:0xA167 + }, + { code:0xA168 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA168 + ,simpleLowerCaseMapping:0xA168 + ,simpleTitleCaseMapping:0xA168 + }, + { code:0xA169 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA169 + ,simpleLowerCaseMapping:0xA169 + ,simpleTitleCaseMapping:0xA169 + }, + { code:0xA16A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA16A + ,simpleLowerCaseMapping:0xA16A + ,simpleTitleCaseMapping:0xA16A + }, + { code:0xA16B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA16B + ,simpleLowerCaseMapping:0xA16B + ,simpleTitleCaseMapping:0xA16B + }, + { code:0xA16C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA16C + ,simpleLowerCaseMapping:0xA16C + ,simpleTitleCaseMapping:0xA16C + }, + { code:0xA16D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA16D + ,simpleLowerCaseMapping:0xA16D + ,simpleTitleCaseMapping:0xA16D + }, + { code:0xA16E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA16E + ,simpleLowerCaseMapping:0xA16E + ,simpleTitleCaseMapping:0xA16E + }, + { code:0xA16F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA16F + ,simpleLowerCaseMapping:0xA16F + ,simpleTitleCaseMapping:0xA16F + }, + { code:0xA170 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA170 + ,simpleLowerCaseMapping:0xA170 + ,simpleTitleCaseMapping:0xA170 + }, + { code:0xA171 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA171 + ,simpleLowerCaseMapping:0xA171 + ,simpleTitleCaseMapping:0xA171 + }, + { code:0xA172 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA172 + ,simpleLowerCaseMapping:0xA172 + ,simpleTitleCaseMapping:0xA172 + }, + { code:0xA173 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA173 + ,simpleLowerCaseMapping:0xA173 + ,simpleTitleCaseMapping:0xA173 + }, + { code:0xA174 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA174 + ,simpleLowerCaseMapping:0xA174 + ,simpleTitleCaseMapping:0xA174 + }, + { code:0xA175 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA175 + ,simpleLowerCaseMapping:0xA175 + ,simpleTitleCaseMapping:0xA175 + }, + { code:0xA176 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA176 + ,simpleLowerCaseMapping:0xA176 + ,simpleTitleCaseMapping:0xA176 + }, + { code:0xA177 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA177 + ,simpleLowerCaseMapping:0xA177 + ,simpleTitleCaseMapping:0xA177 + }, + { code:0xA178 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA178 + ,simpleLowerCaseMapping:0xA178 + ,simpleTitleCaseMapping:0xA178 + }, + { code:0xA179 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA179 + ,simpleLowerCaseMapping:0xA179 + ,simpleTitleCaseMapping:0xA179 + }, + { code:0xA17A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA17A + ,simpleLowerCaseMapping:0xA17A + ,simpleTitleCaseMapping:0xA17A + }, + { code:0xA17B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA17B + ,simpleLowerCaseMapping:0xA17B + ,simpleTitleCaseMapping:0xA17B + }, + { code:0xA17C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA17C + ,simpleLowerCaseMapping:0xA17C + ,simpleTitleCaseMapping:0xA17C + }, + { code:0xA17D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA17D + ,simpleLowerCaseMapping:0xA17D + ,simpleTitleCaseMapping:0xA17D + }, + { code:0xA17E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA17E + ,simpleLowerCaseMapping:0xA17E + ,simpleTitleCaseMapping:0xA17E + }, + { code:0xA17F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA17F + ,simpleLowerCaseMapping:0xA17F + ,simpleTitleCaseMapping:0xA17F + }, + { code:0xA180 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA180 + ,simpleLowerCaseMapping:0xA180 + ,simpleTitleCaseMapping:0xA180 + }, + { code:0xA181 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA181 + ,simpleLowerCaseMapping:0xA181 + ,simpleTitleCaseMapping:0xA181 + }, + { code:0xA182 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA182 + ,simpleLowerCaseMapping:0xA182 + ,simpleTitleCaseMapping:0xA182 + }, + { code:0xA183 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA183 + ,simpleLowerCaseMapping:0xA183 + ,simpleTitleCaseMapping:0xA183 + }, + { code:0xA184 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA184 + ,simpleLowerCaseMapping:0xA184 + ,simpleTitleCaseMapping:0xA184 + }, + { code:0xA185 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA185 + ,simpleLowerCaseMapping:0xA185 + ,simpleTitleCaseMapping:0xA185 + }, + { code:0xA186 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA186 + ,simpleLowerCaseMapping:0xA186 + ,simpleTitleCaseMapping:0xA186 + }, + { code:0xA187 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA187 + ,simpleLowerCaseMapping:0xA187 + ,simpleTitleCaseMapping:0xA187 + }, + { code:0xA188 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA188 + ,simpleLowerCaseMapping:0xA188 + ,simpleTitleCaseMapping:0xA188 + }, + { code:0xA189 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA189 + ,simpleLowerCaseMapping:0xA189 + ,simpleTitleCaseMapping:0xA189 + }, + { code:0xA18A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA18A + ,simpleLowerCaseMapping:0xA18A + ,simpleTitleCaseMapping:0xA18A + }, + { code:0xA18B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA18B + ,simpleLowerCaseMapping:0xA18B + ,simpleTitleCaseMapping:0xA18B + }, + { code:0xA18C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA18C + ,simpleLowerCaseMapping:0xA18C + ,simpleTitleCaseMapping:0xA18C + }, + { code:0xA18D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA18D + ,simpleLowerCaseMapping:0xA18D + ,simpleTitleCaseMapping:0xA18D + }, + { code:0xA18E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA18E + ,simpleLowerCaseMapping:0xA18E + ,simpleTitleCaseMapping:0xA18E + }, + { code:0xA18F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA18F + ,simpleLowerCaseMapping:0xA18F + ,simpleTitleCaseMapping:0xA18F + }, + { code:0xA190 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA190 + ,simpleLowerCaseMapping:0xA190 + ,simpleTitleCaseMapping:0xA190 + }, + { code:0xA191 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA191 + ,simpleLowerCaseMapping:0xA191 + ,simpleTitleCaseMapping:0xA191 + }, + { code:0xA192 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA192 + ,simpleLowerCaseMapping:0xA192 + ,simpleTitleCaseMapping:0xA192 + }, + { code:0xA193 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA193 + ,simpleLowerCaseMapping:0xA193 + ,simpleTitleCaseMapping:0xA193 + }, + { code:0xA194 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA194 + ,simpleLowerCaseMapping:0xA194 + ,simpleTitleCaseMapping:0xA194 + }, + { code:0xA195 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA195 + ,simpleLowerCaseMapping:0xA195 + ,simpleTitleCaseMapping:0xA195 + }, + { code:0xA196 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA196 + ,simpleLowerCaseMapping:0xA196 + ,simpleTitleCaseMapping:0xA196 + }, + { code:0xA197 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA197 + ,simpleLowerCaseMapping:0xA197 + ,simpleTitleCaseMapping:0xA197 + }, + { code:0xA198 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA198 + ,simpleLowerCaseMapping:0xA198 + ,simpleTitleCaseMapping:0xA198 + }, + { code:0xA199 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA199 + ,simpleLowerCaseMapping:0xA199 + ,simpleTitleCaseMapping:0xA199 + }, + { code:0xA19A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA19A + ,simpleLowerCaseMapping:0xA19A + ,simpleTitleCaseMapping:0xA19A + }, + { code:0xA19B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA19B + ,simpleLowerCaseMapping:0xA19B + ,simpleTitleCaseMapping:0xA19B + }, + { code:0xA19C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA19C + ,simpleLowerCaseMapping:0xA19C + ,simpleTitleCaseMapping:0xA19C + }, + { code:0xA19D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA19D + ,simpleLowerCaseMapping:0xA19D + ,simpleTitleCaseMapping:0xA19D + }, + { code:0xA19E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA19E + ,simpleLowerCaseMapping:0xA19E + ,simpleTitleCaseMapping:0xA19E + }, + { code:0xA19F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA19F + ,simpleLowerCaseMapping:0xA19F + ,simpleTitleCaseMapping:0xA19F + }, + { code:0xA1A0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1A0 + ,simpleLowerCaseMapping:0xA1A0 + ,simpleTitleCaseMapping:0xA1A0 + }, + { code:0xA1A1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1A1 + ,simpleLowerCaseMapping:0xA1A1 + ,simpleTitleCaseMapping:0xA1A1 + }, + { code:0xA1A2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1A2 + ,simpleLowerCaseMapping:0xA1A2 + ,simpleTitleCaseMapping:0xA1A2 + }, + { code:0xA1A3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1A3 + ,simpleLowerCaseMapping:0xA1A3 + ,simpleTitleCaseMapping:0xA1A3 + }, + { code:0xA1A4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1A4 + ,simpleLowerCaseMapping:0xA1A4 + ,simpleTitleCaseMapping:0xA1A4 + }, + { code:0xA1A5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1A5 + ,simpleLowerCaseMapping:0xA1A5 + ,simpleTitleCaseMapping:0xA1A5 + }, + { code:0xA1A6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1A6 + ,simpleLowerCaseMapping:0xA1A6 + ,simpleTitleCaseMapping:0xA1A6 + }, + { code:0xA1A7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1A7 + ,simpleLowerCaseMapping:0xA1A7 + ,simpleTitleCaseMapping:0xA1A7 + }, + { code:0xA1A8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1A8 + ,simpleLowerCaseMapping:0xA1A8 + ,simpleTitleCaseMapping:0xA1A8 + }, + { code:0xA1A9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1A9 + ,simpleLowerCaseMapping:0xA1A9 + ,simpleTitleCaseMapping:0xA1A9 + }, + { code:0xA1AA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1AA + ,simpleLowerCaseMapping:0xA1AA + ,simpleTitleCaseMapping:0xA1AA + }, + { code:0xA1AB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1AB + ,simpleLowerCaseMapping:0xA1AB + ,simpleTitleCaseMapping:0xA1AB + }, + { code:0xA1AC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1AC + ,simpleLowerCaseMapping:0xA1AC + ,simpleTitleCaseMapping:0xA1AC + }, + { code:0xA1AD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1AD + ,simpleLowerCaseMapping:0xA1AD + ,simpleTitleCaseMapping:0xA1AD + }, + { code:0xA1AE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1AE + ,simpleLowerCaseMapping:0xA1AE + ,simpleTitleCaseMapping:0xA1AE + }, + { code:0xA1AF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1AF + ,simpleLowerCaseMapping:0xA1AF + ,simpleTitleCaseMapping:0xA1AF + }, + { code:0xA1B0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1B0 + ,simpleLowerCaseMapping:0xA1B0 + ,simpleTitleCaseMapping:0xA1B0 + }, + { code:0xA1B1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1B1 + ,simpleLowerCaseMapping:0xA1B1 + ,simpleTitleCaseMapping:0xA1B1 + }, + { code:0xA1B2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1B2 + ,simpleLowerCaseMapping:0xA1B2 + ,simpleTitleCaseMapping:0xA1B2 + }, + { code:0xA1B3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1B3 + ,simpleLowerCaseMapping:0xA1B3 + ,simpleTitleCaseMapping:0xA1B3 + }, + { code:0xA1B4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1B4 + ,simpleLowerCaseMapping:0xA1B4 + ,simpleTitleCaseMapping:0xA1B4 + }, + { code:0xA1B5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1B5 + ,simpleLowerCaseMapping:0xA1B5 + ,simpleTitleCaseMapping:0xA1B5 + }, + { code:0xA1B6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1B6 + ,simpleLowerCaseMapping:0xA1B6 + ,simpleTitleCaseMapping:0xA1B6 + }, + { code:0xA1B7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1B7 + ,simpleLowerCaseMapping:0xA1B7 + ,simpleTitleCaseMapping:0xA1B7 + }, + { code:0xA1B8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1B8 + ,simpleLowerCaseMapping:0xA1B8 + ,simpleTitleCaseMapping:0xA1B8 + }, + { code:0xA1B9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1B9 + ,simpleLowerCaseMapping:0xA1B9 + ,simpleTitleCaseMapping:0xA1B9 + }, + { code:0xA1BA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1BA + ,simpleLowerCaseMapping:0xA1BA + ,simpleTitleCaseMapping:0xA1BA + }, + { code:0xA1BB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1BB + ,simpleLowerCaseMapping:0xA1BB + ,simpleTitleCaseMapping:0xA1BB + }, + { code:0xA1BC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1BC + ,simpleLowerCaseMapping:0xA1BC + ,simpleTitleCaseMapping:0xA1BC + }, + { code:0xA1BD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1BD + ,simpleLowerCaseMapping:0xA1BD + ,simpleTitleCaseMapping:0xA1BD + }, + { code:0xA1BE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1BE + ,simpleLowerCaseMapping:0xA1BE + ,simpleTitleCaseMapping:0xA1BE + }, + { code:0xA1BF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1BF + ,simpleLowerCaseMapping:0xA1BF + ,simpleTitleCaseMapping:0xA1BF + }, + { code:0xA1C0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1C0 + ,simpleLowerCaseMapping:0xA1C0 + ,simpleTitleCaseMapping:0xA1C0 + }, + { code:0xA1C1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1C1 + ,simpleLowerCaseMapping:0xA1C1 + ,simpleTitleCaseMapping:0xA1C1 + }, + { code:0xA1C2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1C2 + ,simpleLowerCaseMapping:0xA1C2 + ,simpleTitleCaseMapping:0xA1C2 + }, + { code:0xA1C3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1C3 + ,simpleLowerCaseMapping:0xA1C3 + ,simpleTitleCaseMapping:0xA1C3 + }, + { code:0xA1C4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1C4 + ,simpleLowerCaseMapping:0xA1C4 + ,simpleTitleCaseMapping:0xA1C4 + }, + { code:0xA1C5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1C5 + ,simpleLowerCaseMapping:0xA1C5 + ,simpleTitleCaseMapping:0xA1C5 + }, + { code:0xA1C6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1C6 + ,simpleLowerCaseMapping:0xA1C6 + ,simpleTitleCaseMapping:0xA1C6 + }, + { code:0xA1C7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1C7 + ,simpleLowerCaseMapping:0xA1C7 + ,simpleTitleCaseMapping:0xA1C7 + }, + { code:0xA1C8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1C8 + ,simpleLowerCaseMapping:0xA1C8 + ,simpleTitleCaseMapping:0xA1C8 + }, + { code:0xA1C9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1C9 + ,simpleLowerCaseMapping:0xA1C9 + ,simpleTitleCaseMapping:0xA1C9 + }, + { code:0xA1CA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1CA + ,simpleLowerCaseMapping:0xA1CA + ,simpleTitleCaseMapping:0xA1CA + }, + { code:0xA1CB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1CB + ,simpleLowerCaseMapping:0xA1CB + ,simpleTitleCaseMapping:0xA1CB + }, + { code:0xA1CC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1CC + ,simpleLowerCaseMapping:0xA1CC + ,simpleTitleCaseMapping:0xA1CC + }, + { code:0xA1CD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1CD + ,simpleLowerCaseMapping:0xA1CD + ,simpleTitleCaseMapping:0xA1CD + }, + { code:0xA1CE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1CE + ,simpleLowerCaseMapping:0xA1CE + ,simpleTitleCaseMapping:0xA1CE + }, + { code:0xA1CF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1CF + ,simpleLowerCaseMapping:0xA1CF + ,simpleTitleCaseMapping:0xA1CF + }, + { code:0xA1D0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1D0 + ,simpleLowerCaseMapping:0xA1D0 + ,simpleTitleCaseMapping:0xA1D0 + }, + { code:0xA1D1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1D1 + ,simpleLowerCaseMapping:0xA1D1 + ,simpleTitleCaseMapping:0xA1D1 + }, + { code:0xA1D2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1D2 + ,simpleLowerCaseMapping:0xA1D2 + ,simpleTitleCaseMapping:0xA1D2 + }, + { code:0xA1D3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1D3 + ,simpleLowerCaseMapping:0xA1D3 + ,simpleTitleCaseMapping:0xA1D3 + }, + { code:0xA1D4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1D4 + ,simpleLowerCaseMapping:0xA1D4 + ,simpleTitleCaseMapping:0xA1D4 + }, + { code:0xA1D5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1D5 + ,simpleLowerCaseMapping:0xA1D5 + ,simpleTitleCaseMapping:0xA1D5 + }, + { code:0xA1D6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1D6 + ,simpleLowerCaseMapping:0xA1D6 + ,simpleTitleCaseMapping:0xA1D6 + }, + { code:0xA1D7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1D7 + ,simpleLowerCaseMapping:0xA1D7 + ,simpleTitleCaseMapping:0xA1D7 + }, + { code:0xA1D8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1D8 + ,simpleLowerCaseMapping:0xA1D8 + ,simpleTitleCaseMapping:0xA1D8 + }, + { code:0xA1D9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1D9 + ,simpleLowerCaseMapping:0xA1D9 + ,simpleTitleCaseMapping:0xA1D9 + }, + { code:0xA1DA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1DA + ,simpleLowerCaseMapping:0xA1DA + ,simpleTitleCaseMapping:0xA1DA + }, + { code:0xA1DB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1DB + ,simpleLowerCaseMapping:0xA1DB + ,simpleTitleCaseMapping:0xA1DB + }, + { code:0xA1DC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1DC + ,simpleLowerCaseMapping:0xA1DC + ,simpleTitleCaseMapping:0xA1DC + }, + { code:0xA1DD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1DD + ,simpleLowerCaseMapping:0xA1DD + ,simpleTitleCaseMapping:0xA1DD + }, + { code:0xA1DE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1DE + ,simpleLowerCaseMapping:0xA1DE + ,simpleTitleCaseMapping:0xA1DE + }, + { code:0xA1DF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1DF + ,simpleLowerCaseMapping:0xA1DF + ,simpleTitleCaseMapping:0xA1DF + }, + { code:0xA1E0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1E0 + ,simpleLowerCaseMapping:0xA1E0 + ,simpleTitleCaseMapping:0xA1E0 + }, + { code:0xA1E1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1E1 + ,simpleLowerCaseMapping:0xA1E1 + ,simpleTitleCaseMapping:0xA1E1 + }, + { code:0xA1E2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1E2 + ,simpleLowerCaseMapping:0xA1E2 + ,simpleTitleCaseMapping:0xA1E2 + }, + { code:0xA1E3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1E3 + ,simpleLowerCaseMapping:0xA1E3 + ,simpleTitleCaseMapping:0xA1E3 + }, + { code:0xA1E4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1E4 + ,simpleLowerCaseMapping:0xA1E4 + ,simpleTitleCaseMapping:0xA1E4 + }, + { code:0xA1E5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1E5 + ,simpleLowerCaseMapping:0xA1E5 + ,simpleTitleCaseMapping:0xA1E5 + }, + { code:0xA1E6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1E6 + ,simpleLowerCaseMapping:0xA1E6 + ,simpleTitleCaseMapping:0xA1E6 + }, + { code:0xA1E7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1E7 + ,simpleLowerCaseMapping:0xA1E7 + ,simpleTitleCaseMapping:0xA1E7 + }, + { code:0xA1E8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1E8 + ,simpleLowerCaseMapping:0xA1E8 + ,simpleTitleCaseMapping:0xA1E8 + }, + { code:0xA1E9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1E9 + ,simpleLowerCaseMapping:0xA1E9 + ,simpleTitleCaseMapping:0xA1E9 + }, + { code:0xA1EA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1EA + ,simpleLowerCaseMapping:0xA1EA + ,simpleTitleCaseMapping:0xA1EA + }, + { code:0xA1EB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1EB + ,simpleLowerCaseMapping:0xA1EB + ,simpleTitleCaseMapping:0xA1EB + }, + { code:0xA1EC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1EC + ,simpleLowerCaseMapping:0xA1EC + ,simpleTitleCaseMapping:0xA1EC + }, + { code:0xA1ED + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1ED + ,simpleLowerCaseMapping:0xA1ED + ,simpleTitleCaseMapping:0xA1ED + }, + { code:0xA1EE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1EE + ,simpleLowerCaseMapping:0xA1EE + ,simpleTitleCaseMapping:0xA1EE + }, + { code:0xA1EF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1EF + ,simpleLowerCaseMapping:0xA1EF + ,simpleTitleCaseMapping:0xA1EF + }, + { code:0xA1F0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1F0 + ,simpleLowerCaseMapping:0xA1F0 + ,simpleTitleCaseMapping:0xA1F0 + }, + { code:0xA1F1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1F1 + ,simpleLowerCaseMapping:0xA1F1 + ,simpleTitleCaseMapping:0xA1F1 + }, + { code:0xA1F2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1F2 + ,simpleLowerCaseMapping:0xA1F2 + ,simpleTitleCaseMapping:0xA1F2 + }, + { code:0xA1F3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1F3 + ,simpleLowerCaseMapping:0xA1F3 + ,simpleTitleCaseMapping:0xA1F3 + }, + { code:0xA1F4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1F4 + ,simpleLowerCaseMapping:0xA1F4 + ,simpleTitleCaseMapping:0xA1F4 + }, + { code:0xA1F5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1F5 + ,simpleLowerCaseMapping:0xA1F5 + ,simpleTitleCaseMapping:0xA1F5 + }, + { code:0xA1F6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1F6 + ,simpleLowerCaseMapping:0xA1F6 + ,simpleTitleCaseMapping:0xA1F6 + }, + { code:0xA1F7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1F7 + ,simpleLowerCaseMapping:0xA1F7 + ,simpleTitleCaseMapping:0xA1F7 + }, + { code:0xA1F8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1F8 + ,simpleLowerCaseMapping:0xA1F8 + ,simpleTitleCaseMapping:0xA1F8 + }, + { code:0xA1F9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1F9 + ,simpleLowerCaseMapping:0xA1F9 + ,simpleTitleCaseMapping:0xA1F9 + }, + { code:0xA1FA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1FA + ,simpleLowerCaseMapping:0xA1FA + ,simpleTitleCaseMapping:0xA1FA + }, + { code:0xA1FB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1FB + ,simpleLowerCaseMapping:0xA1FB + ,simpleTitleCaseMapping:0xA1FB + }, + { code:0xA1FC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1FC + ,simpleLowerCaseMapping:0xA1FC + ,simpleTitleCaseMapping:0xA1FC + }, + { code:0xA1FD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1FD + ,simpleLowerCaseMapping:0xA1FD + ,simpleTitleCaseMapping:0xA1FD + }, + { code:0xA1FE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1FE + ,simpleLowerCaseMapping:0xA1FE + ,simpleTitleCaseMapping:0xA1FE + }, + { code:0xA1FF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA1FF + ,simpleLowerCaseMapping:0xA1FF + ,simpleTitleCaseMapping:0xA1FF + }, + { code:0xA200 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA200 + ,simpleLowerCaseMapping:0xA200 + ,simpleTitleCaseMapping:0xA200 + }, + { code:0xA201 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA201 + ,simpleLowerCaseMapping:0xA201 + ,simpleTitleCaseMapping:0xA201 + }, + { code:0xA202 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA202 + ,simpleLowerCaseMapping:0xA202 + ,simpleTitleCaseMapping:0xA202 + }, + { code:0xA203 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA203 + ,simpleLowerCaseMapping:0xA203 + ,simpleTitleCaseMapping:0xA203 + }, + { code:0xA204 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA204 + ,simpleLowerCaseMapping:0xA204 + ,simpleTitleCaseMapping:0xA204 + }, + { code:0xA205 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA205 + ,simpleLowerCaseMapping:0xA205 + ,simpleTitleCaseMapping:0xA205 + }, + { code:0xA206 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA206 + ,simpleLowerCaseMapping:0xA206 + ,simpleTitleCaseMapping:0xA206 + }, + { code:0xA207 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA207 + ,simpleLowerCaseMapping:0xA207 + ,simpleTitleCaseMapping:0xA207 + }, + { code:0xA208 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA208 + ,simpleLowerCaseMapping:0xA208 + ,simpleTitleCaseMapping:0xA208 + }, + { code:0xA209 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA209 + ,simpleLowerCaseMapping:0xA209 + ,simpleTitleCaseMapping:0xA209 + }, + { code:0xA20A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA20A + ,simpleLowerCaseMapping:0xA20A + ,simpleTitleCaseMapping:0xA20A + }, + { code:0xA20B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA20B + ,simpleLowerCaseMapping:0xA20B + ,simpleTitleCaseMapping:0xA20B + }, + { code:0xA20C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA20C + ,simpleLowerCaseMapping:0xA20C + ,simpleTitleCaseMapping:0xA20C + }, + { code:0xA20D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA20D + ,simpleLowerCaseMapping:0xA20D + ,simpleTitleCaseMapping:0xA20D + }, + { code:0xA20E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA20E + ,simpleLowerCaseMapping:0xA20E + ,simpleTitleCaseMapping:0xA20E + }, + { code:0xA20F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA20F + ,simpleLowerCaseMapping:0xA20F + ,simpleTitleCaseMapping:0xA20F + }, + { code:0xA210 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA210 + ,simpleLowerCaseMapping:0xA210 + ,simpleTitleCaseMapping:0xA210 + }, + { code:0xA211 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA211 + ,simpleLowerCaseMapping:0xA211 + ,simpleTitleCaseMapping:0xA211 + }, + { code:0xA212 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA212 + ,simpleLowerCaseMapping:0xA212 + ,simpleTitleCaseMapping:0xA212 + }, + { code:0xA213 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA213 + ,simpleLowerCaseMapping:0xA213 + ,simpleTitleCaseMapping:0xA213 + }, + { code:0xA214 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA214 + ,simpleLowerCaseMapping:0xA214 + ,simpleTitleCaseMapping:0xA214 + }, + { code:0xA215 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA215 + ,simpleLowerCaseMapping:0xA215 + ,simpleTitleCaseMapping:0xA215 + }, + { code:0xA216 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA216 + ,simpleLowerCaseMapping:0xA216 + ,simpleTitleCaseMapping:0xA216 + }, + { code:0xA217 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA217 + ,simpleLowerCaseMapping:0xA217 + ,simpleTitleCaseMapping:0xA217 + }, + { code:0xA218 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA218 + ,simpleLowerCaseMapping:0xA218 + ,simpleTitleCaseMapping:0xA218 + }, + { code:0xA219 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA219 + ,simpleLowerCaseMapping:0xA219 + ,simpleTitleCaseMapping:0xA219 + }, + { code:0xA21A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA21A + ,simpleLowerCaseMapping:0xA21A + ,simpleTitleCaseMapping:0xA21A + }, + { code:0xA21B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA21B + ,simpleLowerCaseMapping:0xA21B + ,simpleTitleCaseMapping:0xA21B + }, + { code:0xA21C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA21C + ,simpleLowerCaseMapping:0xA21C + ,simpleTitleCaseMapping:0xA21C + }, + { code:0xA21D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA21D + ,simpleLowerCaseMapping:0xA21D + ,simpleTitleCaseMapping:0xA21D + }, + { code:0xA21E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA21E + ,simpleLowerCaseMapping:0xA21E + ,simpleTitleCaseMapping:0xA21E + }, + { code:0xA21F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA21F + ,simpleLowerCaseMapping:0xA21F + ,simpleTitleCaseMapping:0xA21F + }, + { code:0xA220 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA220 + ,simpleLowerCaseMapping:0xA220 + ,simpleTitleCaseMapping:0xA220 + }, + { code:0xA221 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA221 + ,simpleLowerCaseMapping:0xA221 + ,simpleTitleCaseMapping:0xA221 + }, + { code:0xA222 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA222 + ,simpleLowerCaseMapping:0xA222 + ,simpleTitleCaseMapping:0xA222 + }, + { code:0xA223 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA223 + ,simpleLowerCaseMapping:0xA223 + ,simpleTitleCaseMapping:0xA223 + }, + { code:0xA224 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA224 + ,simpleLowerCaseMapping:0xA224 + ,simpleTitleCaseMapping:0xA224 + }, + { code:0xA225 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA225 + ,simpleLowerCaseMapping:0xA225 + ,simpleTitleCaseMapping:0xA225 + }, + { code:0xA226 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA226 + ,simpleLowerCaseMapping:0xA226 + ,simpleTitleCaseMapping:0xA226 + }, + { code:0xA227 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA227 + ,simpleLowerCaseMapping:0xA227 + ,simpleTitleCaseMapping:0xA227 + }, + { code:0xA228 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA228 + ,simpleLowerCaseMapping:0xA228 + ,simpleTitleCaseMapping:0xA228 + }, + { code:0xA229 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA229 + ,simpleLowerCaseMapping:0xA229 + ,simpleTitleCaseMapping:0xA229 + }, + { code:0xA22A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA22A + ,simpleLowerCaseMapping:0xA22A + ,simpleTitleCaseMapping:0xA22A + }, + { code:0xA22B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA22B + ,simpleLowerCaseMapping:0xA22B + ,simpleTitleCaseMapping:0xA22B + }, + { code:0xA22C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA22C + ,simpleLowerCaseMapping:0xA22C + ,simpleTitleCaseMapping:0xA22C + }, + { code:0xA22D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA22D + ,simpleLowerCaseMapping:0xA22D + ,simpleTitleCaseMapping:0xA22D + }, + { code:0xA22E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA22E + ,simpleLowerCaseMapping:0xA22E + ,simpleTitleCaseMapping:0xA22E + }, + { code:0xA22F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA22F + ,simpleLowerCaseMapping:0xA22F + ,simpleTitleCaseMapping:0xA22F + }, + { code:0xA230 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA230 + ,simpleLowerCaseMapping:0xA230 + ,simpleTitleCaseMapping:0xA230 + }, + { code:0xA231 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA231 + ,simpleLowerCaseMapping:0xA231 + ,simpleTitleCaseMapping:0xA231 + }, + { code:0xA232 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA232 + ,simpleLowerCaseMapping:0xA232 + ,simpleTitleCaseMapping:0xA232 + }, + { code:0xA233 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA233 + ,simpleLowerCaseMapping:0xA233 + ,simpleTitleCaseMapping:0xA233 + }, + { code:0xA234 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA234 + ,simpleLowerCaseMapping:0xA234 + ,simpleTitleCaseMapping:0xA234 + }, + { code:0xA235 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA235 + ,simpleLowerCaseMapping:0xA235 + ,simpleTitleCaseMapping:0xA235 + }, + { code:0xA236 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA236 + ,simpleLowerCaseMapping:0xA236 + ,simpleTitleCaseMapping:0xA236 + }, + { code:0xA237 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA237 + ,simpleLowerCaseMapping:0xA237 + ,simpleTitleCaseMapping:0xA237 + }, + { code:0xA238 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA238 + ,simpleLowerCaseMapping:0xA238 + ,simpleTitleCaseMapping:0xA238 + }, + { code:0xA239 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA239 + ,simpleLowerCaseMapping:0xA239 + ,simpleTitleCaseMapping:0xA239 + }, + { code:0xA23A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA23A + ,simpleLowerCaseMapping:0xA23A + ,simpleTitleCaseMapping:0xA23A + }, + { code:0xA23B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA23B + ,simpleLowerCaseMapping:0xA23B + ,simpleTitleCaseMapping:0xA23B + }, + { code:0xA23C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA23C + ,simpleLowerCaseMapping:0xA23C + ,simpleTitleCaseMapping:0xA23C + }, + { code:0xA23D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA23D + ,simpleLowerCaseMapping:0xA23D + ,simpleTitleCaseMapping:0xA23D + }, + { code:0xA23E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA23E + ,simpleLowerCaseMapping:0xA23E + ,simpleTitleCaseMapping:0xA23E + }, + { code:0xA23F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA23F + ,simpleLowerCaseMapping:0xA23F + ,simpleTitleCaseMapping:0xA23F + }, + { code:0xA240 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA240 + ,simpleLowerCaseMapping:0xA240 + ,simpleTitleCaseMapping:0xA240 + }, + { code:0xA241 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA241 + ,simpleLowerCaseMapping:0xA241 + ,simpleTitleCaseMapping:0xA241 + }, + { code:0xA242 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA242 + ,simpleLowerCaseMapping:0xA242 + ,simpleTitleCaseMapping:0xA242 + }, + { code:0xA243 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA243 + ,simpleLowerCaseMapping:0xA243 + ,simpleTitleCaseMapping:0xA243 + }, + { code:0xA244 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA244 + ,simpleLowerCaseMapping:0xA244 + ,simpleTitleCaseMapping:0xA244 + }, + { code:0xA245 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA245 + ,simpleLowerCaseMapping:0xA245 + ,simpleTitleCaseMapping:0xA245 + }, + { code:0xA246 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA246 + ,simpleLowerCaseMapping:0xA246 + ,simpleTitleCaseMapping:0xA246 + }, + { code:0xA247 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA247 + ,simpleLowerCaseMapping:0xA247 + ,simpleTitleCaseMapping:0xA247 + }, + { code:0xA248 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA248 + ,simpleLowerCaseMapping:0xA248 + ,simpleTitleCaseMapping:0xA248 + }, + { code:0xA249 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA249 + ,simpleLowerCaseMapping:0xA249 + ,simpleTitleCaseMapping:0xA249 + }, + { code:0xA24A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA24A + ,simpleLowerCaseMapping:0xA24A + ,simpleTitleCaseMapping:0xA24A + }, + { code:0xA24B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA24B + ,simpleLowerCaseMapping:0xA24B + ,simpleTitleCaseMapping:0xA24B + }, + { code:0xA24C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA24C + ,simpleLowerCaseMapping:0xA24C + ,simpleTitleCaseMapping:0xA24C + }, + { code:0xA24D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA24D + ,simpleLowerCaseMapping:0xA24D + ,simpleTitleCaseMapping:0xA24D + }, + { code:0xA24E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA24E + ,simpleLowerCaseMapping:0xA24E + ,simpleTitleCaseMapping:0xA24E + }, + { code:0xA24F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA24F + ,simpleLowerCaseMapping:0xA24F + ,simpleTitleCaseMapping:0xA24F + }, + { code:0xA250 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA250 + ,simpleLowerCaseMapping:0xA250 + ,simpleTitleCaseMapping:0xA250 + }, + { code:0xA251 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA251 + ,simpleLowerCaseMapping:0xA251 + ,simpleTitleCaseMapping:0xA251 + }, + { code:0xA252 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA252 + ,simpleLowerCaseMapping:0xA252 + ,simpleTitleCaseMapping:0xA252 + }, + { code:0xA253 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA253 + ,simpleLowerCaseMapping:0xA253 + ,simpleTitleCaseMapping:0xA253 + }, + { code:0xA254 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA254 + ,simpleLowerCaseMapping:0xA254 + ,simpleTitleCaseMapping:0xA254 + }, + { code:0xA255 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA255 + ,simpleLowerCaseMapping:0xA255 + ,simpleTitleCaseMapping:0xA255 + }, + { code:0xA256 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA256 + ,simpleLowerCaseMapping:0xA256 + ,simpleTitleCaseMapping:0xA256 + }, + { code:0xA257 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA257 + ,simpleLowerCaseMapping:0xA257 + ,simpleTitleCaseMapping:0xA257 + }, + { code:0xA258 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA258 + ,simpleLowerCaseMapping:0xA258 + ,simpleTitleCaseMapping:0xA258 + }, + { code:0xA259 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA259 + ,simpleLowerCaseMapping:0xA259 + ,simpleTitleCaseMapping:0xA259 + }, + { code:0xA25A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA25A + ,simpleLowerCaseMapping:0xA25A + ,simpleTitleCaseMapping:0xA25A + }, + { code:0xA25B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA25B + ,simpleLowerCaseMapping:0xA25B + ,simpleTitleCaseMapping:0xA25B + }, + { code:0xA25C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA25C + ,simpleLowerCaseMapping:0xA25C + ,simpleTitleCaseMapping:0xA25C + }, + { code:0xA25D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA25D + ,simpleLowerCaseMapping:0xA25D + ,simpleTitleCaseMapping:0xA25D + }, + { code:0xA25E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA25E + ,simpleLowerCaseMapping:0xA25E + ,simpleTitleCaseMapping:0xA25E + }, + { code:0xA25F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA25F + ,simpleLowerCaseMapping:0xA25F + ,simpleTitleCaseMapping:0xA25F + }, + { code:0xA260 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA260 + ,simpleLowerCaseMapping:0xA260 + ,simpleTitleCaseMapping:0xA260 + }, + { code:0xA261 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA261 + ,simpleLowerCaseMapping:0xA261 + ,simpleTitleCaseMapping:0xA261 + }, + { code:0xA262 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA262 + ,simpleLowerCaseMapping:0xA262 + ,simpleTitleCaseMapping:0xA262 + }, + { code:0xA263 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA263 + ,simpleLowerCaseMapping:0xA263 + ,simpleTitleCaseMapping:0xA263 + }, + { code:0xA264 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA264 + ,simpleLowerCaseMapping:0xA264 + ,simpleTitleCaseMapping:0xA264 + }, + { code:0xA265 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA265 + ,simpleLowerCaseMapping:0xA265 + ,simpleTitleCaseMapping:0xA265 + }, + { code:0xA266 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA266 + ,simpleLowerCaseMapping:0xA266 + ,simpleTitleCaseMapping:0xA266 + }, + { code:0xA267 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA267 + ,simpleLowerCaseMapping:0xA267 + ,simpleTitleCaseMapping:0xA267 + }, + { code:0xA268 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA268 + ,simpleLowerCaseMapping:0xA268 + ,simpleTitleCaseMapping:0xA268 + }, + { code:0xA269 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA269 + ,simpleLowerCaseMapping:0xA269 + ,simpleTitleCaseMapping:0xA269 + }, + { code:0xA26A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA26A + ,simpleLowerCaseMapping:0xA26A + ,simpleTitleCaseMapping:0xA26A + }, + { code:0xA26B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA26B + ,simpleLowerCaseMapping:0xA26B + ,simpleTitleCaseMapping:0xA26B + }, + { code:0xA26C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA26C + ,simpleLowerCaseMapping:0xA26C + ,simpleTitleCaseMapping:0xA26C + }, + { code:0xA26D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA26D + ,simpleLowerCaseMapping:0xA26D + ,simpleTitleCaseMapping:0xA26D + }, + { code:0xA26E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA26E + ,simpleLowerCaseMapping:0xA26E + ,simpleTitleCaseMapping:0xA26E + }, + { code:0xA26F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA26F + ,simpleLowerCaseMapping:0xA26F + ,simpleTitleCaseMapping:0xA26F + }, + { code:0xA270 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA270 + ,simpleLowerCaseMapping:0xA270 + ,simpleTitleCaseMapping:0xA270 + }, + { code:0xA271 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA271 + ,simpleLowerCaseMapping:0xA271 + ,simpleTitleCaseMapping:0xA271 + }, + { code:0xA272 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA272 + ,simpleLowerCaseMapping:0xA272 + ,simpleTitleCaseMapping:0xA272 + }, + { code:0xA273 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA273 + ,simpleLowerCaseMapping:0xA273 + ,simpleTitleCaseMapping:0xA273 + }, + { code:0xA274 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA274 + ,simpleLowerCaseMapping:0xA274 + ,simpleTitleCaseMapping:0xA274 + }, + { code:0xA275 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA275 + ,simpleLowerCaseMapping:0xA275 + ,simpleTitleCaseMapping:0xA275 + }, + { code:0xA276 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA276 + ,simpleLowerCaseMapping:0xA276 + ,simpleTitleCaseMapping:0xA276 + }, + { code:0xA277 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA277 + ,simpleLowerCaseMapping:0xA277 + ,simpleTitleCaseMapping:0xA277 + }, + { code:0xA278 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA278 + ,simpleLowerCaseMapping:0xA278 + ,simpleTitleCaseMapping:0xA278 + }, + { code:0xA279 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA279 + ,simpleLowerCaseMapping:0xA279 + ,simpleTitleCaseMapping:0xA279 + }, + { code:0xA27A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA27A + ,simpleLowerCaseMapping:0xA27A + ,simpleTitleCaseMapping:0xA27A + }, + { code:0xA27B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA27B + ,simpleLowerCaseMapping:0xA27B + ,simpleTitleCaseMapping:0xA27B + }, + { code:0xA27C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA27C + ,simpleLowerCaseMapping:0xA27C + ,simpleTitleCaseMapping:0xA27C + }, + { code:0xA27D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA27D + ,simpleLowerCaseMapping:0xA27D + ,simpleTitleCaseMapping:0xA27D + }, + { code:0xA27E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA27E + ,simpleLowerCaseMapping:0xA27E + ,simpleTitleCaseMapping:0xA27E + }, + { code:0xA27F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA27F + ,simpleLowerCaseMapping:0xA27F + ,simpleTitleCaseMapping:0xA27F + }, + { code:0xA280 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA280 + ,simpleLowerCaseMapping:0xA280 + ,simpleTitleCaseMapping:0xA280 + }, + { code:0xA281 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA281 + ,simpleLowerCaseMapping:0xA281 + ,simpleTitleCaseMapping:0xA281 + }, + { code:0xA282 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA282 + ,simpleLowerCaseMapping:0xA282 + ,simpleTitleCaseMapping:0xA282 + }, + { code:0xA283 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA283 + ,simpleLowerCaseMapping:0xA283 + ,simpleTitleCaseMapping:0xA283 + }, + { code:0xA284 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA284 + ,simpleLowerCaseMapping:0xA284 + ,simpleTitleCaseMapping:0xA284 + }, + { code:0xA285 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA285 + ,simpleLowerCaseMapping:0xA285 + ,simpleTitleCaseMapping:0xA285 + }, + { code:0xA286 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA286 + ,simpleLowerCaseMapping:0xA286 + ,simpleTitleCaseMapping:0xA286 + }, + { code:0xA287 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA287 + ,simpleLowerCaseMapping:0xA287 + ,simpleTitleCaseMapping:0xA287 + }, + { code:0xA288 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA288 + ,simpleLowerCaseMapping:0xA288 + ,simpleTitleCaseMapping:0xA288 + }, + { code:0xA289 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA289 + ,simpleLowerCaseMapping:0xA289 + ,simpleTitleCaseMapping:0xA289 + }, + { code:0xA28A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA28A + ,simpleLowerCaseMapping:0xA28A + ,simpleTitleCaseMapping:0xA28A + }, + { code:0xA28B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA28B + ,simpleLowerCaseMapping:0xA28B + ,simpleTitleCaseMapping:0xA28B + }, + { code:0xA28C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA28C + ,simpleLowerCaseMapping:0xA28C + ,simpleTitleCaseMapping:0xA28C + }, + { code:0xA28D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA28D + ,simpleLowerCaseMapping:0xA28D + ,simpleTitleCaseMapping:0xA28D + }, + { code:0xA28E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA28E + ,simpleLowerCaseMapping:0xA28E + ,simpleTitleCaseMapping:0xA28E + }, + { code:0xA28F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA28F + ,simpleLowerCaseMapping:0xA28F + ,simpleTitleCaseMapping:0xA28F + }, + { code:0xA290 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA290 + ,simpleLowerCaseMapping:0xA290 + ,simpleTitleCaseMapping:0xA290 + }, + { code:0xA291 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA291 + ,simpleLowerCaseMapping:0xA291 + ,simpleTitleCaseMapping:0xA291 + }, + { code:0xA292 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA292 + ,simpleLowerCaseMapping:0xA292 + ,simpleTitleCaseMapping:0xA292 + }, + { code:0xA293 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA293 + ,simpleLowerCaseMapping:0xA293 + ,simpleTitleCaseMapping:0xA293 + }, + { code:0xA294 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA294 + ,simpleLowerCaseMapping:0xA294 + ,simpleTitleCaseMapping:0xA294 + }, + { code:0xA295 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA295 + ,simpleLowerCaseMapping:0xA295 + ,simpleTitleCaseMapping:0xA295 + }, + { code:0xA296 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA296 + ,simpleLowerCaseMapping:0xA296 + ,simpleTitleCaseMapping:0xA296 + }, + { code:0xA297 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA297 + ,simpleLowerCaseMapping:0xA297 + ,simpleTitleCaseMapping:0xA297 + }, + { code:0xA298 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA298 + ,simpleLowerCaseMapping:0xA298 + ,simpleTitleCaseMapping:0xA298 + }, + { code:0xA299 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA299 + ,simpleLowerCaseMapping:0xA299 + ,simpleTitleCaseMapping:0xA299 + }, + { code:0xA29A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA29A + ,simpleLowerCaseMapping:0xA29A + ,simpleTitleCaseMapping:0xA29A + }, + { code:0xA29B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA29B + ,simpleLowerCaseMapping:0xA29B + ,simpleTitleCaseMapping:0xA29B + }, + { code:0xA29C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA29C + ,simpleLowerCaseMapping:0xA29C + ,simpleTitleCaseMapping:0xA29C + }, + { code:0xA29D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA29D + ,simpleLowerCaseMapping:0xA29D + ,simpleTitleCaseMapping:0xA29D + }, + { code:0xA29E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA29E + ,simpleLowerCaseMapping:0xA29E + ,simpleTitleCaseMapping:0xA29E + }, + { code:0xA29F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA29F + ,simpleLowerCaseMapping:0xA29F + ,simpleTitleCaseMapping:0xA29F + }, + { code:0xA2A0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2A0 + ,simpleLowerCaseMapping:0xA2A0 + ,simpleTitleCaseMapping:0xA2A0 + }, + { code:0xA2A1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2A1 + ,simpleLowerCaseMapping:0xA2A1 + ,simpleTitleCaseMapping:0xA2A1 + }, + { code:0xA2A2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2A2 + ,simpleLowerCaseMapping:0xA2A2 + ,simpleTitleCaseMapping:0xA2A2 + }, + { code:0xA2A3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2A3 + ,simpleLowerCaseMapping:0xA2A3 + ,simpleTitleCaseMapping:0xA2A3 + }, + { code:0xA2A4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2A4 + ,simpleLowerCaseMapping:0xA2A4 + ,simpleTitleCaseMapping:0xA2A4 + }, + { code:0xA2A5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2A5 + ,simpleLowerCaseMapping:0xA2A5 + ,simpleTitleCaseMapping:0xA2A5 + }, + { code:0xA2A6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2A6 + ,simpleLowerCaseMapping:0xA2A6 + ,simpleTitleCaseMapping:0xA2A6 + }, + { code:0xA2A7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2A7 + ,simpleLowerCaseMapping:0xA2A7 + ,simpleTitleCaseMapping:0xA2A7 + }, + { code:0xA2A8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2A8 + ,simpleLowerCaseMapping:0xA2A8 + ,simpleTitleCaseMapping:0xA2A8 + }, + { code:0xA2A9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2A9 + ,simpleLowerCaseMapping:0xA2A9 + ,simpleTitleCaseMapping:0xA2A9 + }, + { code:0xA2AA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2AA + ,simpleLowerCaseMapping:0xA2AA + ,simpleTitleCaseMapping:0xA2AA + }, + { code:0xA2AB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2AB + ,simpleLowerCaseMapping:0xA2AB + ,simpleTitleCaseMapping:0xA2AB + }, + { code:0xA2AC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2AC + ,simpleLowerCaseMapping:0xA2AC + ,simpleTitleCaseMapping:0xA2AC + }, + { code:0xA2AD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2AD + ,simpleLowerCaseMapping:0xA2AD + ,simpleTitleCaseMapping:0xA2AD + }, + { code:0xA2AE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2AE + ,simpleLowerCaseMapping:0xA2AE + ,simpleTitleCaseMapping:0xA2AE + }, + { code:0xA2AF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2AF + ,simpleLowerCaseMapping:0xA2AF + ,simpleTitleCaseMapping:0xA2AF + }, + { code:0xA2B0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2B0 + ,simpleLowerCaseMapping:0xA2B0 + ,simpleTitleCaseMapping:0xA2B0 + }, + { code:0xA2B1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2B1 + ,simpleLowerCaseMapping:0xA2B1 + ,simpleTitleCaseMapping:0xA2B1 + }, + { code:0xA2B2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2B2 + ,simpleLowerCaseMapping:0xA2B2 + ,simpleTitleCaseMapping:0xA2B2 + }, + { code:0xA2B3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2B3 + ,simpleLowerCaseMapping:0xA2B3 + ,simpleTitleCaseMapping:0xA2B3 + }, + { code:0xA2B4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2B4 + ,simpleLowerCaseMapping:0xA2B4 + ,simpleTitleCaseMapping:0xA2B4 + }, + { code:0xA2B5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2B5 + ,simpleLowerCaseMapping:0xA2B5 + ,simpleTitleCaseMapping:0xA2B5 + }, + { code:0xA2B6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2B6 + ,simpleLowerCaseMapping:0xA2B6 + ,simpleTitleCaseMapping:0xA2B6 + }, + { code:0xA2B7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2B7 + ,simpleLowerCaseMapping:0xA2B7 + ,simpleTitleCaseMapping:0xA2B7 + }, + { code:0xA2B8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2B8 + ,simpleLowerCaseMapping:0xA2B8 + ,simpleTitleCaseMapping:0xA2B8 + }, + { code:0xA2B9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2B9 + ,simpleLowerCaseMapping:0xA2B9 + ,simpleTitleCaseMapping:0xA2B9 + }, + { code:0xA2BA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2BA + ,simpleLowerCaseMapping:0xA2BA + ,simpleTitleCaseMapping:0xA2BA + }, + { code:0xA2BB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2BB + ,simpleLowerCaseMapping:0xA2BB + ,simpleTitleCaseMapping:0xA2BB + }, + { code:0xA2BC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2BC + ,simpleLowerCaseMapping:0xA2BC + ,simpleTitleCaseMapping:0xA2BC + }, + { code:0xA2BD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2BD + ,simpleLowerCaseMapping:0xA2BD + ,simpleTitleCaseMapping:0xA2BD + }, + { code:0xA2BE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2BE + ,simpleLowerCaseMapping:0xA2BE + ,simpleTitleCaseMapping:0xA2BE + }, + { code:0xA2BF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2BF + ,simpleLowerCaseMapping:0xA2BF + ,simpleTitleCaseMapping:0xA2BF + }, + { code:0xA2C0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2C0 + ,simpleLowerCaseMapping:0xA2C0 + ,simpleTitleCaseMapping:0xA2C0 + }, + { code:0xA2C1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2C1 + ,simpleLowerCaseMapping:0xA2C1 + ,simpleTitleCaseMapping:0xA2C1 + }, + { code:0xA2C2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2C2 + ,simpleLowerCaseMapping:0xA2C2 + ,simpleTitleCaseMapping:0xA2C2 + }, + { code:0xA2C3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2C3 + ,simpleLowerCaseMapping:0xA2C3 + ,simpleTitleCaseMapping:0xA2C3 + }, + { code:0xA2C4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2C4 + ,simpleLowerCaseMapping:0xA2C4 + ,simpleTitleCaseMapping:0xA2C4 + }, + { code:0xA2C5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2C5 + ,simpleLowerCaseMapping:0xA2C5 + ,simpleTitleCaseMapping:0xA2C5 + }, + { code:0xA2C6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2C6 + ,simpleLowerCaseMapping:0xA2C6 + ,simpleTitleCaseMapping:0xA2C6 + }, + { code:0xA2C7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2C7 + ,simpleLowerCaseMapping:0xA2C7 + ,simpleTitleCaseMapping:0xA2C7 + }, + { code:0xA2C8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2C8 + ,simpleLowerCaseMapping:0xA2C8 + ,simpleTitleCaseMapping:0xA2C8 + }, + { code:0xA2C9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2C9 + ,simpleLowerCaseMapping:0xA2C9 + ,simpleTitleCaseMapping:0xA2C9 + }, + { code:0xA2CA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2CA + ,simpleLowerCaseMapping:0xA2CA + ,simpleTitleCaseMapping:0xA2CA + }, + { code:0xA2CB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2CB + ,simpleLowerCaseMapping:0xA2CB + ,simpleTitleCaseMapping:0xA2CB + }, + { code:0xA2CC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2CC + ,simpleLowerCaseMapping:0xA2CC + ,simpleTitleCaseMapping:0xA2CC + }, + { code:0xA2CD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2CD + ,simpleLowerCaseMapping:0xA2CD + ,simpleTitleCaseMapping:0xA2CD + }, + { code:0xA2CE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2CE + ,simpleLowerCaseMapping:0xA2CE + ,simpleTitleCaseMapping:0xA2CE + }, + { code:0xA2CF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2CF + ,simpleLowerCaseMapping:0xA2CF + ,simpleTitleCaseMapping:0xA2CF + }, + { code:0xA2D0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2D0 + ,simpleLowerCaseMapping:0xA2D0 + ,simpleTitleCaseMapping:0xA2D0 + }, + { code:0xA2D1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2D1 + ,simpleLowerCaseMapping:0xA2D1 + ,simpleTitleCaseMapping:0xA2D1 + }, + { code:0xA2D2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2D2 + ,simpleLowerCaseMapping:0xA2D2 + ,simpleTitleCaseMapping:0xA2D2 + }, + { code:0xA2D3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2D3 + ,simpleLowerCaseMapping:0xA2D3 + ,simpleTitleCaseMapping:0xA2D3 + }, + { code:0xA2D4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2D4 + ,simpleLowerCaseMapping:0xA2D4 + ,simpleTitleCaseMapping:0xA2D4 + }, + { code:0xA2D5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2D5 + ,simpleLowerCaseMapping:0xA2D5 + ,simpleTitleCaseMapping:0xA2D5 + }, + { code:0xA2D6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2D6 + ,simpleLowerCaseMapping:0xA2D6 + ,simpleTitleCaseMapping:0xA2D6 + }, + { code:0xA2D7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2D7 + ,simpleLowerCaseMapping:0xA2D7 + ,simpleTitleCaseMapping:0xA2D7 + }, + { code:0xA2D8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2D8 + ,simpleLowerCaseMapping:0xA2D8 + ,simpleTitleCaseMapping:0xA2D8 + }, + { code:0xA2D9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2D9 + ,simpleLowerCaseMapping:0xA2D9 + ,simpleTitleCaseMapping:0xA2D9 + }, + { code:0xA2DA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2DA + ,simpleLowerCaseMapping:0xA2DA + ,simpleTitleCaseMapping:0xA2DA + }, + { code:0xA2DB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2DB + ,simpleLowerCaseMapping:0xA2DB + ,simpleTitleCaseMapping:0xA2DB + }, + { code:0xA2DC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2DC + ,simpleLowerCaseMapping:0xA2DC + ,simpleTitleCaseMapping:0xA2DC + }, + { code:0xA2DD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2DD + ,simpleLowerCaseMapping:0xA2DD + ,simpleTitleCaseMapping:0xA2DD + }, + { code:0xA2DE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2DE + ,simpleLowerCaseMapping:0xA2DE + ,simpleTitleCaseMapping:0xA2DE + }, + { code:0xA2DF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2DF + ,simpleLowerCaseMapping:0xA2DF + ,simpleTitleCaseMapping:0xA2DF + }, + { code:0xA2E0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2E0 + ,simpleLowerCaseMapping:0xA2E0 + ,simpleTitleCaseMapping:0xA2E0 + }, + { code:0xA2E1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2E1 + ,simpleLowerCaseMapping:0xA2E1 + ,simpleTitleCaseMapping:0xA2E1 + }, + { code:0xA2E2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2E2 + ,simpleLowerCaseMapping:0xA2E2 + ,simpleTitleCaseMapping:0xA2E2 + }, + { code:0xA2E3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2E3 + ,simpleLowerCaseMapping:0xA2E3 + ,simpleTitleCaseMapping:0xA2E3 + }, + { code:0xA2E4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2E4 + ,simpleLowerCaseMapping:0xA2E4 + ,simpleTitleCaseMapping:0xA2E4 + }, + { code:0xA2E5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2E5 + ,simpleLowerCaseMapping:0xA2E5 + ,simpleTitleCaseMapping:0xA2E5 + }, + { code:0xA2E6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2E6 + ,simpleLowerCaseMapping:0xA2E6 + ,simpleTitleCaseMapping:0xA2E6 + }, + { code:0xA2E7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2E7 + ,simpleLowerCaseMapping:0xA2E7 + ,simpleTitleCaseMapping:0xA2E7 + }, + { code:0xA2E8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2E8 + ,simpleLowerCaseMapping:0xA2E8 + ,simpleTitleCaseMapping:0xA2E8 + }, + { code:0xA2E9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2E9 + ,simpleLowerCaseMapping:0xA2E9 + ,simpleTitleCaseMapping:0xA2E9 + }, + { code:0xA2EA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2EA + ,simpleLowerCaseMapping:0xA2EA + ,simpleTitleCaseMapping:0xA2EA + }, + { code:0xA2EB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2EB + ,simpleLowerCaseMapping:0xA2EB + ,simpleTitleCaseMapping:0xA2EB + }, + { code:0xA2EC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2EC + ,simpleLowerCaseMapping:0xA2EC + ,simpleTitleCaseMapping:0xA2EC + }, + { code:0xA2ED + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2ED + ,simpleLowerCaseMapping:0xA2ED + ,simpleTitleCaseMapping:0xA2ED + }, + { code:0xA2EE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2EE + ,simpleLowerCaseMapping:0xA2EE + ,simpleTitleCaseMapping:0xA2EE + }, + { code:0xA2EF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2EF + ,simpleLowerCaseMapping:0xA2EF + ,simpleTitleCaseMapping:0xA2EF + }, + { code:0xA2F0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2F0 + ,simpleLowerCaseMapping:0xA2F0 + ,simpleTitleCaseMapping:0xA2F0 + }, + { code:0xA2F1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2F1 + ,simpleLowerCaseMapping:0xA2F1 + ,simpleTitleCaseMapping:0xA2F1 + }, + { code:0xA2F2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2F2 + ,simpleLowerCaseMapping:0xA2F2 + ,simpleTitleCaseMapping:0xA2F2 + }, + { code:0xA2F3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2F3 + ,simpleLowerCaseMapping:0xA2F3 + ,simpleTitleCaseMapping:0xA2F3 + }, + { code:0xA2F4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2F4 + ,simpleLowerCaseMapping:0xA2F4 + ,simpleTitleCaseMapping:0xA2F4 + }, + { code:0xA2F5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2F5 + ,simpleLowerCaseMapping:0xA2F5 + ,simpleTitleCaseMapping:0xA2F5 + }, + { code:0xA2F6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2F6 + ,simpleLowerCaseMapping:0xA2F6 + ,simpleTitleCaseMapping:0xA2F6 + }, + { code:0xA2F7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2F7 + ,simpleLowerCaseMapping:0xA2F7 + ,simpleTitleCaseMapping:0xA2F7 + }, + { code:0xA2F8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2F8 + ,simpleLowerCaseMapping:0xA2F8 + ,simpleTitleCaseMapping:0xA2F8 + }, + { code:0xA2F9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2F9 + ,simpleLowerCaseMapping:0xA2F9 + ,simpleTitleCaseMapping:0xA2F9 + }, + { code:0xA2FA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2FA + ,simpleLowerCaseMapping:0xA2FA + ,simpleTitleCaseMapping:0xA2FA + }, + { code:0xA2FB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2FB + ,simpleLowerCaseMapping:0xA2FB + ,simpleTitleCaseMapping:0xA2FB + }, + { code:0xA2FC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2FC + ,simpleLowerCaseMapping:0xA2FC + ,simpleTitleCaseMapping:0xA2FC + }, + { code:0xA2FD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2FD + ,simpleLowerCaseMapping:0xA2FD + ,simpleTitleCaseMapping:0xA2FD + }, + { code:0xA2FE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2FE + ,simpleLowerCaseMapping:0xA2FE + ,simpleTitleCaseMapping:0xA2FE + }, + { code:0xA2FF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA2FF + ,simpleLowerCaseMapping:0xA2FF + ,simpleTitleCaseMapping:0xA2FF + }, + { code:0xA300 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA300 + ,simpleLowerCaseMapping:0xA300 + ,simpleTitleCaseMapping:0xA300 + }, + { code:0xA301 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA301 + ,simpleLowerCaseMapping:0xA301 + ,simpleTitleCaseMapping:0xA301 + }, + { code:0xA302 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA302 + ,simpleLowerCaseMapping:0xA302 + ,simpleTitleCaseMapping:0xA302 + }, + { code:0xA303 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA303 + ,simpleLowerCaseMapping:0xA303 + ,simpleTitleCaseMapping:0xA303 + }, + { code:0xA304 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA304 + ,simpleLowerCaseMapping:0xA304 + ,simpleTitleCaseMapping:0xA304 + }, + { code:0xA305 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA305 + ,simpleLowerCaseMapping:0xA305 + ,simpleTitleCaseMapping:0xA305 + }, + { code:0xA306 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA306 + ,simpleLowerCaseMapping:0xA306 + ,simpleTitleCaseMapping:0xA306 + }, + { code:0xA307 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA307 + ,simpleLowerCaseMapping:0xA307 + ,simpleTitleCaseMapping:0xA307 + }, + { code:0xA308 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA308 + ,simpleLowerCaseMapping:0xA308 + ,simpleTitleCaseMapping:0xA308 + }, + { code:0xA309 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA309 + ,simpleLowerCaseMapping:0xA309 + ,simpleTitleCaseMapping:0xA309 + }, + { code:0xA30A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA30A + ,simpleLowerCaseMapping:0xA30A + ,simpleTitleCaseMapping:0xA30A + }, + { code:0xA30B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA30B + ,simpleLowerCaseMapping:0xA30B + ,simpleTitleCaseMapping:0xA30B + }, + { code:0xA30C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA30C + ,simpleLowerCaseMapping:0xA30C + ,simpleTitleCaseMapping:0xA30C + }, + { code:0xA30D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA30D + ,simpleLowerCaseMapping:0xA30D + ,simpleTitleCaseMapping:0xA30D + }, + { code:0xA30E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA30E + ,simpleLowerCaseMapping:0xA30E + ,simpleTitleCaseMapping:0xA30E + }, + { code:0xA30F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA30F + ,simpleLowerCaseMapping:0xA30F + ,simpleTitleCaseMapping:0xA30F + }, + { code:0xA310 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA310 + ,simpleLowerCaseMapping:0xA310 + ,simpleTitleCaseMapping:0xA310 + }, + { code:0xA311 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA311 + ,simpleLowerCaseMapping:0xA311 + ,simpleTitleCaseMapping:0xA311 + }, + { code:0xA312 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA312 + ,simpleLowerCaseMapping:0xA312 + ,simpleTitleCaseMapping:0xA312 + }, + { code:0xA313 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA313 + ,simpleLowerCaseMapping:0xA313 + ,simpleTitleCaseMapping:0xA313 + }, + { code:0xA314 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA314 + ,simpleLowerCaseMapping:0xA314 + ,simpleTitleCaseMapping:0xA314 + }, + { code:0xA315 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA315 + ,simpleLowerCaseMapping:0xA315 + ,simpleTitleCaseMapping:0xA315 + }, + { code:0xA316 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA316 + ,simpleLowerCaseMapping:0xA316 + ,simpleTitleCaseMapping:0xA316 + }, + { code:0xA317 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA317 + ,simpleLowerCaseMapping:0xA317 + ,simpleTitleCaseMapping:0xA317 + }, + { code:0xA318 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA318 + ,simpleLowerCaseMapping:0xA318 + ,simpleTitleCaseMapping:0xA318 + }, + { code:0xA319 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA319 + ,simpleLowerCaseMapping:0xA319 + ,simpleTitleCaseMapping:0xA319 + }, + { code:0xA31A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA31A + ,simpleLowerCaseMapping:0xA31A + ,simpleTitleCaseMapping:0xA31A + }, + { code:0xA31B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA31B + ,simpleLowerCaseMapping:0xA31B + ,simpleTitleCaseMapping:0xA31B + }, + { code:0xA31C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA31C + ,simpleLowerCaseMapping:0xA31C + ,simpleTitleCaseMapping:0xA31C + }, + { code:0xA31D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA31D + ,simpleLowerCaseMapping:0xA31D + ,simpleTitleCaseMapping:0xA31D + }, + { code:0xA31E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA31E + ,simpleLowerCaseMapping:0xA31E + ,simpleTitleCaseMapping:0xA31E + }, + { code:0xA31F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA31F + ,simpleLowerCaseMapping:0xA31F + ,simpleTitleCaseMapping:0xA31F + }, + { code:0xA320 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA320 + ,simpleLowerCaseMapping:0xA320 + ,simpleTitleCaseMapping:0xA320 + }, + { code:0xA321 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA321 + ,simpleLowerCaseMapping:0xA321 + ,simpleTitleCaseMapping:0xA321 + }, + { code:0xA322 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA322 + ,simpleLowerCaseMapping:0xA322 + ,simpleTitleCaseMapping:0xA322 + }, + { code:0xA323 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA323 + ,simpleLowerCaseMapping:0xA323 + ,simpleTitleCaseMapping:0xA323 + }, + { code:0xA324 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA324 + ,simpleLowerCaseMapping:0xA324 + ,simpleTitleCaseMapping:0xA324 + }, + { code:0xA325 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA325 + ,simpleLowerCaseMapping:0xA325 + ,simpleTitleCaseMapping:0xA325 + }, + { code:0xA326 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA326 + ,simpleLowerCaseMapping:0xA326 + ,simpleTitleCaseMapping:0xA326 + }, + { code:0xA327 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA327 + ,simpleLowerCaseMapping:0xA327 + ,simpleTitleCaseMapping:0xA327 + }, + { code:0xA328 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA328 + ,simpleLowerCaseMapping:0xA328 + ,simpleTitleCaseMapping:0xA328 + }, + { code:0xA329 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA329 + ,simpleLowerCaseMapping:0xA329 + ,simpleTitleCaseMapping:0xA329 + }, + { code:0xA32A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA32A + ,simpleLowerCaseMapping:0xA32A + ,simpleTitleCaseMapping:0xA32A + }, + { code:0xA32B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA32B + ,simpleLowerCaseMapping:0xA32B + ,simpleTitleCaseMapping:0xA32B + }, + { code:0xA32C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA32C + ,simpleLowerCaseMapping:0xA32C + ,simpleTitleCaseMapping:0xA32C + }, + { code:0xA32D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA32D + ,simpleLowerCaseMapping:0xA32D + ,simpleTitleCaseMapping:0xA32D + }, + { code:0xA32E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA32E + ,simpleLowerCaseMapping:0xA32E + ,simpleTitleCaseMapping:0xA32E + }, + { code:0xA32F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA32F + ,simpleLowerCaseMapping:0xA32F + ,simpleTitleCaseMapping:0xA32F + }, + { code:0xA330 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA330 + ,simpleLowerCaseMapping:0xA330 + ,simpleTitleCaseMapping:0xA330 + }, + { code:0xA331 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA331 + ,simpleLowerCaseMapping:0xA331 + ,simpleTitleCaseMapping:0xA331 + }, + { code:0xA332 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA332 + ,simpleLowerCaseMapping:0xA332 + ,simpleTitleCaseMapping:0xA332 + }, + { code:0xA333 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA333 + ,simpleLowerCaseMapping:0xA333 + ,simpleTitleCaseMapping:0xA333 + }, + { code:0xA334 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA334 + ,simpleLowerCaseMapping:0xA334 + ,simpleTitleCaseMapping:0xA334 + }, + { code:0xA335 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA335 + ,simpleLowerCaseMapping:0xA335 + ,simpleTitleCaseMapping:0xA335 + }, + { code:0xA336 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA336 + ,simpleLowerCaseMapping:0xA336 + ,simpleTitleCaseMapping:0xA336 + }, + { code:0xA337 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA337 + ,simpleLowerCaseMapping:0xA337 + ,simpleTitleCaseMapping:0xA337 + }, + { code:0xA338 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA338 + ,simpleLowerCaseMapping:0xA338 + ,simpleTitleCaseMapping:0xA338 + }, + { code:0xA339 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA339 + ,simpleLowerCaseMapping:0xA339 + ,simpleTitleCaseMapping:0xA339 + }, + { code:0xA33A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA33A + ,simpleLowerCaseMapping:0xA33A + ,simpleTitleCaseMapping:0xA33A + }, + { code:0xA33B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA33B + ,simpleLowerCaseMapping:0xA33B + ,simpleTitleCaseMapping:0xA33B + }, + { code:0xA33C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA33C + ,simpleLowerCaseMapping:0xA33C + ,simpleTitleCaseMapping:0xA33C + }, + { code:0xA33D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA33D + ,simpleLowerCaseMapping:0xA33D + ,simpleTitleCaseMapping:0xA33D + }, + { code:0xA33E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA33E + ,simpleLowerCaseMapping:0xA33E + ,simpleTitleCaseMapping:0xA33E + }, + { code:0xA33F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA33F + ,simpleLowerCaseMapping:0xA33F + ,simpleTitleCaseMapping:0xA33F + }, + { code:0xA340 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA340 + ,simpleLowerCaseMapping:0xA340 + ,simpleTitleCaseMapping:0xA340 + }, + { code:0xA341 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA341 + ,simpleLowerCaseMapping:0xA341 + ,simpleTitleCaseMapping:0xA341 + }, + { code:0xA342 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA342 + ,simpleLowerCaseMapping:0xA342 + ,simpleTitleCaseMapping:0xA342 + }, + { code:0xA343 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA343 + ,simpleLowerCaseMapping:0xA343 + ,simpleTitleCaseMapping:0xA343 + }, + { code:0xA344 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA344 + ,simpleLowerCaseMapping:0xA344 + ,simpleTitleCaseMapping:0xA344 + }, + { code:0xA345 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA345 + ,simpleLowerCaseMapping:0xA345 + ,simpleTitleCaseMapping:0xA345 + }, + { code:0xA346 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA346 + ,simpleLowerCaseMapping:0xA346 + ,simpleTitleCaseMapping:0xA346 + }, + { code:0xA347 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA347 + ,simpleLowerCaseMapping:0xA347 + ,simpleTitleCaseMapping:0xA347 + }, + { code:0xA348 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA348 + ,simpleLowerCaseMapping:0xA348 + ,simpleTitleCaseMapping:0xA348 + }, + { code:0xA349 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA349 + ,simpleLowerCaseMapping:0xA349 + ,simpleTitleCaseMapping:0xA349 + }, + { code:0xA34A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA34A + ,simpleLowerCaseMapping:0xA34A + ,simpleTitleCaseMapping:0xA34A + }, + { code:0xA34B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA34B + ,simpleLowerCaseMapping:0xA34B + ,simpleTitleCaseMapping:0xA34B + }, + { code:0xA34C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA34C + ,simpleLowerCaseMapping:0xA34C + ,simpleTitleCaseMapping:0xA34C + }, + { code:0xA34D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA34D + ,simpleLowerCaseMapping:0xA34D + ,simpleTitleCaseMapping:0xA34D + }, + { code:0xA34E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA34E + ,simpleLowerCaseMapping:0xA34E + ,simpleTitleCaseMapping:0xA34E + }, + { code:0xA34F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA34F + ,simpleLowerCaseMapping:0xA34F + ,simpleTitleCaseMapping:0xA34F + }, + { code:0xA350 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA350 + ,simpleLowerCaseMapping:0xA350 + ,simpleTitleCaseMapping:0xA350 + }, + { code:0xA351 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA351 + ,simpleLowerCaseMapping:0xA351 + ,simpleTitleCaseMapping:0xA351 + }, + { code:0xA352 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA352 + ,simpleLowerCaseMapping:0xA352 + ,simpleTitleCaseMapping:0xA352 + }, + { code:0xA353 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA353 + ,simpleLowerCaseMapping:0xA353 + ,simpleTitleCaseMapping:0xA353 + }, + { code:0xA354 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA354 + ,simpleLowerCaseMapping:0xA354 + ,simpleTitleCaseMapping:0xA354 + }, + { code:0xA355 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA355 + ,simpleLowerCaseMapping:0xA355 + ,simpleTitleCaseMapping:0xA355 + }, + { code:0xA356 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA356 + ,simpleLowerCaseMapping:0xA356 + ,simpleTitleCaseMapping:0xA356 + }, + { code:0xA357 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA357 + ,simpleLowerCaseMapping:0xA357 + ,simpleTitleCaseMapping:0xA357 + }, + { code:0xA358 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA358 + ,simpleLowerCaseMapping:0xA358 + ,simpleTitleCaseMapping:0xA358 + }, + { code:0xA359 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA359 + ,simpleLowerCaseMapping:0xA359 + ,simpleTitleCaseMapping:0xA359 + }, + { code:0xA35A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA35A + ,simpleLowerCaseMapping:0xA35A + ,simpleTitleCaseMapping:0xA35A + }, + { code:0xA35B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA35B + ,simpleLowerCaseMapping:0xA35B + ,simpleTitleCaseMapping:0xA35B + }, + { code:0xA35C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA35C + ,simpleLowerCaseMapping:0xA35C + ,simpleTitleCaseMapping:0xA35C + }, + { code:0xA35D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA35D + ,simpleLowerCaseMapping:0xA35D + ,simpleTitleCaseMapping:0xA35D + }, + { code:0xA35E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA35E + ,simpleLowerCaseMapping:0xA35E + ,simpleTitleCaseMapping:0xA35E + }, + { code:0xA35F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA35F + ,simpleLowerCaseMapping:0xA35F + ,simpleTitleCaseMapping:0xA35F + }, + { code:0xA360 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA360 + ,simpleLowerCaseMapping:0xA360 + ,simpleTitleCaseMapping:0xA360 + }, + { code:0xA361 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA361 + ,simpleLowerCaseMapping:0xA361 + ,simpleTitleCaseMapping:0xA361 + }, + { code:0xA362 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA362 + ,simpleLowerCaseMapping:0xA362 + ,simpleTitleCaseMapping:0xA362 + }, + { code:0xA363 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA363 + ,simpleLowerCaseMapping:0xA363 + ,simpleTitleCaseMapping:0xA363 + }, + { code:0xA364 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA364 + ,simpleLowerCaseMapping:0xA364 + ,simpleTitleCaseMapping:0xA364 + }, + { code:0xA365 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA365 + ,simpleLowerCaseMapping:0xA365 + ,simpleTitleCaseMapping:0xA365 + }, + { code:0xA366 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA366 + ,simpleLowerCaseMapping:0xA366 + ,simpleTitleCaseMapping:0xA366 + }, + { code:0xA367 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA367 + ,simpleLowerCaseMapping:0xA367 + ,simpleTitleCaseMapping:0xA367 + }, + { code:0xA368 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA368 + ,simpleLowerCaseMapping:0xA368 + ,simpleTitleCaseMapping:0xA368 + }, + { code:0xA369 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA369 + ,simpleLowerCaseMapping:0xA369 + ,simpleTitleCaseMapping:0xA369 + }, + { code:0xA36A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA36A + ,simpleLowerCaseMapping:0xA36A + ,simpleTitleCaseMapping:0xA36A + }, + { code:0xA36B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA36B + ,simpleLowerCaseMapping:0xA36B + ,simpleTitleCaseMapping:0xA36B + }, + { code:0xA36C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA36C + ,simpleLowerCaseMapping:0xA36C + ,simpleTitleCaseMapping:0xA36C + }, + { code:0xA36D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA36D + ,simpleLowerCaseMapping:0xA36D + ,simpleTitleCaseMapping:0xA36D + }, + { code:0xA36E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA36E + ,simpleLowerCaseMapping:0xA36E + ,simpleTitleCaseMapping:0xA36E + }, + { code:0xA36F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA36F + ,simpleLowerCaseMapping:0xA36F + ,simpleTitleCaseMapping:0xA36F + }, + { code:0xA370 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA370 + ,simpleLowerCaseMapping:0xA370 + ,simpleTitleCaseMapping:0xA370 + }, + { code:0xA371 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA371 + ,simpleLowerCaseMapping:0xA371 + ,simpleTitleCaseMapping:0xA371 + }, + { code:0xA372 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA372 + ,simpleLowerCaseMapping:0xA372 + ,simpleTitleCaseMapping:0xA372 + }, + { code:0xA373 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA373 + ,simpleLowerCaseMapping:0xA373 + ,simpleTitleCaseMapping:0xA373 + }, + { code:0xA374 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA374 + ,simpleLowerCaseMapping:0xA374 + ,simpleTitleCaseMapping:0xA374 + }, + { code:0xA375 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA375 + ,simpleLowerCaseMapping:0xA375 + ,simpleTitleCaseMapping:0xA375 + }, + { code:0xA376 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA376 + ,simpleLowerCaseMapping:0xA376 + ,simpleTitleCaseMapping:0xA376 + }, + { code:0xA377 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA377 + ,simpleLowerCaseMapping:0xA377 + ,simpleTitleCaseMapping:0xA377 + }, + { code:0xA378 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA378 + ,simpleLowerCaseMapping:0xA378 + ,simpleTitleCaseMapping:0xA378 + }, + { code:0xA379 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA379 + ,simpleLowerCaseMapping:0xA379 + ,simpleTitleCaseMapping:0xA379 + }, + { code:0xA37A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA37A + ,simpleLowerCaseMapping:0xA37A + ,simpleTitleCaseMapping:0xA37A + }, + { code:0xA37B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA37B + ,simpleLowerCaseMapping:0xA37B + ,simpleTitleCaseMapping:0xA37B + }, + { code:0xA37C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA37C + ,simpleLowerCaseMapping:0xA37C + ,simpleTitleCaseMapping:0xA37C + }, + { code:0xA37D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA37D + ,simpleLowerCaseMapping:0xA37D + ,simpleTitleCaseMapping:0xA37D + }, + { code:0xA37E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA37E + ,simpleLowerCaseMapping:0xA37E + ,simpleTitleCaseMapping:0xA37E + }, + { code:0xA37F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA37F + ,simpleLowerCaseMapping:0xA37F + ,simpleTitleCaseMapping:0xA37F + }, + { code:0xA380 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA380 + ,simpleLowerCaseMapping:0xA380 + ,simpleTitleCaseMapping:0xA380 + }, + { code:0xA381 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA381 + ,simpleLowerCaseMapping:0xA381 + ,simpleTitleCaseMapping:0xA381 + }, + { code:0xA382 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA382 + ,simpleLowerCaseMapping:0xA382 + ,simpleTitleCaseMapping:0xA382 + }, + { code:0xA383 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA383 + ,simpleLowerCaseMapping:0xA383 + ,simpleTitleCaseMapping:0xA383 + }, + { code:0xA384 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA384 + ,simpleLowerCaseMapping:0xA384 + ,simpleTitleCaseMapping:0xA384 + }, + { code:0xA385 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA385 + ,simpleLowerCaseMapping:0xA385 + ,simpleTitleCaseMapping:0xA385 + }, + { code:0xA386 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA386 + ,simpleLowerCaseMapping:0xA386 + ,simpleTitleCaseMapping:0xA386 + }, + { code:0xA387 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA387 + ,simpleLowerCaseMapping:0xA387 + ,simpleTitleCaseMapping:0xA387 + }, + { code:0xA388 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA388 + ,simpleLowerCaseMapping:0xA388 + ,simpleTitleCaseMapping:0xA388 + }, + { code:0xA389 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA389 + ,simpleLowerCaseMapping:0xA389 + ,simpleTitleCaseMapping:0xA389 + }, + { code:0xA38A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA38A + ,simpleLowerCaseMapping:0xA38A + ,simpleTitleCaseMapping:0xA38A + }, + { code:0xA38B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA38B + ,simpleLowerCaseMapping:0xA38B + ,simpleTitleCaseMapping:0xA38B + }, + { code:0xA38C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA38C + ,simpleLowerCaseMapping:0xA38C + ,simpleTitleCaseMapping:0xA38C + }, + { code:0xA38D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA38D + ,simpleLowerCaseMapping:0xA38D + ,simpleTitleCaseMapping:0xA38D + }, + { code:0xA38E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA38E + ,simpleLowerCaseMapping:0xA38E + ,simpleTitleCaseMapping:0xA38E + }, + { code:0xA38F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA38F + ,simpleLowerCaseMapping:0xA38F + ,simpleTitleCaseMapping:0xA38F + }, + { code:0xA390 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA390 + ,simpleLowerCaseMapping:0xA390 + ,simpleTitleCaseMapping:0xA390 + }, + { code:0xA391 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA391 + ,simpleLowerCaseMapping:0xA391 + ,simpleTitleCaseMapping:0xA391 + }, + { code:0xA392 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA392 + ,simpleLowerCaseMapping:0xA392 + ,simpleTitleCaseMapping:0xA392 + }, + { code:0xA393 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA393 + ,simpleLowerCaseMapping:0xA393 + ,simpleTitleCaseMapping:0xA393 + }, + { code:0xA394 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA394 + ,simpleLowerCaseMapping:0xA394 + ,simpleTitleCaseMapping:0xA394 + }, + { code:0xA395 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA395 + ,simpleLowerCaseMapping:0xA395 + ,simpleTitleCaseMapping:0xA395 + }, + { code:0xA396 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA396 + ,simpleLowerCaseMapping:0xA396 + ,simpleTitleCaseMapping:0xA396 + }, + { code:0xA397 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA397 + ,simpleLowerCaseMapping:0xA397 + ,simpleTitleCaseMapping:0xA397 + }, + { code:0xA398 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA398 + ,simpleLowerCaseMapping:0xA398 + ,simpleTitleCaseMapping:0xA398 + }, + { code:0xA399 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA399 + ,simpleLowerCaseMapping:0xA399 + ,simpleTitleCaseMapping:0xA399 + }, + { code:0xA39A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA39A + ,simpleLowerCaseMapping:0xA39A + ,simpleTitleCaseMapping:0xA39A + }, + { code:0xA39B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA39B + ,simpleLowerCaseMapping:0xA39B + ,simpleTitleCaseMapping:0xA39B + }, + { code:0xA39C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA39C + ,simpleLowerCaseMapping:0xA39C + ,simpleTitleCaseMapping:0xA39C + }, + { code:0xA39D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA39D + ,simpleLowerCaseMapping:0xA39D + ,simpleTitleCaseMapping:0xA39D + }, + { code:0xA39E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA39E + ,simpleLowerCaseMapping:0xA39E + ,simpleTitleCaseMapping:0xA39E + }, + { code:0xA39F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA39F + ,simpleLowerCaseMapping:0xA39F + ,simpleTitleCaseMapping:0xA39F + }, + { code:0xA3A0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3A0 + ,simpleLowerCaseMapping:0xA3A0 + ,simpleTitleCaseMapping:0xA3A0 + }, + { code:0xA3A1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3A1 + ,simpleLowerCaseMapping:0xA3A1 + ,simpleTitleCaseMapping:0xA3A1 + }, + { code:0xA3A2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3A2 + ,simpleLowerCaseMapping:0xA3A2 + ,simpleTitleCaseMapping:0xA3A2 + }, + { code:0xA3A3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3A3 + ,simpleLowerCaseMapping:0xA3A3 + ,simpleTitleCaseMapping:0xA3A3 + }, + { code:0xA3A4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3A4 + ,simpleLowerCaseMapping:0xA3A4 + ,simpleTitleCaseMapping:0xA3A4 + }, + { code:0xA3A5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3A5 + ,simpleLowerCaseMapping:0xA3A5 + ,simpleTitleCaseMapping:0xA3A5 + }, + { code:0xA3A6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3A6 + ,simpleLowerCaseMapping:0xA3A6 + ,simpleTitleCaseMapping:0xA3A6 + }, + { code:0xA3A7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3A7 + ,simpleLowerCaseMapping:0xA3A7 + ,simpleTitleCaseMapping:0xA3A7 + }, + { code:0xA3A8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3A8 + ,simpleLowerCaseMapping:0xA3A8 + ,simpleTitleCaseMapping:0xA3A8 + }, + { code:0xA3A9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3A9 + ,simpleLowerCaseMapping:0xA3A9 + ,simpleTitleCaseMapping:0xA3A9 + }, + { code:0xA3AA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3AA + ,simpleLowerCaseMapping:0xA3AA + ,simpleTitleCaseMapping:0xA3AA + }, + { code:0xA3AB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3AB + ,simpleLowerCaseMapping:0xA3AB + ,simpleTitleCaseMapping:0xA3AB + }, + { code:0xA3AC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3AC + ,simpleLowerCaseMapping:0xA3AC + ,simpleTitleCaseMapping:0xA3AC + }, + { code:0xA3AD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3AD + ,simpleLowerCaseMapping:0xA3AD + ,simpleTitleCaseMapping:0xA3AD + }, + { code:0xA3AE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3AE + ,simpleLowerCaseMapping:0xA3AE + ,simpleTitleCaseMapping:0xA3AE + }, + { code:0xA3AF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3AF + ,simpleLowerCaseMapping:0xA3AF + ,simpleTitleCaseMapping:0xA3AF + }, + { code:0xA3B0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3B0 + ,simpleLowerCaseMapping:0xA3B0 + ,simpleTitleCaseMapping:0xA3B0 + }, + { code:0xA3B1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3B1 + ,simpleLowerCaseMapping:0xA3B1 + ,simpleTitleCaseMapping:0xA3B1 + }, + { code:0xA3B2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3B2 + ,simpleLowerCaseMapping:0xA3B2 + ,simpleTitleCaseMapping:0xA3B2 + }, + { code:0xA3B3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3B3 + ,simpleLowerCaseMapping:0xA3B3 + ,simpleTitleCaseMapping:0xA3B3 + }, + { code:0xA3B4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3B4 + ,simpleLowerCaseMapping:0xA3B4 + ,simpleTitleCaseMapping:0xA3B4 + }, + { code:0xA3B5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3B5 + ,simpleLowerCaseMapping:0xA3B5 + ,simpleTitleCaseMapping:0xA3B5 + }, + { code:0xA3B6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3B6 + ,simpleLowerCaseMapping:0xA3B6 + ,simpleTitleCaseMapping:0xA3B6 + }, + { code:0xA3B7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3B7 + ,simpleLowerCaseMapping:0xA3B7 + ,simpleTitleCaseMapping:0xA3B7 + }, + { code:0xA3B8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3B8 + ,simpleLowerCaseMapping:0xA3B8 + ,simpleTitleCaseMapping:0xA3B8 + }, + { code:0xA3B9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3B9 + ,simpleLowerCaseMapping:0xA3B9 + ,simpleTitleCaseMapping:0xA3B9 + }, + { code:0xA3BA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3BA + ,simpleLowerCaseMapping:0xA3BA + ,simpleTitleCaseMapping:0xA3BA + }, + { code:0xA3BB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3BB + ,simpleLowerCaseMapping:0xA3BB + ,simpleTitleCaseMapping:0xA3BB + }, + { code:0xA3BC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3BC + ,simpleLowerCaseMapping:0xA3BC + ,simpleTitleCaseMapping:0xA3BC + }, + { code:0xA3BD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3BD + ,simpleLowerCaseMapping:0xA3BD + ,simpleTitleCaseMapping:0xA3BD + }, + { code:0xA3BE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3BE + ,simpleLowerCaseMapping:0xA3BE + ,simpleTitleCaseMapping:0xA3BE + }, + { code:0xA3BF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3BF + ,simpleLowerCaseMapping:0xA3BF + ,simpleTitleCaseMapping:0xA3BF + }, + { code:0xA3C0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3C0 + ,simpleLowerCaseMapping:0xA3C0 + ,simpleTitleCaseMapping:0xA3C0 + }, + { code:0xA3C1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3C1 + ,simpleLowerCaseMapping:0xA3C1 + ,simpleTitleCaseMapping:0xA3C1 + }, + { code:0xA3C2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3C2 + ,simpleLowerCaseMapping:0xA3C2 + ,simpleTitleCaseMapping:0xA3C2 + }, + { code:0xA3C3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3C3 + ,simpleLowerCaseMapping:0xA3C3 + ,simpleTitleCaseMapping:0xA3C3 + }, + { code:0xA3C4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3C4 + ,simpleLowerCaseMapping:0xA3C4 + ,simpleTitleCaseMapping:0xA3C4 + }, + { code:0xA3C5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3C5 + ,simpleLowerCaseMapping:0xA3C5 + ,simpleTitleCaseMapping:0xA3C5 + }, + { code:0xA3C6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3C6 + ,simpleLowerCaseMapping:0xA3C6 + ,simpleTitleCaseMapping:0xA3C6 + }, + { code:0xA3C7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3C7 + ,simpleLowerCaseMapping:0xA3C7 + ,simpleTitleCaseMapping:0xA3C7 + }, + { code:0xA3C8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3C8 + ,simpleLowerCaseMapping:0xA3C8 + ,simpleTitleCaseMapping:0xA3C8 + }, + { code:0xA3C9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3C9 + ,simpleLowerCaseMapping:0xA3C9 + ,simpleTitleCaseMapping:0xA3C9 + }, + { code:0xA3CA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3CA + ,simpleLowerCaseMapping:0xA3CA + ,simpleTitleCaseMapping:0xA3CA + }, + { code:0xA3CB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3CB + ,simpleLowerCaseMapping:0xA3CB + ,simpleTitleCaseMapping:0xA3CB + }, + { code:0xA3CC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3CC + ,simpleLowerCaseMapping:0xA3CC + ,simpleTitleCaseMapping:0xA3CC + }, + { code:0xA3CD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3CD + ,simpleLowerCaseMapping:0xA3CD + ,simpleTitleCaseMapping:0xA3CD + }, + { code:0xA3CE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3CE + ,simpleLowerCaseMapping:0xA3CE + ,simpleTitleCaseMapping:0xA3CE + }, + { code:0xA3CF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3CF + ,simpleLowerCaseMapping:0xA3CF + ,simpleTitleCaseMapping:0xA3CF + }, + { code:0xA3D0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3D0 + ,simpleLowerCaseMapping:0xA3D0 + ,simpleTitleCaseMapping:0xA3D0 + }, + { code:0xA3D1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3D1 + ,simpleLowerCaseMapping:0xA3D1 + ,simpleTitleCaseMapping:0xA3D1 + }, + { code:0xA3D2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3D2 + ,simpleLowerCaseMapping:0xA3D2 + ,simpleTitleCaseMapping:0xA3D2 + }, + { code:0xA3D3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3D3 + ,simpleLowerCaseMapping:0xA3D3 + ,simpleTitleCaseMapping:0xA3D3 + }, + { code:0xA3D4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3D4 + ,simpleLowerCaseMapping:0xA3D4 + ,simpleTitleCaseMapping:0xA3D4 + }, + { code:0xA3D5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3D5 + ,simpleLowerCaseMapping:0xA3D5 + ,simpleTitleCaseMapping:0xA3D5 + }, + { code:0xA3D6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3D6 + ,simpleLowerCaseMapping:0xA3D6 + ,simpleTitleCaseMapping:0xA3D6 + }, + { code:0xA3D7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3D7 + ,simpleLowerCaseMapping:0xA3D7 + ,simpleTitleCaseMapping:0xA3D7 + }, + { code:0xA3D8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3D8 + ,simpleLowerCaseMapping:0xA3D8 + ,simpleTitleCaseMapping:0xA3D8 + }, + { code:0xA3D9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3D9 + ,simpleLowerCaseMapping:0xA3D9 + ,simpleTitleCaseMapping:0xA3D9 + }, + { code:0xA3DA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3DA + ,simpleLowerCaseMapping:0xA3DA + ,simpleTitleCaseMapping:0xA3DA + }, + { code:0xA3DB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3DB + ,simpleLowerCaseMapping:0xA3DB + ,simpleTitleCaseMapping:0xA3DB + }, + { code:0xA3DC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3DC + ,simpleLowerCaseMapping:0xA3DC + ,simpleTitleCaseMapping:0xA3DC + }, + { code:0xA3DD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3DD + ,simpleLowerCaseMapping:0xA3DD + ,simpleTitleCaseMapping:0xA3DD + }, + { code:0xA3DE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3DE + ,simpleLowerCaseMapping:0xA3DE + ,simpleTitleCaseMapping:0xA3DE + }, + { code:0xA3DF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3DF + ,simpleLowerCaseMapping:0xA3DF + ,simpleTitleCaseMapping:0xA3DF + }, + { code:0xA3E0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3E0 + ,simpleLowerCaseMapping:0xA3E0 + ,simpleTitleCaseMapping:0xA3E0 + }, + { code:0xA3E1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3E1 + ,simpleLowerCaseMapping:0xA3E1 + ,simpleTitleCaseMapping:0xA3E1 + }, + { code:0xA3E2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3E2 + ,simpleLowerCaseMapping:0xA3E2 + ,simpleTitleCaseMapping:0xA3E2 + }, + { code:0xA3E3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3E3 + ,simpleLowerCaseMapping:0xA3E3 + ,simpleTitleCaseMapping:0xA3E3 + }, + { code:0xA3E4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3E4 + ,simpleLowerCaseMapping:0xA3E4 + ,simpleTitleCaseMapping:0xA3E4 + }, + { code:0xA3E5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3E5 + ,simpleLowerCaseMapping:0xA3E5 + ,simpleTitleCaseMapping:0xA3E5 + }, + { code:0xA3E6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3E6 + ,simpleLowerCaseMapping:0xA3E6 + ,simpleTitleCaseMapping:0xA3E6 + }, + { code:0xA3E7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3E7 + ,simpleLowerCaseMapping:0xA3E7 + ,simpleTitleCaseMapping:0xA3E7 + }, + { code:0xA3E8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3E8 + ,simpleLowerCaseMapping:0xA3E8 + ,simpleTitleCaseMapping:0xA3E8 + }, + { code:0xA3E9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3E9 + ,simpleLowerCaseMapping:0xA3E9 + ,simpleTitleCaseMapping:0xA3E9 + }, + { code:0xA3EA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3EA + ,simpleLowerCaseMapping:0xA3EA + ,simpleTitleCaseMapping:0xA3EA + }, + { code:0xA3EB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3EB + ,simpleLowerCaseMapping:0xA3EB + ,simpleTitleCaseMapping:0xA3EB + }, + { code:0xA3EC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3EC + ,simpleLowerCaseMapping:0xA3EC + ,simpleTitleCaseMapping:0xA3EC + }, + { code:0xA3ED + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3ED + ,simpleLowerCaseMapping:0xA3ED + ,simpleTitleCaseMapping:0xA3ED + }, + { code:0xA3EE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3EE + ,simpleLowerCaseMapping:0xA3EE + ,simpleTitleCaseMapping:0xA3EE + }, + { code:0xA3EF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3EF + ,simpleLowerCaseMapping:0xA3EF + ,simpleTitleCaseMapping:0xA3EF + }, + { code:0xA3F0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3F0 + ,simpleLowerCaseMapping:0xA3F0 + ,simpleTitleCaseMapping:0xA3F0 + }, + { code:0xA3F1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3F1 + ,simpleLowerCaseMapping:0xA3F1 + ,simpleTitleCaseMapping:0xA3F1 + }, + { code:0xA3F2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3F2 + ,simpleLowerCaseMapping:0xA3F2 + ,simpleTitleCaseMapping:0xA3F2 + }, + { code:0xA3F3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3F3 + ,simpleLowerCaseMapping:0xA3F3 + ,simpleTitleCaseMapping:0xA3F3 + }, + { code:0xA3F4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3F4 + ,simpleLowerCaseMapping:0xA3F4 + ,simpleTitleCaseMapping:0xA3F4 + }, + { code:0xA3F5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3F5 + ,simpleLowerCaseMapping:0xA3F5 + ,simpleTitleCaseMapping:0xA3F5 + }, + { code:0xA3F6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3F6 + ,simpleLowerCaseMapping:0xA3F6 + ,simpleTitleCaseMapping:0xA3F6 + }, + { code:0xA3F7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3F7 + ,simpleLowerCaseMapping:0xA3F7 + ,simpleTitleCaseMapping:0xA3F7 + }, + { code:0xA3F8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3F8 + ,simpleLowerCaseMapping:0xA3F8 + ,simpleTitleCaseMapping:0xA3F8 + }, + { code:0xA3F9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3F9 + ,simpleLowerCaseMapping:0xA3F9 + ,simpleTitleCaseMapping:0xA3F9 + }, + { code:0xA3FA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3FA + ,simpleLowerCaseMapping:0xA3FA + ,simpleTitleCaseMapping:0xA3FA + }, + { code:0xA3FB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3FB + ,simpleLowerCaseMapping:0xA3FB + ,simpleTitleCaseMapping:0xA3FB + }, + { code:0xA3FC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3FC + ,simpleLowerCaseMapping:0xA3FC + ,simpleTitleCaseMapping:0xA3FC + }, + { code:0xA3FD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3FD + ,simpleLowerCaseMapping:0xA3FD + ,simpleTitleCaseMapping:0xA3FD + }, + { code:0xA3FE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3FE + ,simpleLowerCaseMapping:0xA3FE + ,simpleTitleCaseMapping:0xA3FE + }, + { code:0xA3FF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA3FF + ,simpleLowerCaseMapping:0xA3FF + ,simpleTitleCaseMapping:0xA3FF + }, + { code:0xA400 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA400 + ,simpleLowerCaseMapping:0xA400 + ,simpleTitleCaseMapping:0xA400 + }, + { code:0xA401 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA401 + ,simpleLowerCaseMapping:0xA401 + ,simpleTitleCaseMapping:0xA401 + }, + { code:0xA402 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA402 + ,simpleLowerCaseMapping:0xA402 + ,simpleTitleCaseMapping:0xA402 + }, + { code:0xA403 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA403 + ,simpleLowerCaseMapping:0xA403 + ,simpleTitleCaseMapping:0xA403 + }, + { code:0xA404 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA404 + ,simpleLowerCaseMapping:0xA404 + ,simpleTitleCaseMapping:0xA404 + }, + { code:0xA405 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA405 + ,simpleLowerCaseMapping:0xA405 + ,simpleTitleCaseMapping:0xA405 + }, + { code:0xA406 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA406 + ,simpleLowerCaseMapping:0xA406 + ,simpleTitleCaseMapping:0xA406 + }, + { code:0xA407 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA407 + ,simpleLowerCaseMapping:0xA407 + ,simpleTitleCaseMapping:0xA407 + }, + { code:0xA408 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA408 + ,simpleLowerCaseMapping:0xA408 + ,simpleTitleCaseMapping:0xA408 + }, + { code:0xA409 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA409 + ,simpleLowerCaseMapping:0xA409 + ,simpleTitleCaseMapping:0xA409 + }, + { code:0xA40A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA40A + ,simpleLowerCaseMapping:0xA40A + ,simpleTitleCaseMapping:0xA40A + }, + { code:0xA40B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA40B + ,simpleLowerCaseMapping:0xA40B + ,simpleTitleCaseMapping:0xA40B + }, + { code:0xA40C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA40C + ,simpleLowerCaseMapping:0xA40C + ,simpleTitleCaseMapping:0xA40C + }, + { code:0xA40D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA40D + ,simpleLowerCaseMapping:0xA40D + ,simpleTitleCaseMapping:0xA40D + }, + { code:0xA40E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA40E + ,simpleLowerCaseMapping:0xA40E + ,simpleTitleCaseMapping:0xA40E + }, + { code:0xA40F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA40F + ,simpleLowerCaseMapping:0xA40F + ,simpleTitleCaseMapping:0xA40F + }, + { code:0xA410 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA410 + ,simpleLowerCaseMapping:0xA410 + ,simpleTitleCaseMapping:0xA410 + }, + { code:0xA411 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA411 + ,simpleLowerCaseMapping:0xA411 + ,simpleTitleCaseMapping:0xA411 + }, + { code:0xA412 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA412 + ,simpleLowerCaseMapping:0xA412 + ,simpleTitleCaseMapping:0xA412 + }, + { code:0xA413 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA413 + ,simpleLowerCaseMapping:0xA413 + ,simpleTitleCaseMapping:0xA413 + }, + { code:0xA414 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA414 + ,simpleLowerCaseMapping:0xA414 + ,simpleTitleCaseMapping:0xA414 + }, + { code:0xA415 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA415 + ,simpleLowerCaseMapping:0xA415 + ,simpleTitleCaseMapping:0xA415 + }, + { code:0xA416 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA416 + ,simpleLowerCaseMapping:0xA416 + ,simpleTitleCaseMapping:0xA416 + }, + { code:0xA417 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA417 + ,simpleLowerCaseMapping:0xA417 + ,simpleTitleCaseMapping:0xA417 + }, + { code:0xA418 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA418 + ,simpleLowerCaseMapping:0xA418 + ,simpleTitleCaseMapping:0xA418 + }, + { code:0xA419 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA419 + ,simpleLowerCaseMapping:0xA419 + ,simpleTitleCaseMapping:0xA419 + }, + { code:0xA41A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA41A + ,simpleLowerCaseMapping:0xA41A + ,simpleTitleCaseMapping:0xA41A + }, + { code:0xA41B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA41B + ,simpleLowerCaseMapping:0xA41B + ,simpleTitleCaseMapping:0xA41B + }, + { code:0xA41C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA41C + ,simpleLowerCaseMapping:0xA41C + ,simpleTitleCaseMapping:0xA41C + }, + { code:0xA41D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA41D + ,simpleLowerCaseMapping:0xA41D + ,simpleTitleCaseMapping:0xA41D + }, + { code:0xA41E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA41E + ,simpleLowerCaseMapping:0xA41E + ,simpleTitleCaseMapping:0xA41E + }, + { code:0xA41F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA41F + ,simpleLowerCaseMapping:0xA41F + ,simpleTitleCaseMapping:0xA41F + }, + { code:0xA420 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA420 + ,simpleLowerCaseMapping:0xA420 + ,simpleTitleCaseMapping:0xA420 + }, + { code:0xA421 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA421 + ,simpleLowerCaseMapping:0xA421 + ,simpleTitleCaseMapping:0xA421 + }, + { code:0xA422 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA422 + ,simpleLowerCaseMapping:0xA422 + ,simpleTitleCaseMapping:0xA422 + }, + { code:0xA423 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA423 + ,simpleLowerCaseMapping:0xA423 + ,simpleTitleCaseMapping:0xA423 + }, + { code:0xA424 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA424 + ,simpleLowerCaseMapping:0xA424 + ,simpleTitleCaseMapping:0xA424 + }, + { code:0xA425 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA425 + ,simpleLowerCaseMapping:0xA425 + ,simpleTitleCaseMapping:0xA425 + }, + { code:0xA426 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA426 + ,simpleLowerCaseMapping:0xA426 + ,simpleTitleCaseMapping:0xA426 + }, + { code:0xA427 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA427 + ,simpleLowerCaseMapping:0xA427 + ,simpleTitleCaseMapping:0xA427 + }, + { code:0xA428 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA428 + ,simpleLowerCaseMapping:0xA428 + ,simpleTitleCaseMapping:0xA428 + }, + { code:0xA429 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA429 + ,simpleLowerCaseMapping:0xA429 + ,simpleTitleCaseMapping:0xA429 + }, + { code:0xA42A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA42A + ,simpleLowerCaseMapping:0xA42A + ,simpleTitleCaseMapping:0xA42A + }, + { code:0xA42B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA42B + ,simpleLowerCaseMapping:0xA42B + ,simpleTitleCaseMapping:0xA42B + }, + { code:0xA42C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA42C + ,simpleLowerCaseMapping:0xA42C + ,simpleTitleCaseMapping:0xA42C + }, + { code:0xA42D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA42D + ,simpleLowerCaseMapping:0xA42D + ,simpleTitleCaseMapping:0xA42D + }, + { code:0xA42E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA42E + ,simpleLowerCaseMapping:0xA42E + ,simpleTitleCaseMapping:0xA42E + }, + { code:0xA42F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA42F + ,simpleLowerCaseMapping:0xA42F + ,simpleTitleCaseMapping:0xA42F + }, + { code:0xA430 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA430 + ,simpleLowerCaseMapping:0xA430 + ,simpleTitleCaseMapping:0xA430 + }, + { code:0xA431 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA431 + ,simpleLowerCaseMapping:0xA431 + ,simpleTitleCaseMapping:0xA431 + }, + { code:0xA432 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA432 + ,simpleLowerCaseMapping:0xA432 + ,simpleTitleCaseMapping:0xA432 + }, + { code:0xA433 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA433 + ,simpleLowerCaseMapping:0xA433 + ,simpleTitleCaseMapping:0xA433 + }, + { code:0xA434 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA434 + ,simpleLowerCaseMapping:0xA434 + ,simpleTitleCaseMapping:0xA434 + }, + { code:0xA435 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA435 + ,simpleLowerCaseMapping:0xA435 + ,simpleTitleCaseMapping:0xA435 + }, + { code:0xA436 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA436 + ,simpleLowerCaseMapping:0xA436 + ,simpleTitleCaseMapping:0xA436 + }, + { code:0xA437 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA437 + ,simpleLowerCaseMapping:0xA437 + ,simpleTitleCaseMapping:0xA437 + }, + { code:0xA438 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA438 + ,simpleLowerCaseMapping:0xA438 + ,simpleTitleCaseMapping:0xA438 + }, + { code:0xA439 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA439 + ,simpleLowerCaseMapping:0xA439 + ,simpleTitleCaseMapping:0xA439 + }, + { code:0xA43A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA43A + ,simpleLowerCaseMapping:0xA43A + ,simpleTitleCaseMapping:0xA43A + }, + { code:0xA43B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA43B + ,simpleLowerCaseMapping:0xA43B + ,simpleTitleCaseMapping:0xA43B + }, + { code:0xA43C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA43C + ,simpleLowerCaseMapping:0xA43C + ,simpleTitleCaseMapping:0xA43C + }, + { code:0xA43D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA43D + ,simpleLowerCaseMapping:0xA43D + ,simpleTitleCaseMapping:0xA43D + }, + { code:0xA43E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA43E + ,simpleLowerCaseMapping:0xA43E + ,simpleTitleCaseMapping:0xA43E + }, + { code:0xA43F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA43F + ,simpleLowerCaseMapping:0xA43F + ,simpleTitleCaseMapping:0xA43F + }, + { code:0xA440 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA440 + ,simpleLowerCaseMapping:0xA440 + ,simpleTitleCaseMapping:0xA440 + }, + { code:0xA441 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA441 + ,simpleLowerCaseMapping:0xA441 + ,simpleTitleCaseMapping:0xA441 + }, + { code:0xA442 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA442 + ,simpleLowerCaseMapping:0xA442 + ,simpleTitleCaseMapping:0xA442 + }, + { code:0xA443 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA443 + ,simpleLowerCaseMapping:0xA443 + ,simpleTitleCaseMapping:0xA443 + }, + { code:0xA444 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA444 + ,simpleLowerCaseMapping:0xA444 + ,simpleTitleCaseMapping:0xA444 + }, + { code:0xA445 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA445 + ,simpleLowerCaseMapping:0xA445 + ,simpleTitleCaseMapping:0xA445 + }, + { code:0xA446 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA446 + ,simpleLowerCaseMapping:0xA446 + ,simpleTitleCaseMapping:0xA446 + }, + { code:0xA447 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA447 + ,simpleLowerCaseMapping:0xA447 + ,simpleTitleCaseMapping:0xA447 + }, + { code:0xA448 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA448 + ,simpleLowerCaseMapping:0xA448 + ,simpleTitleCaseMapping:0xA448 + }, + { code:0xA449 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA449 + ,simpleLowerCaseMapping:0xA449 + ,simpleTitleCaseMapping:0xA449 + }, + { code:0xA44A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA44A + ,simpleLowerCaseMapping:0xA44A + ,simpleTitleCaseMapping:0xA44A + }, + { code:0xA44B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA44B + ,simpleLowerCaseMapping:0xA44B + ,simpleTitleCaseMapping:0xA44B + }, + { code:0xA44C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA44C + ,simpleLowerCaseMapping:0xA44C + ,simpleTitleCaseMapping:0xA44C + }, + { code:0xA44D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA44D + ,simpleLowerCaseMapping:0xA44D + ,simpleTitleCaseMapping:0xA44D + }, + { code:0xA44E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA44E + ,simpleLowerCaseMapping:0xA44E + ,simpleTitleCaseMapping:0xA44E + }, + { code:0xA44F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA44F + ,simpleLowerCaseMapping:0xA44F + ,simpleTitleCaseMapping:0xA44F + }, + { code:0xA450 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA450 + ,simpleLowerCaseMapping:0xA450 + ,simpleTitleCaseMapping:0xA450 + }, + { code:0xA451 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA451 + ,simpleLowerCaseMapping:0xA451 + ,simpleTitleCaseMapping:0xA451 + }, + { code:0xA452 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA452 + ,simpleLowerCaseMapping:0xA452 + ,simpleTitleCaseMapping:0xA452 + }, + { code:0xA453 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA453 + ,simpleLowerCaseMapping:0xA453 + ,simpleTitleCaseMapping:0xA453 + }, + { code:0xA454 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA454 + ,simpleLowerCaseMapping:0xA454 + ,simpleTitleCaseMapping:0xA454 + }, + { code:0xA455 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA455 + ,simpleLowerCaseMapping:0xA455 + ,simpleTitleCaseMapping:0xA455 + }, + { code:0xA456 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA456 + ,simpleLowerCaseMapping:0xA456 + ,simpleTitleCaseMapping:0xA456 + }, + { code:0xA457 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA457 + ,simpleLowerCaseMapping:0xA457 + ,simpleTitleCaseMapping:0xA457 + }, + { code:0xA458 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA458 + ,simpleLowerCaseMapping:0xA458 + ,simpleTitleCaseMapping:0xA458 + }, + { code:0xA459 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA459 + ,simpleLowerCaseMapping:0xA459 + ,simpleTitleCaseMapping:0xA459 + }, + { code:0xA45A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA45A + ,simpleLowerCaseMapping:0xA45A + ,simpleTitleCaseMapping:0xA45A + }, + { code:0xA45B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA45B + ,simpleLowerCaseMapping:0xA45B + ,simpleTitleCaseMapping:0xA45B + }, + { code:0xA45C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA45C + ,simpleLowerCaseMapping:0xA45C + ,simpleTitleCaseMapping:0xA45C + }, + { code:0xA45D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA45D + ,simpleLowerCaseMapping:0xA45D + ,simpleTitleCaseMapping:0xA45D + }, + { code:0xA45E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA45E + ,simpleLowerCaseMapping:0xA45E + ,simpleTitleCaseMapping:0xA45E + }, + { code:0xA45F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA45F + ,simpleLowerCaseMapping:0xA45F + ,simpleTitleCaseMapping:0xA45F + }, + { code:0xA460 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA460 + ,simpleLowerCaseMapping:0xA460 + ,simpleTitleCaseMapping:0xA460 + }, + { code:0xA461 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA461 + ,simpleLowerCaseMapping:0xA461 + ,simpleTitleCaseMapping:0xA461 + }, + { code:0xA462 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA462 + ,simpleLowerCaseMapping:0xA462 + ,simpleTitleCaseMapping:0xA462 + }, + { code:0xA463 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA463 + ,simpleLowerCaseMapping:0xA463 + ,simpleTitleCaseMapping:0xA463 + }, + { code:0xA464 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA464 + ,simpleLowerCaseMapping:0xA464 + ,simpleTitleCaseMapping:0xA464 + }, + { code:0xA465 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA465 + ,simpleLowerCaseMapping:0xA465 + ,simpleTitleCaseMapping:0xA465 + }, + { code:0xA466 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA466 + ,simpleLowerCaseMapping:0xA466 + ,simpleTitleCaseMapping:0xA466 + }, + { code:0xA467 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA467 + ,simpleLowerCaseMapping:0xA467 + ,simpleTitleCaseMapping:0xA467 + }, + { code:0xA468 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA468 + ,simpleLowerCaseMapping:0xA468 + ,simpleTitleCaseMapping:0xA468 + }, + { code:0xA469 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA469 + ,simpleLowerCaseMapping:0xA469 + ,simpleTitleCaseMapping:0xA469 + }, + { code:0xA46A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA46A + ,simpleLowerCaseMapping:0xA46A + ,simpleTitleCaseMapping:0xA46A + }, + { code:0xA46B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA46B + ,simpleLowerCaseMapping:0xA46B + ,simpleTitleCaseMapping:0xA46B + }, + { code:0xA46C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA46C + ,simpleLowerCaseMapping:0xA46C + ,simpleTitleCaseMapping:0xA46C + }, + { code:0xA46D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA46D + ,simpleLowerCaseMapping:0xA46D + ,simpleTitleCaseMapping:0xA46D + }, + { code:0xA46E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA46E + ,simpleLowerCaseMapping:0xA46E + ,simpleTitleCaseMapping:0xA46E + }, + { code:0xA46F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA46F + ,simpleLowerCaseMapping:0xA46F + ,simpleTitleCaseMapping:0xA46F + }, + { code:0xA470 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA470 + ,simpleLowerCaseMapping:0xA470 + ,simpleTitleCaseMapping:0xA470 + }, + { code:0xA471 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA471 + ,simpleLowerCaseMapping:0xA471 + ,simpleTitleCaseMapping:0xA471 + }, + { code:0xA472 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA472 + ,simpleLowerCaseMapping:0xA472 + ,simpleTitleCaseMapping:0xA472 + }, + { code:0xA473 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA473 + ,simpleLowerCaseMapping:0xA473 + ,simpleTitleCaseMapping:0xA473 + }, + { code:0xA474 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA474 + ,simpleLowerCaseMapping:0xA474 + ,simpleTitleCaseMapping:0xA474 + }, + { code:0xA475 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA475 + ,simpleLowerCaseMapping:0xA475 + ,simpleTitleCaseMapping:0xA475 + }, + { code:0xA476 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA476 + ,simpleLowerCaseMapping:0xA476 + ,simpleTitleCaseMapping:0xA476 + }, + { code:0xA477 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA477 + ,simpleLowerCaseMapping:0xA477 + ,simpleTitleCaseMapping:0xA477 + }, + { code:0xA478 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA478 + ,simpleLowerCaseMapping:0xA478 + ,simpleTitleCaseMapping:0xA478 + }, + { code:0xA479 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA479 + ,simpleLowerCaseMapping:0xA479 + ,simpleTitleCaseMapping:0xA479 + }, + { code:0xA47A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA47A + ,simpleLowerCaseMapping:0xA47A + ,simpleTitleCaseMapping:0xA47A + }, + { code:0xA47B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA47B + ,simpleLowerCaseMapping:0xA47B + ,simpleTitleCaseMapping:0xA47B + }, + { code:0xA47C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA47C + ,simpleLowerCaseMapping:0xA47C + ,simpleTitleCaseMapping:0xA47C + }, + { code:0xA47D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA47D + ,simpleLowerCaseMapping:0xA47D + ,simpleTitleCaseMapping:0xA47D + }, + { code:0xA47E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA47E + ,simpleLowerCaseMapping:0xA47E + ,simpleTitleCaseMapping:0xA47E + }, + { code:0xA47F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA47F + ,simpleLowerCaseMapping:0xA47F + ,simpleTitleCaseMapping:0xA47F + }, + { code:0xA480 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA480 + ,simpleLowerCaseMapping:0xA480 + ,simpleTitleCaseMapping:0xA480 + }, + { code:0xA481 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA481 + ,simpleLowerCaseMapping:0xA481 + ,simpleTitleCaseMapping:0xA481 + }, + { code:0xA482 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA482 + ,simpleLowerCaseMapping:0xA482 + ,simpleTitleCaseMapping:0xA482 + }, + { code:0xA483 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA483 + ,simpleLowerCaseMapping:0xA483 + ,simpleTitleCaseMapping:0xA483 + }, + { code:0xA484 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA484 + ,simpleLowerCaseMapping:0xA484 + ,simpleTitleCaseMapping:0xA484 + }, + { code:0xA485 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA485 + ,simpleLowerCaseMapping:0xA485 + ,simpleTitleCaseMapping:0xA485 + }, + { code:0xA486 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA486 + ,simpleLowerCaseMapping:0xA486 + ,simpleTitleCaseMapping:0xA486 + }, + { code:0xA487 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA487 + ,simpleLowerCaseMapping:0xA487 + ,simpleTitleCaseMapping:0xA487 + }, + { code:0xA488 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA488 + ,simpleLowerCaseMapping:0xA488 + ,simpleTitleCaseMapping:0xA488 + }, + { code:0xA489 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA489 + ,simpleLowerCaseMapping:0xA489 + ,simpleTitleCaseMapping:0xA489 + }, + { code:0xA48A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA48A + ,simpleLowerCaseMapping:0xA48A + ,simpleTitleCaseMapping:0xA48A + }, + { code:0xA48B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA48B + ,simpleLowerCaseMapping:0xA48B + ,simpleTitleCaseMapping:0xA48B + }, + { code:0xA48C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA48C + ,simpleLowerCaseMapping:0xA48C + ,simpleTitleCaseMapping:0xA48C + }, + { code:0xA490 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA490 + ,simpleLowerCaseMapping:0xA490 + ,simpleTitleCaseMapping:0xA490 + }, + { code:0xA491 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA491 + ,simpleLowerCaseMapping:0xA491 + ,simpleTitleCaseMapping:0xA491 + }, + { code:0xA492 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA492 + ,simpleLowerCaseMapping:0xA492 + ,simpleTitleCaseMapping:0xA492 + }, + { code:0xA493 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA493 + ,simpleLowerCaseMapping:0xA493 + ,simpleTitleCaseMapping:0xA493 + }, + { code:0xA494 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA494 + ,simpleLowerCaseMapping:0xA494 + ,simpleTitleCaseMapping:0xA494 + }, + { code:0xA495 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA495 + ,simpleLowerCaseMapping:0xA495 + ,simpleTitleCaseMapping:0xA495 + }, + { code:0xA496 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA496 + ,simpleLowerCaseMapping:0xA496 + ,simpleTitleCaseMapping:0xA496 + }, + { code:0xA497 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA497 + ,simpleLowerCaseMapping:0xA497 + ,simpleTitleCaseMapping:0xA497 + }, + { code:0xA498 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA498 + ,simpleLowerCaseMapping:0xA498 + ,simpleTitleCaseMapping:0xA498 + }, + { code:0xA499 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA499 + ,simpleLowerCaseMapping:0xA499 + ,simpleTitleCaseMapping:0xA499 + }, + { code:0xA49A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA49A + ,simpleLowerCaseMapping:0xA49A + ,simpleTitleCaseMapping:0xA49A + }, + { code:0xA49B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA49B + ,simpleLowerCaseMapping:0xA49B + ,simpleTitleCaseMapping:0xA49B + }, + { code:0xA49C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA49C + ,simpleLowerCaseMapping:0xA49C + ,simpleTitleCaseMapping:0xA49C + }, + { code:0xA49D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA49D + ,simpleLowerCaseMapping:0xA49D + ,simpleTitleCaseMapping:0xA49D + }, + { code:0xA49E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA49E + ,simpleLowerCaseMapping:0xA49E + ,simpleTitleCaseMapping:0xA49E + }, + { code:0xA49F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA49F + ,simpleLowerCaseMapping:0xA49F + ,simpleTitleCaseMapping:0xA49F + }, + { code:0xA4A0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4A0 + ,simpleLowerCaseMapping:0xA4A0 + ,simpleTitleCaseMapping:0xA4A0 + }, + { code:0xA4A1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4A1 + ,simpleLowerCaseMapping:0xA4A1 + ,simpleTitleCaseMapping:0xA4A1 + }, + { code:0xA4A2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4A2 + ,simpleLowerCaseMapping:0xA4A2 + ,simpleTitleCaseMapping:0xA4A2 + }, + { code:0xA4A3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4A3 + ,simpleLowerCaseMapping:0xA4A3 + ,simpleTitleCaseMapping:0xA4A3 + }, + { code:0xA4A4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4A4 + ,simpleLowerCaseMapping:0xA4A4 + ,simpleTitleCaseMapping:0xA4A4 + }, + { code:0xA4A5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4A5 + ,simpleLowerCaseMapping:0xA4A5 + ,simpleTitleCaseMapping:0xA4A5 + }, + { code:0xA4A6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4A6 + ,simpleLowerCaseMapping:0xA4A6 + ,simpleTitleCaseMapping:0xA4A6 + }, + { code:0xA4A7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4A7 + ,simpleLowerCaseMapping:0xA4A7 + ,simpleTitleCaseMapping:0xA4A7 + }, + { code:0xA4A8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4A8 + ,simpleLowerCaseMapping:0xA4A8 + ,simpleTitleCaseMapping:0xA4A8 + }, + { code:0xA4A9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4A9 + ,simpleLowerCaseMapping:0xA4A9 + ,simpleTitleCaseMapping:0xA4A9 + }, + { code:0xA4AA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4AA + ,simpleLowerCaseMapping:0xA4AA + ,simpleTitleCaseMapping:0xA4AA + }, + { code:0xA4AB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4AB + ,simpleLowerCaseMapping:0xA4AB + ,simpleTitleCaseMapping:0xA4AB + }, + { code:0xA4AC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4AC + ,simpleLowerCaseMapping:0xA4AC + ,simpleTitleCaseMapping:0xA4AC + }, + { code:0xA4AD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4AD + ,simpleLowerCaseMapping:0xA4AD + ,simpleTitleCaseMapping:0xA4AD + }, + { code:0xA4AE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4AE + ,simpleLowerCaseMapping:0xA4AE + ,simpleTitleCaseMapping:0xA4AE + }, + { code:0xA4AF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4AF + ,simpleLowerCaseMapping:0xA4AF + ,simpleTitleCaseMapping:0xA4AF + }, + { code:0xA4B0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4B0 + ,simpleLowerCaseMapping:0xA4B0 + ,simpleTitleCaseMapping:0xA4B0 + }, + { code:0xA4B1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4B1 + ,simpleLowerCaseMapping:0xA4B1 + ,simpleTitleCaseMapping:0xA4B1 + }, + { code:0xA4B2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4B2 + ,simpleLowerCaseMapping:0xA4B2 + ,simpleTitleCaseMapping:0xA4B2 + }, + { code:0xA4B3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4B3 + ,simpleLowerCaseMapping:0xA4B3 + ,simpleTitleCaseMapping:0xA4B3 + }, + { code:0xA4B4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4B4 + ,simpleLowerCaseMapping:0xA4B4 + ,simpleTitleCaseMapping:0xA4B4 + }, + { code:0xA4B5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4B5 + ,simpleLowerCaseMapping:0xA4B5 + ,simpleTitleCaseMapping:0xA4B5 + }, + { code:0xA4B6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4B6 + ,simpleLowerCaseMapping:0xA4B6 + ,simpleTitleCaseMapping:0xA4B6 + }, + { code:0xA4B7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4B7 + ,simpleLowerCaseMapping:0xA4B7 + ,simpleTitleCaseMapping:0xA4B7 + }, + { code:0xA4B8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4B8 + ,simpleLowerCaseMapping:0xA4B8 + ,simpleTitleCaseMapping:0xA4B8 + }, + { code:0xA4B9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4B9 + ,simpleLowerCaseMapping:0xA4B9 + ,simpleTitleCaseMapping:0xA4B9 + }, + { code:0xA4BA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4BA + ,simpleLowerCaseMapping:0xA4BA + ,simpleTitleCaseMapping:0xA4BA + }, + { code:0xA4BB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4BB + ,simpleLowerCaseMapping:0xA4BB + ,simpleTitleCaseMapping:0xA4BB + }, + { code:0xA4BC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4BC + ,simpleLowerCaseMapping:0xA4BC + ,simpleTitleCaseMapping:0xA4BC + }, + { code:0xA4BD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4BD + ,simpleLowerCaseMapping:0xA4BD + ,simpleTitleCaseMapping:0xA4BD + }, + { code:0xA4BE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4BE + ,simpleLowerCaseMapping:0xA4BE + ,simpleTitleCaseMapping:0xA4BE + }, + { code:0xA4BF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4BF + ,simpleLowerCaseMapping:0xA4BF + ,simpleTitleCaseMapping:0xA4BF + }, + { code:0xA4C0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4C0 + ,simpleLowerCaseMapping:0xA4C0 + ,simpleTitleCaseMapping:0xA4C0 + }, + { code:0xA4C1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4C1 + ,simpleLowerCaseMapping:0xA4C1 + ,simpleTitleCaseMapping:0xA4C1 + }, + { code:0xA4C2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4C2 + ,simpleLowerCaseMapping:0xA4C2 + ,simpleTitleCaseMapping:0xA4C2 + }, + { code:0xA4C3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4C3 + ,simpleLowerCaseMapping:0xA4C3 + ,simpleTitleCaseMapping:0xA4C3 + }, + { code:0xA4C4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4C4 + ,simpleLowerCaseMapping:0xA4C4 + ,simpleTitleCaseMapping:0xA4C4 + }, + { code:0xA4C5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4C5 + ,simpleLowerCaseMapping:0xA4C5 + ,simpleTitleCaseMapping:0xA4C5 + }, + { code:0xA4C6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA4C6 + ,simpleLowerCaseMapping:0xA4C6 + ,simpleTitleCaseMapping:0xA4C6 + }, + { code:0xA700 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0xA700 + ,simpleLowerCaseMapping:0xA700 + ,simpleTitleCaseMapping:0xA700 + }, + { code:0xA701 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0xA701 + ,simpleLowerCaseMapping:0xA701 + ,simpleTitleCaseMapping:0xA701 + }, + { code:0xA702 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0xA702 + ,simpleLowerCaseMapping:0xA702 + ,simpleTitleCaseMapping:0xA702 + }, + { code:0xA703 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0xA703 + ,simpleLowerCaseMapping:0xA703 + ,simpleTitleCaseMapping:0xA703 + }, + { code:0xA704 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0xA704 + ,simpleLowerCaseMapping:0xA704 + ,simpleTitleCaseMapping:0xA704 + }, + { code:0xA705 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0xA705 + ,simpleLowerCaseMapping:0xA705 + ,simpleTitleCaseMapping:0xA705 + }, + { code:0xA706 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0xA706 + ,simpleLowerCaseMapping:0xA706 + ,simpleTitleCaseMapping:0xA706 + }, + { code:0xA707 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0xA707 + ,simpleLowerCaseMapping:0xA707 + ,simpleTitleCaseMapping:0xA707 + }, + { code:0xA708 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0xA708 + ,simpleLowerCaseMapping:0xA708 + ,simpleTitleCaseMapping:0xA708 + }, + { code:0xA709 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0xA709 + ,simpleLowerCaseMapping:0xA709 + ,simpleTitleCaseMapping:0xA709 + }, + { code:0xA70A + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0xA70A + ,simpleLowerCaseMapping:0xA70A + ,simpleTitleCaseMapping:0xA70A + }, + { code:0xA70B + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0xA70B + ,simpleLowerCaseMapping:0xA70B + ,simpleTitleCaseMapping:0xA70B + }, + { code:0xA70C + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0xA70C + ,simpleLowerCaseMapping:0xA70C + ,simpleTitleCaseMapping:0xA70C + }, + { code:0xA70D + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0xA70D + ,simpleLowerCaseMapping:0xA70D + ,simpleTitleCaseMapping:0xA70D + }, + { code:0xA70E + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0xA70E + ,simpleLowerCaseMapping:0xA70E + ,simpleTitleCaseMapping:0xA70E + }, + { code:0xA70F + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0xA70F + ,simpleLowerCaseMapping:0xA70F + ,simpleTitleCaseMapping:0xA70F + }, + { code:0xA710 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0xA710 + ,simpleLowerCaseMapping:0xA710 + ,simpleTitleCaseMapping:0xA710 + }, + { code:0xA711 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0xA711 + ,simpleLowerCaseMapping:0xA711 + ,simpleTitleCaseMapping:0xA711 + }, + { code:0xA712 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0xA712 + ,simpleLowerCaseMapping:0xA712 + ,simpleTitleCaseMapping:0xA712 + }, + { code:0xA713 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0xA713 + ,simpleLowerCaseMapping:0xA713 + ,simpleTitleCaseMapping:0xA713 + }, + { code:0xA714 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0xA714 + ,simpleLowerCaseMapping:0xA714 + ,simpleTitleCaseMapping:0xA714 + }, + { code:0xA715 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0xA715 + ,simpleLowerCaseMapping:0xA715 + ,simpleTitleCaseMapping:0xA715 + }, + { code:0xA716 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0xA716 + ,simpleLowerCaseMapping:0xA716 + ,simpleTitleCaseMapping:0xA716 + }, + { code:0xA717 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0xA717 + ,simpleLowerCaseMapping:0xA717 + ,simpleTitleCaseMapping:0xA717 + }, + { code:0xA718 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0xA718 + ,simpleLowerCaseMapping:0xA718 + ,simpleTitleCaseMapping:0xA718 + }, + { code:0xA719 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0xA719 + ,simpleLowerCaseMapping:0xA719 + ,simpleTitleCaseMapping:0xA719 + }, + { code:0xA71A + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0xA71A + ,simpleLowerCaseMapping:0xA71A + ,simpleTitleCaseMapping:0xA71A + }, + { code:0xA720 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0xA720 + ,simpleLowerCaseMapping:0xA720 + ,simpleTitleCaseMapping:0xA720 + }, + { code:0xA721 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0xA721 + ,simpleLowerCaseMapping:0xA721 + ,simpleTitleCaseMapping:0xA721 + }, + { code:0xA800 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA800 + ,simpleLowerCaseMapping:0xA800 + ,simpleTitleCaseMapping:0xA800 + }, + { code:0xA801 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA801 + ,simpleLowerCaseMapping:0xA801 + ,simpleTitleCaseMapping:0xA801 + }, + { code:0xA802 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0xA802 + ,simpleLowerCaseMapping:0xA802 + ,simpleTitleCaseMapping:0xA802 + }, + { code:0xA803 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA803 + ,simpleLowerCaseMapping:0xA803 + ,simpleTitleCaseMapping:0xA803 + }, + { code:0xA804 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA804 + ,simpleLowerCaseMapping:0xA804 + ,simpleTitleCaseMapping:0xA804 + }, + { code:0xA805 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA805 + ,simpleLowerCaseMapping:0xA805 + ,simpleTitleCaseMapping:0xA805 + }, + { code:0xA806 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xA806 + ,simpleLowerCaseMapping:0xA806 + ,simpleTitleCaseMapping:0xA806 + }, + { code:0xA807 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA807 + ,simpleLowerCaseMapping:0xA807 + ,simpleTitleCaseMapping:0xA807 + }, + { code:0xA808 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA808 + ,simpleLowerCaseMapping:0xA808 + ,simpleTitleCaseMapping:0xA808 + }, + { code:0xA809 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA809 + ,simpleLowerCaseMapping:0xA809 + ,simpleTitleCaseMapping:0xA809 + }, + { code:0xA80A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA80A + ,simpleLowerCaseMapping:0xA80A + ,simpleTitleCaseMapping:0xA80A + }, + { code:0xA80B + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xA80B + ,simpleLowerCaseMapping:0xA80B + ,simpleTitleCaseMapping:0xA80B + }, + { code:0xA80C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA80C + ,simpleLowerCaseMapping:0xA80C + ,simpleTitleCaseMapping:0xA80C + }, + { code:0xA80D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA80D + ,simpleLowerCaseMapping:0xA80D + ,simpleTitleCaseMapping:0xA80D + }, + { code:0xA80E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA80E + ,simpleLowerCaseMapping:0xA80E + ,simpleTitleCaseMapping:0xA80E + }, + { code:0xA80F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA80F + ,simpleLowerCaseMapping:0xA80F + ,simpleTitleCaseMapping:0xA80F + }, + { code:0xA810 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA810 + ,simpleLowerCaseMapping:0xA810 + ,simpleTitleCaseMapping:0xA810 + }, + { code:0xA811 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA811 + ,simpleLowerCaseMapping:0xA811 + ,simpleTitleCaseMapping:0xA811 + }, + { code:0xA812 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA812 + ,simpleLowerCaseMapping:0xA812 + ,simpleTitleCaseMapping:0xA812 + }, + { code:0xA813 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA813 + ,simpleLowerCaseMapping:0xA813 + ,simpleTitleCaseMapping:0xA813 + }, + { code:0xA814 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA814 + ,simpleLowerCaseMapping:0xA814 + ,simpleTitleCaseMapping:0xA814 + }, + { code:0xA815 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA815 + ,simpleLowerCaseMapping:0xA815 + ,simpleTitleCaseMapping:0xA815 + }, + { code:0xA816 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA816 + ,simpleLowerCaseMapping:0xA816 + ,simpleTitleCaseMapping:0xA816 + }, + { code:0xA817 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA817 + ,simpleLowerCaseMapping:0xA817 + ,simpleTitleCaseMapping:0xA817 + }, + { code:0xA818 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA818 + ,simpleLowerCaseMapping:0xA818 + ,simpleTitleCaseMapping:0xA818 + }, + { code:0xA819 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA819 + ,simpleLowerCaseMapping:0xA819 + ,simpleTitleCaseMapping:0xA819 + }, + { code:0xA81A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA81A + ,simpleLowerCaseMapping:0xA81A + ,simpleTitleCaseMapping:0xA81A + }, + { code:0xA81B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA81B + ,simpleLowerCaseMapping:0xA81B + ,simpleTitleCaseMapping:0xA81B + }, + { code:0xA81C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA81C + ,simpleLowerCaseMapping:0xA81C + ,simpleTitleCaseMapping:0xA81C + }, + { code:0xA81D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA81D + ,simpleLowerCaseMapping:0xA81D + ,simpleTitleCaseMapping:0xA81D + }, + { code:0xA81E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA81E + ,simpleLowerCaseMapping:0xA81E + ,simpleTitleCaseMapping:0xA81E + }, + { code:0xA81F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA81F + ,simpleLowerCaseMapping:0xA81F + ,simpleTitleCaseMapping:0xA81F + }, + { code:0xA820 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA820 + ,simpleLowerCaseMapping:0xA820 + ,simpleTitleCaseMapping:0xA820 + }, + { code:0xA821 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA821 + ,simpleLowerCaseMapping:0xA821 + ,simpleTitleCaseMapping:0xA821 + }, + { code:0xA822 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA822 + ,simpleLowerCaseMapping:0xA822 + ,simpleTitleCaseMapping:0xA822 + }, + { code:0xA823 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0xA823 + ,simpleLowerCaseMapping:0xA823 + ,simpleTitleCaseMapping:0xA823 + }, + { code:0xA824 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0xA824 + ,simpleLowerCaseMapping:0xA824 + ,simpleTitleCaseMapping:0xA824 + }, + { code:0xA825 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xA825 + ,simpleLowerCaseMapping:0xA825 + ,simpleTitleCaseMapping:0xA825 + }, + { code:0xA826 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xA826 + ,simpleLowerCaseMapping:0xA826 + ,simpleTitleCaseMapping:0xA826 + }, + { code:0xA827 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0xA827 + ,simpleLowerCaseMapping:0xA827 + ,simpleTitleCaseMapping:0xA827 + }, + { code:0xA828 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA828 + ,simpleLowerCaseMapping:0xA828 + ,simpleTitleCaseMapping:0xA828 + }, + { code:0xA829 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA829 + ,simpleLowerCaseMapping:0xA829 + ,simpleTitleCaseMapping:0xA829 + }, + { code:0xA82A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA82A + ,simpleLowerCaseMapping:0xA82A + ,simpleTitleCaseMapping:0xA82A + }, + { code:0xA82B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xA82B + ,simpleLowerCaseMapping:0xA82B + ,simpleTitleCaseMapping:0xA82B + }, + { code:0xA840 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA840 + ,simpleLowerCaseMapping:0xA840 + ,simpleTitleCaseMapping:0xA840 + }, + { code:0xA841 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA841 + ,simpleLowerCaseMapping:0xA841 + ,simpleTitleCaseMapping:0xA841 + }, + { code:0xA842 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA842 + ,simpleLowerCaseMapping:0xA842 + ,simpleTitleCaseMapping:0xA842 + }, + { code:0xA843 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA843 + ,simpleLowerCaseMapping:0xA843 + ,simpleTitleCaseMapping:0xA843 + }, + { code:0xA844 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA844 + ,simpleLowerCaseMapping:0xA844 + ,simpleTitleCaseMapping:0xA844 + }, + { code:0xA845 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA845 + ,simpleLowerCaseMapping:0xA845 + ,simpleTitleCaseMapping:0xA845 + }, + { code:0xA846 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA846 + ,simpleLowerCaseMapping:0xA846 + ,simpleTitleCaseMapping:0xA846 + }, + { code:0xA847 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA847 + ,simpleLowerCaseMapping:0xA847 + ,simpleTitleCaseMapping:0xA847 + }, + { code:0xA848 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA848 + ,simpleLowerCaseMapping:0xA848 + ,simpleTitleCaseMapping:0xA848 + }, + { code:0xA849 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA849 + ,simpleLowerCaseMapping:0xA849 + ,simpleTitleCaseMapping:0xA849 + }, + { code:0xA84A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA84A + ,simpleLowerCaseMapping:0xA84A + ,simpleTitleCaseMapping:0xA84A + }, + { code:0xA84B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA84B + ,simpleLowerCaseMapping:0xA84B + ,simpleTitleCaseMapping:0xA84B + }, + { code:0xA84C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA84C + ,simpleLowerCaseMapping:0xA84C + ,simpleTitleCaseMapping:0xA84C + }, + { code:0xA84D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA84D + ,simpleLowerCaseMapping:0xA84D + ,simpleTitleCaseMapping:0xA84D + }, + { code:0xA84E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA84E + ,simpleLowerCaseMapping:0xA84E + ,simpleTitleCaseMapping:0xA84E + }, + { code:0xA84F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA84F + ,simpleLowerCaseMapping:0xA84F + ,simpleTitleCaseMapping:0xA84F + }, + { code:0xA850 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA850 + ,simpleLowerCaseMapping:0xA850 + ,simpleTitleCaseMapping:0xA850 + }, + { code:0xA851 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA851 + ,simpleLowerCaseMapping:0xA851 + ,simpleTitleCaseMapping:0xA851 + }, + { code:0xA852 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA852 + ,simpleLowerCaseMapping:0xA852 + ,simpleTitleCaseMapping:0xA852 + }, + { code:0xA853 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA853 + ,simpleLowerCaseMapping:0xA853 + ,simpleTitleCaseMapping:0xA853 + }, + { code:0xA854 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA854 + ,simpleLowerCaseMapping:0xA854 + ,simpleTitleCaseMapping:0xA854 + }, + { code:0xA855 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA855 + ,simpleLowerCaseMapping:0xA855 + ,simpleTitleCaseMapping:0xA855 + }, + { code:0xA856 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA856 + ,simpleLowerCaseMapping:0xA856 + ,simpleTitleCaseMapping:0xA856 + }, + { code:0xA857 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA857 + ,simpleLowerCaseMapping:0xA857 + ,simpleTitleCaseMapping:0xA857 + }, + { code:0xA858 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA858 + ,simpleLowerCaseMapping:0xA858 + ,simpleTitleCaseMapping:0xA858 + }, + { code:0xA859 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA859 + ,simpleLowerCaseMapping:0xA859 + ,simpleTitleCaseMapping:0xA859 + }, + { code:0xA85A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA85A + ,simpleLowerCaseMapping:0xA85A + ,simpleTitleCaseMapping:0xA85A + }, + { code:0xA85B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA85B + ,simpleLowerCaseMapping:0xA85B + ,simpleTitleCaseMapping:0xA85B + }, + { code:0xA85C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA85C + ,simpleLowerCaseMapping:0xA85C + ,simpleTitleCaseMapping:0xA85C + }, + { code:0xA85D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA85D + ,simpleLowerCaseMapping:0xA85D + ,simpleTitleCaseMapping:0xA85D + }, + { code:0xA85E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA85E + ,simpleLowerCaseMapping:0xA85E + ,simpleTitleCaseMapping:0xA85E + }, + { code:0xA85F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA85F + ,simpleLowerCaseMapping:0xA85F + ,simpleTitleCaseMapping:0xA85F + }, + { code:0xA860 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA860 + ,simpleLowerCaseMapping:0xA860 + ,simpleTitleCaseMapping:0xA860 + }, + { code:0xA861 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA861 + ,simpleLowerCaseMapping:0xA861 + ,simpleTitleCaseMapping:0xA861 + }, + { code:0xA862 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA862 + ,simpleLowerCaseMapping:0xA862 + ,simpleTitleCaseMapping:0xA862 + }, + { code:0xA863 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA863 + ,simpleLowerCaseMapping:0xA863 + ,simpleTitleCaseMapping:0xA863 + }, + { code:0xA864 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA864 + ,simpleLowerCaseMapping:0xA864 + ,simpleTitleCaseMapping:0xA864 + }, + { code:0xA865 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA865 + ,simpleLowerCaseMapping:0xA865 + ,simpleTitleCaseMapping:0xA865 + }, + { code:0xA866 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA866 + ,simpleLowerCaseMapping:0xA866 + ,simpleTitleCaseMapping:0xA866 + }, + { code:0xA867 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA867 + ,simpleLowerCaseMapping:0xA867 + ,simpleTitleCaseMapping:0xA867 + }, + { code:0xA868 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA868 + ,simpleLowerCaseMapping:0xA868 + ,simpleTitleCaseMapping:0xA868 + }, + { code:0xA869 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA869 + ,simpleLowerCaseMapping:0xA869 + ,simpleTitleCaseMapping:0xA869 + }, + { code:0xA86A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA86A + ,simpleLowerCaseMapping:0xA86A + ,simpleTitleCaseMapping:0xA86A + }, + { code:0xA86B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA86B + ,simpleLowerCaseMapping:0xA86B + ,simpleTitleCaseMapping:0xA86B + }, + { code:0xA86C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA86C + ,simpleLowerCaseMapping:0xA86C + ,simpleTitleCaseMapping:0xA86C + }, + { code:0xA86D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA86D + ,simpleLowerCaseMapping:0xA86D + ,simpleTitleCaseMapping:0xA86D + }, + { code:0xA86E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA86E + ,simpleLowerCaseMapping:0xA86E + ,simpleTitleCaseMapping:0xA86E + }, + { code:0xA86F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA86F + ,simpleLowerCaseMapping:0xA86F + ,simpleTitleCaseMapping:0xA86F + }, + { code:0xA870 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA870 + ,simpleLowerCaseMapping:0xA870 + ,simpleTitleCaseMapping:0xA870 + }, + { code:0xA871 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA871 + ,simpleLowerCaseMapping:0xA871 + ,simpleTitleCaseMapping:0xA871 + }, + { code:0xA872 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA872 + ,simpleLowerCaseMapping:0xA872 + ,simpleTitleCaseMapping:0xA872 + }, + { code:0xA873 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xA873 + ,simpleLowerCaseMapping:0xA873 + ,simpleTitleCaseMapping:0xA873 + }, + { code:0xA874 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xA874 + ,simpleLowerCaseMapping:0xA874 + ,simpleTitleCaseMapping:0xA874 + }, + { code:0xA875 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xA875 + ,simpleLowerCaseMapping:0xA875 + ,simpleTitleCaseMapping:0xA875 + }, + { code:0xA876 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xA876 + ,simpleLowerCaseMapping:0xA876 + ,simpleTitleCaseMapping:0xA876 + }, + { code:0xA877 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xA877 + ,simpleLowerCaseMapping:0xA877 + ,simpleTitleCaseMapping:0xA877 + }, + { code:0xAC00 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xAC00 + ,simpleLowerCaseMapping:0xAC00 + ,simpleTitleCaseMapping:0xAC00 + }, + { code:0xD7A3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xD7A3 + ,simpleLowerCaseMapping:0xD7A3 + ,simpleTitleCaseMapping:0xD7A3 + }, + { code:0xD800 + ,generalCategory:UnicodeData.GeneralCategory.Cs + ,simpleUpperCaseMapping:0xD800 + ,simpleLowerCaseMapping:0xD800 + ,simpleTitleCaseMapping:0xD800 + }, + { code:0xDB7F + ,generalCategory:UnicodeData.GeneralCategory.Cs + ,simpleUpperCaseMapping:0xDB7F + ,simpleLowerCaseMapping:0xDB7F + ,simpleTitleCaseMapping:0xDB7F + }, + { code:0xDB80 + ,generalCategory:UnicodeData.GeneralCategory.Cs + ,simpleUpperCaseMapping:0xDB80 + ,simpleLowerCaseMapping:0xDB80 + ,simpleTitleCaseMapping:0xDB80 + }, + { code:0xDBFF + ,generalCategory:UnicodeData.GeneralCategory.Cs + ,simpleUpperCaseMapping:0xDBFF + ,simpleLowerCaseMapping:0xDBFF + ,simpleTitleCaseMapping:0xDBFF + }, + { code:0xDC00 + ,generalCategory:UnicodeData.GeneralCategory.Cs + ,simpleUpperCaseMapping:0xDC00 + ,simpleLowerCaseMapping:0xDC00 + ,simpleTitleCaseMapping:0xDC00 + }, + { code:0xDFFF + ,generalCategory:UnicodeData.GeneralCategory.Cs + ,simpleUpperCaseMapping:0xDFFF + ,simpleLowerCaseMapping:0xDFFF + ,simpleTitleCaseMapping:0xDFFF + }, + { code:0xE000 + ,generalCategory:UnicodeData.GeneralCategory.Co + ,simpleUpperCaseMapping:0xE000 + ,simpleLowerCaseMapping:0xE000 + ,simpleTitleCaseMapping:0xE000 + }, + { code:0xF8FF + ,generalCategory:UnicodeData.GeneralCategory.Co + ,simpleUpperCaseMapping:0xF8FF + ,simpleLowerCaseMapping:0xF8FF + ,simpleTitleCaseMapping:0xF8FF + }, + { code:0xF900 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF900 + ,simpleLowerCaseMapping:0xF900 + ,simpleTitleCaseMapping:0xF900 + }, + { code:0xF901 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF901 + ,simpleLowerCaseMapping:0xF901 + ,simpleTitleCaseMapping:0xF901 + }, + { code:0xF902 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF902 + ,simpleLowerCaseMapping:0xF902 + ,simpleTitleCaseMapping:0xF902 + }, + { code:0xF903 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF903 + ,simpleLowerCaseMapping:0xF903 + ,simpleTitleCaseMapping:0xF903 + }, + { code:0xF904 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF904 + ,simpleLowerCaseMapping:0xF904 + ,simpleTitleCaseMapping:0xF904 + }, + { code:0xF905 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF905 + ,simpleLowerCaseMapping:0xF905 + ,simpleTitleCaseMapping:0xF905 + }, + { code:0xF906 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF906 + ,simpleLowerCaseMapping:0xF906 + ,simpleTitleCaseMapping:0xF906 + }, + { code:0xF907 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF907 + ,simpleLowerCaseMapping:0xF907 + ,simpleTitleCaseMapping:0xF907 + }, + { code:0xF908 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF908 + ,simpleLowerCaseMapping:0xF908 + ,simpleTitleCaseMapping:0xF908 + }, + { code:0xF909 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF909 + ,simpleLowerCaseMapping:0xF909 + ,simpleTitleCaseMapping:0xF909 + }, + { code:0xF90A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF90A + ,simpleLowerCaseMapping:0xF90A + ,simpleTitleCaseMapping:0xF90A + }, + { code:0xF90B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF90B + ,simpleLowerCaseMapping:0xF90B + ,simpleTitleCaseMapping:0xF90B + }, + { code:0xF90C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF90C + ,simpleLowerCaseMapping:0xF90C + ,simpleTitleCaseMapping:0xF90C + }, + { code:0xF90D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF90D + ,simpleLowerCaseMapping:0xF90D + ,simpleTitleCaseMapping:0xF90D + }, + { code:0xF90E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF90E + ,simpleLowerCaseMapping:0xF90E + ,simpleTitleCaseMapping:0xF90E + }, + { code:0xF90F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF90F + ,simpleLowerCaseMapping:0xF90F + ,simpleTitleCaseMapping:0xF90F + }, + { code:0xF910 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF910 + ,simpleLowerCaseMapping:0xF910 + ,simpleTitleCaseMapping:0xF910 + }, + { code:0xF911 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF911 + ,simpleLowerCaseMapping:0xF911 + ,simpleTitleCaseMapping:0xF911 + }, + { code:0xF912 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF912 + ,simpleLowerCaseMapping:0xF912 + ,simpleTitleCaseMapping:0xF912 + }, + { code:0xF913 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF913 + ,simpleLowerCaseMapping:0xF913 + ,simpleTitleCaseMapping:0xF913 + }, + { code:0xF914 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF914 + ,simpleLowerCaseMapping:0xF914 + ,simpleTitleCaseMapping:0xF914 + }, + { code:0xF915 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF915 + ,simpleLowerCaseMapping:0xF915 + ,simpleTitleCaseMapping:0xF915 + }, + { code:0xF916 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF916 + ,simpleLowerCaseMapping:0xF916 + ,simpleTitleCaseMapping:0xF916 + }, + { code:0xF917 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF917 + ,simpleLowerCaseMapping:0xF917 + ,simpleTitleCaseMapping:0xF917 + }, + { code:0xF918 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF918 + ,simpleLowerCaseMapping:0xF918 + ,simpleTitleCaseMapping:0xF918 + }, + { code:0xF919 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF919 + ,simpleLowerCaseMapping:0xF919 + ,simpleTitleCaseMapping:0xF919 + }, + { code:0xF91A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF91A + ,simpleLowerCaseMapping:0xF91A + ,simpleTitleCaseMapping:0xF91A + }, + { code:0xF91B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF91B + ,simpleLowerCaseMapping:0xF91B + ,simpleTitleCaseMapping:0xF91B + }, + { code:0xF91C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF91C + ,simpleLowerCaseMapping:0xF91C + ,simpleTitleCaseMapping:0xF91C + }, + { code:0xF91D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF91D + ,simpleLowerCaseMapping:0xF91D + ,simpleTitleCaseMapping:0xF91D + }, + { code:0xF91E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF91E + ,simpleLowerCaseMapping:0xF91E + ,simpleTitleCaseMapping:0xF91E + }, + { code:0xF91F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF91F + ,simpleLowerCaseMapping:0xF91F + ,simpleTitleCaseMapping:0xF91F + }, + { code:0xF920 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF920 + ,simpleLowerCaseMapping:0xF920 + ,simpleTitleCaseMapping:0xF920 + }, + { code:0xF921 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF921 + ,simpleLowerCaseMapping:0xF921 + ,simpleTitleCaseMapping:0xF921 + }, + { code:0xF922 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF922 + ,simpleLowerCaseMapping:0xF922 + ,simpleTitleCaseMapping:0xF922 + }, + { code:0xF923 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF923 + ,simpleLowerCaseMapping:0xF923 + ,simpleTitleCaseMapping:0xF923 + }, + { code:0xF924 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF924 + ,simpleLowerCaseMapping:0xF924 + ,simpleTitleCaseMapping:0xF924 + }, + { code:0xF925 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF925 + ,simpleLowerCaseMapping:0xF925 + ,simpleTitleCaseMapping:0xF925 + }, + { code:0xF926 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF926 + ,simpleLowerCaseMapping:0xF926 + ,simpleTitleCaseMapping:0xF926 + }, + { code:0xF927 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF927 + ,simpleLowerCaseMapping:0xF927 + ,simpleTitleCaseMapping:0xF927 + }, + { code:0xF928 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF928 + ,simpleLowerCaseMapping:0xF928 + ,simpleTitleCaseMapping:0xF928 + }, + { code:0xF929 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF929 + ,simpleLowerCaseMapping:0xF929 + ,simpleTitleCaseMapping:0xF929 + }, + { code:0xF92A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF92A + ,simpleLowerCaseMapping:0xF92A + ,simpleTitleCaseMapping:0xF92A + }, + { code:0xF92B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF92B + ,simpleLowerCaseMapping:0xF92B + ,simpleTitleCaseMapping:0xF92B + }, + { code:0xF92C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF92C + ,simpleLowerCaseMapping:0xF92C + ,simpleTitleCaseMapping:0xF92C + }, + { code:0xF92D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF92D + ,simpleLowerCaseMapping:0xF92D + ,simpleTitleCaseMapping:0xF92D + }, + { code:0xF92E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF92E + ,simpleLowerCaseMapping:0xF92E + ,simpleTitleCaseMapping:0xF92E + }, + { code:0xF92F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF92F + ,simpleLowerCaseMapping:0xF92F + ,simpleTitleCaseMapping:0xF92F + }, + { code:0xF930 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF930 + ,simpleLowerCaseMapping:0xF930 + ,simpleTitleCaseMapping:0xF930 + }, + { code:0xF931 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF931 + ,simpleLowerCaseMapping:0xF931 + ,simpleTitleCaseMapping:0xF931 + }, + { code:0xF932 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF932 + ,simpleLowerCaseMapping:0xF932 + ,simpleTitleCaseMapping:0xF932 + }, + { code:0xF933 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF933 + ,simpleLowerCaseMapping:0xF933 + ,simpleTitleCaseMapping:0xF933 + }, + { code:0xF934 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF934 + ,simpleLowerCaseMapping:0xF934 + ,simpleTitleCaseMapping:0xF934 + }, + { code:0xF935 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF935 + ,simpleLowerCaseMapping:0xF935 + ,simpleTitleCaseMapping:0xF935 + }, + { code:0xF936 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF936 + ,simpleLowerCaseMapping:0xF936 + ,simpleTitleCaseMapping:0xF936 + }, + { code:0xF937 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF937 + ,simpleLowerCaseMapping:0xF937 + ,simpleTitleCaseMapping:0xF937 + }, + { code:0xF938 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF938 + ,simpleLowerCaseMapping:0xF938 + ,simpleTitleCaseMapping:0xF938 + }, + { code:0xF939 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF939 + ,simpleLowerCaseMapping:0xF939 + ,simpleTitleCaseMapping:0xF939 + }, + { code:0xF93A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF93A + ,simpleLowerCaseMapping:0xF93A + ,simpleTitleCaseMapping:0xF93A + }, + { code:0xF93B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF93B + ,simpleLowerCaseMapping:0xF93B + ,simpleTitleCaseMapping:0xF93B + }, + { code:0xF93C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF93C + ,simpleLowerCaseMapping:0xF93C + ,simpleTitleCaseMapping:0xF93C + }, + { code:0xF93D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF93D + ,simpleLowerCaseMapping:0xF93D + ,simpleTitleCaseMapping:0xF93D + }, + { code:0xF93E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF93E + ,simpleLowerCaseMapping:0xF93E + ,simpleTitleCaseMapping:0xF93E + }, + { code:0xF93F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF93F + ,simpleLowerCaseMapping:0xF93F + ,simpleTitleCaseMapping:0xF93F + }, + { code:0xF940 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF940 + ,simpleLowerCaseMapping:0xF940 + ,simpleTitleCaseMapping:0xF940 + }, + { code:0xF941 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF941 + ,simpleLowerCaseMapping:0xF941 + ,simpleTitleCaseMapping:0xF941 + }, + { code:0xF942 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF942 + ,simpleLowerCaseMapping:0xF942 + ,simpleTitleCaseMapping:0xF942 + }, + { code:0xF943 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF943 + ,simpleLowerCaseMapping:0xF943 + ,simpleTitleCaseMapping:0xF943 + }, + { code:0xF944 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF944 + ,simpleLowerCaseMapping:0xF944 + ,simpleTitleCaseMapping:0xF944 + }, + { code:0xF945 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF945 + ,simpleLowerCaseMapping:0xF945 + ,simpleTitleCaseMapping:0xF945 + }, + { code:0xF946 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF946 + ,simpleLowerCaseMapping:0xF946 + ,simpleTitleCaseMapping:0xF946 + }, + { code:0xF947 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF947 + ,simpleLowerCaseMapping:0xF947 + ,simpleTitleCaseMapping:0xF947 + }, + { code:0xF948 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF948 + ,simpleLowerCaseMapping:0xF948 + ,simpleTitleCaseMapping:0xF948 + }, + { code:0xF949 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF949 + ,simpleLowerCaseMapping:0xF949 + ,simpleTitleCaseMapping:0xF949 + }, + { code:0xF94A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF94A + ,simpleLowerCaseMapping:0xF94A + ,simpleTitleCaseMapping:0xF94A + }, + { code:0xF94B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF94B + ,simpleLowerCaseMapping:0xF94B + ,simpleTitleCaseMapping:0xF94B + }, + { code:0xF94C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF94C + ,simpleLowerCaseMapping:0xF94C + ,simpleTitleCaseMapping:0xF94C + }, + { code:0xF94D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF94D + ,simpleLowerCaseMapping:0xF94D + ,simpleTitleCaseMapping:0xF94D + }, + { code:0xF94E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF94E + ,simpleLowerCaseMapping:0xF94E + ,simpleTitleCaseMapping:0xF94E + }, + { code:0xF94F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF94F + ,simpleLowerCaseMapping:0xF94F + ,simpleTitleCaseMapping:0xF94F + }, + { code:0xF950 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF950 + ,simpleLowerCaseMapping:0xF950 + ,simpleTitleCaseMapping:0xF950 + }, + { code:0xF951 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF951 + ,simpleLowerCaseMapping:0xF951 + ,simpleTitleCaseMapping:0xF951 + }, + { code:0xF952 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF952 + ,simpleLowerCaseMapping:0xF952 + ,simpleTitleCaseMapping:0xF952 + }, + { code:0xF953 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF953 + ,simpleLowerCaseMapping:0xF953 + ,simpleTitleCaseMapping:0xF953 + }, + { code:0xF954 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF954 + ,simpleLowerCaseMapping:0xF954 + ,simpleTitleCaseMapping:0xF954 + }, + { code:0xF955 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF955 + ,simpleLowerCaseMapping:0xF955 + ,simpleTitleCaseMapping:0xF955 + }, + { code:0xF956 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF956 + ,simpleLowerCaseMapping:0xF956 + ,simpleTitleCaseMapping:0xF956 + }, + { code:0xF957 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF957 + ,simpleLowerCaseMapping:0xF957 + ,simpleTitleCaseMapping:0xF957 + }, + { code:0xF958 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF958 + ,simpleLowerCaseMapping:0xF958 + ,simpleTitleCaseMapping:0xF958 + }, + { code:0xF959 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF959 + ,simpleLowerCaseMapping:0xF959 + ,simpleTitleCaseMapping:0xF959 + }, + { code:0xF95A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF95A + ,simpleLowerCaseMapping:0xF95A + ,simpleTitleCaseMapping:0xF95A + }, + { code:0xF95B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF95B + ,simpleLowerCaseMapping:0xF95B + ,simpleTitleCaseMapping:0xF95B + }, + { code:0xF95C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF95C + ,simpleLowerCaseMapping:0xF95C + ,simpleTitleCaseMapping:0xF95C + }, + { code:0xF95D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF95D + ,simpleLowerCaseMapping:0xF95D + ,simpleTitleCaseMapping:0xF95D + }, + { code:0xF95E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF95E + ,simpleLowerCaseMapping:0xF95E + ,simpleTitleCaseMapping:0xF95E + }, + { code:0xF95F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF95F + ,simpleLowerCaseMapping:0xF95F + ,simpleTitleCaseMapping:0xF95F + }, + { code:0xF960 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF960 + ,simpleLowerCaseMapping:0xF960 + ,simpleTitleCaseMapping:0xF960 + }, + { code:0xF961 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF961 + ,simpleLowerCaseMapping:0xF961 + ,simpleTitleCaseMapping:0xF961 + }, + { code:0xF962 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF962 + ,simpleLowerCaseMapping:0xF962 + ,simpleTitleCaseMapping:0xF962 + }, + { code:0xF963 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF963 + ,simpleLowerCaseMapping:0xF963 + ,simpleTitleCaseMapping:0xF963 + }, + { code:0xF964 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF964 + ,simpleLowerCaseMapping:0xF964 + ,simpleTitleCaseMapping:0xF964 + }, + { code:0xF965 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF965 + ,simpleLowerCaseMapping:0xF965 + ,simpleTitleCaseMapping:0xF965 + }, + { code:0xF966 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF966 + ,simpleLowerCaseMapping:0xF966 + ,simpleTitleCaseMapping:0xF966 + }, + { code:0xF967 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF967 + ,simpleLowerCaseMapping:0xF967 + ,simpleTitleCaseMapping:0xF967 + }, + { code:0xF968 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF968 + ,simpleLowerCaseMapping:0xF968 + ,simpleTitleCaseMapping:0xF968 + }, + { code:0xF969 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF969 + ,simpleLowerCaseMapping:0xF969 + ,simpleTitleCaseMapping:0xF969 + }, + { code:0xF96A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF96A + ,simpleLowerCaseMapping:0xF96A + ,simpleTitleCaseMapping:0xF96A + }, + { code:0xF96B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF96B + ,simpleLowerCaseMapping:0xF96B + ,simpleTitleCaseMapping:0xF96B + }, + { code:0xF96C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF96C + ,simpleLowerCaseMapping:0xF96C + ,simpleTitleCaseMapping:0xF96C + }, + { code:0xF96D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF96D + ,simpleLowerCaseMapping:0xF96D + ,simpleTitleCaseMapping:0xF96D + }, + { code:0xF96E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF96E + ,simpleLowerCaseMapping:0xF96E + ,simpleTitleCaseMapping:0xF96E + }, + { code:0xF96F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF96F + ,simpleLowerCaseMapping:0xF96F + ,simpleTitleCaseMapping:0xF96F + }, + { code:0xF970 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF970 + ,simpleLowerCaseMapping:0xF970 + ,simpleTitleCaseMapping:0xF970 + }, + { code:0xF971 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF971 + ,simpleLowerCaseMapping:0xF971 + ,simpleTitleCaseMapping:0xF971 + }, + { code:0xF972 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF972 + ,simpleLowerCaseMapping:0xF972 + ,simpleTitleCaseMapping:0xF972 + }, + { code:0xF973 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF973 + ,simpleLowerCaseMapping:0xF973 + ,simpleTitleCaseMapping:0xF973 + }, + { code:0xF974 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF974 + ,simpleLowerCaseMapping:0xF974 + ,simpleTitleCaseMapping:0xF974 + }, + { code:0xF975 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF975 + ,simpleLowerCaseMapping:0xF975 + ,simpleTitleCaseMapping:0xF975 + }, + { code:0xF976 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF976 + ,simpleLowerCaseMapping:0xF976 + ,simpleTitleCaseMapping:0xF976 + }, + { code:0xF977 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF977 + ,simpleLowerCaseMapping:0xF977 + ,simpleTitleCaseMapping:0xF977 + }, + { code:0xF978 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF978 + ,simpleLowerCaseMapping:0xF978 + ,simpleTitleCaseMapping:0xF978 + }, + { code:0xF979 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF979 + ,simpleLowerCaseMapping:0xF979 + ,simpleTitleCaseMapping:0xF979 + }, + { code:0xF97A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF97A + ,simpleLowerCaseMapping:0xF97A + ,simpleTitleCaseMapping:0xF97A + }, + { code:0xF97B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF97B + ,simpleLowerCaseMapping:0xF97B + ,simpleTitleCaseMapping:0xF97B + }, + { code:0xF97C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF97C + ,simpleLowerCaseMapping:0xF97C + ,simpleTitleCaseMapping:0xF97C + }, + { code:0xF97D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF97D + ,simpleLowerCaseMapping:0xF97D + ,simpleTitleCaseMapping:0xF97D + }, + { code:0xF97E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF97E + ,simpleLowerCaseMapping:0xF97E + ,simpleTitleCaseMapping:0xF97E + }, + { code:0xF97F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF97F + ,simpleLowerCaseMapping:0xF97F + ,simpleTitleCaseMapping:0xF97F + }, + { code:0xF980 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF980 + ,simpleLowerCaseMapping:0xF980 + ,simpleTitleCaseMapping:0xF980 + }, + { code:0xF981 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF981 + ,simpleLowerCaseMapping:0xF981 + ,simpleTitleCaseMapping:0xF981 + }, + { code:0xF982 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF982 + ,simpleLowerCaseMapping:0xF982 + ,simpleTitleCaseMapping:0xF982 + }, + { code:0xF983 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF983 + ,simpleLowerCaseMapping:0xF983 + ,simpleTitleCaseMapping:0xF983 + }, + { code:0xF984 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF984 + ,simpleLowerCaseMapping:0xF984 + ,simpleTitleCaseMapping:0xF984 + }, + { code:0xF985 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF985 + ,simpleLowerCaseMapping:0xF985 + ,simpleTitleCaseMapping:0xF985 + }, + { code:0xF986 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF986 + ,simpleLowerCaseMapping:0xF986 + ,simpleTitleCaseMapping:0xF986 + }, + { code:0xF987 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF987 + ,simpleLowerCaseMapping:0xF987 + ,simpleTitleCaseMapping:0xF987 + }, + { code:0xF988 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF988 + ,simpleLowerCaseMapping:0xF988 + ,simpleTitleCaseMapping:0xF988 + }, + { code:0xF989 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF989 + ,simpleLowerCaseMapping:0xF989 + ,simpleTitleCaseMapping:0xF989 + }, + { code:0xF98A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF98A + ,simpleLowerCaseMapping:0xF98A + ,simpleTitleCaseMapping:0xF98A + }, + { code:0xF98B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF98B + ,simpleLowerCaseMapping:0xF98B + ,simpleTitleCaseMapping:0xF98B + }, + { code:0xF98C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF98C + ,simpleLowerCaseMapping:0xF98C + ,simpleTitleCaseMapping:0xF98C + }, + { code:0xF98D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF98D + ,simpleLowerCaseMapping:0xF98D + ,simpleTitleCaseMapping:0xF98D + }, + { code:0xF98E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF98E + ,simpleLowerCaseMapping:0xF98E + ,simpleTitleCaseMapping:0xF98E + }, + { code:0xF98F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF98F + ,simpleLowerCaseMapping:0xF98F + ,simpleTitleCaseMapping:0xF98F + }, + { code:0xF990 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF990 + ,simpleLowerCaseMapping:0xF990 + ,simpleTitleCaseMapping:0xF990 + }, + { code:0xF991 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF991 + ,simpleLowerCaseMapping:0xF991 + ,simpleTitleCaseMapping:0xF991 + }, + { code:0xF992 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF992 + ,simpleLowerCaseMapping:0xF992 + ,simpleTitleCaseMapping:0xF992 + }, + { code:0xF993 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF993 + ,simpleLowerCaseMapping:0xF993 + ,simpleTitleCaseMapping:0xF993 + }, + { code:0xF994 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF994 + ,simpleLowerCaseMapping:0xF994 + ,simpleTitleCaseMapping:0xF994 + }, + { code:0xF995 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF995 + ,simpleLowerCaseMapping:0xF995 + ,simpleTitleCaseMapping:0xF995 + }, + { code:0xF996 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF996 + ,simpleLowerCaseMapping:0xF996 + ,simpleTitleCaseMapping:0xF996 + }, + { code:0xF997 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF997 + ,simpleLowerCaseMapping:0xF997 + ,simpleTitleCaseMapping:0xF997 + }, + { code:0xF998 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF998 + ,simpleLowerCaseMapping:0xF998 + ,simpleTitleCaseMapping:0xF998 + }, + { code:0xF999 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF999 + ,simpleLowerCaseMapping:0xF999 + ,simpleTitleCaseMapping:0xF999 + }, + { code:0xF99A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF99A + ,simpleLowerCaseMapping:0xF99A + ,simpleTitleCaseMapping:0xF99A + }, + { code:0xF99B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF99B + ,simpleLowerCaseMapping:0xF99B + ,simpleTitleCaseMapping:0xF99B + }, + { code:0xF99C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF99C + ,simpleLowerCaseMapping:0xF99C + ,simpleTitleCaseMapping:0xF99C + }, + { code:0xF99D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF99D + ,simpleLowerCaseMapping:0xF99D + ,simpleTitleCaseMapping:0xF99D + }, + { code:0xF99E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF99E + ,simpleLowerCaseMapping:0xF99E + ,simpleTitleCaseMapping:0xF99E + }, + { code:0xF99F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF99F + ,simpleLowerCaseMapping:0xF99F + ,simpleTitleCaseMapping:0xF99F + }, + { code:0xF9A0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9A0 + ,simpleLowerCaseMapping:0xF9A0 + ,simpleTitleCaseMapping:0xF9A0 + }, + { code:0xF9A1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9A1 + ,simpleLowerCaseMapping:0xF9A1 + ,simpleTitleCaseMapping:0xF9A1 + }, + { code:0xF9A2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9A2 + ,simpleLowerCaseMapping:0xF9A2 + ,simpleTitleCaseMapping:0xF9A2 + }, + { code:0xF9A3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9A3 + ,simpleLowerCaseMapping:0xF9A3 + ,simpleTitleCaseMapping:0xF9A3 + }, + { code:0xF9A4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9A4 + ,simpleLowerCaseMapping:0xF9A4 + ,simpleTitleCaseMapping:0xF9A4 + }, + { code:0xF9A5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9A5 + ,simpleLowerCaseMapping:0xF9A5 + ,simpleTitleCaseMapping:0xF9A5 + }, + { code:0xF9A6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9A6 + ,simpleLowerCaseMapping:0xF9A6 + ,simpleTitleCaseMapping:0xF9A6 + }, + { code:0xF9A7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9A7 + ,simpleLowerCaseMapping:0xF9A7 + ,simpleTitleCaseMapping:0xF9A7 + }, + { code:0xF9A8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9A8 + ,simpleLowerCaseMapping:0xF9A8 + ,simpleTitleCaseMapping:0xF9A8 + }, + { code:0xF9A9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9A9 + ,simpleLowerCaseMapping:0xF9A9 + ,simpleTitleCaseMapping:0xF9A9 + }, + { code:0xF9AA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9AA + ,simpleLowerCaseMapping:0xF9AA + ,simpleTitleCaseMapping:0xF9AA + }, + { code:0xF9AB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9AB + ,simpleLowerCaseMapping:0xF9AB + ,simpleTitleCaseMapping:0xF9AB + }, + { code:0xF9AC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9AC + ,simpleLowerCaseMapping:0xF9AC + ,simpleTitleCaseMapping:0xF9AC + }, + { code:0xF9AD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9AD + ,simpleLowerCaseMapping:0xF9AD + ,simpleTitleCaseMapping:0xF9AD + }, + { code:0xF9AE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9AE + ,simpleLowerCaseMapping:0xF9AE + ,simpleTitleCaseMapping:0xF9AE + }, + { code:0xF9AF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9AF + ,simpleLowerCaseMapping:0xF9AF + ,simpleTitleCaseMapping:0xF9AF + }, + { code:0xF9B0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9B0 + ,simpleLowerCaseMapping:0xF9B0 + ,simpleTitleCaseMapping:0xF9B0 + }, + { code:0xF9B1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9B1 + ,simpleLowerCaseMapping:0xF9B1 + ,simpleTitleCaseMapping:0xF9B1 + }, + { code:0xF9B2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9B2 + ,simpleLowerCaseMapping:0xF9B2 + ,simpleTitleCaseMapping:0xF9B2 + }, + { code:0xF9B3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9B3 + ,simpleLowerCaseMapping:0xF9B3 + ,simpleTitleCaseMapping:0xF9B3 + }, + { code:0xF9B4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9B4 + ,simpleLowerCaseMapping:0xF9B4 + ,simpleTitleCaseMapping:0xF9B4 + }, + { code:0xF9B5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9B5 + ,simpleLowerCaseMapping:0xF9B5 + ,simpleTitleCaseMapping:0xF9B5 + }, + { code:0xF9B6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9B6 + ,simpleLowerCaseMapping:0xF9B6 + ,simpleTitleCaseMapping:0xF9B6 + }, + { code:0xF9B7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9B7 + ,simpleLowerCaseMapping:0xF9B7 + ,simpleTitleCaseMapping:0xF9B7 + }, + { code:0xF9B8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9B8 + ,simpleLowerCaseMapping:0xF9B8 + ,simpleTitleCaseMapping:0xF9B8 + }, + { code:0xF9B9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9B9 + ,simpleLowerCaseMapping:0xF9B9 + ,simpleTitleCaseMapping:0xF9B9 + }, + { code:0xF9BA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9BA + ,simpleLowerCaseMapping:0xF9BA + ,simpleTitleCaseMapping:0xF9BA + }, + { code:0xF9BB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9BB + ,simpleLowerCaseMapping:0xF9BB + ,simpleTitleCaseMapping:0xF9BB + }, + { code:0xF9BC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9BC + ,simpleLowerCaseMapping:0xF9BC + ,simpleTitleCaseMapping:0xF9BC + }, + { code:0xF9BD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9BD + ,simpleLowerCaseMapping:0xF9BD + ,simpleTitleCaseMapping:0xF9BD + }, + { code:0xF9BE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9BE + ,simpleLowerCaseMapping:0xF9BE + ,simpleTitleCaseMapping:0xF9BE + }, + { code:0xF9BF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9BF + ,simpleLowerCaseMapping:0xF9BF + ,simpleTitleCaseMapping:0xF9BF + }, + { code:0xF9C0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9C0 + ,simpleLowerCaseMapping:0xF9C0 + ,simpleTitleCaseMapping:0xF9C0 + }, + { code:0xF9C1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9C1 + ,simpleLowerCaseMapping:0xF9C1 + ,simpleTitleCaseMapping:0xF9C1 + }, + { code:0xF9C2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9C2 + ,simpleLowerCaseMapping:0xF9C2 + ,simpleTitleCaseMapping:0xF9C2 + }, + { code:0xF9C3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9C3 + ,simpleLowerCaseMapping:0xF9C3 + ,simpleTitleCaseMapping:0xF9C3 + }, + { code:0xF9C4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9C4 + ,simpleLowerCaseMapping:0xF9C4 + ,simpleTitleCaseMapping:0xF9C4 + }, + { code:0xF9C5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9C5 + ,simpleLowerCaseMapping:0xF9C5 + ,simpleTitleCaseMapping:0xF9C5 + }, + { code:0xF9C6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9C6 + ,simpleLowerCaseMapping:0xF9C6 + ,simpleTitleCaseMapping:0xF9C6 + }, + { code:0xF9C7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9C7 + ,simpleLowerCaseMapping:0xF9C7 + ,simpleTitleCaseMapping:0xF9C7 + }, + { code:0xF9C8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9C8 + ,simpleLowerCaseMapping:0xF9C8 + ,simpleTitleCaseMapping:0xF9C8 + }, + { code:0xF9C9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9C9 + ,simpleLowerCaseMapping:0xF9C9 + ,simpleTitleCaseMapping:0xF9C9 + }, + { code:0xF9CA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9CA + ,simpleLowerCaseMapping:0xF9CA + ,simpleTitleCaseMapping:0xF9CA + }, + { code:0xF9CB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9CB + ,simpleLowerCaseMapping:0xF9CB + ,simpleTitleCaseMapping:0xF9CB + }, + { code:0xF9CC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9CC + ,simpleLowerCaseMapping:0xF9CC + ,simpleTitleCaseMapping:0xF9CC + }, + { code:0xF9CD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9CD + ,simpleLowerCaseMapping:0xF9CD + ,simpleTitleCaseMapping:0xF9CD + }, + { code:0xF9CE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9CE + ,simpleLowerCaseMapping:0xF9CE + ,simpleTitleCaseMapping:0xF9CE + }, + { code:0xF9CF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9CF + ,simpleLowerCaseMapping:0xF9CF + ,simpleTitleCaseMapping:0xF9CF + }, + { code:0xF9D0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9D0 + ,simpleLowerCaseMapping:0xF9D0 + ,simpleTitleCaseMapping:0xF9D0 + }, + { code:0xF9D1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9D1 + ,simpleLowerCaseMapping:0xF9D1 + ,simpleTitleCaseMapping:0xF9D1 + }, + { code:0xF9D2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9D2 + ,simpleLowerCaseMapping:0xF9D2 + ,simpleTitleCaseMapping:0xF9D2 + }, + { code:0xF9D3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9D3 + ,simpleLowerCaseMapping:0xF9D3 + ,simpleTitleCaseMapping:0xF9D3 + }, + { code:0xF9D4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9D4 + ,simpleLowerCaseMapping:0xF9D4 + ,simpleTitleCaseMapping:0xF9D4 + }, + { code:0xF9D5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9D5 + ,simpleLowerCaseMapping:0xF9D5 + ,simpleTitleCaseMapping:0xF9D5 + }, + { code:0xF9D6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9D6 + ,simpleLowerCaseMapping:0xF9D6 + ,simpleTitleCaseMapping:0xF9D6 + }, + { code:0xF9D7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9D7 + ,simpleLowerCaseMapping:0xF9D7 + ,simpleTitleCaseMapping:0xF9D7 + }, + { code:0xF9D8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9D8 + ,simpleLowerCaseMapping:0xF9D8 + ,simpleTitleCaseMapping:0xF9D8 + }, + { code:0xF9D9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9D9 + ,simpleLowerCaseMapping:0xF9D9 + ,simpleTitleCaseMapping:0xF9D9 + }, + { code:0xF9DA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9DA + ,simpleLowerCaseMapping:0xF9DA + ,simpleTitleCaseMapping:0xF9DA + }, + { code:0xF9DB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9DB + ,simpleLowerCaseMapping:0xF9DB + ,simpleTitleCaseMapping:0xF9DB + }, + { code:0xF9DC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9DC + ,simpleLowerCaseMapping:0xF9DC + ,simpleTitleCaseMapping:0xF9DC + }, + { code:0xF9DD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9DD + ,simpleLowerCaseMapping:0xF9DD + ,simpleTitleCaseMapping:0xF9DD + }, + { code:0xF9DE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9DE + ,simpleLowerCaseMapping:0xF9DE + ,simpleTitleCaseMapping:0xF9DE + }, + { code:0xF9DF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9DF + ,simpleLowerCaseMapping:0xF9DF + ,simpleTitleCaseMapping:0xF9DF + }, + { code:0xF9E0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9E0 + ,simpleLowerCaseMapping:0xF9E0 + ,simpleTitleCaseMapping:0xF9E0 + }, + { code:0xF9E1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9E1 + ,simpleLowerCaseMapping:0xF9E1 + ,simpleTitleCaseMapping:0xF9E1 + }, + { code:0xF9E2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9E2 + ,simpleLowerCaseMapping:0xF9E2 + ,simpleTitleCaseMapping:0xF9E2 + }, + { code:0xF9E3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9E3 + ,simpleLowerCaseMapping:0xF9E3 + ,simpleTitleCaseMapping:0xF9E3 + }, + { code:0xF9E4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9E4 + ,simpleLowerCaseMapping:0xF9E4 + ,simpleTitleCaseMapping:0xF9E4 + }, + { code:0xF9E5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9E5 + ,simpleLowerCaseMapping:0xF9E5 + ,simpleTitleCaseMapping:0xF9E5 + }, + { code:0xF9E6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9E6 + ,simpleLowerCaseMapping:0xF9E6 + ,simpleTitleCaseMapping:0xF9E6 + }, + { code:0xF9E7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9E7 + ,simpleLowerCaseMapping:0xF9E7 + ,simpleTitleCaseMapping:0xF9E7 + }, + { code:0xF9E8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9E8 + ,simpleLowerCaseMapping:0xF9E8 + ,simpleTitleCaseMapping:0xF9E8 + }, + { code:0xF9E9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9E9 + ,simpleLowerCaseMapping:0xF9E9 + ,simpleTitleCaseMapping:0xF9E9 + }, + { code:0xF9EA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9EA + ,simpleLowerCaseMapping:0xF9EA + ,simpleTitleCaseMapping:0xF9EA + }, + { code:0xF9EB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9EB + ,simpleLowerCaseMapping:0xF9EB + ,simpleTitleCaseMapping:0xF9EB + }, + { code:0xF9EC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9EC + ,simpleLowerCaseMapping:0xF9EC + ,simpleTitleCaseMapping:0xF9EC + }, + { code:0xF9ED + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9ED + ,simpleLowerCaseMapping:0xF9ED + ,simpleTitleCaseMapping:0xF9ED + }, + { code:0xF9EE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9EE + ,simpleLowerCaseMapping:0xF9EE + ,simpleTitleCaseMapping:0xF9EE + }, + { code:0xF9EF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9EF + ,simpleLowerCaseMapping:0xF9EF + ,simpleTitleCaseMapping:0xF9EF + }, + { code:0xF9F0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9F0 + ,simpleLowerCaseMapping:0xF9F0 + ,simpleTitleCaseMapping:0xF9F0 + }, + { code:0xF9F1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9F1 + ,simpleLowerCaseMapping:0xF9F1 + ,simpleTitleCaseMapping:0xF9F1 + }, + { code:0xF9F2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9F2 + ,simpleLowerCaseMapping:0xF9F2 + ,simpleTitleCaseMapping:0xF9F2 + }, + { code:0xF9F3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9F3 + ,simpleLowerCaseMapping:0xF9F3 + ,simpleTitleCaseMapping:0xF9F3 + }, + { code:0xF9F4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9F4 + ,simpleLowerCaseMapping:0xF9F4 + ,simpleTitleCaseMapping:0xF9F4 + }, + { code:0xF9F5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9F5 + ,simpleLowerCaseMapping:0xF9F5 + ,simpleTitleCaseMapping:0xF9F5 + }, + { code:0xF9F6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9F6 + ,simpleLowerCaseMapping:0xF9F6 + ,simpleTitleCaseMapping:0xF9F6 + }, + { code:0xF9F7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9F7 + ,simpleLowerCaseMapping:0xF9F7 + ,simpleTitleCaseMapping:0xF9F7 + }, + { code:0xF9F8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9F8 + ,simpleLowerCaseMapping:0xF9F8 + ,simpleTitleCaseMapping:0xF9F8 + }, + { code:0xF9F9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9F9 + ,simpleLowerCaseMapping:0xF9F9 + ,simpleTitleCaseMapping:0xF9F9 + }, + { code:0xF9FA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9FA + ,simpleLowerCaseMapping:0xF9FA + ,simpleTitleCaseMapping:0xF9FA + }, + { code:0xF9FB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9FB + ,simpleLowerCaseMapping:0xF9FB + ,simpleTitleCaseMapping:0xF9FB + }, + { code:0xF9FC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9FC + ,simpleLowerCaseMapping:0xF9FC + ,simpleTitleCaseMapping:0xF9FC + }, + { code:0xF9FD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9FD + ,simpleLowerCaseMapping:0xF9FD + ,simpleTitleCaseMapping:0xF9FD + }, + { code:0xF9FE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9FE + ,simpleLowerCaseMapping:0xF9FE + ,simpleTitleCaseMapping:0xF9FE + }, + { code:0xF9FF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xF9FF + ,simpleLowerCaseMapping:0xF9FF + ,simpleTitleCaseMapping:0xF9FF + }, + { code:0xFA00 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA00 + ,simpleLowerCaseMapping:0xFA00 + ,simpleTitleCaseMapping:0xFA00 + }, + { code:0xFA01 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA01 + ,simpleLowerCaseMapping:0xFA01 + ,simpleTitleCaseMapping:0xFA01 + }, + { code:0xFA02 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA02 + ,simpleLowerCaseMapping:0xFA02 + ,simpleTitleCaseMapping:0xFA02 + }, + { code:0xFA03 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA03 + ,simpleLowerCaseMapping:0xFA03 + ,simpleTitleCaseMapping:0xFA03 + }, + { code:0xFA04 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA04 + ,simpleLowerCaseMapping:0xFA04 + ,simpleTitleCaseMapping:0xFA04 + }, + { code:0xFA05 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA05 + ,simpleLowerCaseMapping:0xFA05 + ,simpleTitleCaseMapping:0xFA05 + }, + { code:0xFA06 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA06 + ,simpleLowerCaseMapping:0xFA06 + ,simpleTitleCaseMapping:0xFA06 + }, + { code:0xFA07 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA07 + ,simpleLowerCaseMapping:0xFA07 + ,simpleTitleCaseMapping:0xFA07 + }, + { code:0xFA08 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA08 + ,simpleLowerCaseMapping:0xFA08 + ,simpleTitleCaseMapping:0xFA08 + }, + { code:0xFA09 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA09 + ,simpleLowerCaseMapping:0xFA09 + ,simpleTitleCaseMapping:0xFA09 + }, + { code:0xFA0A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA0A + ,simpleLowerCaseMapping:0xFA0A + ,simpleTitleCaseMapping:0xFA0A + }, + { code:0xFA0B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA0B + ,simpleLowerCaseMapping:0xFA0B + ,simpleTitleCaseMapping:0xFA0B + }, + { code:0xFA0C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA0C + ,simpleLowerCaseMapping:0xFA0C + ,simpleTitleCaseMapping:0xFA0C + }, + { code:0xFA0D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA0D + ,simpleLowerCaseMapping:0xFA0D + ,simpleTitleCaseMapping:0xFA0D + }, + { code:0xFA0E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA0E + ,simpleLowerCaseMapping:0xFA0E + ,simpleTitleCaseMapping:0xFA0E + }, + { code:0xFA0F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA0F + ,simpleLowerCaseMapping:0xFA0F + ,simpleTitleCaseMapping:0xFA0F + }, + { code:0xFA10 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA10 + ,simpleLowerCaseMapping:0xFA10 + ,simpleTitleCaseMapping:0xFA10 + }, + { code:0xFA11 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA11 + ,simpleLowerCaseMapping:0xFA11 + ,simpleTitleCaseMapping:0xFA11 + }, + { code:0xFA12 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA12 + ,simpleLowerCaseMapping:0xFA12 + ,simpleTitleCaseMapping:0xFA12 + }, + { code:0xFA13 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA13 + ,simpleLowerCaseMapping:0xFA13 + ,simpleTitleCaseMapping:0xFA13 + }, + { code:0xFA14 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA14 + ,simpleLowerCaseMapping:0xFA14 + ,simpleTitleCaseMapping:0xFA14 + }, + { code:0xFA15 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA15 + ,simpleLowerCaseMapping:0xFA15 + ,simpleTitleCaseMapping:0xFA15 + }, + { code:0xFA16 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA16 + ,simpleLowerCaseMapping:0xFA16 + ,simpleTitleCaseMapping:0xFA16 + }, + { code:0xFA17 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA17 + ,simpleLowerCaseMapping:0xFA17 + ,simpleTitleCaseMapping:0xFA17 + }, + { code:0xFA18 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA18 + ,simpleLowerCaseMapping:0xFA18 + ,simpleTitleCaseMapping:0xFA18 + }, + { code:0xFA19 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA19 + ,simpleLowerCaseMapping:0xFA19 + ,simpleTitleCaseMapping:0xFA19 + }, + { code:0xFA1A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA1A + ,simpleLowerCaseMapping:0xFA1A + ,simpleTitleCaseMapping:0xFA1A + }, + { code:0xFA1B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA1B + ,simpleLowerCaseMapping:0xFA1B + ,simpleTitleCaseMapping:0xFA1B + }, + { code:0xFA1C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA1C + ,simpleLowerCaseMapping:0xFA1C + ,simpleTitleCaseMapping:0xFA1C + }, + { code:0xFA1D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA1D + ,simpleLowerCaseMapping:0xFA1D + ,simpleTitleCaseMapping:0xFA1D + }, + { code:0xFA1E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA1E + ,simpleLowerCaseMapping:0xFA1E + ,simpleTitleCaseMapping:0xFA1E + }, + { code:0xFA1F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA1F + ,simpleLowerCaseMapping:0xFA1F + ,simpleTitleCaseMapping:0xFA1F + }, + { code:0xFA20 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA20 + ,simpleLowerCaseMapping:0xFA20 + ,simpleTitleCaseMapping:0xFA20 + }, + { code:0xFA21 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA21 + ,simpleLowerCaseMapping:0xFA21 + ,simpleTitleCaseMapping:0xFA21 + }, + { code:0xFA22 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA22 + ,simpleLowerCaseMapping:0xFA22 + ,simpleTitleCaseMapping:0xFA22 + }, + { code:0xFA23 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA23 + ,simpleLowerCaseMapping:0xFA23 + ,simpleTitleCaseMapping:0xFA23 + }, + { code:0xFA24 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA24 + ,simpleLowerCaseMapping:0xFA24 + ,simpleTitleCaseMapping:0xFA24 + }, + { code:0xFA25 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA25 + ,simpleLowerCaseMapping:0xFA25 + ,simpleTitleCaseMapping:0xFA25 + }, + { code:0xFA26 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA26 + ,simpleLowerCaseMapping:0xFA26 + ,simpleTitleCaseMapping:0xFA26 + }, + { code:0xFA27 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA27 + ,simpleLowerCaseMapping:0xFA27 + ,simpleTitleCaseMapping:0xFA27 + }, + { code:0xFA28 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA28 + ,simpleLowerCaseMapping:0xFA28 + ,simpleTitleCaseMapping:0xFA28 + }, + { code:0xFA29 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA29 + ,simpleLowerCaseMapping:0xFA29 + ,simpleTitleCaseMapping:0xFA29 + }, + { code:0xFA2A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA2A + ,simpleLowerCaseMapping:0xFA2A + ,simpleTitleCaseMapping:0xFA2A + }, + { code:0xFA2B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA2B + ,simpleLowerCaseMapping:0xFA2B + ,simpleTitleCaseMapping:0xFA2B + }, + { code:0xFA2C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA2C + ,simpleLowerCaseMapping:0xFA2C + ,simpleTitleCaseMapping:0xFA2C + }, + { code:0xFA2D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA2D + ,simpleLowerCaseMapping:0xFA2D + ,simpleTitleCaseMapping:0xFA2D + }, + { code:0xFA30 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA30 + ,simpleLowerCaseMapping:0xFA30 + ,simpleTitleCaseMapping:0xFA30 + }, + { code:0xFA31 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA31 + ,simpleLowerCaseMapping:0xFA31 + ,simpleTitleCaseMapping:0xFA31 + }, + { code:0xFA32 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA32 + ,simpleLowerCaseMapping:0xFA32 + ,simpleTitleCaseMapping:0xFA32 + }, + { code:0xFA33 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA33 + ,simpleLowerCaseMapping:0xFA33 + ,simpleTitleCaseMapping:0xFA33 + }, + { code:0xFA34 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA34 + ,simpleLowerCaseMapping:0xFA34 + ,simpleTitleCaseMapping:0xFA34 + }, + { code:0xFA35 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA35 + ,simpleLowerCaseMapping:0xFA35 + ,simpleTitleCaseMapping:0xFA35 + }, + { code:0xFA36 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA36 + ,simpleLowerCaseMapping:0xFA36 + ,simpleTitleCaseMapping:0xFA36 + }, + { code:0xFA37 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA37 + ,simpleLowerCaseMapping:0xFA37 + ,simpleTitleCaseMapping:0xFA37 + }, + { code:0xFA38 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA38 + ,simpleLowerCaseMapping:0xFA38 + ,simpleTitleCaseMapping:0xFA38 + }, + { code:0xFA39 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA39 + ,simpleLowerCaseMapping:0xFA39 + ,simpleTitleCaseMapping:0xFA39 + }, + { code:0xFA3A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA3A + ,simpleLowerCaseMapping:0xFA3A + ,simpleTitleCaseMapping:0xFA3A + }, + { code:0xFA3B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA3B + ,simpleLowerCaseMapping:0xFA3B + ,simpleTitleCaseMapping:0xFA3B + }, + { code:0xFA3C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA3C + ,simpleLowerCaseMapping:0xFA3C + ,simpleTitleCaseMapping:0xFA3C + }, + { code:0xFA3D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA3D + ,simpleLowerCaseMapping:0xFA3D + ,simpleTitleCaseMapping:0xFA3D + }, + { code:0xFA3E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA3E + ,simpleLowerCaseMapping:0xFA3E + ,simpleTitleCaseMapping:0xFA3E + }, + { code:0xFA3F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA3F + ,simpleLowerCaseMapping:0xFA3F + ,simpleTitleCaseMapping:0xFA3F + }, + { code:0xFA40 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA40 + ,simpleLowerCaseMapping:0xFA40 + ,simpleTitleCaseMapping:0xFA40 + }, + { code:0xFA41 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA41 + ,simpleLowerCaseMapping:0xFA41 + ,simpleTitleCaseMapping:0xFA41 + }, + { code:0xFA42 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA42 + ,simpleLowerCaseMapping:0xFA42 + ,simpleTitleCaseMapping:0xFA42 + }, + { code:0xFA43 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA43 + ,simpleLowerCaseMapping:0xFA43 + ,simpleTitleCaseMapping:0xFA43 + }, + { code:0xFA44 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA44 + ,simpleLowerCaseMapping:0xFA44 + ,simpleTitleCaseMapping:0xFA44 + }, + { code:0xFA45 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA45 + ,simpleLowerCaseMapping:0xFA45 + ,simpleTitleCaseMapping:0xFA45 + }, + { code:0xFA46 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA46 + ,simpleLowerCaseMapping:0xFA46 + ,simpleTitleCaseMapping:0xFA46 + }, + { code:0xFA47 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA47 + ,simpleLowerCaseMapping:0xFA47 + ,simpleTitleCaseMapping:0xFA47 + }, + { code:0xFA48 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA48 + ,simpleLowerCaseMapping:0xFA48 + ,simpleTitleCaseMapping:0xFA48 + }, + { code:0xFA49 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA49 + ,simpleLowerCaseMapping:0xFA49 + ,simpleTitleCaseMapping:0xFA49 + }, + { code:0xFA4A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA4A + ,simpleLowerCaseMapping:0xFA4A + ,simpleTitleCaseMapping:0xFA4A + }, + { code:0xFA4B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA4B + ,simpleLowerCaseMapping:0xFA4B + ,simpleTitleCaseMapping:0xFA4B + }, + { code:0xFA4C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA4C + ,simpleLowerCaseMapping:0xFA4C + ,simpleTitleCaseMapping:0xFA4C + }, + { code:0xFA4D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA4D + ,simpleLowerCaseMapping:0xFA4D + ,simpleTitleCaseMapping:0xFA4D + }, + { code:0xFA4E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA4E + ,simpleLowerCaseMapping:0xFA4E + ,simpleTitleCaseMapping:0xFA4E + }, + { code:0xFA4F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA4F + ,simpleLowerCaseMapping:0xFA4F + ,simpleTitleCaseMapping:0xFA4F + }, + { code:0xFA50 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA50 + ,simpleLowerCaseMapping:0xFA50 + ,simpleTitleCaseMapping:0xFA50 + }, + { code:0xFA51 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA51 + ,simpleLowerCaseMapping:0xFA51 + ,simpleTitleCaseMapping:0xFA51 + }, + { code:0xFA52 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA52 + ,simpleLowerCaseMapping:0xFA52 + ,simpleTitleCaseMapping:0xFA52 + }, + { code:0xFA53 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA53 + ,simpleLowerCaseMapping:0xFA53 + ,simpleTitleCaseMapping:0xFA53 + }, + { code:0xFA54 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA54 + ,simpleLowerCaseMapping:0xFA54 + ,simpleTitleCaseMapping:0xFA54 + }, + { code:0xFA55 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA55 + ,simpleLowerCaseMapping:0xFA55 + ,simpleTitleCaseMapping:0xFA55 + }, + { code:0xFA56 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA56 + ,simpleLowerCaseMapping:0xFA56 + ,simpleTitleCaseMapping:0xFA56 + }, + { code:0xFA57 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA57 + ,simpleLowerCaseMapping:0xFA57 + ,simpleTitleCaseMapping:0xFA57 + }, + { code:0xFA58 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA58 + ,simpleLowerCaseMapping:0xFA58 + ,simpleTitleCaseMapping:0xFA58 + }, + { code:0xFA59 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA59 + ,simpleLowerCaseMapping:0xFA59 + ,simpleTitleCaseMapping:0xFA59 + }, + { code:0xFA5A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA5A + ,simpleLowerCaseMapping:0xFA5A + ,simpleTitleCaseMapping:0xFA5A + }, + { code:0xFA5B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA5B + ,simpleLowerCaseMapping:0xFA5B + ,simpleTitleCaseMapping:0xFA5B + }, + { code:0xFA5C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA5C + ,simpleLowerCaseMapping:0xFA5C + ,simpleTitleCaseMapping:0xFA5C + }, + { code:0xFA5D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA5D + ,simpleLowerCaseMapping:0xFA5D + ,simpleTitleCaseMapping:0xFA5D + }, + { code:0xFA5E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA5E + ,simpleLowerCaseMapping:0xFA5E + ,simpleTitleCaseMapping:0xFA5E + }, + { code:0xFA5F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA5F + ,simpleLowerCaseMapping:0xFA5F + ,simpleTitleCaseMapping:0xFA5F + }, + { code:0xFA60 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA60 + ,simpleLowerCaseMapping:0xFA60 + ,simpleTitleCaseMapping:0xFA60 + }, + { code:0xFA61 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA61 + ,simpleLowerCaseMapping:0xFA61 + ,simpleTitleCaseMapping:0xFA61 + }, + { code:0xFA62 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA62 + ,simpleLowerCaseMapping:0xFA62 + ,simpleTitleCaseMapping:0xFA62 + }, + { code:0xFA63 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA63 + ,simpleLowerCaseMapping:0xFA63 + ,simpleTitleCaseMapping:0xFA63 + }, + { code:0xFA64 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA64 + ,simpleLowerCaseMapping:0xFA64 + ,simpleTitleCaseMapping:0xFA64 + }, + { code:0xFA65 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA65 + ,simpleLowerCaseMapping:0xFA65 + ,simpleTitleCaseMapping:0xFA65 + }, + { code:0xFA66 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA66 + ,simpleLowerCaseMapping:0xFA66 + ,simpleTitleCaseMapping:0xFA66 + }, + { code:0xFA67 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA67 + ,simpleLowerCaseMapping:0xFA67 + ,simpleTitleCaseMapping:0xFA67 + }, + { code:0xFA68 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA68 + ,simpleLowerCaseMapping:0xFA68 + ,simpleTitleCaseMapping:0xFA68 + }, + { code:0xFA69 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA69 + ,simpleLowerCaseMapping:0xFA69 + ,simpleTitleCaseMapping:0xFA69 + }, + { code:0xFA6A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA6A + ,simpleLowerCaseMapping:0xFA6A + ,simpleTitleCaseMapping:0xFA6A + }, + { code:0xFA70 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA70 + ,simpleLowerCaseMapping:0xFA70 + ,simpleTitleCaseMapping:0xFA70 + }, + { code:0xFA71 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA71 + ,simpleLowerCaseMapping:0xFA71 + ,simpleTitleCaseMapping:0xFA71 + }, + { code:0xFA72 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA72 + ,simpleLowerCaseMapping:0xFA72 + ,simpleTitleCaseMapping:0xFA72 + }, + { code:0xFA73 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA73 + ,simpleLowerCaseMapping:0xFA73 + ,simpleTitleCaseMapping:0xFA73 + }, + { code:0xFA74 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA74 + ,simpleLowerCaseMapping:0xFA74 + ,simpleTitleCaseMapping:0xFA74 + }, + { code:0xFA75 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA75 + ,simpleLowerCaseMapping:0xFA75 + ,simpleTitleCaseMapping:0xFA75 + }, + { code:0xFA76 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA76 + ,simpleLowerCaseMapping:0xFA76 + ,simpleTitleCaseMapping:0xFA76 + }, + { code:0xFA77 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA77 + ,simpleLowerCaseMapping:0xFA77 + ,simpleTitleCaseMapping:0xFA77 + }, + { code:0xFA78 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA78 + ,simpleLowerCaseMapping:0xFA78 + ,simpleTitleCaseMapping:0xFA78 + }, + { code:0xFA79 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA79 + ,simpleLowerCaseMapping:0xFA79 + ,simpleTitleCaseMapping:0xFA79 + }, + { code:0xFA7A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA7A + ,simpleLowerCaseMapping:0xFA7A + ,simpleTitleCaseMapping:0xFA7A + }, + { code:0xFA7B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA7B + ,simpleLowerCaseMapping:0xFA7B + ,simpleTitleCaseMapping:0xFA7B + }, + { code:0xFA7C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA7C + ,simpleLowerCaseMapping:0xFA7C + ,simpleTitleCaseMapping:0xFA7C + }, + { code:0xFA7D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA7D + ,simpleLowerCaseMapping:0xFA7D + ,simpleTitleCaseMapping:0xFA7D + }, + { code:0xFA7E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA7E + ,simpleLowerCaseMapping:0xFA7E + ,simpleTitleCaseMapping:0xFA7E + }, + { code:0xFA7F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA7F + ,simpleLowerCaseMapping:0xFA7F + ,simpleTitleCaseMapping:0xFA7F + }, + { code:0xFA80 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA80 + ,simpleLowerCaseMapping:0xFA80 + ,simpleTitleCaseMapping:0xFA80 + }, + { code:0xFA81 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA81 + ,simpleLowerCaseMapping:0xFA81 + ,simpleTitleCaseMapping:0xFA81 + }, + { code:0xFA82 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA82 + ,simpleLowerCaseMapping:0xFA82 + ,simpleTitleCaseMapping:0xFA82 + }, + { code:0xFA83 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA83 + ,simpleLowerCaseMapping:0xFA83 + ,simpleTitleCaseMapping:0xFA83 + }, + { code:0xFA84 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA84 + ,simpleLowerCaseMapping:0xFA84 + ,simpleTitleCaseMapping:0xFA84 + }, + { code:0xFA85 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA85 + ,simpleLowerCaseMapping:0xFA85 + ,simpleTitleCaseMapping:0xFA85 + }, + { code:0xFA86 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA86 + ,simpleLowerCaseMapping:0xFA86 + ,simpleTitleCaseMapping:0xFA86 + }, + { code:0xFA87 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA87 + ,simpleLowerCaseMapping:0xFA87 + ,simpleTitleCaseMapping:0xFA87 + }, + { code:0xFA88 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA88 + ,simpleLowerCaseMapping:0xFA88 + ,simpleTitleCaseMapping:0xFA88 + }, + { code:0xFA89 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA89 + ,simpleLowerCaseMapping:0xFA89 + ,simpleTitleCaseMapping:0xFA89 + }, + { code:0xFA8A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA8A + ,simpleLowerCaseMapping:0xFA8A + ,simpleTitleCaseMapping:0xFA8A + }, + { code:0xFA8B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA8B + ,simpleLowerCaseMapping:0xFA8B + ,simpleTitleCaseMapping:0xFA8B + }, + { code:0xFA8C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA8C + ,simpleLowerCaseMapping:0xFA8C + ,simpleTitleCaseMapping:0xFA8C + }, + { code:0xFA8D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA8D + ,simpleLowerCaseMapping:0xFA8D + ,simpleTitleCaseMapping:0xFA8D + }, + { code:0xFA8E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA8E + ,simpleLowerCaseMapping:0xFA8E + ,simpleTitleCaseMapping:0xFA8E + }, + { code:0xFA8F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA8F + ,simpleLowerCaseMapping:0xFA8F + ,simpleTitleCaseMapping:0xFA8F + }, + { code:0xFA90 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA90 + ,simpleLowerCaseMapping:0xFA90 + ,simpleTitleCaseMapping:0xFA90 + }, + { code:0xFA91 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA91 + ,simpleLowerCaseMapping:0xFA91 + ,simpleTitleCaseMapping:0xFA91 + }, + { code:0xFA92 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA92 + ,simpleLowerCaseMapping:0xFA92 + ,simpleTitleCaseMapping:0xFA92 + }, + { code:0xFA93 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA93 + ,simpleLowerCaseMapping:0xFA93 + ,simpleTitleCaseMapping:0xFA93 + }, + { code:0xFA94 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA94 + ,simpleLowerCaseMapping:0xFA94 + ,simpleTitleCaseMapping:0xFA94 + }, + { code:0xFA95 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA95 + ,simpleLowerCaseMapping:0xFA95 + ,simpleTitleCaseMapping:0xFA95 + }, + { code:0xFA96 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA96 + ,simpleLowerCaseMapping:0xFA96 + ,simpleTitleCaseMapping:0xFA96 + }, + { code:0xFA97 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA97 + ,simpleLowerCaseMapping:0xFA97 + ,simpleTitleCaseMapping:0xFA97 + }, + { code:0xFA98 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA98 + ,simpleLowerCaseMapping:0xFA98 + ,simpleTitleCaseMapping:0xFA98 + }, + { code:0xFA99 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA99 + ,simpleLowerCaseMapping:0xFA99 + ,simpleTitleCaseMapping:0xFA99 + }, + { code:0xFA9A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA9A + ,simpleLowerCaseMapping:0xFA9A + ,simpleTitleCaseMapping:0xFA9A + }, + { code:0xFA9B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA9B + ,simpleLowerCaseMapping:0xFA9B + ,simpleTitleCaseMapping:0xFA9B + }, + { code:0xFA9C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA9C + ,simpleLowerCaseMapping:0xFA9C + ,simpleTitleCaseMapping:0xFA9C + }, + { code:0xFA9D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA9D + ,simpleLowerCaseMapping:0xFA9D + ,simpleTitleCaseMapping:0xFA9D + }, + { code:0xFA9E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA9E + ,simpleLowerCaseMapping:0xFA9E + ,simpleTitleCaseMapping:0xFA9E + }, + { code:0xFA9F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFA9F + ,simpleLowerCaseMapping:0xFA9F + ,simpleTitleCaseMapping:0xFA9F + }, + { code:0xFAA0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAA0 + ,simpleLowerCaseMapping:0xFAA0 + ,simpleTitleCaseMapping:0xFAA0 + }, + { code:0xFAA1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAA1 + ,simpleLowerCaseMapping:0xFAA1 + ,simpleTitleCaseMapping:0xFAA1 + }, + { code:0xFAA2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAA2 + ,simpleLowerCaseMapping:0xFAA2 + ,simpleTitleCaseMapping:0xFAA2 + }, + { code:0xFAA3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAA3 + ,simpleLowerCaseMapping:0xFAA3 + ,simpleTitleCaseMapping:0xFAA3 + }, + { code:0xFAA4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAA4 + ,simpleLowerCaseMapping:0xFAA4 + ,simpleTitleCaseMapping:0xFAA4 + }, + { code:0xFAA5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAA5 + ,simpleLowerCaseMapping:0xFAA5 + ,simpleTitleCaseMapping:0xFAA5 + }, + { code:0xFAA6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAA6 + ,simpleLowerCaseMapping:0xFAA6 + ,simpleTitleCaseMapping:0xFAA6 + }, + { code:0xFAA7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAA7 + ,simpleLowerCaseMapping:0xFAA7 + ,simpleTitleCaseMapping:0xFAA7 + }, + { code:0xFAA8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAA8 + ,simpleLowerCaseMapping:0xFAA8 + ,simpleTitleCaseMapping:0xFAA8 + }, + { code:0xFAA9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAA9 + ,simpleLowerCaseMapping:0xFAA9 + ,simpleTitleCaseMapping:0xFAA9 + }, + { code:0xFAAA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAAA + ,simpleLowerCaseMapping:0xFAAA + ,simpleTitleCaseMapping:0xFAAA + }, + { code:0xFAAB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAAB + ,simpleLowerCaseMapping:0xFAAB + ,simpleTitleCaseMapping:0xFAAB + }, + { code:0xFAAC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAAC + ,simpleLowerCaseMapping:0xFAAC + ,simpleTitleCaseMapping:0xFAAC + }, + { code:0xFAAD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAAD + ,simpleLowerCaseMapping:0xFAAD + ,simpleTitleCaseMapping:0xFAAD + }, + { code:0xFAAE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAAE + ,simpleLowerCaseMapping:0xFAAE + ,simpleTitleCaseMapping:0xFAAE + }, + { code:0xFAAF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAAF + ,simpleLowerCaseMapping:0xFAAF + ,simpleTitleCaseMapping:0xFAAF + }, + { code:0xFAB0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAB0 + ,simpleLowerCaseMapping:0xFAB0 + ,simpleTitleCaseMapping:0xFAB0 + }, + { code:0xFAB1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAB1 + ,simpleLowerCaseMapping:0xFAB1 + ,simpleTitleCaseMapping:0xFAB1 + }, + { code:0xFAB2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAB2 + ,simpleLowerCaseMapping:0xFAB2 + ,simpleTitleCaseMapping:0xFAB2 + }, + { code:0xFAB3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAB3 + ,simpleLowerCaseMapping:0xFAB3 + ,simpleTitleCaseMapping:0xFAB3 + }, + { code:0xFAB4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAB4 + ,simpleLowerCaseMapping:0xFAB4 + ,simpleTitleCaseMapping:0xFAB4 + }, + { code:0xFAB5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAB5 + ,simpleLowerCaseMapping:0xFAB5 + ,simpleTitleCaseMapping:0xFAB5 + }, + { code:0xFAB6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAB6 + ,simpleLowerCaseMapping:0xFAB6 + ,simpleTitleCaseMapping:0xFAB6 + }, + { code:0xFAB7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAB7 + ,simpleLowerCaseMapping:0xFAB7 + ,simpleTitleCaseMapping:0xFAB7 + }, + { code:0xFAB8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAB8 + ,simpleLowerCaseMapping:0xFAB8 + ,simpleTitleCaseMapping:0xFAB8 + }, + { code:0xFAB9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAB9 + ,simpleLowerCaseMapping:0xFAB9 + ,simpleTitleCaseMapping:0xFAB9 + }, + { code:0xFABA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFABA + ,simpleLowerCaseMapping:0xFABA + ,simpleTitleCaseMapping:0xFABA + }, + { code:0xFABB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFABB + ,simpleLowerCaseMapping:0xFABB + ,simpleTitleCaseMapping:0xFABB + }, + { code:0xFABC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFABC + ,simpleLowerCaseMapping:0xFABC + ,simpleTitleCaseMapping:0xFABC + }, + { code:0xFABD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFABD + ,simpleLowerCaseMapping:0xFABD + ,simpleTitleCaseMapping:0xFABD + }, + { code:0xFABE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFABE + ,simpleLowerCaseMapping:0xFABE + ,simpleTitleCaseMapping:0xFABE + }, + { code:0xFABF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFABF + ,simpleLowerCaseMapping:0xFABF + ,simpleTitleCaseMapping:0xFABF + }, + { code:0xFAC0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAC0 + ,simpleLowerCaseMapping:0xFAC0 + ,simpleTitleCaseMapping:0xFAC0 + }, + { code:0xFAC1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAC1 + ,simpleLowerCaseMapping:0xFAC1 + ,simpleTitleCaseMapping:0xFAC1 + }, + { code:0xFAC2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAC2 + ,simpleLowerCaseMapping:0xFAC2 + ,simpleTitleCaseMapping:0xFAC2 + }, + { code:0xFAC3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAC3 + ,simpleLowerCaseMapping:0xFAC3 + ,simpleTitleCaseMapping:0xFAC3 + }, + { code:0xFAC4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAC4 + ,simpleLowerCaseMapping:0xFAC4 + ,simpleTitleCaseMapping:0xFAC4 + }, + { code:0xFAC5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAC5 + ,simpleLowerCaseMapping:0xFAC5 + ,simpleTitleCaseMapping:0xFAC5 + }, + { code:0xFAC6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAC6 + ,simpleLowerCaseMapping:0xFAC6 + ,simpleTitleCaseMapping:0xFAC6 + }, + { code:0xFAC7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAC7 + ,simpleLowerCaseMapping:0xFAC7 + ,simpleTitleCaseMapping:0xFAC7 + }, + { code:0xFAC8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAC8 + ,simpleLowerCaseMapping:0xFAC8 + ,simpleTitleCaseMapping:0xFAC8 + }, + { code:0xFAC9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAC9 + ,simpleLowerCaseMapping:0xFAC9 + ,simpleTitleCaseMapping:0xFAC9 + }, + { code:0xFACA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFACA + ,simpleLowerCaseMapping:0xFACA + ,simpleTitleCaseMapping:0xFACA + }, + { code:0xFACB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFACB + ,simpleLowerCaseMapping:0xFACB + ,simpleTitleCaseMapping:0xFACB + }, + { code:0xFACC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFACC + ,simpleLowerCaseMapping:0xFACC + ,simpleTitleCaseMapping:0xFACC + }, + { code:0xFACD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFACD + ,simpleLowerCaseMapping:0xFACD + ,simpleTitleCaseMapping:0xFACD + }, + { code:0xFACE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFACE + ,simpleLowerCaseMapping:0xFACE + ,simpleTitleCaseMapping:0xFACE + }, + { code:0xFACF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFACF + ,simpleLowerCaseMapping:0xFACF + ,simpleTitleCaseMapping:0xFACF + }, + { code:0xFAD0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAD0 + ,simpleLowerCaseMapping:0xFAD0 + ,simpleTitleCaseMapping:0xFAD0 + }, + { code:0xFAD1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAD1 + ,simpleLowerCaseMapping:0xFAD1 + ,simpleTitleCaseMapping:0xFAD1 + }, + { code:0xFAD2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAD2 + ,simpleLowerCaseMapping:0xFAD2 + ,simpleTitleCaseMapping:0xFAD2 + }, + { code:0xFAD3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAD3 + ,simpleLowerCaseMapping:0xFAD3 + ,simpleTitleCaseMapping:0xFAD3 + }, + { code:0xFAD4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAD4 + ,simpleLowerCaseMapping:0xFAD4 + ,simpleTitleCaseMapping:0xFAD4 + }, + { code:0xFAD5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAD5 + ,simpleLowerCaseMapping:0xFAD5 + ,simpleTitleCaseMapping:0xFAD5 + }, + { code:0xFAD6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAD6 + ,simpleLowerCaseMapping:0xFAD6 + ,simpleTitleCaseMapping:0xFAD6 + }, + { code:0xFAD7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAD7 + ,simpleLowerCaseMapping:0xFAD7 + ,simpleTitleCaseMapping:0xFAD7 + }, + { code:0xFAD8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAD8 + ,simpleLowerCaseMapping:0xFAD8 + ,simpleTitleCaseMapping:0xFAD8 + }, + { code:0xFAD9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFAD9 + ,simpleLowerCaseMapping:0xFAD9 + ,simpleTitleCaseMapping:0xFAD9 + }, + { code:0xFB00 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0xFB00 + ,simpleLowerCaseMapping:0xFB00 + ,simpleTitleCaseMapping:0xFB00 + }, + { code:0xFB01 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0xFB01 + ,simpleLowerCaseMapping:0xFB01 + ,simpleTitleCaseMapping:0xFB01 + }, + { code:0xFB02 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0xFB02 + ,simpleLowerCaseMapping:0xFB02 + ,simpleTitleCaseMapping:0xFB02 + }, + { code:0xFB03 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0xFB03 + ,simpleLowerCaseMapping:0xFB03 + ,simpleTitleCaseMapping:0xFB03 + }, + { code:0xFB04 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0xFB04 + ,simpleLowerCaseMapping:0xFB04 + ,simpleTitleCaseMapping:0xFB04 + }, + { code:0xFB05 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0xFB05 + ,simpleLowerCaseMapping:0xFB05 + ,simpleTitleCaseMapping:0xFB05 + }, + { code:0xFB06 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0xFB06 + ,simpleLowerCaseMapping:0xFB06 + ,simpleTitleCaseMapping:0xFB06 + }, + { code:0xFB13 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0xFB13 + ,simpleLowerCaseMapping:0xFB13 + ,simpleTitleCaseMapping:0xFB13 + }, + { code:0xFB14 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0xFB14 + ,simpleLowerCaseMapping:0xFB14 + ,simpleTitleCaseMapping:0xFB14 + }, + { code:0xFB15 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0xFB15 + ,simpleLowerCaseMapping:0xFB15 + ,simpleTitleCaseMapping:0xFB15 + }, + { code:0xFB16 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0xFB16 + ,simpleLowerCaseMapping:0xFB16 + ,simpleTitleCaseMapping:0xFB16 + }, + { code:0xFB17 + ,generalCategory:UnicodeData.GeneralCategory.Ll | UnicodeData.GeneralCategory.SpecialMapping + ,simpleUpperCaseMapping:0xFB17 + ,simpleLowerCaseMapping:0xFB17 + ,simpleTitleCaseMapping:0xFB17 + }, + { code:0xFB1D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB1D + ,simpleLowerCaseMapping:0xFB1D + ,simpleTitleCaseMapping:0xFB1D + }, + { code:0xFB1E + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xFB1E + ,simpleLowerCaseMapping:0xFB1E + ,simpleTitleCaseMapping:0xFB1E + }, + { code:0xFB1F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB1F + ,simpleLowerCaseMapping:0xFB1F + ,simpleTitleCaseMapping:0xFB1F + }, + { code:0xFB20 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB20 + ,simpleLowerCaseMapping:0xFB20 + ,simpleTitleCaseMapping:0xFB20 + }, + { code:0xFB21 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB21 + ,simpleLowerCaseMapping:0xFB21 + ,simpleTitleCaseMapping:0xFB21 + }, + { code:0xFB22 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB22 + ,simpleLowerCaseMapping:0xFB22 + ,simpleTitleCaseMapping:0xFB22 + }, + { code:0xFB23 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB23 + ,simpleLowerCaseMapping:0xFB23 + ,simpleTitleCaseMapping:0xFB23 + }, + { code:0xFB24 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB24 + ,simpleLowerCaseMapping:0xFB24 + ,simpleTitleCaseMapping:0xFB24 + }, + { code:0xFB25 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB25 + ,simpleLowerCaseMapping:0xFB25 + ,simpleTitleCaseMapping:0xFB25 + }, + { code:0xFB26 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB26 + ,simpleLowerCaseMapping:0xFB26 + ,simpleTitleCaseMapping:0xFB26 + }, + { code:0xFB27 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB27 + ,simpleLowerCaseMapping:0xFB27 + ,simpleTitleCaseMapping:0xFB27 + }, + { code:0xFB28 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB28 + ,simpleLowerCaseMapping:0xFB28 + ,simpleTitleCaseMapping:0xFB28 + }, + { code:0xFB29 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0xFB29 + ,simpleLowerCaseMapping:0xFB29 + ,simpleTitleCaseMapping:0xFB29 + }, + { code:0xFB2A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB2A + ,simpleLowerCaseMapping:0xFB2A + ,simpleTitleCaseMapping:0xFB2A + }, + { code:0xFB2B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB2B + ,simpleLowerCaseMapping:0xFB2B + ,simpleTitleCaseMapping:0xFB2B + }, + { code:0xFB2C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB2C + ,simpleLowerCaseMapping:0xFB2C + ,simpleTitleCaseMapping:0xFB2C + }, + { code:0xFB2D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB2D + ,simpleLowerCaseMapping:0xFB2D + ,simpleTitleCaseMapping:0xFB2D + }, + { code:0xFB2E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB2E + ,simpleLowerCaseMapping:0xFB2E + ,simpleTitleCaseMapping:0xFB2E + }, + { code:0xFB2F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB2F + ,simpleLowerCaseMapping:0xFB2F + ,simpleTitleCaseMapping:0xFB2F + }, + { code:0xFB30 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB30 + ,simpleLowerCaseMapping:0xFB30 + ,simpleTitleCaseMapping:0xFB30 + }, + { code:0xFB31 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB31 + ,simpleLowerCaseMapping:0xFB31 + ,simpleTitleCaseMapping:0xFB31 + }, + { code:0xFB32 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB32 + ,simpleLowerCaseMapping:0xFB32 + ,simpleTitleCaseMapping:0xFB32 + }, + { code:0xFB33 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB33 + ,simpleLowerCaseMapping:0xFB33 + ,simpleTitleCaseMapping:0xFB33 + }, + { code:0xFB34 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB34 + ,simpleLowerCaseMapping:0xFB34 + ,simpleTitleCaseMapping:0xFB34 + }, + { code:0xFB35 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB35 + ,simpleLowerCaseMapping:0xFB35 + ,simpleTitleCaseMapping:0xFB35 + }, + { code:0xFB36 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB36 + ,simpleLowerCaseMapping:0xFB36 + ,simpleTitleCaseMapping:0xFB36 + }, + { code:0xFB38 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB38 + ,simpleLowerCaseMapping:0xFB38 + ,simpleTitleCaseMapping:0xFB38 + }, + { code:0xFB39 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB39 + ,simpleLowerCaseMapping:0xFB39 + ,simpleTitleCaseMapping:0xFB39 + }, + { code:0xFB3A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB3A + ,simpleLowerCaseMapping:0xFB3A + ,simpleTitleCaseMapping:0xFB3A + }, + { code:0xFB3B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB3B + ,simpleLowerCaseMapping:0xFB3B + ,simpleTitleCaseMapping:0xFB3B + }, + { code:0xFB3C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB3C + ,simpleLowerCaseMapping:0xFB3C + ,simpleTitleCaseMapping:0xFB3C + }, + { code:0xFB3E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB3E + ,simpleLowerCaseMapping:0xFB3E + ,simpleTitleCaseMapping:0xFB3E + }, + { code:0xFB40 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB40 + ,simpleLowerCaseMapping:0xFB40 + ,simpleTitleCaseMapping:0xFB40 + }, + { code:0xFB41 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB41 + ,simpleLowerCaseMapping:0xFB41 + ,simpleTitleCaseMapping:0xFB41 + }, + { code:0xFB43 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB43 + ,simpleLowerCaseMapping:0xFB43 + ,simpleTitleCaseMapping:0xFB43 + }, + { code:0xFB44 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB44 + ,simpleLowerCaseMapping:0xFB44 + ,simpleTitleCaseMapping:0xFB44 + }, + { code:0xFB46 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB46 + ,simpleLowerCaseMapping:0xFB46 + ,simpleTitleCaseMapping:0xFB46 + }, + { code:0xFB47 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB47 + ,simpleLowerCaseMapping:0xFB47 + ,simpleTitleCaseMapping:0xFB47 + }, + { code:0xFB48 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB48 + ,simpleLowerCaseMapping:0xFB48 + ,simpleTitleCaseMapping:0xFB48 + }, + { code:0xFB49 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB49 + ,simpleLowerCaseMapping:0xFB49 + ,simpleTitleCaseMapping:0xFB49 + }, + { code:0xFB4A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB4A + ,simpleLowerCaseMapping:0xFB4A + ,simpleTitleCaseMapping:0xFB4A + }, + { code:0xFB4B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB4B + ,simpleLowerCaseMapping:0xFB4B + ,simpleTitleCaseMapping:0xFB4B + }, + { code:0xFB4C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB4C + ,simpleLowerCaseMapping:0xFB4C + ,simpleTitleCaseMapping:0xFB4C + }, + { code:0xFB4D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB4D + ,simpleLowerCaseMapping:0xFB4D + ,simpleTitleCaseMapping:0xFB4D + }, + { code:0xFB4E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB4E + ,simpleLowerCaseMapping:0xFB4E + ,simpleTitleCaseMapping:0xFB4E + }, + { code:0xFB4F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB4F + ,simpleLowerCaseMapping:0xFB4F + ,simpleTitleCaseMapping:0xFB4F + }, + { code:0xFB50 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB50 + ,simpleLowerCaseMapping:0xFB50 + ,simpleTitleCaseMapping:0xFB50 + }, + { code:0xFB51 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB51 + ,simpleLowerCaseMapping:0xFB51 + ,simpleTitleCaseMapping:0xFB51 + }, + { code:0xFB52 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB52 + ,simpleLowerCaseMapping:0xFB52 + ,simpleTitleCaseMapping:0xFB52 + }, + { code:0xFB53 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB53 + ,simpleLowerCaseMapping:0xFB53 + ,simpleTitleCaseMapping:0xFB53 + }, + { code:0xFB54 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB54 + ,simpleLowerCaseMapping:0xFB54 + ,simpleTitleCaseMapping:0xFB54 + }, + { code:0xFB55 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB55 + ,simpleLowerCaseMapping:0xFB55 + ,simpleTitleCaseMapping:0xFB55 + }, + { code:0xFB56 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB56 + ,simpleLowerCaseMapping:0xFB56 + ,simpleTitleCaseMapping:0xFB56 + }, + { code:0xFB57 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB57 + ,simpleLowerCaseMapping:0xFB57 + ,simpleTitleCaseMapping:0xFB57 + }, + { code:0xFB58 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB58 + ,simpleLowerCaseMapping:0xFB58 + ,simpleTitleCaseMapping:0xFB58 + }, + { code:0xFB59 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB59 + ,simpleLowerCaseMapping:0xFB59 + ,simpleTitleCaseMapping:0xFB59 + }, + { code:0xFB5A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB5A + ,simpleLowerCaseMapping:0xFB5A + ,simpleTitleCaseMapping:0xFB5A + }, + { code:0xFB5B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB5B + ,simpleLowerCaseMapping:0xFB5B + ,simpleTitleCaseMapping:0xFB5B + }, + { code:0xFB5C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB5C + ,simpleLowerCaseMapping:0xFB5C + ,simpleTitleCaseMapping:0xFB5C + }, + { code:0xFB5D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB5D + ,simpleLowerCaseMapping:0xFB5D + ,simpleTitleCaseMapping:0xFB5D + }, + { code:0xFB5E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB5E + ,simpleLowerCaseMapping:0xFB5E + ,simpleTitleCaseMapping:0xFB5E + }, + { code:0xFB5F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB5F + ,simpleLowerCaseMapping:0xFB5F + ,simpleTitleCaseMapping:0xFB5F + }, + { code:0xFB60 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB60 + ,simpleLowerCaseMapping:0xFB60 + ,simpleTitleCaseMapping:0xFB60 + }, + { code:0xFB61 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB61 + ,simpleLowerCaseMapping:0xFB61 + ,simpleTitleCaseMapping:0xFB61 + }, + { code:0xFB62 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB62 + ,simpleLowerCaseMapping:0xFB62 + ,simpleTitleCaseMapping:0xFB62 + }, + { code:0xFB63 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB63 + ,simpleLowerCaseMapping:0xFB63 + ,simpleTitleCaseMapping:0xFB63 + }, + { code:0xFB64 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB64 + ,simpleLowerCaseMapping:0xFB64 + ,simpleTitleCaseMapping:0xFB64 + }, + { code:0xFB65 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB65 + ,simpleLowerCaseMapping:0xFB65 + ,simpleTitleCaseMapping:0xFB65 + }, + { code:0xFB66 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB66 + ,simpleLowerCaseMapping:0xFB66 + ,simpleTitleCaseMapping:0xFB66 + }, + { code:0xFB67 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB67 + ,simpleLowerCaseMapping:0xFB67 + ,simpleTitleCaseMapping:0xFB67 + }, + { code:0xFB68 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB68 + ,simpleLowerCaseMapping:0xFB68 + ,simpleTitleCaseMapping:0xFB68 + }, + { code:0xFB69 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB69 + ,simpleLowerCaseMapping:0xFB69 + ,simpleTitleCaseMapping:0xFB69 + }, + { code:0xFB6A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB6A + ,simpleLowerCaseMapping:0xFB6A + ,simpleTitleCaseMapping:0xFB6A + }, + { code:0xFB6B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB6B + ,simpleLowerCaseMapping:0xFB6B + ,simpleTitleCaseMapping:0xFB6B + }, + { code:0xFB6C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB6C + ,simpleLowerCaseMapping:0xFB6C + ,simpleTitleCaseMapping:0xFB6C + }, + { code:0xFB6D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB6D + ,simpleLowerCaseMapping:0xFB6D + ,simpleTitleCaseMapping:0xFB6D + }, + { code:0xFB6E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB6E + ,simpleLowerCaseMapping:0xFB6E + ,simpleTitleCaseMapping:0xFB6E + }, + { code:0xFB6F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB6F + ,simpleLowerCaseMapping:0xFB6F + ,simpleTitleCaseMapping:0xFB6F + }, + { code:0xFB70 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB70 + ,simpleLowerCaseMapping:0xFB70 + ,simpleTitleCaseMapping:0xFB70 + }, + { code:0xFB71 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB71 + ,simpleLowerCaseMapping:0xFB71 + ,simpleTitleCaseMapping:0xFB71 + }, + { code:0xFB72 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB72 + ,simpleLowerCaseMapping:0xFB72 + ,simpleTitleCaseMapping:0xFB72 + }, + { code:0xFB73 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB73 + ,simpleLowerCaseMapping:0xFB73 + ,simpleTitleCaseMapping:0xFB73 + }, + { code:0xFB74 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB74 + ,simpleLowerCaseMapping:0xFB74 + ,simpleTitleCaseMapping:0xFB74 + }, + { code:0xFB75 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB75 + ,simpleLowerCaseMapping:0xFB75 + ,simpleTitleCaseMapping:0xFB75 + }, + { code:0xFB76 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB76 + ,simpleLowerCaseMapping:0xFB76 + ,simpleTitleCaseMapping:0xFB76 + }, + { code:0xFB77 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB77 + ,simpleLowerCaseMapping:0xFB77 + ,simpleTitleCaseMapping:0xFB77 + }, + { code:0xFB78 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB78 + ,simpleLowerCaseMapping:0xFB78 + ,simpleTitleCaseMapping:0xFB78 + }, + { code:0xFB79 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB79 + ,simpleLowerCaseMapping:0xFB79 + ,simpleTitleCaseMapping:0xFB79 + }, + { code:0xFB7A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB7A + ,simpleLowerCaseMapping:0xFB7A + ,simpleTitleCaseMapping:0xFB7A + }, + { code:0xFB7B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB7B + ,simpleLowerCaseMapping:0xFB7B + ,simpleTitleCaseMapping:0xFB7B + }, + { code:0xFB7C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB7C + ,simpleLowerCaseMapping:0xFB7C + ,simpleTitleCaseMapping:0xFB7C + }, + { code:0xFB7D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB7D + ,simpleLowerCaseMapping:0xFB7D + ,simpleTitleCaseMapping:0xFB7D + }, + { code:0xFB7E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB7E + ,simpleLowerCaseMapping:0xFB7E + ,simpleTitleCaseMapping:0xFB7E + }, + { code:0xFB7F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB7F + ,simpleLowerCaseMapping:0xFB7F + ,simpleTitleCaseMapping:0xFB7F + }, + { code:0xFB80 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB80 + ,simpleLowerCaseMapping:0xFB80 + ,simpleTitleCaseMapping:0xFB80 + }, + { code:0xFB81 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB81 + ,simpleLowerCaseMapping:0xFB81 + ,simpleTitleCaseMapping:0xFB81 + }, + { code:0xFB82 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB82 + ,simpleLowerCaseMapping:0xFB82 + ,simpleTitleCaseMapping:0xFB82 + }, + { code:0xFB83 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB83 + ,simpleLowerCaseMapping:0xFB83 + ,simpleTitleCaseMapping:0xFB83 + }, + { code:0xFB84 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB84 + ,simpleLowerCaseMapping:0xFB84 + ,simpleTitleCaseMapping:0xFB84 + }, + { code:0xFB85 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB85 + ,simpleLowerCaseMapping:0xFB85 + ,simpleTitleCaseMapping:0xFB85 + }, + { code:0xFB86 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB86 + ,simpleLowerCaseMapping:0xFB86 + ,simpleTitleCaseMapping:0xFB86 + }, + { code:0xFB87 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB87 + ,simpleLowerCaseMapping:0xFB87 + ,simpleTitleCaseMapping:0xFB87 + }, + { code:0xFB88 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB88 + ,simpleLowerCaseMapping:0xFB88 + ,simpleTitleCaseMapping:0xFB88 + }, + { code:0xFB89 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB89 + ,simpleLowerCaseMapping:0xFB89 + ,simpleTitleCaseMapping:0xFB89 + }, + { code:0xFB8A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB8A + ,simpleLowerCaseMapping:0xFB8A + ,simpleTitleCaseMapping:0xFB8A + }, + { code:0xFB8B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB8B + ,simpleLowerCaseMapping:0xFB8B + ,simpleTitleCaseMapping:0xFB8B + }, + { code:0xFB8C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB8C + ,simpleLowerCaseMapping:0xFB8C + ,simpleTitleCaseMapping:0xFB8C + }, + { code:0xFB8D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB8D + ,simpleLowerCaseMapping:0xFB8D + ,simpleTitleCaseMapping:0xFB8D + }, + { code:0xFB8E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB8E + ,simpleLowerCaseMapping:0xFB8E + ,simpleTitleCaseMapping:0xFB8E + }, + { code:0xFB8F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB8F + ,simpleLowerCaseMapping:0xFB8F + ,simpleTitleCaseMapping:0xFB8F + }, + { code:0xFB90 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB90 + ,simpleLowerCaseMapping:0xFB90 + ,simpleTitleCaseMapping:0xFB90 + }, + { code:0xFB91 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB91 + ,simpleLowerCaseMapping:0xFB91 + ,simpleTitleCaseMapping:0xFB91 + }, + { code:0xFB92 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB92 + ,simpleLowerCaseMapping:0xFB92 + ,simpleTitleCaseMapping:0xFB92 + }, + { code:0xFB93 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB93 + ,simpleLowerCaseMapping:0xFB93 + ,simpleTitleCaseMapping:0xFB93 + }, + { code:0xFB94 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB94 + ,simpleLowerCaseMapping:0xFB94 + ,simpleTitleCaseMapping:0xFB94 + }, + { code:0xFB95 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB95 + ,simpleLowerCaseMapping:0xFB95 + ,simpleTitleCaseMapping:0xFB95 + }, + { code:0xFB96 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB96 + ,simpleLowerCaseMapping:0xFB96 + ,simpleTitleCaseMapping:0xFB96 + }, + { code:0xFB97 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB97 + ,simpleLowerCaseMapping:0xFB97 + ,simpleTitleCaseMapping:0xFB97 + }, + { code:0xFB98 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB98 + ,simpleLowerCaseMapping:0xFB98 + ,simpleTitleCaseMapping:0xFB98 + }, + { code:0xFB99 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB99 + ,simpleLowerCaseMapping:0xFB99 + ,simpleTitleCaseMapping:0xFB99 + }, + { code:0xFB9A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB9A + ,simpleLowerCaseMapping:0xFB9A + ,simpleTitleCaseMapping:0xFB9A + }, + { code:0xFB9B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB9B + ,simpleLowerCaseMapping:0xFB9B + ,simpleTitleCaseMapping:0xFB9B + }, + { code:0xFB9C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB9C + ,simpleLowerCaseMapping:0xFB9C + ,simpleTitleCaseMapping:0xFB9C + }, + { code:0xFB9D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB9D + ,simpleLowerCaseMapping:0xFB9D + ,simpleTitleCaseMapping:0xFB9D + }, + { code:0xFB9E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB9E + ,simpleLowerCaseMapping:0xFB9E + ,simpleTitleCaseMapping:0xFB9E + }, + { code:0xFB9F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFB9F + ,simpleLowerCaseMapping:0xFB9F + ,simpleTitleCaseMapping:0xFB9F + }, + { code:0xFBA0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBA0 + ,simpleLowerCaseMapping:0xFBA0 + ,simpleTitleCaseMapping:0xFBA0 + }, + { code:0xFBA1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBA1 + ,simpleLowerCaseMapping:0xFBA1 + ,simpleTitleCaseMapping:0xFBA1 + }, + { code:0xFBA2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBA2 + ,simpleLowerCaseMapping:0xFBA2 + ,simpleTitleCaseMapping:0xFBA2 + }, + { code:0xFBA3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBA3 + ,simpleLowerCaseMapping:0xFBA3 + ,simpleTitleCaseMapping:0xFBA3 + }, + { code:0xFBA4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBA4 + ,simpleLowerCaseMapping:0xFBA4 + ,simpleTitleCaseMapping:0xFBA4 + }, + { code:0xFBA5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBA5 + ,simpleLowerCaseMapping:0xFBA5 + ,simpleTitleCaseMapping:0xFBA5 + }, + { code:0xFBA6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBA6 + ,simpleLowerCaseMapping:0xFBA6 + ,simpleTitleCaseMapping:0xFBA6 + }, + { code:0xFBA7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBA7 + ,simpleLowerCaseMapping:0xFBA7 + ,simpleTitleCaseMapping:0xFBA7 + }, + { code:0xFBA8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBA8 + ,simpleLowerCaseMapping:0xFBA8 + ,simpleTitleCaseMapping:0xFBA8 + }, + { code:0xFBA9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBA9 + ,simpleLowerCaseMapping:0xFBA9 + ,simpleTitleCaseMapping:0xFBA9 + }, + { code:0xFBAA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBAA + ,simpleLowerCaseMapping:0xFBAA + ,simpleTitleCaseMapping:0xFBAA + }, + { code:0xFBAB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBAB + ,simpleLowerCaseMapping:0xFBAB + ,simpleTitleCaseMapping:0xFBAB + }, + { code:0xFBAC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBAC + ,simpleLowerCaseMapping:0xFBAC + ,simpleTitleCaseMapping:0xFBAC + }, + { code:0xFBAD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBAD + ,simpleLowerCaseMapping:0xFBAD + ,simpleTitleCaseMapping:0xFBAD + }, + { code:0xFBAE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBAE + ,simpleLowerCaseMapping:0xFBAE + ,simpleTitleCaseMapping:0xFBAE + }, + { code:0xFBAF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBAF + ,simpleLowerCaseMapping:0xFBAF + ,simpleTitleCaseMapping:0xFBAF + }, + { code:0xFBB0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBB0 + ,simpleLowerCaseMapping:0xFBB0 + ,simpleTitleCaseMapping:0xFBB0 + }, + { code:0xFBB1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBB1 + ,simpleLowerCaseMapping:0xFBB1 + ,simpleTitleCaseMapping:0xFBB1 + }, + { code:0xFBD3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBD3 + ,simpleLowerCaseMapping:0xFBD3 + ,simpleTitleCaseMapping:0xFBD3 + }, + { code:0xFBD4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBD4 + ,simpleLowerCaseMapping:0xFBD4 + ,simpleTitleCaseMapping:0xFBD4 + }, + { code:0xFBD5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBD5 + ,simpleLowerCaseMapping:0xFBD5 + ,simpleTitleCaseMapping:0xFBD5 + }, + { code:0xFBD6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBD6 + ,simpleLowerCaseMapping:0xFBD6 + ,simpleTitleCaseMapping:0xFBD6 + }, + { code:0xFBD7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBD7 + ,simpleLowerCaseMapping:0xFBD7 + ,simpleTitleCaseMapping:0xFBD7 + }, + { code:0xFBD8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBD8 + ,simpleLowerCaseMapping:0xFBD8 + ,simpleTitleCaseMapping:0xFBD8 + }, + { code:0xFBD9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBD9 + ,simpleLowerCaseMapping:0xFBD9 + ,simpleTitleCaseMapping:0xFBD9 + }, + { code:0xFBDA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBDA + ,simpleLowerCaseMapping:0xFBDA + ,simpleTitleCaseMapping:0xFBDA + }, + { code:0xFBDB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBDB + ,simpleLowerCaseMapping:0xFBDB + ,simpleTitleCaseMapping:0xFBDB + }, + { code:0xFBDC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBDC + ,simpleLowerCaseMapping:0xFBDC + ,simpleTitleCaseMapping:0xFBDC + }, + { code:0xFBDD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBDD + ,simpleLowerCaseMapping:0xFBDD + ,simpleTitleCaseMapping:0xFBDD + }, + { code:0xFBDE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBDE + ,simpleLowerCaseMapping:0xFBDE + ,simpleTitleCaseMapping:0xFBDE + }, + { code:0xFBDF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBDF + ,simpleLowerCaseMapping:0xFBDF + ,simpleTitleCaseMapping:0xFBDF + }, + { code:0xFBE0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBE0 + ,simpleLowerCaseMapping:0xFBE0 + ,simpleTitleCaseMapping:0xFBE0 + }, + { code:0xFBE1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBE1 + ,simpleLowerCaseMapping:0xFBE1 + ,simpleTitleCaseMapping:0xFBE1 + }, + { code:0xFBE2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBE2 + ,simpleLowerCaseMapping:0xFBE2 + ,simpleTitleCaseMapping:0xFBE2 + }, + { code:0xFBE3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBE3 + ,simpleLowerCaseMapping:0xFBE3 + ,simpleTitleCaseMapping:0xFBE3 + }, + { code:0xFBE4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBE4 + ,simpleLowerCaseMapping:0xFBE4 + ,simpleTitleCaseMapping:0xFBE4 + }, + { code:0xFBE5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBE5 + ,simpleLowerCaseMapping:0xFBE5 + ,simpleTitleCaseMapping:0xFBE5 + }, + { code:0xFBE6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBE6 + ,simpleLowerCaseMapping:0xFBE6 + ,simpleTitleCaseMapping:0xFBE6 + }, + { code:0xFBE7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBE7 + ,simpleLowerCaseMapping:0xFBE7 + ,simpleTitleCaseMapping:0xFBE7 + }, + { code:0xFBE8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBE8 + ,simpleLowerCaseMapping:0xFBE8 + ,simpleTitleCaseMapping:0xFBE8 + }, + { code:0xFBE9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBE9 + ,simpleLowerCaseMapping:0xFBE9 + ,simpleTitleCaseMapping:0xFBE9 + }, + { code:0xFBEA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBEA + ,simpleLowerCaseMapping:0xFBEA + ,simpleTitleCaseMapping:0xFBEA + }, + { code:0xFBEB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBEB + ,simpleLowerCaseMapping:0xFBEB + ,simpleTitleCaseMapping:0xFBEB + }, + { code:0xFBEC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBEC + ,simpleLowerCaseMapping:0xFBEC + ,simpleTitleCaseMapping:0xFBEC + }, + { code:0xFBED + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBED + ,simpleLowerCaseMapping:0xFBED + ,simpleTitleCaseMapping:0xFBED + }, + { code:0xFBEE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBEE + ,simpleLowerCaseMapping:0xFBEE + ,simpleTitleCaseMapping:0xFBEE + }, + { code:0xFBEF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBEF + ,simpleLowerCaseMapping:0xFBEF + ,simpleTitleCaseMapping:0xFBEF + }, + { code:0xFBF0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBF0 + ,simpleLowerCaseMapping:0xFBF0 + ,simpleTitleCaseMapping:0xFBF0 + }, + { code:0xFBF1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBF1 + ,simpleLowerCaseMapping:0xFBF1 + ,simpleTitleCaseMapping:0xFBF1 + }, + { code:0xFBF2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBF2 + ,simpleLowerCaseMapping:0xFBF2 + ,simpleTitleCaseMapping:0xFBF2 + }, + { code:0xFBF3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBF3 + ,simpleLowerCaseMapping:0xFBF3 + ,simpleTitleCaseMapping:0xFBF3 + }, + { code:0xFBF4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBF4 + ,simpleLowerCaseMapping:0xFBF4 + ,simpleTitleCaseMapping:0xFBF4 + }, + { code:0xFBF5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBF5 + ,simpleLowerCaseMapping:0xFBF5 + ,simpleTitleCaseMapping:0xFBF5 + }, + { code:0xFBF6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBF6 + ,simpleLowerCaseMapping:0xFBF6 + ,simpleTitleCaseMapping:0xFBF6 + }, + { code:0xFBF7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBF7 + ,simpleLowerCaseMapping:0xFBF7 + ,simpleTitleCaseMapping:0xFBF7 + }, + { code:0xFBF8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBF8 + ,simpleLowerCaseMapping:0xFBF8 + ,simpleTitleCaseMapping:0xFBF8 + }, + { code:0xFBF9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBF9 + ,simpleLowerCaseMapping:0xFBF9 + ,simpleTitleCaseMapping:0xFBF9 + }, + { code:0xFBFA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBFA + ,simpleLowerCaseMapping:0xFBFA + ,simpleTitleCaseMapping:0xFBFA + }, + { code:0xFBFB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBFB + ,simpleLowerCaseMapping:0xFBFB + ,simpleTitleCaseMapping:0xFBFB + }, + { code:0xFBFC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBFC + ,simpleLowerCaseMapping:0xFBFC + ,simpleTitleCaseMapping:0xFBFC + }, + { code:0xFBFD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBFD + ,simpleLowerCaseMapping:0xFBFD + ,simpleTitleCaseMapping:0xFBFD + }, + { code:0xFBFE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBFE + ,simpleLowerCaseMapping:0xFBFE + ,simpleTitleCaseMapping:0xFBFE + }, + { code:0xFBFF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFBFF + ,simpleLowerCaseMapping:0xFBFF + ,simpleTitleCaseMapping:0xFBFF + }, + { code:0xFC00 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC00 + ,simpleLowerCaseMapping:0xFC00 + ,simpleTitleCaseMapping:0xFC00 + }, + { code:0xFC01 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC01 + ,simpleLowerCaseMapping:0xFC01 + ,simpleTitleCaseMapping:0xFC01 + }, + { code:0xFC02 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC02 + ,simpleLowerCaseMapping:0xFC02 + ,simpleTitleCaseMapping:0xFC02 + }, + { code:0xFC03 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC03 + ,simpleLowerCaseMapping:0xFC03 + ,simpleTitleCaseMapping:0xFC03 + }, + { code:0xFC04 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC04 + ,simpleLowerCaseMapping:0xFC04 + ,simpleTitleCaseMapping:0xFC04 + }, + { code:0xFC05 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC05 + ,simpleLowerCaseMapping:0xFC05 + ,simpleTitleCaseMapping:0xFC05 + }, + { code:0xFC06 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC06 + ,simpleLowerCaseMapping:0xFC06 + ,simpleTitleCaseMapping:0xFC06 + }, + { code:0xFC07 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC07 + ,simpleLowerCaseMapping:0xFC07 + ,simpleTitleCaseMapping:0xFC07 + }, + { code:0xFC08 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC08 + ,simpleLowerCaseMapping:0xFC08 + ,simpleTitleCaseMapping:0xFC08 + }, + { code:0xFC09 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC09 + ,simpleLowerCaseMapping:0xFC09 + ,simpleTitleCaseMapping:0xFC09 + }, + { code:0xFC0A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC0A + ,simpleLowerCaseMapping:0xFC0A + ,simpleTitleCaseMapping:0xFC0A + }, + { code:0xFC0B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC0B + ,simpleLowerCaseMapping:0xFC0B + ,simpleTitleCaseMapping:0xFC0B + }, + { code:0xFC0C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC0C + ,simpleLowerCaseMapping:0xFC0C + ,simpleTitleCaseMapping:0xFC0C + }, + { code:0xFC0D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC0D + ,simpleLowerCaseMapping:0xFC0D + ,simpleTitleCaseMapping:0xFC0D + }, + { code:0xFC0E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC0E + ,simpleLowerCaseMapping:0xFC0E + ,simpleTitleCaseMapping:0xFC0E + }, + { code:0xFC0F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC0F + ,simpleLowerCaseMapping:0xFC0F + ,simpleTitleCaseMapping:0xFC0F + }, + { code:0xFC10 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC10 + ,simpleLowerCaseMapping:0xFC10 + ,simpleTitleCaseMapping:0xFC10 + }, + { code:0xFC11 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC11 + ,simpleLowerCaseMapping:0xFC11 + ,simpleTitleCaseMapping:0xFC11 + }, + { code:0xFC12 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC12 + ,simpleLowerCaseMapping:0xFC12 + ,simpleTitleCaseMapping:0xFC12 + }, + { code:0xFC13 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC13 + ,simpleLowerCaseMapping:0xFC13 + ,simpleTitleCaseMapping:0xFC13 + }, + { code:0xFC14 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC14 + ,simpleLowerCaseMapping:0xFC14 + ,simpleTitleCaseMapping:0xFC14 + }, + { code:0xFC15 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC15 + ,simpleLowerCaseMapping:0xFC15 + ,simpleTitleCaseMapping:0xFC15 + }, + { code:0xFC16 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC16 + ,simpleLowerCaseMapping:0xFC16 + ,simpleTitleCaseMapping:0xFC16 + }, + { code:0xFC17 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC17 + ,simpleLowerCaseMapping:0xFC17 + ,simpleTitleCaseMapping:0xFC17 + }, + { code:0xFC18 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC18 + ,simpleLowerCaseMapping:0xFC18 + ,simpleTitleCaseMapping:0xFC18 + }, + { code:0xFC19 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC19 + ,simpleLowerCaseMapping:0xFC19 + ,simpleTitleCaseMapping:0xFC19 + }, + { code:0xFC1A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC1A + ,simpleLowerCaseMapping:0xFC1A + ,simpleTitleCaseMapping:0xFC1A + }, + { code:0xFC1B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC1B + ,simpleLowerCaseMapping:0xFC1B + ,simpleTitleCaseMapping:0xFC1B + }, + { code:0xFC1C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC1C + ,simpleLowerCaseMapping:0xFC1C + ,simpleTitleCaseMapping:0xFC1C + }, + { code:0xFC1D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC1D + ,simpleLowerCaseMapping:0xFC1D + ,simpleTitleCaseMapping:0xFC1D + }, + { code:0xFC1E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC1E + ,simpleLowerCaseMapping:0xFC1E + ,simpleTitleCaseMapping:0xFC1E + }, + { code:0xFC1F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC1F + ,simpleLowerCaseMapping:0xFC1F + ,simpleTitleCaseMapping:0xFC1F + }, + { code:0xFC20 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC20 + ,simpleLowerCaseMapping:0xFC20 + ,simpleTitleCaseMapping:0xFC20 + }, + { code:0xFC21 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC21 + ,simpleLowerCaseMapping:0xFC21 + ,simpleTitleCaseMapping:0xFC21 + }, + { code:0xFC22 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC22 + ,simpleLowerCaseMapping:0xFC22 + ,simpleTitleCaseMapping:0xFC22 + }, + { code:0xFC23 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC23 + ,simpleLowerCaseMapping:0xFC23 + ,simpleTitleCaseMapping:0xFC23 + }, + { code:0xFC24 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC24 + ,simpleLowerCaseMapping:0xFC24 + ,simpleTitleCaseMapping:0xFC24 + }, + { code:0xFC25 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC25 + ,simpleLowerCaseMapping:0xFC25 + ,simpleTitleCaseMapping:0xFC25 + }, + { code:0xFC26 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC26 + ,simpleLowerCaseMapping:0xFC26 + ,simpleTitleCaseMapping:0xFC26 + }, + { code:0xFC27 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC27 + ,simpleLowerCaseMapping:0xFC27 + ,simpleTitleCaseMapping:0xFC27 + }, + { code:0xFC28 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC28 + ,simpleLowerCaseMapping:0xFC28 + ,simpleTitleCaseMapping:0xFC28 + }, + { code:0xFC29 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC29 + ,simpleLowerCaseMapping:0xFC29 + ,simpleTitleCaseMapping:0xFC29 + }, + { code:0xFC2A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC2A + ,simpleLowerCaseMapping:0xFC2A + ,simpleTitleCaseMapping:0xFC2A + }, + { code:0xFC2B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC2B + ,simpleLowerCaseMapping:0xFC2B + ,simpleTitleCaseMapping:0xFC2B + }, + { code:0xFC2C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC2C + ,simpleLowerCaseMapping:0xFC2C + ,simpleTitleCaseMapping:0xFC2C + }, + { code:0xFC2D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC2D + ,simpleLowerCaseMapping:0xFC2D + ,simpleTitleCaseMapping:0xFC2D + }, + { code:0xFC2E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC2E + ,simpleLowerCaseMapping:0xFC2E + ,simpleTitleCaseMapping:0xFC2E + }, + { code:0xFC2F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC2F + ,simpleLowerCaseMapping:0xFC2F + ,simpleTitleCaseMapping:0xFC2F + }, + { code:0xFC30 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC30 + ,simpleLowerCaseMapping:0xFC30 + ,simpleTitleCaseMapping:0xFC30 + }, + { code:0xFC31 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC31 + ,simpleLowerCaseMapping:0xFC31 + ,simpleTitleCaseMapping:0xFC31 + }, + { code:0xFC32 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC32 + ,simpleLowerCaseMapping:0xFC32 + ,simpleTitleCaseMapping:0xFC32 + }, + { code:0xFC33 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC33 + ,simpleLowerCaseMapping:0xFC33 + ,simpleTitleCaseMapping:0xFC33 + }, + { code:0xFC34 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC34 + ,simpleLowerCaseMapping:0xFC34 + ,simpleTitleCaseMapping:0xFC34 + }, + { code:0xFC35 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC35 + ,simpleLowerCaseMapping:0xFC35 + ,simpleTitleCaseMapping:0xFC35 + }, + { code:0xFC36 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC36 + ,simpleLowerCaseMapping:0xFC36 + ,simpleTitleCaseMapping:0xFC36 + }, + { code:0xFC37 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC37 + ,simpleLowerCaseMapping:0xFC37 + ,simpleTitleCaseMapping:0xFC37 + }, + { code:0xFC38 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC38 + ,simpleLowerCaseMapping:0xFC38 + ,simpleTitleCaseMapping:0xFC38 + }, + { code:0xFC39 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC39 + ,simpleLowerCaseMapping:0xFC39 + ,simpleTitleCaseMapping:0xFC39 + }, + { code:0xFC3A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC3A + ,simpleLowerCaseMapping:0xFC3A + ,simpleTitleCaseMapping:0xFC3A + }, + { code:0xFC3B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC3B + ,simpleLowerCaseMapping:0xFC3B + ,simpleTitleCaseMapping:0xFC3B + }, + { code:0xFC3C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC3C + ,simpleLowerCaseMapping:0xFC3C + ,simpleTitleCaseMapping:0xFC3C + }, + { code:0xFC3D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC3D + ,simpleLowerCaseMapping:0xFC3D + ,simpleTitleCaseMapping:0xFC3D + }, + { code:0xFC3E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC3E + ,simpleLowerCaseMapping:0xFC3E + ,simpleTitleCaseMapping:0xFC3E + }, + { code:0xFC3F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC3F + ,simpleLowerCaseMapping:0xFC3F + ,simpleTitleCaseMapping:0xFC3F + }, + { code:0xFC40 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC40 + ,simpleLowerCaseMapping:0xFC40 + ,simpleTitleCaseMapping:0xFC40 + }, + { code:0xFC41 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC41 + ,simpleLowerCaseMapping:0xFC41 + ,simpleTitleCaseMapping:0xFC41 + }, + { code:0xFC42 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC42 + ,simpleLowerCaseMapping:0xFC42 + ,simpleTitleCaseMapping:0xFC42 + }, + { code:0xFC43 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC43 + ,simpleLowerCaseMapping:0xFC43 + ,simpleTitleCaseMapping:0xFC43 + }, + { code:0xFC44 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC44 + ,simpleLowerCaseMapping:0xFC44 + ,simpleTitleCaseMapping:0xFC44 + }, + { code:0xFC45 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC45 + ,simpleLowerCaseMapping:0xFC45 + ,simpleTitleCaseMapping:0xFC45 + }, + { code:0xFC46 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC46 + ,simpleLowerCaseMapping:0xFC46 + ,simpleTitleCaseMapping:0xFC46 + }, + { code:0xFC47 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC47 + ,simpleLowerCaseMapping:0xFC47 + ,simpleTitleCaseMapping:0xFC47 + }, + { code:0xFC48 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC48 + ,simpleLowerCaseMapping:0xFC48 + ,simpleTitleCaseMapping:0xFC48 + }, + { code:0xFC49 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC49 + ,simpleLowerCaseMapping:0xFC49 + ,simpleTitleCaseMapping:0xFC49 + }, + { code:0xFC4A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC4A + ,simpleLowerCaseMapping:0xFC4A + ,simpleTitleCaseMapping:0xFC4A + }, + { code:0xFC4B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC4B + ,simpleLowerCaseMapping:0xFC4B + ,simpleTitleCaseMapping:0xFC4B + }, + { code:0xFC4C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC4C + ,simpleLowerCaseMapping:0xFC4C + ,simpleTitleCaseMapping:0xFC4C + }, + { code:0xFC4D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC4D + ,simpleLowerCaseMapping:0xFC4D + ,simpleTitleCaseMapping:0xFC4D + }, + { code:0xFC4E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC4E + ,simpleLowerCaseMapping:0xFC4E + ,simpleTitleCaseMapping:0xFC4E + }, + { code:0xFC4F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC4F + ,simpleLowerCaseMapping:0xFC4F + ,simpleTitleCaseMapping:0xFC4F + }, + { code:0xFC50 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC50 + ,simpleLowerCaseMapping:0xFC50 + ,simpleTitleCaseMapping:0xFC50 + }, + { code:0xFC51 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC51 + ,simpleLowerCaseMapping:0xFC51 + ,simpleTitleCaseMapping:0xFC51 + }, + { code:0xFC52 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC52 + ,simpleLowerCaseMapping:0xFC52 + ,simpleTitleCaseMapping:0xFC52 + }, + { code:0xFC53 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC53 + ,simpleLowerCaseMapping:0xFC53 + ,simpleTitleCaseMapping:0xFC53 + }, + { code:0xFC54 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC54 + ,simpleLowerCaseMapping:0xFC54 + ,simpleTitleCaseMapping:0xFC54 + }, + { code:0xFC55 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC55 + ,simpleLowerCaseMapping:0xFC55 + ,simpleTitleCaseMapping:0xFC55 + }, + { code:0xFC56 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC56 + ,simpleLowerCaseMapping:0xFC56 + ,simpleTitleCaseMapping:0xFC56 + }, + { code:0xFC57 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC57 + ,simpleLowerCaseMapping:0xFC57 + ,simpleTitleCaseMapping:0xFC57 + }, + { code:0xFC58 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC58 + ,simpleLowerCaseMapping:0xFC58 + ,simpleTitleCaseMapping:0xFC58 + }, + { code:0xFC59 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC59 + ,simpleLowerCaseMapping:0xFC59 + ,simpleTitleCaseMapping:0xFC59 + }, + { code:0xFC5A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC5A + ,simpleLowerCaseMapping:0xFC5A + ,simpleTitleCaseMapping:0xFC5A + }, + { code:0xFC5B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC5B + ,simpleLowerCaseMapping:0xFC5B + ,simpleTitleCaseMapping:0xFC5B + }, + { code:0xFC5C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC5C + ,simpleLowerCaseMapping:0xFC5C + ,simpleTitleCaseMapping:0xFC5C + }, + { code:0xFC5D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC5D + ,simpleLowerCaseMapping:0xFC5D + ,simpleTitleCaseMapping:0xFC5D + }, + { code:0xFC5E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC5E + ,simpleLowerCaseMapping:0xFC5E + ,simpleTitleCaseMapping:0xFC5E + }, + { code:0xFC5F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC5F + ,simpleLowerCaseMapping:0xFC5F + ,simpleTitleCaseMapping:0xFC5F + }, + { code:0xFC60 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC60 + ,simpleLowerCaseMapping:0xFC60 + ,simpleTitleCaseMapping:0xFC60 + }, + { code:0xFC61 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC61 + ,simpleLowerCaseMapping:0xFC61 + ,simpleTitleCaseMapping:0xFC61 + }, + { code:0xFC62 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC62 + ,simpleLowerCaseMapping:0xFC62 + ,simpleTitleCaseMapping:0xFC62 + }, + { code:0xFC63 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC63 + ,simpleLowerCaseMapping:0xFC63 + ,simpleTitleCaseMapping:0xFC63 + }, + { code:0xFC64 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC64 + ,simpleLowerCaseMapping:0xFC64 + ,simpleTitleCaseMapping:0xFC64 + }, + { code:0xFC65 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC65 + ,simpleLowerCaseMapping:0xFC65 + ,simpleTitleCaseMapping:0xFC65 + }, + { code:0xFC66 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC66 + ,simpleLowerCaseMapping:0xFC66 + ,simpleTitleCaseMapping:0xFC66 + }, + { code:0xFC67 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC67 + ,simpleLowerCaseMapping:0xFC67 + ,simpleTitleCaseMapping:0xFC67 + }, + { code:0xFC68 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC68 + ,simpleLowerCaseMapping:0xFC68 + ,simpleTitleCaseMapping:0xFC68 + }, + { code:0xFC69 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC69 + ,simpleLowerCaseMapping:0xFC69 + ,simpleTitleCaseMapping:0xFC69 + }, + { code:0xFC6A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC6A + ,simpleLowerCaseMapping:0xFC6A + ,simpleTitleCaseMapping:0xFC6A + }, + { code:0xFC6B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC6B + ,simpleLowerCaseMapping:0xFC6B + ,simpleTitleCaseMapping:0xFC6B + }, + { code:0xFC6C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC6C + ,simpleLowerCaseMapping:0xFC6C + ,simpleTitleCaseMapping:0xFC6C + }, + { code:0xFC6D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC6D + ,simpleLowerCaseMapping:0xFC6D + ,simpleTitleCaseMapping:0xFC6D + }, + { code:0xFC6E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC6E + ,simpleLowerCaseMapping:0xFC6E + ,simpleTitleCaseMapping:0xFC6E + }, + { code:0xFC6F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC6F + ,simpleLowerCaseMapping:0xFC6F + ,simpleTitleCaseMapping:0xFC6F + }, + { code:0xFC70 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC70 + ,simpleLowerCaseMapping:0xFC70 + ,simpleTitleCaseMapping:0xFC70 + }, + { code:0xFC71 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC71 + ,simpleLowerCaseMapping:0xFC71 + ,simpleTitleCaseMapping:0xFC71 + }, + { code:0xFC72 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC72 + ,simpleLowerCaseMapping:0xFC72 + ,simpleTitleCaseMapping:0xFC72 + }, + { code:0xFC73 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC73 + ,simpleLowerCaseMapping:0xFC73 + ,simpleTitleCaseMapping:0xFC73 + }, + { code:0xFC74 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC74 + ,simpleLowerCaseMapping:0xFC74 + ,simpleTitleCaseMapping:0xFC74 + }, + { code:0xFC75 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC75 + ,simpleLowerCaseMapping:0xFC75 + ,simpleTitleCaseMapping:0xFC75 + }, + { code:0xFC76 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC76 + ,simpleLowerCaseMapping:0xFC76 + ,simpleTitleCaseMapping:0xFC76 + }, + { code:0xFC77 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC77 + ,simpleLowerCaseMapping:0xFC77 + ,simpleTitleCaseMapping:0xFC77 + }, + { code:0xFC78 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC78 + ,simpleLowerCaseMapping:0xFC78 + ,simpleTitleCaseMapping:0xFC78 + }, + { code:0xFC79 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC79 + ,simpleLowerCaseMapping:0xFC79 + ,simpleTitleCaseMapping:0xFC79 + }, + { code:0xFC7A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC7A + ,simpleLowerCaseMapping:0xFC7A + ,simpleTitleCaseMapping:0xFC7A + }, + { code:0xFC7B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC7B + ,simpleLowerCaseMapping:0xFC7B + ,simpleTitleCaseMapping:0xFC7B + }, + { code:0xFC7C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC7C + ,simpleLowerCaseMapping:0xFC7C + ,simpleTitleCaseMapping:0xFC7C + }, + { code:0xFC7D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC7D + ,simpleLowerCaseMapping:0xFC7D + ,simpleTitleCaseMapping:0xFC7D + }, + { code:0xFC7E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC7E + ,simpleLowerCaseMapping:0xFC7E + ,simpleTitleCaseMapping:0xFC7E + }, + { code:0xFC7F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC7F + ,simpleLowerCaseMapping:0xFC7F + ,simpleTitleCaseMapping:0xFC7F + }, + { code:0xFC80 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC80 + ,simpleLowerCaseMapping:0xFC80 + ,simpleTitleCaseMapping:0xFC80 + }, + { code:0xFC81 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC81 + ,simpleLowerCaseMapping:0xFC81 + ,simpleTitleCaseMapping:0xFC81 + }, + { code:0xFC82 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC82 + ,simpleLowerCaseMapping:0xFC82 + ,simpleTitleCaseMapping:0xFC82 + }, + { code:0xFC83 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC83 + ,simpleLowerCaseMapping:0xFC83 + ,simpleTitleCaseMapping:0xFC83 + }, + { code:0xFC84 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC84 + ,simpleLowerCaseMapping:0xFC84 + ,simpleTitleCaseMapping:0xFC84 + }, + { code:0xFC85 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC85 + ,simpleLowerCaseMapping:0xFC85 + ,simpleTitleCaseMapping:0xFC85 + }, + { code:0xFC86 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC86 + ,simpleLowerCaseMapping:0xFC86 + ,simpleTitleCaseMapping:0xFC86 + }, + { code:0xFC87 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC87 + ,simpleLowerCaseMapping:0xFC87 + ,simpleTitleCaseMapping:0xFC87 + }, + { code:0xFC88 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC88 + ,simpleLowerCaseMapping:0xFC88 + ,simpleTitleCaseMapping:0xFC88 + }, + { code:0xFC89 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC89 + ,simpleLowerCaseMapping:0xFC89 + ,simpleTitleCaseMapping:0xFC89 + }, + { code:0xFC8A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC8A + ,simpleLowerCaseMapping:0xFC8A + ,simpleTitleCaseMapping:0xFC8A + }, + { code:0xFC8B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC8B + ,simpleLowerCaseMapping:0xFC8B + ,simpleTitleCaseMapping:0xFC8B + }, + { code:0xFC8C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC8C + ,simpleLowerCaseMapping:0xFC8C + ,simpleTitleCaseMapping:0xFC8C + }, + { code:0xFC8D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC8D + ,simpleLowerCaseMapping:0xFC8D + ,simpleTitleCaseMapping:0xFC8D + }, + { code:0xFC8E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC8E + ,simpleLowerCaseMapping:0xFC8E + ,simpleTitleCaseMapping:0xFC8E + }, + { code:0xFC8F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC8F + ,simpleLowerCaseMapping:0xFC8F + ,simpleTitleCaseMapping:0xFC8F + }, + { code:0xFC90 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC90 + ,simpleLowerCaseMapping:0xFC90 + ,simpleTitleCaseMapping:0xFC90 + }, + { code:0xFC91 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC91 + ,simpleLowerCaseMapping:0xFC91 + ,simpleTitleCaseMapping:0xFC91 + }, + { code:0xFC92 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC92 + ,simpleLowerCaseMapping:0xFC92 + ,simpleTitleCaseMapping:0xFC92 + }, + { code:0xFC93 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC93 + ,simpleLowerCaseMapping:0xFC93 + ,simpleTitleCaseMapping:0xFC93 + }, + { code:0xFC94 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC94 + ,simpleLowerCaseMapping:0xFC94 + ,simpleTitleCaseMapping:0xFC94 + }, + { code:0xFC95 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC95 + ,simpleLowerCaseMapping:0xFC95 + ,simpleTitleCaseMapping:0xFC95 + }, + { code:0xFC96 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC96 + ,simpleLowerCaseMapping:0xFC96 + ,simpleTitleCaseMapping:0xFC96 + }, + { code:0xFC97 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC97 + ,simpleLowerCaseMapping:0xFC97 + ,simpleTitleCaseMapping:0xFC97 + }, + { code:0xFC98 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC98 + ,simpleLowerCaseMapping:0xFC98 + ,simpleTitleCaseMapping:0xFC98 + }, + { code:0xFC99 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC99 + ,simpleLowerCaseMapping:0xFC99 + ,simpleTitleCaseMapping:0xFC99 + }, + { code:0xFC9A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC9A + ,simpleLowerCaseMapping:0xFC9A + ,simpleTitleCaseMapping:0xFC9A + }, + { code:0xFC9B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC9B + ,simpleLowerCaseMapping:0xFC9B + ,simpleTitleCaseMapping:0xFC9B + }, + { code:0xFC9C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC9C + ,simpleLowerCaseMapping:0xFC9C + ,simpleTitleCaseMapping:0xFC9C + }, + { code:0xFC9D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC9D + ,simpleLowerCaseMapping:0xFC9D + ,simpleTitleCaseMapping:0xFC9D + }, + { code:0xFC9E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC9E + ,simpleLowerCaseMapping:0xFC9E + ,simpleTitleCaseMapping:0xFC9E + }, + { code:0xFC9F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFC9F + ,simpleLowerCaseMapping:0xFC9F + ,simpleTitleCaseMapping:0xFC9F + }, + { code:0xFCA0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCA0 + ,simpleLowerCaseMapping:0xFCA0 + ,simpleTitleCaseMapping:0xFCA0 + }, + { code:0xFCA1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCA1 + ,simpleLowerCaseMapping:0xFCA1 + ,simpleTitleCaseMapping:0xFCA1 + }, + { code:0xFCA2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCA2 + ,simpleLowerCaseMapping:0xFCA2 + ,simpleTitleCaseMapping:0xFCA2 + }, + { code:0xFCA3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCA3 + ,simpleLowerCaseMapping:0xFCA3 + ,simpleTitleCaseMapping:0xFCA3 + }, + { code:0xFCA4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCA4 + ,simpleLowerCaseMapping:0xFCA4 + ,simpleTitleCaseMapping:0xFCA4 + }, + { code:0xFCA5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCA5 + ,simpleLowerCaseMapping:0xFCA5 + ,simpleTitleCaseMapping:0xFCA5 + }, + { code:0xFCA6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCA6 + ,simpleLowerCaseMapping:0xFCA6 + ,simpleTitleCaseMapping:0xFCA6 + }, + { code:0xFCA7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCA7 + ,simpleLowerCaseMapping:0xFCA7 + ,simpleTitleCaseMapping:0xFCA7 + }, + { code:0xFCA8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCA8 + ,simpleLowerCaseMapping:0xFCA8 + ,simpleTitleCaseMapping:0xFCA8 + }, + { code:0xFCA9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCA9 + ,simpleLowerCaseMapping:0xFCA9 + ,simpleTitleCaseMapping:0xFCA9 + }, + { code:0xFCAA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCAA + ,simpleLowerCaseMapping:0xFCAA + ,simpleTitleCaseMapping:0xFCAA + }, + { code:0xFCAB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCAB + ,simpleLowerCaseMapping:0xFCAB + ,simpleTitleCaseMapping:0xFCAB + }, + { code:0xFCAC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCAC + ,simpleLowerCaseMapping:0xFCAC + ,simpleTitleCaseMapping:0xFCAC + }, + { code:0xFCAD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCAD + ,simpleLowerCaseMapping:0xFCAD + ,simpleTitleCaseMapping:0xFCAD + }, + { code:0xFCAE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCAE + ,simpleLowerCaseMapping:0xFCAE + ,simpleTitleCaseMapping:0xFCAE + }, + { code:0xFCAF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCAF + ,simpleLowerCaseMapping:0xFCAF + ,simpleTitleCaseMapping:0xFCAF + }, + { code:0xFCB0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCB0 + ,simpleLowerCaseMapping:0xFCB0 + ,simpleTitleCaseMapping:0xFCB0 + }, + { code:0xFCB1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCB1 + ,simpleLowerCaseMapping:0xFCB1 + ,simpleTitleCaseMapping:0xFCB1 + }, + { code:0xFCB2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCB2 + ,simpleLowerCaseMapping:0xFCB2 + ,simpleTitleCaseMapping:0xFCB2 + }, + { code:0xFCB3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCB3 + ,simpleLowerCaseMapping:0xFCB3 + ,simpleTitleCaseMapping:0xFCB3 + }, + { code:0xFCB4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCB4 + ,simpleLowerCaseMapping:0xFCB4 + ,simpleTitleCaseMapping:0xFCB4 + }, + { code:0xFCB5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCB5 + ,simpleLowerCaseMapping:0xFCB5 + ,simpleTitleCaseMapping:0xFCB5 + }, + { code:0xFCB6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCB6 + ,simpleLowerCaseMapping:0xFCB6 + ,simpleTitleCaseMapping:0xFCB6 + }, + { code:0xFCB7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCB7 + ,simpleLowerCaseMapping:0xFCB7 + ,simpleTitleCaseMapping:0xFCB7 + }, + { code:0xFCB8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCB8 + ,simpleLowerCaseMapping:0xFCB8 + ,simpleTitleCaseMapping:0xFCB8 + }, + { code:0xFCB9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCB9 + ,simpleLowerCaseMapping:0xFCB9 + ,simpleTitleCaseMapping:0xFCB9 + }, + { code:0xFCBA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCBA + ,simpleLowerCaseMapping:0xFCBA + ,simpleTitleCaseMapping:0xFCBA + }, + { code:0xFCBB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCBB + ,simpleLowerCaseMapping:0xFCBB + ,simpleTitleCaseMapping:0xFCBB + }, + { code:0xFCBC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCBC + ,simpleLowerCaseMapping:0xFCBC + ,simpleTitleCaseMapping:0xFCBC + }, + { code:0xFCBD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCBD + ,simpleLowerCaseMapping:0xFCBD + ,simpleTitleCaseMapping:0xFCBD + }, + { code:0xFCBE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCBE + ,simpleLowerCaseMapping:0xFCBE + ,simpleTitleCaseMapping:0xFCBE + }, + { code:0xFCBF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCBF + ,simpleLowerCaseMapping:0xFCBF + ,simpleTitleCaseMapping:0xFCBF + }, + { code:0xFCC0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCC0 + ,simpleLowerCaseMapping:0xFCC0 + ,simpleTitleCaseMapping:0xFCC0 + }, + { code:0xFCC1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCC1 + ,simpleLowerCaseMapping:0xFCC1 + ,simpleTitleCaseMapping:0xFCC1 + }, + { code:0xFCC2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCC2 + ,simpleLowerCaseMapping:0xFCC2 + ,simpleTitleCaseMapping:0xFCC2 + }, + { code:0xFCC3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCC3 + ,simpleLowerCaseMapping:0xFCC3 + ,simpleTitleCaseMapping:0xFCC3 + }, + { code:0xFCC4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCC4 + ,simpleLowerCaseMapping:0xFCC4 + ,simpleTitleCaseMapping:0xFCC4 + }, + { code:0xFCC5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCC5 + ,simpleLowerCaseMapping:0xFCC5 + ,simpleTitleCaseMapping:0xFCC5 + }, + { code:0xFCC6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCC6 + ,simpleLowerCaseMapping:0xFCC6 + ,simpleTitleCaseMapping:0xFCC6 + }, + { code:0xFCC7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCC7 + ,simpleLowerCaseMapping:0xFCC7 + ,simpleTitleCaseMapping:0xFCC7 + }, + { code:0xFCC8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCC8 + ,simpleLowerCaseMapping:0xFCC8 + ,simpleTitleCaseMapping:0xFCC8 + }, + { code:0xFCC9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCC9 + ,simpleLowerCaseMapping:0xFCC9 + ,simpleTitleCaseMapping:0xFCC9 + }, + { code:0xFCCA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCCA + ,simpleLowerCaseMapping:0xFCCA + ,simpleTitleCaseMapping:0xFCCA + }, + { code:0xFCCB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCCB + ,simpleLowerCaseMapping:0xFCCB + ,simpleTitleCaseMapping:0xFCCB + }, + { code:0xFCCC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCCC + ,simpleLowerCaseMapping:0xFCCC + ,simpleTitleCaseMapping:0xFCCC + }, + { code:0xFCCD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCCD + ,simpleLowerCaseMapping:0xFCCD + ,simpleTitleCaseMapping:0xFCCD + }, + { code:0xFCCE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCCE + ,simpleLowerCaseMapping:0xFCCE + ,simpleTitleCaseMapping:0xFCCE + }, + { code:0xFCCF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCCF + ,simpleLowerCaseMapping:0xFCCF + ,simpleTitleCaseMapping:0xFCCF + }, + { code:0xFCD0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCD0 + ,simpleLowerCaseMapping:0xFCD0 + ,simpleTitleCaseMapping:0xFCD0 + }, + { code:0xFCD1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCD1 + ,simpleLowerCaseMapping:0xFCD1 + ,simpleTitleCaseMapping:0xFCD1 + }, + { code:0xFCD2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCD2 + ,simpleLowerCaseMapping:0xFCD2 + ,simpleTitleCaseMapping:0xFCD2 + }, + { code:0xFCD3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCD3 + ,simpleLowerCaseMapping:0xFCD3 + ,simpleTitleCaseMapping:0xFCD3 + }, + { code:0xFCD4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCD4 + ,simpleLowerCaseMapping:0xFCD4 + ,simpleTitleCaseMapping:0xFCD4 + }, + { code:0xFCD5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCD5 + ,simpleLowerCaseMapping:0xFCD5 + ,simpleTitleCaseMapping:0xFCD5 + }, + { code:0xFCD6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCD6 + ,simpleLowerCaseMapping:0xFCD6 + ,simpleTitleCaseMapping:0xFCD6 + }, + { code:0xFCD7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCD7 + ,simpleLowerCaseMapping:0xFCD7 + ,simpleTitleCaseMapping:0xFCD7 + }, + { code:0xFCD8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCD8 + ,simpleLowerCaseMapping:0xFCD8 + ,simpleTitleCaseMapping:0xFCD8 + }, + { code:0xFCD9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCD9 + ,simpleLowerCaseMapping:0xFCD9 + ,simpleTitleCaseMapping:0xFCD9 + }, + { code:0xFCDA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCDA + ,simpleLowerCaseMapping:0xFCDA + ,simpleTitleCaseMapping:0xFCDA + }, + { code:0xFCDB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCDB + ,simpleLowerCaseMapping:0xFCDB + ,simpleTitleCaseMapping:0xFCDB + }, + { code:0xFCDC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCDC + ,simpleLowerCaseMapping:0xFCDC + ,simpleTitleCaseMapping:0xFCDC + }, + { code:0xFCDD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCDD + ,simpleLowerCaseMapping:0xFCDD + ,simpleTitleCaseMapping:0xFCDD + }, + { code:0xFCDE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCDE + ,simpleLowerCaseMapping:0xFCDE + ,simpleTitleCaseMapping:0xFCDE + }, + { code:0xFCDF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCDF + ,simpleLowerCaseMapping:0xFCDF + ,simpleTitleCaseMapping:0xFCDF + }, + { code:0xFCE0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCE0 + ,simpleLowerCaseMapping:0xFCE0 + ,simpleTitleCaseMapping:0xFCE0 + }, + { code:0xFCE1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCE1 + ,simpleLowerCaseMapping:0xFCE1 + ,simpleTitleCaseMapping:0xFCE1 + }, + { code:0xFCE2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCE2 + ,simpleLowerCaseMapping:0xFCE2 + ,simpleTitleCaseMapping:0xFCE2 + }, + { code:0xFCE3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCE3 + ,simpleLowerCaseMapping:0xFCE3 + ,simpleTitleCaseMapping:0xFCE3 + }, + { code:0xFCE4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCE4 + ,simpleLowerCaseMapping:0xFCE4 + ,simpleTitleCaseMapping:0xFCE4 + }, + { code:0xFCE5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCE5 + ,simpleLowerCaseMapping:0xFCE5 + ,simpleTitleCaseMapping:0xFCE5 + }, + { code:0xFCE6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCE6 + ,simpleLowerCaseMapping:0xFCE6 + ,simpleTitleCaseMapping:0xFCE6 + }, + { code:0xFCE7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCE7 + ,simpleLowerCaseMapping:0xFCE7 + ,simpleTitleCaseMapping:0xFCE7 + }, + { code:0xFCE8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCE8 + ,simpleLowerCaseMapping:0xFCE8 + ,simpleTitleCaseMapping:0xFCE8 + }, + { code:0xFCE9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCE9 + ,simpleLowerCaseMapping:0xFCE9 + ,simpleTitleCaseMapping:0xFCE9 + }, + { code:0xFCEA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCEA + ,simpleLowerCaseMapping:0xFCEA + ,simpleTitleCaseMapping:0xFCEA + }, + { code:0xFCEB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCEB + ,simpleLowerCaseMapping:0xFCEB + ,simpleTitleCaseMapping:0xFCEB + }, + { code:0xFCEC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCEC + ,simpleLowerCaseMapping:0xFCEC + ,simpleTitleCaseMapping:0xFCEC + }, + { code:0xFCED + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCED + ,simpleLowerCaseMapping:0xFCED + ,simpleTitleCaseMapping:0xFCED + }, + { code:0xFCEE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCEE + ,simpleLowerCaseMapping:0xFCEE + ,simpleTitleCaseMapping:0xFCEE + }, + { code:0xFCEF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCEF + ,simpleLowerCaseMapping:0xFCEF + ,simpleTitleCaseMapping:0xFCEF + }, + { code:0xFCF0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCF0 + ,simpleLowerCaseMapping:0xFCF0 + ,simpleTitleCaseMapping:0xFCF0 + }, + { code:0xFCF1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCF1 + ,simpleLowerCaseMapping:0xFCF1 + ,simpleTitleCaseMapping:0xFCF1 + }, + { code:0xFCF2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCF2 + ,simpleLowerCaseMapping:0xFCF2 + ,simpleTitleCaseMapping:0xFCF2 + }, + { code:0xFCF3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCF3 + ,simpleLowerCaseMapping:0xFCF3 + ,simpleTitleCaseMapping:0xFCF3 + }, + { code:0xFCF4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCF4 + ,simpleLowerCaseMapping:0xFCF4 + ,simpleTitleCaseMapping:0xFCF4 + }, + { code:0xFCF5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCF5 + ,simpleLowerCaseMapping:0xFCF5 + ,simpleTitleCaseMapping:0xFCF5 + }, + { code:0xFCF6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCF6 + ,simpleLowerCaseMapping:0xFCF6 + ,simpleTitleCaseMapping:0xFCF6 + }, + { code:0xFCF7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCF7 + ,simpleLowerCaseMapping:0xFCF7 + ,simpleTitleCaseMapping:0xFCF7 + }, + { code:0xFCF8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCF8 + ,simpleLowerCaseMapping:0xFCF8 + ,simpleTitleCaseMapping:0xFCF8 + }, + { code:0xFCF9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCF9 + ,simpleLowerCaseMapping:0xFCF9 + ,simpleTitleCaseMapping:0xFCF9 + }, + { code:0xFCFA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCFA + ,simpleLowerCaseMapping:0xFCFA + ,simpleTitleCaseMapping:0xFCFA + }, + { code:0xFCFB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCFB + ,simpleLowerCaseMapping:0xFCFB + ,simpleTitleCaseMapping:0xFCFB + }, + { code:0xFCFC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCFC + ,simpleLowerCaseMapping:0xFCFC + ,simpleTitleCaseMapping:0xFCFC + }, + { code:0xFCFD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCFD + ,simpleLowerCaseMapping:0xFCFD + ,simpleTitleCaseMapping:0xFCFD + }, + { code:0xFCFE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCFE + ,simpleLowerCaseMapping:0xFCFE + ,simpleTitleCaseMapping:0xFCFE + }, + { code:0xFCFF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFCFF + ,simpleLowerCaseMapping:0xFCFF + ,simpleTitleCaseMapping:0xFCFF + }, + { code:0xFD00 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD00 + ,simpleLowerCaseMapping:0xFD00 + ,simpleTitleCaseMapping:0xFD00 + }, + { code:0xFD01 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD01 + ,simpleLowerCaseMapping:0xFD01 + ,simpleTitleCaseMapping:0xFD01 + }, + { code:0xFD02 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD02 + ,simpleLowerCaseMapping:0xFD02 + ,simpleTitleCaseMapping:0xFD02 + }, + { code:0xFD03 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD03 + ,simpleLowerCaseMapping:0xFD03 + ,simpleTitleCaseMapping:0xFD03 + }, + { code:0xFD04 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD04 + ,simpleLowerCaseMapping:0xFD04 + ,simpleTitleCaseMapping:0xFD04 + }, + { code:0xFD05 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD05 + ,simpleLowerCaseMapping:0xFD05 + ,simpleTitleCaseMapping:0xFD05 + }, + { code:0xFD06 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD06 + ,simpleLowerCaseMapping:0xFD06 + ,simpleTitleCaseMapping:0xFD06 + }, + { code:0xFD07 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD07 + ,simpleLowerCaseMapping:0xFD07 + ,simpleTitleCaseMapping:0xFD07 + }, + { code:0xFD08 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD08 + ,simpleLowerCaseMapping:0xFD08 + ,simpleTitleCaseMapping:0xFD08 + }, + { code:0xFD09 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD09 + ,simpleLowerCaseMapping:0xFD09 + ,simpleTitleCaseMapping:0xFD09 + }, + { code:0xFD0A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD0A + ,simpleLowerCaseMapping:0xFD0A + ,simpleTitleCaseMapping:0xFD0A + }, + { code:0xFD0B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD0B + ,simpleLowerCaseMapping:0xFD0B + ,simpleTitleCaseMapping:0xFD0B + }, + { code:0xFD0C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD0C + ,simpleLowerCaseMapping:0xFD0C + ,simpleTitleCaseMapping:0xFD0C + }, + { code:0xFD0D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD0D + ,simpleLowerCaseMapping:0xFD0D + ,simpleTitleCaseMapping:0xFD0D + }, + { code:0xFD0E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD0E + ,simpleLowerCaseMapping:0xFD0E + ,simpleTitleCaseMapping:0xFD0E + }, + { code:0xFD0F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD0F + ,simpleLowerCaseMapping:0xFD0F + ,simpleTitleCaseMapping:0xFD0F + }, + { code:0xFD10 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD10 + ,simpleLowerCaseMapping:0xFD10 + ,simpleTitleCaseMapping:0xFD10 + }, + { code:0xFD11 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD11 + ,simpleLowerCaseMapping:0xFD11 + ,simpleTitleCaseMapping:0xFD11 + }, + { code:0xFD12 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD12 + ,simpleLowerCaseMapping:0xFD12 + ,simpleTitleCaseMapping:0xFD12 + }, + { code:0xFD13 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD13 + ,simpleLowerCaseMapping:0xFD13 + ,simpleTitleCaseMapping:0xFD13 + }, + { code:0xFD14 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD14 + ,simpleLowerCaseMapping:0xFD14 + ,simpleTitleCaseMapping:0xFD14 + }, + { code:0xFD15 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD15 + ,simpleLowerCaseMapping:0xFD15 + ,simpleTitleCaseMapping:0xFD15 + }, + { code:0xFD16 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD16 + ,simpleLowerCaseMapping:0xFD16 + ,simpleTitleCaseMapping:0xFD16 + }, + { code:0xFD17 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD17 + ,simpleLowerCaseMapping:0xFD17 + ,simpleTitleCaseMapping:0xFD17 + }, + { code:0xFD18 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD18 + ,simpleLowerCaseMapping:0xFD18 + ,simpleTitleCaseMapping:0xFD18 + }, + { code:0xFD19 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD19 + ,simpleLowerCaseMapping:0xFD19 + ,simpleTitleCaseMapping:0xFD19 + }, + { code:0xFD1A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD1A + ,simpleLowerCaseMapping:0xFD1A + ,simpleTitleCaseMapping:0xFD1A + }, + { code:0xFD1B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD1B + ,simpleLowerCaseMapping:0xFD1B + ,simpleTitleCaseMapping:0xFD1B + }, + { code:0xFD1C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD1C + ,simpleLowerCaseMapping:0xFD1C + ,simpleTitleCaseMapping:0xFD1C + }, + { code:0xFD1D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD1D + ,simpleLowerCaseMapping:0xFD1D + ,simpleTitleCaseMapping:0xFD1D + }, + { code:0xFD1E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD1E + ,simpleLowerCaseMapping:0xFD1E + ,simpleTitleCaseMapping:0xFD1E + }, + { code:0xFD1F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD1F + ,simpleLowerCaseMapping:0xFD1F + ,simpleTitleCaseMapping:0xFD1F + }, + { code:0xFD20 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD20 + ,simpleLowerCaseMapping:0xFD20 + ,simpleTitleCaseMapping:0xFD20 + }, + { code:0xFD21 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD21 + ,simpleLowerCaseMapping:0xFD21 + ,simpleTitleCaseMapping:0xFD21 + }, + { code:0xFD22 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD22 + ,simpleLowerCaseMapping:0xFD22 + ,simpleTitleCaseMapping:0xFD22 + }, + { code:0xFD23 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD23 + ,simpleLowerCaseMapping:0xFD23 + ,simpleTitleCaseMapping:0xFD23 + }, + { code:0xFD24 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD24 + ,simpleLowerCaseMapping:0xFD24 + ,simpleTitleCaseMapping:0xFD24 + }, + { code:0xFD25 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD25 + ,simpleLowerCaseMapping:0xFD25 + ,simpleTitleCaseMapping:0xFD25 + }, + { code:0xFD26 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD26 + ,simpleLowerCaseMapping:0xFD26 + ,simpleTitleCaseMapping:0xFD26 + }, + { code:0xFD27 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD27 + ,simpleLowerCaseMapping:0xFD27 + ,simpleTitleCaseMapping:0xFD27 + }, + { code:0xFD28 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD28 + ,simpleLowerCaseMapping:0xFD28 + ,simpleTitleCaseMapping:0xFD28 + }, + { code:0xFD29 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD29 + ,simpleLowerCaseMapping:0xFD29 + ,simpleTitleCaseMapping:0xFD29 + }, + { code:0xFD2A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD2A + ,simpleLowerCaseMapping:0xFD2A + ,simpleTitleCaseMapping:0xFD2A + }, + { code:0xFD2B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD2B + ,simpleLowerCaseMapping:0xFD2B + ,simpleTitleCaseMapping:0xFD2B + }, + { code:0xFD2C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD2C + ,simpleLowerCaseMapping:0xFD2C + ,simpleTitleCaseMapping:0xFD2C + }, + { code:0xFD2D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD2D + ,simpleLowerCaseMapping:0xFD2D + ,simpleTitleCaseMapping:0xFD2D + }, + { code:0xFD2E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD2E + ,simpleLowerCaseMapping:0xFD2E + ,simpleTitleCaseMapping:0xFD2E + }, + { code:0xFD2F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD2F + ,simpleLowerCaseMapping:0xFD2F + ,simpleTitleCaseMapping:0xFD2F + }, + { code:0xFD30 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD30 + ,simpleLowerCaseMapping:0xFD30 + ,simpleTitleCaseMapping:0xFD30 + }, + { code:0xFD31 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD31 + ,simpleLowerCaseMapping:0xFD31 + ,simpleTitleCaseMapping:0xFD31 + }, + { code:0xFD32 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD32 + ,simpleLowerCaseMapping:0xFD32 + ,simpleTitleCaseMapping:0xFD32 + }, + { code:0xFD33 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD33 + ,simpleLowerCaseMapping:0xFD33 + ,simpleTitleCaseMapping:0xFD33 + }, + { code:0xFD34 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD34 + ,simpleLowerCaseMapping:0xFD34 + ,simpleTitleCaseMapping:0xFD34 + }, + { code:0xFD35 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD35 + ,simpleLowerCaseMapping:0xFD35 + ,simpleTitleCaseMapping:0xFD35 + }, + { code:0xFD36 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD36 + ,simpleLowerCaseMapping:0xFD36 + ,simpleTitleCaseMapping:0xFD36 + }, + { code:0xFD37 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD37 + ,simpleLowerCaseMapping:0xFD37 + ,simpleTitleCaseMapping:0xFD37 + }, + { code:0xFD38 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD38 + ,simpleLowerCaseMapping:0xFD38 + ,simpleTitleCaseMapping:0xFD38 + }, + { code:0xFD39 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD39 + ,simpleLowerCaseMapping:0xFD39 + ,simpleTitleCaseMapping:0xFD39 + }, + { code:0xFD3A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD3A + ,simpleLowerCaseMapping:0xFD3A + ,simpleTitleCaseMapping:0xFD3A + }, + { code:0xFD3B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD3B + ,simpleLowerCaseMapping:0xFD3B + ,simpleTitleCaseMapping:0xFD3B + }, + { code:0xFD3C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD3C + ,simpleLowerCaseMapping:0xFD3C + ,simpleTitleCaseMapping:0xFD3C + }, + { code:0xFD3D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD3D + ,simpleLowerCaseMapping:0xFD3D + ,simpleTitleCaseMapping:0xFD3D + }, + { code:0xFD3E + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0xFD3E + ,simpleLowerCaseMapping:0xFD3E + ,simpleTitleCaseMapping:0xFD3E + }, + { code:0xFD3F + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0xFD3F + ,simpleLowerCaseMapping:0xFD3F + ,simpleTitleCaseMapping:0xFD3F + }, + { code:0xFD50 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD50 + ,simpleLowerCaseMapping:0xFD50 + ,simpleTitleCaseMapping:0xFD50 + }, + { code:0xFD51 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD51 + ,simpleLowerCaseMapping:0xFD51 + ,simpleTitleCaseMapping:0xFD51 + }, + { code:0xFD52 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD52 + ,simpleLowerCaseMapping:0xFD52 + ,simpleTitleCaseMapping:0xFD52 + }, + { code:0xFD53 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD53 + ,simpleLowerCaseMapping:0xFD53 + ,simpleTitleCaseMapping:0xFD53 + }, + { code:0xFD54 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD54 + ,simpleLowerCaseMapping:0xFD54 + ,simpleTitleCaseMapping:0xFD54 + }, + { code:0xFD55 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD55 + ,simpleLowerCaseMapping:0xFD55 + ,simpleTitleCaseMapping:0xFD55 + }, + { code:0xFD56 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD56 + ,simpleLowerCaseMapping:0xFD56 + ,simpleTitleCaseMapping:0xFD56 + }, + { code:0xFD57 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD57 + ,simpleLowerCaseMapping:0xFD57 + ,simpleTitleCaseMapping:0xFD57 + }, + { code:0xFD58 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD58 + ,simpleLowerCaseMapping:0xFD58 + ,simpleTitleCaseMapping:0xFD58 + }, + { code:0xFD59 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD59 + ,simpleLowerCaseMapping:0xFD59 + ,simpleTitleCaseMapping:0xFD59 + }, + { code:0xFD5A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD5A + ,simpleLowerCaseMapping:0xFD5A + ,simpleTitleCaseMapping:0xFD5A + }, + { code:0xFD5B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD5B + ,simpleLowerCaseMapping:0xFD5B + ,simpleTitleCaseMapping:0xFD5B + }, + { code:0xFD5C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD5C + ,simpleLowerCaseMapping:0xFD5C + ,simpleTitleCaseMapping:0xFD5C + }, + { code:0xFD5D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD5D + ,simpleLowerCaseMapping:0xFD5D + ,simpleTitleCaseMapping:0xFD5D + }, + { code:0xFD5E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD5E + ,simpleLowerCaseMapping:0xFD5E + ,simpleTitleCaseMapping:0xFD5E + }, + { code:0xFD5F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD5F + ,simpleLowerCaseMapping:0xFD5F + ,simpleTitleCaseMapping:0xFD5F + }, + { code:0xFD60 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD60 + ,simpleLowerCaseMapping:0xFD60 + ,simpleTitleCaseMapping:0xFD60 + }, + { code:0xFD61 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD61 + ,simpleLowerCaseMapping:0xFD61 + ,simpleTitleCaseMapping:0xFD61 + }, + { code:0xFD62 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD62 + ,simpleLowerCaseMapping:0xFD62 + ,simpleTitleCaseMapping:0xFD62 + }, + { code:0xFD63 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD63 + ,simpleLowerCaseMapping:0xFD63 + ,simpleTitleCaseMapping:0xFD63 + }, + { code:0xFD64 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD64 + ,simpleLowerCaseMapping:0xFD64 + ,simpleTitleCaseMapping:0xFD64 + }, + { code:0xFD65 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD65 + ,simpleLowerCaseMapping:0xFD65 + ,simpleTitleCaseMapping:0xFD65 + }, + { code:0xFD66 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD66 + ,simpleLowerCaseMapping:0xFD66 + ,simpleTitleCaseMapping:0xFD66 + }, + { code:0xFD67 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD67 + ,simpleLowerCaseMapping:0xFD67 + ,simpleTitleCaseMapping:0xFD67 + }, + { code:0xFD68 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD68 + ,simpleLowerCaseMapping:0xFD68 + ,simpleTitleCaseMapping:0xFD68 + }, + { code:0xFD69 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD69 + ,simpleLowerCaseMapping:0xFD69 + ,simpleTitleCaseMapping:0xFD69 + }, + { code:0xFD6A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD6A + ,simpleLowerCaseMapping:0xFD6A + ,simpleTitleCaseMapping:0xFD6A + }, + { code:0xFD6B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD6B + ,simpleLowerCaseMapping:0xFD6B + ,simpleTitleCaseMapping:0xFD6B + }, + { code:0xFD6C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD6C + ,simpleLowerCaseMapping:0xFD6C + ,simpleTitleCaseMapping:0xFD6C + }, + { code:0xFD6D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD6D + ,simpleLowerCaseMapping:0xFD6D + ,simpleTitleCaseMapping:0xFD6D + }, + { code:0xFD6E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD6E + ,simpleLowerCaseMapping:0xFD6E + ,simpleTitleCaseMapping:0xFD6E + }, + { code:0xFD6F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD6F + ,simpleLowerCaseMapping:0xFD6F + ,simpleTitleCaseMapping:0xFD6F + }, + { code:0xFD70 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD70 + ,simpleLowerCaseMapping:0xFD70 + ,simpleTitleCaseMapping:0xFD70 + }, + { code:0xFD71 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD71 + ,simpleLowerCaseMapping:0xFD71 + ,simpleTitleCaseMapping:0xFD71 + }, + { code:0xFD72 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD72 + ,simpleLowerCaseMapping:0xFD72 + ,simpleTitleCaseMapping:0xFD72 + }, + { code:0xFD73 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD73 + ,simpleLowerCaseMapping:0xFD73 + ,simpleTitleCaseMapping:0xFD73 + }, + { code:0xFD74 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD74 + ,simpleLowerCaseMapping:0xFD74 + ,simpleTitleCaseMapping:0xFD74 + }, + { code:0xFD75 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD75 + ,simpleLowerCaseMapping:0xFD75 + ,simpleTitleCaseMapping:0xFD75 + }, + { code:0xFD76 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD76 + ,simpleLowerCaseMapping:0xFD76 + ,simpleTitleCaseMapping:0xFD76 + }, + { code:0xFD77 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD77 + ,simpleLowerCaseMapping:0xFD77 + ,simpleTitleCaseMapping:0xFD77 + }, + { code:0xFD78 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD78 + ,simpleLowerCaseMapping:0xFD78 + ,simpleTitleCaseMapping:0xFD78 + }, + { code:0xFD79 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD79 + ,simpleLowerCaseMapping:0xFD79 + ,simpleTitleCaseMapping:0xFD79 + }, + { code:0xFD7A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD7A + ,simpleLowerCaseMapping:0xFD7A + ,simpleTitleCaseMapping:0xFD7A + }, + { code:0xFD7B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD7B + ,simpleLowerCaseMapping:0xFD7B + ,simpleTitleCaseMapping:0xFD7B + }, + { code:0xFD7C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD7C + ,simpleLowerCaseMapping:0xFD7C + ,simpleTitleCaseMapping:0xFD7C + }, + { code:0xFD7D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD7D + ,simpleLowerCaseMapping:0xFD7D + ,simpleTitleCaseMapping:0xFD7D + }, + { code:0xFD7E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD7E + ,simpleLowerCaseMapping:0xFD7E + ,simpleTitleCaseMapping:0xFD7E + }, + { code:0xFD7F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD7F + ,simpleLowerCaseMapping:0xFD7F + ,simpleTitleCaseMapping:0xFD7F + }, + { code:0xFD80 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD80 + ,simpleLowerCaseMapping:0xFD80 + ,simpleTitleCaseMapping:0xFD80 + }, + { code:0xFD81 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD81 + ,simpleLowerCaseMapping:0xFD81 + ,simpleTitleCaseMapping:0xFD81 + }, + { code:0xFD82 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD82 + ,simpleLowerCaseMapping:0xFD82 + ,simpleTitleCaseMapping:0xFD82 + }, + { code:0xFD83 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD83 + ,simpleLowerCaseMapping:0xFD83 + ,simpleTitleCaseMapping:0xFD83 + }, + { code:0xFD84 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD84 + ,simpleLowerCaseMapping:0xFD84 + ,simpleTitleCaseMapping:0xFD84 + }, + { code:0xFD85 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD85 + ,simpleLowerCaseMapping:0xFD85 + ,simpleTitleCaseMapping:0xFD85 + }, + { code:0xFD86 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD86 + ,simpleLowerCaseMapping:0xFD86 + ,simpleTitleCaseMapping:0xFD86 + }, + { code:0xFD87 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD87 + ,simpleLowerCaseMapping:0xFD87 + ,simpleTitleCaseMapping:0xFD87 + }, + { code:0xFD88 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD88 + ,simpleLowerCaseMapping:0xFD88 + ,simpleTitleCaseMapping:0xFD88 + }, + { code:0xFD89 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD89 + ,simpleLowerCaseMapping:0xFD89 + ,simpleTitleCaseMapping:0xFD89 + }, + { code:0xFD8A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD8A + ,simpleLowerCaseMapping:0xFD8A + ,simpleTitleCaseMapping:0xFD8A + }, + { code:0xFD8B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD8B + ,simpleLowerCaseMapping:0xFD8B + ,simpleTitleCaseMapping:0xFD8B + }, + { code:0xFD8C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD8C + ,simpleLowerCaseMapping:0xFD8C + ,simpleTitleCaseMapping:0xFD8C + }, + { code:0xFD8D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD8D + ,simpleLowerCaseMapping:0xFD8D + ,simpleTitleCaseMapping:0xFD8D + }, + { code:0xFD8E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD8E + ,simpleLowerCaseMapping:0xFD8E + ,simpleTitleCaseMapping:0xFD8E + }, + { code:0xFD8F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD8F + ,simpleLowerCaseMapping:0xFD8F + ,simpleTitleCaseMapping:0xFD8F + }, + { code:0xFD92 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD92 + ,simpleLowerCaseMapping:0xFD92 + ,simpleTitleCaseMapping:0xFD92 + }, + { code:0xFD93 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD93 + ,simpleLowerCaseMapping:0xFD93 + ,simpleTitleCaseMapping:0xFD93 + }, + { code:0xFD94 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD94 + ,simpleLowerCaseMapping:0xFD94 + ,simpleTitleCaseMapping:0xFD94 + }, + { code:0xFD95 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD95 + ,simpleLowerCaseMapping:0xFD95 + ,simpleTitleCaseMapping:0xFD95 + }, + { code:0xFD96 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD96 + ,simpleLowerCaseMapping:0xFD96 + ,simpleTitleCaseMapping:0xFD96 + }, + { code:0xFD97 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD97 + ,simpleLowerCaseMapping:0xFD97 + ,simpleTitleCaseMapping:0xFD97 + }, + { code:0xFD98 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD98 + ,simpleLowerCaseMapping:0xFD98 + ,simpleTitleCaseMapping:0xFD98 + }, + { code:0xFD99 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD99 + ,simpleLowerCaseMapping:0xFD99 + ,simpleTitleCaseMapping:0xFD99 + }, + { code:0xFD9A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD9A + ,simpleLowerCaseMapping:0xFD9A + ,simpleTitleCaseMapping:0xFD9A + }, + { code:0xFD9B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD9B + ,simpleLowerCaseMapping:0xFD9B + ,simpleTitleCaseMapping:0xFD9B + }, + { code:0xFD9C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD9C + ,simpleLowerCaseMapping:0xFD9C + ,simpleTitleCaseMapping:0xFD9C + }, + { code:0xFD9D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD9D + ,simpleLowerCaseMapping:0xFD9D + ,simpleTitleCaseMapping:0xFD9D + }, + { code:0xFD9E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD9E + ,simpleLowerCaseMapping:0xFD9E + ,simpleTitleCaseMapping:0xFD9E + }, + { code:0xFD9F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFD9F + ,simpleLowerCaseMapping:0xFD9F + ,simpleTitleCaseMapping:0xFD9F + }, + { code:0xFDA0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDA0 + ,simpleLowerCaseMapping:0xFDA0 + ,simpleTitleCaseMapping:0xFDA0 + }, + { code:0xFDA1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDA1 + ,simpleLowerCaseMapping:0xFDA1 + ,simpleTitleCaseMapping:0xFDA1 + }, + { code:0xFDA2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDA2 + ,simpleLowerCaseMapping:0xFDA2 + ,simpleTitleCaseMapping:0xFDA2 + }, + { code:0xFDA3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDA3 + ,simpleLowerCaseMapping:0xFDA3 + ,simpleTitleCaseMapping:0xFDA3 + }, + { code:0xFDA4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDA4 + ,simpleLowerCaseMapping:0xFDA4 + ,simpleTitleCaseMapping:0xFDA4 + }, + { code:0xFDA5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDA5 + ,simpleLowerCaseMapping:0xFDA5 + ,simpleTitleCaseMapping:0xFDA5 + }, + { code:0xFDA6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDA6 + ,simpleLowerCaseMapping:0xFDA6 + ,simpleTitleCaseMapping:0xFDA6 + }, + { code:0xFDA7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDA7 + ,simpleLowerCaseMapping:0xFDA7 + ,simpleTitleCaseMapping:0xFDA7 + }, + { code:0xFDA8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDA8 + ,simpleLowerCaseMapping:0xFDA8 + ,simpleTitleCaseMapping:0xFDA8 + }, + { code:0xFDA9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDA9 + ,simpleLowerCaseMapping:0xFDA9 + ,simpleTitleCaseMapping:0xFDA9 + }, + { code:0xFDAA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDAA + ,simpleLowerCaseMapping:0xFDAA + ,simpleTitleCaseMapping:0xFDAA + }, + { code:0xFDAB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDAB + ,simpleLowerCaseMapping:0xFDAB + ,simpleTitleCaseMapping:0xFDAB + }, + { code:0xFDAC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDAC + ,simpleLowerCaseMapping:0xFDAC + ,simpleTitleCaseMapping:0xFDAC + }, + { code:0xFDAD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDAD + ,simpleLowerCaseMapping:0xFDAD + ,simpleTitleCaseMapping:0xFDAD + }, + { code:0xFDAE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDAE + ,simpleLowerCaseMapping:0xFDAE + ,simpleTitleCaseMapping:0xFDAE + }, + { code:0xFDAF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDAF + ,simpleLowerCaseMapping:0xFDAF + ,simpleTitleCaseMapping:0xFDAF + }, + { code:0xFDB0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDB0 + ,simpleLowerCaseMapping:0xFDB0 + ,simpleTitleCaseMapping:0xFDB0 + }, + { code:0xFDB1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDB1 + ,simpleLowerCaseMapping:0xFDB1 + ,simpleTitleCaseMapping:0xFDB1 + }, + { code:0xFDB2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDB2 + ,simpleLowerCaseMapping:0xFDB2 + ,simpleTitleCaseMapping:0xFDB2 + }, + { code:0xFDB3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDB3 + ,simpleLowerCaseMapping:0xFDB3 + ,simpleTitleCaseMapping:0xFDB3 + }, + { code:0xFDB4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDB4 + ,simpleLowerCaseMapping:0xFDB4 + ,simpleTitleCaseMapping:0xFDB4 + }, + { code:0xFDB5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDB5 + ,simpleLowerCaseMapping:0xFDB5 + ,simpleTitleCaseMapping:0xFDB5 + }, + { code:0xFDB6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDB6 + ,simpleLowerCaseMapping:0xFDB6 + ,simpleTitleCaseMapping:0xFDB6 + }, + { code:0xFDB7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDB7 + ,simpleLowerCaseMapping:0xFDB7 + ,simpleTitleCaseMapping:0xFDB7 + }, + { code:0xFDB8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDB8 + ,simpleLowerCaseMapping:0xFDB8 + ,simpleTitleCaseMapping:0xFDB8 + }, + { code:0xFDB9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDB9 + ,simpleLowerCaseMapping:0xFDB9 + ,simpleTitleCaseMapping:0xFDB9 + }, + { code:0xFDBA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDBA + ,simpleLowerCaseMapping:0xFDBA + ,simpleTitleCaseMapping:0xFDBA + }, + { code:0xFDBB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDBB + ,simpleLowerCaseMapping:0xFDBB + ,simpleTitleCaseMapping:0xFDBB + }, + { code:0xFDBC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDBC + ,simpleLowerCaseMapping:0xFDBC + ,simpleTitleCaseMapping:0xFDBC + }, + { code:0xFDBD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDBD + ,simpleLowerCaseMapping:0xFDBD + ,simpleTitleCaseMapping:0xFDBD + }, + { code:0xFDBE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDBE + ,simpleLowerCaseMapping:0xFDBE + ,simpleTitleCaseMapping:0xFDBE + }, + { code:0xFDBF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDBF + ,simpleLowerCaseMapping:0xFDBF + ,simpleTitleCaseMapping:0xFDBF + }, + { code:0xFDC0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDC0 + ,simpleLowerCaseMapping:0xFDC0 + ,simpleTitleCaseMapping:0xFDC0 + }, + { code:0xFDC1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDC1 + ,simpleLowerCaseMapping:0xFDC1 + ,simpleTitleCaseMapping:0xFDC1 + }, + { code:0xFDC2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDC2 + ,simpleLowerCaseMapping:0xFDC2 + ,simpleTitleCaseMapping:0xFDC2 + }, + { code:0xFDC3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDC3 + ,simpleLowerCaseMapping:0xFDC3 + ,simpleTitleCaseMapping:0xFDC3 + }, + { code:0xFDC4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDC4 + ,simpleLowerCaseMapping:0xFDC4 + ,simpleTitleCaseMapping:0xFDC4 + }, + { code:0xFDC5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDC5 + ,simpleLowerCaseMapping:0xFDC5 + ,simpleTitleCaseMapping:0xFDC5 + }, + { code:0xFDC6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDC6 + ,simpleLowerCaseMapping:0xFDC6 + ,simpleTitleCaseMapping:0xFDC6 + }, + { code:0xFDC7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDC7 + ,simpleLowerCaseMapping:0xFDC7 + ,simpleTitleCaseMapping:0xFDC7 + }, + { code:0xFDF0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDF0 + ,simpleLowerCaseMapping:0xFDF0 + ,simpleTitleCaseMapping:0xFDF0 + }, + { code:0xFDF1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDF1 + ,simpleLowerCaseMapping:0xFDF1 + ,simpleTitleCaseMapping:0xFDF1 + }, + { code:0xFDF2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDF2 + ,simpleLowerCaseMapping:0xFDF2 + ,simpleTitleCaseMapping:0xFDF2 + }, + { code:0xFDF3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDF3 + ,simpleLowerCaseMapping:0xFDF3 + ,simpleTitleCaseMapping:0xFDF3 + }, + { code:0xFDF4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDF4 + ,simpleLowerCaseMapping:0xFDF4 + ,simpleTitleCaseMapping:0xFDF4 + }, + { code:0xFDF5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDF5 + ,simpleLowerCaseMapping:0xFDF5 + ,simpleTitleCaseMapping:0xFDF5 + }, + { code:0xFDF6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDF6 + ,simpleLowerCaseMapping:0xFDF6 + ,simpleTitleCaseMapping:0xFDF6 + }, + { code:0xFDF7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDF7 + ,simpleLowerCaseMapping:0xFDF7 + ,simpleTitleCaseMapping:0xFDF7 + }, + { code:0xFDF8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDF8 + ,simpleLowerCaseMapping:0xFDF8 + ,simpleTitleCaseMapping:0xFDF8 + }, + { code:0xFDF9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDF9 + ,simpleLowerCaseMapping:0xFDF9 + ,simpleTitleCaseMapping:0xFDF9 + }, + { code:0xFDFA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDFA + ,simpleLowerCaseMapping:0xFDFA + ,simpleTitleCaseMapping:0xFDFA + }, + { code:0xFDFB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFDFB + ,simpleLowerCaseMapping:0xFDFB + ,simpleTitleCaseMapping:0xFDFB + }, + { code:0xFDFC + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0xFDFC + ,simpleLowerCaseMapping:0xFDFC + ,simpleTitleCaseMapping:0xFDFC + }, + { code:0xFDFD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xFDFD + ,simpleLowerCaseMapping:0xFDFD + ,simpleTitleCaseMapping:0xFDFD + }, + { code:0xFE00 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xFE00 + ,simpleLowerCaseMapping:0xFE00 + ,simpleTitleCaseMapping:0xFE00 + }, + { code:0xFE01 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xFE01 + ,simpleLowerCaseMapping:0xFE01 + ,simpleTitleCaseMapping:0xFE01 + }, + { code:0xFE02 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xFE02 + ,simpleLowerCaseMapping:0xFE02 + ,simpleTitleCaseMapping:0xFE02 + }, + { code:0xFE03 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xFE03 + ,simpleLowerCaseMapping:0xFE03 + ,simpleTitleCaseMapping:0xFE03 + }, + { code:0xFE04 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xFE04 + ,simpleLowerCaseMapping:0xFE04 + ,simpleTitleCaseMapping:0xFE04 + }, + { code:0xFE05 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xFE05 + ,simpleLowerCaseMapping:0xFE05 + ,simpleTitleCaseMapping:0xFE05 + }, + { code:0xFE06 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xFE06 + ,simpleLowerCaseMapping:0xFE06 + ,simpleTitleCaseMapping:0xFE06 + }, + { code:0xFE07 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xFE07 + ,simpleLowerCaseMapping:0xFE07 + ,simpleTitleCaseMapping:0xFE07 + }, + { code:0xFE08 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xFE08 + ,simpleLowerCaseMapping:0xFE08 + ,simpleTitleCaseMapping:0xFE08 + }, + { code:0xFE09 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xFE09 + ,simpleLowerCaseMapping:0xFE09 + ,simpleTitleCaseMapping:0xFE09 + }, + { code:0xFE0A + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xFE0A + ,simpleLowerCaseMapping:0xFE0A + ,simpleTitleCaseMapping:0xFE0A + }, + { code:0xFE0B + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xFE0B + ,simpleLowerCaseMapping:0xFE0B + ,simpleTitleCaseMapping:0xFE0B + }, + { code:0xFE0C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xFE0C + ,simpleLowerCaseMapping:0xFE0C + ,simpleTitleCaseMapping:0xFE0C + }, + { code:0xFE0D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xFE0D + ,simpleLowerCaseMapping:0xFE0D + ,simpleTitleCaseMapping:0xFE0D + }, + { code:0xFE0E + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xFE0E + ,simpleLowerCaseMapping:0xFE0E + ,simpleTitleCaseMapping:0xFE0E + }, + { code:0xFE0F + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xFE0F + ,simpleLowerCaseMapping:0xFE0F + ,simpleTitleCaseMapping:0xFE0F + }, + { code:0xFE10 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFE10 + ,simpleLowerCaseMapping:0xFE10 + ,simpleTitleCaseMapping:0xFE10 + }, + { code:0xFE11 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFE11 + ,simpleLowerCaseMapping:0xFE11 + ,simpleTitleCaseMapping:0xFE11 + }, + { code:0xFE12 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFE12 + ,simpleLowerCaseMapping:0xFE12 + ,simpleTitleCaseMapping:0xFE12 + }, + { code:0xFE13 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFE13 + ,simpleLowerCaseMapping:0xFE13 + ,simpleTitleCaseMapping:0xFE13 + }, + { code:0xFE14 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFE14 + ,simpleLowerCaseMapping:0xFE14 + ,simpleTitleCaseMapping:0xFE14 + }, + { code:0xFE15 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFE15 + ,simpleLowerCaseMapping:0xFE15 + ,simpleTitleCaseMapping:0xFE15 + }, + { code:0xFE16 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFE16 + ,simpleLowerCaseMapping:0xFE16 + ,simpleTitleCaseMapping:0xFE16 + }, + { code:0xFE17 + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0xFE17 + ,simpleLowerCaseMapping:0xFE17 + ,simpleTitleCaseMapping:0xFE17 + }, + { code:0xFE18 + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0xFE18 + ,simpleLowerCaseMapping:0xFE18 + ,simpleTitleCaseMapping:0xFE18 + }, + { code:0xFE19 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFE19 + ,simpleLowerCaseMapping:0xFE19 + ,simpleTitleCaseMapping:0xFE19 + }, + { code:0xFE20 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xFE20 + ,simpleLowerCaseMapping:0xFE20 + ,simpleTitleCaseMapping:0xFE20 + }, + { code:0xFE21 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xFE21 + ,simpleLowerCaseMapping:0xFE21 + ,simpleTitleCaseMapping:0xFE21 + }, + { code:0xFE22 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xFE22 + ,simpleLowerCaseMapping:0xFE22 + ,simpleTitleCaseMapping:0xFE22 + }, + { code:0xFE23 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xFE23 + ,simpleLowerCaseMapping:0xFE23 + ,simpleTitleCaseMapping:0xFE23 + }, + { code:0xFE30 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFE30 + ,simpleLowerCaseMapping:0xFE30 + ,simpleTitleCaseMapping:0xFE30 + }, + { code:0xFE31 + ,generalCategory:UnicodeData.GeneralCategory.Pd + ,simpleUpperCaseMapping:0xFE31 + ,simpleLowerCaseMapping:0xFE31 + ,simpleTitleCaseMapping:0xFE31 + }, + { code:0xFE32 + ,generalCategory:UnicodeData.GeneralCategory.Pd + ,simpleUpperCaseMapping:0xFE32 + ,simpleLowerCaseMapping:0xFE32 + ,simpleTitleCaseMapping:0xFE32 + }, + { code:0xFE33 + ,generalCategory:UnicodeData.GeneralCategory.Pc + ,simpleUpperCaseMapping:0xFE33 + ,simpleLowerCaseMapping:0xFE33 + ,simpleTitleCaseMapping:0xFE33 + }, + { code:0xFE34 + ,generalCategory:UnicodeData.GeneralCategory.Pc + ,simpleUpperCaseMapping:0xFE34 + ,simpleLowerCaseMapping:0xFE34 + ,simpleTitleCaseMapping:0xFE34 + }, + { code:0xFE35 + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0xFE35 + ,simpleLowerCaseMapping:0xFE35 + ,simpleTitleCaseMapping:0xFE35 + }, + { code:0xFE36 + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0xFE36 + ,simpleLowerCaseMapping:0xFE36 + ,simpleTitleCaseMapping:0xFE36 + }, + { code:0xFE37 + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0xFE37 + ,simpleLowerCaseMapping:0xFE37 + ,simpleTitleCaseMapping:0xFE37 + }, + { code:0xFE38 + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0xFE38 + ,simpleLowerCaseMapping:0xFE38 + ,simpleTitleCaseMapping:0xFE38 + }, + { code:0xFE39 + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0xFE39 + ,simpleLowerCaseMapping:0xFE39 + ,simpleTitleCaseMapping:0xFE39 + }, + { code:0xFE3A + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0xFE3A + ,simpleLowerCaseMapping:0xFE3A + ,simpleTitleCaseMapping:0xFE3A + }, + { code:0xFE3B + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0xFE3B + ,simpleLowerCaseMapping:0xFE3B + ,simpleTitleCaseMapping:0xFE3B + }, + { code:0xFE3C + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0xFE3C + ,simpleLowerCaseMapping:0xFE3C + ,simpleTitleCaseMapping:0xFE3C + }, + { code:0xFE3D + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0xFE3D + ,simpleLowerCaseMapping:0xFE3D + ,simpleTitleCaseMapping:0xFE3D + }, + { code:0xFE3E + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0xFE3E + ,simpleLowerCaseMapping:0xFE3E + ,simpleTitleCaseMapping:0xFE3E + }, + { code:0xFE3F + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0xFE3F + ,simpleLowerCaseMapping:0xFE3F + ,simpleTitleCaseMapping:0xFE3F + }, + { code:0xFE40 + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0xFE40 + ,simpleLowerCaseMapping:0xFE40 + ,simpleTitleCaseMapping:0xFE40 + }, + { code:0xFE41 + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0xFE41 + ,simpleLowerCaseMapping:0xFE41 + ,simpleTitleCaseMapping:0xFE41 + }, + { code:0xFE42 + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0xFE42 + ,simpleLowerCaseMapping:0xFE42 + ,simpleTitleCaseMapping:0xFE42 + }, + { code:0xFE43 + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0xFE43 + ,simpleLowerCaseMapping:0xFE43 + ,simpleTitleCaseMapping:0xFE43 + }, + { code:0xFE44 + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0xFE44 + ,simpleLowerCaseMapping:0xFE44 + ,simpleTitleCaseMapping:0xFE44 + }, + { code:0xFE45 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFE45 + ,simpleLowerCaseMapping:0xFE45 + ,simpleTitleCaseMapping:0xFE45 + }, + { code:0xFE46 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFE46 + ,simpleLowerCaseMapping:0xFE46 + ,simpleTitleCaseMapping:0xFE46 + }, + { code:0xFE47 + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0xFE47 + ,simpleLowerCaseMapping:0xFE47 + ,simpleTitleCaseMapping:0xFE47 + }, + { code:0xFE48 + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0xFE48 + ,simpleLowerCaseMapping:0xFE48 + ,simpleTitleCaseMapping:0xFE48 + }, + { code:0xFE49 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFE49 + ,simpleLowerCaseMapping:0xFE49 + ,simpleTitleCaseMapping:0xFE49 + }, + { code:0xFE4A + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFE4A + ,simpleLowerCaseMapping:0xFE4A + ,simpleTitleCaseMapping:0xFE4A + }, + { code:0xFE4B + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFE4B + ,simpleLowerCaseMapping:0xFE4B + ,simpleTitleCaseMapping:0xFE4B + }, + { code:0xFE4C + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFE4C + ,simpleLowerCaseMapping:0xFE4C + ,simpleTitleCaseMapping:0xFE4C + }, + { code:0xFE4D + ,generalCategory:UnicodeData.GeneralCategory.Pc + ,simpleUpperCaseMapping:0xFE4D + ,simpleLowerCaseMapping:0xFE4D + ,simpleTitleCaseMapping:0xFE4D + }, + { code:0xFE4E + ,generalCategory:UnicodeData.GeneralCategory.Pc + ,simpleUpperCaseMapping:0xFE4E + ,simpleLowerCaseMapping:0xFE4E + ,simpleTitleCaseMapping:0xFE4E + }, + { code:0xFE4F + ,generalCategory:UnicodeData.GeneralCategory.Pc + ,simpleUpperCaseMapping:0xFE4F + ,simpleLowerCaseMapping:0xFE4F + ,simpleTitleCaseMapping:0xFE4F + }, + { code:0xFE50 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFE50 + ,simpleLowerCaseMapping:0xFE50 + ,simpleTitleCaseMapping:0xFE50 + }, + { code:0xFE51 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFE51 + ,simpleLowerCaseMapping:0xFE51 + ,simpleTitleCaseMapping:0xFE51 + }, + { code:0xFE52 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFE52 + ,simpleLowerCaseMapping:0xFE52 + ,simpleTitleCaseMapping:0xFE52 + }, + { code:0xFE54 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFE54 + ,simpleLowerCaseMapping:0xFE54 + ,simpleTitleCaseMapping:0xFE54 + }, + { code:0xFE55 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFE55 + ,simpleLowerCaseMapping:0xFE55 + ,simpleTitleCaseMapping:0xFE55 + }, + { code:0xFE56 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFE56 + ,simpleLowerCaseMapping:0xFE56 + ,simpleTitleCaseMapping:0xFE56 + }, + { code:0xFE57 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFE57 + ,simpleLowerCaseMapping:0xFE57 + ,simpleTitleCaseMapping:0xFE57 + }, + { code:0xFE58 + ,generalCategory:UnicodeData.GeneralCategory.Pd + ,simpleUpperCaseMapping:0xFE58 + ,simpleLowerCaseMapping:0xFE58 + ,simpleTitleCaseMapping:0xFE58 + }, + { code:0xFE59 + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0xFE59 + ,simpleLowerCaseMapping:0xFE59 + ,simpleTitleCaseMapping:0xFE59 + }, + { code:0xFE5A + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0xFE5A + ,simpleLowerCaseMapping:0xFE5A + ,simpleTitleCaseMapping:0xFE5A + }, + { code:0xFE5B + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0xFE5B + ,simpleLowerCaseMapping:0xFE5B + ,simpleTitleCaseMapping:0xFE5B + }, + { code:0xFE5C + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0xFE5C + ,simpleLowerCaseMapping:0xFE5C + ,simpleTitleCaseMapping:0xFE5C + }, + { code:0xFE5D + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0xFE5D + ,simpleLowerCaseMapping:0xFE5D + ,simpleTitleCaseMapping:0xFE5D + }, + { code:0xFE5E + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0xFE5E + ,simpleLowerCaseMapping:0xFE5E + ,simpleTitleCaseMapping:0xFE5E + }, + { code:0xFE5F + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFE5F + ,simpleLowerCaseMapping:0xFE5F + ,simpleTitleCaseMapping:0xFE5F + }, + { code:0xFE60 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFE60 + ,simpleLowerCaseMapping:0xFE60 + ,simpleTitleCaseMapping:0xFE60 + }, + { code:0xFE61 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFE61 + ,simpleLowerCaseMapping:0xFE61 + ,simpleTitleCaseMapping:0xFE61 + }, + { code:0xFE62 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0xFE62 + ,simpleLowerCaseMapping:0xFE62 + ,simpleTitleCaseMapping:0xFE62 + }, + { code:0xFE63 + ,generalCategory:UnicodeData.GeneralCategory.Pd + ,simpleUpperCaseMapping:0xFE63 + ,simpleLowerCaseMapping:0xFE63 + ,simpleTitleCaseMapping:0xFE63 + }, + { code:0xFE64 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0xFE64 + ,simpleLowerCaseMapping:0xFE64 + ,simpleTitleCaseMapping:0xFE64 + }, + { code:0xFE65 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0xFE65 + ,simpleLowerCaseMapping:0xFE65 + ,simpleTitleCaseMapping:0xFE65 + }, + { code:0xFE66 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0xFE66 + ,simpleLowerCaseMapping:0xFE66 + ,simpleTitleCaseMapping:0xFE66 + }, + { code:0xFE68 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFE68 + ,simpleLowerCaseMapping:0xFE68 + ,simpleTitleCaseMapping:0xFE68 + }, + { code:0xFE69 + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0xFE69 + ,simpleLowerCaseMapping:0xFE69 + ,simpleTitleCaseMapping:0xFE69 + }, + { code:0xFE6A + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFE6A + ,simpleLowerCaseMapping:0xFE6A + ,simpleTitleCaseMapping:0xFE6A + }, + { code:0xFE6B + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFE6B + ,simpleLowerCaseMapping:0xFE6B + ,simpleTitleCaseMapping:0xFE6B + }, + { code:0xFE70 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE70 + ,simpleLowerCaseMapping:0xFE70 + ,simpleTitleCaseMapping:0xFE70 + }, + { code:0xFE71 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE71 + ,simpleLowerCaseMapping:0xFE71 + ,simpleTitleCaseMapping:0xFE71 + }, + { code:0xFE72 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE72 + ,simpleLowerCaseMapping:0xFE72 + ,simpleTitleCaseMapping:0xFE72 + }, + { code:0xFE73 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE73 + ,simpleLowerCaseMapping:0xFE73 + ,simpleTitleCaseMapping:0xFE73 + }, + { code:0xFE74 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE74 + ,simpleLowerCaseMapping:0xFE74 + ,simpleTitleCaseMapping:0xFE74 + }, + { code:0xFE76 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE76 + ,simpleLowerCaseMapping:0xFE76 + ,simpleTitleCaseMapping:0xFE76 + }, + { code:0xFE77 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE77 + ,simpleLowerCaseMapping:0xFE77 + ,simpleTitleCaseMapping:0xFE77 + }, + { code:0xFE78 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE78 + ,simpleLowerCaseMapping:0xFE78 + ,simpleTitleCaseMapping:0xFE78 + }, + { code:0xFE79 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE79 + ,simpleLowerCaseMapping:0xFE79 + ,simpleTitleCaseMapping:0xFE79 + }, + { code:0xFE7A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE7A + ,simpleLowerCaseMapping:0xFE7A + ,simpleTitleCaseMapping:0xFE7A + }, + { code:0xFE7B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE7B + ,simpleLowerCaseMapping:0xFE7B + ,simpleTitleCaseMapping:0xFE7B + }, + { code:0xFE7C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE7C + ,simpleLowerCaseMapping:0xFE7C + ,simpleTitleCaseMapping:0xFE7C + }, + { code:0xFE7D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE7D + ,simpleLowerCaseMapping:0xFE7D + ,simpleTitleCaseMapping:0xFE7D + }, + { code:0xFE7E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE7E + ,simpleLowerCaseMapping:0xFE7E + ,simpleTitleCaseMapping:0xFE7E + }, + { code:0xFE7F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE7F + ,simpleLowerCaseMapping:0xFE7F + ,simpleTitleCaseMapping:0xFE7F + }, + { code:0xFE80 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE80 + ,simpleLowerCaseMapping:0xFE80 + ,simpleTitleCaseMapping:0xFE80 + }, + { code:0xFE81 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE81 + ,simpleLowerCaseMapping:0xFE81 + ,simpleTitleCaseMapping:0xFE81 + }, + { code:0xFE82 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE82 + ,simpleLowerCaseMapping:0xFE82 + ,simpleTitleCaseMapping:0xFE82 + }, + { code:0xFE83 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE83 + ,simpleLowerCaseMapping:0xFE83 + ,simpleTitleCaseMapping:0xFE83 + }, + { code:0xFE84 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE84 + ,simpleLowerCaseMapping:0xFE84 + ,simpleTitleCaseMapping:0xFE84 + }, + { code:0xFE85 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE85 + ,simpleLowerCaseMapping:0xFE85 + ,simpleTitleCaseMapping:0xFE85 + }, + { code:0xFE86 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE86 + ,simpleLowerCaseMapping:0xFE86 + ,simpleTitleCaseMapping:0xFE86 + }, + { code:0xFE87 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE87 + ,simpleLowerCaseMapping:0xFE87 + ,simpleTitleCaseMapping:0xFE87 + }, + { code:0xFE88 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE88 + ,simpleLowerCaseMapping:0xFE88 + ,simpleTitleCaseMapping:0xFE88 + }, + { code:0xFE89 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE89 + ,simpleLowerCaseMapping:0xFE89 + ,simpleTitleCaseMapping:0xFE89 + }, + { code:0xFE8A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE8A + ,simpleLowerCaseMapping:0xFE8A + ,simpleTitleCaseMapping:0xFE8A + }, + { code:0xFE8B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE8B + ,simpleLowerCaseMapping:0xFE8B + ,simpleTitleCaseMapping:0xFE8B + }, + { code:0xFE8C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE8C + ,simpleLowerCaseMapping:0xFE8C + ,simpleTitleCaseMapping:0xFE8C + }, + { code:0xFE8D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE8D + ,simpleLowerCaseMapping:0xFE8D + ,simpleTitleCaseMapping:0xFE8D + }, + { code:0xFE8E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE8E + ,simpleLowerCaseMapping:0xFE8E + ,simpleTitleCaseMapping:0xFE8E + }, + { code:0xFE8F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE8F + ,simpleLowerCaseMapping:0xFE8F + ,simpleTitleCaseMapping:0xFE8F + }, + { code:0xFE90 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE90 + ,simpleLowerCaseMapping:0xFE90 + ,simpleTitleCaseMapping:0xFE90 + }, + { code:0xFE91 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE91 + ,simpleLowerCaseMapping:0xFE91 + ,simpleTitleCaseMapping:0xFE91 + }, + { code:0xFE92 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE92 + ,simpleLowerCaseMapping:0xFE92 + ,simpleTitleCaseMapping:0xFE92 + }, + { code:0xFE93 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE93 + ,simpleLowerCaseMapping:0xFE93 + ,simpleTitleCaseMapping:0xFE93 + }, + { code:0xFE94 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE94 + ,simpleLowerCaseMapping:0xFE94 + ,simpleTitleCaseMapping:0xFE94 + }, + { code:0xFE95 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE95 + ,simpleLowerCaseMapping:0xFE95 + ,simpleTitleCaseMapping:0xFE95 + }, + { code:0xFE96 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE96 + ,simpleLowerCaseMapping:0xFE96 + ,simpleTitleCaseMapping:0xFE96 + }, + { code:0xFE97 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE97 + ,simpleLowerCaseMapping:0xFE97 + ,simpleTitleCaseMapping:0xFE97 + }, + { code:0xFE98 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE98 + ,simpleLowerCaseMapping:0xFE98 + ,simpleTitleCaseMapping:0xFE98 + }, + { code:0xFE99 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE99 + ,simpleLowerCaseMapping:0xFE99 + ,simpleTitleCaseMapping:0xFE99 + }, + { code:0xFE9A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE9A + ,simpleLowerCaseMapping:0xFE9A + ,simpleTitleCaseMapping:0xFE9A + }, + { code:0xFE9B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE9B + ,simpleLowerCaseMapping:0xFE9B + ,simpleTitleCaseMapping:0xFE9B + }, + { code:0xFE9C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE9C + ,simpleLowerCaseMapping:0xFE9C + ,simpleTitleCaseMapping:0xFE9C + }, + { code:0xFE9D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE9D + ,simpleLowerCaseMapping:0xFE9D + ,simpleTitleCaseMapping:0xFE9D + }, + { code:0xFE9E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE9E + ,simpleLowerCaseMapping:0xFE9E + ,simpleTitleCaseMapping:0xFE9E + }, + { code:0xFE9F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFE9F + ,simpleLowerCaseMapping:0xFE9F + ,simpleTitleCaseMapping:0xFE9F + }, + { code:0xFEA0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEA0 + ,simpleLowerCaseMapping:0xFEA0 + ,simpleTitleCaseMapping:0xFEA0 + }, + { code:0xFEA1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEA1 + ,simpleLowerCaseMapping:0xFEA1 + ,simpleTitleCaseMapping:0xFEA1 + }, + { code:0xFEA2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEA2 + ,simpleLowerCaseMapping:0xFEA2 + ,simpleTitleCaseMapping:0xFEA2 + }, + { code:0xFEA3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEA3 + ,simpleLowerCaseMapping:0xFEA3 + ,simpleTitleCaseMapping:0xFEA3 + }, + { code:0xFEA4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEA4 + ,simpleLowerCaseMapping:0xFEA4 + ,simpleTitleCaseMapping:0xFEA4 + }, + { code:0xFEA5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEA5 + ,simpleLowerCaseMapping:0xFEA5 + ,simpleTitleCaseMapping:0xFEA5 + }, + { code:0xFEA6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEA6 + ,simpleLowerCaseMapping:0xFEA6 + ,simpleTitleCaseMapping:0xFEA6 + }, + { code:0xFEA7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEA7 + ,simpleLowerCaseMapping:0xFEA7 + ,simpleTitleCaseMapping:0xFEA7 + }, + { code:0xFEA8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEA8 + ,simpleLowerCaseMapping:0xFEA8 + ,simpleTitleCaseMapping:0xFEA8 + }, + { code:0xFEA9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEA9 + ,simpleLowerCaseMapping:0xFEA9 + ,simpleTitleCaseMapping:0xFEA9 + }, + { code:0xFEAA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEAA + ,simpleLowerCaseMapping:0xFEAA + ,simpleTitleCaseMapping:0xFEAA + }, + { code:0xFEAB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEAB + ,simpleLowerCaseMapping:0xFEAB + ,simpleTitleCaseMapping:0xFEAB + }, + { code:0xFEAC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEAC + ,simpleLowerCaseMapping:0xFEAC + ,simpleTitleCaseMapping:0xFEAC + }, + { code:0xFEAD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEAD + ,simpleLowerCaseMapping:0xFEAD + ,simpleTitleCaseMapping:0xFEAD + }, + { code:0xFEAE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEAE + ,simpleLowerCaseMapping:0xFEAE + ,simpleTitleCaseMapping:0xFEAE + }, + { code:0xFEAF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEAF + ,simpleLowerCaseMapping:0xFEAF + ,simpleTitleCaseMapping:0xFEAF + }, + { code:0xFEB0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEB0 + ,simpleLowerCaseMapping:0xFEB0 + ,simpleTitleCaseMapping:0xFEB0 + }, + { code:0xFEB1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEB1 + ,simpleLowerCaseMapping:0xFEB1 + ,simpleTitleCaseMapping:0xFEB1 + }, + { code:0xFEB2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEB2 + ,simpleLowerCaseMapping:0xFEB2 + ,simpleTitleCaseMapping:0xFEB2 + }, + { code:0xFEB3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEB3 + ,simpleLowerCaseMapping:0xFEB3 + ,simpleTitleCaseMapping:0xFEB3 + }, + { code:0xFEB4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEB4 + ,simpleLowerCaseMapping:0xFEB4 + ,simpleTitleCaseMapping:0xFEB4 + }, + { code:0xFEB5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEB5 + ,simpleLowerCaseMapping:0xFEB5 + ,simpleTitleCaseMapping:0xFEB5 + }, + { code:0xFEB6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEB6 + ,simpleLowerCaseMapping:0xFEB6 + ,simpleTitleCaseMapping:0xFEB6 + }, + { code:0xFEB7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEB7 + ,simpleLowerCaseMapping:0xFEB7 + ,simpleTitleCaseMapping:0xFEB7 + }, + { code:0xFEB8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEB8 + ,simpleLowerCaseMapping:0xFEB8 + ,simpleTitleCaseMapping:0xFEB8 + }, + { code:0xFEB9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEB9 + ,simpleLowerCaseMapping:0xFEB9 + ,simpleTitleCaseMapping:0xFEB9 + }, + { code:0xFEBA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEBA + ,simpleLowerCaseMapping:0xFEBA + ,simpleTitleCaseMapping:0xFEBA + }, + { code:0xFEBB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEBB + ,simpleLowerCaseMapping:0xFEBB + ,simpleTitleCaseMapping:0xFEBB + }, + { code:0xFEBC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEBC + ,simpleLowerCaseMapping:0xFEBC + ,simpleTitleCaseMapping:0xFEBC + }, + { code:0xFEBD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEBD + ,simpleLowerCaseMapping:0xFEBD + ,simpleTitleCaseMapping:0xFEBD + }, + { code:0xFEBE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEBE + ,simpleLowerCaseMapping:0xFEBE + ,simpleTitleCaseMapping:0xFEBE + }, + { code:0xFEBF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEBF + ,simpleLowerCaseMapping:0xFEBF + ,simpleTitleCaseMapping:0xFEBF + }, + { code:0xFEC0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEC0 + ,simpleLowerCaseMapping:0xFEC0 + ,simpleTitleCaseMapping:0xFEC0 + }, + { code:0xFEC1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEC1 + ,simpleLowerCaseMapping:0xFEC1 + ,simpleTitleCaseMapping:0xFEC1 + }, + { code:0xFEC2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEC2 + ,simpleLowerCaseMapping:0xFEC2 + ,simpleTitleCaseMapping:0xFEC2 + }, + { code:0xFEC3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEC3 + ,simpleLowerCaseMapping:0xFEC3 + ,simpleTitleCaseMapping:0xFEC3 + }, + { code:0xFEC4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEC4 + ,simpleLowerCaseMapping:0xFEC4 + ,simpleTitleCaseMapping:0xFEC4 + }, + { code:0xFEC5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEC5 + ,simpleLowerCaseMapping:0xFEC5 + ,simpleTitleCaseMapping:0xFEC5 + }, + { code:0xFEC6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEC6 + ,simpleLowerCaseMapping:0xFEC6 + ,simpleTitleCaseMapping:0xFEC6 + }, + { code:0xFEC7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEC7 + ,simpleLowerCaseMapping:0xFEC7 + ,simpleTitleCaseMapping:0xFEC7 + }, + { code:0xFEC8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEC8 + ,simpleLowerCaseMapping:0xFEC8 + ,simpleTitleCaseMapping:0xFEC8 + }, + { code:0xFEC9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEC9 + ,simpleLowerCaseMapping:0xFEC9 + ,simpleTitleCaseMapping:0xFEC9 + }, + { code:0xFECA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFECA + ,simpleLowerCaseMapping:0xFECA + ,simpleTitleCaseMapping:0xFECA + }, + { code:0xFECB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFECB + ,simpleLowerCaseMapping:0xFECB + ,simpleTitleCaseMapping:0xFECB + }, + { code:0xFECC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFECC + ,simpleLowerCaseMapping:0xFECC + ,simpleTitleCaseMapping:0xFECC + }, + { code:0xFECD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFECD + ,simpleLowerCaseMapping:0xFECD + ,simpleTitleCaseMapping:0xFECD + }, + { code:0xFECE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFECE + ,simpleLowerCaseMapping:0xFECE + ,simpleTitleCaseMapping:0xFECE + }, + { code:0xFECF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFECF + ,simpleLowerCaseMapping:0xFECF + ,simpleTitleCaseMapping:0xFECF + }, + { code:0xFED0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFED0 + ,simpleLowerCaseMapping:0xFED0 + ,simpleTitleCaseMapping:0xFED0 + }, + { code:0xFED1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFED1 + ,simpleLowerCaseMapping:0xFED1 + ,simpleTitleCaseMapping:0xFED1 + }, + { code:0xFED2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFED2 + ,simpleLowerCaseMapping:0xFED2 + ,simpleTitleCaseMapping:0xFED2 + }, + { code:0xFED3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFED3 + ,simpleLowerCaseMapping:0xFED3 + ,simpleTitleCaseMapping:0xFED3 + }, + { code:0xFED4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFED4 + ,simpleLowerCaseMapping:0xFED4 + ,simpleTitleCaseMapping:0xFED4 + }, + { code:0xFED5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFED5 + ,simpleLowerCaseMapping:0xFED5 + ,simpleTitleCaseMapping:0xFED5 + }, + { code:0xFED6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFED6 + ,simpleLowerCaseMapping:0xFED6 + ,simpleTitleCaseMapping:0xFED6 + }, + { code:0xFED7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFED7 + ,simpleLowerCaseMapping:0xFED7 + ,simpleTitleCaseMapping:0xFED7 + }, + { code:0xFED8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFED8 + ,simpleLowerCaseMapping:0xFED8 + ,simpleTitleCaseMapping:0xFED8 + }, + { code:0xFED9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFED9 + ,simpleLowerCaseMapping:0xFED9 + ,simpleTitleCaseMapping:0xFED9 + }, + { code:0xFEDA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEDA + ,simpleLowerCaseMapping:0xFEDA + ,simpleTitleCaseMapping:0xFEDA + }, + { code:0xFEDB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEDB + ,simpleLowerCaseMapping:0xFEDB + ,simpleTitleCaseMapping:0xFEDB + }, + { code:0xFEDC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEDC + ,simpleLowerCaseMapping:0xFEDC + ,simpleTitleCaseMapping:0xFEDC + }, + { code:0xFEDD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEDD + ,simpleLowerCaseMapping:0xFEDD + ,simpleTitleCaseMapping:0xFEDD + }, + { code:0xFEDE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEDE + ,simpleLowerCaseMapping:0xFEDE + ,simpleTitleCaseMapping:0xFEDE + }, + { code:0xFEDF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEDF + ,simpleLowerCaseMapping:0xFEDF + ,simpleTitleCaseMapping:0xFEDF + }, + { code:0xFEE0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEE0 + ,simpleLowerCaseMapping:0xFEE0 + ,simpleTitleCaseMapping:0xFEE0 + }, + { code:0xFEE1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEE1 + ,simpleLowerCaseMapping:0xFEE1 + ,simpleTitleCaseMapping:0xFEE1 + }, + { code:0xFEE2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEE2 + ,simpleLowerCaseMapping:0xFEE2 + ,simpleTitleCaseMapping:0xFEE2 + }, + { code:0xFEE3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEE3 + ,simpleLowerCaseMapping:0xFEE3 + ,simpleTitleCaseMapping:0xFEE3 + }, + { code:0xFEE4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEE4 + ,simpleLowerCaseMapping:0xFEE4 + ,simpleTitleCaseMapping:0xFEE4 + }, + { code:0xFEE5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEE5 + ,simpleLowerCaseMapping:0xFEE5 + ,simpleTitleCaseMapping:0xFEE5 + }, + { code:0xFEE6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEE6 + ,simpleLowerCaseMapping:0xFEE6 + ,simpleTitleCaseMapping:0xFEE6 + }, + { code:0xFEE7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEE7 + ,simpleLowerCaseMapping:0xFEE7 + ,simpleTitleCaseMapping:0xFEE7 + }, + { code:0xFEE8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEE8 + ,simpleLowerCaseMapping:0xFEE8 + ,simpleTitleCaseMapping:0xFEE8 + }, + { code:0xFEE9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEE9 + ,simpleLowerCaseMapping:0xFEE9 + ,simpleTitleCaseMapping:0xFEE9 + }, + { code:0xFEEA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEEA + ,simpleLowerCaseMapping:0xFEEA + ,simpleTitleCaseMapping:0xFEEA + }, + { code:0xFEEB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEEB + ,simpleLowerCaseMapping:0xFEEB + ,simpleTitleCaseMapping:0xFEEB + }, + { code:0xFEEC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEEC + ,simpleLowerCaseMapping:0xFEEC + ,simpleTitleCaseMapping:0xFEEC + }, + { code:0xFEED + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEED + ,simpleLowerCaseMapping:0xFEED + ,simpleTitleCaseMapping:0xFEED + }, + { code:0xFEEE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEEE + ,simpleLowerCaseMapping:0xFEEE + ,simpleTitleCaseMapping:0xFEEE + }, + { code:0xFEEF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEEF + ,simpleLowerCaseMapping:0xFEEF + ,simpleTitleCaseMapping:0xFEEF + }, + { code:0xFEF0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEF0 + ,simpleLowerCaseMapping:0xFEF0 + ,simpleTitleCaseMapping:0xFEF0 + }, + { code:0xFEF1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEF1 + ,simpleLowerCaseMapping:0xFEF1 + ,simpleTitleCaseMapping:0xFEF1 + }, + { code:0xFEF2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEF2 + ,simpleLowerCaseMapping:0xFEF2 + ,simpleTitleCaseMapping:0xFEF2 + }, + { code:0xFEF3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEF3 + ,simpleLowerCaseMapping:0xFEF3 + ,simpleTitleCaseMapping:0xFEF3 + }, + { code:0xFEF4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEF4 + ,simpleLowerCaseMapping:0xFEF4 + ,simpleTitleCaseMapping:0xFEF4 + }, + { code:0xFEF5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEF5 + ,simpleLowerCaseMapping:0xFEF5 + ,simpleTitleCaseMapping:0xFEF5 + }, + { code:0xFEF6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEF6 + ,simpleLowerCaseMapping:0xFEF6 + ,simpleTitleCaseMapping:0xFEF6 + }, + { code:0xFEF7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEF7 + ,simpleLowerCaseMapping:0xFEF7 + ,simpleTitleCaseMapping:0xFEF7 + }, + { code:0xFEF8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEF8 + ,simpleLowerCaseMapping:0xFEF8 + ,simpleTitleCaseMapping:0xFEF8 + }, + { code:0xFEF9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEF9 + ,simpleLowerCaseMapping:0xFEF9 + ,simpleTitleCaseMapping:0xFEF9 + }, + { code:0xFEFA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEFA + ,simpleLowerCaseMapping:0xFEFA + ,simpleTitleCaseMapping:0xFEFA + }, + { code:0xFEFB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEFB + ,simpleLowerCaseMapping:0xFEFB + ,simpleTitleCaseMapping:0xFEFB + }, + { code:0xFEFC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFEFC + ,simpleLowerCaseMapping:0xFEFC + ,simpleTitleCaseMapping:0xFEFC + }, + { code:0xFEFF + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xFEFF + ,simpleLowerCaseMapping:0xFEFF + ,simpleTitleCaseMapping:0xFEFF + }, + { code:0xFF01 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFF01 + ,simpleLowerCaseMapping:0xFF01 + ,simpleTitleCaseMapping:0xFF01 + }, + { code:0xFF02 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFF02 + ,simpleLowerCaseMapping:0xFF02 + ,simpleTitleCaseMapping:0xFF02 + }, + { code:0xFF03 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFF03 + ,simpleLowerCaseMapping:0xFF03 + ,simpleTitleCaseMapping:0xFF03 + }, + { code:0xFF04 + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0xFF04 + ,simpleLowerCaseMapping:0xFF04 + ,simpleTitleCaseMapping:0xFF04 + }, + { code:0xFF05 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFF05 + ,simpleLowerCaseMapping:0xFF05 + ,simpleTitleCaseMapping:0xFF05 + }, + { code:0xFF06 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFF06 + ,simpleLowerCaseMapping:0xFF06 + ,simpleTitleCaseMapping:0xFF06 + }, + { code:0xFF07 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFF07 + ,simpleLowerCaseMapping:0xFF07 + ,simpleTitleCaseMapping:0xFF07 + }, + { code:0xFF08 + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0xFF08 + ,simpleLowerCaseMapping:0xFF08 + ,simpleTitleCaseMapping:0xFF08 + }, + { code:0xFF09 + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0xFF09 + ,simpleLowerCaseMapping:0xFF09 + ,simpleTitleCaseMapping:0xFF09 + }, + { code:0xFF0A + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFF0A + ,simpleLowerCaseMapping:0xFF0A + ,simpleTitleCaseMapping:0xFF0A + }, + { code:0xFF0B + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0xFF0B + ,simpleLowerCaseMapping:0xFF0B + ,simpleTitleCaseMapping:0xFF0B + }, + { code:0xFF0C + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFF0C + ,simpleLowerCaseMapping:0xFF0C + ,simpleTitleCaseMapping:0xFF0C + }, + { code:0xFF0D + ,generalCategory:UnicodeData.GeneralCategory.Pd + ,simpleUpperCaseMapping:0xFF0D + ,simpleLowerCaseMapping:0xFF0D + ,simpleTitleCaseMapping:0xFF0D + }, + { code:0xFF0E + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFF0E + ,simpleLowerCaseMapping:0xFF0E + ,simpleTitleCaseMapping:0xFF0E + }, + { code:0xFF0F + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFF0F + ,simpleLowerCaseMapping:0xFF0F + ,simpleTitleCaseMapping:0xFF0F + }, + { code:0xFF10 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0xFF10 + ,simpleLowerCaseMapping:0xFF10 + ,simpleTitleCaseMapping:0xFF10 + }, + { code:0xFF11 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0xFF11 + ,simpleLowerCaseMapping:0xFF11 + ,simpleTitleCaseMapping:0xFF11 + }, + { code:0xFF12 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0xFF12 + ,simpleLowerCaseMapping:0xFF12 + ,simpleTitleCaseMapping:0xFF12 + }, + { code:0xFF13 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0xFF13 + ,simpleLowerCaseMapping:0xFF13 + ,simpleTitleCaseMapping:0xFF13 + }, + { code:0xFF14 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0xFF14 + ,simpleLowerCaseMapping:0xFF14 + ,simpleTitleCaseMapping:0xFF14 + }, + { code:0xFF15 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0xFF15 + ,simpleLowerCaseMapping:0xFF15 + ,simpleTitleCaseMapping:0xFF15 + }, + { code:0xFF16 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0xFF16 + ,simpleLowerCaseMapping:0xFF16 + ,simpleTitleCaseMapping:0xFF16 + }, + { code:0xFF17 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0xFF17 + ,simpleLowerCaseMapping:0xFF17 + ,simpleTitleCaseMapping:0xFF17 + }, + { code:0xFF18 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0xFF18 + ,simpleLowerCaseMapping:0xFF18 + ,simpleTitleCaseMapping:0xFF18 + }, + { code:0xFF19 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0xFF19 + ,simpleLowerCaseMapping:0xFF19 + ,simpleTitleCaseMapping:0xFF19 + }, + { code:0xFF1A + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFF1A + ,simpleLowerCaseMapping:0xFF1A + ,simpleTitleCaseMapping:0xFF1A + }, + { code:0xFF1B + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFF1B + ,simpleLowerCaseMapping:0xFF1B + ,simpleTitleCaseMapping:0xFF1B + }, + { code:0xFF1C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0xFF1C + ,simpleLowerCaseMapping:0xFF1C + ,simpleTitleCaseMapping:0xFF1C + }, + { code:0xFF1D + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0xFF1D + ,simpleLowerCaseMapping:0xFF1D + ,simpleTitleCaseMapping:0xFF1D + }, + { code:0xFF1E + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0xFF1E + ,simpleLowerCaseMapping:0xFF1E + ,simpleTitleCaseMapping:0xFF1E + }, + { code:0xFF1F + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFF1F + ,simpleLowerCaseMapping:0xFF1F + ,simpleTitleCaseMapping:0xFF1F + }, + { code:0xFF20 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFF20 + ,simpleLowerCaseMapping:0xFF20 + ,simpleTitleCaseMapping:0xFF20 + }, + { code:0xFF21 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0xFF21 + ,simpleLowerCaseMapping:0xFF41 + ,simpleTitleCaseMapping:0xFF21 + }, + { code:0xFF22 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0xFF22 + ,simpleLowerCaseMapping:0xFF42 + ,simpleTitleCaseMapping:0xFF22 + }, + { code:0xFF23 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0xFF23 + ,simpleLowerCaseMapping:0xFF43 + ,simpleTitleCaseMapping:0xFF23 + }, + { code:0xFF24 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0xFF24 + ,simpleLowerCaseMapping:0xFF44 + ,simpleTitleCaseMapping:0xFF24 + }, + { code:0xFF25 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0xFF25 + ,simpleLowerCaseMapping:0xFF45 + ,simpleTitleCaseMapping:0xFF25 + }, + { code:0xFF26 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0xFF26 + ,simpleLowerCaseMapping:0xFF46 + ,simpleTitleCaseMapping:0xFF26 + }, + { code:0xFF27 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0xFF27 + ,simpleLowerCaseMapping:0xFF47 + ,simpleTitleCaseMapping:0xFF27 + }, + { code:0xFF28 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0xFF28 + ,simpleLowerCaseMapping:0xFF48 + ,simpleTitleCaseMapping:0xFF28 + }, + { code:0xFF29 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0xFF29 + ,simpleLowerCaseMapping:0xFF49 + ,simpleTitleCaseMapping:0xFF29 + }, + { code:0xFF2A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0xFF2A + ,simpleLowerCaseMapping:0xFF4A + ,simpleTitleCaseMapping:0xFF2A + }, + { code:0xFF2B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0xFF2B + ,simpleLowerCaseMapping:0xFF4B + ,simpleTitleCaseMapping:0xFF2B + }, + { code:0xFF2C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0xFF2C + ,simpleLowerCaseMapping:0xFF4C + ,simpleTitleCaseMapping:0xFF2C + }, + { code:0xFF2D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0xFF2D + ,simpleLowerCaseMapping:0xFF4D + ,simpleTitleCaseMapping:0xFF2D + }, + { code:0xFF2E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0xFF2E + ,simpleLowerCaseMapping:0xFF4E + ,simpleTitleCaseMapping:0xFF2E + }, + { code:0xFF2F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0xFF2F + ,simpleLowerCaseMapping:0xFF4F + ,simpleTitleCaseMapping:0xFF2F + }, + { code:0xFF30 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0xFF30 + ,simpleLowerCaseMapping:0xFF50 + ,simpleTitleCaseMapping:0xFF30 + }, + { code:0xFF31 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0xFF31 + ,simpleLowerCaseMapping:0xFF51 + ,simpleTitleCaseMapping:0xFF31 + }, + { code:0xFF32 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0xFF32 + ,simpleLowerCaseMapping:0xFF52 + ,simpleTitleCaseMapping:0xFF32 + }, + { code:0xFF33 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0xFF33 + ,simpleLowerCaseMapping:0xFF53 + ,simpleTitleCaseMapping:0xFF33 + }, + { code:0xFF34 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0xFF34 + ,simpleLowerCaseMapping:0xFF54 + ,simpleTitleCaseMapping:0xFF34 + }, + { code:0xFF35 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0xFF35 + ,simpleLowerCaseMapping:0xFF55 + ,simpleTitleCaseMapping:0xFF35 + }, + { code:0xFF36 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0xFF36 + ,simpleLowerCaseMapping:0xFF56 + ,simpleTitleCaseMapping:0xFF36 + }, + { code:0xFF37 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0xFF37 + ,simpleLowerCaseMapping:0xFF57 + ,simpleTitleCaseMapping:0xFF37 + }, + { code:0xFF38 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0xFF38 + ,simpleLowerCaseMapping:0xFF58 + ,simpleTitleCaseMapping:0xFF38 + }, + { code:0xFF39 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0xFF39 + ,simpleLowerCaseMapping:0xFF59 + ,simpleTitleCaseMapping:0xFF39 + }, + { code:0xFF3A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0xFF3A + ,simpleLowerCaseMapping:0xFF5A + ,simpleTitleCaseMapping:0xFF3A + }, + { code:0xFF3B + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0xFF3B + ,simpleLowerCaseMapping:0xFF3B + ,simpleTitleCaseMapping:0xFF3B + }, + { code:0xFF3C + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFF3C + ,simpleLowerCaseMapping:0xFF3C + ,simpleTitleCaseMapping:0xFF3C + }, + { code:0xFF3D + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0xFF3D + ,simpleLowerCaseMapping:0xFF3D + ,simpleTitleCaseMapping:0xFF3D + }, + { code:0xFF3E + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0xFF3E + ,simpleLowerCaseMapping:0xFF3E + ,simpleTitleCaseMapping:0xFF3E + }, + { code:0xFF3F + ,generalCategory:UnicodeData.GeneralCategory.Pc + ,simpleUpperCaseMapping:0xFF3F + ,simpleLowerCaseMapping:0xFF3F + ,simpleTitleCaseMapping:0xFF3F + }, + { code:0xFF40 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0xFF40 + ,simpleLowerCaseMapping:0xFF40 + ,simpleTitleCaseMapping:0xFF40 + }, + { code:0xFF41 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0xFF21 + ,simpleLowerCaseMapping:0xFF41 + ,simpleTitleCaseMapping:0xFF21 + }, + { code:0xFF42 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0xFF22 + ,simpleLowerCaseMapping:0xFF42 + ,simpleTitleCaseMapping:0xFF22 + }, + { code:0xFF43 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0xFF23 + ,simpleLowerCaseMapping:0xFF43 + ,simpleTitleCaseMapping:0xFF23 + }, + { code:0xFF44 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0xFF24 + ,simpleLowerCaseMapping:0xFF44 + ,simpleTitleCaseMapping:0xFF24 + }, + { code:0xFF45 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0xFF25 + ,simpleLowerCaseMapping:0xFF45 + ,simpleTitleCaseMapping:0xFF25 + }, + { code:0xFF46 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0xFF26 + ,simpleLowerCaseMapping:0xFF46 + ,simpleTitleCaseMapping:0xFF26 + }, + { code:0xFF47 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0xFF27 + ,simpleLowerCaseMapping:0xFF47 + ,simpleTitleCaseMapping:0xFF27 + }, + { code:0xFF48 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0xFF28 + ,simpleLowerCaseMapping:0xFF48 + ,simpleTitleCaseMapping:0xFF28 + }, + { code:0xFF49 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0xFF29 + ,simpleLowerCaseMapping:0xFF49 + ,simpleTitleCaseMapping:0xFF29 + }, + { code:0xFF4A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0xFF2A + ,simpleLowerCaseMapping:0xFF4A + ,simpleTitleCaseMapping:0xFF2A + }, + { code:0xFF4B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0xFF2B + ,simpleLowerCaseMapping:0xFF4B + ,simpleTitleCaseMapping:0xFF2B + }, + { code:0xFF4C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0xFF2C + ,simpleLowerCaseMapping:0xFF4C + ,simpleTitleCaseMapping:0xFF2C + }, + { code:0xFF4D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0xFF2D + ,simpleLowerCaseMapping:0xFF4D + ,simpleTitleCaseMapping:0xFF2D + }, + { code:0xFF4E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0xFF2E + ,simpleLowerCaseMapping:0xFF4E + ,simpleTitleCaseMapping:0xFF2E + }, + { code:0xFF4F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0xFF2F + ,simpleLowerCaseMapping:0xFF4F + ,simpleTitleCaseMapping:0xFF2F + }, + { code:0xFF50 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0xFF30 + ,simpleLowerCaseMapping:0xFF50 + ,simpleTitleCaseMapping:0xFF30 + }, + { code:0xFF51 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0xFF31 + ,simpleLowerCaseMapping:0xFF51 + ,simpleTitleCaseMapping:0xFF31 + }, + { code:0xFF52 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0xFF32 + ,simpleLowerCaseMapping:0xFF52 + ,simpleTitleCaseMapping:0xFF32 + }, + { code:0xFF53 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0xFF33 + ,simpleLowerCaseMapping:0xFF53 + ,simpleTitleCaseMapping:0xFF33 + }, + { code:0xFF54 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0xFF34 + ,simpleLowerCaseMapping:0xFF54 + ,simpleTitleCaseMapping:0xFF34 + }, + { code:0xFF55 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0xFF35 + ,simpleLowerCaseMapping:0xFF55 + ,simpleTitleCaseMapping:0xFF35 + }, + { code:0xFF56 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0xFF36 + ,simpleLowerCaseMapping:0xFF56 + ,simpleTitleCaseMapping:0xFF36 + }, + { code:0xFF57 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0xFF37 + ,simpleLowerCaseMapping:0xFF57 + ,simpleTitleCaseMapping:0xFF37 + }, + { code:0xFF58 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0xFF38 + ,simpleLowerCaseMapping:0xFF58 + ,simpleTitleCaseMapping:0xFF38 + }, + { code:0xFF59 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0xFF39 + ,simpleLowerCaseMapping:0xFF59 + ,simpleTitleCaseMapping:0xFF39 + }, + { code:0xFF5A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0xFF3A + ,simpleLowerCaseMapping:0xFF5A + ,simpleTitleCaseMapping:0xFF3A + }, + { code:0xFF5B + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0xFF5B + ,simpleLowerCaseMapping:0xFF5B + ,simpleTitleCaseMapping:0xFF5B + }, + { code:0xFF5C + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0xFF5C + ,simpleLowerCaseMapping:0xFF5C + ,simpleTitleCaseMapping:0xFF5C + }, + { code:0xFF5D + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0xFF5D + ,simpleLowerCaseMapping:0xFF5D + ,simpleTitleCaseMapping:0xFF5D + }, + { code:0xFF5E + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0xFF5E + ,simpleLowerCaseMapping:0xFF5E + ,simpleTitleCaseMapping:0xFF5E + }, + { code:0xFF5F + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0xFF5F + ,simpleLowerCaseMapping:0xFF5F + ,simpleTitleCaseMapping:0xFF5F + }, + { code:0xFF60 + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0xFF60 + ,simpleLowerCaseMapping:0xFF60 + ,simpleTitleCaseMapping:0xFF60 + }, + { code:0xFF61 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFF61 + ,simpleLowerCaseMapping:0xFF61 + ,simpleTitleCaseMapping:0xFF61 + }, + { code:0xFF62 + ,generalCategory:UnicodeData.GeneralCategory.Ps + ,simpleUpperCaseMapping:0xFF62 + ,simpleLowerCaseMapping:0xFF62 + ,simpleTitleCaseMapping:0xFF62 + }, + { code:0xFF63 + ,generalCategory:UnicodeData.GeneralCategory.Pe + ,simpleUpperCaseMapping:0xFF63 + ,simpleLowerCaseMapping:0xFF63 + ,simpleTitleCaseMapping:0xFF63 + }, + { code:0xFF64 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFF64 + ,simpleLowerCaseMapping:0xFF64 + ,simpleTitleCaseMapping:0xFF64 + }, + { code:0xFF65 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0xFF65 + ,simpleLowerCaseMapping:0xFF65 + ,simpleTitleCaseMapping:0xFF65 + }, + { code:0xFF66 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF66 + ,simpleLowerCaseMapping:0xFF66 + ,simpleTitleCaseMapping:0xFF66 + }, + { code:0xFF67 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF67 + ,simpleLowerCaseMapping:0xFF67 + ,simpleTitleCaseMapping:0xFF67 + }, + { code:0xFF68 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF68 + ,simpleLowerCaseMapping:0xFF68 + ,simpleTitleCaseMapping:0xFF68 + }, + { code:0xFF69 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF69 + ,simpleLowerCaseMapping:0xFF69 + ,simpleTitleCaseMapping:0xFF69 + }, + { code:0xFF6A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF6A + ,simpleLowerCaseMapping:0xFF6A + ,simpleTitleCaseMapping:0xFF6A + }, + { code:0xFF6B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF6B + ,simpleLowerCaseMapping:0xFF6B + ,simpleTitleCaseMapping:0xFF6B + }, + { code:0xFF6C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF6C + ,simpleLowerCaseMapping:0xFF6C + ,simpleTitleCaseMapping:0xFF6C + }, + { code:0xFF6D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF6D + ,simpleLowerCaseMapping:0xFF6D + ,simpleTitleCaseMapping:0xFF6D + }, + { code:0xFF6E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF6E + ,simpleLowerCaseMapping:0xFF6E + ,simpleTitleCaseMapping:0xFF6E + }, + { code:0xFF6F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF6F + ,simpleLowerCaseMapping:0xFF6F + ,simpleTitleCaseMapping:0xFF6F + }, + { code:0xFF70 + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0xFF70 + ,simpleLowerCaseMapping:0xFF70 + ,simpleTitleCaseMapping:0xFF70 + }, + { code:0xFF71 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF71 + ,simpleLowerCaseMapping:0xFF71 + ,simpleTitleCaseMapping:0xFF71 + }, + { code:0xFF72 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF72 + ,simpleLowerCaseMapping:0xFF72 + ,simpleTitleCaseMapping:0xFF72 + }, + { code:0xFF73 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF73 + ,simpleLowerCaseMapping:0xFF73 + ,simpleTitleCaseMapping:0xFF73 + }, + { code:0xFF74 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF74 + ,simpleLowerCaseMapping:0xFF74 + ,simpleTitleCaseMapping:0xFF74 + }, + { code:0xFF75 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF75 + ,simpleLowerCaseMapping:0xFF75 + ,simpleTitleCaseMapping:0xFF75 + }, + { code:0xFF76 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF76 + ,simpleLowerCaseMapping:0xFF76 + ,simpleTitleCaseMapping:0xFF76 + }, + { code:0xFF77 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF77 + ,simpleLowerCaseMapping:0xFF77 + ,simpleTitleCaseMapping:0xFF77 + }, + { code:0xFF78 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF78 + ,simpleLowerCaseMapping:0xFF78 + ,simpleTitleCaseMapping:0xFF78 + }, + { code:0xFF79 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF79 + ,simpleLowerCaseMapping:0xFF79 + ,simpleTitleCaseMapping:0xFF79 + }, + { code:0xFF7A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF7A + ,simpleLowerCaseMapping:0xFF7A + ,simpleTitleCaseMapping:0xFF7A + }, + { code:0xFF7B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF7B + ,simpleLowerCaseMapping:0xFF7B + ,simpleTitleCaseMapping:0xFF7B + }, + { code:0xFF7C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF7C + ,simpleLowerCaseMapping:0xFF7C + ,simpleTitleCaseMapping:0xFF7C + }, + { code:0xFF7D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF7D + ,simpleLowerCaseMapping:0xFF7D + ,simpleTitleCaseMapping:0xFF7D + }, + { code:0xFF7E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF7E + ,simpleLowerCaseMapping:0xFF7E + ,simpleTitleCaseMapping:0xFF7E + }, + { code:0xFF7F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF7F + ,simpleLowerCaseMapping:0xFF7F + ,simpleTitleCaseMapping:0xFF7F + }, + { code:0xFF80 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF80 + ,simpleLowerCaseMapping:0xFF80 + ,simpleTitleCaseMapping:0xFF80 + }, + { code:0xFF81 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF81 + ,simpleLowerCaseMapping:0xFF81 + ,simpleTitleCaseMapping:0xFF81 + }, + { code:0xFF82 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF82 + ,simpleLowerCaseMapping:0xFF82 + ,simpleTitleCaseMapping:0xFF82 + }, + { code:0xFF83 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF83 + ,simpleLowerCaseMapping:0xFF83 + ,simpleTitleCaseMapping:0xFF83 + }, + { code:0xFF84 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF84 + ,simpleLowerCaseMapping:0xFF84 + ,simpleTitleCaseMapping:0xFF84 + }, + { code:0xFF85 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF85 + ,simpleLowerCaseMapping:0xFF85 + ,simpleTitleCaseMapping:0xFF85 + }, + { code:0xFF86 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF86 + ,simpleLowerCaseMapping:0xFF86 + ,simpleTitleCaseMapping:0xFF86 + }, + { code:0xFF87 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF87 + ,simpleLowerCaseMapping:0xFF87 + ,simpleTitleCaseMapping:0xFF87 + }, + { code:0xFF88 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF88 + ,simpleLowerCaseMapping:0xFF88 + ,simpleTitleCaseMapping:0xFF88 + }, + { code:0xFF89 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF89 + ,simpleLowerCaseMapping:0xFF89 + ,simpleTitleCaseMapping:0xFF89 + }, + { code:0xFF8A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF8A + ,simpleLowerCaseMapping:0xFF8A + ,simpleTitleCaseMapping:0xFF8A + }, + { code:0xFF8B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF8B + ,simpleLowerCaseMapping:0xFF8B + ,simpleTitleCaseMapping:0xFF8B + }, + { code:0xFF8C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF8C + ,simpleLowerCaseMapping:0xFF8C + ,simpleTitleCaseMapping:0xFF8C + }, + { code:0xFF8D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF8D + ,simpleLowerCaseMapping:0xFF8D + ,simpleTitleCaseMapping:0xFF8D + }, + { code:0xFF8E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF8E + ,simpleLowerCaseMapping:0xFF8E + ,simpleTitleCaseMapping:0xFF8E + }, + { code:0xFF8F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF8F + ,simpleLowerCaseMapping:0xFF8F + ,simpleTitleCaseMapping:0xFF8F + }, + { code:0xFF90 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF90 + ,simpleLowerCaseMapping:0xFF90 + ,simpleTitleCaseMapping:0xFF90 + }, + { code:0xFF91 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF91 + ,simpleLowerCaseMapping:0xFF91 + ,simpleTitleCaseMapping:0xFF91 + }, + { code:0xFF92 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF92 + ,simpleLowerCaseMapping:0xFF92 + ,simpleTitleCaseMapping:0xFF92 + }, + { code:0xFF93 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF93 + ,simpleLowerCaseMapping:0xFF93 + ,simpleTitleCaseMapping:0xFF93 + }, + { code:0xFF94 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF94 + ,simpleLowerCaseMapping:0xFF94 + ,simpleTitleCaseMapping:0xFF94 + }, + { code:0xFF95 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF95 + ,simpleLowerCaseMapping:0xFF95 + ,simpleTitleCaseMapping:0xFF95 + }, + { code:0xFF96 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF96 + ,simpleLowerCaseMapping:0xFF96 + ,simpleTitleCaseMapping:0xFF96 + }, + { code:0xFF97 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF97 + ,simpleLowerCaseMapping:0xFF97 + ,simpleTitleCaseMapping:0xFF97 + }, + { code:0xFF98 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF98 + ,simpleLowerCaseMapping:0xFF98 + ,simpleTitleCaseMapping:0xFF98 + }, + { code:0xFF99 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF99 + ,simpleLowerCaseMapping:0xFF99 + ,simpleTitleCaseMapping:0xFF99 + }, + { code:0xFF9A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF9A + ,simpleLowerCaseMapping:0xFF9A + ,simpleTitleCaseMapping:0xFF9A + }, + { code:0xFF9B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF9B + ,simpleLowerCaseMapping:0xFF9B + ,simpleTitleCaseMapping:0xFF9B + }, + { code:0xFF9C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF9C + ,simpleLowerCaseMapping:0xFF9C + ,simpleTitleCaseMapping:0xFF9C + }, + { code:0xFF9D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFF9D + ,simpleLowerCaseMapping:0xFF9D + ,simpleTitleCaseMapping:0xFF9D + }, + { code:0xFF9E + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0xFF9E + ,simpleLowerCaseMapping:0xFF9E + ,simpleTitleCaseMapping:0xFF9E + }, + { code:0xFF9F + ,generalCategory:UnicodeData.GeneralCategory.Lm + ,simpleUpperCaseMapping:0xFF9F + ,simpleLowerCaseMapping:0xFF9F + ,simpleTitleCaseMapping:0xFF9F + }, + { code:0xFFA0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFA0 + ,simpleLowerCaseMapping:0xFFA0 + ,simpleTitleCaseMapping:0xFFA0 + }, + { code:0xFFA1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFA1 + ,simpleLowerCaseMapping:0xFFA1 + ,simpleTitleCaseMapping:0xFFA1 + }, + { code:0xFFA2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFA2 + ,simpleLowerCaseMapping:0xFFA2 + ,simpleTitleCaseMapping:0xFFA2 + }, + { code:0xFFA3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFA3 + ,simpleLowerCaseMapping:0xFFA3 + ,simpleTitleCaseMapping:0xFFA3 + }, + { code:0xFFA4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFA4 + ,simpleLowerCaseMapping:0xFFA4 + ,simpleTitleCaseMapping:0xFFA4 + }, + { code:0xFFA5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFA5 + ,simpleLowerCaseMapping:0xFFA5 + ,simpleTitleCaseMapping:0xFFA5 + }, + { code:0xFFA6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFA6 + ,simpleLowerCaseMapping:0xFFA6 + ,simpleTitleCaseMapping:0xFFA6 + }, + { code:0xFFA7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFA7 + ,simpleLowerCaseMapping:0xFFA7 + ,simpleTitleCaseMapping:0xFFA7 + }, + { code:0xFFA8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFA8 + ,simpleLowerCaseMapping:0xFFA8 + ,simpleTitleCaseMapping:0xFFA8 + }, + { code:0xFFA9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFA9 + ,simpleLowerCaseMapping:0xFFA9 + ,simpleTitleCaseMapping:0xFFA9 + }, + { code:0xFFAA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFAA + ,simpleLowerCaseMapping:0xFFAA + ,simpleTitleCaseMapping:0xFFAA + }, + { code:0xFFAB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFAB + ,simpleLowerCaseMapping:0xFFAB + ,simpleTitleCaseMapping:0xFFAB + }, + { code:0xFFAC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFAC + ,simpleLowerCaseMapping:0xFFAC + ,simpleTitleCaseMapping:0xFFAC + }, + { code:0xFFAD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFAD + ,simpleLowerCaseMapping:0xFFAD + ,simpleTitleCaseMapping:0xFFAD + }, + { code:0xFFAE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFAE + ,simpleLowerCaseMapping:0xFFAE + ,simpleTitleCaseMapping:0xFFAE + }, + { code:0xFFAF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFAF + ,simpleLowerCaseMapping:0xFFAF + ,simpleTitleCaseMapping:0xFFAF + }, + { code:0xFFB0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFB0 + ,simpleLowerCaseMapping:0xFFB0 + ,simpleTitleCaseMapping:0xFFB0 + }, + { code:0xFFB1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFB1 + ,simpleLowerCaseMapping:0xFFB1 + ,simpleTitleCaseMapping:0xFFB1 + }, + { code:0xFFB2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFB2 + ,simpleLowerCaseMapping:0xFFB2 + ,simpleTitleCaseMapping:0xFFB2 + }, + { code:0xFFB3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFB3 + ,simpleLowerCaseMapping:0xFFB3 + ,simpleTitleCaseMapping:0xFFB3 + }, + { code:0xFFB4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFB4 + ,simpleLowerCaseMapping:0xFFB4 + ,simpleTitleCaseMapping:0xFFB4 + }, + { code:0xFFB5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFB5 + ,simpleLowerCaseMapping:0xFFB5 + ,simpleTitleCaseMapping:0xFFB5 + }, + { code:0xFFB6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFB6 + ,simpleLowerCaseMapping:0xFFB6 + ,simpleTitleCaseMapping:0xFFB6 + }, + { code:0xFFB7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFB7 + ,simpleLowerCaseMapping:0xFFB7 + ,simpleTitleCaseMapping:0xFFB7 + }, + { code:0xFFB8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFB8 + ,simpleLowerCaseMapping:0xFFB8 + ,simpleTitleCaseMapping:0xFFB8 + }, + { code:0xFFB9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFB9 + ,simpleLowerCaseMapping:0xFFB9 + ,simpleTitleCaseMapping:0xFFB9 + }, + { code:0xFFBA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFBA + ,simpleLowerCaseMapping:0xFFBA + ,simpleTitleCaseMapping:0xFFBA + }, + { code:0xFFBB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFBB + ,simpleLowerCaseMapping:0xFFBB + ,simpleTitleCaseMapping:0xFFBB + }, + { code:0xFFBC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFBC + ,simpleLowerCaseMapping:0xFFBC + ,simpleTitleCaseMapping:0xFFBC + }, + { code:0xFFBD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFBD + ,simpleLowerCaseMapping:0xFFBD + ,simpleTitleCaseMapping:0xFFBD + }, + { code:0xFFBE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFBE + ,simpleLowerCaseMapping:0xFFBE + ,simpleTitleCaseMapping:0xFFBE + }, + { code:0xFFC2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFC2 + ,simpleLowerCaseMapping:0xFFC2 + ,simpleTitleCaseMapping:0xFFC2 + }, + { code:0xFFC3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFC3 + ,simpleLowerCaseMapping:0xFFC3 + ,simpleTitleCaseMapping:0xFFC3 + }, + { code:0xFFC4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFC4 + ,simpleLowerCaseMapping:0xFFC4 + ,simpleTitleCaseMapping:0xFFC4 + }, + { code:0xFFC5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFC5 + ,simpleLowerCaseMapping:0xFFC5 + ,simpleTitleCaseMapping:0xFFC5 + }, + { code:0xFFC6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFC6 + ,simpleLowerCaseMapping:0xFFC6 + ,simpleTitleCaseMapping:0xFFC6 + }, + { code:0xFFC7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFC7 + ,simpleLowerCaseMapping:0xFFC7 + ,simpleTitleCaseMapping:0xFFC7 + }, + { code:0xFFCA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFCA + ,simpleLowerCaseMapping:0xFFCA + ,simpleTitleCaseMapping:0xFFCA + }, + { code:0xFFCB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFCB + ,simpleLowerCaseMapping:0xFFCB + ,simpleTitleCaseMapping:0xFFCB + }, + { code:0xFFCC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFCC + ,simpleLowerCaseMapping:0xFFCC + ,simpleTitleCaseMapping:0xFFCC + }, + { code:0xFFCD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFCD + ,simpleLowerCaseMapping:0xFFCD + ,simpleTitleCaseMapping:0xFFCD + }, + { code:0xFFCE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFCE + ,simpleLowerCaseMapping:0xFFCE + ,simpleTitleCaseMapping:0xFFCE + }, + { code:0xFFCF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFCF + ,simpleLowerCaseMapping:0xFFCF + ,simpleTitleCaseMapping:0xFFCF + }, + { code:0xFFD2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFD2 + ,simpleLowerCaseMapping:0xFFD2 + ,simpleTitleCaseMapping:0xFFD2 + }, + { code:0xFFD3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFD3 + ,simpleLowerCaseMapping:0xFFD3 + ,simpleTitleCaseMapping:0xFFD3 + }, + { code:0xFFD4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFD4 + ,simpleLowerCaseMapping:0xFFD4 + ,simpleTitleCaseMapping:0xFFD4 + }, + { code:0xFFD5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFD5 + ,simpleLowerCaseMapping:0xFFD5 + ,simpleTitleCaseMapping:0xFFD5 + }, + { code:0xFFD6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFD6 + ,simpleLowerCaseMapping:0xFFD6 + ,simpleTitleCaseMapping:0xFFD6 + }, + { code:0xFFD7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFD7 + ,simpleLowerCaseMapping:0xFFD7 + ,simpleTitleCaseMapping:0xFFD7 + }, + { code:0xFFDA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFDA + ,simpleLowerCaseMapping:0xFFDA + ,simpleTitleCaseMapping:0xFFDA + }, + { code:0xFFDB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFDB + ,simpleLowerCaseMapping:0xFFDB + ,simpleTitleCaseMapping:0xFFDB + }, + { code:0xFFDC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0xFFDC + ,simpleLowerCaseMapping:0xFFDC + ,simpleTitleCaseMapping:0xFFDC + }, + { code:0xFFE0 + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0xFFE0 + ,simpleLowerCaseMapping:0xFFE0 + ,simpleTitleCaseMapping:0xFFE0 + }, + { code:0xFFE1 + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0xFFE1 + ,simpleLowerCaseMapping:0xFFE1 + ,simpleTitleCaseMapping:0xFFE1 + }, + { code:0xFFE2 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0xFFE2 + ,simpleLowerCaseMapping:0xFFE2 + ,simpleTitleCaseMapping:0xFFE2 + }, + { code:0xFFE3 + ,generalCategory:UnicodeData.GeneralCategory.Sk + ,simpleUpperCaseMapping:0xFFE3 + ,simpleLowerCaseMapping:0xFFE3 + ,simpleTitleCaseMapping:0xFFE3 + }, + { code:0xFFE4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xFFE4 + ,simpleLowerCaseMapping:0xFFE4 + ,simpleTitleCaseMapping:0xFFE4 + }, + { code:0xFFE5 + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0xFFE5 + ,simpleLowerCaseMapping:0xFFE5 + ,simpleTitleCaseMapping:0xFFE5 + }, + { code:0xFFE6 + ,generalCategory:UnicodeData.GeneralCategory.Sc + ,simpleUpperCaseMapping:0xFFE6 + ,simpleLowerCaseMapping:0xFFE6 + ,simpleTitleCaseMapping:0xFFE6 + }, + { code:0xFFE8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xFFE8 + ,simpleLowerCaseMapping:0xFFE8 + ,simpleTitleCaseMapping:0xFFE8 + }, + { code:0xFFE9 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0xFFE9 + ,simpleLowerCaseMapping:0xFFE9 + ,simpleTitleCaseMapping:0xFFE9 + }, + { code:0xFFEA + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0xFFEA + ,simpleLowerCaseMapping:0xFFEA + ,simpleTitleCaseMapping:0xFFEA + }, + { code:0xFFEB + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0xFFEB + ,simpleLowerCaseMapping:0xFFEB + ,simpleTitleCaseMapping:0xFFEB + }, + { code:0xFFEC + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0xFFEC + ,simpleLowerCaseMapping:0xFFEC + ,simpleTitleCaseMapping:0xFFEC + }, + { code:0xFFED + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xFFED + ,simpleLowerCaseMapping:0xFFED + ,simpleTitleCaseMapping:0xFFED + }, + { code:0xFFEE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xFFEE + ,simpleLowerCaseMapping:0xFFEE + ,simpleTitleCaseMapping:0xFFEE + }, + { code:0xFFF9 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xFFF9 + ,simpleLowerCaseMapping:0xFFF9 + ,simpleTitleCaseMapping:0xFFF9 + }, + { code:0xFFFA + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xFFFA + ,simpleLowerCaseMapping:0xFFFA + ,simpleTitleCaseMapping:0xFFFA + }, + { code:0xFFFB + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xFFFB + ,simpleLowerCaseMapping:0xFFFB + ,simpleTitleCaseMapping:0xFFFB + }, + { code:0xFFFC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xFFFC + ,simpleLowerCaseMapping:0xFFFC + ,simpleTitleCaseMapping:0xFFFC + }, + { code:0xFFFD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0xFFFD + ,simpleLowerCaseMapping:0xFFFD + ,simpleTitleCaseMapping:0xFFFD + }, + { code:0x10000 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10000 + ,simpleLowerCaseMapping:0x10000 + ,simpleTitleCaseMapping:0x10000 + }, + { code:0x10001 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10001 + ,simpleLowerCaseMapping:0x10001 + ,simpleTitleCaseMapping:0x10001 + }, + { code:0x10002 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10002 + ,simpleLowerCaseMapping:0x10002 + ,simpleTitleCaseMapping:0x10002 + }, + { code:0x10003 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10003 + ,simpleLowerCaseMapping:0x10003 + ,simpleTitleCaseMapping:0x10003 + }, + { code:0x10004 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10004 + ,simpleLowerCaseMapping:0x10004 + ,simpleTitleCaseMapping:0x10004 + }, + { code:0x10005 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10005 + ,simpleLowerCaseMapping:0x10005 + ,simpleTitleCaseMapping:0x10005 + }, + { code:0x10006 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10006 + ,simpleLowerCaseMapping:0x10006 + ,simpleTitleCaseMapping:0x10006 + }, + { code:0x10007 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10007 + ,simpleLowerCaseMapping:0x10007 + ,simpleTitleCaseMapping:0x10007 + }, + { code:0x10008 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10008 + ,simpleLowerCaseMapping:0x10008 + ,simpleTitleCaseMapping:0x10008 + }, + { code:0x10009 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10009 + ,simpleLowerCaseMapping:0x10009 + ,simpleTitleCaseMapping:0x10009 + }, + { code:0x1000A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1000A + ,simpleLowerCaseMapping:0x1000A + ,simpleTitleCaseMapping:0x1000A + }, + { code:0x1000B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1000B + ,simpleLowerCaseMapping:0x1000B + ,simpleTitleCaseMapping:0x1000B + }, + { code:0x1000D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1000D + ,simpleLowerCaseMapping:0x1000D + ,simpleTitleCaseMapping:0x1000D + }, + { code:0x1000E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1000E + ,simpleLowerCaseMapping:0x1000E + ,simpleTitleCaseMapping:0x1000E + }, + { code:0x1000F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1000F + ,simpleLowerCaseMapping:0x1000F + ,simpleTitleCaseMapping:0x1000F + }, + { code:0x10010 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10010 + ,simpleLowerCaseMapping:0x10010 + ,simpleTitleCaseMapping:0x10010 + }, + { code:0x10011 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10011 + ,simpleLowerCaseMapping:0x10011 + ,simpleTitleCaseMapping:0x10011 + }, + { code:0x10012 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10012 + ,simpleLowerCaseMapping:0x10012 + ,simpleTitleCaseMapping:0x10012 + }, + { code:0x10013 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10013 + ,simpleLowerCaseMapping:0x10013 + ,simpleTitleCaseMapping:0x10013 + }, + { code:0x10014 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10014 + ,simpleLowerCaseMapping:0x10014 + ,simpleTitleCaseMapping:0x10014 + }, + { code:0x10015 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10015 + ,simpleLowerCaseMapping:0x10015 + ,simpleTitleCaseMapping:0x10015 + }, + { code:0x10016 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10016 + ,simpleLowerCaseMapping:0x10016 + ,simpleTitleCaseMapping:0x10016 + }, + { code:0x10017 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10017 + ,simpleLowerCaseMapping:0x10017 + ,simpleTitleCaseMapping:0x10017 + }, + { code:0x10018 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10018 + ,simpleLowerCaseMapping:0x10018 + ,simpleTitleCaseMapping:0x10018 + }, + { code:0x10019 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10019 + ,simpleLowerCaseMapping:0x10019 + ,simpleTitleCaseMapping:0x10019 + }, + { code:0x1001A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1001A + ,simpleLowerCaseMapping:0x1001A + ,simpleTitleCaseMapping:0x1001A + }, + { code:0x1001B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1001B + ,simpleLowerCaseMapping:0x1001B + ,simpleTitleCaseMapping:0x1001B + }, + { code:0x1001C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1001C + ,simpleLowerCaseMapping:0x1001C + ,simpleTitleCaseMapping:0x1001C + }, + { code:0x1001D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1001D + ,simpleLowerCaseMapping:0x1001D + ,simpleTitleCaseMapping:0x1001D + }, + { code:0x1001E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1001E + ,simpleLowerCaseMapping:0x1001E + ,simpleTitleCaseMapping:0x1001E + }, + { code:0x1001F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1001F + ,simpleLowerCaseMapping:0x1001F + ,simpleTitleCaseMapping:0x1001F + }, + { code:0x10020 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10020 + ,simpleLowerCaseMapping:0x10020 + ,simpleTitleCaseMapping:0x10020 + }, + { code:0x10021 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10021 + ,simpleLowerCaseMapping:0x10021 + ,simpleTitleCaseMapping:0x10021 + }, + { code:0x10022 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10022 + ,simpleLowerCaseMapping:0x10022 + ,simpleTitleCaseMapping:0x10022 + }, + { code:0x10023 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10023 + ,simpleLowerCaseMapping:0x10023 + ,simpleTitleCaseMapping:0x10023 + }, + { code:0x10024 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10024 + ,simpleLowerCaseMapping:0x10024 + ,simpleTitleCaseMapping:0x10024 + }, + { code:0x10025 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10025 + ,simpleLowerCaseMapping:0x10025 + ,simpleTitleCaseMapping:0x10025 + }, + { code:0x10026 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10026 + ,simpleLowerCaseMapping:0x10026 + ,simpleTitleCaseMapping:0x10026 + }, + { code:0x10028 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10028 + ,simpleLowerCaseMapping:0x10028 + ,simpleTitleCaseMapping:0x10028 + }, + { code:0x10029 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10029 + ,simpleLowerCaseMapping:0x10029 + ,simpleTitleCaseMapping:0x10029 + }, + { code:0x1002A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1002A + ,simpleLowerCaseMapping:0x1002A + ,simpleTitleCaseMapping:0x1002A + }, + { code:0x1002B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1002B + ,simpleLowerCaseMapping:0x1002B + ,simpleTitleCaseMapping:0x1002B + }, + { code:0x1002C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1002C + ,simpleLowerCaseMapping:0x1002C + ,simpleTitleCaseMapping:0x1002C + }, + { code:0x1002D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1002D + ,simpleLowerCaseMapping:0x1002D + ,simpleTitleCaseMapping:0x1002D + }, + { code:0x1002E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1002E + ,simpleLowerCaseMapping:0x1002E + ,simpleTitleCaseMapping:0x1002E + }, + { code:0x1002F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1002F + ,simpleLowerCaseMapping:0x1002F + ,simpleTitleCaseMapping:0x1002F + }, + { code:0x10030 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10030 + ,simpleLowerCaseMapping:0x10030 + ,simpleTitleCaseMapping:0x10030 + }, + { code:0x10031 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10031 + ,simpleLowerCaseMapping:0x10031 + ,simpleTitleCaseMapping:0x10031 + }, + { code:0x10032 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10032 + ,simpleLowerCaseMapping:0x10032 + ,simpleTitleCaseMapping:0x10032 + }, + { code:0x10033 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10033 + ,simpleLowerCaseMapping:0x10033 + ,simpleTitleCaseMapping:0x10033 + }, + { code:0x10034 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10034 + ,simpleLowerCaseMapping:0x10034 + ,simpleTitleCaseMapping:0x10034 + }, + { code:0x10035 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10035 + ,simpleLowerCaseMapping:0x10035 + ,simpleTitleCaseMapping:0x10035 + }, + { code:0x10036 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10036 + ,simpleLowerCaseMapping:0x10036 + ,simpleTitleCaseMapping:0x10036 + }, + { code:0x10037 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10037 + ,simpleLowerCaseMapping:0x10037 + ,simpleTitleCaseMapping:0x10037 + }, + { code:0x10038 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10038 + ,simpleLowerCaseMapping:0x10038 + ,simpleTitleCaseMapping:0x10038 + }, + { code:0x10039 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10039 + ,simpleLowerCaseMapping:0x10039 + ,simpleTitleCaseMapping:0x10039 + }, + { code:0x1003A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1003A + ,simpleLowerCaseMapping:0x1003A + ,simpleTitleCaseMapping:0x1003A + }, + { code:0x1003C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1003C + ,simpleLowerCaseMapping:0x1003C + ,simpleTitleCaseMapping:0x1003C + }, + { code:0x1003D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1003D + ,simpleLowerCaseMapping:0x1003D + ,simpleTitleCaseMapping:0x1003D + }, + { code:0x1003F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1003F + ,simpleLowerCaseMapping:0x1003F + ,simpleTitleCaseMapping:0x1003F + }, + { code:0x10040 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10040 + ,simpleLowerCaseMapping:0x10040 + ,simpleTitleCaseMapping:0x10040 + }, + { code:0x10041 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10041 + ,simpleLowerCaseMapping:0x10041 + ,simpleTitleCaseMapping:0x10041 + }, + { code:0x10042 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10042 + ,simpleLowerCaseMapping:0x10042 + ,simpleTitleCaseMapping:0x10042 + }, + { code:0x10043 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10043 + ,simpleLowerCaseMapping:0x10043 + ,simpleTitleCaseMapping:0x10043 + }, + { code:0x10044 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10044 + ,simpleLowerCaseMapping:0x10044 + ,simpleTitleCaseMapping:0x10044 + }, + { code:0x10045 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10045 + ,simpleLowerCaseMapping:0x10045 + ,simpleTitleCaseMapping:0x10045 + }, + { code:0x10046 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10046 + ,simpleLowerCaseMapping:0x10046 + ,simpleTitleCaseMapping:0x10046 + }, + { code:0x10047 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10047 + ,simpleLowerCaseMapping:0x10047 + ,simpleTitleCaseMapping:0x10047 + }, + { code:0x10048 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10048 + ,simpleLowerCaseMapping:0x10048 + ,simpleTitleCaseMapping:0x10048 + }, + { code:0x10049 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10049 + ,simpleLowerCaseMapping:0x10049 + ,simpleTitleCaseMapping:0x10049 + }, + { code:0x1004A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1004A + ,simpleLowerCaseMapping:0x1004A + ,simpleTitleCaseMapping:0x1004A + }, + { code:0x1004B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1004B + ,simpleLowerCaseMapping:0x1004B + ,simpleTitleCaseMapping:0x1004B + }, + { code:0x1004C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1004C + ,simpleLowerCaseMapping:0x1004C + ,simpleTitleCaseMapping:0x1004C + }, + { code:0x1004D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1004D + ,simpleLowerCaseMapping:0x1004D + ,simpleTitleCaseMapping:0x1004D + }, + { code:0x10050 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10050 + ,simpleLowerCaseMapping:0x10050 + ,simpleTitleCaseMapping:0x10050 + }, + { code:0x10051 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10051 + ,simpleLowerCaseMapping:0x10051 + ,simpleTitleCaseMapping:0x10051 + }, + { code:0x10052 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10052 + ,simpleLowerCaseMapping:0x10052 + ,simpleTitleCaseMapping:0x10052 + }, + { code:0x10053 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10053 + ,simpleLowerCaseMapping:0x10053 + ,simpleTitleCaseMapping:0x10053 + }, + { code:0x10054 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10054 + ,simpleLowerCaseMapping:0x10054 + ,simpleTitleCaseMapping:0x10054 + }, + { code:0x10055 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10055 + ,simpleLowerCaseMapping:0x10055 + ,simpleTitleCaseMapping:0x10055 + }, + { code:0x10056 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10056 + ,simpleLowerCaseMapping:0x10056 + ,simpleTitleCaseMapping:0x10056 + }, + { code:0x10057 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10057 + ,simpleLowerCaseMapping:0x10057 + ,simpleTitleCaseMapping:0x10057 + }, + { code:0x10058 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10058 + ,simpleLowerCaseMapping:0x10058 + ,simpleTitleCaseMapping:0x10058 + }, + { code:0x10059 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10059 + ,simpleLowerCaseMapping:0x10059 + ,simpleTitleCaseMapping:0x10059 + }, + { code:0x1005A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1005A + ,simpleLowerCaseMapping:0x1005A + ,simpleTitleCaseMapping:0x1005A + }, + { code:0x1005B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1005B + ,simpleLowerCaseMapping:0x1005B + ,simpleTitleCaseMapping:0x1005B + }, + { code:0x1005C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1005C + ,simpleLowerCaseMapping:0x1005C + ,simpleTitleCaseMapping:0x1005C + }, + { code:0x1005D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1005D + ,simpleLowerCaseMapping:0x1005D + ,simpleTitleCaseMapping:0x1005D + }, + { code:0x10080 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10080 + ,simpleLowerCaseMapping:0x10080 + ,simpleTitleCaseMapping:0x10080 + }, + { code:0x10081 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10081 + ,simpleLowerCaseMapping:0x10081 + ,simpleTitleCaseMapping:0x10081 + }, + { code:0x10082 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10082 + ,simpleLowerCaseMapping:0x10082 + ,simpleTitleCaseMapping:0x10082 + }, + { code:0x10083 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10083 + ,simpleLowerCaseMapping:0x10083 + ,simpleTitleCaseMapping:0x10083 + }, + { code:0x10084 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10084 + ,simpleLowerCaseMapping:0x10084 + ,simpleTitleCaseMapping:0x10084 + }, + { code:0x10085 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10085 + ,simpleLowerCaseMapping:0x10085 + ,simpleTitleCaseMapping:0x10085 + }, + { code:0x10086 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10086 + ,simpleLowerCaseMapping:0x10086 + ,simpleTitleCaseMapping:0x10086 + }, + { code:0x10087 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10087 + ,simpleLowerCaseMapping:0x10087 + ,simpleTitleCaseMapping:0x10087 + }, + { code:0x10088 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10088 + ,simpleLowerCaseMapping:0x10088 + ,simpleTitleCaseMapping:0x10088 + }, + { code:0x10089 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10089 + ,simpleLowerCaseMapping:0x10089 + ,simpleTitleCaseMapping:0x10089 + }, + { code:0x1008A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1008A + ,simpleLowerCaseMapping:0x1008A + ,simpleTitleCaseMapping:0x1008A + }, + { code:0x1008B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1008B + ,simpleLowerCaseMapping:0x1008B + ,simpleTitleCaseMapping:0x1008B + }, + { code:0x1008C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1008C + ,simpleLowerCaseMapping:0x1008C + ,simpleTitleCaseMapping:0x1008C + }, + { code:0x1008D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1008D + ,simpleLowerCaseMapping:0x1008D + ,simpleTitleCaseMapping:0x1008D + }, + { code:0x1008E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1008E + ,simpleLowerCaseMapping:0x1008E + ,simpleTitleCaseMapping:0x1008E + }, + { code:0x1008F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1008F + ,simpleLowerCaseMapping:0x1008F + ,simpleTitleCaseMapping:0x1008F + }, + { code:0x10090 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10090 + ,simpleLowerCaseMapping:0x10090 + ,simpleTitleCaseMapping:0x10090 + }, + { code:0x10091 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10091 + ,simpleLowerCaseMapping:0x10091 + ,simpleTitleCaseMapping:0x10091 + }, + { code:0x10092 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10092 + ,simpleLowerCaseMapping:0x10092 + ,simpleTitleCaseMapping:0x10092 + }, + { code:0x10093 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10093 + ,simpleLowerCaseMapping:0x10093 + ,simpleTitleCaseMapping:0x10093 + }, + { code:0x10094 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10094 + ,simpleLowerCaseMapping:0x10094 + ,simpleTitleCaseMapping:0x10094 + }, + { code:0x10095 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10095 + ,simpleLowerCaseMapping:0x10095 + ,simpleTitleCaseMapping:0x10095 + }, + { code:0x10096 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10096 + ,simpleLowerCaseMapping:0x10096 + ,simpleTitleCaseMapping:0x10096 + }, + { code:0x10097 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10097 + ,simpleLowerCaseMapping:0x10097 + ,simpleTitleCaseMapping:0x10097 + }, + { code:0x10098 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10098 + ,simpleLowerCaseMapping:0x10098 + ,simpleTitleCaseMapping:0x10098 + }, + { code:0x10099 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10099 + ,simpleLowerCaseMapping:0x10099 + ,simpleTitleCaseMapping:0x10099 + }, + { code:0x1009A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1009A + ,simpleLowerCaseMapping:0x1009A + ,simpleTitleCaseMapping:0x1009A + }, + { code:0x1009B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1009B + ,simpleLowerCaseMapping:0x1009B + ,simpleTitleCaseMapping:0x1009B + }, + { code:0x1009C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1009C + ,simpleLowerCaseMapping:0x1009C + ,simpleTitleCaseMapping:0x1009C + }, + { code:0x1009D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1009D + ,simpleLowerCaseMapping:0x1009D + ,simpleTitleCaseMapping:0x1009D + }, + { code:0x1009E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1009E + ,simpleLowerCaseMapping:0x1009E + ,simpleTitleCaseMapping:0x1009E + }, + { code:0x1009F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1009F + ,simpleLowerCaseMapping:0x1009F + ,simpleTitleCaseMapping:0x1009F + }, + { code:0x100A0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100A0 + ,simpleLowerCaseMapping:0x100A0 + ,simpleTitleCaseMapping:0x100A0 + }, + { code:0x100A1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100A1 + ,simpleLowerCaseMapping:0x100A1 + ,simpleTitleCaseMapping:0x100A1 + }, + { code:0x100A2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100A2 + ,simpleLowerCaseMapping:0x100A2 + ,simpleTitleCaseMapping:0x100A2 + }, + { code:0x100A3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100A3 + ,simpleLowerCaseMapping:0x100A3 + ,simpleTitleCaseMapping:0x100A3 + }, + { code:0x100A4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100A4 + ,simpleLowerCaseMapping:0x100A4 + ,simpleTitleCaseMapping:0x100A4 + }, + { code:0x100A5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100A5 + ,simpleLowerCaseMapping:0x100A5 + ,simpleTitleCaseMapping:0x100A5 + }, + { code:0x100A6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100A6 + ,simpleLowerCaseMapping:0x100A6 + ,simpleTitleCaseMapping:0x100A6 + }, + { code:0x100A7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100A7 + ,simpleLowerCaseMapping:0x100A7 + ,simpleTitleCaseMapping:0x100A7 + }, + { code:0x100A8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100A8 + ,simpleLowerCaseMapping:0x100A8 + ,simpleTitleCaseMapping:0x100A8 + }, + { code:0x100A9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100A9 + ,simpleLowerCaseMapping:0x100A9 + ,simpleTitleCaseMapping:0x100A9 + }, + { code:0x100AA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100AA + ,simpleLowerCaseMapping:0x100AA + ,simpleTitleCaseMapping:0x100AA + }, + { code:0x100AB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100AB + ,simpleLowerCaseMapping:0x100AB + ,simpleTitleCaseMapping:0x100AB + }, + { code:0x100AC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100AC + ,simpleLowerCaseMapping:0x100AC + ,simpleTitleCaseMapping:0x100AC + }, + { code:0x100AD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100AD + ,simpleLowerCaseMapping:0x100AD + ,simpleTitleCaseMapping:0x100AD + }, + { code:0x100AE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100AE + ,simpleLowerCaseMapping:0x100AE + ,simpleTitleCaseMapping:0x100AE + }, + { code:0x100AF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100AF + ,simpleLowerCaseMapping:0x100AF + ,simpleTitleCaseMapping:0x100AF + }, + { code:0x100B0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100B0 + ,simpleLowerCaseMapping:0x100B0 + ,simpleTitleCaseMapping:0x100B0 + }, + { code:0x100B1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100B1 + ,simpleLowerCaseMapping:0x100B1 + ,simpleTitleCaseMapping:0x100B1 + }, + { code:0x100B2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100B2 + ,simpleLowerCaseMapping:0x100B2 + ,simpleTitleCaseMapping:0x100B2 + }, + { code:0x100B3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100B3 + ,simpleLowerCaseMapping:0x100B3 + ,simpleTitleCaseMapping:0x100B3 + }, + { code:0x100B4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100B4 + ,simpleLowerCaseMapping:0x100B4 + ,simpleTitleCaseMapping:0x100B4 + }, + { code:0x100B5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100B5 + ,simpleLowerCaseMapping:0x100B5 + ,simpleTitleCaseMapping:0x100B5 + }, + { code:0x100B6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100B6 + ,simpleLowerCaseMapping:0x100B6 + ,simpleTitleCaseMapping:0x100B6 + }, + { code:0x100B7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100B7 + ,simpleLowerCaseMapping:0x100B7 + ,simpleTitleCaseMapping:0x100B7 + }, + { code:0x100B8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100B8 + ,simpleLowerCaseMapping:0x100B8 + ,simpleTitleCaseMapping:0x100B8 + }, + { code:0x100B9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100B9 + ,simpleLowerCaseMapping:0x100B9 + ,simpleTitleCaseMapping:0x100B9 + }, + { code:0x100BA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100BA + ,simpleLowerCaseMapping:0x100BA + ,simpleTitleCaseMapping:0x100BA + }, + { code:0x100BB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100BB + ,simpleLowerCaseMapping:0x100BB + ,simpleTitleCaseMapping:0x100BB + }, + { code:0x100BC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100BC + ,simpleLowerCaseMapping:0x100BC + ,simpleTitleCaseMapping:0x100BC + }, + { code:0x100BD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100BD + ,simpleLowerCaseMapping:0x100BD + ,simpleTitleCaseMapping:0x100BD + }, + { code:0x100BE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100BE + ,simpleLowerCaseMapping:0x100BE + ,simpleTitleCaseMapping:0x100BE + }, + { code:0x100BF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100BF + ,simpleLowerCaseMapping:0x100BF + ,simpleTitleCaseMapping:0x100BF + }, + { code:0x100C0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100C0 + ,simpleLowerCaseMapping:0x100C0 + ,simpleTitleCaseMapping:0x100C0 + }, + { code:0x100C1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100C1 + ,simpleLowerCaseMapping:0x100C1 + ,simpleTitleCaseMapping:0x100C1 + }, + { code:0x100C2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100C2 + ,simpleLowerCaseMapping:0x100C2 + ,simpleTitleCaseMapping:0x100C2 + }, + { code:0x100C3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100C3 + ,simpleLowerCaseMapping:0x100C3 + ,simpleTitleCaseMapping:0x100C3 + }, + { code:0x100C4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100C4 + ,simpleLowerCaseMapping:0x100C4 + ,simpleTitleCaseMapping:0x100C4 + }, + { code:0x100C5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100C5 + ,simpleLowerCaseMapping:0x100C5 + ,simpleTitleCaseMapping:0x100C5 + }, + { code:0x100C6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100C6 + ,simpleLowerCaseMapping:0x100C6 + ,simpleTitleCaseMapping:0x100C6 + }, + { code:0x100C7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100C7 + ,simpleLowerCaseMapping:0x100C7 + ,simpleTitleCaseMapping:0x100C7 + }, + { code:0x100C8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100C8 + ,simpleLowerCaseMapping:0x100C8 + ,simpleTitleCaseMapping:0x100C8 + }, + { code:0x100C9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100C9 + ,simpleLowerCaseMapping:0x100C9 + ,simpleTitleCaseMapping:0x100C9 + }, + { code:0x100CA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100CA + ,simpleLowerCaseMapping:0x100CA + ,simpleTitleCaseMapping:0x100CA + }, + { code:0x100CB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100CB + ,simpleLowerCaseMapping:0x100CB + ,simpleTitleCaseMapping:0x100CB + }, + { code:0x100CC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100CC + ,simpleLowerCaseMapping:0x100CC + ,simpleTitleCaseMapping:0x100CC + }, + { code:0x100CD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100CD + ,simpleLowerCaseMapping:0x100CD + ,simpleTitleCaseMapping:0x100CD + }, + { code:0x100CE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100CE + ,simpleLowerCaseMapping:0x100CE + ,simpleTitleCaseMapping:0x100CE + }, + { code:0x100CF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100CF + ,simpleLowerCaseMapping:0x100CF + ,simpleTitleCaseMapping:0x100CF + }, + { code:0x100D0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100D0 + ,simpleLowerCaseMapping:0x100D0 + ,simpleTitleCaseMapping:0x100D0 + }, + { code:0x100D1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100D1 + ,simpleLowerCaseMapping:0x100D1 + ,simpleTitleCaseMapping:0x100D1 + }, + { code:0x100D2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100D2 + ,simpleLowerCaseMapping:0x100D2 + ,simpleTitleCaseMapping:0x100D2 + }, + { code:0x100D3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100D3 + ,simpleLowerCaseMapping:0x100D3 + ,simpleTitleCaseMapping:0x100D3 + }, + { code:0x100D4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100D4 + ,simpleLowerCaseMapping:0x100D4 + ,simpleTitleCaseMapping:0x100D4 + }, + { code:0x100D5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100D5 + ,simpleLowerCaseMapping:0x100D5 + ,simpleTitleCaseMapping:0x100D5 + }, + { code:0x100D6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100D6 + ,simpleLowerCaseMapping:0x100D6 + ,simpleTitleCaseMapping:0x100D6 + }, + { code:0x100D7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100D7 + ,simpleLowerCaseMapping:0x100D7 + ,simpleTitleCaseMapping:0x100D7 + }, + { code:0x100D8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100D8 + ,simpleLowerCaseMapping:0x100D8 + ,simpleTitleCaseMapping:0x100D8 + }, + { code:0x100D9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100D9 + ,simpleLowerCaseMapping:0x100D9 + ,simpleTitleCaseMapping:0x100D9 + }, + { code:0x100DA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100DA + ,simpleLowerCaseMapping:0x100DA + ,simpleTitleCaseMapping:0x100DA + }, + { code:0x100DB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100DB + ,simpleLowerCaseMapping:0x100DB + ,simpleTitleCaseMapping:0x100DB + }, + { code:0x100DC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100DC + ,simpleLowerCaseMapping:0x100DC + ,simpleTitleCaseMapping:0x100DC + }, + { code:0x100DD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100DD + ,simpleLowerCaseMapping:0x100DD + ,simpleTitleCaseMapping:0x100DD + }, + { code:0x100DE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100DE + ,simpleLowerCaseMapping:0x100DE + ,simpleTitleCaseMapping:0x100DE + }, + { code:0x100DF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100DF + ,simpleLowerCaseMapping:0x100DF + ,simpleTitleCaseMapping:0x100DF + }, + { code:0x100E0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100E0 + ,simpleLowerCaseMapping:0x100E0 + ,simpleTitleCaseMapping:0x100E0 + }, + { code:0x100E1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100E1 + ,simpleLowerCaseMapping:0x100E1 + ,simpleTitleCaseMapping:0x100E1 + }, + { code:0x100E2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100E2 + ,simpleLowerCaseMapping:0x100E2 + ,simpleTitleCaseMapping:0x100E2 + }, + { code:0x100E3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100E3 + ,simpleLowerCaseMapping:0x100E3 + ,simpleTitleCaseMapping:0x100E3 + }, + { code:0x100E4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100E4 + ,simpleLowerCaseMapping:0x100E4 + ,simpleTitleCaseMapping:0x100E4 + }, + { code:0x100E5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100E5 + ,simpleLowerCaseMapping:0x100E5 + ,simpleTitleCaseMapping:0x100E5 + }, + { code:0x100E6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100E6 + ,simpleLowerCaseMapping:0x100E6 + ,simpleTitleCaseMapping:0x100E6 + }, + { code:0x100E7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100E7 + ,simpleLowerCaseMapping:0x100E7 + ,simpleTitleCaseMapping:0x100E7 + }, + { code:0x100E8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100E8 + ,simpleLowerCaseMapping:0x100E8 + ,simpleTitleCaseMapping:0x100E8 + }, + { code:0x100E9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100E9 + ,simpleLowerCaseMapping:0x100E9 + ,simpleTitleCaseMapping:0x100E9 + }, + { code:0x100EA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100EA + ,simpleLowerCaseMapping:0x100EA + ,simpleTitleCaseMapping:0x100EA + }, + { code:0x100EB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100EB + ,simpleLowerCaseMapping:0x100EB + ,simpleTitleCaseMapping:0x100EB + }, + { code:0x100EC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100EC + ,simpleLowerCaseMapping:0x100EC + ,simpleTitleCaseMapping:0x100EC + }, + { code:0x100ED + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100ED + ,simpleLowerCaseMapping:0x100ED + ,simpleTitleCaseMapping:0x100ED + }, + { code:0x100EE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100EE + ,simpleLowerCaseMapping:0x100EE + ,simpleTitleCaseMapping:0x100EE + }, + { code:0x100EF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100EF + ,simpleLowerCaseMapping:0x100EF + ,simpleTitleCaseMapping:0x100EF + }, + { code:0x100F0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100F0 + ,simpleLowerCaseMapping:0x100F0 + ,simpleTitleCaseMapping:0x100F0 + }, + { code:0x100F1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100F1 + ,simpleLowerCaseMapping:0x100F1 + ,simpleTitleCaseMapping:0x100F1 + }, + { code:0x100F2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100F2 + ,simpleLowerCaseMapping:0x100F2 + ,simpleTitleCaseMapping:0x100F2 + }, + { code:0x100F3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100F3 + ,simpleLowerCaseMapping:0x100F3 + ,simpleTitleCaseMapping:0x100F3 + }, + { code:0x100F4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100F4 + ,simpleLowerCaseMapping:0x100F4 + ,simpleTitleCaseMapping:0x100F4 + }, + { code:0x100F5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100F5 + ,simpleLowerCaseMapping:0x100F5 + ,simpleTitleCaseMapping:0x100F5 + }, + { code:0x100F6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100F6 + ,simpleLowerCaseMapping:0x100F6 + ,simpleTitleCaseMapping:0x100F6 + }, + { code:0x100F7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100F7 + ,simpleLowerCaseMapping:0x100F7 + ,simpleTitleCaseMapping:0x100F7 + }, + { code:0x100F8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100F8 + ,simpleLowerCaseMapping:0x100F8 + ,simpleTitleCaseMapping:0x100F8 + }, + { code:0x100F9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100F9 + ,simpleLowerCaseMapping:0x100F9 + ,simpleTitleCaseMapping:0x100F9 + }, + { code:0x100FA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x100FA + ,simpleLowerCaseMapping:0x100FA + ,simpleTitleCaseMapping:0x100FA + }, + { code:0x10100 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x10100 + ,simpleLowerCaseMapping:0x10100 + ,simpleTitleCaseMapping:0x10100 + }, + { code:0x10101 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x10101 + ,simpleLowerCaseMapping:0x10101 + ,simpleTitleCaseMapping:0x10101 + }, + { code:0x10102 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x10102 + ,simpleLowerCaseMapping:0x10102 + ,simpleTitleCaseMapping:0x10102 + }, + { code:0x10107 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10107 + ,simpleLowerCaseMapping:0x10107 + ,simpleTitleCaseMapping:0x10107 + }, + { code:0x10108 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10108 + ,simpleLowerCaseMapping:0x10108 + ,simpleTitleCaseMapping:0x10108 + }, + { code:0x10109 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10109 + ,simpleLowerCaseMapping:0x10109 + ,simpleTitleCaseMapping:0x10109 + }, + { code:0x1010A + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1010A + ,simpleLowerCaseMapping:0x1010A + ,simpleTitleCaseMapping:0x1010A + }, + { code:0x1010B + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1010B + ,simpleLowerCaseMapping:0x1010B + ,simpleTitleCaseMapping:0x1010B + }, + { code:0x1010C + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1010C + ,simpleLowerCaseMapping:0x1010C + ,simpleTitleCaseMapping:0x1010C + }, + { code:0x1010D + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1010D + ,simpleLowerCaseMapping:0x1010D + ,simpleTitleCaseMapping:0x1010D + }, + { code:0x1010E + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1010E + ,simpleLowerCaseMapping:0x1010E + ,simpleTitleCaseMapping:0x1010E + }, + { code:0x1010F + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1010F + ,simpleLowerCaseMapping:0x1010F + ,simpleTitleCaseMapping:0x1010F + }, + { code:0x10110 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10110 + ,simpleLowerCaseMapping:0x10110 + ,simpleTitleCaseMapping:0x10110 + }, + { code:0x10111 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10111 + ,simpleLowerCaseMapping:0x10111 + ,simpleTitleCaseMapping:0x10111 + }, + { code:0x10112 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10112 + ,simpleLowerCaseMapping:0x10112 + ,simpleTitleCaseMapping:0x10112 + }, + { code:0x10113 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10113 + ,simpleLowerCaseMapping:0x10113 + ,simpleTitleCaseMapping:0x10113 + }, + { code:0x10114 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10114 + ,simpleLowerCaseMapping:0x10114 + ,simpleTitleCaseMapping:0x10114 + }, + { code:0x10115 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10115 + ,simpleLowerCaseMapping:0x10115 + ,simpleTitleCaseMapping:0x10115 + }, + { code:0x10116 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10116 + ,simpleLowerCaseMapping:0x10116 + ,simpleTitleCaseMapping:0x10116 + }, + { code:0x10117 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10117 + ,simpleLowerCaseMapping:0x10117 + ,simpleTitleCaseMapping:0x10117 + }, + { code:0x10118 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10118 + ,simpleLowerCaseMapping:0x10118 + ,simpleTitleCaseMapping:0x10118 + }, + { code:0x10119 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10119 + ,simpleLowerCaseMapping:0x10119 + ,simpleTitleCaseMapping:0x10119 + }, + { code:0x1011A + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1011A + ,simpleLowerCaseMapping:0x1011A + ,simpleTitleCaseMapping:0x1011A + }, + { code:0x1011B + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1011B + ,simpleLowerCaseMapping:0x1011B + ,simpleTitleCaseMapping:0x1011B + }, + { code:0x1011C + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1011C + ,simpleLowerCaseMapping:0x1011C + ,simpleTitleCaseMapping:0x1011C + }, + { code:0x1011D + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1011D + ,simpleLowerCaseMapping:0x1011D + ,simpleTitleCaseMapping:0x1011D + }, + { code:0x1011E + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1011E + ,simpleLowerCaseMapping:0x1011E + ,simpleTitleCaseMapping:0x1011E + }, + { code:0x1011F + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1011F + ,simpleLowerCaseMapping:0x1011F + ,simpleTitleCaseMapping:0x1011F + }, + { code:0x10120 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10120 + ,simpleLowerCaseMapping:0x10120 + ,simpleTitleCaseMapping:0x10120 + }, + { code:0x10121 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10121 + ,simpleLowerCaseMapping:0x10121 + ,simpleTitleCaseMapping:0x10121 + }, + { code:0x10122 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10122 + ,simpleLowerCaseMapping:0x10122 + ,simpleTitleCaseMapping:0x10122 + }, + { code:0x10123 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10123 + ,simpleLowerCaseMapping:0x10123 + ,simpleTitleCaseMapping:0x10123 + }, + { code:0x10124 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10124 + ,simpleLowerCaseMapping:0x10124 + ,simpleTitleCaseMapping:0x10124 + }, + { code:0x10125 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10125 + ,simpleLowerCaseMapping:0x10125 + ,simpleTitleCaseMapping:0x10125 + }, + { code:0x10126 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10126 + ,simpleLowerCaseMapping:0x10126 + ,simpleTitleCaseMapping:0x10126 + }, + { code:0x10127 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10127 + ,simpleLowerCaseMapping:0x10127 + ,simpleTitleCaseMapping:0x10127 + }, + { code:0x10128 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10128 + ,simpleLowerCaseMapping:0x10128 + ,simpleTitleCaseMapping:0x10128 + }, + { code:0x10129 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10129 + ,simpleLowerCaseMapping:0x10129 + ,simpleTitleCaseMapping:0x10129 + }, + { code:0x1012A + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1012A + ,simpleLowerCaseMapping:0x1012A + ,simpleTitleCaseMapping:0x1012A + }, + { code:0x1012B + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1012B + ,simpleLowerCaseMapping:0x1012B + ,simpleTitleCaseMapping:0x1012B + }, + { code:0x1012C + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1012C + ,simpleLowerCaseMapping:0x1012C + ,simpleTitleCaseMapping:0x1012C + }, + { code:0x1012D + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1012D + ,simpleLowerCaseMapping:0x1012D + ,simpleTitleCaseMapping:0x1012D + }, + { code:0x1012E + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1012E + ,simpleLowerCaseMapping:0x1012E + ,simpleTitleCaseMapping:0x1012E + }, + { code:0x1012F + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1012F + ,simpleLowerCaseMapping:0x1012F + ,simpleTitleCaseMapping:0x1012F + }, + { code:0x10130 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10130 + ,simpleLowerCaseMapping:0x10130 + ,simpleTitleCaseMapping:0x10130 + }, + { code:0x10131 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10131 + ,simpleLowerCaseMapping:0x10131 + ,simpleTitleCaseMapping:0x10131 + }, + { code:0x10132 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10132 + ,simpleLowerCaseMapping:0x10132 + ,simpleTitleCaseMapping:0x10132 + }, + { code:0x10133 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10133 + ,simpleLowerCaseMapping:0x10133 + ,simpleTitleCaseMapping:0x10133 + }, + { code:0x10137 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x10137 + ,simpleLowerCaseMapping:0x10137 + ,simpleTitleCaseMapping:0x10137 + }, + { code:0x10138 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x10138 + ,simpleLowerCaseMapping:0x10138 + ,simpleTitleCaseMapping:0x10138 + }, + { code:0x10139 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x10139 + ,simpleLowerCaseMapping:0x10139 + ,simpleTitleCaseMapping:0x10139 + }, + { code:0x1013A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1013A + ,simpleLowerCaseMapping:0x1013A + ,simpleTitleCaseMapping:0x1013A + }, + { code:0x1013B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1013B + ,simpleLowerCaseMapping:0x1013B + ,simpleTitleCaseMapping:0x1013B + }, + { code:0x1013C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1013C + ,simpleLowerCaseMapping:0x1013C + ,simpleTitleCaseMapping:0x1013C + }, + { code:0x1013D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1013D + ,simpleLowerCaseMapping:0x1013D + ,simpleTitleCaseMapping:0x1013D + }, + { code:0x1013E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1013E + ,simpleLowerCaseMapping:0x1013E + ,simpleTitleCaseMapping:0x1013E + }, + { code:0x1013F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1013F + ,simpleLowerCaseMapping:0x1013F + ,simpleTitleCaseMapping:0x1013F + }, + { code:0x10140 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10140 + ,simpleLowerCaseMapping:0x10140 + ,simpleTitleCaseMapping:0x10140 + }, + { code:0x10141 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10141 + ,simpleLowerCaseMapping:0x10141 + ,simpleTitleCaseMapping:0x10141 + }, + { code:0x10142 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10142 + ,simpleLowerCaseMapping:0x10142 + ,simpleTitleCaseMapping:0x10142 + }, + { code:0x10143 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10143 + ,simpleLowerCaseMapping:0x10143 + ,simpleTitleCaseMapping:0x10143 + }, + { code:0x10144 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10144 + ,simpleLowerCaseMapping:0x10144 + ,simpleTitleCaseMapping:0x10144 + }, + { code:0x10145 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10145 + ,simpleLowerCaseMapping:0x10145 + ,simpleTitleCaseMapping:0x10145 + }, + { code:0x10146 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10146 + ,simpleLowerCaseMapping:0x10146 + ,simpleTitleCaseMapping:0x10146 + }, + { code:0x10147 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10147 + ,simpleLowerCaseMapping:0x10147 + ,simpleTitleCaseMapping:0x10147 + }, + { code:0x10148 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10148 + ,simpleLowerCaseMapping:0x10148 + ,simpleTitleCaseMapping:0x10148 + }, + { code:0x10149 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10149 + ,simpleLowerCaseMapping:0x10149 + ,simpleTitleCaseMapping:0x10149 + }, + { code:0x1014A + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1014A + ,simpleLowerCaseMapping:0x1014A + ,simpleTitleCaseMapping:0x1014A + }, + { code:0x1014B + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1014B + ,simpleLowerCaseMapping:0x1014B + ,simpleTitleCaseMapping:0x1014B + }, + { code:0x1014C + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1014C + ,simpleLowerCaseMapping:0x1014C + ,simpleTitleCaseMapping:0x1014C + }, + { code:0x1014D + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1014D + ,simpleLowerCaseMapping:0x1014D + ,simpleTitleCaseMapping:0x1014D + }, + { code:0x1014E + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1014E + ,simpleLowerCaseMapping:0x1014E + ,simpleTitleCaseMapping:0x1014E + }, + { code:0x1014F + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1014F + ,simpleLowerCaseMapping:0x1014F + ,simpleTitleCaseMapping:0x1014F + }, + { code:0x10150 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10150 + ,simpleLowerCaseMapping:0x10150 + ,simpleTitleCaseMapping:0x10150 + }, + { code:0x10151 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10151 + ,simpleLowerCaseMapping:0x10151 + ,simpleTitleCaseMapping:0x10151 + }, + { code:0x10152 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10152 + ,simpleLowerCaseMapping:0x10152 + ,simpleTitleCaseMapping:0x10152 + }, + { code:0x10153 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10153 + ,simpleLowerCaseMapping:0x10153 + ,simpleTitleCaseMapping:0x10153 + }, + { code:0x10154 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10154 + ,simpleLowerCaseMapping:0x10154 + ,simpleTitleCaseMapping:0x10154 + }, + { code:0x10155 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10155 + ,simpleLowerCaseMapping:0x10155 + ,simpleTitleCaseMapping:0x10155 + }, + { code:0x10156 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10156 + ,simpleLowerCaseMapping:0x10156 + ,simpleTitleCaseMapping:0x10156 + }, + { code:0x10157 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10157 + ,simpleLowerCaseMapping:0x10157 + ,simpleTitleCaseMapping:0x10157 + }, + { code:0x10158 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10158 + ,simpleLowerCaseMapping:0x10158 + ,simpleTitleCaseMapping:0x10158 + }, + { code:0x10159 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10159 + ,simpleLowerCaseMapping:0x10159 + ,simpleTitleCaseMapping:0x10159 + }, + { code:0x1015A + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1015A + ,simpleLowerCaseMapping:0x1015A + ,simpleTitleCaseMapping:0x1015A + }, + { code:0x1015B + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1015B + ,simpleLowerCaseMapping:0x1015B + ,simpleTitleCaseMapping:0x1015B + }, + { code:0x1015C + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1015C + ,simpleLowerCaseMapping:0x1015C + ,simpleTitleCaseMapping:0x1015C + }, + { code:0x1015D + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1015D + ,simpleLowerCaseMapping:0x1015D + ,simpleTitleCaseMapping:0x1015D + }, + { code:0x1015E + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1015E + ,simpleLowerCaseMapping:0x1015E + ,simpleTitleCaseMapping:0x1015E + }, + { code:0x1015F + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1015F + ,simpleLowerCaseMapping:0x1015F + ,simpleTitleCaseMapping:0x1015F + }, + { code:0x10160 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10160 + ,simpleLowerCaseMapping:0x10160 + ,simpleTitleCaseMapping:0x10160 + }, + { code:0x10161 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10161 + ,simpleLowerCaseMapping:0x10161 + ,simpleTitleCaseMapping:0x10161 + }, + { code:0x10162 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10162 + ,simpleLowerCaseMapping:0x10162 + ,simpleTitleCaseMapping:0x10162 + }, + { code:0x10163 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10163 + ,simpleLowerCaseMapping:0x10163 + ,simpleTitleCaseMapping:0x10163 + }, + { code:0x10164 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10164 + ,simpleLowerCaseMapping:0x10164 + ,simpleTitleCaseMapping:0x10164 + }, + { code:0x10165 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10165 + ,simpleLowerCaseMapping:0x10165 + ,simpleTitleCaseMapping:0x10165 + }, + { code:0x10166 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10166 + ,simpleLowerCaseMapping:0x10166 + ,simpleTitleCaseMapping:0x10166 + }, + { code:0x10167 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10167 + ,simpleLowerCaseMapping:0x10167 + ,simpleTitleCaseMapping:0x10167 + }, + { code:0x10168 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10168 + ,simpleLowerCaseMapping:0x10168 + ,simpleTitleCaseMapping:0x10168 + }, + { code:0x10169 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10169 + ,simpleLowerCaseMapping:0x10169 + ,simpleTitleCaseMapping:0x10169 + }, + { code:0x1016A + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1016A + ,simpleLowerCaseMapping:0x1016A + ,simpleTitleCaseMapping:0x1016A + }, + { code:0x1016B + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1016B + ,simpleLowerCaseMapping:0x1016B + ,simpleTitleCaseMapping:0x1016B + }, + { code:0x1016C + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1016C + ,simpleLowerCaseMapping:0x1016C + ,simpleTitleCaseMapping:0x1016C + }, + { code:0x1016D + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1016D + ,simpleLowerCaseMapping:0x1016D + ,simpleTitleCaseMapping:0x1016D + }, + { code:0x1016E + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1016E + ,simpleLowerCaseMapping:0x1016E + ,simpleTitleCaseMapping:0x1016E + }, + { code:0x1016F + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1016F + ,simpleLowerCaseMapping:0x1016F + ,simpleTitleCaseMapping:0x1016F + }, + { code:0x10170 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10170 + ,simpleLowerCaseMapping:0x10170 + ,simpleTitleCaseMapping:0x10170 + }, + { code:0x10171 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10171 + ,simpleLowerCaseMapping:0x10171 + ,simpleTitleCaseMapping:0x10171 + }, + { code:0x10172 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10172 + ,simpleLowerCaseMapping:0x10172 + ,simpleTitleCaseMapping:0x10172 + }, + { code:0x10173 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10173 + ,simpleLowerCaseMapping:0x10173 + ,simpleTitleCaseMapping:0x10173 + }, + { code:0x10174 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10174 + ,simpleLowerCaseMapping:0x10174 + ,simpleTitleCaseMapping:0x10174 + }, + { code:0x10175 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10175 + ,simpleLowerCaseMapping:0x10175 + ,simpleTitleCaseMapping:0x10175 + }, + { code:0x10176 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10176 + ,simpleLowerCaseMapping:0x10176 + ,simpleTitleCaseMapping:0x10176 + }, + { code:0x10177 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10177 + ,simpleLowerCaseMapping:0x10177 + ,simpleTitleCaseMapping:0x10177 + }, + { code:0x10178 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10178 + ,simpleLowerCaseMapping:0x10178 + ,simpleTitleCaseMapping:0x10178 + }, + { code:0x10179 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x10179 + ,simpleLowerCaseMapping:0x10179 + ,simpleTitleCaseMapping:0x10179 + }, + { code:0x1017A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1017A + ,simpleLowerCaseMapping:0x1017A + ,simpleTitleCaseMapping:0x1017A + }, + { code:0x1017B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1017B + ,simpleLowerCaseMapping:0x1017B + ,simpleTitleCaseMapping:0x1017B + }, + { code:0x1017C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1017C + ,simpleLowerCaseMapping:0x1017C + ,simpleTitleCaseMapping:0x1017C + }, + { code:0x1017D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1017D + ,simpleLowerCaseMapping:0x1017D + ,simpleTitleCaseMapping:0x1017D + }, + { code:0x1017E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1017E + ,simpleLowerCaseMapping:0x1017E + ,simpleTitleCaseMapping:0x1017E + }, + { code:0x1017F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1017F + ,simpleLowerCaseMapping:0x1017F + ,simpleTitleCaseMapping:0x1017F + }, + { code:0x10180 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x10180 + ,simpleLowerCaseMapping:0x10180 + ,simpleTitleCaseMapping:0x10180 + }, + { code:0x10181 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x10181 + ,simpleLowerCaseMapping:0x10181 + ,simpleTitleCaseMapping:0x10181 + }, + { code:0x10182 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x10182 + ,simpleLowerCaseMapping:0x10182 + ,simpleTitleCaseMapping:0x10182 + }, + { code:0x10183 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x10183 + ,simpleLowerCaseMapping:0x10183 + ,simpleTitleCaseMapping:0x10183 + }, + { code:0x10184 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x10184 + ,simpleLowerCaseMapping:0x10184 + ,simpleTitleCaseMapping:0x10184 + }, + { code:0x10185 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x10185 + ,simpleLowerCaseMapping:0x10185 + ,simpleTitleCaseMapping:0x10185 + }, + { code:0x10186 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x10186 + ,simpleLowerCaseMapping:0x10186 + ,simpleTitleCaseMapping:0x10186 + }, + { code:0x10187 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x10187 + ,simpleLowerCaseMapping:0x10187 + ,simpleTitleCaseMapping:0x10187 + }, + { code:0x10188 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x10188 + ,simpleLowerCaseMapping:0x10188 + ,simpleTitleCaseMapping:0x10188 + }, + { code:0x10189 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x10189 + ,simpleLowerCaseMapping:0x10189 + ,simpleTitleCaseMapping:0x10189 + }, + { code:0x1018A + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1018A + ,simpleLowerCaseMapping:0x1018A + ,simpleTitleCaseMapping:0x1018A + }, + { code:0x10300 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10300 + ,simpleLowerCaseMapping:0x10300 + ,simpleTitleCaseMapping:0x10300 + }, + { code:0x10301 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10301 + ,simpleLowerCaseMapping:0x10301 + ,simpleTitleCaseMapping:0x10301 + }, + { code:0x10302 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10302 + ,simpleLowerCaseMapping:0x10302 + ,simpleTitleCaseMapping:0x10302 + }, + { code:0x10303 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10303 + ,simpleLowerCaseMapping:0x10303 + ,simpleTitleCaseMapping:0x10303 + }, + { code:0x10304 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10304 + ,simpleLowerCaseMapping:0x10304 + ,simpleTitleCaseMapping:0x10304 + }, + { code:0x10305 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10305 + ,simpleLowerCaseMapping:0x10305 + ,simpleTitleCaseMapping:0x10305 + }, + { code:0x10306 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10306 + ,simpleLowerCaseMapping:0x10306 + ,simpleTitleCaseMapping:0x10306 + }, + { code:0x10307 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10307 + ,simpleLowerCaseMapping:0x10307 + ,simpleTitleCaseMapping:0x10307 + }, + { code:0x10308 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10308 + ,simpleLowerCaseMapping:0x10308 + ,simpleTitleCaseMapping:0x10308 + }, + { code:0x10309 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10309 + ,simpleLowerCaseMapping:0x10309 + ,simpleTitleCaseMapping:0x10309 + }, + { code:0x1030A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1030A + ,simpleLowerCaseMapping:0x1030A + ,simpleTitleCaseMapping:0x1030A + }, + { code:0x1030B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1030B + ,simpleLowerCaseMapping:0x1030B + ,simpleTitleCaseMapping:0x1030B + }, + { code:0x1030C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1030C + ,simpleLowerCaseMapping:0x1030C + ,simpleTitleCaseMapping:0x1030C + }, + { code:0x1030D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1030D + ,simpleLowerCaseMapping:0x1030D + ,simpleTitleCaseMapping:0x1030D + }, + { code:0x1030E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1030E + ,simpleLowerCaseMapping:0x1030E + ,simpleTitleCaseMapping:0x1030E + }, + { code:0x1030F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1030F + ,simpleLowerCaseMapping:0x1030F + ,simpleTitleCaseMapping:0x1030F + }, + { code:0x10310 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10310 + ,simpleLowerCaseMapping:0x10310 + ,simpleTitleCaseMapping:0x10310 + }, + { code:0x10311 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10311 + ,simpleLowerCaseMapping:0x10311 + ,simpleTitleCaseMapping:0x10311 + }, + { code:0x10312 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10312 + ,simpleLowerCaseMapping:0x10312 + ,simpleTitleCaseMapping:0x10312 + }, + { code:0x10313 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10313 + ,simpleLowerCaseMapping:0x10313 + ,simpleTitleCaseMapping:0x10313 + }, + { code:0x10314 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10314 + ,simpleLowerCaseMapping:0x10314 + ,simpleTitleCaseMapping:0x10314 + }, + { code:0x10315 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10315 + ,simpleLowerCaseMapping:0x10315 + ,simpleTitleCaseMapping:0x10315 + }, + { code:0x10316 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10316 + ,simpleLowerCaseMapping:0x10316 + ,simpleTitleCaseMapping:0x10316 + }, + { code:0x10317 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10317 + ,simpleLowerCaseMapping:0x10317 + ,simpleTitleCaseMapping:0x10317 + }, + { code:0x10318 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10318 + ,simpleLowerCaseMapping:0x10318 + ,simpleTitleCaseMapping:0x10318 + }, + { code:0x10319 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10319 + ,simpleLowerCaseMapping:0x10319 + ,simpleTitleCaseMapping:0x10319 + }, + { code:0x1031A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1031A + ,simpleLowerCaseMapping:0x1031A + ,simpleTitleCaseMapping:0x1031A + }, + { code:0x1031B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1031B + ,simpleLowerCaseMapping:0x1031B + ,simpleTitleCaseMapping:0x1031B + }, + { code:0x1031C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1031C + ,simpleLowerCaseMapping:0x1031C + ,simpleTitleCaseMapping:0x1031C + }, + { code:0x1031D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1031D + ,simpleLowerCaseMapping:0x1031D + ,simpleTitleCaseMapping:0x1031D + }, + { code:0x1031E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1031E + ,simpleLowerCaseMapping:0x1031E + ,simpleTitleCaseMapping:0x1031E + }, + { code:0x10320 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10320 + ,simpleLowerCaseMapping:0x10320 + ,simpleTitleCaseMapping:0x10320 + }, + { code:0x10321 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10321 + ,simpleLowerCaseMapping:0x10321 + ,simpleTitleCaseMapping:0x10321 + }, + { code:0x10322 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10322 + ,simpleLowerCaseMapping:0x10322 + ,simpleTitleCaseMapping:0x10322 + }, + { code:0x10323 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10323 + ,simpleLowerCaseMapping:0x10323 + ,simpleTitleCaseMapping:0x10323 + }, + { code:0x10330 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10330 + ,simpleLowerCaseMapping:0x10330 + ,simpleTitleCaseMapping:0x10330 + }, + { code:0x10331 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10331 + ,simpleLowerCaseMapping:0x10331 + ,simpleTitleCaseMapping:0x10331 + }, + { code:0x10332 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10332 + ,simpleLowerCaseMapping:0x10332 + ,simpleTitleCaseMapping:0x10332 + }, + { code:0x10333 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10333 + ,simpleLowerCaseMapping:0x10333 + ,simpleTitleCaseMapping:0x10333 + }, + { code:0x10334 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10334 + ,simpleLowerCaseMapping:0x10334 + ,simpleTitleCaseMapping:0x10334 + }, + { code:0x10335 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10335 + ,simpleLowerCaseMapping:0x10335 + ,simpleTitleCaseMapping:0x10335 + }, + { code:0x10336 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10336 + ,simpleLowerCaseMapping:0x10336 + ,simpleTitleCaseMapping:0x10336 + }, + { code:0x10337 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10337 + ,simpleLowerCaseMapping:0x10337 + ,simpleTitleCaseMapping:0x10337 + }, + { code:0x10338 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10338 + ,simpleLowerCaseMapping:0x10338 + ,simpleTitleCaseMapping:0x10338 + }, + { code:0x10339 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10339 + ,simpleLowerCaseMapping:0x10339 + ,simpleTitleCaseMapping:0x10339 + }, + { code:0x1033A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1033A + ,simpleLowerCaseMapping:0x1033A + ,simpleTitleCaseMapping:0x1033A + }, + { code:0x1033B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1033B + ,simpleLowerCaseMapping:0x1033B + ,simpleTitleCaseMapping:0x1033B + }, + { code:0x1033C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1033C + ,simpleLowerCaseMapping:0x1033C + ,simpleTitleCaseMapping:0x1033C + }, + { code:0x1033D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1033D + ,simpleLowerCaseMapping:0x1033D + ,simpleTitleCaseMapping:0x1033D + }, + { code:0x1033E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1033E + ,simpleLowerCaseMapping:0x1033E + ,simpleTitleCaseMapping:0x1033E + }, + { code:0x1033F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1033F + ,simpleLowerCaseMapping:0x1033F + ,simpleTitleCaseMapping:0x1033F + }, + { code:0x10340 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10340 + ,simpleLowerCaseMapping:0x10340 + ,simpleTitleCaseMapping:0x10340 + }, + { code:0x10341 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x10341 + ,simpleLowerCaseMapping:0x10341 + ,simpleTitleCaseMapping:0x10341 + }, + { code:0x10342 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10342 + ,simpleLowerCaseMapping:0x10342 + ,simpleTitleCaseMapping:0x10342 + }, + { code:0x10343 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10343 + ,simpleLowerCaseMapping:0x10343 + ,simpleTitleCaseMapping:0x10343 + }, + { code:0x10344 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10344 + ,simpleLowerCaseMapping:0x10344 + ,simpleTitleCaseMapping:0x10344 + }, + { code:0x10345 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10345 + ,simpleLowerCaseMapping:0x10345 + ,simpleTitleCaseMapping:0x10345 + }, + { code:0x10346 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10346 + ,simpleLowerCaseMapping:0x10346 + ,simpleTitleCaseMapping:0x10346 + }, + { code:0x10347 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10347 + ,simpleLowerCaseMapping:0x10347 + ,simpleTitleCaseMapping:0x10347 + }, + { code:0x10348 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10348 + ,simpleLowerCaseMapping:0x10348 + ,simpleTitleCaseMapping:0x10348 + }, + { code:0x10349 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10349 + ,simpleLowerCaseMapping:0x10349 + ,simpleTitleCaseMapping:0x10349 + }, + { code:0x1034A + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1034A + ,simpleLowerCaseMapping:0x1034A + ,simpleTitleCaseMapping:0x1034A + }, + { code:0x10380 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10380 + ,simpleLowerCaseMapping:0x10380 + ,simpleTitleCaseMapping:0x10380 + }, + { code:0x10381 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10381 + ,simpleLowerCaseMapping:0x10381 + ,simpleTitleCaseMapping:0x10381 + }, + { code:0x10382 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10382 + ,simpleLowerCaseMapping:0x10382 + ,simpleTitleCaseMapping:0x10382 + }, + { code:0x10383 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10383 + ,simpleLowerCaseMapping:0x10383 + ,simpleTitleCaseMapping:0x10383 + }, + { code:0x10384 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10384 + ,simpleLowerCaseMapping:0x10384 + ,simpleTitleCaseMapping:0x10384 + }, + { code:0x10385 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10385 + ,simpleLowerCaseMapping:0x10385 + ,simpleTitleCaseMapping:0x10385 + }, + { code:0x10386 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10386 + ,simpleLowerCaseMapping:0x10386 + ,simpleTitleCaseMapping:0x10386 + }, + { code:0x10387 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10387 + ,simpleLowerCaseMapping:0x10387 + ,simpleTitleCaseMapping:0x10387 + }, + { code:0x10388 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10388 + ,simpleLowerCaseMapping:0x10388 + ,simpleTitleCaseMapping:0x10388 + }, + { code:0x10389 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10389 + ,simpleLowerCaseMapping:0x10389 + ,simpleTitleCaseMapping:0x10389 + }, + { code:0x1038A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1038A + ,simpleLowerCaseMapping:0x1038A + ,simpleTitleCaseMapping:0x1038A + }, + { code:0x1038B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1038B + ,simpleLowerCaseMapping:0x1038B + ,simpleTitleCaseMapping:0x1038B + }, + { code:0x1038C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1038C + ,simpleLowerCaseMapping:0x1038C + ,simpleTitleCaseMapping:0x1038C + }, + { code:0x1038D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1038D + ,simpleLowerCaseMapping:0x1038D + ,simpleTitleCaseMapping:0x1038D + }, + { code:0x1038E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1038E + ,simpleLowerCaseMapping:0x1038E + ,simpleTitleCaseMapping:0x1038E + }, + { code:0x1038F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1038F + ,simpleLowerCaseMapping:0x1038F + ,simpleTitleCaseMapping:0x1038F + }, + { code:0x10390 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10390 + ,simpleLowerCaseMapping:0x10390 + ,simpleTitleCaseMapping:0x10390 + }, + { code:0x10391 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10391 + ,simpleLowerCaseMapping:0x10391 + ,simpleTitleCaseMapping:0x10391 + }, + { code:0x10392 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10392 + ,simpleLowerCaseMapping:0x10392 + ,simpleTitleCaseMapping:0x10392 + }, + { code:0x10393 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10393 + ,simpleLowerCaseMapping:0x10393 + ,simpleTitleCaseMapping:0x10393 + }, + { code:0x10394 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10394 + ,simpleLowerCaseMapping:0x10394 + ,simpleTitleCaseMapping:0x10394 + }, + { code:0x10395 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10395 + ,simpleLowerCaseMapping:0x10395 + ,simpleTitleCaseMapping:0x10395 + }, + { code:0x10396 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10396 + ,simpleLowerCaseMapping:0x10396 + ,simpleTitleCaseMapping:0x10396 + }, + { code:0x10397 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10397 + ,simpleLowerCaseMapping:0x10397 + ,simpleTitleCaseMapping:0x10397 + }, + { code:0x10398 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10398 + ,simpleLowerCaseMapping:0x10398 + ,simpleTitleCaseMapping:0x10398 + }, + { code:0x10399 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10399 + ,simpleLowerCaseMapping:0x10399 + ,simpleTitleCaseMapping:0x10399 + }, + { code:0x1039A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1039A + ,simpleLowerCaseMapping:0x1039A + ,simpleTitleCaseMapping:0x1039A + }, + { code:0x1039B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1039B + ,simpleLowerCaseMapping:0x1039B + ,simpleTitleCaseMapping:0x1039B + }, + { code:0x1039C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1039C + ,simpleLowerCaseMapping:0x1039C + ,simpleTitleCaseMapping:0x1039C + }, + { code:0x1039D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1039D + ,simpleLowerCaseMapping:0x1039D + ,simpleTitleCaseMapping:0x1039D + }, + { code:0x1039F + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x1039F + ,simpleLowerCaseMapping:0x1039F + ,simpleTitleCaseMapping:0x1039F + }, + { code:0x103A0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103A0 + ,simpleLowerCaseMapping:0x103A0 + ,simpleTitleCaseMapping:0x103A0 + }, + { code:0x103A1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103A1 + ,simpleLowerCaseMapping:0x103A1 + ,simpleTitleCaseMapping:0x103A1 + }, + { code:0x103A2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103A2 + ,simpleLowerCaseMapping:0x103A2 + ,simpleTitleCaseMapping:0x103A2 + }, + { code:0x103A3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103A3 + ,simpleLowerCaseMapping:0x103A3 + ,simpleTitleCaseMapping:0x103A3 + }, + { code:0x103A4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103A4 + ,simpleLowerCaseMapping:0x103A4 + ,simpleTitleCaseMapping:0x103A4 + }, + { code:0x103A5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103A5 + ,simpleLowerCaseMapping:0x103A5 + ,simpleTitleCaseMapping:0x103A5 + }, + { code:0x103A6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103A6 + ,simpleLowerCaseMapping:0x103A6 + ,simpleTitleCaseMapping:0x103A6 + }, + { code:0x103A7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103A7 + ,simpleLowerCaseMapping:0x103A7 + ,simpleTitleCaseMapping:0x103A7 + }, + { code:0x103A8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103A8 + ,simpleLowerCaseMapping:0x103A8 + ,simpleTitleCaseMapping:0x103A8 + }, + { code:0x103A9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103A9 + ,simpleLowerCaseMapping:0x103A9 + ,simpleTitleCaseMapping:0x103A9 + }, + { code:0x103AA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103AA + ,simpleLowerCaseMapping:0x103AA + ,simpleTitleCaseMapping:0x103AA + }, + { code:0x103AB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103AB + ,simpleLowerCaseMapping:0x103AB + ,simpleTitleCaseMapping:0x103AB + }, + { code:0x103AC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103AC + ,simpleLowerCaseMapping:0x103AC + ,simpleTitleCaseMapping:0x103AC + }, + { code:0x103AD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103AD + ,simpleLowerCaseMapping:0x103AD + ,simpleTitleCaseMapping:0x103AD + }, + { code:0x103AE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103AE + ,simpleLowerCaseMapping:0x103AE + ,simpleTitleCaseMapping:0x103AE + }, + { code:0x103AF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103AF + ,simpleLowerCaseMapping:0x103AF + ,simpleTitleCaseMapping:0x103AF + }, + { code:0x103B0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103B0 + ,simpleLowerCaseMapping:0x103B0 + ,simpleTitleCaseMapping:0x103B0 + }, + { code:0x103B1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103B1 + ,simpleLowerCaseMapping:0x103B1 + ,simpleTitleCaseMapping:0x103B1 + }, + { code:0x103B2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103B2 + ,simpleLowerCaseMapping:0x103B2 + ,simpleTitleCaseMapping:0x103B2 + }, + { code:0x103B3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103B3 + ,simpleLowerCaseMapping:0x103B3 + ,simpleTitleCaseMapping:0x103B3 + }, + { code:0x103B4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103B4 + ,simpleLowerCaseMapping:0x103B4 + ,simpleTitleCaseMapping:0x103B4 + }, + { code:0x103B5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103B5 + ,simpleLowerCaseMapping:0x103B5 + ,simpleTitleCaseMapping:0x103B5 + }, + { code:0x103B6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103B6 + ,simpleLowerCaseMapping:0x103B6 + ,simpleTitleCaseMapping:0x103B6 + }, + { code:0x103B7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103B7 + ,simpleLowerCaseMapping:0x103B7 + ,simpleTitleCaseMapping:0x103B7 + }, + { code:0x103B8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103B8 + ,simpleLowerCaseMapping:0x103B8 + ,simpleTitleCaseMapping:0x103B8 + }, + { code:0x103B9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103B9 + ,simpleLowerCaseMapping:0x103B9 + ,simpleTitleCaseMapping:0x103B9 + }, + { code:0x103BA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103BA + ,simpleLowerCaseMapping:0x103BA + ,simpleTitleCaseMapping:0x103BA + }, + { code:0x103BB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103BB + ,simpleLowerCaseMapping:0x103BB + ,simpleTitleCaseMapping:0x103BB + }, + { code:0x103BC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103BC + ,simpleLowerCaseMapping:0x103BC + ,simpleTitleCaseMapping:0x103BC + }, + { code:0x103BD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103BD + ,simpleLowerCaseMapping:0x103BD + ,simpleTitleCaseMapping:0x103BD + }, + { code:0x103BE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103BE + ,simpleLowerCaseMapping:0x103BE + ,simpleTitleCaseMapping:0x103BE + }, + { code:0x103BF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103BF + ,simpleLowerCaseMapping:0x103BF + ,simpleTitleCaseMapping:0x103BF + }, + { code:0x103C0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103C0 + ,simpleLowerCaseMapping:0x103C0 + ,simpleTitleCaseMapping:0x103C0 + }, + { code:0x103C1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103C1 + ,simpleLowerCaseMapping:0x103C1 + ,simpleTitleCaseMapping:0x103C1 + }, + { code:0x103C2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103C2 + ,simpleLowerCaseMapping:0x103C2 + ,simpleTitleCaseMapping:0x103C2 + }, + { code:0x103C3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103C3 + ,simpleLowerCaseMapping:0x103C3 + ,simpleTitleCaseMapping:0x103C3 + }, + { code:0x103C8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103C8 + ,simpleLowerCaseMapping:0x103C8 + ,simpleTitleCaseMapping:0x103C8 + }, + { code:0x103C9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103C9 + ,simpleLowerCaseMapping:0x103C9 + ,simpleTitleCaseMapping:0x103C9 + }, + { code:0x103CA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103CA + ,simpleLowerCaseMapping:0x103CA + ,simpleTitleCaseMapping:0x103CA + }, + { code:0x103CB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103CB + ,simpleLowerCaseMapping:0x103CB + ,simpleTitleCaseMapping:0x103CB + }, + { code:0x103CC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103CC + ,simpleLowerCaseMapping:0x103CC + ,simpleTitleCaseMapping:0x103CC + }, + { code:0x103CD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103CD + ,simpleLowerCaseMapping:0x103CD + ,simpleTitleCaseMapping:0x103CD + }, + { code:0x103CE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103CE + ,simpleLowerCaseMapping:0x103CE + ,simpleTitleCaseMapping:0x103CE + }, + { code:0x103CF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x103CF + ,simpleLowerCaseMapping:0x103CF + ,simpleTitleCaseMapping:0x103CF + }, + { code:0x103D0 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x103D0 + ,simpleLowerCaseMapping:0x103D0 + ,simpleTitleCaseMapping:0x103D0 + }, + { code:0x103D1 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x103D1 + ,simpleLowerCaseMapping:0x103D1 + ,simpleTitleCaseMapping:0x103D1 + }, + { code:0x103D2 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x103D2 + ,simpleLowerCaseMapping:0x103D2 + ,simpleTitleCaseMapping:0x103D2 + }, + { code:0x103D3 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x103D3 + ,simpleLowerCaseMapping:0x103D3 + ,simpleTitleCaseMapping:0x103D3 + }, + { code:0x103D4 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x103D4 + ,simpleLowerCaseMapping:0x103D4 + ,simpleTitleCaseMapping:0x103D4 + }, + { code:0x103D5 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x103D5 + ,simpleLowerCaseMapping:0x103D5 + ,simpleTitleCaseMapping:0x103D5 + }, + { code:0x10400 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10400 + ,simpleLowerCaseMapping:0x10428 + ,simpleTitleCaseMapping:0x10400 + }, + { code:0x10401 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10401 + ,simpleLowerCaseMapping:0x10429 + ,simpleTitleCaseMapping:0x10401 + }, + { code:0x10402 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10402 + ,simpleLowerCaseMapping:0x1042A + ,simpleTitleCaseMapping:0x10402 + }, + { code:0x10403 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10403 + ,simpleLowerCaseMapping:0x1042B + ,simpleTitleCaseMapping:0x10403 + }, + { code:0x10404 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10404 + ,simpleLowerCaseMapping:0x1042C + ,simpleTitleCaseMapping:0x10404 + }, + { code:0x10405 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10405 + ,simpleLowerCaseMapping:0x1042D + ,simpleTitleCaseMapping:0x10405 + }, + { code:0x10406 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10406 + ,simpleLowerCaseMapping:0x1042E + ,simpleTitleCaseMapping:0x10406 + }, + { code:0x10407 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10407 + ,simpleLowerCaseMapping:0x1042F + ,simpleTitleCaseMapping:0x10407 + }, + { code:0x10408 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10408 + ,simpleLowerCaseMapping:0x10430 + ,simpleTitleCaseMapping:0x10408 + }, + { code:0x10409 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10409 + ,simpleLowerCaseMapping:0x10431 + ,simpleTitleCaseMapping:0x10409 + }, + { code:0x1040A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1040A + ,simpleLowerCaseMapping:0x10432 + ,simpleTitleCaseMapping:0x1040A + }, + { code:0x1040B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1040B + ,simpleLowerCaseMapping:0x10433 + ,simpleTitleCaseMapping:0x1040B + }, + { code:0x1040C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1040C + ,simpleLowerCaseMapping:0x10434 + ,simpleTitleCaseMapping:0x1040C + }, + { code:0x1040D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1040D + ,simpleLowerCaseMapping:0x10435 + ,simpleTitleCaseMapping:0x1040D + }, + { code:0x1040E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1040E + ,simpleLowerCaseMapping:0x10436 + ,simpleTitleCaseMapping:0x1040E + }, + { code:0x1040F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1040F + ,simpleLowerCaseMapping:0x10437 + ,simpleTitleCaseMapping:0x1040F + }, + { code:0x10410 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10410 + ,simpleLowerCaseMapping:0x10438 + ,simpleTitleCaseMapping:0x10410 + }, + { code:0x10411 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10411 + ,simpleLowerCaseMapping:0x10439 + ,simpleTitleCaseMapping:0x10411 + }, + { code:0x10412 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10412 + ,simpleLowerCaseMapping:0x1043A + ,simpleTitleCaseMapping:0x10412 + }, + { code:0x10413 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10413 + ,simpleLowerCaseMapping:0x1043B + ,simpleTitleCaseMapping:0x10413 + }, + { code:0x10414 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10414 + ,simpleLowerCaseMapping:0x1043C + ,simpleTitleCaseMapping:0x10414 + }, + { code:0x10415 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10415 + ,simpleLowerCaseMapping:0x1043D + ,simpleTitleCaseMapping:0x10415 + }, + { code:0x10416 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10416 + ,simpleLowerCaseMapping:0x1043E + ,simpleTitleCaseMapping:0x10416 + }, + { code:0x10417 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10417 + ,simpleLowerCaseMapping:0x1043F + ,simpleTitleCaseMapping:0x10417 + }, + { code:0x10418 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10418 + ,simpleLowerCaseMapping:0x10440 + ,simpleTitleCaseMapping:0x10418 + }, + { code:0x10419 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10419 + ,simpleLowerCaseMapping:0x10441 + ,simpleTitleCaseMapping:0x10419 + }, + { code:0x1041A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1041A + ,simpleLowerCaseMapping:0x10442 + ,simpleTitleCaseMapping:0x1041A + }, + { code:0x1041B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1041B + ,simpleLowerCaseMapping:0x10443 + ,simpleTitleCaseMapping:0x1041B + }, + { code:0x1041C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1041C + ,simpleLowerCaseMapping:0x10444 + ,simpleTitleCaseMapping:0x1041C + }, + { code:0x1041D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1041D + ,simpleLowerCaseMapping:0x10445 + ,simpleTitleCaseMapping:0x1041D + }, + { code:0x1041E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1041E + ,simpleLowerCaseMapping:0x10446 + ,simpleTitleCaseMapping:0x1041E + }, + { code:0x1041F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1041F + ,simpleLowerCaseMapping:0x10447 + ,simpleTitleCaseMapping:0x1041F + }, + { code:0x10420 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10420 + ,simpleLowerCaseMapping:0x10448 + ,simpleTitleCaseMapping:0x10420 + }, + { code:0x10421 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10421 + ,simpleLowerCaseMapping:0x10449 + ,simpleTitleCaseMapping:0x10421 + }, + { code:0x10422 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10422 + ,simpleLowerCaseMapping:0x1044A + ,simpleTitleCaseMapping:0x10422 + }, + { code:0x10423 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10423 + ,simpleLowerCaseMapping:0x1044B + ,simpleTitleCaseMapping:0x10423 + }, + { code:0x10424 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10424 + ,simpleLowerCaseMapping:0x1044C + ,simpleTitleCaseMapping:0x10424 + }, + { code:0x10425 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10425 + ,simpleLowerCaseMapping:0x1044D + ,simpleTitleCaseMapping:0x10425 + }, + { code:0x10426 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10426 + ,simpleLowerCaseMapping:0x1044E + ,simpleTitleCaseMapping:0x10426 + }, + { code:0x10427 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x10427 + ,simpleLowerCaseMapping:0x1044F + ,simpleTitleCaseMapping:0x10427 + }, + { code:0x10428 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10400 + ,simpleLowerCaseMapping:0x10428 + ,simpleTitleCaseMapping:0x10400 + }, + { code:0x10429 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10401 + ,simpleLowerCaseMapping:0x10429 + ,simpleTitleCaseMapping:0x10401 + }, + { code:0x1042A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10402 + ,simpleLowerCaseMapping:0x1042A + ,simpleTitleCaseMapping:0x10402 + }, + { code:0x1042B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10403 + ,simpleLowerCaseMapping:0x1042B + ,simpleTitleCaseMapping:0x10403 + }, + { code:0x1042C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10404 + ,simpleLowerCaseMapping:0x1042C + ,simpleTitleCaseMapping:0x10404 + }, + { code:0x1042D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10405 + ,simpleLowerCaseMapping:0x1042D + ,simpleTitleCaseMapping:0x10405 + }, + { code:0x1042E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10406 + ,simpleLowerCaseMapping:0x1042E + ,simpleTitleCaseMapping:0x10406 + }, + { code:0x1042F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10407 + ,simpleLowerCaseMapping:0x1042F + ,simpleTitleCaseMapping:0x10407 + }, + { code:0x10430 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10408 + ,simpleLowerCaseMapping:0x10430 + ,simpleTitleCaseMapping:0x10408 + }, + { code:0x10431 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10409 + ,simpleLowerCaseMapping:0x10431 + ,simpleTitleCaseMapping:0x10409 + }, + { code:0x10432 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1040A + ,simpleLowerCaseMapping:0x10432 + ,simpleTitleCaseMapping:0x1040A + }, + { code:0x10433 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1040B + ,simpleLowerCaseMapping:0x10433 + ,simpleTitleCaseMapping:0x1040B + }, + { code:0x10434 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1040C + ,simpleLowerCaseMapping:0x10434 + ,simpleTitleCaseMapping:0x1040C + }, + { code:0x10435 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1040D + ,simpleLowerCaseMapping:0x10435 + ,simpleTitleCaseMapping:0x1040D + }, + { code:0x10436 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1040E + ,simpleLowerCaseMapping:0x10436 + ,simpleTitleCaseMapping:0x1040E + }, + { code:0x10437 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1040F + ,simpleLowerCaseMapping:0x10437 + ,simpleTitleCaseMapping:0x1040F + }, + { code:0x10438 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10410 + ,simpleLowerCaseMapping:0x10438 + ,simpleTitleCaseMapping:0x10410 + }, + { code:0x10439 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10411 + ,simpleLowerCaseMapping:0x10439 + ,simpleTitleCaseMapping:0x10411 + }, + { code:0x1043A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10412 + ,simpleLowerCaseMapping:0x1043A + ,simpleTitleCaseMapping:0x10412 + }, + { code:0x1043B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10413 + ,simpleLowerCaseMapping:0x1043B + ,simpleTitleCaseMapping:0x10413 + }, + { code:0x1043C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10414 + ,simpleLowerCaseMapping:0x1043C + ,simpleTitleCaseMapping:0x10414 + }, + { code:0x1043D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10415 + ,simpleLowerCaseMapping:0x1043D + ,simpleTitleCaseMapping:0x10415 + }, + { code:0x1043E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10416 + ,simpleLowerCaseMapping:0x1043E + ,simpleTitleCaseMapping:0x10416 + }, + { code:0x1043F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10417 + ,simpleLowerCaseMapping:0x1043F + ,simpleTitleCaseMapping:0x10417 + }, + { code:0x10440 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10418 + ,simpleLowerCaseMapping:0x10440 + ,simpleTitleCaseMapping:0x10418 + }, + { code:0x10441 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10419 + ,simpleLowerCaseMapping:0x10441 + ,simpleTitleCaseMapping:0x10419 + }, + { code:0x10442 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1041A + ,simpleLowerCaseMapping:0x10442 + ,simpleTitleCaseMapping:0x1041A + }, + { code:0x10443 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1041B + ,simpleLowerCaseMapping:0x10443 + ,simpleTitleCaseMapping:0x1041B + }, + { code:0x10444 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1041C + ,simpleLowerCaseMapping:0x10444 + ,simpleTitleCaseMapping:0x1041C + }, + { code:0x10445 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1041D + ,simpleLowerCaseMapping:0x10445 + ,simpleTitleCaseMapping:0x1041D + }, + { code:0x10446 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1041E + ,simpleLowerCaseMapping:0x10446 + ,simpleTitleCaseMapping:0x1041E + }, + { code:0x10447 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1041F + ,simpleLowerCaseMapping:0x10447 + ,simpleTitleCaseMapping:0x1041F + }, + { code:0x10448 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10420 + ,simpleLowerCaseMapping:0x10448 + ,simpleTitleCaseMapping:0x10420 + }, + { code:0x10449 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10421 + ,simpleLowerCaseMapping:0x10449 + ,simpleTitleCaseMapping:0x10421 + }, + { code:0x1044A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10422 + ,simpleLowerCaseMapping:0x1044A + ,simpleTitleCaseMapping:0x10422 + }, + { code:0x1044B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10423 + ,simpleLowerCaseMapping:0x1044B + ,simpleTitleCaseMapping:0x10423 + }, + { code:0x1044C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10424 + ,simpleLowerCaseMapping:0x1044C + ,simpleTitleCaseMapping:0x10424 + }, + { code:0x1044D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10425 + ,simpleLowerCaseMapping:0x1044D + ,simpleTitleCaseMapping:0x10425 + }, + { code:0x1044E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10426 + ,simpleLowerCaseMapping:0x1044E + ,simpleTitleCaseMapping:0x10426 + }, + { code:0x1044F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x10427 + ,simpleLowerCaseMapping:0x1044F + ,simpleTitleCaseMapping:0x10427 + }, + { code:0x10450 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10450 + ,simpleLowerCaseMapping:0x10450 + ,simpleTitleCaseMapping:0x10450 + }, + { code:0x10451 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10451 + ,simpleLowerCaseMapping:0x10451 + ,simpleTitleCaseMapping:0x10451 + }, + { code:0x10452 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10452 + ,simpleLowerCaseMapping:0x10452 + ,simpleTitleCaseMapping:0x10452 + }, + { code:0x10453 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10453 + ,simpleLowerCaseMapping:0x10453 + ,simpleTitleCaseMapping:0x10453 + }, + { code:0x10454 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10454 + ,simpleLowerCaseMapping:0x10454 + ,simpleTitleCaseMapping:0x10454 + }, + { code:0x10455 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10455 + ,simpleLowerCaseMapping:0x10455 + ,simpleTitleCaseMapping:0x10455 + }, + { code:0x10456 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10456 + ,simpleLowerCaseMapping:0x10456 + ,simpleTitleCaseMapping:0x10456 + }, + { code:0x10457 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10457 + ,simpleLowerCaseMapping:0x10457 + ,simpleTitleCaseMapping:0x10457 + }, + { code:0x10458 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10458 + ,simpleLowerCaseMapping:0x10458 + ,simpleTitleCaseMapping:0x10458 + }, + { code:0x10459 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10459 + ,simpleLowerCaseMapping:0x10459 + ,simpleTitleCaseMapping:0x10459 + }, + { code:0x1045A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1045A + ,simpleLowerCaseMapping:0x1045A + ,simpleTitleCaseMapping:0x1045A + }, + { code:0x1045B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1045B + ,simpleLowerCaseMapping:0x1045B + ,simpleTitleCaseMapping:0x1045B + }, + { code:0x1045C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1045C + ,simpleLowerCaseMapping:0x1045C + ,simpleTitleCaseMapping:0x1045C + }, + { code:0x1045D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1045D + ,simpleLowerCaseMapping:0x1045D + ,simpleTitleCaseMapping:0x1045D + }, + { code:0x1045E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1045E + ,simpleLowerCaseMapping:0x1045E + ,simpleTitleCaseMapping:0x1045E + }, + { code:0x1045F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1045F + ,simpleLowerCaseMapping:0x1045F + ,simpleTitleCaseMapping:0x1045F + }, + { code:0x10460 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10460 + ,simpleLowerCaseMapping:0x10460 + ,simpleTitleCaseMapping:0x10460 + }, + { code:0x10461 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10461 + ,simpleLowerCaseMapping:0x10461 + ,simpleTitleCaseMapping:0x10461 + }, + { code:0x10462 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10462 + ,simpleLowerCaseMapping:0x10462 + ,simpleTitleCaseMapping:0x10462 + }, + { code:0x10463 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10463 + ,simpleLowerCaseMapping:0x10463 + ,simpleTitleCaseMapping:0x10463 + }, + { code:0x10464 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10464 + ,simpleLowerCaseMapping:0x10464 + ,simpleTitleCaseMapping:0x10464 + }, + { code:0x10465 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10465 + ,simpleLowerCaseMapping:0x10465 + ,simpleTitleCaseMapping:0x10465 + }, + { code:0x10466 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10466 + ,simpleLowerCaseMapping:0x10466 + ,simpleTitleCaseMapping:0x10466 + }, + { code:0x10467 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10467 + ,simpleLowerCaseMapping:0x10467 + ,simpleTitleCaseMapping:0x10467 + }, + { code:0x10468 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10468 + ,simpleLowerCaseMapping:0x10468 + ,simpleTitleCaseMapping:0x10468 + }, + { code:0x10469 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10469 + ,simpleLowerCaseMapping:0x10469 + ,simpleTitleCaseMapping:0x10469 + }, + { code:0x1046A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1046A + ,simpleLowerCaseMapping:0x1046A + ,simpleTitleCaseMapping:0x1046A + }, + { code:0x1046B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1046B + ,simpleLowerCaseMapping:0x1046B + ,simpleTitleCaseMapping:0x1046B + }, + { code:0x1046C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1046C + ,simpleLowerCaseMapping:0x1046C + ,simpleTitleCaseMapping:0x1046C + }, + { code:0x1046D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1046D + ,simpleLowerCaseMapping:0x1046D + ,simpleTitleCaseMapping:0x1046D + }, + { code:0x1046E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1046E + ,simpleLowerCaseMapping:0x1046E + ,simpleTitleCaseMapping:0x1046E + }, + { code:0x1046F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1046F + ,simpleLowerCaseMapping:0x1046F + ,simpleTitleCaseMapping:0x1046F + }, + { code:0x10470 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10470 + ,simpleLowerCaseMapping:0x10470 + ,simpleTitleCaseMapping:0x10470 + }, + { code:0x10471 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10471 + ,simpleLowerCaseMapping:0x10471 + ,simpleTitleCaseMapping:0x10471 + }, + { code:0x10472 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10472 + ,simpleLowerCaseMapping:0x10472 + ,simpleTitleCaseMapping:0x10472 + }, + { code:0x10473 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10473 + ,simpleLowerCaseMapping:0x10473 + ,simpleTitleCaseMapping:0x10473 + }, + { code:0x10474 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10474 + ,simpleLowerCaseMapping:0x10474 + ,simpleTitleCaseMapping:0x10474 + }, + { code:0x10475 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10475 + ,simpleLowerCaseMapping:0x10475 + ,simpleTitleCaseMapping:0x10475 + }, + { code:0x10476 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10476 + ,simpleLowerCaseMapping:0x10476 + ,simpleTitleCaseMapping:0x10476 + }, + { code:0x10477 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10477 + ,simpleLowerCaseMapping:0x10477 + ,simpleTitleCaseMapping:0x10477 + }, + { code:0x10478 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10478 + ,simpleLowerCaseMapping:0x10478 + ,simpleTitleCaseMapping:0x10478 + }, + { code:0x10479 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10479 + ,simpleLowerCaseMapping:0x10479 + ,simpleTitleCaseMapping:0x10479 + }, + { code:0x1047A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1047A + ,simpleLowerCaseMapping:0x1047A + ,simpleTitleCaseMapping:0x1047A + }, + { code:0x1047B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1047B + ,simpleLowerCaseMapping:0x1047B + ,simpleTitleCaseMapping:0x1047B + }, + { code:0x1047C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1047C + ,simpleLowerCaseMapping:0x1047C + ,simpleTitleCaseMapping:0x1047C + }, + { code:0x1047D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1047D + ,simpleLowerCaseMapping:0x1047D + ,simpleTitleCaseMapping:0x1047D + }, + { code:0x1047E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1047E + ,simpleLowerCaseMapping:0x1047E + ,simpleTitleCaseMapping:0x1047E + }, + { code:0x1047F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1047F + ,simpleLowerCaseMapping:0x1047F + ,simpleTitleCaseMapping:0x1047F + }, + { code:0x10480 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10480 + ,simpleLowerCaseMapping:0x10480 + ,simpleTitleCaseMapping:0x10480 + }, + { code:0x10481 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10481 + ,simpleLowerCaseMapping:0x10481 + ,simpleTitleCaseMapping:0x10481 + }, + { code:0x10482 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10482 + ,simpleLowerCaseMapping:0x10482 + ,simpleTitleCaseMapping:0x10482 + }, + { code:0x10483 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10483 + ,simpleLowerCaseMapping:0x10483 + ,simpleTitleCaseMapping:0x10483 + }, + { code:0x10484 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10484 + ,simpleLowerCaseMapping:0x10484 + ,simpleTitleCaseMapping:0x10484 + }, + { code:0x10485 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10485 + ,simpleLowerCaseMapping:0x10485 + ,simpleTitleCaseMapping:0x10485 + }, + { code:0x10486 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10486 + ,simpleLowerCaseMapping:0x10486 + ,simpleTitleCaseMapping:0x10486 + }, + { code:0x10487 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10487 + ,simpleLowerCaseMapping:0x10487 + ,simpleTitleCaseMapping:0x10487 + }, + { code:0x10488 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10488 + ,simpleLowerCaseMapping:0x10488 + ,simpleTitleCaseMapping:0x10488 + }, + { code:0x10489 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10489 + ,simpleLowerCaseMapping:0x10489 + ,simpleTitleCaseMapping:0x10489 + }, + { code:0x1048A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1048A + ,simpleLowerCaseMapping:0x1048A + ,simpleTitleCaseMapping:0x1048A + }, + { code:0x1048B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1048B + ,simpleLowerCaseMapping:0x1048B + ,simpleTitleCaseMapping:0x1048B + }, + { code:0x1048C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1048C + ,simpleLowerCaseMapping:0x1048C + ,simpleTitleCaseMapping:0x1048C + }, + { code:0x1048D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1048D + ,simpleLowerCaseMapping:0x1048D + ,simpleTitleCaseMapping:0x1048D + }, + { code:0x1048E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1048E + ,simpleLowerCaseMapping:0x1048E + ,simpleTitleCaseMapping:0x1048E + }, + { code:0x1048F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1048F + ,simpleLowerCaseMapping:0x1048F + ,simpleTitleCaseMapping:0x1048F + }, + { code:0x10490 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10490 + ,simpleLowerCaseMapping:0x10490 + ,simpleTitleCaseMapping:0x10490 + }, + { code:0x10491 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10491 + ,simpleLowerCaseMapping:0x10491 + ,simpleTitleCaseMapping:0x10491 + }, + { code:0x10492 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10492 + ,simpleLowerCaseMapping:0x10492 + ,simpleTitleCaseMapping:0x10492 + }, + { code:0x10493 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10493 + ,simpleLowerCaseMapping:0x10493 + ,simpleTitleCaseMapping:0x10493 + }, + { code:0x10494 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10494 + ,simpleLowerCaseMapping:0x10494 + ,simpleTitleCaseMapping:0x10494 + }, + { code:0x10495 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10495 + ,simpleLowerCaseMapping:0x10495 + ,simpleTitleCaseMapping:0x10495 + }, + { code:0x10496 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10496 + ,simpleLowerCaseMapping:0x10496 + ,simpleTitleCaseMapping:0x10496 + }, + { code:0x10497 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10497 + ,simpleLowerCaseMapping:0x10497 + ,simpleTitleCaseMapping:0x10497 + }, + { code:0x10498 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10498 + ,simpleLowerCaseMapping:0x10498 + ,simpleTitleCaseMapping:0x10498 + }, + { code:0x10499 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10499 + ,simpleLowerCaseMapping:0x10499 + ,simpleTitleCaseMapping:0x10499 + }, + { code:0x1049A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1049A + ,simpleLowerCaseMapping:0x1049A + ,simpleTitleCaseMapping:0x1049A + }, + { code:0x1049B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1049B + ,simpleLowerCaseMapping:0x1049B + ,simpleTitleCaseMapping:0x1049B + }, + { code:0x1049C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1049C + ,simpleLowerCaseMapping:0x1049C + ,simpleTitleCaseMapping:0x1049C + }, + { code:0x1049D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1049D + ,simpleLowerCaseMapping:0x1049D + ,simpleTitleCaseMapping:0x1049D + }, + { code:0x104A0 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x104A0 + ,simpleLowerCaseMapping:0x104A0 + ,simpleTitleCaseMapping:0x104A0 + }, + { code:0x104A1 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x104A1 + ,simpleLowerCaseMapping:0x104A1 + ,simpleTitleCaseMapping:0x104A1 + }, + { code:0x104A2 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x104A2 + ,simpleLowerCaseMapping:0x104A2 + ,simpleTitleCaseMapping:0x104A2 + }, + { code:0x104A3 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x104A3 + ,simpleLowerCaseMapping:0x104A3 + ,simpleTitleCaseMapping:0x104A3 + }, + { code:0x104A4 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x104A4 + ,simpleLowerCaseMapping:0x104A4 + ,simpleTitleCaseMapping:0x104A4 + }, + { code:0x104A5 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x104A5 + ,simpleLowerCaseMapping:0x104A5 + ,simpleTitleCaseMapping:0x104A5 + }, + { code:0x104A6 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x104A6 + ,simpleLowerCaseMapping:0x104A6 + ,simpleTitleCaseMapping:0x104A6 + }, + { code:0x104A7 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x104A7 + ,simpleLowerCaseMapping:0x104A7 + ,simpleTitleCaseMapping:0x104A7 + }, + { code:0x104A8 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x104A8 + ,simpleLowerCaseMapping:0x104A8 + ,simpleTitleCaseMapping:0x104A8 + }, + { code:0x104A9 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x104A9 + ,simpleLowerCaseMapping:0x104A9 + ,simpleTitleCaseMapping:0x104A9 + }, + { code:0x10800 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10800 + ,simpleLowerCaseMapping:0x10800 + ,simpleTitleCaseMapping:0x10800 + }, + { code:0x10801 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10801 + ,simpleLowerCaseMapping:0x10801 + ,simpleTitleCaseMapping:0x10801 + }, + { code:0x10802 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10802 + ,simpleLowerCaseMapping:0x10802 + ,simpleTitleCaseMapping:0x10802 + }, + { code:0x10803 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10803 + ,simpleLowerCaseMapping:0x10803 + ,simpleTitleCaseMapping:0x10803 + }, + { code:0x10804 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10804 + ,simpleLowerCaseMapping:0x10804 + ,simpleTitleCaseMapping:0x10804 + }, + { code:0x10805 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10805 + ,simpleLowerCaseMapping:0x10805 + ,simpleTitleCaseMapping:0x10805 + }, + { code:0x10808 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10808 + ,simpleLowerCaseMapping:0x10808 + ,simpleTitleCaseMapping:0x10808 + }, + { code:0x1080A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1080A + ,simpleLowerCaseMapping:0x1080A + ,simpleTitleCaseMapping:0x1080A + }, + { code:0x1080B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1080B + ,simpleLowerCaseMapping:0x1080B + ,simpleTitleCaseMapping:0x1080B + }, + { code:0x1080C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1080C + ,simpleLowerCaseMapping:0x1080C + ,simpleTitleCaseMapping:0x1080C + }, + { code:0x1080D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1080D + ,simpleLowerCaseMapping:0x1080D + ,simpleTitleCaseMapping:0x1080D + }, + { code:0x1080E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1080E + ,simpleLowerCaseMapping:0x1080E + ,simpleTitleCaseMapping:0x1080E + }, + { code:0x1080F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1080F + ,simpleLowerCaseMapping:0x1080F + ,simpleTitleCaseMapping:0x1080F + }, + { code:0x10810 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10810 + ,simpleLowerCaseMapping:0x10810 + ,simpleTitleCaseMapping:0x10810 + }, + { code:0x10811 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10811 + ,simpleLowerCaseMapping:0x10811 + ,simpleTitleCaseMapping:0x10811 + }, + { code:0x10812 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10812 + ,simpleLowerCaseMapping:0x10812 + ,simpleTitleCaseMapping:0x10812 + }, + { code:0x10813 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10813 + ,simpleLowerCaseMapping:0x10813 + ,simpleTitleCaseMapping:0x10813 + }, + { code:0x10814 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10814 + ,simpleLowerCaseMapping:0x10814 + ,simpleTitleCaseMapping:0x10814 + }, + { code:0x10815 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10815 + ,simpleLowerCaseMapping:0x10815 + ,simpleTitleCaseMapping:0x10815 + }, + { code:0x10816 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10816 + ,simpleLowerCaseMapping:0x10816 + ,simpleTitleCaseMapping:0x10816 + }, + { code:0x10817 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10817 + ,simpleLowerCaseMapping:0x10817 + ,simpleTitleCaseMapping:0x10817 + }, + { code:0x10818 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10818 + ,simpleLowerCaseMapping:0x10818 + ,simpleTitleCaseMapping:0x10818 + }, + { code:0x10819 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10819 + ,simpleLowerCaseMapping:0x10819 + ,simpleTitleCaseMapping:0x10819 + }, + { code:0x1081A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1081A + ,simpleLowerCaseMapping:0x1081A + ,simpleTitleCaseMapping:0x1081A + }, + { code:0x1081B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1081B + ,simpleLowerCaseMapping:0x1081B + ,simpleTitleCaseMapping:0x1081B + }, + { code:0x1081C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1081C + ,simpleLowerCaseMapping:0x1081C + ,simpleTitleCaseMapping:0x1081C + }, + { code:0x1081D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1081D + ,simpleLowerCaseMapping:0x1081D + ,simpleTitleCaseMapping:0x1081D + }, + { code:0x1081E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1081E + ,simpleLowerCaseMapping:0x1081E + ,simpleTitleCaseMapping:0x1081E + }, + { code:0x1081F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1081F + ,simpleLowerCaseMapping:0x1081F + ,simpleTitleCaseMapping:0x1081F + }, + { code:0x10820 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10820 + ,simpleLowerCaseMapping:0x10820 + ,simpleTitleCaseMapping:0x10820 + }, + { code:0x10821 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10821 + ,simpleLowerCaseMapping:0x10821 + ,simpleTitleCaseMapping:0x10821 + }, + { code:0x10822 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10822 + ,simpleLowerCaseMapping:0x10822 + ,simpleTitleCaseMapping:0x10822 + }, + { code:0x10823 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10823 + ,simpleLowerCaseMapping:0x10823 + ,simpleTitleCaseMapping:0x10823 + }, + { code:0x10824 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10824 + ,simpleLowerCaseMapping:0x10824 + ,simpleTitleCaseMapping:0x10824 + }, + { code:0x10825 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10825 + ,simpleLowerCaseMapping:0x10825 + ,simpleTitleCaseMapping:0x10825 + }, + { code:0x10826 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10826 + ,simpleLowerCaseMapping:0x10826 + ,simpleTitleCaseMapping:0x10826 + }, + { code:0x10827 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10827 + ,simpleLowerCaseMapping:0x10827 + ,simpleTitleCaseMapping:0x10827 + }, + { code:0x10828 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10828 + ,simpleLowerCaseMapping:0x10828 + ,simpleTitleCaseMapping:0x10828 + }, + { code:0x10829 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10829 + ,simpleLowerCaseMapping:0x10829 + ,simpleTitleCaseMapping:0x10829 + }, + { code:0x1082A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1082A + ,simpleLowerCaseMapping:0x1082A + ,simpleTitleCaseMapping:0x1082A + }, + { code:0x1082B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1082B + ,simpleLowerCaseMapping:0x1082B + ,simpleTitleCaseMapping:0x1082B + }, + { code:0x1082C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1082C + ,simpleLowerCaseMapping:0x1082C + ,simpleTitleCaseMapping:0x1082C + }, + { code:0x1082D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1082D + ,simpleLowerCaseMapping:0x1082D + ,simpleTitleCaseMapping:0x1082D + }, + { code:0x1082E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1082E + ,simpleLowerCaseMapping:0x1082E + ,simpleTitleCaseMapping:0x1082E + }, + { code:0x1082F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1082F + ,simpleLowerCaseMapping:0x1082F + ,simpleTitleCaseMapping:0x1082F + }, + { code:0x10830 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10830 + ,simpleLowerCaseMapping:0x10830 + ,simpleTitleCaseMapping:0x10830 + }, + { code:0x10831 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10831 + ,simpleLowerCaseMapping:0x10831 + ,simpleTitleCaseMapping:0x10831 + }, + { code:0x10832 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10832 + ,simpleLowerCaseMapping:0x10832 + ,simpleTitleCaseMapping:0x10832 + }, + { code:0x10833 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10833 + ,simpleLowerCaseMapping:0x10833 + ,simpleTitleCaseMapping:0x10833 + }, + { code:0x10834 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10834 + ,simpleLowerCaseMapping:0x10834 + ,simpleTitleCaseMapping:0x10834 + }, + { code:0x10835 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10835 + ,simpleLowerCaseMapping:0x10835 + ,simpleTitleCaseMapping:0x10835 + }, + { code:0x10837 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10837 + ,simpleLowerCaseMapping:0x10837 + ,simpleTitleCaseMapping:0x10837 + }, + { code:0x10838 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10838 + ,simpleLowerCaseMapping:0x10838 + ,simpleTitleCaseMapping:0x10838 + }, + { code:0x1083C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1083C + ,simpleLowerCaseMapping:0x1083C + ,simpleTitleCaseMapping:0x1083C + }, + { code:0x1083F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1083F + ,simpleLowerCaseMapping:0x1083F + ,simpleTitleCaseMapping:0x1083F + }, + { code:0x10900 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10900 + ,simpleLowerCaseMapping:0x10900 + ,simpleTitleCaseMapping:0x10900 + }, + { code:0x10901 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10901 + ,simpleLowerCaseMapping:0x10901 + ,simpleTitleCaseMapping:0x10901 + }, + { code:0x10902 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10902 + ,simpleLowerCaseMapping:0x10902 + ,simpleTitleCaseMapping:0x10902 + }, + { code:0x10903 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10903 + ,simpleLowerCaseMapping:0x10903 + ,simpleTitleCaseMapping:0x10903 + }, + { code:0x10904 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10904 + ,simpleLowerCaseMapping:0x10904 + ,simpleTitleCaseMapping:0x10904 + }, + { code:0x10905 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10905 + ,simpleLowerCaseMapping:0x10905 + ,simpleTitleCaseMapping:0x10905 + }, + { code:0x10906 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10906 + ,simpleLowerCaseMapping:0x10906 + ,simpleTitleCaseMapping:0x10906 + }, + { code:0x10907 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10907 + ,simpleLowerCaseMapping:0x10907 + ,simpleTitleCaseMapping:0x10907 + }, + { code:0x10908 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10908 + ,simpleLowerCaseMapping:0x10908 + ,simpleTitleCaseMapping:0x10908 + }, + { code:0x10909 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10909 + ,simpleLowerCaseMapping:0x10909 + ,simpleTitleCaseMapping:0x10909 + }, + { code:0x1090A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1090A + ,simpleLowerCaseMapping:0x1090A + ,simpleTitleCaseMapping:0x1090A + }, + { code:0x1090B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1090B + ,simpleLowerCaseMapping:0x1090B + ,simpleTitleCaseMapping:0x1090B + }, + { code:0x1090C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1090C + ,simpleLowerCaseMapping:0x1090C + ,simpleTitleCaseMapping:0x1090C + }, + { code:0x1090D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1090D + ,simpleLowerCaseMapping:0x1090D + ,simpleTitleCaseMapping:0x1090D + }, + { code:0x1090E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1090E + ,simpleLowerCaseMapping:0x1090E + ,simpleTitleCaseMapping:0x1090E + }, + { code:0x1090F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1090F + ,simpleLowerCaseMapping:0x1090F + ,simpleTitleCaseMapping:0x1090F + }, + { code:0x10910 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10910 + ,simpleLowerCaseMapping:0x10910 + ,simpleTitleCaseMapping:0x10910 + }, + { code:0x10911 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10911 + ,simpleLowerCaseMapping:0x10911 + ,simpleTitleCaseMapping:0x10911 + }, + { code:0x10912 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10912 + ,simpleLowerCaseMapping:0x10912 + ,simpleTitleCaseMapping:0x10912 + }, + { code:0x10913 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10913 + ,simpleLowerCaseMapping:0x10913 + ,simpleTitleCaseMapping:0x10913 + }, + { code:0x10914 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10914 + ,simpleLowerCaseMapping:0x10914 + ,simpleTitleCaseMapping:0x10914 + }, + { code:0x10915 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10915 + ,simpleLowerCaseMapping:0x10915 + ,simpleTitleCaseMapping:0x10915 + }, + { code:0x10916 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10916 + ,simpleLowerCaseMapping:0x10916 + ,simpleTitleCaseMapping:0x10916 + }, + { code:0x10917 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10917 + ,simpleLowerCaseMapping:0x10917 + ,simpleTitleCaseMapping:0x10917 + }, + { code:0x10918 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10918 + ,simpleLowerCaseMapping:0x10918 + ,simpleTitleCaseMapping:0x10918 + }, + { code:0x10919 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10919 + ,simpleLowerCaseMapping:0x10919 + ,simpleTitleCaseMapping:0x10919 + }, + { code:0x1091F + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x1091F + ,simpleLowerCaseMapping:0x1091F + ,simpleTitleCaseMapping:0x1091F + }, + { code:0x10A00 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A00 + ,simpleLowerCaseMapping:0x10A00 + ,simpleTitleCaseMapping:0x10A00 + }, + { code:0x10A01 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x10A01 + ,simpleLowerCaseMapping:0x10A01 + ,simpleTitleCaseMapping:0x10A01 + }, + { code:0x10A02 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x10A02 + ,simpleLowerCaseMapping:0x10A02 + ,simpleTitleCaseMapping:0x10A02 + }, + { code:0x10A03 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x10A03 + ,simpleLowerCaseMapping:0x10A03 + ,simpleTitleCaseMapping:0x10A03 + }, + { code:0x10A05 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x10A05 + ,simpleLowerCaseMapping:0x10A05 + ,simpleTitleCaseMapping:0x10A05 + }, + { code:0x10A06 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x10A06 + ,simpleLowerCaseMapping:0x10A06 + ,simpleTitleCaseMapping:0x10A06 + }, + { code:0x10A0C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x10A0C + ,simpleLowerCaseMapping:0x10A0C + ,simpleTitleCaseMapping:0x10A0C + }, + { code:0x10A0D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x10A0D + ,simpleLowerCaseMapping:0x10A0D + ,simpleTitleCaseMapping:0x10A0D + }, + { code:0x10A0E + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x10A0E + ,simpleLowerCaseMapping:0x10A0E + ,simpleTitleCaseMapping:0x10A0E + }, + { code:0x10A0F + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x10A0F + ,simpleLowerCaseMapping:0x10A0F + ,simpleTitleCaseMapping:0x10A0F + }, + { code:0x10A10 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A10 + ,simpleLowerCaseMapping:0x10A10 + ,simpleTitleCaseMapping:0x10A10 + }, + { code:0x10A11 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A11 + ,simpleLowerCaseMapping:0x10A11 + ,simpleTitleCaseMapping:0x10A11 + }, + { code:0x10A12 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A12 + ,simpleLowerCaseMapping:0x10A12 + ,simpleTitleCaseMapping:0x10A12 + }, + { code:0x10A13 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A13 + ,simpleLowerCaseMapping:0x10A13 + ,simpleTitleCaseMapping:0x10A13 + }, + { code:0x10A15 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A15 + ,simpleLowerCaseMapping:0x10A15 + ,simpleTitleCaseMapping:0x10A15 + }, + { code:0x10A16 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A16 + ,simpleLowerCaseMapping:0x10A16 + ,simpleTitleCaseMapping:0x10A16 + }, + { code:0x10A17 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A17 + ,simpleLowerCaseMapping:0x10A17 + ,simpleTitleCaseMapping:0x10A17 + }, + { code:0x10A19 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A19 + ,simpleLowerCaseMapping:0x10A19 + ,simpleTitleCaseMapping:0x10A19 + }, + { code:0x10A1A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A1A + ,simpleLowerCaseMapping:0x10A1A + ,simpleTitleCaseMapping:0x10A1A + }, + { code:0x10A1B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A1B + ,simpleLowerCaseMapping:0x10A1B + ,simpleTitleCaseMapping:0x10A1B + }, + { code:0x10A1C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A1C + ,simpleLowerCaseMapping:0x10A1C + ,simpleTitleCaseMapping:0x10A1C + }, + { code:0x10A1D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A1D + ,simpleLowerCaseMapping:0x10A1D + ,simpleTitleCaseMapping:0x10A1D + }, + { code:0x10A1E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A1E + ,simpleLowerCaseMapping:0x10A1E + ,simpleTitleCaseMapping:0x10A1E + }, + { code:0x10A1F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A1F + ,simpleLowerCaseMapping:0x10A1F + ,simpleTitleCaseMapping:0x10A1F + }, + { code:0x10A20 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A20 + ,simpleLowerCaseMapping:0x10A20 + ,simpleTitleCaseMapping:0x10A20 + }, + { code:0x10A21 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A21 + ,simpleLowerCaseMapping:0x10A21 + ,simpleTitleCaseMapping:0x10A21 + }, + { code:0x10A22 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A22 + ,simpleLowerCaseMapping:0x10A22 + ,simpleTitleCaseMapping:0x10A22 + }, + { code:0x10A23 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A23 + ,simpleLowerCaseMapping:0x10A23 + ,simpleTitleCaseMapping:0x10A23 + }, + { code:0x10A24 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A24 + ,simpleLowerCaseMapping:0x10A24 + ,simpleTitleCaseMapping:0x10A24 + }, + { code:0x10A25 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A25 + ,simpleLowerCaseMapping:0x10A25 + ,simpleTitleCaseMapping:0x10A25 + }, + { code:0x10A26 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A26 + ,simpleLowerCaseMapping:0x10A26 + ,simpleTitleCaseMapping:0x10A26 + }, + { code:0x10A27 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A27 + ,simpleLowerCaseMapping:0x10A27 + ,simpleTitleCaseMapping:0x10A27 + }, + { code:0x10A28 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A28 + ,simpleLowerCaseMapping:0x10A28 + ,simpleTitleCaseMapping:0x10A28 + }, + { code:0x10A29 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A29 + ,simpleLowerCaseMapping:0x10A29 + ,simpleTitleCaseMapping:0x10A29 + }, + { code:0x10A2A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A2A + ,simpleLowerCaseMapping:0x10A2A + ,simpleTitleCaseMapping:0x10A2A + }, + { code:0x10A2B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A2B + ,simpleLowerCaseMapping:0x10A2B + ,simpleTitleCaseMapping:0x10A2B + }, + { code:0x10A2C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A2C + ,simpleLowerCaseMapping:0x10A2C + ,simpleTitleCaseMapping:0x10A2C + }, + { code:0x10A2D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A2D + ,simpleLowerCaseMapping:0x10A2D + ,simpleTitleCaseMapping:0x10A2D + }, + { code:0x10A2E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A2E + ,simpleLowerCaseMapping:0x10A2E + ,simpleTitleCaseMapping:0x10A2E + }, + { code:0x10A2F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A2F + ,simpleLowerCaseMapping:0x10A2F + ,simpleTitleCaseMapping:0x10A2F + }, + { code:0x10A30 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A30 + ,simpleLowerCaseMapping:0x10A30 + ,simpleTitleCaseMapping:0x10A30 + }, + { code:0x10A31 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A31 + ,simpleLowerCaseMapping:0x10A31 + ,simpleTitleCaseMapping:0x10A31 + }, + { code:0x10A32 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A32 + ,simpleLowerCaseMapping:0x10A32 + ,simpleTitleCaseMapping:0x10A32 + }, + { code:0x10A33 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x10A33 + ,simpleLowerCaseMapping:0x10A33 + ,simpleTitleCaseMapping:0x10A33 + }, + { code:0x10A38 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x10A38 + ,simpleLowerCaseMapping:0x10A38 + ,simpleTitleCaseMapping:0x10A38 + }, + { code:0x10A39 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x10A39 + ,simpleLowerCaseMapping:0x10A39 + ,simpleTitleCaseMapping:0x10A39 + }, + { code:0x10A3A + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x10A3A + ,simpleLowerCaseMapping:0x10A3A + ,simpleTitleCaseMapping:0x10A3A + }, + { code:0x10A3F + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x10A3F + ,simpleLowerCaseMapping:0x10A3F + ,simpleTitleCaseMapping:0x10A3F + }, + { code:0x10A40 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10A40 + ,simpleLowerCaseMapping:0x10A40 + ,simpleTitleCaseMapping:0x10A40 + }, + { code:0x10A41 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10A41 + ,simpleLowerCaseMapping:0x10A41 + ,simpleTitleCaseMapping:0x10A41 + }, + { code:0x10A42 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10A42 + ,simpleLowerCaseMapping:0x10A42 + ,simpleTitleCaseMapping:0x10A42 + }, + { code:0x10A43 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10A43 + ,simpleLowerCaseMapping:0x10A43 + ,simpleTitleCaseMapping:0x10A43 + }, + { code:0x10A44 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10A44 + ,simpleLowerCaseMapping:0x10A44 + ,simpleTitleCaseMapping:0x10A44 + }, + { code:0x10A45 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10A45 + ,simpleLowerCaseMapping:0x10A45 + ,simpleTitleCaseMapping:0x10A45 + }, + { code:0x10A46 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10A46 + ,simpleLowerCaseMapping:0x10A46 + ,simpleTitleCaseMapping:0x10A46 + }, + { code:0x10A47 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x10A47 + ,simpleLowerCaseMapping:0x10A47 + ,simpleTitleCaseMapping:0x10A47 + }, + { code:0x10A50 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x10A50 + ,simpleLowerCaseMapping:0x10A50 + ,simpleTitleCaseMapping:0x10A50 + }, + { code:0x10A51 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x10A51 + ,simpleLowerCaseMapping:0x10A51 + ,simpleTitleCaseMapping:0x10A51 + }, + { code:0x10A52 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x10A52 + ,simpleLowerCaseMapping:0x10A52 + ,simpleTitleCaseMapping:0x10A52 + }, + { code:0x10A53 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x10A53 + ,simpleLowerCaseMapping:0x10A53 + ,simpleTitleCaseMapping:0x10A53 + }, + { code:0x10A54 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x10A54 + ,simpleLowerCaseMapping:0x10A54 + ,simpleTitleCaseMapping:0x10A54 + }, + { code:0x10A55 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x10A55 + ,simpleLowerCaseMapping:0x10A55 + ,simpleTitleCaseMapping:0x10A55 + }, + { code:0x10A56 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x10A56 + ,simpleLowerCaseMapping:0x10A56 + ,simpleTitleCaseMapping:0x10A56 + }, + { code:0x10A57 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x10A57 + ,simpleLowerCaseMapping:0x10A57 + ,simpleTitleCaseMapping:0x10A57 + }, + { code:0x10A58 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x10A58 + ,simpleLowerCaseMapping:0x10A58 + ,simpleTitleCaseMapping:0x10A58 + }, + { code:0x12000 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12000 + ,simpleLowerCaseMapping:0x12000 + ,simpleTitleCaseMapping:0x12000 + }, + { code:0x12001 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12001 + ,simpleLowerCaseMapping:0x12001 + ,simpleTitleCaseMapping:0x12001 + }, + { code:0x12002 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12002 + ,simpleLowerCaseMapping:0x12002 + ,simpleTitleCaseMapping:0x12002 + }, + { code:0x12003 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12003 + ,simpleLowerCaseMapping:0x12003 + ,simpleTitleCaseMapping:0x12003 + }, + { code:0x12004 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12004 + ,simpleLowerCaseMapping:0x12004 + ,simpleTitleCaseMapping:0x12004 + }, + { code:0x12005 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12005 + ,simpleLowerCaseMapping:0x12005 + ,simpleTitleCaseMapping:0x12005 + }, + { code:0x12006 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12006 + ,simpleLowerCaseMapping:0x12006 + ,simpleTitleCaseMapping:0x12006 + }, + { code:0x12007 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12007 + ,simpleLowerCaseMapping:0x12007 + ,simpleTitleCaseMapping:0x12007 + }, + { code:0x12008 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12008 + ,simpleLowerCaseMapping:0x12008 + ,simpleTitleCaseMapping:0x12008 + }, + { code:0x12009 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12009 + ,simpleLowerCaseMapping:0x12009 + ,simpleTitleCaseMapping:0x12009 + }, + { code:0x1200A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1200A + ,simpleLowerCaseMapping:0x1200A + ,simpleTitleCaseMapping:0x1200A + }, + { code:0x1200B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1200B + ,simpleLowerCaseMapping:0x1200B + ,simpleTitleCaseMapping:0x1200B + }, + { code:0x1200C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1200C + ,simpleLowerCaseMapping:0x1200C + ,simpleTitleCaseMapping:0x1200C + }, + { code:0x1200D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1200D + ,simpleLowerCaseMapping:0x1200D + ,simpleTitleCaseMapping:0x1200D + }, + { code:0x1200E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1200E + ,simpleLowerCaseMapping:0x1200E + ,simpleTitleCaseMapping:0x1200E + }, + { code:0x1200F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1200F + ,simpleLowerCaseMapping:0x1200F + ,simpleTitleCaseMapping:0x1200F + }, + { code:0x12010 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12010 + ,simpleLowerCaseMapping:0x12010 + ,simpleTitleCaseMapping:0x12010 + }, + { code:0x12011 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12011 + ,simpleLowerCaseMapping:0x12011 + ,simpleTitleCaseMapping:0x12011 + }, + { code:0x12012 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12012 + ,simpleLowerCaseMapping:0x12012 + ,simpleTitleCaseMapping:0x12012 + }, + { code:0x12013 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12013 + ,simpleLowerCaseMapping:0x12013 + ,simpleTitleCaseMapping:0x12013 + }, + { code:0x12014 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12014 + ,simpleLowerCaseMapping:0x12014 + ,simpleTitleCaseMapping:0x12014 + }, + { code:0x12015 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12015 + ,simpleLowerCaseMapping:0x12015 + ,simpleTitleCaseMapping:0x12015 + }, + { code:0x12016 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12016 + ,simpleLowerCaseMapping:0x12016 + ,simpleTitleCaseMapping:0x12016 + }, + { code:0x12017 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12017 + ,simpleLowerCaseMapping:0x12017 + ,simpleTitleCaseMapping:0x12017 + }, + { code:0x12018 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12018 + ,simpleLowerCaseMapping:0x12018 + ,simpleTitleCaseMapping:0x12018 + }, + { code:0x12019 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12019 + ,simpleLowerCaseMapping:0x12019 + ,simpleTitleCaseMapping:0x12019 + }, + { code:0x1201A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1201A + ,simpleLowerCaseMapping:0x1201A + ,simpleTitleCaseMapping:0x1201A + }, + { code:0x1201B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1201B + ,simpleLowerCaseMapping:0x1201B + ,simpleTitleCaseMapping:0x1201B + }, + { code:0x1201C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1201C + ,simpleLowerCaseMapping:0x1201C + ,simpleTitleCaseMapping:0x1201C + }, + { code:0x1201D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1201D + ,simpleLowerCaseMapping:0x1201D + ,simpleTitleCaseMapping:0x1201D + }, + { code:0x1201E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1201E + ,simpleLowerCaseMapping:0x1201E + ,simpleTitleCaseMapping:0x1201E + }, + { code:0x1201F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1201F + ,simpleLowerCaseMapping:0x1201F + ,simpleTitleCaseMapping:0x1201F + }, + { code:0x12020 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12020 + ,simpleLowerCaseMapping:0x12020 + ,simpleTitleCaseMapping:0x12020 + }, + { code:0x12021 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12021 + ,simpleLowerCaseMapping:0x12021 + ,simpleTitleCaseMapping:0x12021 + }, + { code:0x12022 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12022 + ,simpleLowerCaseMapping:0x12022 + ,simpleTitleCaseMapping:0x12022 + }, + { code:0x12023 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12023 + ,simpleLowerCaseMapping:0x12023 + ,simpleTitleCaseMapping:0x12023 + }, + { code:0x12024 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12024 + ,simpleLowerCaseMapping:0x12024 + ,simpleTitleCaseMapping:0x12024 + }, + { code:0x12025 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12025 + ,simpleLowerCaseMapping:0x12025 + ,simpleTitleCaseMapping:0x12025 + }, + { code:0x12026 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12026 + ,simpleLowerCaseMapping:0x12026 + ,simpleTitleCaseMapping:0x12026 + }, + { code:0x12027 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12027 + ,simpleLowerCaseMapping:0x12027 + ,simpleTitleCaseMapping:0x12027 + }, + { code:0x12028 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12028 + ,simpleLowerCaseMapping:0x12028 + ,simpleTitleCaseMapping:0x12028 + }, + { code:0x12029 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12029 + ,simpleLowerCaseMapping:0x12029 + ,simpleTitleCaseMapping:0x12029 + }, + { code:0x1202A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1202A + ,simpleLowerCaseMapping:0x1202A + ,simpleTitleCaseMapping:0x1202A + }, + { code:0x1202B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1202B + ,simpleLowerCaseMapping:0x1202B + ,simpleTitleCaseMapping:0x1202B + }, + { code:0x1202C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1202C + ,simpleLowerCaseMapping:0x1202C + ,simpleTitleCaseMapping:0x1202C + }, + { code:0x1202D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1202D + ,simpleLowerCaseMapping:0x1202D + ,simpleTitleCaseMapping:0x1202D + }, + { code:0x1202E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1202E + ,simpleLowerCaseMapping:0x1202E + ,simpleTitleCaseMapping:0x1202E + }, + { code:0x1202F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1202F + ,simpleLowerCaseMapping:0x1202F + ,simpleTitleCaseMapping:0x1202F + }, + { code:0x12030 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12030 + ,simpleLowerCaseMapping:0x12030 + ,simpleTitleCaseMapping:0x12030 + }, + { code:0x12031 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12031 + ,simpleLowerCaseMapping:0x12031 + ,simpleTitleCaseMapping:0x12031 + }, + { code:0x12032 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12032 + ,simpleLowerCaseMapping:0x12032 + ,simpleTitleCaseMapping:0x12032 + }, + { code:0x12033 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12033 + ,simpleLowerCaseMapping:0x12033 + ,simpleTitleCaseMapping:0x12033 + }, + { code:0x12034 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12034 + ,simpleLowerCaseMapping:0x12034 + ,simpleTitleCaseMapping:0x12034 + }, + { code:0x12035 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12035 + ,simpleLowerCaseMapping:0x12035 + ,simpleTitleCaseMapping:0x12035 + }, + { code:0x12036 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12036 + ,simpleLowerCaseMapping:0x12036 + ,simpleTitleCaseMapping:0x12036 + }, + { code:0x12037 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12037 + ,simpleLowerCaseMapping:0x12037 + ,simpleTitleCaseMapping:0x12037 + }, + { code:0x12038 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12038 + ,simpleLowerCaseMapping:0x12038 + ,simpleTitleCaseMapping:0x12038 + }, + { code:0x12039 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12039 + ,simpleLowerCaseMapping:0x12039 + ,simpleTitleCaseMapping:0x12039 + }, + { code:0x1203A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1203A + ,simpleLowerCaseMapping:0x1203A + ,simpleTitleCaseMapping:0x1203A + }, + { code:0x1203B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1203B + ,simpleLowerCaseMapping:0x1203B + ,simpleTitleCaseMapping:0x1203B + }, + { code:0x1203C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1203C + ,simpleLowerCaseMapping:0x1203C + ,simpleTitleCaseMapping:0x1203C + }, + { code:0x1203D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1203D + ,simpleLowerCaseMapping:0x1203D + ,simpleTitleCaseMapping:0x1203D + }, + { code:0x1203E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1203E + ,simpleLowerCaseMapping:0x1203E + ,simpleTitleCaseMapping:0x1203E + }, + { code:0x1203F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1203F + ,simpleLowerCaseMapping:0x1203F + ,simpleTitleCaseMapping:0x1203F + }, + { code:0x12040 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12040 + ,simpleLowerCaseMapping:0x12040 + ,simpleTitleCaseMapping:0x12040 + }, + { code:0x12041 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12041 + ,simpleLowerCaseMapping:0x12041 + ,simpleTitleCaseMapping:0x12041 + }, + { code:0x12042 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12042 + ,simpleLowerCaseMapping:0x12042 + ,simpleTitleCaseMapping:0x12042 + }, + { code:0x12043 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12043 + ,simpleLowerCaseMapping:0x12043 + ,simpleTitleCaseMapping:0x12043 + }, + { code:0x12044 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12044 + ,simpleLowerCaseMapping:0x12044 + ,simpleTitleCaseMapping:0x12044 + }, + { code:0x12045 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12045 + ,simpleLowerCaseMapping:0x12045 + ,simpleTitleCaseMapping:0x12045 + }, + { code:0x12046 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12046 + ,simpleLowerCaseMapping:0x12046 + ,simpleTitleCaseMapping:0x12046 + }, + { code:0x12047 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12047 + ,simpleLowerCaseMapping:0x12047 + ,simpleTitleCaseMapping:0x12047 + }, + { code:0x12048 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12048 + ,simpleLowerCaseMapping:0x12048 + ,simpleTitleCaseMapping:0x12048 + }, + { code:0x12049 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12049 + ,simpleLowerCaseMapping:0x12049 + ,simpleTitleCaseMapping:0x12049 + }, + { code:0x1204A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1204A + ,simpleLowerCaseMapping:0x1204A + ,simpleTitleCaseMapping:0x1204A + }, + { code:0x1204B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1204B + ,simpleLowerCaseMapping:0x1204B + ,simpleTitleCaseMapping:0x1204B + }, + { code:0x1204C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1204C + ,simpleLowerCaseMapping:0x1204C + ,simpleTitleCaseMapping:0x1204C + }, + { code:0x1204D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1204D + ,simpleLowerCaseMapping:0x1204D + ,simpleTitleCaseMapping:0x1204D + }, + { code:0x1204E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1204E + ,simpleLowerCaseMapping:0x1204E + ,simpleTitleCaseMapping:0x1204E + }, + { code:0x1204F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1204F + ,simpleLowerCaseMapping:0x1204F + ,simpleTitleCaseMapping:0x1204F + }, + { code:0x12050 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12050 + ,simpleLowerCaseMapping:0x12050 + ,simpleTitleCaseMapping:0x12050 + }, + { code:0x12051 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12051 + ,simpleLowerCaseMapping:0x12051 + ,simpleTitleCaseMapping:0x12051 + }, + { code:0x12052 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12052 + ,simpleLowerCaseMapping:0x12052 + ,simpleTitleCaseMapping:0x12052 + }, + { code:0x12053 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12053 + ,simpleLowerCaseMapping:0x12053 + ,simpleTitleCaseMapping:0x12053 + }, + { code:0x12054 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12054 + ,simpleLowerCaseMapping:0x12054 + ,simpleTitleCaseMapping:0x12054 + }, + { code:0x12055 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12055 + ,simpleLowerCaseMapping:0x12055 + ,simpleTitleCaseMapping:0x12055 + }, + { code:0x12056 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12056 + ,simpleLowerCaseMapping:0x12056 + ,simpleTitleCaseMapping:0x12056 + }, + { code:0x12057 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12057 + ,simpleLowerCaseMapping:0x12057 + ,simpleTitleCaseMapping:0x12057 + }, + { code:0x12058 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12058 + ,simpleLowerCaseMapping:0x12058 + ,simpleTitleCaseMapping:0x12058 + }, + { code:0x12059 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12059 + ,simpleLowerCaseMapping:0x12059 + ,simpleTitleCaseMapping:0x12059 + }, + { code:0x1205A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1205A + ,simpleLowerCaseMapping:0x1205A + ,simpleTitleCaseMapping:0x1205A + }, + { code:0x1205B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1205B + ,simpleLowerCaseMapping:0x1205B + ,simpleTitleCaseMapping:0x1205B + }, + { code:0x1205C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1205C + ,simpleLowerCaseMapping:0x1205C + ,simpleTitleCaseMapping:0x1205C + }, + { code:0x1205D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1205D + ,simpleLowerCaseMapping:0x1205D + ,simpleTitleCaseMapping:0x1205D + }, + { code:0x1205E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1205E + ,simpleLowerCaseMapping:0x1205E + ,simpleTitleCaseMapping:0x1205E + }, + { code:0x1205F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1205F + ,simpleLowerCaseMapping:0x1205F + ,simpleTitleCaseMapping:0x1205F + }, + { code:0x12060 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12060 + ,simpleLowerCaseMapping:0x12060 + ,simpleTitleCaseMapping:0x12060 + }, + { code:0x12061 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12061 + ,simpleLowerCaseMapping:0x12061 + ,simpleTitleCaseMapping:0x12061 + }, + { code:0x12062 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12062 + ,simpleLowerCaseMapping:0x12062 + ,simpleTitleCaseMapping:0x12062 + }, + { code:0x12063 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12063 + ,simpleLowerCaseMapping:0x12063 + ,simpleTitleCaseMapping:0x12063 + }, + { code:0x12064 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12064 + ,simpleLowerCaseMapping:0x12064 + ,simpleTitleCaseMapping:0x12064 + }, + { code:0x12065 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12065 + ,simpleLowerCaseMapping:0x12065 + ,simpleTitleCaseMapping:0x12065 + }, + { code:0x12066 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12066 + ,simpleLowerCaseMapping:0x12066 + ,simpleTitleCaseMapping:0x12066 + }, + { code:0x12067 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12067 + ,simpleLowerCaseMapping:0x12067 + ,simpleTitleCaseMapping:0x12067 + }, + { code:0x12068 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12068 + ,simpleLowerCaseMapping:0x12068 + ,simpleTitleCaseMapping:0x12068 + }, + { code:0x12069 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12069 + ,simpleLowerCaseMapping:0x12069 + ,simpleTitleCaseMapping:0x12069 + }, + { code:0x1206A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1206A + ,simpleLowerCaseMapping:0x1206A + ,simpleTitleCaseMapping:0x1206A + }, + { code:0x1206B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1206B + ,simpleLowerCaseMapping:0x1206B + ,simpleTitleCaseMapping:0x1206B + }, + { code:0x1206C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1206C + ,simpleLowerCaseMapping:0x1206C + ,simpleTitleCaseMapping:0x1206C + }, + { code:0x1206D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1206D + ,simpleLowerCaseMapping:0x1206D + ,simpleTitleCaseMapping:0x1206D + }, + { code:0x1206E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1206E + ,simpleLowerCaseMapping:0x1206E + ,simpleTitleCaseMapping:0x1206E + }, + { code:0x1206F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1206F + ,simpleLowerCaseMapping:0x1206F + ,simpleTitleCaseMapping:0x1206F + }, + { code:0x12070 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12070 + ,simpleLowerCaseMapping:0x12070 + ,simpleTitleCaseMapping:0x12070 + }, + { code:0x12071 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12071 + ,simpleLowerCaseMapping:0x12071 + ,simpleTitleCaseMapping:0x12071 + }, + { code:0x12072 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12072 + ,simpleLowerCaseMapping:0x12072 + ,simpleTitleCaseMapping:0x12072 + }, + { code:0x12073 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12073 + ,simpleLowerCaseMapping:0x12073 + ,simpleTitleCaseMapping:0x12073 + }, + { code:0x12074 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12074 + ,simpleLowerCaseMapping:0x12074 + ,simpleTitleCaseMapping:0x12074 + }, + { code:0x12075 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12075 + ,simpleLowerCaseMapping:0x12075 + ,simpleTitleCaseMapping:0x12075 + }, + { code:0x12076 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12076 + ,simpleLowerCaseMapping:0x12076 + ,simpleTitleCaseMapping:0x12076 + }, + { code:0x12077 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12077 + ,simpleLowerCaseMapping:0x12077 + ,simpleTitleCaseMapping:0x12077 + }, + { code:0x12078 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12078 + ,simpleLowerCaseMapping:0x12078 + ,simpleTitleCaseMapping:0x12078 + }, + { code:0x12079 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12079 + ,simpleLowerCaseMapping:0x12079 + ,simpleTitleCaseMapping:0x12079 + }, + { code:0x1207A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1207A + ,simpleLowerCaseMapping:0x1207A + ,simpleTitleCaseMapping:0x1207A + }, + { code:0x1207B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1207B + ,simpleLowerCaseMapping:0x1207B + ,simpleTitleCaseMapping:0x1207B + }, + { code:0x1207C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1207C + ,simpleLowerCaseMapping:0x1207C + ,simpleTitleCaseMapping:0x1207C + }, + { code:0x1207D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1207D + ,simpleLowerCaseMapping:0x1207D + ,simpleTitleCaseMapping:0x1207D + }, + { code:0x1207E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1207E + ,simpleLowerCaseMapping:0x1207E + ,simpleTitleCaseMapping:0x1207E + }, + { code:0x1207F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1207F + ,simpleLowerCaseMapping:0x1207F + ,simpleTitleCaseMapping:0x1207F + }, + { code:0x12080 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12080 + ,simpleLowerCaseMapping:0x12080 + ,simpleTitleCaseMapping:0x12080 + }, + { code:0x12081 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12081 + ,simpleLowerCaseMapping:0x12081 + ,simpleTitleCaseMapping:0x12081 + }, + { code:0x12082 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12082 + ,simpleLowerCaseMapping:0x12082 + ,simpleTitleCaseMapping:0x12082 + }, + { code:0x12083 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12083 + ,simpleLowerCaseMapping:0x12083 + ,simpleTitleCaseMapping:0x12083 + }, + { code:0x12084 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12084 + ,simpleLowerCaseMapping:0x12084 + ,simpleTitleCaseMapping:0x12084 + }, + { code:0x12085 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12085 + ,simpleLowerCaseMapping:0x12085 + ,simpleTitleCaseMapping:0x12085 + }, + { code:0x12086 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12086 + ,simpleLowerCaseMapping:0x12086 + ,simpleTitleCaseMapping:0x12086 + }, + { code:0x12087 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12087 + ,simpleLowerCaseMapping:0x12087 + ,simpleTitleCaseMapping:0x12087 + }, + { code:0x12088 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12088 + ,simpleLowerCaseMapping:0x12088 + ,simpleTitleCaseMapping:0x12088 + }, + { code:0x12089 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12089 + ,simpleLowerCaseMapping:0x12089 + ,simpleTitleCaseMapping:0x12089 + }, + { code:0x1208A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1208A + ,simpleLowerCaseMapping:0x1208A + ,simpleTitleCaseMapping:0x1208A + }, + { code:0x1208B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1208B + ,simpleLowerCaseMapping:0x1208B + ,simpleTitleCaseMapping:0x1208B + }, + { code:0x1208C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1208C + ,simpleLowerCaseMapping:0x1208C + ,simpleTitleCaseMapping:0x1208C + }, + { code:0x1208D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1208D + ,simpleLowerCaseMapping:0x1208D + ,simpleTitleCaseMapping:0x1208D + }, + { code:0x1208E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1208E + ,simpleLowerCaseMapping:0x1208E + ,simpleTitleCaseMapping:0x1208E + }, + { code:0x1208F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1208F + ,simpleLowerCaseMapping:0x1208F + ,simpleTitleCaseMapping:0x1208F + }, + { code:0x12090 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12090 + ,simpleLowerCaseMapping:0x12090 + ,simpleTitleCaseMapping:0x12090 + }, + { code:0x12091 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12091 + ,simpleLowerCaseMapping:0x12091 + ,simpleTitleCaseMapping:0x12091 + }, + { code:0x12092 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12092 + ,simpleLowerCaseMapping:0x12092 + ,simpleTitleCaseMapping:0x12092 + }, + { code:0x12093 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12093 + ,simpleLowerCaseMapping:0x12093 + ,simpleTitleCaseMapping:0x12093 + }, + { code:0x12094 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12094 + ,simpleLowerCaseMapping:0x12094 + ,simpleTitleCaseMapping:0x12094 + }, + { code:0x12095 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12095 + ,simpleLowerCaseMapping:0x12095 + ,simpleTitleCaseMapping:0x12095 + }, + { code:0x12096 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12096 + ,simpleLowerCaseMapping:0x12096 + ,simpleTitleCaseMapping:0x12096 + }, + { code:0x12097 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12097 + ,simpleLowerCaseMapping:0x12097 + ,simpleTitleCaseMapping:0x12097 + }, + { code:0x12098 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12098 + ,simpleLowerCaseMapping:0x12098 + ,simpleTitleCaseMapping:0x12098 + }, + { code:0x12099 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12099 + ,simpleLowerCaseMapping:0x12099 + ,simpleTitleCaseMapping:0x12099 + }, + { code:0x1209A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1209A + ,simpleLowerCaseMapping:0x1209A + ,simpleTitleCaseMapping:0x1209A + }, + { code:0x1209B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1209B + ,simpleLowerCaseMapping:0x1209B + ,simpleTitleCaseMapping:0x1209B + }, + { code:0x1209C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1209C + ,simpleLowerCaseMapping:0x1209C + ,simpleTitleCaseMapping:0x1209C + }, + { code:0x1209D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1209D + ,simpleLowerCaseMapping:0x1209D + ,simpleTitleCaseMapping:0x1209D + }, + { code:0x1209E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1209E + ,simpleLowerCaseMapping:0x1209E + ,simpleTitleCaseMapping:0x1209E + }, + { code:0x1209F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1209F + ,simpleLowerCaseMapping:0x1209F + ,simpleTitleCaseMapping:0x1209F + }, + { code:0x120A0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120A0 + ,simpleLowerCaseMapping:0x120A0 + ,simpleTitleCaseMapping:0x120A0 + }, + { code:0x120A1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120A1 + ,simpleLowerCaseMapping:0x120A1 + ,simpleTitleCaseMapping:0x120A1 + }, + { code:0x120A2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120A2 + ,simpleLowerCaseMapping:0x120A2 + ,simpleTitleCaseMapping:0x120A2 + }, + { code:0x120A3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120A3 + ,simpleLowerCaseMapping:0x120A3 + ,simpleTitleCaseMapping:0x120A3 + }, + { code:0x120A4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120A4 + ,simpleLowerCaseMapping:0x120A4 + ,simpleTitleCaseMapping:0x120A4 + }, + { code:0x120A5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120A5 + ,simpleLowerCaseMapping:0x120A5 + ,simpleTitleCaseMapping:0x120A5 + }, + { code:0x120A6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120A6 + ,simpleLowerCaseMapping:0x120A6 + ,simpleTitleCaseMapping:0x120A6 + }, + { code:0x120A7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120A7 + ,simpleLowerCaseMapping:0x120A7 + ,simpleTitleCaseMapping:0x120A7 + }, + { code:0x120A8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120A8 + ,simpleLowerCaseMapping:0x120A8 + ,simpleTitleCaseMapping:0x120A8 + }, + { code:0x120A9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120A9 + ,simpleLowerCaseMapping:0x120A9 + ,simpleTitleCaseMapping:0x120A9 + }, + { code:0x120AA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120AA + ,simpleLowerCaseMapping:0x120AA + ,simpleTitleCaseMapping:0x120AA + }, + { code:0x120AB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120AB + ,simpleLowerCaseMapping:0x120AB + ,simpleTitleCaseMapping:0x120AB + }, + { code:0x120AC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120AC + ,simpleLowerCaseMapping:0x120AC + ,simpleTitleCaseMapping:0x120AC + }, + { code:0x120AD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120AD + ,simpleLowerCaseMapping:0x120AD + ,simpleTitleCaseMapping:0x120AD + }, + { code:0x120AE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120AE + ,simpleLowerCaseMapping:0x120AE + ,simpleTitleCaseMapping:0x120AE + }, + { code:0x120AF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120AF + ,simpleLowerCaseMapping:0x120AF + ,simpleTitleCaseMapping:0x120AF + }, + { code:0x120B0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120B0 + ,simpleLowerCaseMapping:0x120B0 + ,simpleTitleCaseMapping:0x120B0 + }, + { code:0x120B1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120B1 + ,simpleLowerCaseMapping:0x120B1 + ,simpleTitleCaseMapping:0x120B1 + }, + { code:0x120B2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120B2 + ,simpleLowerCaseMapping:0x120B2 + ,simpleTitleCaseMapping:0x120B2 + }, + { code:0x120B3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120B3 + ,simpleLowerCaseMapping:0x120B3 + ,simpleTitleCaseMapping:0x120B3 + }, + { code:0x120B4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120B4 + ,simpleLowerCaseMapping:0x120B4 + ,simpleTitleCaseMapping:0x120B4 + }, + { code:0x120B5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120B5 + ,simpleLowerCaseMapping:0x120B5 + ,simpleTitleCaseMapping:0x120B5 + }, + { code:0x120B6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120B6 + ,simpleLowerCaseMapping:0x120B6 + ,simpleTitleCaseMapping:0x120B6 + }, + { code:0x120B7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120B7 + ,simpleLowerCaseMapping:0x120B7 + ,simpleTitleCaseMapping:0x120B7 + }, + { code:0x120B8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120B8 + ,simpleLowerCaseMapping:0x120B8 + ,simpleTitleCaseMapping:0x120B8 + }, + { code:0x120B9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120B9 + ,simpleLowerCaseMapping:0x120B9 + ,simpleTitleCaseMapping:0x120B9 + }, + { code:0x120BA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120BA + ,simpleLowerCaseMapping:0x120BA + ,simpleTitleCaseMapping:0x120BA + }, + { code:0x120BB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120BB + ,simpleLowerCaseMapping:0x120BB + ,simpleTitleCaseMapping:0x120BB + }, + { code:0x120BC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120BC + ,simpleLowerCaseMapping:0x120BC + ,simpleTitleCaseMapping:0x120BC + }, + { code:0x120BD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120BD + ,simpleLowerCaseMapping:0x120BD + ,simpleTitleCaseMapping:0x120BD + }, + { code:0x120BE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120BE + ,simpleLowerCaseMapping:0x120BE + ,simpleTitleCaseMapping:0x120BE + }, + { code:0x120BF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120BF + ,simpleLowerCaseMapping:0x120BF + ,simpleTitleCaseMapping:0x120BF + }, + { code:0x120C0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120C0 + ,simpleLowerCaseMapping:0x120C0 + ,simpleTitleCaseMapping:0x120C0 + }, + { code:0x120C1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120C1 + ,simpleLowerCaseMapping:0x120C1 + ,simpleTitleCaseMapping:0x120C1 + }, + { code:0x120C2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120C2 + ,simpleLowerCaseMapping:0x120C2 + ,simpleTitleCaseMapping:0x120C2 + }, + { code:0x120C3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120C3 + ,simpleLowerCaseMapping:0x120C3 + ,simpleTitleCaseMapping:0x120C3 + }, + { code:0x120C4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120C4 + ,simpleLowerCaseMapping:0x120C4 + ,simpleTitleCaseMapping:0x120C4 + }, + { code:0x120C5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120C5 + ,simpleLowerCaseMapping:0x120C5 + ,simpleTitleCaseMapping:0x120C5 + }, + { code:0x120C6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120C6 + ,simpleLowerCaseMapping:0x120C6 + ,simpleTitleCaseMapping:0x120C6 + }, + { code:0x120C7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120C7 + ,simpleLowerCaseMapping:0x120C7 + ,simpleTitleCaseMapping:0x120C7 + }, + { code:0x120C8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120C8 + ,simpleLowerCaseMapping:0x120C8 + ,simpleTitleCaseMapping:0x120C8 + }, + { code:0x120C9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120C9 + ,simpleLowerCaseMapping:0x120C9 + ,simpleTitleCaseMapping:0x120C9 + }, + { code:0x120CA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120CA + ,simpleLowerCaseMapping:0x120CA + ,simpleTitleCaseMapping:0x120CA + }, + { code:0x120CB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120CB + ,simpleLowerCaseMapping:0x120CB + ,simpleTitleCaseMapping:0x120CB + }, + { code:0x120CC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120CC + ,simpleLowerCaseMapping:0x120CC + ,simpleTitleCaseMapping:0x120CC + }, + { code:0x120CD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120CD + ,simpleLowerCaseMapping:0x120CD + ,simpleTitleCaseMapping:0x120CD + }, + { code:0x120CE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120CE + ,simpleLowerCaseMapping:0x120CE + ,simpleTitleCaseMapping:0x120CE + }, + { code:0x120CF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120CF + ,simpleLowerCaseMapping:0x120CF + ,simpleTitleCaseMapping:0x120CF + }, + { code:0x120D0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120D0 + ,simpleLowerCaseMapping:0x120D0 + ,simpleTitleCaseMapping:0x120D0 + }, + { code:0x120D1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120D1 + ,simpleLowerCaseMapping:0x120D1 + ,simpleTitleCaseMapping:0x120D1 + }, + { code:0x120D2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120D2 + ,simpleLowerCaseMapping:0x120D2 + ,simpleTitleCaseMapping:0x120D2 + }, + { code:0x120D3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120D3 + ,simpleLowerCaseMapping:0x120D3 + ,simpleTitleCaseMapping:0x120D3 + }, + { code:0x120D4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120D4 + ,simpleLowerCaseMapping:0x120D4 + ,simpleTitleCaseMapping:0x120D4 + }, + { code:0x120D5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120D5 + ,simpleLowerCaseMapping:0x120D5 + ,simpleTitleCaseMapping:0x120D5 + }, + { code:0x120D6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120D6 + ,simpleLowerCaseMapping:0x120D6 + ,simpleTitleCaseMapping:0x120D6 + }, + { code:0x120D7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120D7 + ,simpleLowerCaseMapping:0x120D7 + ,simpleTitleCaseMapping:0x120D7 + }, + { code:0x120D8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120D8 + ,simpleLowerCaseMapping:0x120D8 + ,simpleTitleCaseMapping:0x120D8 + }, + { code:0x120D9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120D9 + ,simpleLowerCaseMapping:0x120D9 + ,simpleTitleCaseMapping:0x120D9 + }, + { code:0x120DA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120DA + ,simpleLowerCaseMapping:0x120DA + ,simpleTitleCaseMapping:0x120DA + }, + { code:0x120DB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120DB + ,simpleLowerCaseMapping:0x120DB + ,simpleTitleCaseMapping:0x120DB + }, + { code:0x120DC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120DC + ,simpleLowerCaseMapping:0x120DC + ,simpleTitleCaseMapping:0x120DC + }, + { code:0x120DD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120DD + ,simpleLowerCaseMapping:0x120DD + ,simpleTitleCaseMapping:0x120DD + }, + { code:0x120DE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120DE + ,simpleLowerCaseMapping:0x120DE + ,simpleTitleCaseMapping:0x120DE + }, + { code:0x120DF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120DF + ,simpleLowerCaseMapping:0x120DF + ,simpleTitleCaseMapping:0x120DF + }, + { code:0x120E0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120E0 + ,simpleLowerCaseMapping:0x120E0 + ,simpleTitleCaseMapping:0x120E0 + }, + { code:0x120E1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120E1 + ,simpleLowerCaseMapping:0x120E1 + ,simpleTitleCaseMapping:0x120E1 + }, + { code:0x120E2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120E2 + ,simpleLowerCaseMapping:0x120E2 + ,simpleTitleCaseMapping:0x120E2 + }, + { code:0x120E3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120E3 + ,simpleLowerCaseMapping:0x120E3 + ,simpleTitleCaseMapping:0x120E3 + }, + { code:0x120E4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120E4 + ,simpleLowerCaseMapping:0x120E4 + ,simpleTitleCaseMapping:0x120E4 + }, + { code:0x120E5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120E5 + ,simpleLowerCaseMapping:0x120E5 + ,simpleTitleCaseMapping:0x120E5 + }, + { code:0x120E6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120E6 + ,simpleLowerCaseMapping:0x120E6 + ,simpleTitleCaseMapping:0x120E6 + }, + { code:0x120E7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120E7 + ,simpleLowerCaseMapping:0x120E7 + ,simpleTitleCaseMapping:0x120E7 + }, + { code:0x120E8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120E8 + ,simpleLowerCaseMapping:0x120E8 + ,simpleTitleCaseMapping:0x120E8 + }, + { code:0x120E9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120E9 + ,simpleLowerCaseMapping:0x120E9 + ,simpleTitleCaseMapping:0x120E9 + }, + { code:0x120EA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120EA + ,simpleLowerCaseMapping:0x120EA + ,simpleTitleCaseMapping:0x120EA + }, + { code:0x120EB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120EB + ,simpleLowerCaseMapping:0x120EB + ,simpleTitleCaseMapping:0x120EB + }, + { code:0x120EC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120EC + ,simpleLowerCaseMapping:0x120EC + ,simpleTitleCaseMapping:0x120EC + }, + { code:0x120ED + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120ED + ,simpleLowerCaseMapping:0x120ED + ,simpleTitleCaseMapping:0x120ED + }, + { code:0x120EE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120EE + ,simpleLowerCaseMapping:0x120EE + ,simpleTitleCaseMapping:0x120EE + }, + { code:0x120EF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120EF + ,simpleLowerCaseMapping:0x120EF + ,simpleTitleCaseMapping:0x120EF + }, + { code:0x120F0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120F0 + ,simpleLowerCaseMapping:0x120F0 + ,simpleTitleCaseMapping:0x120F0 + }, + { code:0x120F1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120F1 + ,simpleLowerCaseMapping:0x120F1 + ,simpleTitleCaseMapping:0x120F1 + }, + { code:0x120F2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120F2 + ,simpleLowerCaseMapping:0x120F2 + ,simpleTitleCaseMapping:0x120F2 + }, + { code:0x120F3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120F3 + ,simpleLowerCaseMapping:0x120F3 + ,simpleTitleCaseMapping:0x120F3 + }, + { code:0x120F4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120F4 + ,simpleLowerCaseMapping:0x120F4 + ,simpleTitleCaseMapping:0x120F4 + }, + { code:0x120F5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120F5 + ,simpleLowerCaseMapping:0x120F5 + ,simpleTitleCaseMapping:0x120F5 + }, + { code:0x120F6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120F6 + ,simpleLowerCaseMapping:0x120F6 + ,simpleTitleCaseMapping:0x120F6 + }, + { code:0x120F7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120F7 + ,simpleLowerCaseMapping:0x120F7 + ,simpleTitleCaseMapping:0x120F7 + }, + { code:0x120F8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120F8 + ,simpleLowerCaseMapping:0x120F8 + ,simpleTitleCaseMapping:0x120F8 + }, + { code:0x120F9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120F9 + ,simpleLowerCaseMapping:0x120F9 + ,simpleTitleCaseMapping:0x120F9 + }, + { code:0x120FA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120FA + ,simpleLowerCaseMapping:0x120FA + ,simpleTitleCaseMapping:0x120FA + }, + { code:0x120FB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120FB + ,simpleLowerCaseMapping:0x120FB + ,simpleTitleCaseMapping:0x120FB + }, + { code:0x120FC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120FC + ,simpleLowerCaseMapping:0x120FC + ,simpleTitleCaseMapping:0x120FC + }, + { code:0x120FD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120FD + ,simpleLowerCaseMapping:0x120FD + ,simpleTitleCaseMapping:0x120FD + }, + { code:0x120FE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120FE + ,simpleLowerCaseMapping:0x120FE + ,simpleTitleCaseMapping:0x120FE + }, + { code:0x120FF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x120FF + ,simpleLowerCaseMapping:0x120FF + ,simpleTitleCaseMapping:0x120FF + }, + { code:0x12100 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12100 + ,simpleLowerCaseMapping:0x12100 + ,simpleTitleCaseMapping:0x12100 + }, + { code:0x12101 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12101 + ,simpleLowerCaseMapping:0x12101 + ,simpleTitleCaseMapping:0x12101 + }, + { code:0x12102 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12102 + ,simpleLowerCaseMapping:0x12102 + ,simpleTitleCaseMapping:0x12102 + }, + { code:0x12103 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12103 + ,simpleLowerCaseMapping:0x12103 + ,simpleTitleCaseMapping:0x12103 + }, + { code:0x12104 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12104 + ,simpleLowerCaseMapping:0x12104 + ,simpleTitleCaseMapping:0x12104 + }, + { code:0x12105 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12105 + ,simpleLowerCaseMapping:0x12105 + ,simpleTitleCaseMapping:0x12105 + }, + { code:0x12106 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12106 + ,simpleLowerCaseMapping:0x12106 + ,simpleTitleCaseMapping:0x12106 + }, + { code:0x12107 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12107 + ,simpleLowerCaseMapping:0x12107 + ,simpleTitleCaseMapping:0x12107 + }, + { code:0x12108 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12108 + ,simpleLowerCaseMapping:0x12108 + ,simpleTitleCaseMapping:0x12108 + }, + { code:0x12109 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12109 + ,simpleLowerCaseMapping:0x12109 + ,simpleTitleCaseMapping:0x12109 + }, + { code:0x1210A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1210A + ,simpleLowerCaseMapping:0x1210A + ,simpleTitleCaseMapping:0x1210A + }, + { code:0x1210B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1210B + ,simpleLowerCaseMapping:0x1210B + ,simpleTitleCaseMapping:0x1210B + }, + { code:0x1210C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1210C + ,simpleLowerCaseMapping:0x1210C + ,simpleTitleCaseMapping:0x1210C + }, + { code:0x1210D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1210D + ,simpleLowerCaseMapping:0x1210D + ,simpleTitleCaseMapping:0x1210D + }, + { code:0x1210E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1210E + ,simpleLowerCaseMapping:0x1210E + ,simpleTitleCaseMapping:0x1210E + }, + { code:0x1210F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1210F + ,simpleLowerCaseMapping:0x1210F + ,simpleTitleCaseMapping:0x1210F + }, + { code:0x12110 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12110 + ,simpleLowerCaseMapping:0x12110 + ,simpleTitleCaseMapping:0x12110 + }, + { code:0x12111 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12111 + ,simpleLowerCaseMapping:0x12111 + ,simpleTitleCaseMapping:0x12111 + }, + { code:0x12112 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12112 + ,simpleLowerCaseMapping:0x12112 + ,simpleTitleCaseMapping:0x12112 + }, + { code:0x12113 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12113 + ,simpleLowerCaseMapping:0x12113 + ,simpleTitleCaseMapping:0x12113 + }, + { code:0x12114 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12114 + ,simpleLowerCaseMapping:0x12114 + ,simpleTitleCaseMapping:0x12114 + }, + { code:0x12115 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12115 + ,simpleLowerCaseMapping:0x12115 + ,simpleTitleCaseMapping:0x12115 + }, + { code:0x12116 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12116 + ,simpleLowerCaseMapping:0x12116 + ,simpleTitleCaseMapping:0x12116 + }, + { code:0x12117 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12117 + ,simpleLowerCaseMapping:0x12117 + ,simpleTitleCaseMapping:0x12117 + }, + { code:0x12118 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12118 + ,simpleLowerCaseMapping:0x12118 + ,simpleTitleCaseMapping:0x12118 + }, + { code:0x12119 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12119 + ,simpleLowerCaseMapping:0x12119 + ,simpleTitleCaseMapping:0x12119 + }, + { code:0x1211A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1211A + ,simpleLowerCaseMapping:0x1211A + ,simpleTitleCaseMapping:0x1211A + }, + { code:0x1211B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1211B + ,simpleLowerCaseMapping:0x1211B + ,simpleTitleCaseMapping:0x1211B + }, + { code:0x1211C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1211C + ,simpleLowerCaseMapping:0x1211C + ,simpleTitleCaseMapping:0x1211C + }, + { code:0x1211D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1211D + ,simpleLowerCaseMapping:0x1211D + ,simpleTitleCaseMapping:0x1211D + }, + { code:0x1211E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1211E + ,simpleLowerCaseMapping:0x1211E + ,simpleTitleCaseMapping:0x1211E + }, + { code:0x1211F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1211F + ,simpleLowerCaseMapping:0x1211F + ,simpleTitleCaseMapping:0x1211F + }, + { code:0x12120 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12120 + ,simpleLowerCaseMapping:0x12120 + ,simpleTitleCaseMapping:0x12120 + }, + { code:0x12121 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12121 + ,simpleLowerCaseMapping:0x12121 + ,simpleTitleCaseMapping:0x12121 + }, + { code:0x12122 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12122 + ,simpleLowerCaseMapping:0x12122 + ,simpleTitleCaseMapping:0x12122 + }, + { code:0x12123 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12123 + ,simpleLowerCaseMapping:0x12123 + ,simpleTitleCaseMapping:0x12123 + }, + { code:0x12124 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12124 + ,simpleLowerCaseMapping:0x12124 + ,simpleTitleCaseMapping:0x12124 + }, + { code:0x12125 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12125 + ,simpleLowerCaseMapping:0x12125 + ,simpleTitleCaseMapping:0x12125 + }, + { code:0x12126 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12126 + ,simpleLowerCaseMapping:0x12126 + ,simpleTitleCaseMapping:0x12126 + }, + { code:0x12127 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12127 + ,simpleLowerCaseMapping:0x12127 + ,simpleTitleCaseMapping:0x12127 + }, + { code:0x12128 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12128 + ,simpleLowerCaseMapping:0x12128 + ,simpleTitleCaseMapping:0x12128 + }, + { code:0x12129 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12129 + ,simpleLowerCaseMapping:0x12129 + ,simpleTitleCaseMapping:0x12129 + }, + { code:0x1212A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1212A + ,simpleLowerCaseMapping:0x1212A + ,simpleTitleCaseMapping:0x1212A + }, + { code:0x1212B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1212B + ,simpleLowerCaseMapping:0x1212B + ,simpleTitleCaseMapping:0x1212B + }, + { code:0x1212C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1212C + ,simpleLowerCaseMapping:0x1212C + ,simpleTitleCaseMapping:0x1212C + }, + { code:0x1212D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1212D + ,simpleLowerCaseMapping:0x1212D + ,simpleTitleCaseMapping:0x1212D + }, + { code:0x1212E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1212E + ,simpleLowerCaseMapping:0x1212E + ,simpleTitleCaseMapping:0x1212E + }, + { code:0x1212F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1212F + ,simpleLowerCaseMapping:0x1212F + ,simpleTitleCaseMapping:0x1212F + }, + { code:0x12130 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12130 + ,simpleLowerCaseMapping:0x12130 + ,simpleTitleCaseMapping:0x12130 + }, + { code:0x12131 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12131 + ,simpleLowerCaseMapping:0x12131 + ,simpleTitleCaseMapping:0x12131 + }, + { code:0x12132 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12132 + ,simpleLowerCaseMapping:0x12132 + ,simpleTitleCaseMapping:0x12132 + }, + { code:0x12133 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12133 + ,simpleLowerCaseMapping:0x12133 + ,simpleTitleCaseMapping:0x12133 + }, + { code:0x12134 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12134 + ,simpleLowerCaseMapping:0x12134 + ,simpleTitleCaseMapping:0x12134 + }, + { code:0x12135 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12135 + ,simpleLowerCaseMapping:0x12135 + ,simpleTitleCaseMapping:0x12135 + }, + { code:0x12136 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12136 + ,simpleLowerCaseMapping:0x12136 + ,simpleTitleCaseMapping:0x12136 + }, + { code:0x12137 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12137 + ,simpleLowerCaseMapping:0x12137 + ,simpleTitleCaseMapping:0x12137 + }, + { code:0x12138 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12138 + ,simpleLowerCaseMapping:0x12138 + ,simpleTitleCaseMapping:0x12138 + }, + { code:0x12139 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12139 + ,simpleLowerCaseMapping:0x12139 + ,simpleTitleCaseMapping:0x12139 + }, + { code:0x1213A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1213A + ,simpleLowerCaseMapping:0x1213A + ,simpleTitleCaseMapping:0x1213A + }, + { code:0x1213B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1213B + ,simpleLowerCaseMapping:0x1213B + ,simpleTitleCaseMapping:0x1213B + }, + { code:0x1213C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1213C + ,simpleLowerCaseMapping:0x1213C + ,simpleTitleCaseMapping:0x1213C + }, + { code:0x1213D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1213D + ,simpleLowerCaseMapping:0x1213D + ,simpleTitleCaseMapping:0x1213D + }, + { code:0x1213E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1213E + ,simpleLowerCaseMapping:0x1213E + ,simpleTitleCaseMapping:0x1213E + }, + { code:0x1213F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1213F + ,simpleLowerCaseMapping:0x1213F + ,simpleTitleCaseMapping:0x1213F + }, + { code:0x12140 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12140 + ,simpleLowerCaseMapping:0x12140 + ,simpleTitleCaseMapping:0x12140 + }, + { code:0x12141 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12141 + ,simpleLowerCaseMapping:0x12141 + ,simpleTitleCaseMapping:0x12141 + }, + { code:0x12142 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12142 + ,simpleLowerCaseMapping:0x12142 + ,simpleTitleCaseMapping:0x12142 + }, + { code:0x12143 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12143 + ,simpleLowerCaseMapping:0x12143 + ,simpleTitleCaseMapping:0x12143 + }, + { code:0x12144 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12144 + ,simpleLowerCaseMapping:0x12144 + ,simpleTitleCaseMapping:0x12144 + }, + { code:0x12145 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12145 + ,simpleLowerCaseMapping:0x12145 + ,simpleTitleCaseMapping:0x12145 + }, + { code:0x12146 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12146 + ,simpleLowerCaseMapping:0x12146 + ,simpleTitleCaseMapping:0x12146 + }, + { code:0x12147 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12147 + ,simpleLowerCaseMapping:0x12147 + ,simpleTitleCaseMapping:0x12147 + }, + { code:0x12148 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12148 + ,simpleLowerCaseMapping:0x12148 + ,simpleTitleCaseMapping:0x12148 + }, + { code:0x12149 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12149 + ,simpleLowerCaseMapping:0x12149 + ,simpleTitleCaseMapping:0x12149 + }, + { code:0x1214A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1214A + ,simpleLowerCaseMapping:0x1214A + ,simpleTitleCaseMapping:0x1214A + }, + { code:0x1214B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1214B + ,simpleLowerCaseMapping:0x1214B + ,simpleTitleCaseMapping:0x1214B + }, + { code:0x1214C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1214C + ,simpleLowerCaseMapping:0x1214C + ,simpleTitleCaseMapping:0x1214C + }, + { code:0x1214D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1214D + ,simpleLowerCaseMapping:0x1214D + ,simpleTitleCaseMapping:0x1214D + }, + { code:0x1214E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1214E + ,simpleLowerCaseMapping:0x1214E + ,simpleTitleCaseMapping:0x1214E + }, + { code:0x1214F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1214F + ,simpleLowerCaseMapping:0x1214F + ,simpleTitleCaseMapping:0x1214F + }, + { code:0x12150 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12150 + ,simpleLowerCaseMapping:0x12150 + ,simpleTitleCaseMapping:0x12150 + }, + { code:0x12151 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12151 + ,simpleLowerCaseMapping:0x12151 + ,simpleTitleCaseMapping:0x12151 + }, + { code:0x12152 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12152 + ,simpleLowerCaseMapping:0x12152 + ,simpleTitleCaseMapping:0x12152 + }, + { code:0x12153 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12153 + ,simpleLowerCaseMapping:0x12153 + ,simpleTitleCaseMapping:0x12153 + }, + { code:0x12154 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12154 + ,simpleLowerCaseMapping:0x12154 + ,simpleTitleCaseMapping:0x12154 + }, + { code:0x12155 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12155 + ,simpleLowerCaseMapping:0x12155 + ,simpleTitleCaseMapping:0x12155 + }, + { code:0x12156 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12156 + ,simpleLowerCaseMapping:0x12156 + ,simpleTitleCaseMapping:0x12156 + }, + { code:0x12157 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12157 + ,simpleLowerCaseMapping:0x12157 + ,simpleTitleCaseMapping:0x12157 + }, + { code:0x12158 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12158 + ,simpleLowerCaseMapping:0x12158 + ,simpleTitleCaseMapping:0x12158 + }, + { code:0x12159 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12159 + ,simpleLowerCaseMapping:0x12159 + ,simpleTitleCaseMapping:0x12159 + }, + { code:0x1215A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1215A + ,simpleLowerCaseMapping:0x1215A + ,simpleTitleCaseMapping:0x1215A + }, + { code:0x1215B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1215B + ,simpleLowerCaseMapping:0x1215B + ,simpleTitleCaseMapping:0x1215B + }, + { code:0x1215C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1215C + ,simpleLowerCaseMapping:0x1215C + ,simpleTitleCaseMapping:0x1215C + }, + { code:0x1215D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1215D + ,simpleLowerCaseMapping:0x1215D + ,simpleTitleCaseMapping:0x1215D + }, + { code:0x1215E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1215E + ,simpleLowerCaseMapping:0x1215E + ,simpleTitleCaseMapping:0x1215E + }, + { code:0x1215F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1215F + ,simpleLowerCaseMapping:0x1215F + ,simpleTitleCaseMapping:0x1215F + }, + { code:0x12160 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12160 + ,simpleLowerCaseMapping:0x12160 + ,simpleTitleCaseMapping:0x12160 + }, + { code:0x12161 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12161 + ,simpleLowerCaseMapping:0x12161 + ,simpleTitleCaseMapping:0x12161 + }, + { code:0x12162 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12162 + ,simpleLowerCaseMapping:0x12162 + ,simpleTitleCaseMapping:0x12162 + }, + { code:0x12163 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12163 + ,simpleLowerCaseMapping:0x12163 + ,simpleTitleCaseMapping:0x12163 + }, + { code:0x12164 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12164 + ,simpleLowerCaseMapping:0x12164 + ,simpleTitleCaseMapping:0x12164 + }, + { code:0x12165 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12165 + ,simpleLowerCaseMapping:0x12165 + ,simpleTitleCaseMapping:0x12165 + }, + { code:0x12166 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12166 + ,simpleLowerCaseMapping:0x12166 + ,simpleTitleCaseMapping:0x12166 + }, + { code:0x12167 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12167 + ,simpleLowerCaseMapping:0x12167 + ,simpleTitleCaseMapping:0x12167 + }, + { code:0x12168 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12168 + ,simpleLowerCaseMapping:0x12168 + ,simpleTitleCaseMapping:0x12168 + }, + { code:0x12169 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12169 + ,simpleLowerCaseMapping:0x12169 + ,simpleTitleCaseMapping:0x12169 + }, + { code:0x1216A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1216A + ,simpleLowerCaseMapping:0x1216A + ,simpleTitleCaseMapping:0x1216A + }, + { code:0x1216B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1216B + ,simpleLowerCaseMapping:0x1216B + ,simpleTitleCaseMapping:0x1216B + }, + { code:0x1216C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1216C + ,simpleLowerCaseMapping:0x1216C + ,simpleTitleCaseMapping:0x1216C + }, + { code:0x1216D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1216D + ,simpleLowerCaseMapping:0x1216D + ,simpleTitleCaseMapping:0x1216D + }, + { code:0x1216E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1216E + ,simpleLowerCaseMapping:0x1216E + ,simpleTitleCaseMapping:0x1216E + }, + { code:0x1216F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1216F + ,simpleLowerCaseMapping:0x1216F + ,simpleTitleCaseMapping:0x1216F + }, + { code:0x12170 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12170 + ,simpleLowerCaseMapping:0x12170 + ,simpleTitleCaseMapping:0x12170 + }, + { code:0x12171 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12171 + ,simpleLowerCaseMapping:0x12171 + ,simpleTitleCaseMapping:0x12171 + }, + { code:0x12172 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12172 + ,simpleLowerCaseMapping:0x12172 + ,simpleTitleCaseMapping:0x12172 + }, + { code:0x12173 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12173 + ,simpleLowerCaseMapping:0x12173 + ,simpleTitleCaseMapping:0x12173 + }, + { code:0x12174 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12174 + ,simpleLowerCaseMapping:0x12174 + ,simpleTitleCaseMapping:0x12174 + }, + { code:0x12175 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12175 + ,simpleLowerCaseMapping:0x12175 + ,simpleTitleCaseMapping:0x12175 + }, + { code:0x12176 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12176 + ,simpleLowerCaseMapping:0x12176 + ,simpleTitleCaseMapping:0x12176 + }, + { code:0x12177 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12177 + ,simpleLowerCaseMapping:0x12177 + ,simpleTitleCaseMapping:0x12177 + }, + { code:0x12178 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12178 + ,simpleLowerCaseMapping:0x12178 + ,simpleTitleCaseMapping:0x12178 + }, + { code:0x12179 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12179 + ,simpleLowerCaseMapping:0x12179 + ,simpleTitleCaseMapping:0x12179 + }, + { code:0x1217A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1217A + ,simpleLowerCaseMapping:0x1217A + ,simpleTitleCaseMapping:0x1217A + }, + { code:0x1217B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1217B + ,simpleLowerCaseMapping:0x1217B + ,simpleTitleCaseMapping:0x1217B + }, + { code:0x1217C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1217C + ,simpleLowerCaseMapping:0x1217C + ,simpleTitleCaseMapping:0x1217C + }, + { code:0x1217D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1217D + ,simpleLowerCaseMapping:0x1217D + ,simpleTitleCaseMapping:0x1217D + }, + { code:0x1217E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1217E + ,simpleLowerCaseMapping:0x1217E + ,simpleTitleCaseMapping:0x1217E + }, + { code:0x1217F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1217F + ,simpleLowerCaseMapping:0x1217F + ,simpleTitleCaseMapping:0x1217F + }, + { code:0x12180 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12180 + ,simpleLowerCaseMapping:0x12180 + ,simpleTitleCaseMapping:0x12180 + }, + { code:0x12181 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12181 + ,simpleLowerCaseMapping:0x12181 + ,simpleTitleCaseMapping:0x12181 + }, + { code:0x12182 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12182 + ,simpleLowerCaseMapping:0x12182 + ,simpleTitleCaseMapping:0x12182 + }, + { code:0x12183 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12183 + ,simpleLowerCaseMapping:0x12183 + ,simpleTitleCaseMapping:0x12183 + }, + { code:0x12184 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12184 + ,simpleLowerCaseMapping:0x12184 + ,simpleTitleCaseMapping:0x12184 + }, + { code:0x12185 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12185 + ,simpleLowerCaseMapping:0x12185 + ,simpleTitleCaseMapping:0x12185 + }, + { code:0x12186 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12186 + ,simpleLowerCaseMapping:0x12186 + ,simpleTitleCaseMapping:0x12186 + }, + { code:0x12187 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12187 + ,simpleLowerCaseMapping:0x12187 + ,simpleTitleCaseMapping:0x12187 + }, + { code:0x12188 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12188 + ,simpleLowerCaseMapping:0x12188 + ,simpleTitleCaseMapping:0x12188 + }, + { code:0x12189 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12189 + ,simpleLowerCaseMapping:0x12189 + ,simpleTitleCaseMapping:0x12189 + }, + { code:0x1218A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1218A + ,simpleLowerCaseMapping:0x1218A + ,simpleTitleCaseMapping:0x1218A + }, + { code:0x1218B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1218B + ,simpleLowerCaseMapping:0x1218B + ,simpleTitleCaseMapping:0x1218B + }, + { code:0x1218C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1218C + ,simpleLowerCaseMapping:0x1218C + ,simpleTitleCaseMapping:0x1218C + }, + { code:0x1218D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1218D + ,simpleLowerCaseMapping:0x1218D + ,simpleTitleCaseMapping:0x1218D + }, + { code:0x1218E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1218E + ,simpleLowerCaseMapping:0x1218E + ,simpleTitleCaseMapping:0x1218E + }, + { code:0x1218F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1218F + ,simpleLowerCaseMapping:0x1218F + ,simpleTitleCaseMapping:0x1218F + }, + { code:0x12190 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12190 + ,simpleLowerCaseMapping:0x12190 + ,simpleTitleCaseMapping:0x12190 + }, + { code:0x12191 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12191 + ,simpleLowerCaseMapping:0x12191 + ,simpleTitleCaseMapping:0x12191 + }, + { code:0x12192 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12192 + ,simpleLowerCaseMapping:0x12192 + ,simpleTitleCaseMapping:0x12192 + }, + { code:0x12193 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12193 + ,simpleLowerCaseMapping:0x12193 + ,simpleTitleCaseMapping:0x12193 + }, + { code:0x12194 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12194 + ,simpleLowerCaseMapping:0x12194 + ,simpleTitleCaseMapping:0x12194 + }, + { code:0x12195 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12195 + ,simpleLowerCaseMapping:0x12195 + ,simpleTitleCaseMapping:0x12195 + }, + { code:0x12196 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12196 + ,simpleLowerCaseMapping:0x12196 + ,simpleTitleCaseMapping:0x12196 + }, + { code:0x12197 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12197 + ,simpleLowerCaseMapping:0x12197 + ,simpleTitleCaseMapping:0x12197 + }, + { code:0x12198 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12198 + ,simpleLowerCaseMapping:0x12198 + ,simpleTitleCaseMapping:0x12198 + }, + { code:0x12199 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12199 + ,simpleLowerCaseMapping:0x12199 + ,simpleTitleCaseMapping:0x12199 + }, + { code:0x1219A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1219A + ,simpleLowerCaseMapping:0x1219A + ,simpleTitleCaseMapping:0x1219A + }, + { code:0x1219B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1219B + ,simpleLowerCaseMapping:0x1219B + ,simpleTitleCaseMapping:0x1219B + }, + { code:0x1219C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1219C + ,simpleLowerCaseMapping:0x1219C + ,simpleTitleCaseMapping:0x1219C + }, + { code:0x1219D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1219D + ,simpleLowerCaseMapping:0x1219D + ,simpleTitleCaseMapping:0x1219D + }, + { code:0x1219E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1219E + ,simpleLowerCaseMapping:0x1219E + ,simpleTitleCaseMapping:0x1219E + }, + { code:0x1219F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1219F + ,simpleLowerCaseMapping:0x1219F + ,simpleTitleCaseMapping:0x1219F + }, + { code:0x121A0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121A0 + ,simpleLowerCaseMapping:0x121A0 + ,simpleTitleCaseMapping:0x121A0 + }, + { code:0x121A1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121A1 + ,simpleLowerCaseMapping:0x121A1 + ,simpleTitleCaseMapping:0x121A1 + }, + { code:0x121A2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121A2 + ,simpleLowerCaseMapping:0x121A2 + ,simpleTitleCaseMapping:0x121A2 + }, + { code:0x121A3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121A3 + ,simpleLowerCaseMapping:0x121A3 + ,simpleTitleCaseMapping:0x121A3 + }, + { code:0x121A4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121A4 + ,simpleLowerCaseMapping:0x121A4 + ,simpleTitleCaseMapping:0x121A4 + }, + { code:0x121A5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121A5 + ,simpleLowerCaseMapping:0x121A5 + ,simpleTitleCaseMapping:0x121A5 + }, + { code:0x121A6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121A6 + ,simpleLowerCaseMapping:0x121A6 + ,simpleTitleCaseMapping:0x121A6 + }, + { code:0x121A7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121A7 + ,simpleLowerCaseMapping:0x121A7 + ,simpleTitleCaseMapping:0x121A7 + }, + { code:0x121A8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121A8 + ,simpleLowerCaseMapping:0x121A8 + ,simpleTitleCaseMapping:0x121A8 + }, + { code:0x121A9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121A9 + ,simpleLowerCaseMapping:0x121A9 + ,simpleTitleCaseMapping:0x121A9 + }, + { code:0x121AA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121AA + ,simpleLowerCaseMapping:0x121AA + ,simpleTitleCaseMapping:0x121AA + }, + { code:0x121AB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121AB + ,simpleLowerCaseMapping:0x121AB + ,simpleTitleCaseMapping:0x121AB + }, + { code:0x121AC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121AC + ,simpleLowerCaseMapping:0x121AC + ,simpleTitleCaseMapping:0x121AC + }, + { code:0x121AD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121AD + ,simpleLowerCaseMapping:0x121AD + ,simpleTitleCaseMapping:0x121AD + }, + { code:0x121AE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121AE + ,simpleLowerCaseMapping:0x121AE + ,simpleTitleCaseMapping:0x121AE + }, + { code:0x121AF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121AF + ,simpleLowerCaseMapping:0x121AF + ,simpleTitleCaseMapping:0x121AF + }, + { code:0x121B0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121B0 + ,simpleLowerCaseMapping:0x121B0 + ,simpleTitleCaseMapping:0x121B0 + }, + { code:0x121B1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121B1 + ,simpleLowerCaseMapping:0x121B1 + ,simpleTitleCaseMapping:0x121B1 + }, + { code:0x121B2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121B2 + ,simpleLowerCaseMapping:0x121B2 + ,simpleTitleCaseMapping:0x121B2 + }, + { code:0x121B3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121B3 + ,simpleLowerCaseMapping:0x121B3 + ,simpleTitleCaseMapping:0x121B3 + }, + { code:0x121B4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121B4 + ,simpleLowerCaseMapping:0x121B4 + ,simpleTitleCaseMapping:0x121B4 + }, + { code:0x121B5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121B5 + ,simpleLowerCaseMapping:0x121B5 + ,simpleTitleCaseMapping:0x121B5 + }, + { code:0x121B6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121B6 + ,simpleLowerCaseMapping:0x121B6 + ,simpleTitleCaseMapping:0x121B6 + }, + { code:0x121B7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121B7 + ,simpleLowerCaseMapping:0x121B7 + ,simpleTitleCaseMapping:0x121B7 + }, + { code:0x121B8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121B8 + ,simpleLowerCaseMapping:0x121B8 + ,simpleTitleCaseMapping:0x121B8 + }, + { code:0x121B9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121B9 + ,simpleLowerCaseMapping:0x121B9 + ,simpleTitleCaseMapping:0x121B9 + }, + { code:0x121BA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121BA + ,simpleLowerCaseMapping:0x121BA + ,simpleTitleCaseMapping:0x121BA + }, + { code:0x121BB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121BB + ,simpleLowerCaseMapping:0x121BB + ,simpleTitleCaseMapping:0x121BB + }, + { code:0x121BC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121BC + ,simpleLowerCaseMapping:0x121BC + ,simpleTitleCaseMapping:0x121BC + }, + { code:0x121BD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121BD + ,simpleLowerCaseMapping:0x121BD + ,simpleTitleCaseMapping:0x121BD + }, + { code:0x121BE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121BE + ,simpleLowerCaseMapping:0x121BE + ,simpleTitleCaseMapping:0x121BE + }, + { code:0x121BF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121BF + ,simpleLowerCaseMapping:0x121BF + ,simpleTitleCaseMapping:0x121BF + }, + { code:0x121C0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121C0 + ,simpleLowerCaseMapping:0x121C0 + ,simpleTitleCaseMapping:0x121C0 + }, + { code:0x121C1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121C1 + ,simpleLowerCaseMapping:0x121C1 + ,simpleTitleCaseMapping:0x121C1 + }, + { code:0x121C2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121C2 + ,simpleLowerCaseMapping:0x121C2 + ,simpleTitleCaseMapping:0x121C2 + }, + { code:0x121C3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121C3 + ,simpleLowerCaseMapping:0x121C3 + ,simpleTitleCaseMapping:0x121C3 + }, + { code:0x121C4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121C4 + ,simpleLowerCaseMapping:0x121C4 + ,simpleTitleCaseMapping:0x121C4 + }, + { code:0x121C5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121C5 + ,simpleLowerCaseMapping:0x121C5 + ,simpleTitleCaseMapping:0x121C5 + }, + { code:0x121C6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121C6 + ,simpleLowerCaseMapping:0x121C6 + ,simpleTitleCaseMapping:0x121C6 + }, + { code:0x121C7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121C7 + ,simpleLowerCaseMapping:0x121C7 + ,simpleTitleCaseMapping:0x121C7 + }, + { code:0x121C8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121C8 + ,simpleLowerCaseMapping:0x121C8 + ,simpleTitleCaseMapping:0x121C8 + }, + { code:0x121C9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121C9 + ,simpleLowerCaseMapping:0x121C9 + ,simpleTitleCaseMapping:0x121C9 + }, + { code:0x121CA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121CA + ,simpleLowerCaseMapping:0x121CA + ,simpleTitleCaseMapping:0x121CA + }, + { code:0x121CB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121CB + ,simpleLowerCaseMapping:0x121CB + ,simpleTitleCaseMapping:0x121CB + }, + { code:0x121CC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121CC + ,simpleLowerCaseMapping:0x121CC + ,simpleTitleCaseMapping:0x121CC + }, + { code:0x121CD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121CD + ,simpleLowerCaseMapping:0x121CD + ,simpleTitleCaseMapping:0x121CD + }, + { code:0x121CE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121CE + ,simpleLowerCaseMapping:0x121CE + ,simpleTitleCaseMapping:0x121CE + }, + { code:0x121CF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121CF + ,simpleLowerCaseMapping:0x121CF + ,simpleTitleCaseMapping:0x121CF + }, + { code:0x121D0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121D0 + ,simpleLowerCaseMapping:0x121D0 + ,simpleTitleCaseMapping:0x121D0 + }, + { code:0x121D1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121D1 + ,simpleLowerCaseMapping:0x121D1 + ,simpleTitleCaseMapping:0x121D1 + }, + { code:0x121D2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121D2 + ,simpleLowerCaseMapping:0x121D2 + ,simpleTitleCaseMapping:0x121D2 + }, + { code:0x121D3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121D3 + ,simpleLowerCaseMapping:0x121D3 + ,simpleTitleCaseMapping:0x121D3 + }, + { code:0x121D4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121D4 + ,simpleLowerCaseMapping:0x121D4 + ,simpleTitleCaseMapping:0x121D4 + }, + { code:0x121D5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121D5 + ,simpleLowerCaseMapping:0x121D5 + ,simpleTitleCaseMapping:0x121D5 + }, + { code:0x121D6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121D6 + ,simpleLowerCaseMapping:0x121D6 + ,simpleTitleCaseMapping:0x121D6 + }, + { code:0x121D7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121D7 + ,simpleLowerCaseMapping:0x121D7 + ,simpleTitleCaseMapping:0x121D7 + }, + { code:0x121D8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121D8 + ,simpleLowerCaseMapping:0x121D8 + ,simpleTitleCaseMapping:0x121D8 + }, + { code:0x121D9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121D9 + ,simpleLowerCaseMapping:0x121D9 + ,simpleTitleCaseMapping:0x121D9 + }, + { code:0x121DA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121DA + ,simpleLowerCaseMapping:0x121DA + ,simpleTitleCaseMapping:0x121DA + }, + { code:0x121DB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121DB + ,simpleLowerCaseMapping:0x121DB + ,simpleTitleCaseMapping:0x121DB + }, + { code:0x121DC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121DC + ,simpleLowerCaseMapping:0x121DC + ,simpleTitleCaseMapping:0x121DC + }, + { code:0x121DD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121DD + ,simpleLowerCaseMapping:0x121DD + ,simpleTitleCaseMapping:0x121DD + }, + { code:0x121DE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121DE + ,simpleLowerCaseMapping:0x121DE + ,simpleTitleCaseMapping:0x121DE + }, + { code:0x121DF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121DF + ,simpleLowerCaseMapping:0x121DF + ,simpleTitleCaseMapping:0x121DF + }, + { code:0x121E0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121E0 + ,simpleLowerCaseMapping:0x121E0 + ,simpleTitleCaseMapping:0x121E0 + }, + { code:0x121E1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121E1 + ,simpleLowerCaseMapping:0x121E1 + ,simpleTitleCaseMapping:0x121E1 + }, + { code:0x121E2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121E2 + ,simpleLowerCaseMapping:0x121E2 + ,simpleTitleCaseMapping:0x121E2 + }, + { code:0x121E3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121E3 + ,simpleLowerCaseMapping:0x121E3 + ,simpleTitleCaseMapping:0x121E3 + }, + { code:0x121E4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121E4 + ,simpleLowerCaseMapping:0x121E4 + ,simpleTitleCaseMapping:0x121E4 + }, + { code:0x121E5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121E5 + ,simpleLowerCaseMapping:0x121E5 + ,simpleTitleCaseMapping:0x121E5 + }, + { code:0x121E6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121E6 + ,simpleLowerCaseMapping:0x121E6 + ,simpleTitleCaseMapping:0x121E6 + }, + { code:0x121E7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121E7 + ,simpleLowerCaseMapping:0x121E7 + ,simpleTitleCaseMapping:0x121E7 + }, + { code:0x121E8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121E8 + ,simpleLowerCaseMapping:0x121E8 + ,simpleTitleCaseMapping:0x121E8 + }, + { code:0x121E9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121E9 + ,simpleLowerCaseMapping:0x121E9 + ,simpleTitleCaseMapping:0x121E9 + }, + { code:0x121EA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121EA + ,simpleLowerCaseMapping:0x121EA + ,simpleTitleCaseMapping:0x121EA + }, + { code:0x121EB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121EB + ,simpleLowerCaseMapping:0x121EB + ,simpleTitleCaseMapping:0x121EB + }, + { code:0x121EC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121EC + ,simpleLowerCaseMapping:0x121EC + ,simpleTitleCaseMapping:0x121EC + }, + { code:0x121ED + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121ED + ,simpleLowerCaseMapping:0x121ED + ,simpleTitleCaseMapping:0x121ED + }, + { code:0x121EE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121EE + ,simpleLowerCaseMapping:0x121EE + ,simpleTitleCaseMapping:0x121EE + }, + { code:0x121EF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121EF + ,simpleLowerCaseMapping:0x121EF + ,simpleTitleCaseMapping:0x121EF + }, + { code:0x121F0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121F0 + ,simpleLowerCaseMapping:0x121F0 + ,simpleTitleCaseMapping:0x121F0 + }, + { code:0x121F1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121F1 + ,simpleLowerCaseMapping:0x121F1 + ,simpleTitleCaseMapping:0x121F1 + }, + { code:0x121F2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121F2 + ,simpleLowerCaseMapping:0x121F2 + ,simpleTitleCaseMapping:0x121F2 + }, + { code:0x121F3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121F3 + ,simpleLowerCaseMapping:0x121F3 + ,simpleTitleCaseMapping:0x121F3 + }, + { code:0x121F4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121F4 + ,simpleLowerCaseMapping:0x121F4 + ,simpleTitleCaseMapping:0x121F4 + }, + { code:0x121F5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121F5 + ,simpleLowerCaseMapping:0x121F5 + ,simpleTitleCaseMapping:0x121F5 + }, + { code:0x121F6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121F6 + ,simpleLowerCaseMapping:0x121F6 + ,simpleTitleCaseMapping:0x121F6 + }, + { code:0x121F7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121F7 + ,simpleLowerCaseMapping:0x121F7 + ,simpleTitleCaseMapping:0x121F7 + }, + { code:0x121F8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121F8 + ,simpleLowerCaseMapping:0x121F8 + ,simpleTitleCaseMapping:0x121F8 + }, + { code:0x121F9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121F9 + ,simpleLowerCaseMapping:0x121F9 + ,simpleTitleCaseMapping:0x121F9 + }, + { code:0x121FA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121FA + ,simpleLowerCaseMapping:0x121FA + ,simpleTitleCaseMapping:0x121FA + }, + { code:0x121FB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121FB + ,simpleLowerCaseMapping:0x121FB + ,simpleTitleCaseMapping:0x121FB + }, + { code:0x121FC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121FC + ,simpleLowerCaseMapping:0x121FC + ,simpleTitleCaseMapping:0x121FC + }, + { code:0x121FD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121FD + ,simpleLowerCaseMapping:0x121FD + ,simpleTitleCaseMapping:0x121FD + }, + { code:0x121FE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121FE + ,simpleLowerCaseMapping:0x121FE + ,simpleTitleCaseMapping:0x121FE + }, + { code:0x121FF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x121FF + ,simpleLowerCaseMapping:0x121FF + ,simpleTitleCaseMapping:0x121FF + }, + { code:0x12200 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12200 + ,simpleLowerCaseMapping:0x12200 + ,simpleTitleCaseMapping:0x12200 + }, + { code:0x12201 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12201 + ,simpleLowerCaseMapping:0x12201 + ,simpleTitleCaseMapping:0x12201 + }, + { code:0x12202 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12202 + ,simpleLowerCaseMapping:0x12202 + ,simpleTitleCaseMapping:0x12202 + }, + { code:0x12203 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12203 + ,simpleLowerCaseMapping:0x12203 + ,simpleTitleCaseMapping:0x12203 + }, + { code:0x12204 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12204 + ,simpleLowerCaseMapping:0x12204 + ,simpleTitleCaseMapping:0x12204 + }, + { code:0x12205 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12205 + ,simpleLowerCaseMapping:0x12205 + ,simpleTitleCaseMapping:0x12205 + }, + { code:0x12206 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12206 + ,simpleLowerCaseMapping:0x12206 + ,simpleTitleCaseMapping:0x12206 + }, + { code:0x12207 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12207 + ,simpleLowerCaseMapping:0x12207 + ,simpleTitleCaseMapping:0x12207 + }, + { code:0x12208 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12208 + ,simpleLowerCaseMapping:0x12208 + ,simpleTitleCaseMapping:0x12208 + }, + { code:0x12209 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12209 + ,simpleLowerCaseMapping:0x12209 + ,simpleTitleCaseMapping:0x12209 + }, + { code:0x1220A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1220A + ,simpleLowerCaseMapping:0x1220A + ,simpleTitleCaseMapping:0x1220A + }, + { code:0x1220B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1220B + ,simpleLowerCaseMapping:0x1220B + ,simpleTitleCaseMapping:0x1220B + }, + { code:0x1220C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1220C + ,simpleLowerCaseMapping:0x1220C + ,simpleTitleCaseMapping:0x1220C + }, + { code:0x1220D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1220D + ,simpleLowerCaseMapping:0x1220D + ,simpleTitleCaseMapping:0x1220D + }, + { code:0x1220E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1220E + ,simpleLowerCaseMapping:0x1220E + ,simpleTitleCaseMapping:0x1220E + }, + { code:0x1220F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1220F + ,simpleLowerCaseMapping:0x1220F + ,simpleTitleCaseMapping:0x1220F + }, + { code:0x12210 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12210 + ,simpleLowerCaseMapping:0x12210 + ,simpleTitleCaseMapping:0x12210 + }, + { code:0x12211 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12211 + ,simpleLowerCaseMapping:0x12211 + ,simpleTitleCaseMapping:0x12211 + }, + { code:0x12212 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12212 + ,simpleLowerCaseMapping:0x12212 + ,simpleTitleCaseMapping:0x12212 + }, + { code:0x12213 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12213 + ,simpleLowerCaseMapping:0x12213 + ,simpleTitleCaseMapping:0x12213 + }, + { code:0x12214 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12214 + ,simpleLowerCaseMapping:0x12214 + ,simpleTitleCaseMapping:0x12214 + }, + { code:0x12215 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12215 + ,simpleLowerCaseMapping:0x12215 + ,simpleTitleCaseMapping:0x12215 + }, + { code:0x12216 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12216 + ,simpleLowerCaseMapping:0x12216 + ,simpleTitleCaseMapping:0x12216 + }, + { code:0x12217 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12217 + ,simpleLowerCaseMapping:0x12217 + ,simpleTitleCaseMapping:0x12217 + }, + { code:0x12218 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12218 + ,simpleLowerCaseMapping:0x12218 + ,simpleTitleCaseMapping:0x12218 + }, + { code:0x12219 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12219 + ,simpleLowerCaseMapping:0x12219 + ,simpleTitleCaseMapping:0x12219 + }, + { code:0x1221A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1221A + ,simpleLowerCaseMapping:0x1221A + ,simpleTitleCaseMapping:0x1221A + }, + { code:0x1221B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1221B + ,simpleLowerCaseMapping:0x1221B + ,simpleTitleCaseMapping:0x1221B + }, + { code:0x1221C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1221C + ,simpleLowerCaseMapping:0x1221C + ,simpleTitleCaseMapping:0x1221C + }, + { code:0x1221D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1221D + ,simpleLowerCaseMapping:0x1221D + ,simpleTitleCaseMapping:0x1221D + }, + { code:0x1221E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1221E + ,simpleLowerCaseMapping:0x1221E + ,simpleTitleCaseMapping:0x1221E + }, + { code:0x1221F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1221F + ,simpleLowerCaseMapping:0x1221F + ,simpleTitleCaseMapping:0x1221F + }, + { code:0x12220 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12220 + ,simpleLowerCaseMapping:0x12220 + ,simpleTitleCaseMapping:0x12220 + }, + { code:0x12221 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12221 + ,simpleLowerCaseMapping:0x12221 + ,simpleTitleCaseMapping:0x12221 + }, + { code:0x12222 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12222 + ,simpleLowerCaseMapping:0x12222 + ,simpleTitleCaseMapping:0x12222 + }, + { code:0x12223 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12223 + ,simpleLowerCaseMapping:0x12223 + ,simpleTitleCaseMapping:0x12223 + }, + { code:0x12224 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12224 + ,simpleLowerCaseMapping:0x12224 + ,simpleTitleCaseMapping:0x12224 + }, + { code:0x12225 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12225 + ,simpleLowerCaseMapping:0x12225 + ,simpleTitleCaseMapping:0x12225 + }, + { code:0x12226 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12226 + ,simpleLowerCaseMapping:0x12226 + ,simpleTitleCaseMapping:0x12226 + }, + { code:0x12227 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12227 + ,simpleLowerCaseMapping:0x12227 + ,simpleTitleCaseMapping:0x12227 + }, + { code:0x12228 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12228 + ,simpleLowerCaseMapping:0x12228 + ,simpleTitleCaseMapping:0x12228 + }, + { code:0x12229 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12229 + ,simpleLowerCaseMapping:0x12229 + ,simpleTitleCaseMapping:0x12229 + }, + { code:0x1222A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1222A + ,simpleLowerCaseMapping:0x1222A + ,simpleTitleCaseMapping:0x1222A + }, + { code:0x1222B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1222B + ,simpleLowerCaseMapping:0x1222B + ,simpleTitleCaseMapping:0x1222B + }, + { code:0x1222C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1222C + ,simpleLowerCaseMapping:0x1222C + ,simpleTitleCaseMapping:0x1222C + }, + { code:0x1222D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1222D + ,simpleLowerCaseMapping:0x1222D + ,simpleTitleCaseMapping:0x1222D + }, + { code:0x1222E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1222E + ,simpleLowerCaseMapping:0x1222E + ,simpleTitleCaseMapping:0x1222E + }, + { code:0x1222F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1222F + ,simpleLowerCaseMapping:0x1222F + ,simpleTitleCaseMapping:0x1222F + }, + { code:0x12230 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12230 + ,simpleLowerCaseMapping:0x12230 + ,simpleTitleCaseMapping:0x12230 + }, + { code:0x12231 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12231 + ,simpleLowerCaseMapping:0x12231 + ,simpleTitleCaseMapping:0x12231 + }, + { code:0x12232 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12232 + ,simpleLowerCaseMapping:0x12232 + ,simpleTitleCaseMapping:0x12232 + }, + { code:0x12233 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12233 + ,simpleLowerCaseMapping:0x12233 + ,simpleTitleCaseMapping:0x12233 + }, + { code:0x12234 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12234 + ,simpleLowerCaseMapping:0x12234 + ,simpleTitleCaseMapping:0x12234 + }, + { code:0x12235 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12235 + ,simpleLowerCaseMapping:0x12235 + ,simpleTitleCaseMapping:0x12235 + }, + { code:0x12236 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12236 + ,simpleLowerCaseMapping:0x12236 + ,simpleTitleCaseMapping:0x12236 + }, + { code:0x12237 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12237 + ,simpleLowerCaseMapping:0x12237 + ,simpleTitleCaseMapping:0x12237 + }, + { code:0x12238 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12238 + ,simpleLowerCaseMapping:0x12238 + ,simpleTitleCaseMapping:0x12238 + }, + { code:0x12239 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12239 + ,simpleLowerCaseMapping:0x12239 + ,simpleTitleCaseMapping:0x12239 + }, + { code:0x1223A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1223A + ,simpleLowerCaseMapping:0x1223A + ,simpleTitleCaseMapping:0x1223A + }, + { code:0x1223B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1223B + ,simpleLowerCaseMapping:0x1223B + ,simpleTitleCaseMapping:0x1223B + }, + { code:0x1223C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1223C + ,simpleLowerCaseMapping:0x1223C + ,simpleTitleCaseMapping:0x1223C + }, + { code:0x1223D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1223D + ,simpleLowerCaseMapping:0x1223D + ,simpleTitleCaseMapping:0x1223D + }, + { code:0x1223E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1223E + ,simpleLowerCaseMapping:0x1223E + ,simpleTitleCaseMapping:0x1223E + }, + { code:0x1223F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1223F + ,simpleLowerCaseMapping:0x1223F + ,simpleTitleCaseMapping:0x1223F + }, + { code:0x12240 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12240 + ,simpleLowerCaseMapping:0x12240 + ,simpleTitleCaseMapping:0x12240 + }, + { code:0x12241 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12241 + ,simpleLowerCaseMapping:0x12241 + ,simpleTitleCaseMapping:0x12241 + }, + { code:0x12242 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12242 + ,simpleLowerCaseMapping:0x12242 + ,simpleTitleCaseMapping:0x12242 + }, + { code:0x12243 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12243 + ,simpleLowerCaseMapping:0x12243 + ,simpleTitleCaseMapping:0x12243 + }, + { code:0x12244 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12244 + ,simpleLowerCaseMapping:0x12244 + ,simpleTitleCaseMapping:0x12244 + }, + { code:0x12245 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12245 + ,simpleLowerCaseMapping:0x12245 + ,simpleTitleCaseMapping:0x12245 + }, + { code:0x12246 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12246 + ,simpleLowerCaseMapping:0x12246 + ,simpleTitleCaseMapping:0x12246 + }, + { code:0x12247 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12247 + ,simpleLowerCaseMapping:0x12247 + ,simpleTitleCaseMapping:0x12247 + }, + { code:0x12248 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12248 + ,simpleLowerCaseMapping:0x12248 + ,simpleTitleCaseMapping:0x12248 + }, + { code:0x12249 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12249 + ,simpleLowerCaseMapping:0x12249 + ,simpleTitleCaseMapping:0x12249 + }, + { code:0x1224A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1224A + ,simpleLowerCaseMapping:0x1224A + ,simpleTitleCaseMapping:0x1224A + }, + { code:0x1224B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1224B + ,simpleLowerCaseMapping:0x1224B + ,simpleTitleCaseMapping:0x1224B + }, + { code:0x1224C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1224C + ,simpleLowerCaseMapping:0x1224C + ,simpleTitleCaseMapping:0x1224C + }, + { code:0x1224D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1224D + ,simpleLowerCaseMapping:0x1224D + ,simpleTitleCaseMapping:0x1224D + }, + { code:0x1224E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1224E + ,simpleLowerCaseMapping:0x1224E + ,simpleTitleCaseMapping:0x1224E + }, + { code:0x1224F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1224F + ,simpleLowerCaseMapping:0x1224F + ,simpleTitleCaseMapping:0x1224F + }, + { code:0x12250 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12250 + ,simpleLowerCaseMapping:0x12250 + ,simpleTitleCaseMapping:0x12250 + }, + { code:0x12251 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12251 + ,simpleLowerCaseMapping:0x12251 + ,simpleTitleCaseMapping:0x12251 + }, + { code:0x12252 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12252 + ,simpleLowerCaseMapping:0x12252 + ,simpleTitleCaseMapping:0x12252 + }, + { code:0x12253 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12253 + ,simpleLowerCaseMapping:0x12253 + ,simpleTitleCaseMapping:0x12253 + }, + { code:0x12254 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12254 + ,simpleLowerCaseMapping:0x12254 + ,simpleTitleCaseMapping:0x12254 + }, + { code:0x12255 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12255 + ,simpleLowerCaseMapping:0x12255 + ,simpleTitleCaseMapping:0x12255 + }, + { code:0x12256 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12256 + ,simpleLowerCaseMapping:0x12256 + ,simpleTitleCaseMapping:0x12256 + }, + { code:0x12257 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12257 + ,simpleLowerCaseMapping:0x12257 + ,simpleTitleCaseMapping:0x12257 + }, + { code:0x12258 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12258 + ,simpleLowerCaseMapping:0x12258 + ,simpleTitleCaseMapping:0x12258 + }, + { code:0x12259 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12259 + ,simpleLowerCaseMapping:0x12259 + ,simpleTitleCaseMapping:0x12259 + }, + { code:0x1225A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1225A + ,simpleLowerCaseMapping:0x1225A + ,simpleTitleCaseMapping:0x1225A + }, + { code:0x1225B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1225B + ,simpleLowerCaseMapping:0x1225B + ,simpleTitleCaseMapping:0x1225B + }, + { code:0x1225C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1225C + ,simpleLowerCaseMapping:0x1225C + ,simpleTitleCaseMapping:0x1225C + }, + { code:0x1225D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1225D + ,simpleLowerCaseMapping:0x1225D + ,simpleTitleCaseMapping:0x1225D + }, + { code:0x1225E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1225E + ,simpleLowerCaseMapping:0x1225E + ,simpleTitleCaseMapping:0x1225E + }, + { code:0x1225F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1225F + ,simpleLowerCaseMapping:0x1225F + ,simpleTitleCaseMapping:0x1225F + }, + { code:0x12260 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12260 + ,simpleLowerCaseMapping:0x12260 + ,simpleTitleCaseMapping:0x12260 + }, + { code:0x12261 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12261 + ,simpleLowerCaseMapping:0x12261 + ,simpleTitleCaseMapping:0x12261 + }, + { code:0x12262 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12262 + ,simpleLowerCaseMapping:0x12262 + ,simpleTitleCaseMapping:0x12262 + }, + { code:0x12263 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12263 + ,simpleLowerCaseMapping:0x12263 + ,simpleTitleCaseMapping:0x12263 + }, + { code:0x12264 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12264 + ,simpleLowerCaseMapping:0x12264 + ,simpleTitleCaseMapping:0x12264 + }, + { code:0x12265 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12265 + ,simpleLowerCaseMapping:0x12265 + ,simpleTitleCaseMapping:0x12265 + }, + { code:0x12266 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12266 + ,simpleLowerCaseMapping:0x12266 + ,simpleTitleCaseMapping:0x12266 + }, + { code:0x12267 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12267 + ,simpleLowerCaseMapping:0x12267 + ,simpleTitleCaseMapping:0x12267 + }, + { code:0x12268 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12268 + ,simpleLowerCaseMapping:0x12268 + ,simpleTitleCaseMapping:0x12268 + }, + { code:0x12269 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12269 + ,simpleLowerCaseMapping:0x12269 + ,simpleTitleCaseMapping:0x12269 + }, + { code:0x1226A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1226A + ,simpleLowerCaseMapping:0x1226A + ,simpleTitleCaseMapping:0x1226A + }, + { code:0x1226B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1226B + ,simpleLowerCaseMapping:0x1226B + ,simpleTitleCaseMapping:0x1226B + }, + { code:0x1226C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1226C + ,simpleLowerCaseMapping:0x1226C + ,simpleTitleCaseMapping:0x1226C + }, + { code:0x1226D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1226D + ,simpleLowerCaseMapping:0x1226D + ,simpleTitleCaseMapping:0x1226D + }, + { code:0x1226E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1226E + ,simpleLowerCaseMapping:0x1226E + ,simpleTitleCaseMapping:0x1226E + }, + { code:0x1226F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1226F + ,simpleLowerCaseMapping:0x1226F + ,simpleTitleCaseMapping:0x1226F + }, + { code:0x12270 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12270 + ,simpleLowerCaseMapping:0x12270 + ,simpleTitleCaseMapping:0x12270 + }, + { code:0x12271 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12271 + ,simpleLowerCaseMapping:0x12271 + ,simpleTitleCaseMapping:0x12271 + }, + { code:0x12272 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12272 + ,simpleLowerCaseMapping:0x12272 + ,simpleTitleCaseMapping:0x12272 + }, + { code:0x12273 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12273 + ,simpleLowerCaseMapping:0x12273 + ,simpleTitleCaseMapping:0x12273 + }, + { code:0x12274 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12274 + ,simpleLowerCaseMapping:0x12274 + ,simpleTitleCaseMapping:0x12274 + }, + { code:0x12275 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12275 + ,simpleLowerCaseMapping:0x12275 + ,simpleTitleCaseMapping:0x12275 + }, + { code:0x12276 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12276 + ,simpleLowerCaseMapping:0x12276 + ,simpleTitleCaseMapping:0x12276 + }, + { code:0x12277 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12277 + ,simpleLowerCaseMapping:0x12277 + ,simpleTitleCaseMapping:0x12277 + }, + { code:0x12278 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12278 + ,simpleLowerCaseMapping:0x12278 + ,simpleTitleCaseMapping:0x12278 + }, + { code:0x12279 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12279 + ,simpleLowerCaseMapping:0x12279 + ,simpleTitleCaseMapping:0x12279 + }, + { code:0x1227A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1227A + ,simpleLowerCaseMapping:0x1227A + ,simpleTitleCaseMapping:0x1227A + }, + { code:0x1227B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1227B + ,simpleLowerCaseMapping:0x1227B + ,simpleTitleCaseMapping:0x1227B + }, + { code:0x1227C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1227C + ,simpleLowerCaseMapping:0x1227C + ,simpleTitleCaseMapping:0x1227C + }, + { code:0x1227D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1227D + ,simpleLowerCaseMapping:0x1227D + ,simpleTitleCaseMapping:0x1227D + }, + { code:0x1227E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1227E + ,simpleLowerCaseMapping:0x1227E + ,simpleTitleCaseMapping:0x1227E + }, + { code:0x1227F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1227F + ,simpleLowerCaseMapping:0x1227F + ,simpleTitleCaseMapping:0x1227F + }, + { code:0x12280 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12280 + ,simpleLowerCaseMapping:0x12280 + ,simpleTitleCaseMapping:0x12280 + }, + { code:0x12281 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12281 + ,simpleLowerCaseMapping:0x12281 + ,simpleTitleCaseMapping:0x12281 + }, + { code:0x12282 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12282 + ,simpleLowerCaseMapping:0x12282 + ,simpleTitleCaseMapping:0x12282 + }, + { code:0x12283 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12283 + ,simpleLowerCaseMapping:0x12283 + ,simpleTitleCaseMapping:0x12283 + }, + { code:0x12284 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12284 + ,simpleLowerCaseMapping:0x12284 + ,simpleTitleCaseMapping:0x12284 + }, + { code:0x12285 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12285 + ,simpleLowerCaseMapping:0x12285 + ,simpleTitleCaseMapping:0x12285 + }, + { code:0x12286 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12286 + ,simpleLowerCaseMapping:0x12286 + ,simpleTitleCaseMapping:0x12286 + }, + { code:0x12287 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12287 + ,simpleLowerCaseMapping:0x12287 + ,simpleTitleCaseMapping:0x12287 + }, + { code:0x12288 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12288 + ,simpleLowerCaseMapping:0x12288 + ,simpleTitleCaseMapping:0x12288 + }, + { code:0x12289 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12289 + ,simpleLowerCaseMapping:0x12289 + ,simpleTitleCaseMapping:0x12289 + }, + { code:0x1228A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1228A + ,simpleLowerCaseMapping:0x1228A + ,simpleTitleCaseMapping:0x1228A + }, + { code:0x1228B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1228B + ,simpleLowerCaseMapping:0x1228B + ,simpleTitleCaseMapping:0x1228B + }, + { code:0x1228C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1228C + ,simpleLowerCaseMapping:0x1228C + ,simpleTitleCaseMapping:0x1228C + }, + { code:0x1228D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1228D + ,simpleLowerCaseMapping:0x1228D + ,simpleTitleCaseMapping:0x1228D + }, + { code:0x1228E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1228E + ,simpleLowerCaseMapping:0x1228E + ,simpleTitleCaseMapping:0x1228E + }, + { code:0x1228F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1228F + ,simpleLowerCaseMapping:0x1228F + ,simpleTitleCaseMapping:0x1228F + }, + { code:0x12290 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12290 + ,simpleLowerCaseMapping:0x12290 + ,simpleTitleCaseMapping:0x12290 + }, + { code:0x12291 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12291 + ,simpleLowerCaseMapping:0x12291 + ,simpleTitleCaseMapping:0x12291 + }, + { code:0x12292 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12292 + ,simpleLowerCaseMapping:0x12292 + ,simpleTitleCaseMapping:0x12292 + }, + { code:0x12293 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12293 + ,simpleLowerCaseMapping:0x12293 + ,simpleTitleCaseMapping:0x12293 + }, + { code:0x12294 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12294 + ,simpleLowerCaseMapping:0x12294 + ,simpleTitleCaseMapping:0x12294 + }, + { code:0x12295 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12295 + ,simpleLowerCaseMapping:0x12295 + ,simpleTitleCaseMapping:0x12295 + }, + { code:0x12296 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12296 + ,simpleLowerCaseMapping:0x12296 + ,simpleTitleCaseMapping:0x12296 + }, + { code:0x12297 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12297 + ,simpleLowerCaseMapping:0x12297 + ,simpleTitleCaseMapping:0x12297 + }, + { code:0x12298 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12298 + ,simpleLowerCaseMapping:0x12298 + ,simpleTitleCaseMapping:0x12298 + }, + { code:0x12299 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12299 + ,simpleLowerCaseMapping:0x12299 + ,simpleTitleCaseMapping:0x12299 + }, + { code:0x1229A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1229A + ,simpleLowerCaseMapping:0x1229A + ,simpleTitleCaseMapping:0x1229A + }, + { code:0x1229B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1229B + ,simpleLowerCaseMapping:0x1229B + ,simpleTitleCaseMapping:0x1229B + }, + { code:0x1229C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1229C + ,simpleLowerCaseMapping:0x1229C + ,simpleTitleCaseMapping:0x1229C + }, + { code:0x1229D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1229D + ,simpleLowerCaseMapping:0x1229D + ,simpleTitleCaseMapping:0x1229D + }, + { code:0x1229E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1229E + ,simpleLowerCaseMapping:0x1229E + ,simpleTitleCaseMapping:0x1229E + }, + { code:0x1229F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1229F + ,simpleLowerCaseMapping:0x1229F + ,simpleTitleCaseMapping:0x1229F + }, + { code:0x122A0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122A0 + ,simpleLowerCaseMapping:0x122A0 + ,simpleTitleCaseMapping:0x122A0 + }, + { code:0x122A1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122A1 + ,simpleLowerCaseMapping:0x122A1 + ,simpleTitleCaseMapping:0x122A1 + }, + { code:0x122A2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122A2 + ,simpleLowerCaseMapping:0x122A2 + ,simpleTitleCaseMapping:0x122A2 + }, + { code:0x122A3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122A3 + ,simpleLowerCaseMapping:0x122A3 + ,simpleTitleCaseMapping:0x122A3 + }, + { code:0x122A4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122A4 + ,simpleLowerCaseMapping:0x122A4 + ,simpleTitleCaseMapping:0x122A4 + }, + { code:0x122A5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122A5 + ,simpleLowerCaseMapping:0x122A5 + ,simpleTitleCaseMapping:0x122A5 + }, + { code:0x122A6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122A6 + ,simpleLowerCaseMapping:0x122A6 + ,simpleTitleCaseMapping:0x122A6 + }, + { code:0x122A7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122A7 + ,simpleLowerCaseMapping:0x122A7 + ,simpleTitleCaseMapping:0x122A7 + }, + { code:0x122A8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122A8 + ,simpleLowerCaseMapping:0x122A8 + ,simpleTitleCaseMapping:0x122A8 + }, + { code:0x122A9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122A9 + ,simpleLowerCaseMapping:0x122A9 + ,simpleTitleCaseMapping:0x122A9 + }, + { code:0x122AA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122AA + ,simpleLowerCaseMapping:0x122AA + ,simpleTitleCaseMapping:0x122AA + }, + { code:0x122AB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122AB + ,simpleLowerCaseMapping:0x122AB + ,simpleTitleCaseMapping:0x122AB + }, + { code:0x122AC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122AC + ,simpleLowerCaseMapping:0x122AC + ,simpleTitleCaseMapping:0x122AC + }, + { code:0x122AD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122AD + ,simpleLowerCaseMapping:0x122AD + ,simpleTitleCaseMapping:0x122AD + }, + { code:0x122AE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122AE + ,simpleLowerCaseMapping:0x122AE + ,simpleTitleCaseMapping:0x122AE + }, + { code:0x122AF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122AF + ,simpleLowerCaseMapping:0x122AF + ,simpleTitleCaseMapping:0x122AF + }, + { code:0x122B0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122B0 + ,simpleLowerCaseMapping:0x122B0 + ,simpleTitleCaseMapping:0x122B0 + }, + { code:0x122B1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122B1 + ,simpleLowerCaseMapping:0x122B1 + ,simpleTitleCaseMapping:0x122B1 + }, + { code:0x122B2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122B2 + ,simpleLowerCaseMapping:0x122B2 + ,simpleTitleCaseMapping:0x122B2 + }, + { code:0x122B3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122B3 + ,simpleLowerCaseMapping:0x122B3 + ,simpleTitleCaseMapping:0x122B3 + }, + { code:0x122B4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122B4 + ,simpleLowerCaseMapping:0x122B4 + ,simpleTitleCaseMapping:0x122B4 + }, + { code:0x122B5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122B5 + ,simpleLowerCaseMapping:0x122B5 + ,simpleTitleCaseMapping:0x122B5 + }, + { code:0x122B6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122B6 + ,simpleLowerCaseMapping:0x122B6 + ,simpleTitleCaseMapping:0x122B6 + }, + { code:0x122B7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122B7 + ,simpleLowerCaseMapping:0x122B7 + ,simpleTitleCaseMapping:0x122B7 + }, + { code:0x122B8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122B8 + ,simpleLowerCaseMapping:0x122B8 + ,simpleTitleCaseMapping:0x122B8 + }, + { code:0x122B9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122B9 + ,simpleLowerCaseMapping:0x122B9 + ,simpleTitleCaseMapping:0x122B9 + }, + { code:0x122BA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122BA + ,simpleLowerCaseMapping:0x122BA + ,simpleTitleCaseMapping:0x122BA + }, + { code:0x122BB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122BB + ,simpleLowerCaseMapping:0x122BB + ,simpleTitleCaseMapping:0x122BB + }, + { code:0x122BC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122BC + ,simpleLowerCaseMapping:0x122BC + ,simpleTitleCaseMapping:0x122BC + }, + { code:0x122BD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122BD + ,simpleLowerCaseMapping:0x122BD + ,simpleTitleCaseMapping:0x122BD + }, + { code:0x122BE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122BE + ,simpleLowerCaseMapping:0x122BE + ,simpleTitleCaseMapping:0x122BE + }, + { code:0x122BF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122BF + ,simpleLowerCaseMapping:0x122BF + ,simpleTitleCaseMapping:0x122BF + }, + { code:0x122C0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122C0 + ,simpleLowerCaseMapping:0x122C0 + ,simpleTitleCaseMapping:0x122C0 + }, + { code:0x122C1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122C1 + ,simpleLowerCaseMapping:0x122C1 + ,simpleTitleCaseMapping:0x122C1 + }, + { code:0x122C2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122C2 + ,simpleLowerCaseMapping:0x122C2 + ,simpleTitleCaseMapping:0x122C2 + }, + { code:0x122C3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122C3 + ,simpleLowerCaseMapping:0x122C3 + ,simpleTitleCaseMapping:0x122C3 + }, + { code:0x122C4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122C4 + ,simpleLowerCaseMapping:0x122C4 + ,simpleTitleCaseMapping:0x122C4 + }, + { code:0x122C5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122C5 + ,simpleLowerCaseMapping:0x122C5 + ,simpleTitleCaseMapping:0x122C5 + }, + { code:0x122C6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122C6 + ,simpleLowerCaseMapping:0x122C6 + ,simpleTitleCaseMapping:0x122C6 + }, + { code:0x122C7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122C7 + ,simpleLowerCaseMapping:0x122C7 + ,simpleTitleCaseMapping:0x122C7 + }, + { code:0x122C8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122C8 + ,simpleLowerCaseMapping:0x122C8 + ,simpleTitleCaseMapping:0x122C8 + }, + { code:0x122C9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122C9 + ,simpleLowerCaseMapping:0x122C9 + ,simpleTitleCaseMapping:0x122C9 + }, + { code:0x122CA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122CA + ,simpleLowerCaseMapping:0x122CA + ,simpleTitleCaseMapping:0x122CA + }, + { code:0x122CB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122CB + ,simpleLowerCaseMapping:0x122CB + ,simpleTitleCaseMapping:0x122CB + }, + { code:0x122CC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122CC + ,simpleLowerCaseMapping:0x122CC + ,simpleTitleCaseMapping:0x122CC + }, + { code:0x122CD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122CD + ,simpleLowerCaseMapping:0x122CD + ,simpleTitleCaseMapping:0x122CD + }, + { code:0x122CE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122CE + ,simpleLowerCaseMapping:0x122CE + ,simpleTitleCaseMapping:0x122CE + }, + { code:0x122CF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122CF + ,simpleLowerCaseMapping:0x122CF + ,simpleTitleCaseMapping:0x122CF + }, + { code:0x122D0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122D0 + ,simpleLowerCaseMapping:0x122D0 + ,simpleTitleCaseMapping:0x122D0 + }, + { code:0x122D1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122D1 + ,simpleLowerCaseMapping:0x122D1 + ,simpleTitleCaseMapping:0x122D1 + }, + { code:0x122D2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122D2 + ,simpleLowerCaseMapping:0x122D2 + ,simpleTitleCaseMapping:0x122D2 + }, + { code:0x122D3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122D3 + ,simpleLowerCaseMapping:0x122D3 + ,simpleTitleCaseMapping:0x122D3 + }, + { code:0x122D4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122D4 + ,simpleLowerCaseMapping:0x122D4 + ,simpleTitleCaseMapping:0x122D4 + }, + { code:0x122D5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122D5 + ,simpleLowerCaseMapping:0x122D5 + ,simpleTitleCaseMapping:0x122D5 + }, + { code:0x122D6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122D6 + ,simpleLowerCaseMapping:0x122D6 + ,simpleTitleCaseMapping:0x122D6 + }, + { code:0x122D7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122D7 + ,simpleLowerCaseMapping:0x122D7 + ,simpleTitleCaseMapping:0x122D7 + }, + { code:0x122D8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122D8 + ,simpleLowerCaseMapping:0x122D8 + ,simpleTitleCaseMapping:0x122D8 + }, + { code:0x122D9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122D9 + ,simpleLowerCaseMapping:0x122D9 + ,simpleTitleCaseMapping:0x122D9 + }, + { code:0x122DA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122DA + ,simpleLowerCaseMapping:0x122DA + ,simpleTitleCaseMapping:0x122DA + }, + { code:0x122DB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122DB + ,simpleLowerCaseMapping:0x122DB + ,simpleTitleCaseMapping:0x122DB + }, + { code:0x122DC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122DC + ,simpleLowerCaseMapping:0x122DC + ,simpleTitleCaseMapping:0x122DC + }, + { code:0x122DD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122DD + ,simpleLowerCaseMapping:0x122DD + ,simpleTitleCaseMapping:0x122DD + }, + { code:0x122DE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122DE + ,simpleLowerCaseMapping:0x122DE + ,simpleTitleCaseMapping:0x122DE + }, + { code:0x122DF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122DF + ,simpleLowerCaseMapping:0x122DF + ,simpleTitleCaseMapping:0x122DF + }, + { code:0x122E0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122E0 + ,simpleLowerCaseMapping:0x122E0 + ,simpleTitleCaseMapping:0x122E0 + }, + { code:0x122E1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122E1 + ,simpleLowerCaseMapping:0x122E1 + ,simpleTitleCaseMapping:0x122E1 + }, + { code:0x122E2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122E2 + ,simpleLowerCaseMapping:0x122E2 + ,simpleTitleCaseMapping:0x122E2 + }, + { code:0x122E3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122E3 + ,simpleLowerCaseMapping:0x122E3 + ,simpleTitleCaseMapping:0x122E3 + }, + { code:0x122E4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122E4 + ,simpleLowerCaseMapping:0x122E4 + ,simpleTitleCaseMapping:0x122E4 + }, + { code:0x122E5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122E5 + ,simpleLowerCaseMapping:0x122E5 + ,simpleTitleCaseMapping:0x122E5 + }, + { code:0x122E6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122E6 + ,simpleLowerCaseMapping:0x122E6 + ,simpleTitleCaseMapping:0x122E6 + }, + { code:0x122E7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122E7 + ,simpleLowerCaseMapping:0x122E7 + ,simpleTitleCaseMapping:0x122E7 + }, + { code:0x122E8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122E8 + ,simpleLowerCaseMapping:0x122E8 + ,simpleTitleCaseMapping:0x122E8 + }, + { code:0x122E9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122E9 + ,simpleLowerCaseMapping:0x122E9 + ,simpleTitleCaseMapping:0x122E9 + }, + { code:0x122EA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122EA + ,simpleLowerCaseMapping:0x122EA + ,simpleTitleCaseMapping:0x122EA + }, + { code:0x122EB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122EB + ,simpleLowerCaseMapping:0x122EB + ,simpleTitleCaseMapping:0x122EB + }, + { code:0x122EC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122EC + ,simpleLowerCaseMapping:0x122EC + ,simpleTitleCaseMapping:0x122EC + }, + { code:0x122ED + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122ED + ,simpleLowerCaseMapping:0x122ED + ,simpleTitleCaseMapping:0x122ED + }, + { code:0x122EE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122EE + ,simpleLowerCaseMapping:0x122EE + ,simpleTitleCaseMapping:0x122EE + }, + { code:0x122EF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122EF + ,simpleLowerCaseMapping:0x122EF + ,simpleTitleCaseMapping:0x122EF + }, + { code:0x122F0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122F0 + ,simpleLowerCaseMapping:0x122F0 + ,simpleTitleCaseMapping:0x122F0 + }, + { code:0x122F1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122F1 + ,simpleLowerCaseMapping:0x122F1 + ,simpleTitleCaseMapping:0x122F1 + }, + { code:0x122F2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122F2 + ,simpleLowerCaseMapping:0x122F2 + ,simpleTitleCaseMapping:0x122F2 + }, + { code:0x122F3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122F3 + ,simpleLowerCaseMapping:0x122F3 + ,simpleTitleCaseMapping:0x122F3 + }, + { code:0x122F4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122F4 + ,simpleLowerCaseMapping:0x122F4 + ,simpleTitleCaseMapping:0x122F4 + }, + { code:0x122F5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122F5 + ,simpleLowerCaseMapping:0x122F5 + ,simpleTitleCaseMapping:0x122F5 + }, + { code:0x122F6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122F6 + ,simpleLowerCaseMapping:0x122F6 + ,simpleTitleCaseMapping:0x122F6 + }, + { code:0x122F7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122F7 + ,simpleLowerCaseMapping:0x122F7 + ,simpleTitleCaseMapping:0x122F7 + }, + { code:0x122F8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122F8 + ,simpleLowerCaseMapping:0x122F8 + ,simpleTitleCaseMapping:0x122F8 + }, + { code:0x122F9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122F9 + ,simpleLowerCaseMapping:0x122F9 + ,simpleTitleCaseMapping:0x122F9 + }, + { code:0x122FA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122FA + ,simpleLowerCaseMapping:0x122FA + ,simpleTitleCaseMapping:0x122FA + }, + { code:0x122FB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122FB + ,simpleLowerCaseMapping:0x122FB + ,simpleTitleCaseMapping:0x122FB + }, + { code:0x122FC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122FC + ,simpleLowerCaseMapping:0x122FC + ,simpleTitleCaseMapping:0x122FC + }, + { code:0x122FD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122FD + ,simpleLowerCaseMapping:0x122FD + ,simpleTitleCaseMapping:0x122FD + }, + { code:0x122FE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122FE + ,simpleLowerCaseMapping:0x122FE + ,simpleTitleCaseMapping:0x122FE + }, + { code:0x122FF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x122FF + ,simpleLowerCaseMapping:0x122FF + ,simpleTitleCaseMapping:0x122FF + }, + { code:0x12300 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12300 + ,simpleLowerCaseMapping:0x12300 + ,simpleTitleCaseMapping:0x12300 + }, + { code:0x12301 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12301 + ,simpleLowerCaseMapping:0x12301 + ,simpleTitleCaseMapping:0x12301 + }, + { code:0x12302 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12302 + ,simpleLowerCaseMapping:0x12302 + ,simpleTitleCaseMapping:0x12302 + }, + { code:0x12303 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12303 + ,simpleLowerCaseMapping:0x12303 + ,simpleTitleCaseMapping:0x12303 + }, + { code:0x12304 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12304 + ,simpleLowerCaseMapping:0x12304 + ,simpleTitleCaseMapping:0x12304 + }, + { code:0x12305 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12305 + ,simpleLowerCaseMapping:0x12305 + ,simpleTitleCaseMapping:0x12305 + }, + { code:0x12306 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12306 + ,simpleLowerCaseMapping:0x12306 + ,simpleTitleCaseMapping:0x12306 + }, + { code:0x12307 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12307 + ,simpleLowerCaseMapping:0x12307 + ,simpleTitleCaseMapping:0x12307 + }, + { code:0x12308 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12308 + ,simpleLowerCaseMapping:0x12308 + ,simpleTitleCaseMapping:0x12308 + }, + { code:0x12309 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12309 + ,simpleLowerCaseMapping:0x12309 + ,simpleTitleCaseMapping:0x12309 + }, + { code:0x1230A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1230A + ,simpleLowerCaseMapping:0x1230A + ,simpleTitleCaseMapping:0x1230A + }, + { code:0x1230B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1230B + ,simpleLowerCaseMapping:0x1230B + ,simpleTitleCaseMapping:0x1230B + }, + { code:0x1230C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1230C + ,simpleLowerCaseMapping:0x1230C + ,simpleTitleCaseMapping:0x1230C + }, + { code:0x1230D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1230D + ,simpleLowerCaseMapping:0x1230D + ,simpleTitleCaseMapping:0x1230D + }, + { code:0x1230E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1230E + ,simpleLowerCaseMapping:0x1230E + ,simpleTitleCaseMapping:0x1230E + }, + { code:0x1230F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1230F + ,simpleLowerCaseMapping:0x1230F + ,simpleTitleCaseMapping:0x1230F + }, + { code:0x12310 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12310 + ,simpleLowerCaseMapping:0x12310 + ,simpleTitleCaseMapping:0x12310 + }, + { code:0x12311 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12311 + ,simpleLowerCaseMapping:0x12311 + ,simpleTitleCaseMapping:0x12311 + }, + { code:0x12312 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12312 + ,simpleLowerCaseMapping:0x12312 + ,simpleTitleCaseMapping:0x12312 + }, + { code:0x12313 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12313 + ,simpleLowerCaseMapping:0x12313 + ,simpleTitleCaseMapping:0x12313 + }, + { code:0x12314 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12314 + ,simpleLowerCaseMapping:0x12314 + ,simpleTitleCaseMapping:0x12314 + }, + { code:0x12315 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12315 + ,simpleLowerCaseMapping:0x12315 + ,simpleTitleCaseMapping:0x12315 + }, + { code:0x12316 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12316 + ,simpleLowerCaseMapping:0x12316 + ,simpleTitleCaseMapping:0x12316 + }, + { code:0x12317 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12317 + ,simpleLowerCaseMapping:0x12317 + ,simpleTitleCaseMapping:0x12317 + }, + { code:0x12318 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12318 + ,simpleLowerCaseMapping:0x12318 + ,simpleTitleCaseMapping:0x12318 + }, + { code:0x12319 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12319 + ,simpleLowerCaseMapping:0x12319 + ,simpleTitleCaseMapping:0x12319 + }, + { code:0x1231A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1231A + ,simpleLowerCaseMapping:0x1231A + ,simpleTitleCaseMapping:0x1231A + }, + { code:0x1231B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1231B + ,simpleLowerCaseMapping:0x1231B + ,simpleTitleCaseMapping:0x1231B + }, + { code:0x1231C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1231C + ,simpleLowerCaseMapping:0x1231C + ,simpleTitleCaseMapping:0x1231C + }, + { code:0x1231D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1231D + ,simpleLowerCaseMapping:0x1231D + ,simpleTitleCaseMapping:0x1231D + }, + { code:0x1231E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1231E + ,simpleLowerCaseMapping:0x1231E + ,simpleTitleCaseMapping:0x1231E + }, + { code:0x1231F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1231F + ,simpleLowerCaseMapping:0x1231F + ,simpleTitleCaseMapping:0x1231F + }, + { code:0x12320 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12320 + ,simpleLowerCaseMapping:0x12320 + ,simpleTitleCaseMapping:0x12320 + }, + { code:0x12321 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12321 + ,simpleLowerCaseMapping:0x12321 + ,simpleTitleCaseMapping:0x12321 + }, + { code:0x12322 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12322 + ,simpleLowerCaseMapping:0x12322 + ,simpleTitleCaseMapping:0x12322 + }, + { code:0x12323 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12323 + ,simpleLowerCaseMapping:0x12323 + ,simpleTitleCaseMapping:0x12323 + }, + { code:0x12324 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12324 + ,simpleLowerCaseMapping:0x12324 + ,simpleTitleCaseMapping:0x12324 + }, + { code:0x12325 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12325 + ,simpleLowerCaseMapping:0x12325 + ,simpleTitleCaseMapping:0x12325 + }, + { code:0x12326 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12326 + ,simpleLowerCaseMapping:0x12326 + ,simpleTitleCaseMapping:0x12326 + }, + { code:0x12327 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12327 + ,simpleLowerCaseMapping:0x12327 + ,simpleTitleCaseMapping:0x12327 + }, + { code:0x12328 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12328 + ,simpleLowerCaseMapping:0x12328 + ,simpleTitleCaseMapping:0x12328 + }, + { code:0x12329 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12329 + ,simpleLowerCaseMapping:0x12329 + ,simpleTitleCaseMapping:0x12329 + }, + { code:0x1232A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1232A + ,simpleLowerCaseMapping:0x1232A + ,simpleTitleCaseMapping:0x1232A + }, + { code:0x1232B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1232B + ,simpleLowerCaseMapping:0x1232B + ,simpleTitleCaseMapping:0x1232B + }, + { code:0x1232C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1232C + ,simpleLowerCaseMapping:0x1232C + ,simpleTitleCaseMapping:0x1232C + }, + { code:0x1232D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1232D + ,simpleLowerCaseMapping:0x1232D + ,simpleTitleCaseMapping:0x1232D + }, + { code:0x1232E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1232E + ,simpleLowerCaseMapping:0x1232E + ,simpleTitleCaseMapping:0x1232E + }, + { code:0x1232F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1232F + ,simpleLowerCaseMapping:0x1232F + ,simpleTitleCaseMapping:0x1232F + }, + { code:0x12330 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12330 + ,simpleLowerCaseMapping:0x12330 + ,simpleTitleCaseMapping:0x12330 + }, + { code:0x12331 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12331 + ,simpleLowerCaseMapping:0x12331 + ,simpleTitleCaseMapping:0x12331 + }, + { code:0x12332 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12332 + ,simpleLowerCaseMapping:0x12332 + ,simpleTitleCaseMapping:0x12332 + }, + { code:0x12333 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12333 + ,simpleLowerCaseMapping:0x12333 + ,simpleTitleCaseMapping:0x12333 + }, + { code:0x12334 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12334 + ,simpleLowerCaseMapping:0x12334 + ,simpleTitleCaseMapping:0x12334 + }, + { code:0x12335 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12335 + ,simpleLowerCaseMapping:0x12335 + ,simpleTitleCaseMapping:0x12335 + }, + { code:0x12336 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12336 + ,simpleLowerCaseMapping:0x12336 + ,simpleTitleCaseMapping:0x12336 + }, + { code:0x12337 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12337 + ,simpleLowerCaseMapping:0x12337 + ,simpleTitleCaseMapping:0x12337 + }, + { code:0x12338 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12338 + ,simpleLowerCaseMapping:0x12338 + ,simpleTitleCaseMapping:0x12338 + }, + { code:0x12339 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12339 + ,simpleLowerCaseMapping:0x12339 + ,simpleTitleCaseMapping:0x12339 + }, + { code:0x1233A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1233A + ,simpleLowerCaseMapping:0x1233A + ,simpleTitleCaseMapping:0x1233A + }, + { code:0x1233B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1233B + ,simpleLowerCaseMapping:0x1233B + ,simpleTitleCaseMapping:0x1233B + }, + { code:0x1233C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1233C + ,simpleLowerCaseMapping:0x1233C + ,simpleTitleCaseMapping:0x1233C + }, + { code:0x1233D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1233D + ,simpleLowerCaseMapping:0x1233D + ,simpleTitleCaseMapping:0x1233D + }, + { code:0x1233E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1233E + ,simpleLowerCaseMapping:0x1233E + ,simpleTitleCaseMapping:0x1233E + }, + { code:0x1233F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1233F + ,simpleLowerCaseMapping:0x1233F + ,simpleTitleCaseMapping:0x1233F + }, + { code:0x12340 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12340 + ,simpleLowerCaseMapping:0x12340 + ,simpleTitleCaseMapping:0x12340 + }, + { code:0x12341 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12341 + ,simpleLowerCaseMapping:0x12341 + ,simpleTitleCaseMapping:0x12341 + }, + { code:0x12342 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12342 + ,simpleLowerCaseMapping:0x12342 + ,simpleTitleCaseMapping:0x12342 + }, + { code:0x12343 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12343 + ,simpleLowerCaseMapping:0x12343 + ,simpleTitleCaseMapping:0x12343 + }, + { code:0x12344 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12344 + ,simpleLowerCaseMapping:0x12344 + ,simpleTitleCaseMapping:0x12344 + }, + { code:0x12345 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12345 + ,simpleLowerCaseMapping:0x12345 + ,simpleTitleCaseMapping:0x12345 + }, + { code:0x12346 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12346 + ,simpleLowerCaseMapping:0x12346 + ,simpleTitleCaseMapping:0x12346 + }, + { code:0x12347 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12347 + ,simpleLowerCaseMapping:0x12347 + ,simpleTitleCaseMapping:0x12347 + }, + { code:0x12348 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12348 + ,simpleLowerCaseMapping:0x12348 + ,simpleTitleCaseMapping:0x12348 + }, + { code:0x12349 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12349 + ,simpleLowerCaseMapping:0x12349 + ,simpleTitleCaseMapping:0x12349 + }, + { code:0x1234A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1234A + ,simpleLowerCaseMapping:0x1234A + ,simpleTitleCaseMapping:0x1234A + }, + { code:0x1234B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1234B + ,simpleLowerCaseMapping:0x1234B + ,simpleTitleCaseMapping:0x1234B + }, + { code:0x1234C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1234C + ,simpleLowerCaseMapping:0x1234C + ,simpleTitleCaseMapping:0x1234C + }, + { code:0x1234D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1234D + ,simpleLowerCaseMapping:0x1234D + ,simpleTitleCaseMapping:0x1234D + }, + { code:0x1234E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1234E + ,simpleLowerCaseMapping:0x1234E + ,simpleTitleCaseMapping:0x1234E + }, + { code:0x1234F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1234F + ,simpleLowerCaseMapping:0x1234F + ,simpleTitleCaseMapping:0x1234F + }, + { code:0x12350 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12350 + ,simpleLowerCaseMapping:0x12350 + ,simpleTitleCaseMapping:0x12350 + }, + { code:0x12351 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12351 + ,simpleLowerCaseMapping:0x12351 + ,simpleTitleCaseMapping:0x12351 + }, + { code:0x12352 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12352 + ,simpleLowerCaseMapping:0x12352 + ,simpleTitleCaseMapping:0x12352 + }, + { code:0x12353 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12353 + ,simpleLowerCaseMapping:0x12353 + ,simpleTitleCaseMapping:0x12353 + }, + { code:0x12354 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12354 + ,simpleLowerCaseMapping:0x12354 + ,simpleTitleCaseMapping:0x12354 + }, + { code:0x12355 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12355 + ,simpleLowerCaseMapping:0x12355 + ,simpleTitleCaseMapping:0x12355 + }, + { code:0x12356 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12356 + ,simpleLowerCaseMapping:0x12356 + ,simpleTitleCaseMapping:0x12356 + }, + { code:0x12357 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12357 + ,simpleLowerCaseMapping:0x12357 + ,simpleTitleCaseMapping:0x12357 + }, + { code:0x12358 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12358 + ,simpleLowerCaseMapping:0x12358 + ,simpleTitleCaseMapping:0x12358 + }, + { code:0x12359 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12359 + ,simpleLowerCaseMapping:0x12359 + ,simpleTitleCaseMapping:0x12359 + }, + { code:0x1235A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1235A + ,simpleLowerCaseMapping:0x1235A + ,simpleTitleCaseMapping:0x1235A + }, + { code:0x1235B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1235B + ,simpleLowerCaseMapping:0x1235B + ,simpleTitleCaseMapping:0x1235B + }, + { code:0x1235C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1235C + ,simpleLowerCaseMapping:0x1235C + ,simpleTitleCaseMapping:0x1235C + }, + { code:0x1235D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1235D + ,simpleLowerCaseMapping:0x1235D + ,simpleTitleCaseMapping:0x1235D + }, + { code:0x1235E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1235E + ,simpleLowerCaseMapping:0x1235E + ,simpleTitleCaseMapping:0x1235E + }, + { code:0x1235F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1235F + ,simpleLowerCaseMapping:0x1235F + ,simpleTitleCaseMapping:0x1235F + }, + { code:0x12360 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12360 + ,simpleLowerCaseMapping:0x12360 + ,simpleTitleCaseMapping:0x12360 + }, + { code:0x12361 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12361 + ,simpleLowerCaseMapping:0x12361 + ,simpleTitleCaseMapping:0x12361 + }, + { code:0x12362 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12362 + ,simpleLowerCaseMapping:0x12362 + ,simpleTitleCaseMapping:0x12362 + }, + { code:0x12363 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12363 + ,simpleLowerCaseMapping:0x12363 + ,simpleTitleCaseMapping:0x12363 + }, + { code:0x12364 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12364 + ,simpleLowerCaseMapping:0x12364 + ,simpleTitleCaseMapping:0x12364 + }, + { code:0x12365 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12365 + ,simpleLowerCaseMapping:0x12365 + ,simpleTitleCaseMapping:0x12365 + }, + { code:0x12366 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12366 + ,simpleLowerCaseMapping:0x12366 + ,simpleTitleCaseMapping:0x12366 + }, + { code:0x12367 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12367 + ,simpleLowerCaseMapping:0x12367 + ,simpleTitleCaseMapping:0x12367 + }, + { code:0x12368 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12368 + ,simpleLowerCaseMapping:0x12368 + ,simpleTitleCaseMapping:0x12368 + }, + { code:0x12369 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x12369 + ,simpleLowerCaseMapping:0x12369 + ,simpleTitleCaseMapping:0x12369 + }, + { code:0x1236A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1236A + ,simpleLowerCaseMapping:0x1236A + ,simpleTitleCaseMapping:0x1236A + }, + { code:0x1236B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1236B + ,simpleLowerCaseMapping:0x1236B + ,simpleTitleCaseMapping:0x1236B + }, + { code:0x1236C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1236C + ,simpleLowerCaseMapping:0x1236C + ,simpleTitleCaseMapping:0x1236C + }, + { code:0x1236D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1236D + ,simpleLowerCaseMapping:0x1236D + ,simpleTitleCaseMapping:0x1236D + }, + { code:0x1236E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x1236E + ,simpleLowerCaseMapping:0x1236E + ,simpleTitleCaseMapping:0x1236E + }, + { code:0x12400 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12400 + ,simpleLowerCaseMapping:0x12400 + ,simpleTitleCaseMapping:0x12400 + }, + { code:0x12401 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12401 + ,simpleLowerCaseMapping:0x12401 + ,simpleTitleCaseMapping:0x12401 + }, + { code:0x12402 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12402 + ,simpleLowerCaseMapping:0x12402 + ,simpleTitleCaseMapping:0x12402 + }, + { code:0x12403 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12403 + ,simpleLowerCaseMapping:0x12403 + ,simpleTitleCaseMapping:0x12403 + }, + { code:0x12404 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12404 + ,simpleLowerCaseMapping:0x12404 + ,simpleTitleCaseMapping:0x12404 + }, + { code:0x12405 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12405 + ,simpleLowerCaseMapping:0x12405 + ,simpleTitleCaseMapping:0x12405 + }, + { code:0x12406 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12406 + ,simpleLowerCaseMapping:0x12406 + ,simpleTitleCaseMapping:0x12406 + }, + { code:0x12407 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12407 + ,simpleLowerCaseMapping:0x12407 + ,simpleTitleCaseMapping:0x12407 + }, + { code:0x12408 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12408 + ,simpleLowerCaseMapping:0x12408 + ,simpleTitleCaseMapping:0x12408 + }, + { code:0x12409 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12409 + ,simpleLowerCaseMapping:0x12409 + ,simpleTitleCaseMapping:0x12409 + }, + { code:0x1240A + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1240A + ,simpleLowerCaseMapping:0x1240A + ,simpleTitleCaseMapping:0x1240A + }, + { code:0x1240B + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1240B + ,simpleLowerCaseMapping:0x1240B + ,simpleTitleCaseMapping:0x1240B + }, + { code:0x1240C + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1240C + ,simpleLowerCaseMapping:0x1240C + ,simpleTitleCaseMapping:0x1240C + }, + { code:0x1240D + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1240D + ,simpleLowerCaseMapping:0x1240D + ,simpleTitleCaseMapping:0x1240D + }, + { code:0x1240E + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1240E + ,simpleLowerCaseMapping:0x1240E + ,simpleTitleCaseMapping:0x1240E + }, + { code:0x1240F + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1240F + ,simpleLowerCaseMapping:0x1240F + ,simpleTitleCaseMapping:0x1240F + }, + { code:0x12410 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12410 + ,simpleLowerCaseMapping:0x12410 + ,simpleTitleCaseMapping:0x12410 + }, + { code:0x12411 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12411 + ,simpleLowerCaseMapping:0x12411 + ,simpleTitleCaseMapping:0x12411 + }, + { code:0x12412 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12412 + ,simpleLowerCaseMapping:0x12412 + ,simpleTitleCaseMapping:0x12412 + }, + { code:0x12413 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12413 + ,simpleLowerCaseMapping:0x12413 + ,simpleTitleCaseMapping:0x12413 + }, + { code:0x12414 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12414 + ,simpleLowerCaseMapping:0x12414 + ,simpleTitleCaseMapping:0x12414 + }, + { code:0x12415 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12415 + ,simpleLowerCaseMapping:0x12415 + ,simpleTitleCaseMapping:0x12415 + }, + { code:0x12416 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12416 + ,simpleLowerCaseMapping:0x12416 + ,simpleTitleCaseMapping:0x12416 + }, + { code:0x12417 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12417 + ,simpleLowerCaseMapping:0x12417 + ,simpleTitleCaseMapping:0x12417 + }, + { code:0x12418 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12418 + ,simpleLowerCaseMapping:0x12418 + ,simpleTitleCaseMapping:0x12418 + }, + { code:0x12419 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12419 + ,simpleLowerCaseMapping:0x12419 + ,simpleTitleCaseMapping:0x12419 + }, + { code:0x1241A + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1241A + ,simpleLowerCaseMapping:0x1241A + ,simpleTitleCaseMapping:0x1241A + }, + { code:0x1241B + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1241B + ,simpleLowerCaseMapping:0x1241B + ,simpleTitleCaseMapping:0x1241B + }, + { code:0x1241C + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1241C + ,simpleLowerCaseMapping:0x1241C + ,simpleTitleCaseMapping:0x1241C + }, + { code:0x1241D + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1241D + ,simpleLowerCaseMapping:0x1241D + ,simpleTitleCaseMapping:0x1241D + }, + { code:0x1241E + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1241E + ,simpleLowerCaseMapping:0x1241E + ,simpleTitleCaseMapping:0x1241E + }, + { code:0x1241F + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1241F + ,simpleLowerCaseMapping:0x1241F + ,simpleTitleCaseMapping:0x1241F + }, + { code:0x12420 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12420 + ,simpleLowerCaseMapping:0x12420 + ,simpleTitleCaseMapping:0x12420 + }, + { code:0x12421 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12421 + ,simpleLowerCaseMapping:0x12421 + ,simpleTitleCaseMapping:0x12421 + }, + { code:0x12422 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12422 + ,simpleLowerCaseMapping:0x12422 + ,simpleTitleCaseMapping:0x12422 + }, + { code:0x12423 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12423 + ,simpleLowerCaseMapping:0x12423 + ,simpleTitleCaseMapping:0x12423 + }, + { code:0x12424 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12424 + ,simpleLowerCaseMapping:0x12424 + ,simpleTitleCaseMapping:0x12424 + }, + { code:0x12425 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12425 + ,simpleLowerCaseMapping:0x12425 + ,simpleTitleCaseMapping:0x12425 + }, + { code:0x12426 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12426 + ,simpleLowerCaseMapping:0x12426 + ,simpleTitleCaseMapping:0x12426 + }, + { code:0x12427 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12427 + ,simpleLowerCaseMapping:0x12427 + ,simpleTitleCaseMapping:0x12427 + }, + { code:0x12428 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12428 + ,simpleLowerCaseMapping:0x12428 + ,simpleTitleCaseMapping:0x12428 + }, + { code:0x12429 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12429 + ,simpleLowerCaseMapping:0x12429 + ,simpleTitleCaseMapping:0x12429 + }, + { code:0x1242A + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1242A + ,simpleLowerCaseMapping:0x1242A + ,simpleTitleCaseMapping:0x1242A + }, + { code:0x1242B + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1242B + ,simpleLowerCaseMapping:0x1242B + ,simpleTitleCaseMapping:0x1242B + }, + { code:0x1242C + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1242C + ,simpleLowerCaseMapping:0x1242C + ,simpleTitleCaseMapping:0x1242C + }, + { code:0x1242D + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1242D + ,simpleLowerCaseMapping:0x1242D + ,simpleTitleCaseMapping:0x1242D + }, + { code:0x1242E + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1242E + ,simpleLowerCaseMapping:0x1242E + ,simpleTitleCaseMapping:0x1242E + }, + { code:0x1242F + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1242F + ,simpleLowerCaseMapping:0x1242F + ,simpleTitleCaseMapping:0x1242F + }, + { code:0x12430 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12430 + ,simpleLowerCaseMapping:0x12430 + ,simpleTitleCaseMapping:0x12430 + }, + { code:0x12431 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12431 + ,simpleLowerCaseMapping:0x12431 + ,simpleTitleCaseMapping:0x12431 + }, + { code:0x12432 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12432 + ,simpleLowerCaseMapping:0x12432 + ,simpleTitleCaseMapping:0x12432 + }, + { code:0x12433 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12433 + ,simpleLowerCaseMapping:0x12433 + ,simpleTitleCaseMapping:0x12433 + }, + { code:0x12434 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12434 + ,simpleLowerCaseMapping:0x12434 + ,simpleTitleCaseMapping:0x12434 + }, + { code:0x12435 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12435 + ,simpleLowerCaseMapping:0x12435 + ,simpleTitleCaseMapping:0x12435 + }, + { code:0x12436 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12436 + ,simpleLowerCaseMapping:0x12436 + ,simpleTitleCaseMapping:0x12436 + }, + { code:0x12437 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12437 + ,simpleLowerCaseMapping:0x12437 + ,simpleTitleCaseMapping:0x12437 + }, + { code:0x12438 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12438 + ,simpleLowerCaseMapping:0x12438 + ,simpleTitleCaseMapping:0x12438 + }, + { code:0x12439 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12439 + ,simpleLowerCaseMapping:0x12439 + ,simpleTitleCaseMapping:0x12439 + }, + { code:0x1243A + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1243A + ,simpleLowerCaseMapping:0x1243A + ,simpleTitleCaseMapping:0x1243A + }, + { code:0x1243B + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1243B + ,simpleLowerCaseMapping:0x1243B + ,simpleTitleCaseMapping:0x1243B + }, + { code:0x1243C + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1243C + ,simpleLowerCaseMapping:0x1243C + ,simpleTitleCaseMapping:0x1243C + }, + { code:0x1243D + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1243D + ,simpleLowerCaseMapping:0x1243D + ,simpleTitleCaseMapping:0x1243D + }, + { code:0x1243E + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1243E + ,simpleLowerCaseMapping:0x1243E + ,simpleTitleCaseMapping:0x1243E + }, + { code:0x1243F + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1243F + ,simpleLowerCaseMapping:0x1243F + ,simpleTitleCaseMapping:0x1243F + }, + { code:0x12440 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12440 + ,simpleLowerCaseMapping:0x12440 + ,simpleTitleCaseMapping:0x12440 + }, + { code:0x12441 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12441 + ,simpleLowerCaseMapping:0x12441 + ,simpleTitleCaseMapping:0x12441 + }, + { code:0x12442 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12442 + ,simpleLowerCaseMapping:0x12442 + ,simpleTitleCaseMapping:0x12442 + }, + { code:0x12443 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12443 + ,simpleLowerCaseMapping:0x12443 + ,simpleTitleCaseMapping:0x12443 + }, + { code:0x12444 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12444 + ,simpleLowerCaseMapping:0x12444 + ,simpleTitleCaseMapping:0x12444 + }, + { code:0x12445 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12445 + ,simpleLowerCaseMapping:0x12445 + ,simpleTitleCaseMapping:0x12445 + }, + { code:0x12446 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12446 + ,simpleLowerCaseMapping:0x12446 + ,simpleTitleCaseMapping:0x12446 + }, + { code:0x12447 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12447 + ,simpleLowerCaseMapping:0x12447 + ,simpleTitleCaseMapping:0x12447 + }, + { code:0x12448 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12448 + ,simpleLowerCaseMapping:0x12448 + ,simpleTitleCaseMapping:0x12448 + }, + { code:0x12449 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12449 + ,simpleLowerCaseMapping:0x12449 + ,simpleTitleCaseMapping:0x12449 + }, + { code:0x1244A + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1244A + ,simpleLowerCaseMapping:0x1244A + ,simpleTitleCaseMapping:0x1244A + }, + { code:0x1244B + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1244B + ,simpleLowerCaseMapping:0x1244B + ,simpleTitleCaseMapping:0x1244B + }, + { code:0x1244C + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1244C + ,simpleLowerCaseMapping:0x1244C + ,simpleTitleCaseMapping:0x1244C + }, + { code:0x1244D + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1244D + ,simpleLowerCaseMapping:0x1244D + ,simpleTitleCaseMapping:0x1244D + }, + { code:0x1244E + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1244E + ,simpleLowerCaseMapping:0x1244E + ,simpleTitleCaseMapping:0x1244E + }, + { code:0x1244F + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1244F + ,simpleLowerCaseMapping:0x1244F + ,simpleTitleCaseMapping:0x1244F + }, + { code:0x12450 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12450 + ,simpleLowerCaseMapping:0x12450 + ,simpleTitleCaseMapping:0x12450 + }, + { code:0x12451 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12451 + ,simpleLowerCaseMapping:0x12451 + ,simpleTitleCaseMapping:0x12451 + }, + { code:0x12452 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12452 + ,simpleLowerCaseMapping:0x12452 + ,simpleTitleCaseMapping:0x12452 + }, + { code:0x12453 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12453 + ,simpleLowerCaseMapping:0x12453 + ,simpleTitleCaseMapping:0x12453 + }, + { code:0x12454 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12454 + ,simpleLowerCaseMapping:0x12454 + ,simpleTitleCaseMapping:0x12454 + }, + { code:0x12455 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12455 + ,simpleLowerCaseMapping:0x12455 + ,simpleTitleCaseMapping:0x12455 + }, + { code:0x12456 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12456 + ,simpleLowerCaseMapping:0x12456 + ,simpleTitleCaseMapping:0x12456 + }, + { code:0x12457 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12457 + ,simpleLowerCaseMapping:0x12457 + ,simpleTitleCaseMapping:0x12457 + }, + { code:0x12458 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12458 + ,simpleLowerCaseMapping:0x12458 + ,simpleTitleCaseMapping:0x12458 + }, + { code:0x12459 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12459 + ,simpleLowerCaseMapping:0x12459 + ,simpleTitleCaseMapping:0x12459 + }, + { code:0x1245A + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1245A + ,simpleLowerCaseMapping:0x1245A + ,simpleTitleCaseMapping:0x1245A + }, + { code:0x1245B + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1245B + ,simpleLowerCaseMapping:0x1245B + ,simpleTitleCaseMapping:0x1245B + }, + { code:0x1245C + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1245C + ,simpleLowerCaseMapping:0x1245C + ,simpleTitleCaseMapping:0x1245C + }, + { code:0x1245D + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1245D + ,simpleLowerCaseMapping:0x1245D + ,simpleTitleCaseMapping:0x1245D + }, + { code:0x1245E + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1245E + ,simpleLowerCaseMapping:0x1245E + ,simpleTitleCaseMapping:0x1245E + }, + { code:0x1245F + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x1245F + ,simpleLowerCaseMapping:0x1245F + ,simpleTitleCaseMapping:0x1245F + }, + { code:0x12460 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12460 + ,simpleLowerCaseMapping:0x12460 + ,simpleTitleCaseMapping:0x12460 + }, + { code:0x12461 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12461 + ,simpleLowerCaseMapping:0x12461 + ,simpleTitleCaseMapping:0x12461 + }, + { code:0x12462 + ,generalCategory:UnicodeData.GeneralCategory.Nl + ,simpleUpperCaseMapping:0x12462 + ,simpleLowerCaseMapping:0x12462 + ,simpleTitleCaseMapping:0x12462 + }, + { code:0x12470 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x12470 + ,simpleLowerCaseMapping:0x12470 + ,simpleTitleCaseMapping:0x12470 + }, + { code:0x12471 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x12471 + ,simpleLowerCaseMapping:0x12471 + ,simpleTitleCaseMapping:0x12471 + }, + { code:0x12472 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x12472 + ,simpleLowerCaseMapping:0x12472 + ,simpleTitleCaseMapping:0x12472 + }, + { code:0x12473 + ,generalCategory:UnicodeData.GeneralCategory.Po + ,simpleUpperCaseMapping:0x12473 + ,simpleLowerCaseMapping:0x12473 + ,simpleTitleCaseMapping:0x12473 + }, + { code:0x1D000 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D000 + ,simpleLowerCaseMapping:0x1D000 + ,simpleTitleCaseMapping:0x1D000 + }, + { code:0x1D001 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D001 + ,simpleLowerCaseMapping:0x1D001 + ,simpleTitleCaseMapping:0x1D001 + }, + { code:0x1D002 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D002 + ,simpleLowerCaseMapping:0x1D002 + ,simpleTitleCaseMapping:0x1D002 + }, + { code:0x1D003 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D003 + ,simpleLowerCaseMapping:0x1D003 + ,simpleTitleCaseMapping:0x1D003 + }, + { code:0x1D004 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D004 + ,simpleLowerCaseMapping:0x1D004 + ,simpleTitleCaseMapping:0x1D004 + }, + { code:0x1D005 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D005 + ,simpleLowerCaseMapping:0x1D005 + ,simpleTitleCaseMapping:0x1D005 + }, + { code:0x1D006 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D006 + ,simpleLowerCaseMapping:0x1D006 + ,simpleTitleCaseMapping:0x1D006 + }, + { code:0x1D007 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D007 + ,simpleLowerCaseMapping:0x1D007 + ,simpleTitleCaseMapping:0x1D007 + }, + { code:0x1D008 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D008 + ,simpleLowerCaseMapping:0x1D008 + ,simpleTitleCaseMapping:0x1D008 + }, + { code:0x1D009 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D009 + ,simpleLowerCaseMapping:0x1D009 + ,simpleTitleCaseMapping:0x1D009 + }, + { code:0x1D00A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D00A + ,simpleLowerCaseMapping:0x1D00A + ,simpleTitleCaseMapping:0x1D00A + }, + { code:0x1D00B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D00B + ,simpleLowerCaseMapping:0x1D00B + ,simpleTitleCaseMapping:0x1D00B + }, + { code:0x1D00C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D00C + ,simpleLowerCaseMapping:0x1D00C + ,simpleTitleCaseMapping:0x1D00C + }, + { code:0x1D00D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D00D + ,simpleLowerCaseMapping:0x1D00D + ,simpleTitleCaseMapping:0x1D00D + }, + { code:0x1D00E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D00E + ,simpleLowerCaseMapping:0x1D00E + ,simpleTitleCaseMapping:0x1D00E + }, + { code:0x1D00F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D00F + ,simpleLowerCaseMapping:0x1D00F + ,simpleTitleCaseMapping:0x1D00F + }, + { code:0x1D010 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D010 + ,simpleLowerCaseMapping:0x1D010 + ,simpleTitleCaseMapping:0x1D010 + }, + { code:0x1D011 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D011 + ,simpleLowerCaseMapping:0x1D011 + ,simpleTitleCaseMapping:0x1D011 + }, + { code:0x1D012 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D012 + ,simpleLowerCaseMapping:0x1D012 + ,simpleTitleCaseMapping:0x1D012 + }, + { code:0x1D013 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D013 + ,simpleLowerCaseMapping:0x1D013 + ,simpleTitleCaseMapping:0x1D013 + }, + { code:0x1D014 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D014 + ,simpleLowerCaseMapping:0x1D014 + ,simpleTitleCaseMapping:0x1D014 + }, + { code:0x1D015 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D015 + ,simpleLowerCaseMapping:0x1D015 + ,simpleTitleCaseMapping:0x1D015 + }, + { code:0x1D016 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D016 + ,simpleLowerCaseMapping:0x1D016 + ,simpleTitleCaseMapping:0x1D016 + }, + { code:0x1D017 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D017 + ,simpleLowerCaseMapping:0x1D017 + ,simpleTitleCaseMapping:0x1D017 + }, + { code:0x1D018 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D018 + ,simpleLowerCaseMapping:0x1D018 + ,simpleTitleCaseMapping:0x1D018 + }, + { code:0x1D019 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D019 + ,simpleLowerCaseMapping:0x1D019 + ,simpleTitleCaseMapping:0x1D019 + }, + { code:0x1D01A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D01A + ,simpleLowerCaseMapping:0x1D01A + ,simpleTitleCaseMapping:0x1D01A + }, + { code:0x1D01B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D01B + ,simpleLowerCaseMapping:0x1D01B + ,simpleTitleCaseMapping:0x1D01B + }, + { code:0x1D01C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D01C + ,simpleLowerCaseMapping:0x1D01C + ,simpleTitleCaseMapping:0x1D01C + }, + { code:0x1D01D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D01D + ,simpleLowerCaseMapping:0x1D01D + ,simpleTitleCaseMapping:0x1D01D + }, + { code:0x1D01E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D01E + ,simpleLowerCaseMapping:0x1D01E + ,simpleTitleCaseMapping:0x1D01E + }, + { code:0x1D01F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D01F + ,simpleLowerCaseMapping:0x1D01F + ,simpleTitleCaseMapping:0x1D01F + }, + { code:0x1D020 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D020 + ,simpleLowerCaseMapping:0x1D020 + ,simpleTitleCaseMapping:0x1D020 + }, + { code:0x1D021 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D021 + ,simpleLowerCaseMapping:0x1D021 + ,simpleTitleCaseMapping:0x1D021 + }, + { code:0x1D022 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D022 + ,simpleLowerCaseMapping:0x1D022 + ,simpleTitleCaseMapping:0x1D022 + }, + { code:0x1D023 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D023 + ,simpleLowerCaseMapping:0x1D023 + ,simpleTitleCaseMapping:0x1D023 + }, + { code:0x1D024 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D024 + ,simpleLowerCaseMapping:0x1D024 + ,simpleTitleCaseMapping:0x1D024 + }, + { code:0x1D025 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D025 + ,simpleLowerCaseMapping:0x1D025 + ,simpleTitleCaseMapping:0x1D025 + }, + { code:0x1D026 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D026 + ,simpleLowerCaseMapping:0x1D026 + ,simpleTitleCaseMapping:0x1D026 + }, + { code:0x1D027 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D027 + ,simpleLowerCaseMapping:0x1D027 + ,simpleTitleCaseMapping:0x1D027 + }, + { code:0x1D028 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D028 + ,simpleLowerCaseMapping:0x1D028 + ,simpleTitleCaseMapping:0x1D028 + }, + { code:0x1D029 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D029 + ,simpleLowerCaseMapping:0x1D029 + ,simpleTitleCaseMapping:0x1D029 + }, + { code:0x1D02A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D02A + ,simpleLowerCaseMapping:0x1D02A + ,simpleTitleCaseMapping:0x1D02A + }, + { code:0x1D02B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D02B + ,simpleLowerCaseMapping:0x1D02B + ,simpleTitleCaseMapping:0x1D02B + }, + { code:0x1D02C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D02C + ,simpleLowerCaseMapping:0x1D02C + ,simpleTitleCaseMapping:0x1D02C + }, + { code:0x1D02D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D02D + ,simpleLowerCaseMapping:0x1D02D + ,simpleTitleCaseMapping:0x1D02D + }, + { code:0x1D02E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D02E + ,simpleLowerCaseMapping:0x1D02E + ,simpleTitleCaseMapping:0x1D02E + }, + { code:0x1D02F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D02F + ,simpleLowerCaseMapping:0x1D02F + ,simpleTitleCaseMapping:0x1D02F + }, + { code:0x1D030 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D030 + ,simpleLowerCaseMapping:0x1D030 + ,simpleTitleCaseMapping:0x1D030 + }, + { code:0x1D031 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D031 + ,simpleLowerCaseMapping:0x1D031 + ,simpleTitleCaseMapping:0x1D031 + }, + { code:0x1D032 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D032 + ,simpleLowerCaseMapping:0x1D032 + ,simpleTitleCaseMapping:0x1D032 + }, + { code:0x1D033 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D033 + ,simpleLowerCaseMapping:0x1D033 + ,simpleTitleCaseMapping:0x1D033 + }, + { code:0x1D034 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D034 + ,simpleLowerCaseMapping:0x1D034 + ,simpleTitleCaseMapping:0x1D034 + }, + { code:0x1D035 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D035 + ,simpleLowerCaseMapping:0x1D035 + ,simpleTitleCaseMapping:0x1D035 + }, + { code:0x1D036 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D036 + ,simpleLowerCaseMapping:0x1D036 + ,simpleTitleCaseMapping:0x1D036 + }, + { code:0x1D037 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D037 + ,simpleLowerCaseMapping:0x1D037 + ,simpleTitleCaseMapping:0x1D037 + }, + { code:0x1D038 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D038 + ,simpleLowerCaseMapping:0x1D038 + ,simpleTitleCaseMapping:0x1D038 + }, + { code:0x1D039 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D039 + ,simpleLowerCaseMapping:0x1D039 + ,simpleTitleCaseMapping:0x1D039 + }, + { code:0x1D03A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D03A + ,simpleLowerCaseMapping:0x1D03A + ,simpleTitleCaseMapping:0x1D03A + }, + { code:0x1D03B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D03B + ,simpleLowerCaseMapping:0x1D03B + ,simpleTitleCaseMapping:0x1D03B + }, + { code:0x1D03C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D03C + ,simpleLowerCaseMapping:0x1D03C + ,simpleTitleCaseMapping:0x1D03C + }, + { code:0x1D03D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D03D + ,simpleLowerCaseMapping:0x1D03D + ,simpleTitleCaseMapping:0x1D03D + }, + { code:0x1D03E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D03E + ,simpleLowerCaseMapping:0x1D03E + ,simpleTitleCaseMapping:0x1D03E + }, + { code:0x1D03F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D03F + ,simpleLowerCaseMapping:0x1D03F + ,simpleTitleCaseMapping:0x1D03F + }, + { code:0x1D040 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D040 + ,simpleLowerCaseMapping:0x1D040 + ,simpleTitleCaseMapping:0x1D040 + }, + { code:0x1D041 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D041 + ,simpleLowerCaseMapping:0x1D041 + ,simpleTitleCaseMapping:0x1D041 + }, + { code:0x1D042 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D042 + ,simpleLowerCaseMapping:0x1D042 + ,simpleTitleCaseMapping:0x1D042 + }, + { code:0x1D043 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D043 + ,simpleLowerCaseMapping:0x1D043 + ,simpleTitleCaseMapping:0x1D043 + }, + { code:0x1D044 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D044 + ,simpleLowerCaseMapping:0x1D044 + ,simpleTitleCaseMapping:0x1D044 + }, + { code:0x1D045 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D045 + ,simpleLowerCaseMapping:0x1D045 + ,simpleTitleCaseMapping:0x1D045 + }, + { code:0x1D046 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D046 + ,simpleLowerCaseMapping:0x1D046 + ,simpleTitleCaseMapping:0x1D046 + }, + { code:0x1D047 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D047 + ,simpleLowerCaseMapping:0x1D047 + ,simpleTitleCaseMapping:0x1D047 + }, + { code:0x1D048 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D048 + ,simpleLowerCaseMapping:0x1D048 + ,simpleTitleCaseMapping:0x1D048 + }, + { code:0x1D049 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D049 + ,simpleLowerCaseMapping:0x1D049 + ,simpleTitleCaseMapping:0x1D049 + }, + { code:0x1D04A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D04A + ,simpleLowerCaseMapping:0x1D04A + ,simpleTitleCaseMapping:0x1D04A + }, + { code:0x1D04B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D04B + ,simpleLowerCaseMapping:0x1D04B + ,simpleTitleCaseMapping:0x1D04B + }, + { code:0x1D04C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D04C + ,simpleLowerCaseMapping:0x1D04C + ,simpleTitleCaseMapping:0x1D04C + }, + { code:0x1D04D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D04D + ,simpleLowerCaseMapping:0x1D04D + ,simpleTitleCaseMapping:0x1D04D + }, + { code:0x1D04E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D04E + ,simpleLowerCaseMapping:0x1D04E + ,simpleTitleCaseMapping:0x1D04E + }, + { code:0x1D04F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D04F + ,simpleLowerCaseMapping:0x1D04F + ,simpleTitleCaseMapping:0x1D04F + }, + { code:0x1D050 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D050 + ,simpleLowerCaseMapping:0x1D050 + ,simpleTitleCaseMapping:0x1D050 + }, + { code:0x1D051 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D051 + ,simpleLowerCaseMapping:0x1D051 + ,simpleTitleCaseMapping:0x1D051 + }, + { code:0x1D052 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D052 + ,simpleLowerCaseMapping:0x1D052 + ,simpleTitleCaseMapping:0x1D052 + }, + { code:0x1D053 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D053 + ,simpleLowerCaseMapping:0x1D053 + ,simpleTitleCaseMapping:0x1D053 + }, + { code:0x1D054 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D054 + ,simpleLowerCaseMapping:0x1D054 + ,simpleTitleCaseMapping:0x1D054 + }, + { code:0x1D055 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D055 + ,simpleLowerCaseMapping:0x1D055 + ,simpleTitleCaseMapping:0x1D055 + }, + { code:0x1D056 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D056 + ,simpleLowerCaseMapping:0x1D056 + ,simpleTitleCaseMapping:0x1D056 + }, + { code:0x1D057 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D057 + ,simpleLowerCaseMapping:0x1D057 + ,simpleTitleCaseMapping:0x1D057 + }, + { code:0x1D058 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D058 + ,simpleLowerCaseMapping:0x1D058 + ,simpleTitleCaseMapping:0x1D058 + }, + { code:0x1D059 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D059 + ,simpleLowerCaseMapping:0x1D059 + ,simpleTitleCaseMapping:0x1D059 + }, + { code:0x1D05A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D05A + ,simpleLowerCaseMapping:0x1D05A + ,simpleTitleCaseMapping:0x1D05A + }, + { code:0x1D05B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D05B + ,simpleLowerCaseMapping:0x1D05B + ,simpleTitleCaseMapping:0x1D05B + }, + { code:0x1D05C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D05C + ,simpleLowerCaseMapping:0x1D05C + ,simpleTitleCaseMapping:0x1D05C + }, + { code:0x1D05D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D05D + ,simpleLowerCaseMapping:0x1D05D + ,simpleTitleCaseMapping:0x1D05D + }, + { code:0x1D05E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D05E + ,simpleLowerCaseMapping:0x1D05E + ,simpleTitleCaseMapping:0x1D05E + }, + { code:0x1D05F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D05F + ,simpleLowerCaseMapping:0x1D05F + ,simpleTitleCaseMapping:0x1D05F + }, + { code:0x1D060 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D060 + ,simpleLowerCaseMapping:0x1D060 + ,simpleTitleCaseMapping:0x1D060 + }, + { code:0x1D061 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D061 + ,simpleLowerCaseMapping:0x1D061 + ,simpleTitleCaseMapping:0x1D061 + }, + { code:0x1D062 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D062 + ,simpleLowerCaseMapping:0x1D062 + ,simpleTitleCaseMapping:0x1D062 + }, + { code:0x1D063 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D063 + ,simpleLowerCaseMapping:0x1D063 + ,simpleTitleCaseMapping:0x1D063 + }, + { code:0x1D064 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D064 + ,simpleLowerCaseMapping:0x1D064 + ,simpleTitleCaseMapping:0x1D064 + }, + { code:0x1D065 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D065 + ,simpleLowerCaseMapping:0x1D065 + ,simpleTitleCaseMapping:0x1D065 + }, + { code:0x1D066 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D066 + ,simpleLowerCaseMapping:0x1D066 + ,simpleTitleCaseMapping:0x1D066 + }, + { code:0x1D067 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D067 + ,simpleLowerCaseMapping:0x1D067 + ,simpleTitleCaseMapping:0x1D067 + }, + { code:0x1D068 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D068 + ,simpleLowerCaseMapping:0x1D068 + ,simpleTitleCaseMapping:0x1D068 + }, + { code:0x1D069 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D069 + ,simpleLowerCaseMapping:0x1D069 + ,simpleTitleCaseMapping:0x1D069 + }, + { code:0x1D06A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D06A + ,simpleLowerCaseMapping:0x1D06A + ,simpleTitleCaseMapping:0x1D06A + }, + { code:0x1D06B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D06B + ,simpleLowerCaseMapping:0x1D06B + ,simpleTitleCaseMapping:0x1D06B + }, + { code:0x1D06C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D06C + ,simpleLowerCaseMapping:0x1D06C + ,simpleTitleCaseMapping:0x1D06C + }, + { code:0x1D06D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D06D + ,simpleLowerCaseMapping:0x1D06D + ,simpleTitleCaseMapping:0x1D06D + }, + { code:0x1D06E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D06E + ,simpleLowerCaseMapping:0x1D06E + ,simpleTitleCaseMapping:0x1D06E + }, + { code:0x1D06F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D06F + ,simpleLowerCaseMapping:0x1D06F + ,simpleTitleCaseMapping:0x1D06F + }, + { code:0x1D070 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D070 + ,simpleLowerCaseMapping:0x1D070 + ,simpleTitleCaseMapping:0x1D070 + }, + { code:0x1D071 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D071 + ,simpleLowerCaseMapping:0x1D071 + ,simpleTitleCaseMapping:0x1D071 + }, + { code:0x1D072 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D072 + ,simpleLowerCaseMapping:0x1D072 + ,simpleTitleCaseMapping:0x1D072 + }, + { code:0x1D073 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D073 + ,simpleLowerCaseMapping:0x1D073 + ,simpleTitleCaseMapping:0x1D073 + }, + { code:0x1D074 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D074 + ,simpleLowerCaseMapping:0x1D074 + ,simpleTitleCaseMapping:0x1D074 + }, + { code:0x1D075 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D075 + ,simpleLowerCaseMapping:0x1D075 + ,simpleTitleCaseMapping:0x1D075 + }, + { code:0x1D076 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D076 + ,simpleLowerCaseMapping:0x1D076 + ,simpleTitleCaseMapping:0x1D076 + }, + { code:0x1D077 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D077 + ,simpleLowerCaseMapping:0x1D077 + ,simpleTitleCaseMapping:0x1D077 + }, + { code:0x1D078 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D078 + ,simpleLowerCaseMapping:0x1D078 + ,simpleTitleCaseMapping:0x1D078 + }, + { code:0x1D079 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D079 + ,simpleLowerCaseMapping:0x1D079 + ,simpleTitleCaseMapping:0x1D079 + }, + { code:0x1D07A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D07A + ,simpleLowerCaseMapping:0x1D07A + ,simpleTitleCaseMapping:0x1D07A + }, + { code:0x1D07B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D07B + ,simpleLowerCaseMapping:0x1D07B + ,simpleTitleCaseMapping:0x1D07B + }, + { code:0x1D07C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D07C + ,simpleLowerCaseMapping:0x1D07C + ,simpleTitleCaseMapping:0x1D07C + }, + { code:0x1D07D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D07D + ,simpleLowerCaseMapping:0x1D07D + ,simpleTitleCaseMapping:0x1D07D + }, + { code:0x1D07E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D07E + ,simpleLowerCaseMapping:0x1D07E + ,simpleTitleCaseMapping:0x1D07E + }, + { code:0x1D07F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D07F + ,simpleLowerCaseMapping:0x1D07F + ,simpleTitleCaseMapping:0x1D07F + }, + { code:0x1D080 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D080 + ,simpleLowerCaseMapping:0x1D080 + ,simpleTitleCaseMapping:0x1D080 + }, + { code:0x1D081 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D081 + ,simpleLowerCaseMapping:0x1D081 + ,simpleTitleCaseMapping:0x1D081 + }, + { code:0x1D082 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D082 + ,simpleLowerCaseMapping:0x1D082 + ,simpleTitleCaseMapping:0x1D082 + }, + { code:0x1D083 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D083 + ,simpleLowerCaseMapping:0x1D083 + ,simpleTitleCaseMapping:0x1D083 + }, + { code:0x1D084 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D084 + ,simpleLowerCaseMapping:0x1D084 + ,simpleTitleCaseMapping:0x1D084 + }, + { code:0x1D085 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D085 + ,simpleLowerCaseMapping:0x1D085 + ,simpleTitleCaseMapping:0x1D085 + }, + { code:0x1D086 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D086 + ,simpleLowerCaseMapping:0x1D086 + ,simpleTitleCaseMapping:0x1D086 + }, + { code:0x1D087 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D087 + ,simpleLowerCaseMapping:0x1D087 + ,simpleTitleCaseMapping:0x1D087 + }, + { code:0x1D088 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D088 + ,simpleLowerCaseMapping:0x1D088 + ,simpleTitleCaseMapping:0x1D088 + }, + { code:0x1D089 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D089 + ,simpleLowerCaseMapping:0x1D089 + ,simpleTitleCaseMapping:0x1D089 + }, + { code:0x1D08A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D08A + ,simpleLowerCaseMapping:0x1D08A + ,simpleTitleCaseMapping:0x1D08A + }, + { code:0x1D08B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D08B + ,simpleLowerCaseMapping:0x1D08B + ,simpleTitleCaseMapping:0x1D08B + }, + { code:0x1D08C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D08C + ,simpleLowerCaseMapping:0x1D08C + ,simpleTitleCaseMapping:0x1D08C + }, + { code:0x1D08D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D08D + ,simpleLowerCaseMapping:0x1D08D + ,simpleTitleCaseMapping:0x1D08D + }, + { code:0x1D08E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D08E + ,simpleLowerCaseMapping:0x1D08E + ,simpleTitleCaseMapping:0x1D08E + }, + { code:0x1D08F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D08F + ,simpleLowerCaseMapping:0x1D08F + ,simpleTitleCaseMapping:0x1D08F + }, + { code:0x1D090 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D090 + ,simpleLowerCaseMapping:0x1D090 + ,simpleTitleCaseMapping:0x1D090 + }, + { code:0x1D091 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D091 + ,simpleLowerCaseMapping:0x1D091 + ,simpleTitleCaseMapping:0x1D091 + }, + { code:0x1D092 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D092 + ,simpleLowerCaseMapping:0x1D092 + ,simpleTitleCaseMapping:0x1D092 + }, + { code:0x1D093 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D093 + ,simpleLowerCaseMapping:0x1D093 + ,simpleTitleCaseMapping:0x1D093 + }, + { code:0x1D094 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D094 + ,simpleLowerCaseMapping:0x1D094 + ,simpleTitleCaseMapping:0x1D094 + }, + { code:0x1D095 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D095 + ,simpleLowerCaseMapping:0x1D095 + ,simpleTitleCaseMapping:0x1D095 + }, + { code:0x1D096 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D096 + ,simpleLowerCaseMapping:0x1D096 + ,simpleTitleCaseMapping:0x1D096 + }, + { code:0x1D097 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D097 + ,simpleLowerCaseMapping:0x1D097 + ,simpleTitleCaseMapping:0x1D097 + }, + { code:0x1D098 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D098 + ,simpleLowerCaseMapping:0x1D098 + ,simpleTitleCaseMapping:0x1D098 + }, + { code:0x1D099 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D099 + ,simpleLowerCaseMapping:0x1D099 + ,simpleTitleCaseMapping:0x1D099 + }, + { code:0x1D09A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D09A + ,simpleLowerCaseMapping:0x1D09A + ,simpleTitleCaseMapping:0x1D09A + }, + { code:0x1D09B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D09B + ,simpleLowerCaseMapping:0x1D09B + ,simpleTitleCaseMapping:0x1D09B + }, + { code:0x1D09C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D09C + ,simpleLowerCaseMapping:0x1D09C + ,simpleTitleCaseMapping:0x1D09C + }, + { code:0x1D09D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D09D + ,simpleLowerCaseMapping:0x1D09D + ,simpleTitleCaseMapping:0x1D09D + }, + { code:0x1D09E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D09E + ,simpleLowerCaseMapping:0x1D09E + ,simpleTitleCaseMapping:0x1D09E + }, + { code:0x1D09F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D09F + ,simpleLowerCaseMapping:0x1D09F + ,simpleTitleCaseMapping:0x1D09F + }, + { code:0x1D0A0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0A0 + ,simpleLowerCaseMapping:0x1D0A0 + ,simpleTitleCaseMapping:0x1D0A0 + }, + { code:0x1D0A1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0A1 + ,simpleLowerCaseMapping:0x1D0A1 + ,simpleTitleCaseMapping:0x1D0A1 + }, + { code:0x1D0A2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0A2 + ,simpleLowerCaseMapping:0x1D0A2 + ,simpleTitleCaseMapping:0x1D0A2 + }, + { code:0x1D0A3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0A3 + ,simpleLowerCaseMapping:0x1D0A3 + ,simpleTitleCaseMapping:0x1D0A3 + }, + { code:0x1D0A4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0A4 + ,simpleLowerCaseMapping:0x1D0A4 + ,simpleTitleCaseMapping:0x1D0A4 + }, + { code:0x1D0A5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0A5 + ,simpleLowerCaseMapping:0x1D0A5 + ,simpleTitleCaseMapping:0x1D0A5 + }, + { code:0x1D0A6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0A6 + ,simpleLowerCaseMapping:0x1D0A6 + ,simpleTitleCaseMapping:0x1D0A6 + }, + { code:0x1D0A7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0A7 + ,simpleLowerCaseMapping:0x1D0A7 + ,simpleTitleCaseMapping:0x1D0A7 + }, + { code:0x1D0A8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0A8 + ,simpleLowerCaseMapping:0x1D0A8 + ,simpleTitleCaseMapping:0x1D0A8 + }, + { code:0x1D0A9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0A9 + ,simpleLowerCaseMapping:0x1D0A9 + ,simpleTitleCaseMapping:0x1D0A9 + }, + { code:0x1D0AA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0AA + ,simpleLowerCaseMapping:0x1D0AA + ,simpleTitleCaseMapping:0x1D0AA + }, + { code:0x1D0AB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0AB + ,simpleLowerCaseMapping:0x1D0AB + ,simpleTitleCaseMapping:0x1D0AB + }, + { code:0x1D0AC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0AC + ,simpleLowerCaseMapping:0x1D0AC + ,simpleTitleCaseMapping:0x1D0AC + }, + { code:0x1D0AD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0AD + ,simpleLowerCaseMapping:0x1D0AD + ,simpleTitleCaseMapping:0x1D0AD + }, + { code:0x1D0AE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0AE + ,simpleLowerCaseMapping:0x1D0AE + ,simpleTitleCaseMapping:0x1D0AE + }, + { code:0x1D0AF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0AF + ,simpleLowerCaseMapping:0x1D0AF + ,simpleTitleCaseMapping:0x1D0AF + }, + { code:0x1D0B0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0B0 + ,simpleLowerCaseMapping:0x1D0B0 + ,simpleTitleCaseMapping:0x1D0B0 + }, + { code:0x1D0B1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0B1 + ,simpleLowerCaseMapping:0x1D0B1 + ,simpleTitleCaseMapping:0x1D0B1 + }, + { code:0x1D0B2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0B2 + ,simpleLowerCaseMapping:0x1D0B2 + ,simpleTitleCaseMapping:0x1D0B2 + }, + { code:0x1D0B3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0B3 + ,simpleLowerCaseMapping:0x1D0B3 + ,simpleTitleCaseMapping:0x1D0B3 + }, + { code:0x1D0B4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0B4 + ,simpleLowerCaseMapping:0x1D0B4 + ,simpleTitleCaseMapping:0x1D0B4 + }, + { code:0x1D0B5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0B5 + ,simpleLowerCaseMapping:0x1D0B5 + ,simpleTitleCaseMapping:0x1D0B5 + }, + { code:0x1D0B6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0B6 + ,simpleLowerCaseMapping:0x1D0B6 + ,simpleTitleCaseMapping:0x1D0B6 + }, + { code:0x1D0B7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0B7 + ,simpleLowerCaseMapping:0x1D0B7 + ,simpleTitleCaseMapping:0x1D0B7 + }, + { code:0x1D0B8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0B8 + ,simpleLowerCaseMapping:0x1D0B8 + ,simpleTitleCaseMapping:0x1D0B8 + }, + { code:0x1D0B9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0B9 + ,simpleLowerCaseMapping:0x1D0B9 + ,simpleTitleCaseMapping:0x1D0B9 + }, + { code:0x1D0BA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0BA + ,simpleLowerCaseMapping:0x1D0BA + ,simpleTitleCaseMapping:0x1D0BA + }, + { code:0x1D0BB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0BB + ,simpleLowerCaseMapping:0x1D0BB + ,simpleTitleCaseMapping:0x1D0BB + }, + { code:0x1D0BC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0BC + ,simpleLowerCaseMapping:0x1D0BC + ,simpleTitleCaseMapping:0x1D0BC + }, + { code:0x1D0BD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0BD + ,simpleLowerCaseMapping:0x1D0BD + ,simpleTitleCaseMapping:0x1D0BD + }, + { code:0x1D0BE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0BE + ,simpleLowerCaseMapping:0x1D0BE + ,simpleTitleCaseMapping:0x1D0BE + }, + { code:0x1D0BF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0BF + ,simpleLowerCaseMapping:0x1D0BF + ,simpleTitleCaseMapping:0x1D0BF + }, + { code:0x1D0C0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0C0 + ,simpleLowerCaseMapping:0x1D0C0 + ,simpleTitleCaseMapping:0x1D0C0 + }, + { code:0x1D0C1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0C1 + ,simpleLowerCaseMapping:0x1D0C1 + ,simpleTitleCaseMapping:0x1D0C1 + }, + { code:0x1D0C2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0C2 + ,simpleLowerCaseMapping:0x1D0C2 + ,simpleTitleCaseMapping:0x1D0C2 + }, + { code:0x1D0C3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0C3 + ,simpleLowerCaseMapping:0x1D0C3 + ,simpleTitleCaseMapping:0x1D0C3 + }, + { code:0x1D0C4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0C4 + ,simpleLowerCaseMapping:0x1D0C4 + ,simpleTitleCaseMapping:0x1D0C4 + }, + { code:0x1D0C5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0C5 + ,simpleLowerCaseMapping:0x1D0C5 + ,simpleTitleCaseMapping:0x1D0C5 + }, + { code:0x1D0C6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0C6 + ,simpleLowerCaseMapping:0x1D0C6 + ,simpleTitleCaseMapping:0x1D0C6 + }, + { code:0x1D0C7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0C7 + ,simpleLowerCaseMapping:0x1D0C7 + ,simpleTitleCaseMapping:0x1D0C7 + }, + { code:0x1D0C8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0C8 + ,simpleLowerCaseMapping:0x1D0C8 + ,simpleTitleCaseMapping:0x1D0C8 + }, + { code:0x1D0C9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0C9 + ,simpleLowerCaseMapping:0x1D0C9 + ,simpleTitleCaseMapping:0x1D0C9 + }, + { code:0x1D0CA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0CA + ,simpleLowerCaseMapping:0x1D0CA + ,simpleTitleCaseMapping:0x1D0CA + }, + { code:0x1D0CB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0CB + ,simpleLowerCaseMapping:0x1D0CB + ,simpleTitleCaseMapping:0x1D0CB + }, + { code:0x1D0CC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0CC + ,simpleLowerCaseMapping:0x1D0CC + ,simpleTitleCaseMapping:0x1D0CC + }, + { code:0x1D0CD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0CD + ,simpleLowerCaseMapping:0x1D0CD + ,simpleTitleCaseMapping:0x1D0CD + }, + { code:0x1D0CE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0CE + ,simpleLowerCaseMapping:0x1D0CE + ,simpleTitleCaseMapping:0x1D0CE + }, + { code:0x1D0CF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0CF + ,simpleLowerCaseMapping:0x1D0CF + ,simpleTitleCaseMapping:0x1D0CF + }, + { code:0x1D0D0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0D0 + ,simpleLowerCaseMapping:0x1D0D0 + ,simpleTitleCaseMapping:0x1D0D0 + }, + { code:0x1D0D1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0D1 + ,simpleLowerCaseMapping:0x1D0D1 + ,simpleTitleCaseMapping:0x1D0D1 + }, + { code:0x1D0D2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0D2 + ,simpleLowerCaseMapping:0x1D0D2 + ,simpleTitleCaseMapping:0x1D0D2 + }, + { code:0x1D0D3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0D3 + ,simpleLowerCaseMapping:0x1D0D3 + ,simpleTitleCaseMapping:0x1D0D3 + }, + { code:0x1D0D4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0D4 + ,simpleLowerCaseMapping:0x1D0D4 + ,simpleTitleCaseMapping:0x1D0D4 + }, + { code:0x1D0D5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0D5 + ,simpleLowerCaseMapping:0x1D0D5 + ,simpleTitleCaseMapping:0x1D0D5 + }, + { code:0x1D0D6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0D6 + ,simpleLowerCaseMapping:0x1D0D6 + ,simpleTitleCaseMapping:0x1D0D6 + }, + { code:0x1D0D7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0D7 + ,simpleLowerCaseMapping:0x1D0D7 + ,simpleTitleCaseMapping:0x1D0D7 + }, + { code:0x1D0D8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0D8 + ,simpleLowerCaseMapping:0x1D0D8 + ,simpleTitleCaseMapping:0x1D0D8 + }, + { code:0x1D0D9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0D9 + ,simpleLowerCaseMapping:0x1D0D9 + ,simpleTitleCaseMapping:0x1D0D9 + }, + { code:0x1D0DA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0DA + ,simpleLowerCaseMapping:0x1D0DA + ,simpleTitleCaseMapping:0x1D0DA + }, + { code:0x1D0DB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0DB + ,simpleLowerCaseMapping:0x1D0DB + ,simpleTitleCaseMapping:0x1D0DB + }, + { code:0x1D0DC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0DC + ,simpleLowerCaseMapping:0x1D0DC + ,simpleTitleCaseMapping:0x1D0DC + }, + { code:0x1D0DD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0DD + ,simpleLowerCaseMapping:0x1D0DD + ,simpleTitleCaseMapping:0x1D0DD + }, + { code:0x1D0DE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0DE + ,simpleLowerCaseMapping:0x1D0DE + ,simpleTitleCaseMapping:0x1D0DE + }, + { code:0x1D0DF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0DF + ,simpleLowerCaseMapping:0x1D0DF + ,simpleTitleCaseMapping:0x1D0DF + }, + { code:0x1D0E0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0E0 + ,simpleLowerCaseMapping:0x1D0E0 + ,simpleTitleCaseMapping:0x1D0E0 + }, + { code:0x1D0E1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0E1 + ,simpleLowerCaseMapping:0x1D0E1 + ,simpleTitleCaseMapping:0x1D0E1 + }, + { code:0x1D0E2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0E2 + ,simpleLowerCaseMapping:0x1D0E2 + ,simpleTitleCaseMapping:0x1D0E2 + }, + { code:0x1D0E3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0E3 + ,simpleLowerCaseMapping:0x1D0E3 + ,simpleTitleCaseMapping:0x1D0E3 + }, + { code:0x1D0E4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0E4 + ,simpleLowerCaseMapping:0x1D0E4 + ,simpleTitleCaseMapping:0x1D0E4 + }, + { code:0x1D0E5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0E5 + ,simpleLowerCaseMapping:0x1D0E5 + ,simpleTitleCaseMapping:0x1D0E5 + }, + { code:0x1D0E6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0E6 + ,simpleLowerCaseMapping:0x1D0E6 + ,simpleTitleCaseMapping:0x1D0E6 + }, + { code:0x1D0E7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0E7 + ,simpleLowerCaseMapping:0x1D0E7 + ,simpleTitleCaseMapping:0x1D0E7 + }, + { code:0x1D0E8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0E8 + ,simpleLowerCaseMapping:0x1D0E8 + ,simpleTitleCaseMapping:0x1D0E8 + }, + { code:0x1D0E9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0E9 + ,simpleLowerCaseMapping:0x1D0E9 + ,simpleTitleCaseMapping:0x1D0E9 + }, + { code:0x1D0EA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0EA + ,simpleLowerCaseMapping:0x1D0EA + ,simpleTitleCaseMapping:0x1D0EA + }, + { code:0x1D0EB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0EB + ,simpleLowerCaseMapping:0x1D0EB + ,simpleTitleCaseMapping:0x1D0EB + }, + { code:0x1D0EC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0EC + ,simpleLowerCaseMapping:0x1D0EC + ,simpleTitleCaseMapping:0x1D0EC + }, + { code:0x1D0ED + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0ED + ,simpleLowerCaseMapping:0x1D0ED + ,simpleTitleCaseMapping:0x1D0ED + }, + { code:0x1D0EE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0EE + ,simpleLowerCaseMapping:0x1D0EE + ,simpleTitleCaseMapping:0x1D0EE + }, + { code:0x1D0EF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0EF + ,simpleLowerCaseMapping:0x1D0EF + ,simpleTitleCaseMapping:0x1D0EF + }, + { code:0x1D0F0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0F0 + ,simpleLowerCaseMapping:0x1D0F0 + ,simpleTitleCaseMapping:0x1D0F0 + }, + { code:0x1D0F1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0F1 + ,simpleLowerCaseMapping:0x1D0F1 + ,simpleTitleCaseMapping:0x1D0F1 + }, + { code:0x1D0F2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0F2 + ,simpleLowerCaseMapping:0x1D0F2 + ,simpleTitleCaseMapping:0x1D0F2 + }, + { code:0x1D0F3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0F3 + ,simpleLowerCaseMapping:0x1D0F3 + ,simpleTitleCaseMapping:0x1D0F3 + }, + { code:0x1D0F4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0F4 + ,simpleLowerCaseMapping:0x1D0F4 + ,simpleTitleCaseMapping:0x1D0F4 + }, + { code:0x1D0F5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D0F5 + ,simpleLowerCaseMapping:0x1D0F5 + ,simpleTitleCaseMapping:0x1D0F5 + }, + { code:0x1D100 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D100 + ,simpleLowerCaseMapping:0x1D100 + ,simpleTitleCaseMapping:0x1D100 + }, + { code:0x1D101 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D101 + ,simpleLowerCaseMapping:0x1D101 + ,simpleTitleCaseMapping:0x1D101 + }, + { code:0x1D102 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D102 + ,simpleLowerCaseMapping:0x1D102 + ,simpleTitleCaseMapping:0x1D102 + }, + { code:0x1D103 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D103 + ,simpleLowerCaseMapping:0x1D103 + ,simpleTitleCaseMapping:0x1D103 + }, + { code:0x1D104 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D104 + ,simpleLowerCaseMapping:0x1D104 + ,simpleTitleCaseMapping:0x1D104 + }, + { code:0x1D105 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D105 + ,simpleLowerCaseMapping:0x1D105 + ,simpleTitleCaseMapping:0x1D105 + }, + { code:0x1D106 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D106 + ,simpleLowerCaseMapping:0x1D106 + ,simpleTitleCaseMapping:0x1D106 + }, + { code:0x1D107 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D107 + ,simpleLowerCaseMapping:0x1D107 + ,simpleTitleCaseMapping:0x1D107 + }, + { code:0x1D108 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D108 + ,simpleLowerCaseMapping:0x1D108 + ,simpleTitleCaseMapping:0x1D108 + }, + { code:0x1D109 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D109 + ,simpleLowerCaseMapping:0x1D109 + ,simpleTitleCaseMapping:0x1D109 + }, + { code:0x1D10A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D10A + ,simpleLowerCaseMapping:0x1D10A + ,simpleTitleCaseMapping:0x1D10A + }, + { code:0x1D10B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D10B + ,simpleLowerCaseMapping:0x1D10B + ,simpleTitleCaseMapping:0x1D10B + }, + { code:0x1D10C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D10C + ,simpleLowerCaseMapping:0x1D10C + ,simpleTitleCaseMapping:0x1D10C + }, + { code:0x1D10D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D10D + ,simpleLowerCaseMapping:0x1D10D + ,simpleTitleCaseMapping:0x1D10D + }, + { code:0x1D10E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D10E + ,simpleLowerCaseMapping:0x1D10E + ,simpleTitleCaseMapping:0x1D10E + }, + { code:0x1D10F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D10F + ,simpleLowerCaseMapping:0x1D10F + ,simpleTitleCaseMapping:0x1D10F + }, + { code:0x1D110 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D110 + ,simpleLowerCaseMapping:0x1D110 + ,simpleTitleCaseMapping:0x1D110 + }, + { code:0x1D111 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D111 + ,simpleLowerCaseMapping:0x1D111 + ,simpleTitleCaseMapping:0x1D111 + }, + { code:0x1D112 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D112 + ,simpleLowerCaseMapping:0x1D112 + ,simpleTitleCaseMapping:0x1D112 + }, + { code:0x1D113 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D113 + ,simpleLowerCaseMapping:0x1D113 + ,simpleTitleCaseMapping:0x1D113 + }, + { code:0x1D114 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D114 + ,simpleLowerCaseMapping:0x1D114 + ,simpleTitleCaseMapping:0x1D114 + }, + { code:0x1D115 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D115 + ,simpleLowerCaseMapping:0x1D115 + ,simpleTitleCaseMapping:0x1D115 + }, + { code:0x1D116 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D116 + ,simpleLowerCaseMapping:0x1D116 + ,simpleTitleCaseMapping:0x1D116 + }, + { code:0x1D117 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D117 + ,simpleLowerCaseMapping:0x1D117 + ,simpleTitleCaseMapping:0x1D117 + }, + { code:0x1D118 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D118 + ,simpleLowerCaseMapping:0x1D118 + ,simpleTitleCaseMapping:0x1D118 + }, + { code:0x1D119 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D119 + ,simpleLowerCaseMapping:0x1D119 + ,simpleTitleCaseMapping:0x1D119 + }, + { code:0x1D11A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D11A + ,simpleLowerCaseMapping:0x1D11A + ,simpleTitleCaseMapping:0x1D11A + }, + { code:0x1D11B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D11B + ,simpleLowerCaseMapping:0x1D11B + ,simpleTitleCaseMapping:0x1D11B + }, + { code:0x1D11C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D11C + ,simpleLowerCaseMapping:0x1D11C + ,simpleTitleCaseMapping:0x1D11C + }, + { code:0x1D11D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D11D + ,simpleLowerCaseMapping:0x1D11D + ,simpleTitleCaseMapping:0x1D11D + }, + { code:0x1D11E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D11E + ,simpleLowerCaseMapping:0x1D11E + ,simpleTitleCaseMapping:0x1D11E + }, + { code:0x1D11F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D11F + ,simpleLowerCaseMapping:0x1D11F + ,simpleTitleCaseMapping:0x1D11F + }, + { code:0x1D120 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D120 + ,simpleLowerCaseMapping:0x1D120 + ,simpleTitleCaseMapping:0x1D120 + }, + { code:0x1D121 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D121 + ,simpleLowerCaseMapping:0x1D121 + ,simpleTitleCaseMapping:0x1D121 + }, + { code:0x1D122 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D122 + ,simpleLowerCaseMapping:0x1D122 + ,simpleTitleCaseMapping:0x1D122 + }, + { code:0x1D123 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D123 + ,simpleLowerCaseMapping:0x1D123 + ,simpleTitleCaseMapping:0x1D123 + }, + { code:0x1D124 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D124 + ,simpleLowerCaseMapping:0x1D124 + ,simpleTitleCaseMapping:0x1D124 + }, + { code:0x1D125 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D125 + ,simpleLowerCaseMapping:0x1D125 + ,simpleTitleCaseMapping:0x1D125 + }, + { code:0x1D126 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D126 + ,simpleLowerCaseMapping:0x1D126 + ,simpleTitleCaseMapping:0x1D126 + }, + { code:0x1D12A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D12A + ,simpleLowerCaseMapping:0x1D12A + ,simpleTitleCaseMapping:0x1D12A + }, + { code:0x1D12B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D12B + ,simpleLowerCaseMapping:0x1D12B + ,simpleTitleCaseMapping:0x1D12B + }, + { code:0x1D12C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D12C + ,simpleLowerCaseMapping:0x1D12C + ,simpleTitleCaseMapping:0x1D12C + }, + { code:0x1D12D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D12D + ,simpleLowerCaseMapping:0x1D12D + ,simpleTitleCaseMapping:0x1D12D + }, + { code:0x1D12E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D12E + ,simpleLowerCaseMapping:0x1D12E + ,simpleTitleCaseMapping:0x1D12E + }, + { code:0x1D12F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D12F + ,simpleLowerCaseMapping:0x1D12F + ,simpleTitleCaseMapping:0x1D12F + }, + { code:0x1D130 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D130 + ,simpleLowerCaseMapping:0x1D130 + ,simpleTitleCaseMapping:0x1D130 + }, + { code:0x1D131 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D131 + ,simpleLowerCaseMapping:0x1D131 + ,simpleTitleCaseMapping:0x1D131 + }, + { code:0x1D132 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D132 + ,simpleLowerCaseMapping:0x1D132 + ,simpleTitleCaseMapping:0x1D132 + }, + { code:0x1D133 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D133 + ,simpleLowerCaseMapping:0x1D133 + ,simpleTitleCaseMapping:0x1D133 + }, + { code:0x1D134 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D134 + ,simpleLowerCaseMapping:0x1D134 + ,simpleTitleCaseMapping:0x1D134 + }, + { code:0x1D135 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D135 + ,simpleLowerCaseMapping:0x1D135 + ,simpleTitleCaseMapping:0x1D135 + }, + { code:0x1D136 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D136 + ,simpleLowerCaseMapping:0x1D136 + ,simpleTitleCaseMapping:0x1D136 + }, + { code:0x1D137 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D137 + ,simpleLowerCaseMapping:0x1D137 + ,simpleTitleCaseMapping:0x1D137 + }, + { code:0x1D138 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D138 + ,simpleLowerCaseMapping:0x1D138 + ,simpleTitleCaseMapping:0x1D138 + }, + { code:0x1D139 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D139 + ,simpleLowerCaseMapping:0x1D139 + ,simpleTitleCaseMapping:0x1D139 + }, + { code:0x1D13A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D13A + ,simpleLowerCaseMapping:0x1D13A + ,simpleTitleCaseMapping:0x1D13A + }, + { code:0x1D13B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D13B + ,simpleLowerCaseMapping:0x1D13B + ,simpleTitleCaseMapping:0x1D13B + }, + { code:0x1D13C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D13C + ,simpleLowerCaseMapping:0x1D13C + ,simpleTitleCaseMapping:0x1D13C + }, + { code:0x1D13D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D13D + ,simpleLowerCaseMapping:0x1D13D + ,simpleTitleCaseMapping:0x1D13D + }, + { code:0x1D13E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D13E + ,simpleLowerCaseMapping:0x1D13E + ,simpleTitleCaseMapping:0x1D13E + }, + { code:0x1D13F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D13F + ,simpleLowerCaseMapping:0x1D13F + ,simpleTitleCaseMapping:0x1D13F + }, + { code:0x1D140 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D140 + ,simpleLowerCaseMapping:0x1D140 + ,simpleTitleCaseMapping:0x1D140 + }, + { code:0x1D141 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D141 + ,simpleLowerCaseMapping:0x1D141 + ,simpleTitleCaseMapping:0x1D141 + }, + { code:0x1D142 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D142 + ,simpleLowerCaseMapping:0x1D142 + ,simpleTitleCaseMapping:0x1D142 + }, + { code:0x1D143 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D143 + ,simpleLowerCaseMapping:0x1D143 + ,simpleTitleCaseMapping:0x1D143 + }, + { code:0x1D144 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D144 + ,simpleLowerCaseMapping:0x1D144 + ,simpleTitleCaseMapping:0x1D144 + }, + { code:0x1D145 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D145 + ,simpleLowerCaseMapping:0x1D145 + ,simpleTitleCaseMapping:0x1D145 + }, + { code:0x1D146 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D146 + ,simpleLowerCaseMapping:0x1D146 + ,simpleTitleCaseMapping:0x1D146 + }, + { code:0x1D147 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D147 + ,simpleLowerCaseMapping:0x1D147 + ,simpleTitleCaseMapping:0x1D147 + }, + { code:0x1D148 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D148 + ,simpleLowerCaseMapping:0x1D148 + ,simpleTitleCaseMapping:0x1D148 + }, + { code:0x1D149 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D149 + ,simpleLowerCaseMapping:0x1D149 + ,simpleTitleCaseMapping:0x1D149 + }, + { code:0x1D14A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D14A + ,simpleLowerCaseMapping:0x1D14A + ,simpleTitleCaseMapping:0x1D14A + }, + { code:0x1D14B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D14B + ,simpleLowerCaseMapping:0x1D14B + ,simpleTitleCaseMapping:0x1D14B + }, + { code:0x1D14C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D14C + ,simpleLowerCaseMapping:0x1D14C + ,simpleTitleCaseMapping:0x1D14C + }, + { code:0x1D14D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D14D + ,simpleLowerCaseMapping:0x1D14D + ,simpleTitleCaseMapping:0x1D14D + }, + { code:0x1D14E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D14E + ,simpleLowerCaseMapping:0x1D14E + ,simpleTitleCaseMapping:0x1D14E + }, + { code:0x1D14F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D14F + ,simpleLowerCaseMapping:0x1D14F + ,simpleTitleCaseMapping:0x1D14F + }, + { code:0x1D150 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D150 + ,simpleLowerCaseMapping:0x1D150 + ,simpleTitleCaseMapping:0x1D150 + }, + { code:0x1D151 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D151 + ,simpleLowerCaseMapping:0x1D151 + ,simpleTitleCaseMapping:0x1D151 + }, + { code:0x1D152 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D152 + ,simpleLowerCaseMapping:0x1D152 + ,simpleTitleCaseMapping:0x1D152 + }, + { code:0x1D153 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D153 + ,simpleLowerCaseMapping:0x1D153 + ,simpleTitleCaseMapping:0x1D153 + }, + { code:0x1D154 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D154 + ,simpleLowerCaseMapping:0x1D154 + ,simpleTitleCaseMapping:0x1D154 + }, + { code:0x1D155 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D155 + ,simpleLowerCaseMapping:0x1D155 + ,simpleTitleCaseMapping:0x1D155 + }, + { code:0x1D156 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D156 + ,simpleLowerCaseMapping:0x1D156 + ,simpleTitleCaseMapping:0x1D156 + }, + { code:0x1D157 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D157 + ,simpleLowerCaseMapping:0x1D157 + ,simpleTitleCaseMapping:0x1D157 + }, + { code:0x1D158 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D158 + ,simpleLowerCaseMapping:0x1D158 + ,simpleTitleCaseMapping:0x1D158 + }, + { code:0x1D159 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D159 + ,simpleLowerCaseMapping:0x1D159 + ,simpleTitleCaseMapping:0x1D159 + }, + { code:0x1D15A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D15A + ,simpleLowerCaseMapping:0x1D15A + ,simpleTitleCaseMapping:0x1D15A + }, + { code:0x1D15B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D15B + ,simpleLowerCaseMapping:0x1D15B + ,simpleTitleCaseMapping:0x1D15B + }, + { code:0x1D15C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D15C + ,simpleLowerCaseMapping:0x1D15C + ,simpleTitleCaseMapping:0x1D15C + }, + { code:0x1D15D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D15D + ,simpleLowerCaseMapping:0x1D15D + ,simpleTitleCaseMapping:0x1D15D + }, + { code:0x1D15E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D15E + ,simpleLowerCaseMapping:0x1D15E + ,simpleTitleCaseMapping:0x1D15E + }, + { code:0x1D15F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D15F + ,simpleLowerCaseMapping:0x1D15F + ,simpleTitleCaseMapping:0x1D15F + }, + { code:0x1D160 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D160 + ,simpleLowerCaseMapping:0x1D160 + ,simpleTitleCaseMapping:0x1D160 + }, + { code:0x1D161 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D161 + ,simpleLowerCaseMapping:0x1D161 + ,simpleTitleCaseMapping:0x1D161 + }, + { code:0x1D162 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D162 + ,simpleLowerCaseMapping:0x1D162 + ,simpleTitleCaseMapping:0x1D162 + }, + { code:0x1D163 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D163 + ,simpleLowerCaseMapping:0x1D163 + ,simpleTitleCaseMapping:0x1D163 + }, + { code:0x1D164 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D164 + ,simpleLowerCaseMapping:0x1D164 + ,simpleTitleCaseMapping:0x1D164 + }, + { code:0x1D165 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1D165 + ,simpleLowerCaseMapping:0x1D165 + ,simpleTitleCaseMapping:0x1D165 + }, + { code:0x1D166 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1D166 + ,simpleLowerCaseMapping:0x1D166 + ,simpleTitleCaseMapping:0x1D166 + }, + { code:0x1D167 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1D167 + ,simpleLowerCaseMapping:0x1D167 + ,simpleTitleCaseMapping:0x1D167 + }, + { code:0x1D168 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1D168 + ,simpleLowerCaseMapping:0x1D168 + ,simpleTitleCaseMapping:0x1D168 + }, + { code:0x1D169 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1D169 + ,simpleLowerCaseMapping:0x1D169 + ,simpleTitleCaseMapping:0x1D169 + }, + { code:0x1D16A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D16A + ,simpleLowerCaseMapping:0x1D16A + ,simpleTitleCaseMapping:0x1D16A + }, + { code:0x1D16B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D16B + ,simpleLowerCaseMapping:0x1D16B + ,simpleTitleCaseMapping:0x1D16B + }, + { code:0x1D16C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D16C + ,simpleLowerCaseMapping:0x1D16C + ,simpleTitleCaseMapping:0x1D16C + }, + { code:0x1D16D + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1D16D + ,simpleLowerCaseMapping:0x1D16D + ,simpleTitleCaseMapping:0x1D16D + }, + { code:0x1D16E + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1D16E + ,simpleLowerCaseMapping:0x1D16E + ,simpleTitleCaseMapping:0x1D16E + }, + { code:0x1D16F + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1D16F + ,simpleLowerCaseMapping:0x1D16F + ,simpleTitleCaseMapping:0x1D16F + }, + { code:0x1D170 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1D170 + ,simpleLowerCaseMapping:0x1D170 + ,simpleTitleCaseMapping:0x1D170 + }, + { code:0x1D171 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1D171 + ,simpleLowerCaseMapping:0x1D171 + ,simpleTitleCaseMapping:0x1D171 + }, + { code:0x1D172 + ,generalCategory:UnicodeData.GeneralCategory.Mc + ,simpleUpperCaseMapping:0x1D172 + ,simpleLowerCaseMapping:0x1D172 + ,simpleTitleCaseMapping:0x1D172 + }, + { code:0x1D173 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x1D173 + ,simpleLowerCaseMapping:0x1D173 + ,simpleTitleCaseMapping:0x1D173 + }, + { code:0x1D174 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x1D174 + ,simpleLowerCaseMapping:0x1D174 + ,simpleTitleCaseMapping:0x1D174 + }, + { code:0x1D175 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x1D175 + ,simpleLowerCaseMapping:0x1D175 + ,simpleTitleCaseMapping:0x1D175 + }, + { code:0x1D176 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x1D176 + ,simpleLowerCaseMapping:0x1D176 + ,simpleTitleCaseMapping:0x1D176 + }, + { code:0x1D177 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x1D177 + ,simpleLowerCaseMapping:0x1D177 + ,simpleTitleCaseMapping:0x1D177 + }, + { code:0x1D178 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x1D178 + ,simpleLowerCaseMapping:0x1D178 + ,simpleTitleCaseMapping:0x1D178 + }, + { code:0x1D179 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x1D179 + ,simpleLowerCaseMapping:0x1D179 + ,simpleTitleCaseMapping:0x1D179 + }, + { code:0x1D17A + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0x1D17A + ,simpleLowerCaseMapping:0x1D17A + ,simpleTitleCaseMapping:0x1D17A + }, + { code:0x1D17B + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1D17B + ,simpleLowerCaseMapping:0x1D17B + ,simpleTitleCaseMapping:0x1D17B + }, + { code:0x1D17C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1D17C + ,simpleLowerCaseMapping:0x1D17C + ,simpleTitleCaseMapping:0x1D17C + }, + { code:0x1D17D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1D17D + ,simpleLowerCaseMapping:0x1D17D + ,simpleTitleCaseMapping:0x1D17D + }, + { code:0x1D17E + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1D17E + ,simpleLowerCaseMapping:0x1D17E + ,simpleTitleCaseMapping:0x1D17E + }, + { code:0x1D17F + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1D17F + ,simpleLowerCaseMapping:0x1D17F + ,simpleTitleCaseMapping:0x1D17F + }, + { code:0x1D180 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1D180 + ,simpleLowerCaseMapping:0x1D180 + ,simpleTitleCaseMapping:0x1D180 + }, + { code:0x1D181 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1D181 + ,simpleLowerCaseMapping:0x1D181 + ,simpleTitleCaseMapping:0x1D181 + }, + { code:0x1D182 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1D182 + ,simpleLowerCaseMapping:0x1D182 + ,simpleTitleCaseMapping:0x1D182 + }, + { code:0x1D183 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D183 + ,simpleLowerCaseMapping:0x1D183 + ,simpleTitleCaseMapping:0x1D183 + }, + { code:0x1D184 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D184 + ,simpleLowerCaseMapping:0x1D184 + ,simpleTitleCaseMapping:0x1D184 + }, + { code:0x1D185 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1D185 + ,simpleLowerCaseMapping:0x1D185 + ,simpleTitleCaseMapping:0x1D185 + }, + { code:0x1D186 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1D186 + ,simpleLowerCaseMapping:0x1D186 + ,simpleTitleCaseMapping:0x1D186 + }, + { code:0x1D187 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1D187 + ,simpleLowerCaseMapping:0x1D187 + ,simpleTitleCaseMapping:0x1D187 + }, + { code:0x1D188 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1D188 + ,simpleLowerCaseMapping:0x1D188 + ,simpleTitleCaseMapping:0x1D188 + }, + { code:0x1D189 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1D189 + ,simpleLowerCaseMapping:0x1D189 + ,simpleTitleCaseMapping:0x1D189 + }, + { code:0x1D18A + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1D18A + ,simpleLowerCaseMapping:0x1D18A + ,simpleTitleCaseMapping:0x1D18A + }, + { code:0x1D18B + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1D18B + ,simpleLowerCaseMapping:0x1D18B + ,simpleTitleCaseMapping:0x1D18B + }, + { code:0x1D18C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D18C + ,simpleLowerCaseMapping:0x1D18C + ,simpleTitleCaseMapping:0x1D18C + }, + { code:0x1D18D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D18D + ,simpleLowerCaseMapping:0x1D18D + ,simpleTitleCaseMapping:0x1D18D + }, + { code:0x1D18E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D18E + ,simpleLowerCaseMapping:0x1D18E + ,simpleTitleCaseMapping:0x1D18E + }, + { code:0x1D18F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D18F + ,simpleLowerCaseMapping:0x1D18F + ,simpleTitleCaseMapping:0x1D18F + }, + { code:0x1D190 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D190 + ,simpleLowerCaseMapping:0x1D190 + ,simpleTitleCaseMapping:0x1D190 + }, + { code:0x1D191 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D191 + ,simpleLowerCaseMapping:0x1D191 + ,simpleTitleCaseMapping:0x1D191 + }, + { code:0x1D192 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D192 + ,simpleLowerCaseMapping:0x1D192 + ,simpleTitleCaseMapping:0x1D192 + }, + { code:0x1D193 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D193 + ,simpleLowerCaseMapping:0x1D193 + ,simpleTitleCaseMapping:0x1D193 + }, + { code:0x1D194 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D194 + ,simpleLowerCaseMapping:0x1D194 + ,simpleTitleCaseMapping:0x1D194 + }, + { code:0x1D195 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D195 + ,simpleLowerCaseMapping:0x1D195 + ,simpleTitleCaseMapping:0x1D195 + }, + { code:0x1D196 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D196 + ,simpleLowerCaseMapping:0x1D196 + ,simpleTitleCaseMapping:0x1D196 + }, + { code:0x1D197 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D197 + ,simpleLowerCaseMapping:0x1D197 + ,simpleTitleCaseMapping:0x1D197 + }, + { code:0x1D198 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D198 + ,simpleLowerCaseMapping:0x1D198 + ,simpleTitleCaseMapping:0x1D198 + }, + { code:0x1D199 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D199 + ,simpleLowerCaseMapping:0x1D199 + ,simpleTitleCaseMapping:0x1D199 + }, + { code:0x1D19A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D19A + ,simpleLowerCaseMapping:0x1D19A + ,simpleTitleCaseMapping:0x1D19A + }, + { code:0x1D19B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D19B + ,simpleLowerCaseMapping:0x1D19B + ,simpleTitleCaseMapping:0x1D19B + }, + { code:0x1D19C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D19C + ,simpleLowerCaseMapping:0x1D19C + ,simpleTitleCaseMapping:0x1D19C + }, + { code:0x1D19D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D19D + ,simpleLowerCaseMapping:0x1D19D + ,simpleTitleCaseMapping:0x1D19D + }, + { code:0x1D19E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D19E + ,simpleLowerCaseMapping:0x1D19E + ,simpleTitleCaseMapping:0x1D19E + }, + { code:0x1D19F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D19F + ,simpleLowerCaseMapping:0x1D19F + ,simpleTitleCaseMapping:0x1D19F + }, + { code:0x1D1A0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1A0 + ,simpleLowerCaseMapping:0x1D1A0 + ,simpleTitleCaseMapping:0x1D1A0 + }, + { code:0x1D1A1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1A1 + ,simpleLowerCaseMapping:0x1D1A1 + ,simpleTitleCaseMapping:0x1D1A1 + }, + { code:0x1D1A2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1A2 + ,simpleLowerCaseMapping:0x1D1A2 + ,simpleTitleCaseMapping:0x1D1A2 + }, + { code:0x1D1A3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1A3 + ,simpleLowerCaseMapping:0x1D1A3 + ,simpleTitleCaseMapping:0x1D1A3 + }, + { code:0x1D1A4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1A4 + ,simpleLowerCaseMapping:0x1D1A4 + ,simpleTitleCaseMapping:0x1D1A4 + }, + { code:0x1D1A5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1A5 + ,simpleLowerCaseMapping:0x1D1A5 + ,simpleTitleCaseMapping:0x1D1A5 + }, + { code:0x1D1A6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1A6 + ,simpleLowerCaseMapping:0x1D1A6 + ,simpleTitleCaseMapping:0x1D1A6 + }, + { code:0x1D1A7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1A7 + ,simpleLowerCaseMapping:0x1D1A7 + ,simpleTitleCaseMapping:0x1D1A7 + }, + { code:0x1D1A8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1A8 + ,simpleLowerCaseMapping:0x1D1A8 + ,simpleTitleCaseMapping:0x1D1A8 + }, + { code:0x1D1A9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1A9 + ,simpleLowerCaseMapping:0x1D1A9 + ,simpleTitleCaseMapping:0x1D1A9 + }, + { code:0x1D1AA + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1D1AA + ,simpleLowerCaseMapping:0x1D1AA + ,simpleTitleCaseMapping:0x1D1AA + }, + { code:0x1D1AB + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1D1AB + ,simpleLowerCaseMapping:0x1D1AB + ,simpleTitleCaseMapping:0x1D1AB + }, + { code:0x1D1AC + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1D1AC + ,simpleLowerCaseMapping:0x1D1AC + ,simpleTitleCaseMapping:0x1D1AC + }, + { code:0x1D1AD + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1D1AD + ,simpleLowerCaseMapping:0x1D1AD + ,simpleTitleCaseMapping:0x1D1AD + }, + { code:0x1D1AE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1AE + ,simpleLowerCaseMapping:0x1D1AE + ,simpleTitleCaseMapping:0x1D1AE + }, + { code:0x1D1AF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1AF + ,simpleLowerCaseMapping:0x1D1AF + ,simpleTitleCaseMapping:0x1D1AF + }, + { code:0x1D1B0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1B0 + ,simpleLowerCaseMapping:0x1D1B0 + ,simpleTitleCaseMapping:0x1D1B0 + }, + { code:0x1D1B1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1B1 + ,simpleLowerCaseMapping:0x1D1B1 + ,simpleTitleCaseMapping:0x1D1B1 + }, + { code:0x1D1B2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1B2 + ,simpleLowerCaseMapping:0x1D1B2 + ,simpleTitleCaseMapping:0x1D1B2 + }, + { code:0x1D1B3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1B3 + ,simpleLowerCaseMapping:0x1D1B3 + ,simpleTitleCaseMapping:0x1D1B3 + }, + { code:0x1D1B4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1B4 + ,simpleLowerCaseMapping:0x1D1B4 + ,simpleTitleCaseMapping:0x1D1B4 + }, + { code:0x1D1B5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1B5 + ,simpleLowerCaseMapping:0x1D1B5 + ,simpleTitleCaseMapping:0x1D1B5 + }, + { code:0x1D1B6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1B6 + ,simpleLowerCaseMapping:0x1D1B6 + ,simpleTitleCaseMapping:0x1D1B6 + }, + { code:0x1D1B7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1B7 + ,simpleLowerCaseMapping:0x1D1B7 + ,simpleTitleCaseMapping:0x1D1B7 + }, + { code:0x1D1B8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1B8 + ,simpleLowerCaseMapping:0x1D1B8 + ,simpleTitleCaseMapping:0x1D1B8 + }, + { code:0x1D1B9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1B9 + ,simpleLowerCaseMapping:0x1D1B9 + ,simpleTitleCaseMapping:0x1D1B9 + }, + { code:0x1D1BA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1BA + ,simpleLowerCaseMapping:0x1D1BA + ,simpleTitleCaseMapping:0x1D1BA + }, + { code:0x1D1BB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1BB + ,simpleLowerCaseMapping:0x1D1BB + ,simpleTitleCaseMapping:0x1D1BB + }, + { code:0x1D1BC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1BC + ,simpleLowerCaseMapping:0x1D1BC + ,simpleTitleCaseMapping:0x1D1BC + }, + { code:0x1D1BD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1BD + ,simpleLowerCaseMapping:0x1D1BD + ,simpleTitleCaseMapping:0x1D1BD + }, + { code:0x1D1BE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1BE + ,simpleLowerCaseMapping:0x1D1BE + ,simpleTitleCaseMapping:0x1D1BE + }, + { code:0x1D1BF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1BF + ,simpleLowerCaseMapping:0x1D1BF + ,simpleTitleCaseMapping:0x1D1BF + }, + { code:0x1D1C0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1C0 + ,simpleLowerCaseMapping:0x1D1C0 + ,simpleTitleCaseMapping:0x1D1C0 + }, + { code:0x1D1C1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1C1 + ,simpleLowerCaseMapping:0x1D1C1 + ,simpleTitleCaseMapping:0x1D1C1 + }, + { code:0x1D1C2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1C2 + ,simpleLowerCaseMapping:0x1D1C2 + ,simpleTitleCaseMapping:0x1D1C2 + }, + { code:0x1D1C3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1C3 + ,simpleLowerCaseMapping:0x1D1C3 + ,simpleTitleCaseMapping:0x1D1C3 + }, + { code:0x1D1C4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1C4 + ,simpleLowerCaseMapping:0x1D1C4 + ,simpleTitleCaseMapping:0x1D1C4 + }, + { code:0x1D1C5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1C5 + ,simpleLowerCaseMapping:0x1D1C5 + ,simpleTitleCaseMapping:0x1D1C5 + }, + { code:0x1D1C6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1C6 + ,simpleLowerCaseMapping:0x1D1C6 + ,simpleTitleCaseMapping:0x1D1C6 + }, + { code:0x1D1C7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1C7 + ,simpleLowerCaseMapping:0x1D1C7 + ,simpleTitleCaseMapping:0x1D1C7 + }, + { code:0x1D1C8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1C8 + ,simpleLowerCaseMapping:0x1D1C8 + ,simpleTitleCaseMapping:0x1D1C8 + }, + { code:0x1D1C9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1C9 + ,simpleLowerCaseMapping:0x1D1C9 + ,simpleTitleCaseMapping:0x1D1C9 + }, + { code:0x1D1CA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1CA + ,simpleLowerCaseMapping:0x1D1CA + ,simpleTitleCaseMapping:0x1D1CA + }, + { code:0x1D1CB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1CB + ,simpleLowerCaseMapping:0x1D1CB + ,simpleTitleCaseMapping:0x1D1CB + }, + { code:0x1D1CC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1CC + ,simpleLowerCaseMapping:0x1D1CC + ,simpleTitleCaseMapping:0x1D1CC + }, + { code:0x1D1CD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1CD + ,simpleLowerCaseMapping:0x1D1CD + ,simpleTitleCaseMapping:0x1D1CD + }, + { code:0x1D1CE + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1CE + ,simpleLowerCaseMapping:0x1D1CE + ,simpleTitleCaseMapping:0x1D1CE + }, + { code:0x1D1CF + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1CF + ,simpleLowerCaseMapping:0x1D1CF + ,simpleTitleCaseMapping:0x1D1CF + }, + { code:0x1D1D0 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1D0 + ,simpleLowerCaseMapping:0x1D1D0 + ,simpleTitleCaseMapping:0x1D1D0 + }, + { code:0x1D1D1 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1D1 + ,simpleLowerCaseMapping:0x1D1D1 + ,simpleTitleCaseMapping:0x1D1D1 + }, + { code:0x1D1D2 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1D2 + ,simpleLowerCaseMapping:0x1D1D2 + ,simpleTitleCaseMapping:0x1D1D2 + }, + { code:0x1D1D3 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1D3 + ,simpleLowerCaseMapping:0x1D1D3 + ,simpleTitleCaseMapping:0x1D1D3 + }, + { code:0x1D1D4 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1D4 + ,simpleLowerCaseMapping:0x1D1D4 + ,simpleTitleCaseMapping:0x1D1D4 + }, + { code:0x1D1D5 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1D5 + ,simpleLowerCaseMapping:0x1D1D5 + ,simpleTitleCaseMapping:0x1D1D5 + }, + { code:0x1D1D6 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1D6 + ,simpleLowerCaseMapping:0x1D1D6 + ,simpleTitleCaseMapping:0x1D1D6 + }, + { code:0x1D1D7 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1D7 + ,simpleLowerCaseMapping:0x1D1D7 + ,simpleTitleCaseMapping:0x1D1D7 + }, + { code:0x1D1D8 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1D8 + ,simpleLowerCaseMapping:0x1D1D8 + ,simpleTitleCaseMapping:0x1D1D8 + }, + { code:0x1D1D9 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1D9 + ,simpleLowerCaseMapping:0x1D1D9 + ,simpleTitleCaseMapping:0x1D1D9 + }, + { code:0x1D1DA + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1DA + ,simpleLowerCaseMapping:0x1D1DA + ,simpleTitleCaseMapping:0x1D1DA + }, + { code:0x1D1DB + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1DB + ,simpleLowerCaseMapping:0x1D1DB + ,simpleTitleCaseMapping:0x1D1DB + }, + { code:0x1D1DC + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1DC + ,simpleLowerCaseMapping:0x1D1DC + ,simpleTitleCaseMapping:0x1D1DC + }, + { code:0x1D1DD + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D1DD + ,simpleLowerCaseMapping:0x1D1DD + ,simpleTitleCaseMapping:0x1D1DD + }, + { code:0x1D200 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D200 + ,simpleLowerCaseMapping:0x1D200 + ,simpleTitleCaseMapping:0x1D200 + }, + { code:0x1D201 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D201 + ,simpleLowerCaseMapping:0x1D201 + ,simpleTitleCaseMapping:0x1D201 + }, + { code:0x1D202 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D202 + ,simpleLowerCaseMapping:0x1D202 + ,simpleTitleCaseMapping:0x1D202 + }, + { code:0x1D203 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D203 + ,simpleLowerCaseMapping:0x1D203 + ,simpleTitleCaseMapping:0x1D203 + }, + { code:0x1D204 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D204 + ,simpleLowerCaseMapping:0x1D204 + ,simpleTitleCaseMapping:0x1D204 + }, + { code:0x1D205 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D205 + ,simpleLowerCaseMapping:0x1D205 + ,simpleTitleCaseMapping:0x1D205 + }, + { code:0x1D206 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D206 + ,simpleLowerCaseMapping:0x1D206 + ,simpleTitleCaseMapping:0x1D206 + }, + { code:0x1D207 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D207 + ,simpleLowerCaseMapping:0x1D207 + ,simpleTitleCaseMapping:0x1D207 + }, + { code:0x1D208 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D208 + ,simpleLowerCaseMapping:0x1D208 + ,simpleTitleCaseMapping:0x1D208 + }, + { code:0x1D209 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D209 + ,simpleLowerCaseMapping:0x1D209 + ,simpleTitleCaseMapping:0x1D209 + }, + { code:0x1D20A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D20A + ,simpleLowerCaseMapping:0x1D20A + ,simpleTitleCaseMapping:0x1D20A + }, + { code:0x1D20B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D20B + ,simpleLowerCaseMapping:0x1D20B + ,simpleTitleCaseMapping:0x1D20B + }, + { code:0x1D20C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D20C + ,simpleLowerCaseMapping:0x1D20C + ,simpleTitleCaseMapping:0x1D20C + }, + { code:0x1D20D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D20D + ,simpleLowerCaseMapping:0x1D20D + ,simpleTitleCaseMapping:0x1D20D + }, + { code:0x1D20E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D20E + ,simpleLowerCaseMapping:0x1D20E + ,simpleTitleCaseMapping:0x1D20E + }, + { code:0x1D20F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D20F + ,simpleLowerCaseMapping:0x1D20F + ,simpleTitleCaseMapping:0x1D20F + }, + { code:0x1D210 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D210 + ,simpleLowerCaseMapping:0x1D210 + ,simpleTitleCaseMapping:0x1D210 + }, + { code:0x1D211 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D211 + ,simpleLowerCaseMapping:0x1D211 + ,simpleTitleCaseMapping:0x1D211 + }, + { code:0x1D212 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D212 + ,simpleLowerCaseMapping:0x1D212 + ,simpleTitleCaseMapping:0x1D212 + }, + { code:0x1D213 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D213 + ,simpleLowerCaseMapping:0x1D213 + ,simpleTitleCaseMapping:0x1D213 + }, + { code:0x1D214 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D214 + ,simpleLowerCaseMapping:0x1D214 + ,simpleTitleCaseMapping:0x1D214 + }, + { code:0x1D215 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D215 + ,simpleLowerCaseMapping:0x1D215 + ,simpleTitleCaseMapping:0x1D215 + }, + { code:0x1D216 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D216 + ,simpleLowerCaseMapping:0x1D216 + ,simpleTitleCaseMapping:0x1D216 + }, + { code:0x1D217 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D217 + ,simpleLowerCaseMapping:0x1D217 + ,simpleTitleCaseMapping:0x1D217 + }, + { code:0x1D218 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D218 + ,simpleLowerCaseMapping:0x1D218 + ,simpleTitleCaseMapping:0x1D218 + }, + { code:0x1D219 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D219 + ,simpleLowerCaseMapping:0x1D219 + ,simpleTitleCaseMapping:0x1D219 + }, + { code:0x1D21A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D21A + ,simpleLowerCaseMapping:0x1D21A + ,simpleTitleCaseMapping:0x1D21A + }, + { code:0x1D21B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D21B + ,simpleLowerCaseMapping:0x1D21B + ,simpleTitleCaseMapping:0x1D21B + }, + { code:0x1D21C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D21C + ,simpleLowerCaseMapping:0x1D21C + ,simpleTitleCaseMapping:0x1D21C + }, + { code:0x1D21D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D21D + ,simpleLowerCaseMapping:0x1D21D + ,simpleTitleCaseMapping:0x1D21D + }, + { code:0x1D21E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D21E + ,simpleLowerCaseMapping:0x1D21E + ,simpleTitleCaseMapping:0x1D21E + }, + { code:0x1D21F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D21F + ,simpleLowerCaseMapping:0x1D21F + ,simpleTitleCaseMapping:0x1D21F + }, + { code:0x1D220 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D220 + ,simpleLowerCaseMapping:0x1D220 + ,simpleTitleCaseMapping:0x1D220 + }, + { code:0x1D221 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D221 + ,simpleLowerCaseMapping:0x1D221 + ,simpleTitleCaseMapping:0x1D221 + }, + { code:0x1D222 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D222 + ,simpleLowerCaseMapping:0x1D222 + ,simpleTitleCaseMapping:0x1D222 + }, + { code:0x1D223 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D223 + ,simpleLowerCaseMapping:0x1D223 + ,simpleTitleCaseMapping:0x1D223 + }, + { code:0x1D224 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D224 + ,simpleLowerCaseMapping:0x1D224 + ,simpleTitleCaseMapping:0x1D224 + }, + { code:0x1D225 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D225 + ,simpleLowerCaseMapping:0x1D225 + ,simpleTitleCaseMapping:0x1D225 + }, + { code:0x1D226 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D226 + ,simpleLowerCaseMapping:0x1D226 + ,simpleTitleCaseMapping:0x1D226 + }, + { code:0x1D227 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D227 + ,simpleLowerCaseMapping:0x1D227 + ,simpleTitleCaseMapping:0x1D227 + }, + { code:0x1D228 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D228 + ,simpleLowerCaseMapping:0x1D228 + ,simpleTitleCaseMapping:0x1D228 + }, + { code:0x1D229 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D229 + ,simpleLowerCaseMapping:0x1D229 + ,simpleTitleCaseMapping:0x1D229 + }, + { code:0x1D22A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D22A + ,simpleLowerCaseMapping:0x1D22A + ,simpleTitleCaseMapping:0x1D22A + }, + { code:0x1D22B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D22B + ,simpleLowerCaseMapping:0x1D22B + ,simpleTitleCaseMapping:0x1D22B + }, + { code:0x1D22C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D22C + ,simpleLowerCaseMapping:0x1D22C + ,simpleTitleCaseMapping:0x1D22C + }, + { code:0x1D22D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D22D + ,simpleLowerCaseMapping:0x1D22D + ,simpleTitleCaseMapping:0x1D22D + }, + { code:0x1D22E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D22E + ,simpleLowerCaseMapping:0x1D22E + ,simpleTitleCaseMapping:0x1D22E + }, + { code:0x1D22F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D22F + ,simpleLowerCaseMapping:0x1D22F + ,simpleTitleCaseMapping:0x1D22F + }, + { code:0x1D230 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D230 + ,simpleLowerCaseMapping:0x1D230 + ,simpleTitleCaseMapping:0x1D230 + }, + { code:0x1D231 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D231 + ,simpleLowerCaseMapping:0x1D231 + ,simpleTitleCaseMapping:0x1D231 + }, + { code:0x1D232 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D232 + ,simpleLowerCaseMapping:0x1D232 + ,simpleTitleCaseMapping:0x1D232 + }, + { code:0x1D233 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D233 + ,simpleLowerCaseMapping:0x1D233 + ,simpleTitleCaseMapping:0x1D233 + }, + { code:0x1D234 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D234 + ,simpleLowerCaseMapping:0x1D234 + ,simpleTitleCaseMapping:0x1D234 + }, + { code:0x1D235 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D235 + ,simpleLowerCaseMapping:0x1D235 + ,simpleTitleCaseMapping:0x1D235 + }, + { code:0x1D236 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D236 + ,simpleLowerCaseMapping:0x1D236 + ,simpleTitleCaseMapping:0x1D236 + }, + { code:0x1D237 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D237 + ,simpleLowerCaseMapping:0x1D237 + ,simpleTitleCaseMapping:0x1D237 + }, + { code:0x1D238 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D238 + ,simpleLowerCaseMapping:0x1D238 + ,simpleTitleCaseMapping:0x1D238 + }, + { code:0x1D239 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D239 + ,simpleLowerCaseMapping:0x1D239 + ,simpleTitleCaseMapping:0x1D239 + }, + { code:0x1D23A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D23A + ,simpleLowerCaseMapping:0x1D23A + ,simpleTitleCaseMapping:0x1D23A + }, + { code:0x1D23B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D23B + ,simpleLowerCaseMapping:0x1D23B + ,simpleTitleCaseMapping:0x1D23B + }, + { code:0x1D23C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D23C + ,simpleLowerCaseMapping:0x1D23C + ,simpleTitleCaseMapping:0x1D23C + }, + { code:0x1D23D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D23D + ,simpleLowerCaseMapping:0x1D23D + ,simpleTitleCaseMapping:0x1D23D + }, + { code:0x1D23E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D23E + ,simpleLowerCaseMapping:0x1D23E + ,simpleTitleCaseMapping:0x1D23E + }, + { code:0x1D23F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D23F + ,simpleLowerCaseMapping:0x1D23F + ,simpleTitleCaseMapping:0x1D23F + }, + { code:0x1D240 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D240 + ,simpleLowerCaseMapping:0x1D240 + ,simpleTitleCaseMapping:0x1D240 + }, + { code:0x1D241 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D241 + ,simpleLowerCaseMapping:0x1D241 + ,simpleTitleCaseMapping:0x1D241 + }, + { code:0x1D242 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1D242 + ,simpleLowerCaseMapping:0x1D242 + ,simpleTitleCaseMapping:0x1D242 + }, + { code:0x1D243 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1D243 + ,simpleLowerCaseMapping:0x1D243 + ,simpleTitleCaseMapping:0x1D243 + }, + { code:0x1D244 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0x1D244 + ,simpleLowerCaseMapping:0x1D244 + ,simpleTitleCaseMapping:0x1D244 + }, + { code:0x1D245 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D245 + ,simpleLowerCaseMapping:0x1D245 + ,simpleTitleCaseMapping:0x1D245 + }, + { code:0x1D300 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D300 + ,simpleLowerCaseMapping:0x1D300 + ,simpleTitleCaseMapping:0x1D300 + }, + { code:0x1D301 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D301 + ,simpleLowerCaseMapping:0x1D301 + ,simpleTitleCaseMapping:0x1D301 + }, + { code:0x1D302 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D302 + ,simpleLowerCaseMapping:0x1D302 + ,simpleTitleCaseMapping:0x1D302 + }, + { code:0x1D303 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D303 + ,simpleLowerCaseMapping:0x1D303 + ,simpleTitleCaseMapping:0x1D303 + }, + { code:0x1D304 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D304 + ,simpleLowerCaseMapping:0x1D304 + ,simpleTitleCaseMapping:0x1D304 + }, + { code:0x1D305 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D305 + ,simpleLowerCaseMapping:0x1D305 + ,simpleTitleCaseMapping:0x1D305 + }, + { code:0x1D306 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D306 + ,simpleLowerCaseMapping:0x1D306 + ,simpleTitleCaseMapping:0x1D306 + }, + { code:0x1D307 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D307 + ,simpleLowerCaseMapping:0x1D307 + ,simpleTitleCaseMapping:0x1D307 + }, + { code:0x1D308 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D308 + ,simpleLowerCaseMapping:0x1D308 + ,simpleTitleCaseMapping:0x1D308 + }, + { code:0x1D309 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D309 + ,simpleLowerCaseMapping:0x1D309 + ,simpleTitleCaseMapping:0x1D309 + }, + { code:0x1D30A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D30A + ,simpleLowerCaseMapping:0x1D30A + ,simpleTitleCaseMapping:0x1D30A + }, + { code:0x1D30B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D30B + ,simpleLowerCaseMapping:0x1D30B + ,simpleTitleCaseMapping:0x1D30B + }, + { code:0x1D30C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D30C + ,simpleLowerCaseMapping:0x1D30C + ,simpleTitleCaseMapping:0x1D30C + }, + { code:0x1D30D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D30D + ,simpleLowerCaseMapping:0x1D30D + ,simpleTitleCaseMapping:0x1D30D + }, + { code:0x1D30E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D30E + ,simpleLowerCaseMapping:0x1D30E + ,simpleTitleCaseMapping:0x1D30E + }, + { code:0x1D30F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D30F + ,simpleLowerCaseMapping:0x1D30F + ,simpleTitleCaseMapping:0x1D30F + }, + { code:0x1D310 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D310 + ,simpleLowerCaseMapping:0x1D310 + ,simpleTitleCaseMapping:0x1D310 + }, + { code:0x1D311 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D311 + ,simpleLowerCaseMapping:0x1D311 + ,simpleTitleCaseMapping:0x1D311 + }, + { code:0x1D312 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D312 + ,simpleLowerCaseMapping:0x1D312 + ,simpleTitleCaseMapping:0x1D312 + }, + { code:0x1D313 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D313 + ,simpleLowerCaseMapping:0x1D313 + ,simpleTitleCaseMapping:0x1D313 + }, + { code:0x1D314 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D314 + ,simpleLowerCaseMapping:0x1D314 + ,simpleTitleCaseMapping:0x1D314 + }, + { code:0x1D315 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D315 + ,simpleLowerCaseMapping:0x1D315 + ,simpleTitleCaseMapping:0x1D315 + }, + { code:0x1D316 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D316 + ,simpleLowerCaseMapping:0x1D316 + ,simpleTitleCaseMapping:0x1D316 + }, + { code:0x1D317 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D317 + ,simpleLowerCaseMapping:0x1D317 + ,simpleTitleCaseMapping:0x1D317 + }, + { code:0x1D318 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D318 + ,simpleLowerCaseMapping:0x1D318 + ,simpleTitleCaseMapping:0x1D318 + }, + { code:0x1D319 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D319 + ,simpleLowerCaseMapping:0x1D319 + ,simpleTitleCaseMapping:0x1D319 + }, + { code:0x1D31A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D31A + ,simpleLowerCaseMapping:0x1D31A + ,simpleTitleCaseMapping:0x1D31A + }, + { code:0x1D31B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D31B + ,simpleLowerCaseMapping:0x1D31B + ,simpleTitleCaseMapping:0x1D31B + }, + { code:0x1D31C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D31C + ,simpleLowerCaseMapping:0x1D31C + ,simpleTitleCaseMapping:0x1D31C + }, + { code:0x1D31D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D31D + ,simpleLowerCaseMapping:0x1D31D + ,simpleTitleCaseMapping:0x1D31D + }, + { code:0x1D31E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D31E + ,simpleLowerCaseMapping:0x1D31E + ,simpleTitleCaseMapping:0x1D31E + }, + { code:0x1D31F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D31F + ,simpleLowerCaseMapping:0x1D31F + ,simpleTitleCaseMapping:0x1D31F + }, + { code:0x1D320 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D320 + ,simpleLowerCaseMapping:0x1D320 + ,simpleTitleCaseMapping:0x1D320 + }, + { code:0x1D321 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D321 + ,simpleLowerCaseMapping:0x1D321 + ,simpleTitleCaseMapping:0x1D321 + }, + { code:0x1D322 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D322 + ,simpleLowerCaseMapping:0x1D322 + ,simpleTitleCaseMapping:0x1D322 + }, + { code:0x1D323 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D323 + ,simpleLowerCaseMapping:0x1D323 + ,simpleTitleCaseMapping:0x1D323 + }, + { code:0x1D324 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D324 + ,simpleLowerCaseMapping:0x1D324 + ,simpleTitleCaseMapping:0x1D324 + }, + { code:0x1D325 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D325 + ,simpleLowerCaseMapping:0x1D325 + ,simpleTitleCaseMapping:0x1D325 + }, + { code:0x1D326 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D326 + ,simpleLowerCaseMapping:0x1D326 + ,simpleTitleCaseMapping:0x1D326 + }, + { code:0x1D327 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D327 + ,simpleLowerCaseMapping:0x1D327 + ,simpleTitleCaseMapping:0x1D327 + }, + { code:0x1D328 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D328 + ,simpleLowerCaseMapping:0x1D328 + ,simpleTitleCaseMapping:0x1D328 + }, + { code:0x1D329 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D329 + ,simpleLowerCaseMapping:0x1D329 + ,simpleTitleCaseMapping:0x1D329 + }, + { code:0x1D32A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D32A + ,simpleLowerCaseMapping:0x1D32A + ,simpleTitleCaseMapping:0x1D32A + }, + { code:0x1D32B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D32B + ,simpleLowerCaseMapping:0x1D32B + ,simpleTitleCaseMapping:0x1D32B + }, + { code:0x1D32C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D32C + ,simpleLowerCaseMapping:0x1D32C + ,simpleTitleCaseMapping:0x1D32C + }, + { code:0x1D32D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D32D + ,simpleLowerCaseMapping:0x1D32D + ,simpleTitleCaseMapping:0x1D32D + }, + { code:0x1D32E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D32E + ,simpleLowerCaseMapping:0x1D32E + ,simpleTitleCaseMapping:0x1D32E + }, + { code:0x1D32F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D32F + ,simpleLowerCaseMapping:0x1D32F + ,simpleTitleCaseMapping:0x1D32F + }, + { code:0x1D330 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D330 + ,simpleLowerCaseMapping:0x1D330 + ,simpleTitleCaseMapping:0x1D330 + }, + { code:0x1D331 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D331 + ,simpleLowerCaseMapping:0x1D331 + ,simpleTitleCaseMapping:0x1D331 + }, + { code:0x1D332 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D332 + ,simpleLowerCaseMapping:0x1D332 + ,simpleTitleCaseMapping:0x1D332 + }, + { code:0x1D333 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D333 + ,simpleLowerCaseMapping:0x1D333 + ,simpleTitleCaseMapping:0x1D333 + }, + { code:0x1D334 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D334 + ,simpleLowerCaseMapping:0x1D334 + ,simpleTitleCaseMapping:0x1D334 + }, + { code:0x1D335 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D335 + ,simpleLowerCaseMapping:0x1D335 + ,simpleTitleCaseMapping:0x1D335 + }, + { code:0x1D336 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D336 + ,simpleLowerCaseMapping:0x1D336 + ,simpleTitleCaseMapping:0x1D336 + }, + { code:0x1D337 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D337 + ,simpleLowerCaseMapping:0x1D337 + ,simpleTitleCaseMapping:0x1D337 + }, + { code:0x1D338 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D338 + ,simpleLowerCaseMapping:0x1D338 + ,simpleTitleCaseMapping:0x1D338 + }, + { code:0x1D339 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D339 + ,simpleLowerCaseMapping:0x1D339 + ,simpleTitleCaseMapping:0x1D339 + }, + { code:0x1D33A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D33A + ,simpleLowerCaseMapping:0x1D33A + ,simpleTitleCaseMapping:0x1D33A + }, + { code:0x1D33B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D33B + ,simpleLowerCaseMapping:0x1D33B + ,simpleTitleCaseMapping:0x1D33B + }, + { code:0x1D33C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D33C + ,simpleLowerCaseMapping:0x1D33C + ,simpleTitleCaseMapping:0x1D33C + }, + { code:0x1D33D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D33D + ,simpleLowerCaseMapping:0x1D33D + ,simpleTitleCaseMapping:0x1D33D + }, + { code:0x1D33E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D33E + ,simpleLowerCaseMapping:0x1D33E + ,simpleTitleCaseMapping:0x1D33E + }, + { code:0x1D33F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D33F + ,simpleLowerCaseMapping:0x1D33F + ,simpleTitleCaseMapping:0x1D33F + }, + { code:0x1D340 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D340 + ,simpleLowerCaseMapping:0x1D340 + ,simpleTitleCaseMapping:0x1D340 + }, + { code:0x1D341 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D341 + ,simpleLowerCaseMapping:0x1D341 + ,simpleTitleCaseMapping:0x1D341 + }, + { code:0x1D342 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D342 + ,simpleLowerCaseMapping:0x1D342 + ,simpleTitleCaseMapping:0x1D342 + }, + { code:0x1D343 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D343 + ,simpleLowerCaseMapping:0x1D343 + ,simpleTitleCaseMapping:0x1D343 + }, + { code:0x1D344 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D344 + ,simpleLowerCaseMapping:0x1D344 + ,simpleTitleCaseMapping:0x1D344 + }, + { code:0x1D345 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D345 + ,simpleLowerCaseMapping:0x1D345 + ,simpleTitleCaseMapping:0x1D345 + }, + { code:0x1D346 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D346 + ,simpleLowerCaseMapping:0x1D346 + ,simpleTitleCaseMapping:0x1D346 + }, + { code:0x1D347 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D347 + ,simpleLowerCaseMapping:0x1D347 + ,simpleTitleCaseMapping:0x1D347 + }, + { code:0x1D348 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D348 + ,simpleLowerCaseMapping:0x1D348 + ,simpleTitleCaseMapping:0x1D348 + }, + { code:0x1D349 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D349 + ,simpleLowerCaseMapping:0x1D349 + ,simpleTitleCaseMapping:0x1D349 + }, + { code:0x1D34A + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D34A + ,simpleLowerCaseMapping:0x1D34A + ,simpleTitleCaseMapping:0x1D34A + }, + { code:0x1D34B + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D34B + ,simpleLowerCaseMapping:0x1D34B + ,simpleTitleCaseMapping:0x1D34B + }, + { code:0x1D34C + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D34C + ,simpleLowerCaseMapping:0x1D34C + ,simpleTitleCaseMapping:0x1D34C + }, + { code:0x1D34D + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D34D + ,simpleLowerCaseMapping:0x1D34D + ,simpleTitleCaseMapping:0x1D34D + }, + { code:0x1D34E + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D34E + ,simpleLowerCaseMapping:0x1D34E + ,simpleTitleCaseMapping:0x1D34E + }, + { code:0x1D34F + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D34F + ,simpleLowerCaseMapping:0x1D34F + ,simpleTitleCaseMapping:0x1D34F + }, + { code:0x1D350 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D350 + ,simpleLowerCaseMapping:0x1D350 + ,simpleTitleCaseMapping:0x1D350 + }, + { code:0x1D351 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D351 + ,simpleLowerCaseMapping:0x1D351 + ,simpleTitleCaseMapping:0x1D351 + }, + { code:0x1D352 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D352 + ,simpleLowerCaseMapping:0x1D352 + ,simpleTitleCaseMapping:0x1D352 + }, + { code:0x1D353 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D353 + ,simpleLowerCaseMapping:0x1D353 + ,simpleTitleCaseMapping:0x1D353 + }, + { code:0x1D354 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D354 + ,simpleLowerCaseMapping:0x1D354 + ,simpleTitleCaseMapping:0x1D354 + }, + { code:0x1D355 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D355 + ,simpleLowerCaseMapping:0x1D355 + ,simpleTitleCaseMapping:0x1D355 + }, + { code:0x1D356 + ,generalCategory:UnicodeData.GeneralCategory.So + ,simpleUpperCaseMapping:0x1D356 + ,simpleLowerCaseMapping:0x1D356 + ,simpleTitleCaseMapping:0x1D356 + }, + { code:0x1D360 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1D360 + ,simpleLowerCaseMapping:0x1D360 + ,simpleTitleCaseMapping:0x1D360 + }, + { code:0x1D361 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1D361 + ,simpleLowerCaseMapping:0x1D361 + ,simpleTitleCaseMapping:0x1D361 + }, + { code:0x1D362 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1D362 + ,simpleLowerCaseMapping:0x1D362 + ,simpleTitleCaseMapping:0x1D362 + }, + { code:0x1D363 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1D363 + ,simpleLowerCaseMapping:0x1D363 + ,simpleTitleCaseMapping:0x1D363 + }, + { code:0x1D364 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1D364 + ,simpleLowerCaseMapping:0x1D364 + ,simpleTitleCaseMapping:0x1D364 + }, + { code:0x1D365 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1D365 + ,simpleLowerCaseMapping:0x1D365 + ,simpleTitleCaseMapping:0x1D365 + }, + { code:0x1D366 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1D366 + ,simpleLowerCaseMapping:0x1D366 + ,simpleTitleCaseMapping:0x1D366 + }, + { code:0x1D367 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1D367 + ,simpleLowerCaseMapping:0x1D367 + ,simpleTitleCaseMapping:0x1D367 + }, + { code:0x1D368 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1D368 + ,simpleLowerCaseMapping:0x1D368 + ,simpleTitleCaseMapping:0x1D368 + }, + { code:0x1D369 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1D369 + ,simpleLowerCaseMapping:0x1D369 + ,simpleTitleCaseMapping:0x1D369 + }, + { code:0x1D36A + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1D36A + ,simpleLowerCaseMapping:0x1D36A + ,simpleTitleCaseMapping:0x1D36A + }, + { code:0x1D36B + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1D36B + ,simpleLowerCaseMapping:0x1D36B + ,simpleTitleCaseMapping:0x1D36B + }, + { code:0x1D36C + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1D36C + ,simpleLowerCaseMapping:0x1D36C + ,simpleTitleCaseMapping:0x1D36C + }, + { code:0x1D36D + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1D36D + ,simpleLowerCaseMapping:0x1D36D + ,simpleTitleCaseMapping:0x1D36D + }, + { code:0x1D36E + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1D36E + ,simpleLowerCaseMapping:0x1D36E + ,simpleTitleCaseMapping:0x1D36E + }, + { code:0x1D36F + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1D36F + ,simpleLowerCaseMapping:0x1D36F + ,simpleTitleCaseMapping:0x1D36F + }, + { code:0x1D370 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1D370 + ,simpleLowerCaseMapping:0x1D370 + ,simpleTitleCaseMapping:0x1D370 + }, + { code:0x1D371 + ,generalCategory:UnicodeData.GeneralCategory.No + ,simpleUpperCaseMapping:0x1D371 + ,simpleLowerCaseMapping:0x1D371 + ,simpleTitleCaseMapping:0x1D371 + }, + { code:0x1D400 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D400 + ,simpleLowerCaseMapping:0x1D400 + ,simpleTitleCaseMapping:0x1D400 + }, + { code:0x1D401 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D401 + ,simpleLowerCaseMapping:0x1D401 + ,simpleTitleCaseMapping:0x1D401 + }, + { code:0x1D402 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D402 + ,simpleLowerCaseMapping:0x1D402 + ,simpleTitleCaseMapping:0x1D402 + }, + { code:0x1D403 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D403 + ,simpleLowerCaseMapping:0x1D403 + ,simpleTitleCaseMapping:0x1D403 + }, + { code:0x1D404 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D404 + ,simpleLowerCaseMapping:0x1D404 + ,simpleTitleCaseMapping:0x1D404 + }, + { code:0x1D405 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D405 + ,simpleLowerCaseMapping:0x1D405 + ,simpleTitleCaseMapping:0x1D405 + }, + { code:0x1D406 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D406 + ,simpleLowerCaseMapping:0x1D406 + ,simpleTitleCaseMapping:0x1D406 + }, + { code:0x1D407 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D407 + ,simpleLowerCaseMapping:0x1D407 + ,simpleTitleCaseMapping:0x1D407 + }, + { code:0x1D408 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D408 + ,simpleLowerCaseMapping:0x1D408 + ,simpleTitleCaseMapping:0x1D408 + }, + { code:0x1D409 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D409 + ,simpleLowerCaseMapping:0x1D409 + ,simpleTitleCaseMapping:0x1D409 + }, + { code:0x1D40A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D40A + ,simpleLowerCaseMapping:0x1D40A + ,simpleTitleCaseMapping:0x1D40A + }, + { code:0x1D40B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D40B + ,simpleLowerCaseMapping:0x1D40B + ,simpleTitleCaseMapping:0x1D40B + }, + { code:0x1D40C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D40C + ,simpleLowerCaseMapping:0x1D40C + ,simpleTitleCaseMapping:0x1D40C + }, + { code:0x1D40D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D40D + ,simpleLowerCaseMapping:0x1D40D + ,simpleTitleCaseMapping:0x1D40D + }, + { code:0x1D40E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D40E + ,simpleLowerCaseMapping:0x1D40E + ,simpleTitleCaseMapping:0x1D40E + }, + { code:0x1D40F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D40F + ,simpleLowerCaseMapping:0x1D40F + ,simpleTitleCaseMapping:0x1D40F + }, + { code:0x1D410 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D410 + ,simpleLowerCaseMapping:0x1D410 + ,simpleTitleCaseMapping:0x1D410 + }, + { code:0x1D411 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D411 + ,simpleLowerCaseMapping:0x1D411 + ,simpleTitleCaseMapping:0x1D411 + }, + { code:0x1D412 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D412 + ,simpleLowerCaseMapping:0x1D412 + ,simpleTitleCaseMapping:0x1D412 + }, + { code:0x1D413 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D413 + ,simpleLowerCaseMapping:0x1D413 + ,simpleTitleCaseMapping:0x1D413 + }, + { code:0x1D414 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D414 + ,simpleLowerCaseMapping:0x1D414 + ,simpleTitleCaseMapping:0x1D414 + }, + { code:0x1D415 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D415 + ,simpleLowerCaseMapping:0x1D415 + ,simpleTitleCaseMapping:0x1D415 + }, + { code:0x1D416 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D416 + ,simpleLowerCaseMapping:0x1D416 + ,simpleTitleCaseMapping:0x1D416 + }, + { code:0x1D417 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D417 + ,simpleLowerCaseMapping:0x1D417 + ,simpleTitleCaseMapping:0x1D417 + }, + { code:0x1D418 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D418 + ,simpleLowerCaseMapping:0x1D418 + ,simpleTitleCaseMapping:0x1D418 + }, + { code:0x1D419 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D419 + ,simpleLowerCaseMapping:0x1D419 + ,simpleTitleCaseMapping:0x1D419 + }, + { code:0x1D41A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D41A + ,simpleLowerCaseMapping:0x1D41A + ,simpleTitleCaseMapping:0x1D41A + }, + { code:0x1D41B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D41B + ,simpleLowerCaseMapping:0x1D41B + ,simpleTitleCaseMapping:0x1D41B + }, + { code:0x1D41C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D41C + ,simpleLowerCaseMapping:0x1D41C + ,simpleTitleCaseMapping:0x1D41C + }, + { code:0x1D41D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D41D + ,simpleLowerCaseMapping:0x1D41D + ,simpleTitleCaseMapping:0x1D41D + }, + { code:0x1D41E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D41E + ,simpleLowerCaseMapping:0x1D41E + ,simpleTitleCaseMapping:0x1D41E + }, + { code:0x1D41F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D41F + ,simpleLowerCaseMapping:0x1D41F + ,simpleTitleCaseMapping:0x1D41F + }, + { code:0x1D420 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D420 + ,simpleLowerCaseMapping:0x1D420 + ,simpleTitleCaseMapping:0x1D420 + }, + { code:0x1D421 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D421 + ,simpleLowerCaseMapping:0x1D421 + ,simpleTitleCaseMapping:0x1D421 + }, + { code:0x1D422 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D422 + ,simpleLowerCaseMapping:0x1D422 + ,simpleTitleCaseMapping:0x1D422 + }, + { code:0x1D423 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D423 + ,simpleLowerCaseMapping:0x1D423 + ,simpleTitleCaseMapping:0x1D423 + }, + { code:0x1D424 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D424 + ,simpleLowerCaseMapping:0x1D424 + ,simpleTitleCaseMapping:0x1D424 + }, + { code:0x1D425 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D425 + ,simpleLowerCaseMapping:0x1D425 + ,simpleTitleCaseMapping:0x1D425 + }, + { code:0x1D426 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D426 + ,simpleLowerCaseMapping:0x1D426 + ,simpleTitleCaseMapping:0x1D426 + }, + { code:0x1D427 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D427 + ,simpleLowerCaseMapping:0x1D427 + ,simpleTitleCaseMapping:0x1D427 + }, + { code:0x1D428 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D428 + ,simpleLowerCaseMapping:0x1D428 + ,simpleTitleCaseMapping:0x1D428 + }, + { code:0x1D429 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D429 + ,simpleLowerCaseMapping:0x1D429 + ,simpleTitleCaseMapping:0x1D429 + }, + { code:0x1D42A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D42A + ,simpleLowerCaseMapping:0x1D42A + ,simpleTitleCaseMapping:0x1D42A + }, + { code:0x1D42B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D42B + ,simpleLowerCaseMapping:0x1D42B + ,simpleTitleCaseMapping:0x1D42B + }, + { code:0x1D42C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D42C + ,simpleLowerCaseMapping:0x1D42C + ,simpleTitleCaseMapping:0x1D42C + }, + { code:0x1D42D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D42D + ,simpleLowerCaseMapping:0x1D42D + ,simpleTitleCaseMapping:0x1D42D + }, + { code:0x1D42E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D42E + ,simpleLowerCaseMapping:0x1D42E + ,simpleTitleCaseMapping:0x1D42E + }, + { code:0x1D42F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D42F + ,simpleLowerCaseMapping:0x1D42F + ,simpleTitleCaseMapping:0x1D42F + }, + { code:0x1D430 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D430 + ,simpleLowerCaseMapping:0x1D430 + ,simpleTitleCaseMapping:0x1D430 + }, + { code:0x1D431 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D431 + ,simpleLowerCaseMapping:0x1D431 + ,simpleTitleCaseMapping:0x1D431 + }, + { code:0x1D432 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D432 + ,simpleLowerCaseMapping:0x1D432 + ,simpleTitleCaseMapping:0x1D432 + }, + { code:0x1D433 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D433 + ,simpleLowerCaseMapping:0x1D433 + ,simpleTitleCaseMapping:0x1D433 + }, + { code:0x1D434 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D434 + ,simpleLowerCaseMapping:0x1D434 + ,simpleTitleCaseMapping:0x1D434 + }, + { code:0x1D435 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D435 + ,simpleLowerCaseMapping:0x1D435 + ,simpleTitleCaseMapping:0x1D435 + }, + { code:0x1D436 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D436 + ,simpleLowerCaseMapping:0x1D436 + ,simpleTitleCaseMapping:0x1D436 + }, + { code:0x1D437 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D437 + ,simpleLowerCaseMapping:0x1D437 + ,simpleTitleCaseMapping:0x1D437 + }, + { code:0x1D438 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D438 + ,simpleLowerCaseMapping:0x1D438 + ,simpleTitleCaseMapping:0x1D438 + }, + { code:0x1D439 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D439 + ,simpleLowerCaseMapping:0x1D439 + ,simpleTitleCaseMapping:0x1D439 + }, + { code:0x1D43A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D43A + ,simpleLowerCaseMapping:0x1D43A + ,simpleTitleCaseMapping:0x1D43A + }, + { code:0x1D43B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D43B + ,simpleLowerCaseMapping:0x1D43B + ,simpleTitleCaseMapping:0x1D43B + }, + { code:0x1D43C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D43C + ,simpleLowerCaseMapping:0x1D43C + ,simpleTitleCaseMapping:0x1D43C + }, + { code:0x1D43D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D43D + ,simpleLowerCaseMapping:0x1D43D + ,simpleTitleCaseMapping:0x1D43D + }, + { code:0x1D43E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D43E + ,simpleLowerCaseMapping:0x1D43E + ,simpleTitleCaseMapping:0x1D43E + }, + { code:0x1D43F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D43F + ,simpleLowerCaseMapping:0x1D43F + ,simpleTitleCaseMapping:0x1D43F + }, + { code:0x1D440 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D440 + ,simpleLowerCaseMapping:0x1D440 + ,simpleTitleCaseMapping:0x1D440 + }, + { code:0x1D441 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D441 + ,simpleLowerCaseMapping:0x1D441 + ,simpleTitleCaseMapping:0x1D441 + }, + { code:0x1D442 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D442 + ,simpleLowerCaseMapping:0x1D442 + ,simpleTitleCaseMapping:0x1D442 + }, + { code:0x1D443 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D443 + ,simpleLowerCaseMapping:0x1D443 + ,simpleTitleCaseMapping:0x1D443 + }, + { code:0x1D444 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D444 + ,simpleLowerCaseMapping:0x1D444 + ,simpleTitleCaseMapping:0x1D444 + }, + { code:0x1D445 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D445 + ,simpleLowerCaseMapping:0x1D445 + ,simpleTitleCaseMapping:0x1D445 + }, + { code:0x1D446 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D446 + ,simpleLowerCaseMapping:0x1D446 + ,simpleTitleCaseMapping:0x1D446 + }, + { code:0x1D447 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D447 + ,simpleLowerCaseMapping:0x1D447 + ,simpleTitleCaseMapping:0x1D447 + }, + { code:0x1D448 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D448 + ,simpleLowerCaseMapping:0x1D448 + ,simpleTitleCaseMapping:0x1D448 + }, + { code:0x1D449 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D449 + ,simpleLowerCaseMapping:0x1D449 + ,simpleTitleCaseMapping:0x1D449 + }, + { code:0x1D44A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D44A + ,simpleLowerCaseMapping:0x1D44A + ,simpleTitleCaseMapping:0x1D44A + }, + { code:0x1D44B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D44B + ,simpleLowerCaseMapping:0x1D44B + ,simpleTitleCaseMapping:0x1D44B + }, + { code:0x1D44C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D44C + ,simpleLowerCaseMapping:0x1D44C + ,simpleTitleCaseMapping:0x1D44C + }, + { code:0x1D44D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D44D + ,simpleLowerCaseMapping:0x1D44D + ,simpleTitleCaseMapping:0x1D44D + }, + { code:0x1D44E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D44E + ,simpleLowerCaseMapping:0x1D44E + ,simpleTitleCaseMapping:0x1D44E + }, + { code:0x1D44F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D44F + ,simpleLowerCaseMapping:0x1D44F + ,simpleTitleCaseMapping:0x1D44F + }, + { code:0x1D450 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D450 + ,simpleLowerCaseMapping:0x1D450 + ,simpleTitleCaseMapping:0x1D450 + }, + { code:0x1D451 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D451 + ,simpleLowerCaseMapping:0x1D451 + ,simpleTitleCaseMapping:0x1D451 + }, + { code:0x1D452 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D452 + ,simpleLowerCaseMapping:0x1D452 + ,simpleTitleCaseMapping:0x1D452 + }, + { code:0x1D453 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D453 + ,simpleLowerCaseMapping:0x1D453 + ,simpleTitleCaseMapping:0x1D453 + }, + { code:0x1D454 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D454 + ,simpleLowerCaseMapping:0x1D454 + ,simpleTitleCaseMapping:0x1D454 + }, + { code:0x1D456 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D456 + ,simpleLowerCaseMapping:0x1D456 + ,simpleTitleCaseMapping:0x1D456 + }, + { code:0x1D457 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D457 + ,simpleLowerCaseMapping:0x1D457 + ,simpleTitleCaseMapping:0x1D457 + }, + { code:0x1D458 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D458 + ,simpleLowerCaseMapping:0x1D458 + ,simpleTitleCaseMapping:0x1D458 + }, + { code:0x1D459 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D459 + ,simpleLowerCaseMapping:0x1D459 + ,simpleTitleCaseMapping:0x1D459 + }, + { code:0x1D45A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D45A + ,simpleLowerCaseMapping:0x1D45A + ,simpleTitleCaseMapping:0x1D45A + }, + { code:0x1D45B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D45B + ,simpleLowerCaseMapping:0x1D45B + ,simpleTitleCaseMapping:0x1D45B + }, + { code:0x1D45C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D45C + ,simpleLowerCaseMapping:0x1D45C + ,simpleTitleCaseMapping:0x1D45C + }, + { code:0x1D45D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D45D + ,simpleLowerCaseMapping:0x1D45D + ,simpleTitleCaseMapping:0x1D45D + }, + { code:0x1D45E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D45E + ,simpleLowerCaseMapping:0x1D45E + ,simpleTitleCaseMapping:0x1D45E + }, + { code:0x1D45F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D45F + ,simpleLowerCaseMapping:0x1D45F + ,simpleTitleCaseMapping:0x1D45F + }, + { code:0x1D460 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D460 + ,simpleLowerCaseMapping:0x1D460 + ,simpleTitleCaseMapping:0x1D460 + }, + { code:0x1D461 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D461 + ,simpleLowerCaseMapping:0x1D461 + ,simpleTitleCaseMapping:0x1D461 + }, + { code:0x1D462 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D462 + ,simpleLowerCaseMapping:0x1D462 + ,simpleTitleCaseMapping:0x1D462 + }, + { code:0x1D463 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D463 + ,simpleLowerCaseMapping:0x1D463 + ,simpleTitleCaseMapping:0x1D463 + }, + { code:0x1D464 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D464 + ,simpleLowerCaseMapping:0x1D464 + ,simpleTitleCaseMapping:0x1D464 + }, + { code:0x1D465 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D465 + ,simpleLowerCaseMapping:0x1D465 + ,simpleTitleCaseMapping:0x1D465 + }, + { code:0x1D466 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D466 + ,simpleLowerCaseMapping:0x1D466 + ,simpleTitleCaseMapping:0x1D466 + }, + { code:0x1D467 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D467 + ,simpleLowerCaseMapping:0x1D467 + ,simpleTitleCaseMapping:0x1D467 + }, + { code:0x1D468 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D468 + ,simpleLowerCaseMapping:0x1D468 + ,simpleTitleCaseMapping:0x1D468 + }, + { code:0x1D469 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D469 + ,simpleLowerCaseMapping:0x1D469 + ,simpleTitleCaseMapping:0x1D469 + }, + { code:0x1D46A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D46A + ,simpleLowerCaseMapping:0x1D46A + ,simpleTitleCaseMapping:0x1D46A + }, + { code:0x1D46B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D46B + ,simpleLowerCaseMapping:0x1D46B + ,simpleTitleCaseMapping:0x1D46B + }, + { code:0x1D46C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D46C + ,simpleLowerCaseMapping:0x1D46C + ,simpleTitleCaseMapping:0x1D46C + }, + { code:0x1D46D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D46D + ,simpleLowerCaseMapping:0x1D46D + ,simpleTitleCaseMapping:0x1D46D + }, + { code:0x1D46E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D46E + ,simpleLowerCaseMapping:0x1D46E + ,simpleTitleCaseMapping:0x1D46E + }, + { code:0x1D46F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D46F + ,simpleLowerCaseMapping:0x1D46F + ,simpleTitleCaseMapping:0x1D46F + }, + { code:0x1D470 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D470 + ,simpleLowerCaseMapping:0x1D470 + ,simpleTitleCaseMapping:0x1D470 + }, + { code:0x1D471 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D471 + ,simpleLowerCaseMapping:0x1D471 + ,simpleTitleCaseMapping:0x1D471 + }, + { code:0x1D472 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D472 + ,simpleLowerCaseMapping:0x1D472 + ,simpleTitleCaseMapping:0x1D472 + }, + { code:0x1D473 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D473 + ,simpleLowerCaseMapping:0x1D473 + ,simpleTitleCaseMapping:0x1D473 + }, + { code:0x1D474 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D474 + ,simpleLowerCaseMapping:0x1D474 + ,simpleTitleCaseMapping:0x1D474 + }, + { code:0x1D475 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D475 + ,simpleLowerCaseMapping:0x1D475 + ,simpleTitleCaseMapping:0x1D475 + }, + { code:0x1D476 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D476 + ,simpleLowerCaseMapping:0x1D476 + ,simpleTitleCaseMapping:0x1D476 + }, + { code:0x1D477 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D477 + ,simpleLowerCaseMapping:0x1D477 + ,simpleTitleCaseMapping:0x1D477 + }, + { code:0x1D478 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D478 + ,simpleLowerCaseMapping:0x1D478 + ,simpleTitleCaseMapping:0x1D478 + }, + { code:0x1D479 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D479 + ,simpleLowerCaseMapping:0x1D479 + ,simpleTitleCaseMapping:0x1D479 + }, + { code:0x1D47A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D47A + ,simpleLowerCaseMapping:0x1D47A + ,simpleTitleCaseMapping:0x1D47A + }, + { code:0x1D47B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D47B + ,simpleLowerCaseMapping:0x1D47B + ,simpleTitleCaseMapping:0x1D47B + }, + { code:0x1D47C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D47C + ,simpleLowerCaseMapping:0x1D47C + ,simpleTitleCaseMapping:0x1D47C + }, + { code:0x1D47D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D47D + ,simpleLowerCaseMapping:0x1D47D + ,simpleTitleCaseMapping:0x1D47D + }, + { code:0x1D47E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D47E + ,simpleLowerCaseMapping:0x1D47E + ,simpleTitleCaseMapping:0x1D47E + }, + { code:0x1D47F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D47F + ,simpleLowerCaseMapping:0x1D47F + ,simpleTitleCaseMapping:0x1D47F + }, + { code:0x1D480 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D480 + ,simpleLowerCaseMapping:0x1D480 + ,simpleTitleCaseMapping:0x1D480 + }, + { code:0x1D481 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D481 + ,simpleLowerCaseMapping:0x1D481 + ,simpleTitleCaseMapping:0x1D481 + }, + { code:0x1D482 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D482 + ,simpleLowerCaseMapping:0x1D482 + ,simpleTitleCaseMapping:0x1D482 + }, + { code:0x1D483 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D483 + ,simpleLowerCaseMapping:0x1D483 + ,simpleTitleCaseMapping:0x1D483 + }, + { code:0x1D484 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D484 + ,simpleLowerCaseMapping:0x1D484 + ,simpleTitleCaseMapping:0x1D484 + }, + { code:0x1D485 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D485 + ,simpleLowerCaseMapping:0x1D485 + ,simpleTitleCaseMapping:0x1D485 + }, + { code:0x1D486 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D486 + ,simpleLowerCaseMapping:0x1D486 + ,simpleTitleCaseMapping:0x1D486 + }, + { code:0x1D487 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D487 + ,simpleLowerCaseMapping:0x1D487 + ,simpleTitleCaseMapping:0x1D487 + }, + { code:0x1D488 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D488 + ,simpleLowerCaseMapping:0x1D488 + ,simpleTitleCaseMapping:0x1D488 + }, + { code:0x1D489 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D489 + ,simpleLowerCaseMapping:0x1D489 + ,simpleTitleCaseMapping:0x1D489 + }, + { code:0x1D48A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D48A + ,simpleLowerCaseMapping:0x1D48A + ,simpleTitleCaseMapping:0x1D48A + }, + { code:0x1D48B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D48B + ,simpleLowerCaseMapping:0x1D48B + ,simpleTitleCaseMapping:0x1D48B + }, + { code:0x1D48C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D48C + ,simpleLowerCaseMapping:0x1D48C + ,simpleTitleCaseMapping:0x1D48C + }, + { code:0x1D48D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D48D + ,simpleLowerCaseMapping:0x1D48D + ,simpleTitleCaseMapping:0x1D48D + }, + { code:0x1D48E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D48E + ,simpleLowerCaseMapping:0x1D48E + ,simpleTitleCaseMapping:0x1D48E + }, + { code:0x1D48F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D48F + ,simpleLowerCaseMapping:0x1D48F + ,simpleTitleCaseMapping:0x1D48F + }, + { code:0x1D490 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D490 + ,simpleLowerCaseMapping:0x1D490 + ,simpleTitleCaseMapping:0x1D490 + }, + { code:0x1D491 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D491 + ,simpleLowerCaseMapping:0x1D491 + ,simpleTitleCaseMapping:0x1D491 + }, + { code:0x1D492 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D492 + ,simpleLowerCaseMapping:0x1D492 + ,simpleTitleCaseMapping:0x1D492 + }, + { code:0x1D493 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D493 + ,simpleLowerCaseMapping:0x1D493 + ,simpleTitleCaseMapping:0x1D493 + }, + { code:0x1D494 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D494 + ,simpleLowerCaseMapping:0x1D494 + ,simpleTitleCaseMapping:0x1D494 + }, + { code:0x1D495 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D495 + ,simpleLowerCaseMapping:0x1D495 + ,simpleTitleCaseMapping:0x1D495 + }, + { code:0x1D496 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D496 + ,simpleLowerCaseMapping:0x1D496 + ,simpleTitleCaseMapping:0x1D496 + }, + { code:0x1D497 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D497 + ,simpleLowerCaseMapping:0x1D497 + ,simpleTitleCaseMapping:0x1D497 + }, + { code:0x1D498 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D498 + ,simpleLowerCaseMapping:0x1D498 + ,simpleTitleCaseMapping:0x1D498 + }, + { code:0x1D499 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D499 + ,simpleLowerCaseMapping:0x1D499 + ,simpleTitleCaseMapping:0x1D499 + }, + { code:0x1D49A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D49A + ,simpleLowerCaseMapping:0x1D49A + ,simpleTitleCaseMapping:0x1D49A + }, + { code:0x1D49B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D49B + ,simpleLowerCaseMapping:0x1D49B + ,simpleTitleCaseMapping:0x1D49B + }, + { code:0x1D49C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D49C + ,simpleLowerCaseMapping:0x1D49C + ,simpleTitleCaseMapping:0x1D49C + }, + { code:0x1D49E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D49E + ,simpleLowerCaseMapping:0x1D49E + ,simpleTitleCaseMapping:0x1D49E + }, + { code:0x1D49F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D49F + ,simpleLowerCaseMapping:0x1D49F + ,simpleTitleCaseMapping:0x1D49F + }, + { code:0x1D4A2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4A2 + ,simpleLowerCaseMapping:0x1D4A2 + ,simpleTitleCaseMapping:0x1D4A2 + }, + { code:0x1D4A5 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4A5 + ,simpleLowerCaseMapping:0x1D4A5 + ,simpleTitleCaseMapping:0x1D4A5 + }, + { code:0x1D4A6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4A6 + ,simpleLowerCaseMapping:0x1D4A6 + ,simpleTitleCaseMapping:0x1D4A6 + }, + { code:0x1D4A9 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4A9 + ,simpleLowerCaseMapping:0x1D4A9 + ,simpleTitleCaseMapping:0x1D4A9 + }, + { code:0x1D4AA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4AA + ,simpleLowerCaseMapping:0x1D4AA + ,simpleTitleCaseMapping:0x1D4AA + }, + { code:0x1D4AB + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4AB + ,simpleLowerCaseMapping:0x1D4AB + ,simpleTitleCaseMapping:0x1D4AB + }, + { code:0x1D4AC + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4AC + ,simpleLowerCaseMapping:0x1D4AC + ,simpleTitleCaseMapping:0x1D4AC + }, + { code:0x1D4AE + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4AE + ,simpleLowerCaseMapping:0x1D4AE + ,simpleTitleCaseMapping:0x1D4AE + }, + { code:0x1D4AF + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4AF + ,simpleLowerCaseMapping:0x1D4AF + ,simpleTitleCaseMapping:0x1D4AF + }, + { code:0x1D4B0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4B0 + ,simpleLowerCaseMapping:0x1D4B0 + ,simpleTitleCaseMapping:0x1D4B0 + }, + { code:0x1D4B1 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4B1 + ,simpleLowerCaseMapping:0x1D4B1 + ,simpleTitleCaseMapping:0x1D4B1 + }, + { code:0x1D4B2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4B2 + ,simpleLowerCaseMapping:0x1D4B2 + ,simpleTitleCaseMapping:0x1D4B2 + }, + { code:0x1D4B3 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4B3 + ,simpleLowerCaseMapping:0x1D4B3 + ,simpleTitleCaseMapping:0x1D4B3 + }, + { code:0x1D4B4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4B4 + ,simpleLowerCaseMapping:0x1D4B4 + ,simpleTitleCaseMapping:0x1D4B4 + }, + { code:0x1D4B5 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4B5 + ,simpleLowerCaseMapping:0x1D4B5 + ,simpleTitleCaseMapping:0x1D4B5 + }, + { code:0x1D4B6 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4B6 + ,simpleLowerCaseMapping:0x1D4B6 + ,simpleTitleCaseMapping:0x1D4B6 + }, + { code:0x1D4B7 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4B7 + ,simpleLowerCaseMapping:0x1D4B7 + ,simpleTitleCaseMapping:0x1D4B7 + }, + { code:0x1D4B8 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4B8 + ,simpleLowerCaseMapping:0x1D4B8 + ,simpleTitleCaseMapping:0x1D4B8 + }, + { code:0x1D4B9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4B9 + ,simpleLowerCaseMapping:0x1D4B9 + ,simpleTitleCaseMapping:0x1D4B9 + }, + { code:0x1D4BB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4BB + ,simpleLowerCaseMapping:0x1D4BB + ,simpleTitleCaseMapping:0x1D4BB + }, + { code:0x1D4BD + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4BD + ,simpleLowerCaseMapping:0x1D4BD + ,simpleTitleCaseMapping:0x1D4BD + }, + { code:0x1D4BE + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4BE + ,simpleLowerCaseMapping:0x1D4BE + ,simpleTitleCaseMapping:0x1D4BE + }, + { code:0x1D4BF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4BF + ,simpleLowerCaseMapping:0x1D4BF + ,simpleTitleCaseMapping:0x1D4BF + }, + { code:0x1D4C0 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4C0 + ,simpleLowerCaseMapping:0x1D4C0 + ,simpleTitleCaseMapping:0x1D4C0 + }, + { code:0x1D4C1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4C1 + ,simpleLowerCaseMapping:0x1D4C1 + ,simpleTitleCaseMapping:0x1D4C1 + }, + { code:0x1D4C2 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4C2 + ,simpleLowerCaseMapping:0x1D4C2 + ,simpleTitleCaseMapping:0x1D4C2 + }, + { code:0x1D4C3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4C3 + ,simpleLowerCaseMapping:0x1D4C3 + ,simpleTitleCaseMapping:0x1D4C3 + }, + { code:0x1D4C5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4C5 + ,simpleLowerCaseMapping:0x1D4C5 + ,simpleTitleCaseMapping:0x1D4C5 + }, + { code:0x1D4C6 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4C6 + ,simpleLowerCaseMapping:0x1D4C6 + ,simpleTitleCaseMapping:0x1D4C6 + }, + { code:0x1D4C7 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4C7 + ,simpleLowerCaseMapping:0x1D4C7 + ,simpleTitleCaseMapping:0x1D4C7 + }, + { code:0x1D4C8 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4C8 + ,simpleLowerCaseMapping:0x1D4C8 + ,simpleTitleCaseMapping:0x1D4C8 + }, + { code:0x1D4C9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4C9 + ,simpleLowerCaseMapping:0x1D4C9 + ,simpleTitleCaseMapping:0x1D4C9 + }, + { code:0x1D4CA + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4CA + ,simpleLowerCaseMapping:0x1D4CA + ,simpleTitleCaseMapping:0x1D4CA + }, + { code:0x1D4CB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4CB + ,simpleLowerCaseMapping:0x1D4CB + ,simpleTitleCaseMapping:0x1D4CB + }, + { code:0x1D4CC + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4CC + ,simpleLowerCaseMapping:0x1D4CC + ,simpleTitleCaseMapping:0x1D4CC + }, + { code:0x1D4CD + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4CD + ,simpleLowerCaseMapping:0x1D4CD + ,simpleTitleCaseMapping:0x1D4CD + }, + { code:0x1D4CE + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4CE + ,simpleLowerCaseMapping:0x1D4CE + ,simpleTitleCaseMapping:0x1D4CE + }, + { code:0x1D4CF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4CF + ,simpleLowerCaseMapping:0x1D4CF + ,simpleTitleCaseMapping:0x1D4CF + }, + { code:0x1D4D0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4D0 + ,simpleLowerCaseMapping:0x1D4D0 + ,simpleTitleCaseMapping:0x1D4D0 + }, + { code:0x1D4D1 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4D1 + ,simpleLowerCaseMapping:0x1D4D1 + ,simpleTitleCaseMapping:0x1D4D1 + }, + { code:0x1D4D2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4D2 + ,simpleLowerCaseMapping:0x1D4D2 + ,simpleTitleCaseMapping:0x1D4D2 + }, + { code:0x1D4D3 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4D3 + ,simpleLowerCaseMapping:0x1D4D3 + ,simpleTitleCaseMapping:0x1D4D3 + }, + { code:0x1D4D4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4D4 + ,simpleLowerCaseMapping:0x1D4D4 + ,simpleTitleCaseMapping:0x1D4D4 + }, + { code:0x1D4D5 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4D5 + ,simpleLowerCaseMapping:0x1D4D5 + ,simpleTitleCaseMapping:0x1D4D5 + }, + { code:0x1D4D6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4D6 + ,simpleLowerCaseMapping:0x1D4D6 + ,simpleTitleCaseMapping:0x1D4D6 + }, + { code:0x1D4D7 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4D7 + ,simpleLowerCaseMapping:0x1D4D7 + ,simpleTitleCaseMapping:0x1D4D7 + }, + { code:0x1D4D8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4D8 + ,simpleLowerCaseMapping:0x1D4D8 + ,simpleTitleCaseMapping:0x1D4D8 + }, + { code:0x1D4D9 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4D9 + ,simpleLowerCaseMapping:0x1D4D9 + ,simpleTitleCaseMapping:0x1D4D9 + }, + { code:0x1D4DA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4DA + ,simpleLowerCaseMapping:0x1D4DA + ,simpleTitleCaseMapping:0x1D4DA + }, + { code:0x1D4DB + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4DB + ,simpleLowerCaseMapping:0x1D4DB + ,simpleTitleCaseMapping:0x1D4DB + }, + { code:0x1D4DC + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4DC + ,simpleLowerCaseMapping:0x1D4DC + ,simpleTitleCaseMapping:0x1D4DC + }, + { code:0x1D4DD + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4DD + ,simpleLowerCaseMapping:0x1D4DD + ,simpleTitleCaseMapping:0x1D4DD + }, + { code:0x1D4DE + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4DE + ,simpleLowerCaseMapping:0x1D4DE + ,simpleTitleCaseMapping:0x1D4DE + }, + { code:0x1D4DF + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4DF + ,simpleLowerCaseMapping:0x1D4DF + ,simpleTitleCaseMapping:0x1D4DF + }, + { code:0x1D4E0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4E0 + ,simpleLowerCaseMapping:0x1D4E0 + ,simpleTitleCaseMapping:0x1D4E0 + }, + { code:0x1D4E1 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4E1 + ,simpleLowerCaseMapping:0x1D4E1 + ,simpleTitleCaseMapping:0x1D4E1 + }, + { code:0x1D4E2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4E2 + ,simpleLowerCaseMapping:0x1D4E2 + ,simpleTitleCaseMapping:0x1D4E2 + }, + { code:0x1D4E3 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4E3 + ,simpleLowerCaseMapping:0x1D4E3 + ,simpleTitleCaseMapping:0x1D4E3 + }, + { code:0x1D4E4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4E4 + ,simpleLowerCaseMapping:0x1D4E4 + ,simpleTitleCaseMapping:0x1D4E4 + }, + { code:0x1D4E5 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4E5 + ,simpleLowerCaseMapping:0x1D4E5 + ,simpleTitleCaseMapping:0x1D4E5 + }, + { code:0x1D4E6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4E6 + ,simpleLowerCaseMapping:0x1D4E6 + ,simpleTitleCaseMapping:0x1D4E6 + }, + { code:0x1D4E7 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4E7 + ,simpleLowerCaseMapping:0x1D4E7 + ,simpleTitleCaseMapping:0x1D4E7 + }, + { code:0x1D4E8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4E8 + ,simpleLowerCaseMapping:0x1D4E8 + ,simpleTitleCaseMapping:0x1D4E8 + }, + { code:0x1D4E9 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D4E9 + ,simpleLowerCaseMapping:0x1D4E9 + ,simpleTitleCaseMapping:0x1D4E9 + }, + { code:0x1D4EA + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4EA + ,simpleLowerCaseMapping:0x1D4EA + ,simpleTitleCaseMapping:0x1D4EA + }, + { code:0x1D4EB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4EB + ,simpleLowerCaseMapping:0x1D4EB + ,simpleTitleCaseMapping:0x1D4EB + }, + { code:0x1D4EC + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4EC + ,simpleLowerCaseMapping:0x1D4EC + ,simpleTitleCaseMapping:0x1D4EC + }, + { code:0x1D4ED + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4ED + ,simpleLowerCaseMapping:0x1D4ED + ,simpleTitleCaseMapping:0x1D4ED + }, + { code:0x1D4EE + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4EE + ,simpleLowerCaseMapping:0x1D4EE + ,simpleTitleCaseMapping:0x1D4EE + }, + { code:0x1D4EF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4EF + ,simpleLowerCaseMapping:0x1D4EF + ,simpleTitleCaseMapping:0x1D4EF + }, + { code:0x1D4F0 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4F0 + ,simpleLowerCaseMapping:0x1D4F0 + ,simpleTitleCaseMapping:0x1D4F0 + }, + { code:0x1D4F1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4F1 + ,simpleLowerCaseMapping:0x1D4F1 + ,simpleTitleCaseMapping:0x1D4F1 + }, + { code:0x1D4F2 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4F2 + ,simpleLowerCaseMapping:0x1D4F2 + ,simpleTitleCaseMapping:0x1D4F2 + }, + { code:0x1D4F3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4F3 + ,simpleLowerCaseMapping:0x1D4F3 + ,simpleTitleCaseMapping:0x1D4F3 + }, + { code:0x1D4F4 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4F4 + ,simpleLowerCaseMapping:0x1D4F4 + ,simpleTitleCaseMapping:0x1D4F4 + }, + { code:0x1D4F5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4F5 + ,simpleLowerCaseMapping:0x1D4F5 + ,simpleTitleCaseMapping:0x1D4F5 + }, + { code:0x1D4F6 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4F6 + ,simpleLowerCaseMapping:0x1D4F6 + ,simpleTitleCaseMapping:0x1D4F6 + }, + { code:0x1D4F7 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4F7 + ,simpleLowerCaseMapping:0x1D4F7 + ,simpleTitleCaseMapping:0x1D4F7 + }, + { code:0x1D4F8 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4F8 + ,simpleLowerCaseMapping:0x1D4F8 + ,simpleTitleCaseMapping:0x1D4F8 + }, + { code:0x1D4F9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4F9 + ,simpleLowerCaseMapping:0x1D4F9 + ,simpleTitleCaseMapping:0x1D4F9 + }, + { code:0x1D4FA + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4FA + ,simpleLowerCaseMapping:0x1D4FA + ,simpleTitleCaseMapping:0x1D4FA + }, + { code:0x1D4FB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4FB + ,simpleLowerCaseMapping:0x1D4FB + ,simpleTitleCaseMapping:0x1D4FB + }, + { code:0x1D4FC + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4FC + ,simpleLowerCaseMapping:0x1D4FC + ,simpleTitleCaseMapping:0x1D4FC + }, + { code:0x1D4FD + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4FD + ,simpleLowerCaseMapping:0x1D4FD + ,simpleTitleCaseMapping:0x1D4FD + }, + { code:0x1D4FE + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4FE + ,simpleLowerCaseMapping:0x1D4FE + ,simpleTitleCaseMapping:0x1D4FE + }, + { code:0x1D4FF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D4FF + ,simpleLowerCaseMapping:0x1D4FF + ,simpleTitleCaseMapping:0x1D4FF + }, + { code:0x1D500 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D500 + ,simpleLowerCaseMapping:0x1D500 + ,simpleTitleCaseMapping:0x1D500 + }, + { code:0x1D501 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D501 + ,simpleLowerCaseMapping:0x1D501 + ,simpleTitleCaseMapping:0x1D501 + }, + { code:0x1D502 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D502 + ,simpleLowerCaseMapping:0x1D502 + ,simpleTitleCaseMapping:0x1D502 + }, + { code:0x1D503 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D503 + ,simpleLowerCaseMapping:0x1D503 + ,simpleTitleCaseMapping:0x1D503 + }, + { code:0x1D504 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D504 + ,simpleLowerCaseMapping:0x1D504 + ,simpleTitleCaseMapping:0x1D504 + }, + { code:0x1D505 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D505 + ,simpleLowerCaseMapping:0x1D505 + ,simpleTitleCaseMapping:0x1D505 + }, + { code:0x1D507 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D507 + ,simpleLowerCaseMapping:0x1D507 + ,simpleTitleCaseMapping:0x1D507 + }, + { code:0x1D508 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D508 + ,simpleLowerCaseMapping:0x1D508 + ,simpleTitleCaseMapping:0x1D508 + }, + { code:0x1D509 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D509 + ,simpleLowerCaseMapping:0x1D509 + ,simpleTitleCaseMapping:0x1D509 + }, + { code:0x1D50A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D50A + ,simpleLowerCaseMapping:0x1D50A + ,simpleTitleCaseMapping:0x1D50A + }, + { code:0x1D50D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D50D + ,simpleLowerCaseMapping:0x1D50D + ,simpleTitleCaseMapping:0x1D50D + }, + { code:0x1D50E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D50E + ,simpleLowerCaseMapping:0x1D50E + ,simpleTitleCaseMapping:0x1D50E + }, + { code:0x1D50F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D50F + ,simpleLowerCaseMapping:0x1D50F + ,simpleTitleCaseMapping:0x1D50F + }, + { code:0x1D510 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D510 + ,simpleLowerCaseMapping:0x1D510 + ,simpleTitleCaseMapping:0x1D510 + }, + { code:0x1D511 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D511 + ,simpleLowerCaseMapping:0x1D511 + ,simpleTitleCaseMapping:0x1D511 + }, + { code:0x1D512 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D512 + ,simpleLowerCaseMapping:0x1D512 + ,simpleTitleCaseMapping:0x1D512 + }, + { code:0x1D513 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D513 + ,simpleLowerCaseMapping:0x1D513 + ,simpleTitleCaseMapping:0x1D513 + }, + { code:0x1D514 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D514 + ,simpleLowerCaseMapping:0x1D514 + ,simpleTitleCaseMapping:0x1D514 + }, + { code:0x1D516 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D516 + ,simpleLowerCaseMapping:0x1D516 + ,simpleTitleCaseMapping:0x1D516 + }, + { code:0x1D517 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D517 + ,simpleLowerCaseMapping:0x1D517 + ,simpleTitleCaseMapping:0x1D517 + }, + { code:0x1D518 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D518 + ,simpleLowerCaseMapping:0x1D518 + ,simpleTitleCaseMapping:0x1D518 + }, + { code:0x1D519 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D519 + ,simpleLowerCaseMapping:0x1D519 + ,simpleTitleCaseMapping:0x1D519 + }, + { code:0x1D51A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D51A + ,simpleLowerCaseMapping:0x1D51A + ,simpleTitleCaseMapping:0x1D51A + }, + { code:0x1D51B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D51B + ,simpleLowerCaseMapping:0x1D51B + ,simpleTitleCaseMapping:0x1D51B + }, + { code:0x1D51C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D51C + ,simpleLowerCaseMapping:0x1D51C + ,simpleTitleCaseMapping:0x1D51C + }, + { code:0x1D51E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D51E + ,simpleLowerCaseMapping:0x1D51E + ,simpleTitleCaseMapping:0x1D51E + }, + { code:0x1D51F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D51F + ,simpleLowerCaseMapping:0x1D51F + ,simpleTitleCaseMapping:0x1D51F + }, + { code:0x1D520 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D520 + ,simpleLowerCaseMapping:0x1D520 + ,simpleTitleCaseMapping:0x1D520 + }, + { code:0x1D521 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D521 + ,simpleLowerCaseMapping:0x1D521 + ,simpleTitleCaseMapping:0x1D521 + }, + { code:0x1D522 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D522 + ,simpleLowerCaseMapping:0x1D522 + ,simpleTitleCaseMapping:0x1D522 + }, + { code:0x1D523 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D523 + ,simpleLowerCaseMapping:0x1D523 + ,simpleTitleCaseMapping:0x1D523 + }, + { code:0x1D524 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D524 + ,simpleLowerCaseMapping:0x1D524 + ,simpleTitleCaseMapping:0x1D524 + }, + { code:0x1D525 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D525 + ,simpleLowerCaseMapping:0x1D525 + ,simpleTitleCaseMapping:0x1D525 + }, + { code:0x1D526 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D526 + ,simpleLowerCaseMapping:0x1D526 + ,simpleTitleCaseMapping:0x1D526 + }, + { code:0x1D527 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D527 + ,simpleLowerCaseMapping:0x1D527 + ,simpleTitleCaseMapping:0x1D527 + }, + { code:0x1D528 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D528 + ,simpleLowerCaseMapping:0x1D528 + ,simpleTitleCaseMapping:0x1D528 + }, + { code:0x1D529 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D529 + ,simpleLowerCaseMapping:0x1D529 + ,simpleTitleCaseMapping:0x1D529 + }, + { code:0x1D52A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D52A + ,simpleLowerCaseMapping:0x1D52A + ,simpleTitleCaseMapping:0x1D52A + }, + { code:0x1D52B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D52B + ,simpleLowerCaseMapping:0x1D52B + ,simpleTitleCaseMapping:0x1D52B + }, + { code:0x1D52C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D52C + ,simpleLowerCaseMapping:0x1D52C + ,simpleTitleCaseMapping:0x1D52C + }, + { code:0x1D52D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D52D + ,simpleLowerCaseMapping:0x1D52D + ,simpleTitleCaseMapping:0x1D52D + }, + { code:0x1D52E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D52E + ,simpleLowerCaseMapping:0x1D52E + ,simpleTitleCaseMapping:0x1D52E + }, + { code:0x1D52F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D52F + ,simpleLowerCaseMapping:0x1D52F + ,simpleTitleCaseMapping:0x1D52F + }, + { code:0x1D530 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D530 + ,simpleLowerCaseMapping:0x1D530 + ,simpleTitleCaseMapping:0x1D530 + }, + { code:0x1D531 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D531 + ,simpleLowerCaseMapping:0x1D531 + ,simpleTitleCaseMapping:0x1D531 + }, + { code:0x1D532 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D532 + ,simpleLowerCaseMapping:0x1D532 + ,simpleTitleCaseMapping:0x1D532 + }, + { code:0x1D533 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D533 + ,simpleLowerCaseMapping:0x1D533 + ,simpleTitleCaseMapping:0x1D533 + }, + { code:0x1D534 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D534 + ,simpleLowerCaseMapping:0x1D534 + ,simpleTitleCaseMapping:0x1D534 + }, + { code:0x1D535 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D535 + ,simpleLowerCaseMapping:0x1D535 + ,simpleTitleCaseMapping:0x1D535 + }, + { code:0x1D536 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D536 + ,simpleLowerCaseMapping:0x1D536 + ,simpleTitleCaseMapping:0x1D536 + }, + { code:0x1D537 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D537 + ,simpleLowerCaseMapping:0x1D537 + ,simpleTitleCaseMapping:0x1D537 + }, + { code:0x1D538 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D538 + ,simpleLowerCaseMapping:0x1D538 + ,simpleTitleCaseMapping:0x1D538 + }, + { code:0x1D539 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D539 + ,simpleLowerCaseMapping:0x1D539 + ,simpleTitleCaseMapping:0x1D539 + }, + { code:0x1D53B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D53B + ,simpleLowerCaseMapping:0x1D53B + ,simpleTitleCaseMapping:0x1D53B + }, + { code:0x1D53C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D53C + ,simpleLowerCaseMapping:0x1D53C + ,simpleTitleCaseMapping:0x1D53C + }, + { code:0x1D53D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D53D + ,simpleLowerCaseMapping:0x1D53D + ,simpleTitleCaseMapping:0x1D53D + }, + { code:0x1D53E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D53E + ,simpleLowerCaseMapping:0x1D53E + ,simpleTitleCaseMapping:0x1D53E + }, + { code:0x1D540 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D540 + ,simpleLowerCaseMapping:0x1D540 + ,simpleTitleCaseMapping:0x1D540 + }, + { code:0x1D541 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D541 + ,simpleLowerCaseMapping:0x1D541 + ,simpleTitleCaseMapping:0x1D541 + }, + { code:0x1D542 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D542 + ,simpleLowerCaseMapping:0x1D542 + ,simpleTitleCaseMapping:0x1D542 + }, + { code:0x1D543 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D543 + ,simpleLowerCaseMapping:0x1D543 + ,simpleTitleCaseMapping:0x1D543 + }, + { code:0x1D544 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D544 + ,simpleLowerCaseMapping:0x1D544 + ,simpleTitleCaseMapping:0x1D544 + }, + { code:0x1D546 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D546 + ,simpleLowerCaseMapping:0x1D546 + ,simpleTitleCaseMapping:0x1D546 + }, + { code:0x1D54A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D54A + ,simpleLowerCaseMapping:0x1D54A + ,simpleTitleCaseMapping:0x1D54A + }, + { code:0x1D54B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D54B + ,simpleLowerCaseMapping:0x1D54B + ,simpleTitleCaseMapping:0x1D54B + }, + { code:0x1D54C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D54C + ,simpleLowerCaseMapping:0x1D54C + ,simpleTitleCaseMapping:0x1D54C + }, + { code:0x1D54D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D54D + ,simpleLowerCaseMapping:0x1D54D + ,simpleTitleCaseMapping:0x1D54D + }, + { code:0x1D54E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D54E + ,simpleLowerCaseMapping:0x1D54E + ,simpleTitleCaseMapping:0x1D54E + }, + { code:0x1D54F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D54F + ,simpleLowerCaseMapping:0x1D54F + ,simpleTitleCaseMapping:0x1D54F + }, + { code:0x1D550 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D550 + ,simpleLowerCaseMapping:0x1D550 + ,simpleTitleCaseMapping:0x1D550 + }, + { code:0x1D552 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D552 + ,simpleLowerCaseMapping:0x1D552 + ,simpleTitleCaseMapping:0x1D552 + }, + { code:0x1D553 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D553 + ,simpleLowerCaseMapping:0x1D553 + ,simpleTitleCaseMapping:0x1D553 + }, + { code:0x1D554 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D554 + ,simpleLowerCaseMapping:0x1D554 + ,simpleTitleCaseMapping:0x1D554 + }, + { code:0x1D555 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D555 + ,simpleLowerCaseMapping:0x1D555 + ,simpleTitleCaseMapping:0x1D555 + }, + { code:0x1D556 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D556 + ,simpleLowerCaseMapping:0x1D556 + ,simpleTitleCaseMapping:0x1D556 + }, + { code:0x1D557 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D557 + ,simpleLowerCaseMapping:0x1D557 + ,simpleTitleCaseMapping:0x1D557 + }, + { code:0x1D558 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D558 + ,simpleLowerCaseMapping:0x1D558 + ,simpleTitleCaseMapping:0x1D558 + }, + { code:0x1D559 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D559 + ,simpleLowerCaseMapping:0x1D559 + ,simpleTitleCaseMapping:0x1D559 + }, + { code:0x1D55A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D55A + ,simpleLowerCaseMapping:0x1D55A + ,simpleTitleCaseMapping:0x1D55A + }, + { code:0x1D55B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D55B + ,simpleLowerCaseMapping:0x1D55B + ,simpleTitleCaseMapping:0x1D55B + }, + { code:0x1D55C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D55C + ,simpleLowerCaseMapping:0x1D55C + ,simpleTitleCaseMapping:0x1D55C + }, + { code:0x1D55D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D55D + ,simpleLowerCaseMapping:0x1D55D + ,simpleTitleCaseMapping:0x1D55D + }, + { code:0x1D55E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D55E + ,simpleLowerCaseMapping:0x1D55E + ,simpleTitleCaseMapping:0x1D55E + }, + { code:0x1D55F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D55F + ,simpleLowerCaseMapping:0x1D55F + ,simpleTitleCaseMapping:0x1D55F + }, + { code:0x1D560 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D560 + ,simpleLowerCaseMapping:0x1D560 + ,simpleTitleCaseMapping:0x1D560 + }, + { code:0x1D561 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D561 + ,simpleLowerCaseMapping:0x1D561 + ,simpleTitleCaseMapping:0x1D561 + }, + { code:0x1D562 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D562 + ,simpleLowerCaseMapping:0x1D562 + ,simpleTitleCaseMapping:0x1D562 + }, + { code:0x1D563 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D563 + ,simpleLowerCaseMapping:0x1D563 + ,simpleTitleCaseMapping:0x1D563 + }, + { code:0x1D564 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D564 + ,simpleLowerCaseMapping:0x1D564 + ,simpleTitleCaseMapping:0x1D564 + }, + { code:0x1D565 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D565 + ,simpleLowerCaseMapping:0x1D565 + ,simpleTitleCaseMapping:0x1D565 + }, + { code:0x1D566 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D566 + ,simpleLowerCaseMapping:0x1D566 + ,simpleTitleCaseMapping:0x1D566 + }, + { code:0x1D567 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D567 + ,simpleLowerCaseMapping:0x1D567 + ,simpleTitleCaseMapping:0x1D567 + }, + { code:0x1D568 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D568 + ,simpleLowerCaseMapping:0x1D568 + ,simpleTitleCaseMapping:0x1D568 + }, + { code:0x1D569 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D569 + ,simpleLowerCaseMapping:0x1D569 + ,simpleTitleCaseMapping:0x1D569 + }, + { code:0x1D56A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D56A + ,simpleLowerCaseMapping:0x1D56A + ,simpleTitleCaseMapping:0x1D56A + }, + { code:0x1D56B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D56B + ,simpleLowerCaseMapping:0x1D56B + ,simpleTitleCaseMapping:0x1D56B + }, + { code:0x1D56C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D56C + ,simpleLowerCaseMapping:0x1D56C + ,simpleTitleCaseMapping:0x1D56C + }, + { code:0x1D56D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D56D + ,simpleLowerCaseMapping:0x1D56D + ,simpleTitleCaseMapping:0x1D56D + }, + { code:0x1D56E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D56E + ,simpleLowerCaseMapping:0x1D56E + ,simpleTitleCaseMapping:0x1D56E + }, + { code:0x1D56F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D56F + ,simpleLowerCaseMapping:0x1D56F + ,simpleTitleCaseMapping:0x1D56F + }, + { code:0x1D570 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D570 + ,simpleLowerCaseMapping:0x1D570 + ,simpleTitleCaseMapping:0x1D570 + }, + { code:0x1D571 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D571 + ,simpleLowerCaseMapping:0x1D571 + ,simpleTitleCaseMapping:0x1D571 + }, + { code:0x1D572 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D572 + ,simpleLowerCaseMapping:0x1D572 + ,simpleTitleCaseMapping:0x1D572 + }, + { code:0x1D573 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D573 + ,simpleLowerCaseMapping:0x1D573 + ,simpleTitleCaseMapping:0x1D573 + }, + { code:0x1D574 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D574 + ,simpleLowerCaseMapping:0x1D574 + ,simpleTitleCaseMapping:0x1D574 + }, + { code:0x1D575 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D575 + ,simpleLowerCaseMapping:0x1D575 + ,simpleTitleCaseMapping:0x1D575 + }, + { code:0x1D576 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D576 + ,simpleLowerCaseMapping:0x1D576 + ,simpleTitleCaseMapping:0x1D576 + }, + { code:0x1D577 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D577 + ,simpleLowerCaseMapping:0x1D577 + ,simpleTitleCaseMapping:0x1D577 + }, + { code:0x1D578 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D578 + ,simpleLowerCaseMapping:0x1D578 + ,simpleTitleCaseMapping:0x1D578 + }, + { code:0x1D579 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D579 + ,simpleLowerCaseMapping:0x1D579 + ,simpleTitleCaseMapping:0x1D579 + }, + { code:0x1D57A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D57A + ,simpleLowerCaseMapping:0x1D57A + ,simpleTitleCaseMapping:0x1D57A + }, + { code:0x1D57B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D57B + ,simpleLowerCaseMapping:0x1D57B + ,simpleTitleCaseMapping:0x1D57B + }, + { code:0x1D57C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D57C + ,simpleLowerCaseMapping:0x1D57C + ,simpleTitleCaseMapping:0x1D57C + }, + { code:0x1D57D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D57D + ,simpleLowerCaseMapping:0x1D57D + ,simpleTitleCaseMapping:0x1D57D + }, + { code:0x1D57E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D57E + ,simpleLowerCaseMapping:0x1D57E + ,simpleTitleCaseMapping:0x1D57E + }, + { code:0x1D57F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D57F + ,simpleLowerCaseMapping:0x1D57F + ,simpleTitleCaseMapping:0x1D57F + }, + { code:0x1D580 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D580 + ,simpleLowerCaseMapping:0x1D580 + ,simpleTitleCaseMapping:0x1D580 + }, + { code:0x1D581 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D581 + ,simpleLowerCaseMapping:0x1D581 + ,simpleTitleCaseMapping:0x1D581 + }, + { code:0x1D582 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D582 + ,simpleLowerCaseMapping:0x1D582 + ,simpleTitleCaseMapping:0x1D582 + }, + { code:0x1D583 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D583 + ,simpleLowerCaseMapping:0x1D583 + ,simpleTitleCaseMapping:0x1D583 + }, + { code:0x1D584 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D584 + ,simpleLowerCaseMapping:0x1D584 + ,simpleTitleCaseMapping:0x1D584 + }, + { code:0x1D585 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D585 + ,simpleLowerCaseMapping:0x1D585 + ,simpleTitleCaseMapping:0x1D585 + }, + { code:0x1D586 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D586 + ,simpleLowerCaseMapping:0x1D586 + ,simpleTitleCaseMapping:0x1D586 + }, + { code:0x1D587 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D587 + ,simpleLowerCaseMapping:0x1D587 + ,simpleTitleCaseMapping:0x1D587 + }, + { code:0x1D588 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D588 + ,simpleLowerCaseMapping:0x1D588 + ,simpleTitleCaseMapping:0x1D588 + }, + { code:0x1D589 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D589 + ,simpleLowerCaseMapping:0x1D589 + ,simpleTitleCaseMapping:0x1D589 + }, + { code:0x1D58A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D58A + ,simpleLowerCaseMapping:0x1D58A + ,simpleTitleCaseMapping:0x1D58A + }, + { code:0x1D58B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D58B + ,simpleLowerCaseMapping:0x1D58B + ,simpleTitleCaseMapping:0x1D58B + }, + { code:0x1D58C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D58C + ,simpleLowerCaseMapping:0x1D58C + ,simpleTitleCaseMapping:0x1D58C + }, + { code:0x1D58D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D58D + ,simpleLowerCaseMapping:0x1D58D + ,simpleTitleCaseMapping:0x1D58D + }, + { code:0x1D58E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D58E + ,simpleLowerCaseMapping:0x1D58E + ,simpleTitleCaseMapping:0x1D58E + }, + { code:0x1D58F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D58F + ,simpleLowerCaseMapping:0x1D58F + ,simpleTitleCaseMapping:0x1D58F + }, + { code:0x1D590 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D590 + ,simpleLowerCaseMapping:0x1D590 + ,simpleTitleCaseMapping:0x1D590 + }, + { code:0x1D591 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D591 + ,simpleLowerCaseMapping:0x1D591 + ,simpleTitleCaseMapping:0x1D591 + }, + { code:0x1D592 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D592 + ,simpleLowerCaseMapping:0x1D592 + ,simpleTitleCaseMapping:0x1D592 + }, + { code:0x1D593 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D593 + ,simpleLowerCaseMapping:0x1D593 + ,simpleTitleCaseMapping:0x1D593 + }, + { code:0x1D594 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D594 + ,simpleLowerCaseMapping:0x1D594 + ,simpleTitleCaseMapping:0x1D594 + }, + { code:0x1D595 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D595 + ,simpleLowerCaseMapping:0x1D595 + ,simpleTitleCaseMapping:0x1D595 + }, + { code:0x1D596 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D596 + ,simpleLowerCaseMapping:0x1D596 + ,simpleTitleCaseMapping:0x1D596 + }, + { code:0x1D597 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D597 + ,simpleLowerCaseMapping:0x1D597 + ,simpleTitleCaseMapping:0x1D597 + }, + { code:0x1D598 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D598 + ,simpleLowerCaseMapping:0x1D598 + ,simpleTitleCaseMapping:0x1D598 + }, + { code:0x1D599 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D599 + ,simpleLowerCaseMapping:0x1D599 + ,simpleTitleCaseMapping:0x1D599 + }, + { code:0x1D59A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D59A + ,simpleLowerCaseMapping:0x1D59A + ,simpleTitleCaseMapping:0x1D59A + }, + { code:0x1D59B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D59B + ,simpleLowerCaseMapping:0x1D59B + ,simpleTitleCaseMapping:0x1D59B + }, + { code:0x1D59C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D59C + ,simpleLowerCaseMapping:0x1D59C + ,simpleTitleCaseMapping:0x1D59C + }, + { code:0x1D59D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D59D + ,simpleLowerCaseMapping:0x1D59D + ,simpleTitleCaseMapping:0x1D59D + }, + { code:0x1D59E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D59E + ,simpleLowerCaseMapping:0x1D59E + ,simpleTitleCaseMapping:0x1D59E + }, + { code:0x1D59F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D59F + ,simpleLowerCaseMapping:0x1D59F + ,simpleTitleCaseMapping:0x1D59F + }, + { code:0x1D5A0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5A0 + ,simpleLowerCaseMapping:0x1D5A0 + ,simpleTitleCaseMapping:0x1D5A0 + }, + { code:0x1D5A1 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5A1 + ,simpleLowerCaseMapping:0x1D5A1 + ,simpleTitleCaseMapping:0x1D5A1 + }, + { code:0x1D5A2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5A2 + ,simpleLowerCaseMapping:0x1D5A2 + ,simpleTitleCaseMapping:0x1D5A2 + }, + { code:0x1D5A3 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5A3 + ,simpleLowerCaseMapping:0x1D5A3 + ,simpleTitleCaseMapping:0x1D5A3 + }, + { code:0x1D5A4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5A4 + ,simpleLowerCaseMapping:0x1D5A4 + ,simpleTitleCaseMapping:0x1D5A4 + }, + { code:0x1D5A5 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5A5 + ,simpleLowerCaseMapping:0x1D5A5 + ,simpleTitleCaseMapping:0x1D5A5 + }, + { code:0x1D5A6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5A6 + ,simpleLowerCaseMapping:0x1D5A6 + ,simpleTitleCaseMapping:0x1D5A6 + }, + { code:0x1D5A7 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5A7 + ,simpleLowerCaseMapping:0x1D5A7 + ,simpleTitleCaseMapping:0x1D5A7 + }, + { code:0x1D5A8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5A8 + ,simpleLowerCaseMapping:0x1D5A8 + ,simpleTitleCaseMapping:0x1D5A8 + }, + { code:0x1D5A9 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5A9 + ,simpleLowerCaseMapping:0x1D5A9 + ,simpleTitleCaseMapping:0x1D5A9 + }, + { code:0x1D5AA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5AA + ,simpleLowerCaseMapping:0x1D5AA + ,simpleTitleCaseMapping:0x1D5AA + }, + { code:0x1D5AB + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5AB + ,simpleLowerCaseMapping:0x1D5AB + ,simpleTitleCaseMapping:0x1D5AB + }, + { code:0x1D5AC + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5AC + ,simpleLowerCaseMapping:0x1D5AC + ,simpleTitleCaseMapping:0x1D5AC + }, + { code:0x1D5AD + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5AD + ,simpleLowerCaseMapping:0x1D5AD + ,simpleTitleCaseMapping:0x1D5AD + }, + { code:0x1D5AE + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5AE + ,simpleLowerCaseMapping:0x1D5AE + ,simpleTitleCaseMapping:0x1D5AE + }, + { code:0x1D5AF + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5AF + ,simpleLowerCaseMapping:0x1D5AF + ,simpleTitleCaseMapping:0x1D5AF + }, + { code:0x1D5B0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5B0 + ,simpleLowerCaseMapping:0x1D5B0 + ,simpleTitleCaseMapping:0x1D5B0 + }, + { code:0x1D5B1 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5B1 + ,simpleLowerCaseMapping:0x1D5B1 + ,simpleTitleCaseMapping:0x1D5B1 + }, + { code:0x1D5B2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5B2 + ,simpleLowerCaseMapping:0x1D5B2 + ,simpleTitleCaseMapping:0x1D5B2 + }, + { code:0x1D5B3 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5B3 + ,simpleLowerCaseMapping:0x1D5B3 + ,simpleTitleCaseMapping:0x1D5B3 + }, + { code:0x1D5B4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5B4 + ,simpleLowerCaseMapping:0x1D5B4 + ,simpleTitleCaseMapping:0x1D5B4 + }, + { code:0x1D5B5 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5B5 + ,simpleLowerCaseMapping:0x1D5B5 + ,simpleTitleCaseMapping:0x1D5B5 + }, + { code:0x1D5B6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5B6 + ,simpleLowerCaseMapping:0x1D5B6 + ,simpleTitleCaseMapping:0x1D5B6 + }, + { code:0x1D5B7 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5B7 + ,simpleLowerCaseMapping:0x1D5B7 + ,simpleTitleCaseMapping:0x1D5B7 + }, + { code:0x1D5B8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5B8 + ,simpleLowerCaseMapping:0x1D5B8 + ,simpleTitleCaseMapping:0x1D5B8 + }, + { code:0x1D5B9 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5B9 + ,simpleLowerCaseMapping:0x1D5B9 + ,simpleTitleCaseMapping:0x1D5B9 + }, + { code:0x1D5BA + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5BA + ,simpleLowerCaseMapping:0x1D5BA + ,simpleTitleCaseMapping:0x1D5BA + }, + { code:0x1D5BB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5BB + ,simpleLowerCaseMapping:0x1D5BB + ,simpleTitleCaseMapping:0x1D5BB + }, + { code:0x1D5BC + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5BC + ,simpleLowerCaseMapping:0x1D5BC + ,simpleTitleCaseMapping:0x1D5BC + }, + { code:0x1D5BD + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5BD + ,simpleLowerCaseMapping:0x1D5BD + ,simpleTitleCaseMapping:0x1D5BD + }, + { code:0x1D5BE + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5BE + ,simpleLowerCaseMapping:0x1D5BE + ,simpleTitleCaseMapping:0x1D5BE + }, + { code:0x1D5BF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5BF + ,simpleLowerCaseMapping:0x1D5BF + ,simpleTitleCaseMapping:0x1D5BF + }, + { code:0x1D5C0 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5C0 + ,simpleLowerCaseMapping:0x1D5C0 + ,simpleTitleCaseMapping:0x1D5C0 + }, + { code:0x1D5C1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5C1 + ,simpleLowerCaseMapping:0x1D5C1 + ,simpleTitleCaseMapping:0x1D5C1 + }, + { code:0x1D5C2 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5C2 + ,simpleLowerCaseMapping:0x1D5C2 + ,simpleTitleCaseMapping:0x1D5C2 + }, + { code:0x1D5C3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5C3 + ,simpleLowerCaseMapping:0x1D5C3 + ,simpleTitleCaseMapping:0x1D5C3 + }, + { code:0x1D5C4 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5C4 + ,simpleLowerCaseMapping:0x1D5C4 + ,simpleTitleCaseMapping:0x1D5C4 + }, + { code:0x1D5C5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5C5 + ,simpleLowerCaseMapping:0x1D5C5 + ,simpleTitleCaseMapping:0x1D5C5 + }, + { code:0x1D5C6 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5C6 + ,simpleLowerCaseMapping:0x1D5C6 + ,simpleTitleCaseMapping:0x1D5C6 + }, + { code:0x1D5C7 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5C7 + ,simpleLowerCaseMapping:0x1D5C7 + ,simpleTitleCaseMapping:0x1D5C7 + }, + { code:0x1D5C8 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5C8 + ,simpleLowerCaseMapping:0x1D5C8 + ,simpleTitleCaseMapping:0x1D5C8 + }, + { code:0x1D5C9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5C9 + ,simpleLowerCaseMapping:0x1D5C9 + ,simpleTitleCaseMapping:0x1D5C9 + }, + { code:0x1D5CA + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5CA + ,simpleLowerCaseMapping:0x1D5CA + ,simpleTitleCaseMapping:0x1D5CA + }, + { code:0x1D5CB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5CB + ,simpleLowerCaseMapping:0x1D5CB + ,simpleTitleCaseMapping:0x1D5CB + }, + { code:0x1D5CC + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5CC + ,simpleLowerCaseMapping:0x1D5CC + ,simpleTitleCaseMapping:0x1D5CC + }, + { code:0x1D5CD + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5CD + ,simpleLowerCaseMapping:0x1D5CD + ,simpleTitleCaseMapping:0x1D5CD + }, + { code:0x1D5CE + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5CE + ,simpleLowerCaseMapping:0x1D5CE + ,simpleTitleCaseMapping:0x1D5CE + }, + { code:0x1D5CF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5CF + ,simpleLowerCaseMapping:0x1D5CF + ,simpleTitleCaseMapping:0x1D5CF + }, + { code:0x1D5D0 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5D0 + ,simpleLowerCaseMapping:0x1D5D0 + ,simpleTitleCaseMapping:0x1D5D0 + }, + { code:0x1D5D1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5D1 + ,simpleLowerCaseMapping:0x1D5D1 + ,simpleTitleCaseMapping:0x1D5D1 + }, + { code:0x1D5D2 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5D2 + ,simpleLowerCaseMapping:0x1D5D2 + ,simpleTitleCaseMapping:0x1D5D2 + }, + { code:0x1D5D3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5D3 + ,simpleLowerCaseMapping:0x1D5D3 + ,simpleTitleCaseMapping:0x1D5D3 + }, + { code:0x1D5D4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5D4 + ,simpleLowerCaseMapping:0x1D5D4 + ,simpleTitleCaseMapping:0x1D5D4 + }, + { code:0x1D5D5 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5D5 + ,simpleLowerCaseMapping:0x1D5D5 + ,simpleTitleCaseMapping:0x1D5D5 + }, + { code:0x1D5D6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5D6 + ,simpleLowerCaseMapping:0x1D5D6 + ,simpleTitleCaseMapping:0x1D5D6 + }, + { code:0x1D5D7 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5D7 + ,simpleLowerCaseMapping:0x1D5D7 + ,simpleTitleCaseMapping:0x1D5D7 + }, + { code:0x1D5D8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5D8 + ,simpleLowerCaseMapping:0x1D5D8 + ,simpleTitleCaseMapping:0x1D5D8 + }, + { code:0x1D5D9 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5D9 + ,simpleLowerCaseMapping:0x1D5D9 + ,simpleTitleCaseMapping:0x1D5D9 + }, + { code:0x1D5DA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5DA + ,simpleLowerCaseMapping:0x1D5DA + ,simpleTitleCaseMapping:0x1D5DA + }, + { code:0x1D5DB + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5DB + ,simpleLowerCaseMapping:0x1D5DB + ,simpleTitleCaseMapping:0x1D5DB + }, + { code:0x1D5DC + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5DC + ,simpleLowerCaseMapping:0x1D5DC + ,simpleTitleCaseMapping:0x1D5DC + }, + { code:0x1D5DD + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5DD + ,simpleLowerCaseMapping:0x1D5DD + ,simpleTitleCaseMapping:0x1D5DD + }, + { code:0x1D5DE + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5DE + ,simpleLowerCaseMapping:0x1D5DE + ,simpleTitleCaseMapping:0x1D5DE + }, + { code:0x1D5DF + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5DF + ,simpleLowerCaseMapping:0x1D5DF + ,simpleTitleCaseMapping:0x1D5DF + }, + { code:0x1D5E0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5E0 + ,simpleLowerCaseMapping:0x1D5E0 + ,simpleTitleCaseMapping:0x1D5E0 + }, + { code:0x1D5E1 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5E1 + ,simpleLowerCaseMapping:0x1D5E1 + ,simpleTitleCaseMapping:0x1D5E1 + }, + { code:0x1D5E2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5E2 + ,simpleLowerCaseMapping:0x1D5E2 + ,simpleTitleCaseMapping:0x1D5E2 + }, + { code:0x1D5E3 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5E3 + ,simpleLowerCaseMapping:0x1D5E3 + ,simpleTitleCaseMapping:0x1D5E3 + }, + { code:0x1D5E4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5E4 + ,simpleLowerCaseMapping:0x1D5E4 + ,simpleTitleCaseMapping:0x1D5E4 + }, + { code:0x1D5E5 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5E5 + ,simpleLowerCaseMapping:0x1D5E5 + ,simpleTitleCaseMapping:0x1D5E5 + }, + { code:0x1D5E6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5E6 + ,simpleLowerCaseMapping:0x1D5E6 + ,simpleTitleCaseMapping:0x1D5E6 + }, + { code:0x1D5E7 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5E7 + ,simpleLowerCaseMapping:0x1D5E7 + ,simpleTitleCaseMapping:0x1D5E7 + }, + { code:0x1D5E8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5E8 + ,simpleLowerCaseMapping:0x1D5E8 + ,simpleTitleCaseMapping:0x1D5E8 + }, + { code:0x1D5E9 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5E9 + ,simpleLowerCaseMapping:0x1D5E9 + ,simpleTitleCaseMapping:0x1D5E9 + }, + { code:0x1D5EA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5EA + ,simpleLowerCaseMapping:0x1D5EA + ,simpleTitleCaseMapping:0x1D5EA + }, + { code:0x1D5EB + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5EB + ,simpleLowerCaseMapping:0x1D5EB + ,simpleTitleCaseMapping:0x1D5EB + }, + { code:0x1D5EC + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5EC + ,simpleLowerCaseMapping:0x1D5EC + ,simpleTitleCaseMapping:0x1D5EC + }, + { code:0x1D5ED + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D5ED + ,simpleLowerCaseMapping:0x1D5ED + ,simpleTitleCaseMapping:0x1D5ED + }, + { code:0x1D5EE + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5EE + ,simpleLowerCaseMapping:0x1D5EE + ,simpleTitleCaseMapping:0x1D5EE + }, + { code:0x1D5EF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5EF + ,simpleLowerCaseMapping:0x1D5EF + ,simpleTitleCaseMapping:0x1D5EF + }, + { code:0x1D5F0 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5F0 + ,simpleLowerCaseMapping:0x1D5F0 + ,simpleTitleCaseMapping:0x1D5F0 + }, + { code:0x1D5F1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5F1 + ,simpleLowerCaseMapping:0x1D5F1 + ,simpleTitleCaseMapping:0x1D5F1 + }, + { code:0x1D5F2 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5F2 + ,simpleLowerCaseMapping:0x1D5F2 + ,simpleTitleCaseMapping:0x1D5F2 + }, + { code:0x1D5F3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5F3 + ,simpleLowerCaseMapping:0x1D5F3 + ,simpleTitleCaseMapping:0x1D5F3 + }, + { code:0x1D5F4 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5F4 + ,simpleLowerCaseMapping:0x1D5F4 + ,simpleTitleCaseMapping:0x1D5F4 + }, + { code:0x1D5F5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5F5 + ,simpleLowerCaseMapping:0x1D5F5 + ,simpleTitleCaseMapping:0x1D5F5 + }, + { code:0x1D5F6 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5F6 + ,simpleLowerCaseMapping:0x1D5F6 + ,simpleTitleCaseMapping:0x1D5F6 + }, + { code:0x1D5F7 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5F7 + ,simpleLowerCaseMapping:0x1D5F7 + ,simpleTitleCaseMapping:0x1D5F7 + }, + { code:0x1D5F8 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5F8 + ,simpleLowerCaseMapping:0x1D5F8 + ,simpleTitleCaseMapping:0x1D5F8 + }, + { code:0x1D5F9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5F9 + ,simpleLowerCaseMapping:0x1D5F9 + ,simpleTitleCaseMapping:0x1D5F9 + }, + { code:0x1D5FA + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5FA + ,simpleLowerCaseMapping:0x1D5FA + ,simpleTitleCaseMapping:0x1D5FA + }, + { code:0x1D5FB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5FB + ,simpleLowerCaseMapping:0x1D5FB + ,simpleTitleCaseMapping:0x1D5FB + }, + { code:0x1D5FC + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5FC + ,simpleLowerCaseMapping:0x1D5FC + ,simpleTitleCaseMapping:0x1D5FC + }, + { code:0x1D5FD + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5FD + ,simpleLowerCaseMapping:0x1D5FD + ,simpleTitleCaseMapping:0x1D5FD + }, + { code:0x1D5FE + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5FE + ,simpleLowerCaseMapping:0x1D5FE + ,simpleTitleCaseMapping:0x1D5FE + }, + { code:0x1D5FF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D5FF + ,simpleLowerCaseMapping:0x1D5FF + ,simpleTitleCaseMapping:0x1D5FF + }, + { code:0x1D600 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D600 + ,simpleLowerCaseMapping:0x1D600 + ,simpleTitleCaseMapping:0x1D600 + }, + { code:0x1D601 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D601 + ,simpleLowerCaseMapping:0x1D601 + ,simpleTitleCaseMapping:0x1D601 + }, + { code:0x1D602 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D602 + ,simpleLowerCaseMapping:0x1D602 + ,simpleTitleCaseMapping:0x1D602 + }, + { code:0x1D603 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D603 + ,simpleLowerCaseMapping:0x1D603 + ,simpleTitleCaseMapping:0x1D603 + }, + { code:0x1D604 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D604 + ,simpleLowerCaseMapping:0x1D604 + ,simpleTitleCaseMapping:0x1D604 + }, + { code:0x1D605 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D605 + ,simpleLowerCaseMapping:0x1D605 + ,simpleTitleCaseMapping:0x1D605 + }, + { code:0x1D606 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D606 + ,simpleLowerCaseMapping:0x1D606 + ,simpleTitleCaseMapping:0x1D606 + }, + { code:0x1D607 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D607 + ,simpleLowerCaseMapping:0x1D607 + ,simpleTitleCaseMapping:0x1D607 + }, + { code:0x1D608 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D608 + ,simpleLowerCaseMapping:0x1D608 + ,simpleTitleCaseMapping:0x1D608 + }, + { code:0x1D609 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D609 + ,simpleLowerCaseMapping:0x1D609 + ,simpleTitleCaseMapping:0x1D609 + }, + { code:0x1D60A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D60A + ,simpleLowerCaseMapping:0x1D60A + ,simpleTitleCaseMapping:0x1D60A + }, + { code:0x1D60B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D60B + ,simpleLowerCaseMapping:0x1D60B + ,simpleTitleCaseMapping:0x1D60B + }, + { code:0x1D60C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D60C + ,simpleLowerCaseMapping:0x1D60C + ,simpleTitleCaseMapping:0x1D60C + }, + { code:0x1D60D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D60D + ,simpleLowerCaseMapping:0x1D60D + ,simpleTitleCaseMapping:0x1D60D + }, + { code:0x1D60E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D60E + ,simpleLowerCaseMapping:0x1D60E + ,simpleTitleCaseMapping:0x1D60E + }, + { code:0x1D60F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D60F + ,simpleLowerCaseMapping:0x1D60F + ,simpleTitleCaseMapping:0x1D60F + }, + { code:0x1D610 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D610 + ,simpleLowerCaseMapping:0x1D610 + ,simpleTitleCaseMapping:0x1D610 + }, + { code:0x1D611 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D611 + ,simpleLowerCaseMapping:0x1D611 + ,simpleTitleCaseMapping:0x1D611 + }, + { code:0x1D612 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D612 + ,simpleLowerCaseMapping:0x1D612 + ,simpleTitleCaseMapping:0x1D612 + }, + { code:0x1D613 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D613 + ,simpleLowerCaseMapping:0x1D613 + ,simpleTitleCaseMapping:0x1D613 + }, + { code:0x1D614 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D614 + ,simpleLowerCaseMapping:0x1D614 + ,simpleTitleCaseMapping:0x1D614 + }, + { code:0x1D615 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D615 + ,simpleLowerCaseMapping:0x1D615 + ,simpleTitleCaseMapping:0x1D615 + }, + { code:0x1D616 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D616 + ,simpleLowerCaseMapping:0x1D616 + ,simpleTitleCaseMapping:0x1D616 + }, + { code:0x1D617 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D617 + ,simpleLowerCaseMapping:0x1D617 + ,simpleTitleCaseMapping:0x1D617 + }, + { code:0x1D618 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D618 + ,simpleLowerCaseMapping:0x1D618 + ,simpleTitleCaseMapping:0x1D618 + }, + { code:0x1D619 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D619 + ,simpleLowerCaseMapping:0x1D619 + ,simpleTitleCaseMapping:0x1D619 + }, + { code:0x1D61A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D61A + ,simpleLowerCaseMapping:0x1D61A + ,simpleTitleCaseMapping:0x1D61A + }, + { code:0x1D61B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D61B + ,simpleLowerCaseMapping:0x1D61B + ,simpleTitleCaseMapping:0x1D61B + }, + { code:0x1D61C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D61C + ,simpleLowerCaseMapping:0x1D61C + ,simpleTitleCaseMapping:0x1D61C + }, + { code:0x1D61D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D61D + ,simpleLowerCaseMapping:0x1D61D + ,simpleTitleCaseMapping:0x1D61D + }, + { code:0x1D61E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D61E + ,simpleLowerCaseMapping:0x1D61E + ,simpleTitleCaseMapping:0x1D61E + }, + { code:0x1D61F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D61F + ,simpleLowerCaseMapping:0x1D61F + ,simpleTitleCaseMapping:0x1D61F + }, + { code:0x1D620 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D620 + ,simpleLowerCaseMapping:0x1D620 + ,simpleTitleCaseMapping:0x1D620 + }, + { code:0x1D621 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D621 + ,simpleLowerCaseMapping:0x1D621 + ,simpleTitleCaseMapping:0x1D621 + }, + { code:0x1D622 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D622 + ,simpleLowerCaseMapping:0x1D622 + ,simpleTitleCaseMapping:0x1D622 + }, + { code:0x1D623 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D623 + ,simpleLowerCaseMapping:0x1D623 + ,simpleTitleCaseMapping:0x1D623 + }, + { code:0x1D624 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D624 + ,simpleLowerCaseMapping:0x1D624 + ,simpleTitleCaseMapping:0x1D624 + }, + { code:0x1D625 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D625 + ,simpleLowerCaseMapping:0x1D625 + ,simpleTitleCaseMapping:0x1D625 + }, + { code:0x1D626 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D626 + ,simpleLowerCaseMapping:0x1D626 + ,simpleTitleCaseMapping:0x1D626 + }, + { code:0x1D627 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D627 + ,simpleLowerCaseMapping:0x1D627 + ,simpleTitleCaseMapping:0x1D627 + }, + { code:0x1D628 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D628 + ,simpleLowerCaseMapping:0x1D628 + ,simpleTitleCaseMapping:0x1D628 + }, + { code:0x1D629 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D629 + ,simpleLowerCaseMapping:0x1D629 + ,simpleTitleCaseMapping:0x1D629 + }, + { code:0x1D62A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D62A + ,simpleLowerCaseMapping:0x1D62A + ,simpleTitleCaseMapping:0x1D62A + }, + { code:0x1D62B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D62B + ,simpleLowerCaseMapping:0x1D62B + ,simpleTitleCaseMapping:0x1D62B + }, + { code:0x1D62C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D62C + ,simpleLowerCaseMapping:0x1D62C + ,simpleTitleCaseMapping:0x1D62C + }, + { code:0x1D62D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D62D + ,simpleLowerCaseMapping:0x1D62D + ,simpleTitleCaseMapping:0x1D62D + }, + { code:0x1D62E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D62E + ,simpleLowerCaseMapping:0x1D62E + ,simpleTitleCaseMapping:0x1D62E + }, + { code:0x1D62F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D62F + ,simpleLowerCaseMapping:0x1D62F + ,simpleTitleCaseMapping:0x1D62F + }, + { code:0x1D630 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D630 + ,simpleLowerCaseMapping:0x1D630 + ,simpleTitleCaseMapping:0x1D630 + }, + { code:0x1D631 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D631 + ,simpleLowerCaseMapping:0x1D631 + ,simpleTitleCaseMapping:0x1D631 + }, + { code:0x1D632 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D632 + ,simpleLowerCaseMapping:0x1D632 + ,simpleTitleCaseMapping:0x1D632 + }, + { code:0x1D633 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D633 + ,simpleLowerCaseMapping:0x1D633 + ,simpleTitleCaseMapping:0x1D633 + }, + { code:0x1D634 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D634 + ,simpleLowerCaseMapping:0x1D634 + ,simpleTitleCaseMapping:0x1D634 + }, + { code:0x1D635 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D635 + ,simpleLowerCaseMapping:0x1D635 + ,simpleTitleCaseMapping:0x1D635 + }, + { code:0x1D636 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D636 + ,simpleLowerCaseMapping:0x1D636 + ,simpleTitleCaseMapping:0x1D636 + }, + { code:0x1D637 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D637 + ,simpleLowerCaseMapping:0x1D637 + ,simpleTitleCaseMapping:0x1D637 + }, + { code:0x1D638 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D638 + ,simpleLowerCaseMapping:0x1D638 + ,simpleTitleCaseMapping:0x1D638 + }, + { code:0x1D639 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D639 + ,simpleLowerCaseMapping:0x1D639 + ,simpleTitleCaseMapping:0x1D639 + }, + { code:0x1D63A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D63A + ,simpleLowerCaseMapping:0x1D63A + ,simpleTitleCaseMapping:0x1D63A + }, + { code:0x1D63B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D63B + ,simpleLowerCaseMapping:0x1D63B + ,simpleTitleCaseMapping:0x1D63B + }, + { code:0x1D63C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D63C + ,simpleLowerCaseMapping:0x1D63C + ,simpleTitleCaseMapping:0x1D63C + }, + { code:0x1D63D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D63D + ,simpleLowerCaseMapping:0x1D63D + ,simpleTitleCaseMapping:0x1D63D + }, + { code:0x1D63E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D63E + ,simpleLowerCaseMapping:0x1D63E + ,simpleTitleCaseMapping:0x1D63E + }, + { code:0x1D63F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D63F + ,simpleLowerCaseMapping:0x1D63F + ,simpleTitleCaseMapping:0x1D63F + }, + { code:0x1D640 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D640 + ,simpleLowerCaseMapping:0x1D640 + ,simpleTitleCaseMapping:0x1D640 + }, + { code:0x1D641 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D641 + ,simpleLowerCaseMapping:0x1D641 + ,simpleTitleCaseMapping:0x1D641 + }, + { code:0x1D642 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D642 + ,simpleLowerCaseMapping:0x1D642 + ,simpleTitleCaseMapping:0x1D642 + }, + { code:0x1D643 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D643 + ,simpleLowerCaseMapping:0x1D643 + ,simpleTitleCaseMapping:0x1D643 + }, + { code:0x1D644 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D644 + ,simpleLowerCaseMapping:0x1D644 + ,simpleTitleCaseMapping:0x1D644 + }, + { code:0x1D645 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D645 + ,simpleLowerCaseMapping:0x1D645 + ,simpleTitleCaseMapping:0x1D645 + }, + { code:0x1D646 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D646 + ,simpleLowerCaseMapping:0x1D646 + ,simpleTitleCaseMapping:0x1D646 + }, + { code:0x1D647 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D647 + ,simpleLowerCaseMapping:0x1D647 + ,simpleTitleCaseMapping:0x1D647 + }, + { code:0x1D648 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D648 + ,simpleLowerCaseMapping:0x1D648 + ,simpleTitleCaseMapping:0x1D648 + }, + { code:0x1D649 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D649 + ,simpleLowerCaseMapping:0x1D649 + ,simpleTitleCaseMapping:0x1D649 + }, + { code:0x1D64A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D64A + ,simpleLowerCaseMapping:0x1D64A + ,simpleTitleCaseMapping:0x1D64A + }, + { code:0x1D64B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D64B + ,simpleLowerCaseMapping:0x1D64B + ,simpleTitleCaseMapping:0x1D64B + }, + { code:0x1D64C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D64C + ,simpleLowerCaseMapping:0x1D64C + ,simpleTitleCaseMapping:0x1D64C + }, + { code:0x1D64D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D64D + ,simpleLowerCaseMapping:0x1D64D + ,simpleTitleCaseMapping:0x1D64D + }, + { code:0x1D64E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D64E + ,simpleLowerCaseMapping:0x1D64E + ,simpleTitleCaseMapping:0x1D64E + }, + { code:0x1D64F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D64F + ,simpleLowerCaseMapping:0x1D64F + ,simpleTitleCaseMapping:0x1D64F + }, + { code:0x1D650 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D650 + ,simpleLowerCaseMapping:0x1D650 + ,simpleTitleCaseMapping:0x1D650 + }, + { code:0x1D651 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D651 + ,simpleLowerCaseMapping:0x1D651 + ,simpleTitleCaseMapping:0x1D651 + }, + { code:0x1D652 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D652 + ,simpleLowerCaseMapping:0x1D652 + ,simpleTitleCaseMapping:0x1D652 + }, + { code:0x1D653 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D653 + ,simpleLowerCaseMapping:0x1D653 + ,simpleTitleCaseMapping:0x1D653 + }, + { code:0x1D654 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D654 + ,simpleLowerCaseMapping:0x1D654 + ,simpleTitleCaseMapping:0x1D654 + }, + { code:0x1D655 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D655 + ,simpleLowerCaseMapping:0x1D655 + ,simpleTitleCaseMapping:0x1D655 + }, + { code:0x1D656 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D656 + ,simpleLowerCaseMapping:0x1D656 + ,simpleTitleCaseMapping:0x1D656 + }, + { code:0x1D657 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D657 + ,simpleLowerCaseMapping:0x1D657 + ,simpleTitleCaseMapping:0x1D657 + }, + { code:0x1D658 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D658 + ,simpleLowerCaseMapping:0x1D658 + ,simpleTitleCaseMapping:0x1D658 + }, + { code:0x1D659 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D659 + ,simpleLowerCaseMapping:0x1D659 + ,simpleTitleCaseMapping:0x1D659 + }, + { code:0x1D65A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D65A + ,simpleLowerCaseMapping:0x1D65A + ,simpleTitleCaseMapping:0x1D65A + }, + { code:0x1D65B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D65B + ,simpleLowerCaseMapping:0x1D65B + ,simpleTitleCaseMapping:0x1D65B + }, + { code:0x1D65C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D65C + ,simpleLowerCaseMapping:0x1D65C + ,simpleTitleCaseMapping:0x1D65C + }, + { code:0x1D65D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D65D + ,simpleLowerCaseMapping:0x1D65D + ,simpleTitleCaseMapping:0x1D65D + }, + { code:0x1D65E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D65E + ,simpleLowerCaseMapping:0x1D65E + ,simpleTitleCaseMapping:0x1D65E + }, + { code:0x1D65F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D65F + ,simpleLowerCaseMapping:0x1D65F + ,simpleTitleCaseMapping:0x1D65F + }, + { code:0x1D660 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D660 + ,simpleLowerCaseMapping:0x1D660 + ,simpleTitleCaseMapping:0x1D660 + }, + { code:0x1D661 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D661 + ,simpleLowerCaseMapping:0x1D661 + ,simpleTitleCaseMapping:0x1D661 + }, + { code:0x1D662 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D662 + ,simpleLowerCaseMapping:0x1D662 + ,simpleTitleCaseMapping:0x1D662 + }, + { code:0x1D663 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D663 + ,simpleLowerCaseMapping:0x1D663 + ,simpleTitleCaseMapping:0x1D663 + }, + { code:0x1D664 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D664 + ,simpleLowerCaseMapping:0x1D664 + ,simpleTitleCaseMapping:0x1D664 + }, + { code:0x1D665 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D665 + ,simpleLowerCaseMapping:0x1D665 + ,simpleTitleCaseMapping:0x1D665 + }, + { code:0x1D666 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D666 + ,simpleLowerCaseMapping:0x1D666 + ,simpleTitleCaseMapping:0x1D666 + }, + { code:0x1D667 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D667 + ,simpleLowerCaseMapping:0x1D667 + ,simpleTitleCaseMapping:0x1D667 + }, + { code:0x1D668 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D668 + ,simpleLowerCaseMapping:0x1D668 + ,simpleTitleCaseMapping:0x1D668 + }, + { code:0x1D669 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D669 + ,simpleLowerCaseMapping:0x1D669 + ,simpleTitleCaseMapping:0x1D669 + }, + { code:0x1D66A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D66A + ,simpleLowerCaseMapping:0x1D66A + ,simpleTitleCaseMapping:0x1D66A + }, + { code:0x1D66B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D66B + ,simpleLowerCaseMapping:0x1D66B + ,simpleTitleCaseMapping:0x1D66B + }, + { code:0x1D66C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D66C + ,simpleLowerCaseMapping:0x1D66C + ,simpleTitleCaseMapping:0x1D66C + }, + { code:0x1D66D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D66D + ,simpleLowerCaseMapping:0x1D66D + ,simpleTitleCaseMapping:0x1D66D + }, + { code:0x1D66E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D66E + ,simpleLowerCaseMapping:0x1D66E + ,simpleTitleCaseMapping:0x1D66E + }, + { code:0x1D66F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D66F + ,simpleLowerCaseMapping:0x1D66F + ,simpleTitleCaseMapping:0x1D66F + }, + { code:0x1D670 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D670 + ,simpleLowerCaseMapping:0x1D670 + ,simpleTitleCaseMapping:0x1D670 + }, + { code:0x1D671 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D671 + ,simpleLowerCaseMapping:0x1D671 + ,simpleTitleCaseMapping:0x1D671 + }, + { code:0x1D672 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D672 + ,simpleLowerCaseMapping:0x1D672 + ,simpleTitleCaseMapping:0x1D672 + }, + { code:0x1D673 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D673 + ,simpleLowerCaseMapping:0x1D673 + ,simpleTitleCaseMapping:0x1D673 + }, + { code:0x1D674 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D674 + ,simpleLowerCaseMapping:0x1D674 + ,simpleTitleCaseMapping:0x1D674 + }, + { code:0x1D675 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D675 + ,simpleLowerCaseMapping:0x1D675 + ,simpleTitleCaseMapping:0x1D675 + }, + { code:0x1D676 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D676 + ,simpleLowerCaseMapping:0x1D676 + ,simpleTitleCaseMapping:0x1D676 + }, + { code:0x1D677 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D677 + ,simpleLowerCaseMapping:0x1D677 + ,simpleTitleCaseMapping:0x1D677 + }, + { code:0x1D678 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D678 + ,simpleLowerCaseMapping:0x1D678 + ,simpleTitleCaseMapping:0x1D678 + }, + { code:0x1D679 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D679 + ,simpleLowerCaseMapping:0x1D679 + ,simpleTitleCaseMapping:0x1D679 + }, + { code:0x1D67A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D67A + ,simpleLowerCaseMapping:0x1D67A + ,simpleTitleCaseMapping:0x1D67A + }, + { code:0x1D67B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D67B + ,simpleLowerCaseMapping:0x1D67B + ,simpleTitleCaseMapping:0x1D67B + }, + { code:0x1D67C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D67C + ,simpleLowerCaseMapping:0x1D67C + ,simpleTitleCaseMapping:0x1D67C + }, + { code:0x1D67D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D67D + ,simpleLowerCaseMapping:0x1D67D + ,simpleTitleCaseMapping:0x1D67D + }, + { code:0x1D67E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D67E + ,simpleLowerCaseMapping:0x1D67E + ,simpleTitleCaseMapping:0x1D67E + }, + { code:0x1D67F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D67F + ,simpleLowerCaseMapping:0x1D67F + ,simpleTitleCaseMapping:0x1D67F + }, + { code:0x1D680 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D680 + ,simpleLowerCaseMapping:0x1D680 + ,simpleTitleCaseMapping:0x1D680 + }, + { code:0x1D681 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D681 + ,simpleLowerCaseMapping:0x1D681 + ,simpleTitleCaseMapping:0x1D681 + }, + { code:0x1D682 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D682 + ,simpleLowerCaseMapping:0x1D682 + ,simpleTitleCaseMapping:0x1D682 + }, + { code:0x1D683 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D683 + ,simpleLowerCaseMapping:0x1D683 + ,simpleTitleCaseMapping:0x1D683 + }, + { code:0x1D684 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D684 + ,simpleLowerCaseMapping:0x1D684 + ,simpleTitleCaseMapping:0x1D684 + }, + { code:0x1D685 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D685 + ,simpleLowerCaseMapping:0x1D685 + ,simpleTitleCaseMapping:0x1D685 + }, + { code:0x1D686 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D686 + ,simpleLowerCaseMapping:0x1D686 + ,simpleTitleCaseMapping:0x1D686 + }, + { code:0x1D687 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D687 + ,simpleLowerCaseMapping:0x1D687 + ,simpleTitleCaseMapping:0x1D687 + }, + { code:0x1D688 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D688 + ,simpleLowerCaseMapping:0x1D688 + ,simpleTitleCaseMapping:0x1D688 + }, + { code:0x1D689 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D689 + ,simpleLowerCaseMapping:0x1D689 + ,simpleTitleCaseMapping:0x1D689 + }, + { code:0x1D68A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D68A + ,simpleLowerCaseMapping:0x1D68A + ,simpleTitleCaseMapping:0x1D68A + }, + { code:0x1D68B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D68B + ,simpleLowerCaseMapping:0x1D68B + ,simpleTitleCaseMapping:0x1D68B + }, + { code:0x1D68C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D68C + ,simpleLowerCaseMapping:0x1D68C + ,simpleTitleCaseMapping:0x1D68C + }, + { code:0x1D68D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D68D + ,simpleLowerCaseMapping:0x1D68D + ,simpleTitleCaseMapping:0x1D68D + }, + { code:0x1D68E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D68E + ,simpleLowerCaseMapping:0x1D68E + ,simpleTitleCaseMapping:0x1D68E + }, + { code:0x1D68F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D68F + ,simpleLowerCaseMapping:0x1D68F + ,simpleTitleCaseMapping:0x1D68F + }, + { code:0x1D690 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D690 + ,simpleLowerCaseMapping:0x1D690 + ,simpleTitleCaseMapping:0x1D690 + }, + { code:0x1D691 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D691 + ,simpleLowerCaseMapping:0x1D691 + ,simpleTitleCaseMapping:0x1D691 + }, + { code:0x1D692 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D692 + ,simpleLowerCaseMapping:0x1D692 + ,simpleTitleCaseMapping:0x1D692 + }, + { code:0x1D693 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D693 + ,simpleLowerCaseMapping:0x1D693 + ,simpleTitleCaseMapping:0x1D693 + }, + { code:0x1D694 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D694 + ,simpleLowerCaseMapping:0x1D694 + ,simpleTitleCaseMapping:0x1D694 + }, + { code:0x1D695 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D695 + ,simpleLowerCaseMapping:0x1D695 + ,simpleTitleCaseMapping:0x1D695 + }, + { code:0x1D696 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D696 + ,simpleLowerCaseMapping:0x1D696 + ,simpleTitleCaseMapping:0x1D696 + }, + { code:0x1D697 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D697 + ,simpleLowerCaseMapping:0x1D697 + ,simpleTitleCaseMapping:0x1D697 + }, + { code:0x1D698 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D698 + ,simpleLowerCaseMapping:0x1D698 + ,simpleTitleCaseMapping:0x1D698 + }, + { code:0x1D699 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D699 + ,simpleLowerCaseMapping:0x1D699 + ,simpleTitleCaseMapping:0x1D699 + }, + { code:0x1D69A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D69A + ,simpleLowerCaseMapping:0x1D69A + ,simpleTitleCaseMapping:0x1D69A + }, + { code:0x1D69B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D69B + ,simpleLowerCaseMapping:0x1D69B + ,simpleTitleCaseMapping:0x1D69B + }, + { code:0x1D69C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D69C + ,simpleLowerCaseMapping:0x1D69C + ,simpleTitleCaseMapping:0x1D69C + }, + { code:0x1D69D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D69D + ,simpleLowerCaseMapping:0x1D69D + ,simpleTitleCaseMapping:0x1D69D + }, + { code:0x1D69E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D69E + ,simpleLowerCaseMapping:0x1D69E + ,simpleTitleCaseMapping:0x1D69E + }, + { code:0x1D69F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D69F + ,simpleLowerCaseMapping:0x1D69F + ,simpleTitleCaseMapping:0x1D69F + }, + { code:0x1D6A0 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6A0 + ,simpleLowerCaseMapping:0x1D6A0 + ,simpleTitleCaseMapping:0x1D6A0 + }, + { code:0x1D6A1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6A1 + ,simpleLowerCaseMapping:0x1D6A1 + ,simpleTitleCaseMapping:0x1D6A1 + }, + { code:0x1D6A2 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6A2 + ,simpleLowerCaseMapping:0x1D6A2 + ,simpleTitleCaseMapping:0x1D6A2 + }, + { code:0x1D6A3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6A3 + ,simpleLowerCaseMapping:0x1D6A3 + ,simpleTitleCaseMapping:0x1D6A3 + }, + { code:0x1D6A4 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6A4 + ,simpleLowerCaseMapping:0x1D6A4 + ,simpleTitleCaseMapping:0x1D6A4 + }, + { code:0x1D6A5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6A5 + ,simpleLowerCaseMapping:0x1D6A5 + ,simpleTitleCaseMapping:0x1D6A5 + }, + { code:0x1D6A8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6A8 + ,simpleLowerCaseMapping:0x1D6A8 + ,simpleTitleCaseMapping:0x1D6A8 + }, + { code:0x1D6A9 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6A9 + ,simpleLowerCaseMapping:0x1D6A9 + ,simpleTitleCaseMapping:0x1D6A9 + }, + { code:0x1D6AA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6AA + ,simpleLowerCaseMapping:0x1D6AA + ,simpleTitleCaseMapping:0x1D6AA + }, + { code:0x1D6AB + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6AB + ,simpleLowerCaseMapping:0x1D6AB + ,simpleTitleCaseMapping:0x1D6AB + }, + { code:0x1D6AC + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6AC + ,simpleLowerCaseMapping:0x1D6AC + ,simpleTitleCaseMapping:0x1D6AC + }, + { code:0x1D6AD + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6AD + ,simpleLowerCaseMapping:0x1D6AD + ,simpleTitleCaseMapping:0x1D6AD + }, + { code:0x1D6AE + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6AE + ,simpleLowerCaseMapping:0x1D6AE + ,simpleTitleCaseMapping:0x1D6AE + }, + { code:0x1D6AF + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6AF + ,simpleLowerCaseMapping:0x1D6AF + ,simpleTitleCaseMapping:0x1D6AF + }, + { code:0x1D6B0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6B0 + ,simpleLowerCaseMapping:0x1D6B0 + ,simpleTitleCaseMapping:0x1D6B0 + }, + { code:0x1D6B1 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6B1 + ,simpleLowerCaseMapping:0x1D6B1 + ,simpleTitleCaseMapping:0x1D6B1 + }, + { code:0x1D6B2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6B2 + ,simpleLowerCaseMapping:0x1D6B2 + ,simpleTitleCaseMapping:0x1D6B2 + }, + { code:0x1D6B3 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6B3 + ,simpleLowerCaseMapping:0x1D6B3 + ,simpleTitleCaseMapping:0x1D6B3 + }, + { code:0x1D6B4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6B4 + ,simpleLowerCaseMapping:0x1D6B4 + ,simpleTitleCaseMapping:0x1D6B4 + }, + { code:0x1D6B5 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6B5 + ,simpleLowerCaseMapping:0x1D6B5 + ,simpleTitleCaseMapping:0x1D6B5 + }, + { code:0x1D6B6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6B6 + ,simpleLowerCaseMapping:0x1D6B6 + ,simpleTitleCaseMapping:0x1D6B6 + }, + { code:0x1D6B7 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6B7 + ,simpleLowerCaseMapping:0x1D6B7 + ,simpleTitleCaseMapping:0x1D6B7 + }, + { code:0x1D6B8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6B8 + ,simpleLowerCaseMapping:0x1D6B8 + ,simpleTitleCaseMapping:0x1D6B8 + }, + { code:0x1D6B9 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6B9 + ,simpleLowerCaseMapping:0x1D6B9 + ,simpleTitleCaseMapping:0x1D6B9 + }, + { code:0x1D6BA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6BA + ,simpleLowerCaseMapping:0x1D6BA + ,simpleTitleCaseMapping:0x1D6BA + }, + { code:0x1D6BB + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6BB + ,simpleLowerCaseMapping:0x1D6BB + ,simpleTitleCaseMapping:0x1D6BB + }, + { code:0x1D6BC + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6BC + ,simpleLowerCaseMapping:0x1D6BC + ,simpleTitleCaseMapping:0x1D6BC + }, + { code:0x1D6BD + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6BD + ,simpleLowerCaseMapping:0x1D6BD + ,simpleTitleCaseMapping:0x1D6BD + }, + { code:0x1D6BE + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6BE + ,simpleLowerCaseMapping:0x1D6BE + ,simpleTitleCaseMapping:0x1D6BE + }, + { code:0x1D6BF + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6BF + ,simpleLowerCaseMapping:0x1D6BF + ,simpleTitleCaseMapping:0x1D6BF + }, + { code:0x1D6C0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6C0 + ,simpleLowerCaseMapping:0x1D6C0 + ,simpleTitleCaseMapping:0x1D6C0 + }, + { code:0x1D6C1 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x1D6C1 + ,simpleLowerCaseMapping:0x1D6C1 + ,simpleTitleCaseMapping:0x1D6C1 + }, + { code:0x1D6C2 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6C2 + ,simpleLowerCaseMapping:0x1D6C2 + ,simpleTitleCaseMapping:0x1D6C2 + }, + { code:0x1D6C3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6C3 + ,simpleLowerCaseMapping:0x1D6C3 + ,simpleTitleCaseMapping:0x1D6C3 + }, + { code:0x1D6C4 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6C4 + ,simpleLowerCaseMapping:0x1D6C4 + ,simpleTitleCaseMapping:0x1D6C4 + }, + { code:0x1D6C5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6C5 + ,simpleLowerCaseMapping:0x1D6C5 + ,simpleTitleCaseMapping:0x1D6C5 + }, + { code:0x1D6C6 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6C6 + ,simpleLowerCaseMapping:0x1D6C6 + ,simpleTitleCaseMapping:0x1D6C6 + }, + { code:0x1D6C7 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6C7 + ,simpleLowerCaseMapping:0x1D6C7 + ,simpleTitleCaseMapping:0x1D6C7 + }, + { code:0x1D6C8 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6C8 + ,simpleLowerCaseMapping:0x1D6C8 + ,simpleTitleCaseMapping:0x1D6C8 + }, + { code:0x1D6C9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6C9 + ,simpleLowerCaseMapping:0x1D6C9 + ,simpleTitleCaseMapping:0x1D6C9 + }, + { code:0x1D6CA + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6CA + ,simpleLowerCaseMapping:0x1D6CA + ,simpleTitleCaseMapping:0x1D6CA + }, + { code:0x1D6CB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6CB + ,simpleLowerCaseMapping:0x1D6CB + ,simpleTitleCaseMapping:0x1D6CB + }, + { code:0x1D6CC + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6CC + ,simpleLowerCaseMapping:0x1D6CC + ,simpleTitleCaseMapping:0x1D6CC + }, + { code:0x1D6CD + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6CD + ,simpleLowerCaseMapping:0x1D6CD + ,simpleTitleCaseMapping:0x1D6CD + }, + { code:0x1D6CE + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6CE + ,simpleLowerCaseMapping:0x1D6CE + ,simpleTitleCaseMapping:0x1D6CE + }, + { code:0x1D6CF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6CF + ,simpleLowerCaseMapping:0x1D6CF + ,simpleTitleCaseMapping:0x1D6CF + }, + { code:0x1D6D0 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6D0 + ,simpleLowerCaseMapping:0x1D6D0 + ,simpleTitleCaseMapping:0x1D6D0 + }, + { code:0x1D6D1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6D1 + ,simpleLowerCaseMapping:0x1D6D1 + ,simpleTitleCaseMapping:0x1D6D1 + }, + { code:0x1D6D2 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6D2 + ,simpleLowerCaseMapping:0x1D6D2 + ,simpleTitleCaseMapping:0x1D6D2 + }, + { code:0x1D6D3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6D3 + ,simpleLowerCaseMapping:0x1D6D3 + ,simpleTitleCaseMapping:0x1D6D3 + }, + { code:0x1D6D4 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6D4 + ,simpleLowerCaseMapping:0x1D6D4 + ,simpleTitleCaseMapping:0x1D6D4 + }, + { code:0x1D6D5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6D5 + ,simpleLowerCaseMapping:0x1D6D5 + ,simpleTitleCaseMapping:0x1D6D5 + }, + { code:0x1D6D6 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6D6 + ,simpleLowerCaseMapping:0x1D6D6 + ,simpleTitleCaseMapping:0x1D6D6 + }, + { code:0x1D6D7 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6D7 + ,simpleLowerCaseMapping:0x1D6D7 + ,simpleTitleCaseMapping:0x1D6D7 + }, + { code:0x1D6D8 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6D8 + ,simpleLowerCaseMapping:0x1D6D8 + ,simpleTitleCaseMapping:0x1D6D8 + }, + { code:0x1D6D9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6D9 + ,simpleLowerCaseMapping:0x1D6D9 + ,simpleTitleCaseMapping:0x1D6D9 + }, + { code:0x1D6DA + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6DA + ,simpleLowerCaseMapping:0x1D6DA + ,simpleTitleCaseMapping:0x1D6DA + }, + { code:0x1D6DB + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x1D6DB + ,simpleLowerCaseMapping:0x1D6DB + ,simpleTitleCaseMapping:0x1D6DB + }, + { code:0x1D6DC + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6DC + ,simpleLowerCaseMapping:0x1D6DC + ,simpleTitleCaseMapping:0x1D6DC + }, + { code:0x1D6DD + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6DD + ,simpleLowerCaseMapping:0x1D6DD + ,simpleTitleCaseMapping:0x1D6DD + }, + { code:0x1D6DE + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6DE + ,simpleLowerCaseMapping:0x1D6DE + ,simpleTitleCaseMapping:0x1D6DE + }, + { code:0x1D6DF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6DF + ,simpleLowerCaseMapping:0x1D6DF + ,simpleTitleCaseMapping:0x1D6DF + }, + { code:0x1D6E0 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6E0 + ,simpleLowerCaseMapping:0x1D6E0 + ,simpleTitleCaseMapping:0x1D6E0 + }, + { code:0x1D6E1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6E1 + ,simpleLowerCaseMapping:0x1D6E1 + ,simpleTitleCaseMapping:0x1D6E1 + }, + { code:0x1D6E2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6E2 + ,simpleLowerCaseMapping:0x1D6E2 + ,simpleTitleCaseMapping:0x1D6E2 + }, + { code:0x1D6E3 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6E3 + ,simpleLowerCaseMapping:0x1D6E3 + ,simpleTitleCaseMapping:0x1D6E3 + }, + { code:0x1D6E4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6E4 + ,simpleLowerCaseMapping:0x1D6E4 + ,simpleTitleCaseMapping:0x1D6E4 + }, + { code:0x1D6E5 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6E5 + ,simpleLowerCaseMapping:0x1D6E5 + ,simpleTitleCaseMapping:0x1D6E5 + }, + { code:0x1D6E6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6E6 + ,simpleLowerCaseMapping:0x1D6E6 + ,simpleTitleCaseMapping:0x1D6E6 + }, + { code:0x1D6E7 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6E7 + ,simpleLowerCaseMapping:0x1D6E7 + ,simpleTitleCaseMapping:0x1D6E7 + }, + { code:0x1D6E8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6E8 + ,simpleLowerCaseMapping:0x1D6E8 + ,simpleTitleCaseMapping:0x1D6E8 + }, + { code:0x1D6E9 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6E9 + ,simpleLowerCaseMapping:0x1D6E9 + ,simpleTitleCaseMapping:0x1D6E9 + }, + { code:0x1D6EA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6EA + ,simpleLowerCaseMapping:0x1D6EA + ,simpleTitleCaseMapping:0x1D6EA + }, + { code:0x1D6EB + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6EB + ,simpleLowerCaseMapping:0x1D6EB + ,simpleTitleCaseMapping:0x1D6EB + }, + { code:0x1D6EC + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6EC + ,simpleLowerCaseMapping:0x1D6EC + ,simpleTitleCaseMapping:0x1D6EC + }, + { code:0x1D6ED + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6ED + ,simpleLowerCaseMapping:0x1D6ED + ,simpleTitleCaseMapping:0x1D6ED + }, + { code:0x1D6EE + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6EE + ,simpleLowerCaseMapping:0x1D6EE + ,simpleTitleCaseMapping:0x1D6EE + }, + { code:0x1D6EF + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6EF + ,simpleLowerCaseMapping:0x1D6EF + ,simpleTitleCaseMapping:0x1D6EF + }, + { code:0x1D6F0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6F0 + ,simpleLowerCaseMapping:0x1D6F0 + ,simpleTitleCaseMapping:0x1D6F0 + }, + { code:0x1D6F1 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6F1 + ,simpleLowerCaseMapping:0x1D6F1 + ,simpleTitleCaseMapping:0x1D6F1 + }, + { code:0x1D6F2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6F2 + ,simpleLowerCaseMapping:0x1D6F2 + ,simpleTitleCaseMapping:0x1D6F2 + }, + { code:0x1D6F3 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6F3 + ,simpleLowerCaseMapping:0x1D6F3 + ,simpleTitleCaseMapping:0x1D6F3 + }, + { code:0x1D6F4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6F4 + ,simpleLowerCaseMapping:0x1D6F4 + ,simpleTitleCaseMapping:0x1D6F4 + }, + { code:0x1D6F5 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6F5 + ,simpleLowerCaseMapping:0x1D6F5 + ,simpleTitleCaseMapping:0x1D6F5 + }, + { code:0x1D6F6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6F6 + ,simpleLowerCaseMapping:0x1D6F6 + ,simpleTitleCaseMapping:0x1D6F6 + }, + { code:0x1D6F7 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6F7 + ,simpleLowerCaseMapping:0x1D6F7 + ,simpleTitleCaseMapping:0x1D6F7 + }, + { code:0x1D6F8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6F8 + ,simpleLowerCaseMapping:0x1D6F8 + ,simpleTitleCaseMapping:0x1D6F8 + }, + { code:0x1D6F9 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6F9 + ,simpleLowerCaseMapping:0x1D6F9 + ,simpleTitleCaseMapping:0x1D6F9 + }, + { code:0x1D6FA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D6FA + ,simpleLowerCaseMapping:0x1D6FA + ,simpleTitleCaseMapping:0x1D6FA + }, + { code:0x1D6FB + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x1D6FB + ,simpleLowerCaseMapping:0x1D6FB + ,simpleTitleCaseMapping:0x1D6FB + }, + { code:0x1D6FC + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6FC + ,simpleLowerCaseMapping:0x1D6FC + ,simpleTitleCaseMapping:0x1D6FC + }, + { code:0x1D6FD + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6FD + ,simpleLowerCaseMapping:0x1D6FD + ,simpleTitleCaseMapping:0x1D6FD + }, + { code:0x1D6FE + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6FE + ,simpleLowerCaseMapping:0x1D6FE + ,simpleTitleCaseMapping:0x1D6FE + }, + { code:0x1D6FF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D6FF + ,simpleLowerCaseMapping:0x1D6FF + ,simpleTitleCaseMapping:0x1D6FF + }, + { code:0x1D700 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D700 + ,simpleLowerCaseMapping:0x1D700 + ,simpleTitleCaseMapping:0x1D700 + }, + { code:0x1D701 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D701 + ,simpleLowerCaseMapping:0x1D701 + ,simpleTitleCaseMapping:0x1D701 + }, + { code:0x1D702 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D702 + ,simpleLowerCaseMapping:0x1D702 + ,simpleTitleCaseMapping:0x1D702 + }, + { code:0x1D703 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D703 + ,simpleLowerCaseMapping:0x1D703 + ,simpleTitleCaseMapping:0x1D703 + }, + { code:0x1D704 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D704 + ,simpleLowerCaseMapping:0x1D704 + ,simpleTitleCaseMapping:0x1D704 + }, + { code:0x1D705 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D705 + ,simpleLowerCaseMapping:0x1D705 + ,simpleTitleCaseMapping:0x1D705 + }, + { code:0x1D706 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D706 + ,simpleLowerCaseMapping:0x1D706 + ,simpleTitleCaseMapping:0x1D706 + }, + { code:0x1D707 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D707 + ,simpleLowerCaseMapping:0x1D707 + ,simpleTitleCaseMapping:0x1D707 + }, + { code:0x1D708 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D708 + ,simpleLowerCaseMapping:0x1D708 + ,simpleTitleCaseMapping:0x1D708 + }, + { code:0x1D709 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D709 + ,simpleLowerCaseMapping:0x1D709 + ,simpleTitleCaseMapping:0x1D709 + }, + { code:0x1D70A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D70A + ,simpleLowerCaseMapping:0x1D70A + ,simpleTitleCaseMapping:0x1D70A + }, + { code:0x1D70B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D70B + ,simpleLowerCaseMapping:0x1D70B + ,simpleTitleCaseMapping:0x1D70B + }, + { code:0x1D70C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D70C + ,simpleLowerCaseMapping:0x1D70C + ,simpleTitleCaseMapping:0x1D70C + }, + { code:0x1D70D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D70D + ,simpleLowerCaseMapping:0x1D70D + ,simpleTitleCaseMapping:0x1D70D + }, + { code:0x1D70E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D70E + ,simpleLowerCaseMapping:0x1D70E + ,simpleTitleCaseMapping:0x1D70E + }, + { code:0x1D70F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D70F + ,simpleLowerCaseMapping:0x1D70F + ,simpleTitleCaseMapping:0x1D70F + }, + { code:0x1D710 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D710 + ,simpleLowerCaseMapping:0x1D710 + ,simpleTitleCaseMapping:0x1D710 + }, + { code:0x1D711 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D711 + ,simpleLowerCaseMapping:0x1D711 + ,simpleTitleCaseMapping:0x1D711 + }, + { code:0x1D712 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D712 + ,simpleLowerCaseMapping:0x1D712 + ,simpleTitleCaseMapping:0x1D712 + }, + { code:0x1D713 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D713 + ,simpleLowerCaseMapping:0x1D713 + ,simpleTitleCaseMapping:0x1D713 + }, + { code:0x1D714 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D714 + ,simpleLowerCaseMapping:0x1D714 + ,simpleTitleCaseMapping:0x1D714 + }, + { code:0x1D715 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x1D715 + ,simpleLowerCaseMapping:0x1D715 + ,simpleTitleCaseMapping:0x1D715 + }, + { code:0x1D716 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D716 + ,simpleLowerCaseMapping:0x1D716 + ,simpleTitleCaseMapping:0x1D716 + }, + { code:0x1D717 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D717 + ,simpleLowerCaseMapping:0x1D717 + ,simpleTitleCaseMapping:0x1D717 + }, + { code:0x1D718 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D718 + ,simpleLowerCaseMapping:0x1D718 + ,simpleTitleCaseMapping:0x1D718 + }, + { code:0x1D719 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D719 + ,simpleLowerCaseMapping:0x1D719 + ,simpleTitleCaseMapping:0x1D719 + }, + { code:0x1D71A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D71A + ,simpleLowerCaseMapping:0x1D71A + ,simpleTitleCaseMapping:0x1D71A + }, + { code:0x1D71B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D71B + ,simpleLowerCaseMapping:0x1D71B + ,simpleTitleCaseMapping:0x1D71B + }, + { code:0x1D71C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D71C + ,simpleLowerCaseMapping:0x1D71C + ,simpleTitleCaseMapping:0x1D71C + }, + { code:0x1D71D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D71D + ,simpleLowerCaseMapping:0x1D71D + ,simpleTitleCaseMapping:0x1D71D + }, + { code:0x1D71E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D71E + ,simpleLowerCaseMapping:0x1D71E + ,simpleTitleCaseMapping:0x1D71E + }, + { code:0x1D71F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D71F + ,simpleLowerCaseMapping:0x1D71F + ,simpleTitleCaseMapping:0x1D71F + }, + { code:0x1D720 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D720 + ,simpleLowerCaseMapping:0x1D720 + ,simpleTitleCaseMapping:0x1D720 + }, + { code:0x1D721 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D721 + ,simpleLowerCaseMapping:0x1D721 + ,simpleTitleCaseMapping:0x1D721 + }, + { code:0x1D722 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D722 + ,simpleLowerCaseMapping:0x1D722 + ,simpleTitleCaseMapping:0x1D722 + }, + { code:0x1D723 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D723 + ,simpleLowerCaseMapping:0x1D723 + ,simpleTitleCaseMapping:0x1D723 + }, + { code:0x1D724 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D724 + ,simpleLowerCaseMapping:0x1D724 + ,simpleTitleCaseMapping:0x1D724 + }, + { code:0x1D725 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D725 + ,simpleLowerCaseMapping:0x1D725 + ,simpleTitleCaseMapping:0x1D725 + }, + { code:0x1D726 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D726 + ,simpleLowerCaseMapping:0x1D726 + ,simpleTitleCaseMapping:0x1D726 + }, + { code:0x1D727 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D727 + ,simpleLowerCaseMapping:0x1D727 + ,simpleTitleCaseMapping:0x1D727 + }, + { code:0x1D728 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D728 + ,simpleLowerCaseMapping:0x1D728 + ,simpleTitleCaseMapping:0x1D728 + }, + { code:0x1D729 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D729 + ,simpleLowerCaseMapping:0x1D729 + ,simpleTitleCaseMapping:0x1D729 + }, + { code:0x1D72A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D72A + ,simpleLowerCaseMapping:0x1D72A + ,simpleTitleCaseMapping:0x1D72A + }, + { code:0x1D72B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D72B + ,simpleLowerCaseMapping:0x1D72B + ,simpleTitleCaseMapping:0x1D72B + }, + { code:0x1D72C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D72C + ,simpleLowerCaseMapping:0x1D72C + ,simpleTitleCaseMapping:0x1D72C + }, + { code:0x1D72D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D72D + ,simpleLowerCaseMapping:0x1D72D + ,simpleTitleCaseMapping:0x1D72D + }, + { code:0x1D72E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D72E + ,simpleLowerCaseMapping:0x1D72E + ,simpleTitleCaseMapping:0x1D72E + }, + { code:0x1D72F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D72F + ,simpleLowerCaseMapping:0x1D72F + ,simpleTitleCaseMapping:0x1D72F + }, + { code:0x1D730 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D730 + ,simpleLowerCaseMapping:0x1D730 + ,simpleTitleCaseMapping:0x1D730 + }, + { code:0x1D731 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D731 + ,simpleLowerCaseMapping:0x1D731 + ,simpleTitleCaseMapping:0x1D731 + }, + { code:0x1D732 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D732 + ,simpleLowerCaseMapping:0x1D732 + ,simpleTitleCaseMapping:0x1D732 + }, + { code:0x1D733 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D733 + ,simpleLowerCaseMapping:0x1D733 + ,simpleTitleCaseMapping:0x1D733 + }, + { code:0x1D734 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D734 + ,simpleLowerCaseMapping:0x1D734 + ,simpleTitleCaseMapping:0x1D734 + }, + { code:0x1D735 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x1D735 + ,simpleLowerCaseMapping:0x1D735 + ,simpleTitleCaseMapping:0x1D735 + }, + { code:0x1D736 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D736 + ,simpleLowerCaseMapping:0x1D736 + ,simpleTitleCaseMapping:0x1D736 + }, + { code:0x1D737 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D737 + ,simpleLowerCaseMapping:0x1D737 + ,simpleTitleCaseMapping:0x1D737 + }, + { code:0x1D738 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D738 + ,simpleLowerCaseMapping:0x1D738 + ,simpleTitleCaseMapping:0x1D738 + }, + { code:0x1D739 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D739 + ,simpleLowerCaseMapping:0x1D739 + ,simpleTitleCaseMapping:0x1D739 + }, + { code:0x1D73A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D73A + ,simpleLowerCaseMapping:0x1D73A + ,simpleTitleCaseMapping:0x1D73A + }, + { code:0x1D73B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D73B + ,simpleLowerCaseMapping:0x1D73B + ,simpleTitleCaseMapping:0x1D73B + }, + { code:0x1D73C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D73C + ,simpleLowerCaseMapping:0x1D73C + ,simpleTitleCaseMapping:0x1D73C + }, + { code:0x1D73D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D73D + ,simpleLowerCaseMapping:0x1D73D + ,simpleTitleCaseMapping:0x1D73D + }, + { code:0x1D73E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D73E + ,simpleLowerCaseMapping:0x1D73E + ,simpleTitleCaseMapping:0x1D73E + }, + { code:0x1D73F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D73F + ,simpleLowerCaseMapping:0x1D73F + ,simpleTitleCaseMapping:0x1D73F + }, + { code:0x1D740 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D740 + ,simpleLowerCaseMapping:0x1D740 + ,simpleTitleCaseMapping:0x1D740 + }, + { code:0x1D741 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D741 + ,simpleLowerCaseMapping:0x1D741 + ,simpleTitleCaseMapping:0x1D741 + }, + { code:0x1D742 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D742 + ,simpleLowerCaseMapping:0x1D742 + ,simpleTitleCaseMapping:0x1D742 + }, + { code:0x1D743 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D743 + ,simpleLowerCaseMapping:0x1D743 + ,simpleTitleCaseMapping:0x1D743 + }, + { code:0x1D744 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D744 + ,simpleLowerCaseMapping:0x1D744 + ,simpleTitleCaseMapping:0x1D744 + }, + { code:0x1D745 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D745 + ,simpleLowerCaseMapping:0x1D745 + ,simpleTitleCaseMapping:0x1D745 + }, + { code:0x1D746 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D746 + ,simpleLowerCaseMapping:0x1D746 + ,simpleTitleCaseMapping:0x1D746 + }, + { code:0x1D747 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D747 + ,simpleLowerCaseMapping:0x1D747 + ,simpleTitleCaseMapping:0x1D747 + }, + { code:0x1D748 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D748 + ,simpleLowerCaseMapping:0x1D748 + ,simpleTitleCaseMapping:0x1D748 + }, + { code:0x1D749 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D749 + ,simpleLowerCaseMapping:0x1D749 + ,simpleTitleCaseMapping:0x1D749 + }, + { code:0x1D74A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D74A + ,simpleLowerCaseMapping:0x1D74A + ,simpleTitleCaseMapping:0x1D74A + }, + { code:0x1D74B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D74B + ,simpleLowerCaseMapping:0x1D74B + ,simpleTitleCaseMapping:0x1D74B + }, + { code:0x1D74C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D74C + ,simpleLowerCaseMapping:0x1D74C + ,simpleTitleCaseMapping:0x1D74C + }, + { code:0x1D74D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D74D + ,simpleLowerCaseMapping:0x1D74D + ,simpleTitleCaseMapping:0x1D74D + }, + { code:0x1D74E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D74E + ,simpleLowerCaseMapping:0x1D74E + ,simpleTitleCaseMapping:0x1D74E + }, + { code:0x1D74F + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x1D74F + ,simpleLowerCaseMapping:0x1D74F + ,simpleTitleCaseMapping:0x1D74F + }, + { code:0x1D750 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D750 + ,simpleLowerCaseMapping:0x1D750 + ,simpleTitleCaseMapping:0x1D750 + }, + { code:0x1D751 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D751 + ,simpleLowerCaseMapping:0x1D751 + ,simpleTitleCaseMapping:0x1D751 + }, + { code:0x1D752 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D752 + ,simpleLowerCaseMapping:0x1D752 + ,simpleTitleCaseMapping:0x1D752 + }, + { code:0x1D753 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D753 + ,simpleLowerCaseMapping:0x1D753 + ,simpleTitleCaseMapping:0x1D753 + }, + { code:0x1D754 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D754 + ,simpleLowerCaseMapping:0x1D754 + ,simpleTitleCaseMapping:0x1D754 + }, + { code:0x1D755 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D755 + ,simpleLowerCaseMapping:0x1D755 + ,simpleTitleCaseMapping:0x1D755 + }, + { code:0x1D756 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D756 + ,simpleLowerCaseMapping:0x1D756 + ,simpleTitleCaseMapping:0x1D756 + }, + { code:0x1D757 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D757 + ,simpleLowerCaseMapping:0x1D757 + ,simpleTitleCaseMapping:0x1D757 + }, + { code:0x1D758 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D758 + ,simpleLowerCaseMapping:0x1D758 + ,simpleTitleCaseMapping:0x1D758 + }, + { code:0x1D759 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D759 + ,simpleLowerCaseMapping:0x1D759 + ,simpleTitleCaseMapping:0x1D759 + }, + { code:0x1D75A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D75A + ,simpleLowerCaseMapping:0x1D75A + ,simpleTitleCaseMapping:0x1D75A + }, + { code:0x1D75B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D75B + ,simpleLowerCaseMapping:0x1D75B + ,simpleTitleCaseMapping:0x1D75B + }, + { code:0x1D75C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D75C + ,simpleLowerCaseMapping:0x1D75C + ,simpleTitleCaseMapping:0x1D75C + }, + { code:0x1D75D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D75D + ,simpleLowerCaseMapping:0x1D75D + ,simpleTitleCaseMapping:0x1D75D + }, + { code:0x1D75E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D75E + ,simpleLowerCaseMapping:0x1D75E + ,simpleTitleCaseMapping:0x1D75E + }, + { code:0x1D75F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D75F + ,simpleLowerCaseMapping:0x1D75F + ,simpleTitleCaseMapping:0x1D75F + }, + { code:0x1D760 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D760 + ,simpleLowerCaseMapping:0x1D760 + ,simpleTitleCaseMapping:0x1D760 + }, + { code:0x1D761 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D761 + ,simpleLowerCaseMapping:0x1D761 + ,simpleTitleCaseMapping:0x1D761 + }, + { code:0x1D762 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D762 + ,simpleLowerCaseMapping:0x1D762 + ,simpleTitleCaseMapping:0x1D762 + }, + { code:0x1D763 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D763 + ,simpleLowerCaseMapping:0x1D763 + ,simpleTitleCaseMapping:0x1D763 + }, + { code:0x1D764 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D764 + ,simpleLowerCaseMapping:0x1D764 + ,simpleTitleCaseMapping:0x1D764 + }, + { code:0x1D765 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D765 + ,simpleLowerCaseMapping:0x1D765 + ,simpleTitleCaseMapping:0x1D765 + }, + { code:0x1D766 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D766 + ,simpleLowerCaseMapping:0x1D766 + ,simpleTitleCaseMapping:0x1D766 + }, + { code:0x1D767 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D767 + ,simpleLowerCaseMapping:0x1D767 + ,simpleTitleCaseMapping:0x1D767 + }, + { code:0x1D768 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D768 + ,simpleLowerCaseMapping:0x1D768 + ,simpleTitleCaseMapping:0x1D768 + }, + { code:0x1D769 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D769 + ,simpleLowerCaseMapping:0x1D769 + ,simpleTitleCaseMapping:0x1D769 + }, + { code:0x1D76A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D76A + ,simpleLowerCaseMapping:0x1D76A + ,simpleTitleCaseMapping:0x1D76A + }, + { code:0x1D76B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D76B + ,simpleLowerCaseMapping:0x1D76B + ,simpleTitleCaseMapping:0x1D76B + }, + { code:0x1D76C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D76C + ,simpleLowerCaseMapping:0x1D76C + ,simpleTitleCaseMapping:0x1D76C + }, + { code:0x1D76D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D76D + ,simpleLowerCaseMapping:0x1D76D + ,simpleTitleCaseMapping:0x1D76D + }, + { code:0x1D76E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D76E + ,simpleLowerCaseMapping:0x1D76E + ,simpleTitleCaseMapping:0x1D76E + }, + { code:0x1D76F + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x1D76F + ,simpleLowerCaseMapping:0x1D76F + ,simpleTitleCaseMapping:0x1D76F + }, + { code:0x1D770 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D770 + ,simpleLowerCaseMapping:0x1D770 + ,simpleTitleCaseMapping:0x1D770 + }, + { code:0x1D771 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D771 + ,simpleLowerCaseMapping:0x1D771 + ,simpleTitleCaseMapping:0x1D771 + }, + { code:0x1D772 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D772 + ,simpleLowerCaseMapping:0x1D772 + ,simpleTitleCaseMapping:0x1D772 + }, + { code:0x1D773 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D773 + ,simpleLowerCaseMapping:0x1D773 + ,simpleTitleCaseMapping:0x1D773 + }, + { code:0x1D774 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D774 + ,simpleLowerCaseMapping:0x1D774 + ,simpleTitleCaseMapping:0x1D774 + }, + { code:0x1D775 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D775 + ,simpleLowerCaseMapping:0x1D775 + ,simpleTitleCaseMapping:0x1D775 + }, + { code:0x1D776 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D776 + ,simpleLowerCaseMapping:0x1D776 + ,simpleTitleCaseMapping:0x1D776 + }, + { code:0x1D777 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D777 + ,simpleLowerCaseMapping:0x1D777 + ,simpleTitleCaseMapping:0x1D777 + }, + { code:0x1D778 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D778 + ,simpleLowerCaseMapping:0x1D778 + ,simpleTitleCaseMapping:0x1D778 + }, + { code:0x1D779 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D779 + ,simpleLowerCaseMapping:0x1D779 + ,simpleTitleCaseMapping:0x1D779 + }, + { code:0x1D77A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D77A + ,simpleLowerCaseMapping:0x1D77A + ,simpleTitleCaseMapping:0x1D77A + }, + { code:0x1D77B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D77B + ,simpleLowerCaseMapping:0x1D77B + ,simpleTitleCaseMapping:0x1D77B + }, + { code:0x1D77C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D77C + ,simpleLowerCaseMapping:0x1D77C + ,simpleTitleCaseMapping:0x1D77C + }, + { code:0x1D77D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D77D + ,simpleLowerCaseMapping:0x1D77D + ,simpleTitleCaseMapping:0x1D77D + }, + { code:0x1D77E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D77E + ,simpleLowerCaseMapping:0x1D77E + ,simpleTitleCaseMapping:0x1D77E + }, + { code:0x1D77F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D77F + ,simpleLowerCaseMapping:0x1D77F + ,simpleTitleCaseMapping:0x1D77F + }, + { code:0x1D780 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D780 + ,simpleLowerCaseMapping:0x1D780 + ,simpleTitleCaseMapping:0x1D780 + }, + { code:0x1D781 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D781 + ,simpleLowerCaseMapping:0x1D781 + ,simpleTitleCaseMapping:0x1D781 + }, + { code:0x1D782 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D782 + ,simpleLowerCaseMapping:0x1D782 + ,simpleTitleCaseMapping:0x1D782 + }, + { code:0x1D783 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D783 + ,simpleLowerCaseMapping:0x1D783 + ,simpleTitleCaseMapping:0x1D783 + }, + { code:0x1D784 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D784 + ,simpleLowerCaseMapping:0x1D784 + ,simpleTitleCaseMapping:0x1D784 + }, + { code:0x1D785 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D785 + ,simpleLowerCaseMapping:0x1D785 + ,simpleTitleCaseMapping:0x1D785 + }, + { code:0x1D786 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D786 + ,simpleLowerCaseMapping:0x1D786 + ,simpleTitleCaseMapping:0x1D786 + }, + { code:0x1D787 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D787 + ,simpleLowerCaseMapping:0x1D787 + ,simpleTitleCaseMapping:0x1D787 + }, + { code:0x1D788 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D788 + ,simpleLowerCaseMapping:0x1D788 + ,simpleTitleCaseMapping:0x1D788 + }, + { code:0x1D789 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x1D789 + ,simpleLowerCaseMapping:0x1D789 + ,simpleTitleCaseMapping:0x1D789 + }, + { code:0x1D78A + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D78A + ,simpleLowerCaseMapping:0x1D78A + ,simpleTitleCaseMapping:0x1D78A + }, + { code:0x1D78B + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D78B + ,simpleLowerCaseMapping:0x1D78B + ,simpleTitleCaseMapping:0x1D78B + }, + { code:0x1D78C + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D78C + ,simpleLowerCaseMapping:0x1D78C + ,simpleTitleCaseMapping:0x1D78C + }, + { code:0x1D78D + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D78D + ,simpleLowerCaseMapping:0x1D78D + ,simpleTitleCaseMapping:0x1D78D + }, + { code:0x1D78E + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D78E + ,simpleLowerCaseMapping:0x1D78E + ,simpleTitleCaseMapping:0x1D78E + }, + { code:0x1D78F + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D78F + ,simpleLowerCaseMapping:0x1D78F + ,simpleTitleCaseMapping:0x1D78F + }, + { code:0x1D790 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D790 + ,simpleLowerCaseMapping:0x1D790 + ,simpleTitleCaseMapping:0x1D790 + }, + { code:0x1D791 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D791 + ,simpleLowerCaseMapping:0x1D791 + ,simpleTitleCaseMapping:0x1D791 + }, + { code:0x1D792 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D792 + ,simpleLowerCaseMapping:0x1D792 + ,simpleTitleCaseMapping:0x1D792 + }, + { code:0x1D793 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D793 + ,simpleLowerCaseMapping:0x1D793 + ,simpleTitleCaseMapping:0x1D793 + }, + { code:0x1D794 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D794 + ,simpleLowerCaseMapping:0x1D794 + ,simpleTitleCaseMapping:0x1D794 + }, + { code:0x1D795 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D795 + ,simpleLowerCaseMapping:0x1D795 + ,simpleTitleCaseMapping:0x1D795 + }, + { code:0x1D796 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D796 + ,simpleLowerCaseMapping:0x1D796 + ,simpleTitleCaseMapping:0x1D796 + }, + { code:0x1D797 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D797 + ,simpleLowerCaseMapping:0x1D797 + ,simpleTitleCaseMapping:0x1D797 + }, + { code:0x1D798 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D798 + ,simpleLowerCaseMapping:0x1D798 + ,simpleTitleCaseMapping:0x1D798 + }, + { code:0x1D799 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D799 + ,simpleLowerCaseMapping:0x1D799 + ,simpleTitleCaseMapping:0x1D799 + }, + { code:0x1D79A + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D79A + ,simpleLowerCaseMapping:0x1D79A + ,simpleTitleCaseMapping:0x1D79A + }, + { code:0x1D79B + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D79B + ,simpleLowerCaseMapping:0x1D79B + ,simpleTitleCaseMapping:0x1D79B + }, + { code:0x1D79C + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D79C + ,simpleLowerCaseMapping:0x1D79C + ,simpleTitleCaseMapping:0x1D79C + }, + { code:0x1D79D + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D79D + ,simpleLowerCaseMapping:0x1D79D + ,simpleTitleCaseMapping:0x1D79D + }, + { code:0x1D79E + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D79E + ,simpleLowerCaseMapping:0x1D79E + ,simpleTitleCaseMapping:0x1D79E + }, + { code:0x1D79F + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D79F + ,simpleLowerCaseMapping:0x1D79F + ,simpleTitleCaseMapping:0x1D79F + }, + { code:0x1D7A0 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D7A0 + ,simpleLowerCaseMapping:0x1D7A0 + ,simpleTitleCaseMapping:0x1D7A0 + }, + { code:0x1D7A1 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D7A1 + ,simpleLowerCaseMapping:0x1D7A1 + ,simpleTitleCaseMapping:0x1D7A1 + }, + { code:0x1D7A2 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D7A2 + ,simpleLowerCaseMapping:0x1D7A2 + ,simpleTitleCaseMapping:0x1D7A2 + }, + { code:0x1D7A3 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D7A3 + ,simpleLowerCaseMapping:0x1D7A3 + ,simpleTitleCaseMapping:0x1D7A3 + }, + { code:0x1D7A4 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D7A4 + ,simpleLowerCaseMapping:0x1D7A4 + ,simpleTitleCaseMapping:0x1D7A4 + }, + { code:0x1D7A5 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D7A5 + ,simpleLowerCaseMapping:0x1D7A5 + ,simpleTitleCaseMapping:0x1D7A5 + }, + { code:0x1D7A6 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D7A6 + ,simpleLowerCaseMapping:0x1D7A6 + ,simpleTitleCaseMapping:0x1D7A6 + }, + { code:0x1D7A7 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D7A7 + ,simpleLowerCaseMapping:0x1D7A7 + ,simpleTitleCaseMapping:0x1D7A7 + }, + { code:0x1D7A8 + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D7A8 + ,simpleLowerCaseMapping:0x1D7A8 + ,simpleTitleCaseMapping:0x1D7A8 + }, + { code:0x1D7A9 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x1D7A9 + ,simpleLowerCaseMapping:0x1D7A9 + ,simpleTitleCaseMapping:0x1D7A9 + }, + { code:0x1D7AA + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7AA + ,simpleLowerCaseMapping:0x1D7AA + ,simpleTitleCaseMapping:0x1D7AA + }, + { code:0x1D7AB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7AB + ,simpleLowerCaseMapping:0x1D7AB + ,simpleTitleCaseMapping:0x1D7AB + }, + { code:0x1D7AC + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7AC + ,simpleLowerCaseMapping:0x1D7AC + ,simpleTitleCaseMapping:0x1D7AC + }, + { code:0x1D7AD + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7AD + ,simpleLowerCaseMapping:0x1D7AD + ,simpleTitleCaseMapping:0x1D7AD + }, + { code:0x1D7AE + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7AE + ,simpleLowerCaseMapping:0x1D7AE + ,simpleTitleCaseMapping:0x1D7AE + }, + { code:0x1D7AF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7AF + ,simpleLowerCaseMapping:0x1D7AF + ,simpleTitleCaseMapping:0x1D7AF + }, + { code:0x1D7B0 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7B0 + ,simpleLowerCaseMapping:0x1D7B0 + ,simpleTitleCaseMapping:0x1D7B0 + }, + { code:0x1D7B1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7B1 + ,simpleLowerCaseMapping:0x1D7B1 + ,simpleTitleCaseMapping:0x1D7B1 + }, + { code:0x1D7B2 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7B2 + ,simpleLowerCaseMapping:0x1D7B2 + ,simpleTitleCaseMapping:0x1D7B2 + }, + { code:0x1D7B3 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7B3 + ,simpleLowerCaseMapping:0x1D7B3 + ,simpleTitleCaseMapping:0x1D7B3 + }, + { code:0x1D7B4 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7B4 + ,simpleLowerCaseMapping:0x1D7B4 + ,simpleTitleCaseMapping:0x1D7B4 + }, + { code:0x1D7B5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7B5 + ,simpleLowerCaseMapping:0x1D7B5 + ,simpleTitleCaseMapping:0x1D7B5 + }, + { code:0x1D7B6 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7B6 + ,simpleLowerCaseMapping:0x1D7B6 + ,simpleTitleCaseMapping:0x1D7B6 + }, + { code:0x1D7B7 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7B7 + ,simpleLowerCaseMapping:0x1D7B7 + ,simpleTitleCaseMapping:0x1D7B7 + }, + { code:0x1D7B8 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7B8 + ,simpleLowerCaseMapping:0x1D7B8 + ,simpleTitleCaseMapping:0x1D7B8 + }, + { code:0x1D7B9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7B9 + ,simpleLowerCaseMapping:0x1D7B9 + ,simpleTitleCaseMapping:0x1D7B9 + }, + { code:0x1D7BA + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7BA + ,simpleLowerCaseMapping:0x1D7BA + ,simpleTitleCaseMapping:0x1D7BA + }, + { code:0x1D7BB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7BB + ,simpleLowerCaseMapping:0x1D7BB + ,simpleTitleCaseMapping:0x1D7BB + }, + { code:0x1D7BC + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7BC + ,simpleLowerCaseMapping:0x1D7BC + ,simpleTitleCaseMapping:0x1D7BC + }, + { code:0x1D7BD + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7BD + ,simpleLowerCaseMapping:0x1D7BD + ,simpleTitleCaseMapping:0x1D7BD + }, + { code:0x1D7BE + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7BE + ,simpleLowerCaseMapping:0x1D7BE + ,simpleTitleCaseMapping:0x1D7BE + }, + { code:0x1D7BF + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7BF + ,simpleLowerCaseMapping:0x1D7BF + ,simpleTitleCaseMapping:0x1D7BF + }, + { code:0x1D7C0 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7C0 + ,simpleLowerCaseMapping:0x1D7C0 + ,simpleTitleCaseMapping:0x1D7C0 + }, + { code:0x1D7C1 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7C1 + ,simpleLowerCaseMapping:0x1D7C1 + ,simpleTitleCaseMapping:0x1D7C1 + }, + { code:0x1D7C2 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7C2 + ,simpleLowerCaseMapping:0x1D7C2 + ,simpleTitleCaseMapping:0x1D7C2 + }, + { code:0x1D7C3 + ,generalCategory:UnicodeData.GeneralCategory.Sm + ,simpleUpperCaseMapping:0x1D7C3 + ,simpleLowerCaseMapping:0x1D7C3 + ,simpleTitleCaseMapping:0x1D7C3 + }, + { code:0x1D7C4 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7C4 + ,simpleLowerCaseMapping:0x1D7C4 + ,simpleTitleCaseMapping:0x1D7C4 + }, + { code:0x1D7C5 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7C5 + ,simpleLowerCaseMapping:0x1D7C5 + ,simpleTitleCaseMapping:0x1D7C5 + }, + { code:0x1D7C6 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7C6 + ,simpleLowerCaseMapping:0x1D7C6 + ,simpleTitleCaseMapping:0x1D7C6 + }, + { code:0x1D7C7 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7C7 + ,simpleLowerCaseMapping:0x1D7C7 + ,simpleTitleCaseMapping:0x1D7C7 + }, + { code:0x1D7C8 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7C8 + ,simpleLowerCaseMapping:0x1D7C8 + ,simpleTitleCaseMapping:0x1D7C8 + }, + { code:0x1D7C9 + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7C9 + ,simpleLowerCaseMapping:0x1D7C9 + ,simpleTitleCaseMapping:0x1D7C9 + }, + { code:0x1D7CA + ,generalCategory:UnicodeData.GeneralCategory.Lu + ,simpleUpperCaseMapping:0x1D7CA + ,simpleLowerCaseMapping:0x1D7CA + ,simpleTitleCaseMapping:0x1D7CA + }, + { code:0x1D7CB + ,generalCategory:UnicodeData.GeneralCategory.Ll + ,simpleUpperCaseMapping:0x1D7CB + ,simpleLowerCaseMapping:0x1D7CB + ,simpleTitleCaseMapping:0x1D7CB + }, + { code:0x1D7CE + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7CE + ,simpleLowerCaseMapping:0x1D7CE + ,simpleTitleCaseMapping:0x1D7CE + }, + { code:0x1D7CF + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7CF + ,simpleLowerCaseMapping:0x1D7CF + ,simpleTitleCaseMapping:0x1D7CF + }, + { code:0x1D7D0 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7D0 + ,simpleLowerCaseMapping:0x1D7D0 + ,simpleTitleCaseMapping:0x1D7D0 + }, + { code:0x1D7D1 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7D1 + ,simpleLowerCaseMapping:0x1D7D1 + ,simpleTitleCaseMapping:0x1D7D1 + }, + { code:0x1D7D2 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7D2 + ,simpleLowerCaseMapping:0x1D7D2 + ,simpleTitleCaseMapping:0x1D7D2 + }, + { code:0x1D7D3 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7D3 + ,simpleLowerCaseMapping:0x1D7D3 + ,simpleTitleCaseMapping:0x1D7D3 + }, + { code:0x1D7D4 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7D4 + ,simpleLowerCaseMapping:0x1D7D4 + ,simpleTitleCaseMapping:0x1D7D4 + }, + { code:0x1D7D5 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7D5 + ,simpleLowerCaseMapping:0x1D7D5 + ,simpleTitleCaseMapping:0x1D7D5 + }, + { code:0x1D7D6 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7D6 + ,simpleLowerCaseMapping:0x1D7D6 + ,simpleTitleCaseMapping:0x1D7D6 + }, + { code:0x1D7D7 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7D7 + ,simpleLowerCaseMapping:0x1D7D7 + ,simpleTitleCaseMapping:0x1D7D7 + }, + { code:0x1D7D8 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7D8 + ,simpleLowerCaseMapping:0x1D7D8 + ,simpleTitleCaseMapping:0x1D7D8 + }, + { code:0x1D7D9 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7D9 + ,simpleLowerCaseMapping:0x1D7D9 + ,simpleTitleCaseMapping:0x1D7D9 + }, + { code:0x1D7DA + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7DA + ,simpleLowerCaseMapping:0x1D7DA + ,simpleTitleCaseMapping:0x1D7DA + }, + { code:0x1D7DB + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7DB + ,simpleLowerCaseMapping:0x1D7DB + ,simpleTitleCaseMapping:0x1D7DB + }, + { code:0x1D7DC + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7DC + ,simpleLowerCaseMapping:0x1D7DC + ,simpleTitleCaseMapping:0x1D7DC + }, + { code:0x1D7DD + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7DD + ,simpleLowerCaseMapping:0x1D7DD + ,simpleTitleCaseMapping:0x1D7DD + }, + { code:0x1D7DE + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7DE + ,simpleLowerCaseMapping:0x1D7DE + ,simpleTitleCaseMapping:0x1D7DE + }, + { code:0x1D7DF + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7DF + ,simpleLowerCaseMapping:0x1D7DF + ,simpleTitleCaseMapping:0x1D7DF + }, + { code:0x1D7E0 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7E0 + ,simpleLowerCaseMapping:0x1D7E0 + ,simpleTitleCaseMapping:0x1D7E0 + }, + { code:0x1D7E1 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7E1 + ,simpleLowerCaseMapping:0x1D7E1 + ,simpleTitleCaseMapping:0x1D7E1 + }, + { code:0x1D7E2 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7E2 + ,simpleLowerCaseMapping:0x1D7E2 + ,simpleTitleCaseMapping:0x1D7E2 + }, + { code:0x1D7E3 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7E3 + ,simpleLowerCaseMapping:0x1D7E3 + ,simpleTitleCaseMapping:0x1D7E3 + }, + { code:0x1D7E4 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7E4 + ,simpleLowerCaseMapping:0x1D7E4 + ,simpleTitleCaseMapping:0x1D7E4 + }, + { code:0x1D7E5 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7E5 + ,simpleLowerCaseMapping:0x1D7E5 + ,simpleTitleCaseMapping:0x1D7E5 + }, + { code:0x1D7E6 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7E6 + ,simpleLowerCaseMapping:0x1D7E6 + ,simpleTitleCaseMapping:0x1D7E6 + }, + { code:0x1D7E7 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7E7 + ,simpleLowerCaseMapping:0x1D7E7 + ,simpleTitleCaseMapping:0x1D7E7 + }, + { code:0x1D7E8 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7E8 + ,simpleLowerCaseMapping:0x1D7E8 + ,simpleTitleCaseMapping:0x1D7E8 + }, + { code:0x1D7E9 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7E9 + ,simpleLowerCaseMapping:0x1D7E9 + ,simpleTitleCaseMapping:0x1D7E9 + }, + { code:0x1D7EA + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7EA + ,simpleLowerCaseMapping:0x1D7EA + ,simpleTitleCaseMapping:0x1D7EA + }, + { code:0x1D7EB + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7EB + ,simpleLowerCaseMapping:0x1D7EB + ,simpleTitleCaseMapping:0x1D7EB + }, + { code:0x1D7EC + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7EC + ,simpleLowerCaseMapping:0x1D7EC + ,simpleTitleCaseMapping:0x1D7EC + }, + { code:0x1D7ED + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7ED + ,simpleLowerCaseMapping:0x1D7ED + ,simpleTitleCaseMapping:0x1D7ED + }, + { code:0x1D7EE + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7EE + ,simpleLowerCaseMapping:0x1D7EE + ,simpleTitleCaseMapping:0x1D7EE + }, + { code:0x1D7EF + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7EF + ,simpleLowerCaseMapping:0x1D7EF + ,simpleTitleCaseMapping:0x1D7EF + }, + { code:0x1D7F0 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7F0 + ,simpleLowerCaseMapping:0x1D7F0 + ,simpleTitleCaseMapping:0x1D7F0 + }, + { code:0x1D7F1 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7F1 + ,simpleLowerCaseMapping:0x1D7F1 + ,simpleTitleCaseMapping:0x1D7F1 + }, + { code:0x1D7F2 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7F2 + ,simpleLowerCaseMapping:0x1D7F2 + ,simpleTitleCaseMapping:0x1D7F2 + }, + { code:0x1D7F3 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7F3 + ,simpleLowerCaseMapping:0x1D7F3 + ,simpleTitleCaseMapping:0x1D7F3 + }, + { code:0x1D7F4 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7F4 + ,simpleLowerCaseMapping:0x1D7F4 + ,simpleTitleCaseMapping:0x1D7F4 + }, + { code:0x1D7F5 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7F5 + ,simpleLowerCaseMapping:0x1D7F5 + ,simpleTitleCaseMapping:0x1D7F5 + }, + { code:0x1D7F6 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7F6 + ,simpleLowerCaseMapping:0x1D7F6 + ,simpleTitleCaseMapping:0x1D7F6 + }, + { code:0x1D7F7 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7F7 + ,simpleLowerCaseMapping:0x1D7F7 + ,simpleTitleCaseMapping:0x1D7F7 + }, + { code:0x1D7F8 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7F8 + ,simpleLowerCaseMapping:0x1D7F8 + ,simpleTitleCaseMapping:0x1D7F8 + }, + { code:0x1D7F9 + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7F9 + ,simpleLowerCaseMapping:0x1D7F9 + ,simpleTitleCaseMapping:0x1D7F9 + }, + { code:0x1D7FA + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7FA + ,simpleLowerCaseMapping:0x1D7FA + ,simpleTitleCaseMapping:0x1D7FA + }, + { code:0x1D7FB + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7FB + ,simpleLowerCaseMapping:0x1D7FB + ,simpleTitleCaseMapping:0x1D7FB + }, + { code:0x1D7FC + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7FC + ,simpleLowerCaseMapping:0x1D7FC + ,simpleTitleCaseMapping:0x1D7FC + }, + { code:0x1D7FD + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7FD + ,simpleLowerCaseMapping:0x1D7FD + ,simpleTitleCaseMapping:0x1D7FD + }, + { code:0x1D7FE + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7FE + ,simpleLowerCaseMapping:0x1D7FE + ,simpleTitleCaseMapping:0x1D7FE + }, + { code:0x1D7FF + ,generalCategory:UnicodeData.GeneralCategory.Nd + ,simpleUpperCaseMapping:0x1D7FF + ,simpleLowerCaseMapping:0x1D7FF + ,simpleTitleCaseMapping:0x1D7FF + }, + { code:0x20000 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x20000 + ,simpleLowerCaseMapping:0x20000 + ,simpleTitleCaseMapping:0x20000 + }, + { code:0x2A6D6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2A6D6 + ,simpleLowerCaseMapping:0x2A6D6 + ,simpleTitleCaseMapping:0x2A6D6 + }, + { code:0x2F800 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F800 + ,simpleLowerCaseMapping:0x2F800 + ,simpleTitleCaseMapping:0x2F800 + }, + { code:0x2F801 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F801 + ,simpleLowerCaseMapping:0x2F801 + ,simpleTitleCaseMapping:0x2F801 + }, + { code:0x2F802 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F802 + ,simpleLowerCaseMapping:0x2F802 + ,simpleTitleCaseMapping:0x2F802 + }, + { code:0x2F803 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F803 + ,simpleLowerCaseMapping:0x2F803 + ,simpleTitleCaseMapping:0x2F803 + }, + { code:0x2F804 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F804 + ,simpleLowerCaseMapping:0x2F804 + ,simpleTitleCaseMapping:0x2F804 + }, + { code:0x2F805 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F805 + ,simpleLowerCaseMapping:0x2F805 + ,simpleTitleCaseMapping:0x2F805 + }, + { code:0x2F806 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F806 + ,simpleLowerCaseMapping:0x2F806 + ,simpleTitleCaseMapping:0x2F806 + }, + { code:0x2F807 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F807 + ,simpleLowerCaseMapping:0x2F807 + ,simpleTitleCaseMapping:0x2F807 + }, + { code:0x2F808 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F808 + ,simpleLowerCaseMapping:0x2F808 + ,simpleTitleCaseMapping:0x2F808 + }, + { code:0x2F809 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F809 + ,simpleLowerCaseMapping:0x2F809 + ,simpleTitleCaseMapping:0x2F809 + }, + { code:0x2F80A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F80A + ,simpleLowerCaseMapping:0x2F80A + ,simpleTitleCaseMapping:0x2F80A + }, + { code:0x2F80B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F80B + ,simpleLowerCaseMapping:0x2F80B + ,simpleTitleCaseMapping:0x2F80B + }, + { code:0x2F80C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F80C + ,simpleLowerCaseMapping:0x2F80C + ,simpleTitleCaseMapping:0x2F80C + }, + { code:0x2F80D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F80D + ,simpleLowerCaseMapping:0x2F80D + ,simpleTitleCaseMapping:0x2F80D + }, + { code:0x2F80E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F80E + ,simpleLowerCaseMapping:0x2F80E + ,simpleTitleCaseMapping:0x2F80E + }, + { code:0x2F80F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F80F + ,simpleLowerCaseMapping:0x2F80F + ,simpleTitleCaseMapping:0x2F80F + }, + { code:0x2F810 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F810 + ,simpleLowerCaseMapping:0x2F810 + ,simpleTitleCaseMapping:0x2F810 + }, + { code:0x2F811 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F811 + ,simpleLowerCaseMapping:0x2F811 + ,simpleTitleCaseMapping:0x2F811 + }, + { code:0x2F812 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F812 + ,simpleLowerCaseMapping:0x2F812 + ,simpleTitleCaseMapping:0x2F812 + }, + { code:0x2F813 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F813 + ,simpleLowerCaseMapping:0x2F813 + ,simpleTitleCaseMapping:0x2F813 + }, + { code:0x2F814 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F814 + ,simpleLowerCaseMapping:0x2F814 + ,simpleTitleCaseMapping:0x2F814 + }, + { code:0x2F815 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F815 + ,simpleLowerCaseMapping:0x2F815 + ,simpleTitleCaseMapping:0x2F815 + }, + { code:0x2F816 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F816 + ,simpleLowerCaseMapping:0x2F816 + ,simpleTitleCaseMapping:0x2F816 + }, + { code:0x2F817 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F817 + ,simpleLowerCaseMapping:0x2F817 + ,simpleTitleCaseMapping:0x2F817 + }, + { code:0x2F818 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F818 + ,simpleLowerCaseMapping:0x2F818 + ,simpleTitleCaseMapping:0x2F818 + }, + { code:0x2F819 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F819 + ,simpleLowerCaseMapping:0x2F819 + ,simpleTitleCaseMapping:0x2F819 + }, + { code:0x2F81A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F81A + ,simpleLowerCaseMapping:0x2F81A + ,simpleTitleCaseMapping:0x2F81A + }, + { code:0x2F81B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F81B + ,simpleLowerCaseMapping:0x2F81B + ,simpleTitleCaseMapping:0x2F81B + }, + { code:0x2F81C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F81C + ,simpleLowerCaseMapping:0x2F81C + ,simpleTitleCaseMapping:0x2F81C + }, + { code:0x2F81D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F81D + ,simpleLowerCaseMapping:0x2F81D + ,simpleTitleCaseMapping:0x2F81D + }, + { code:0x2F81E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F81E + ,simpleLowerCaseMapping:0x2F81E + ,simpleTitleCaseMapping:0x2F81E + }, + { code:0x2F81F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F81F + ,simpleLowerCaseMapping:0x2F81F + ,simpleTitleCaseMapping:0x2F81F + }, + { code:0x2F820 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F820 + ,simpleLowerCaseMapping:0x2F820 + ,simpleTitleCaseMapping:0x2F820 + }, + { code:0x2F821 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F821 + ,simpleLowerCaseMapping:0x2F821 + ,simpleTitleCaseMapping:0x2F821 + }, + { code:0x2F822 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F822 + ,simpleLowerCaseMapping:0x2F822 + ,simpleTitleCaseMapping:0x2F822 + }, + { code:0x2F823 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F823 + ,simpleLowerCaseMapping:0x2F823 + ,simpleTitleCaseMapping:0x2F823 + }, + { code:0x2F824 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F824 + ,simpleLowerCaseMapping:0x2F824 + ,simpleTitleCaseMapping:0x2F824 + }, + { code:0x2F825 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F825 + ,simpleLowerCaseMapping:0x2F825 + ,simpleTitleCaseMapping:0x2F825 + }, + { code:0x2F826 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F826 + ,simpleLowerCaseMapping:0x2F826 + ,simpleTitleCaseMapping:0x2F826 + }, + { code:0x2F827 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F827 + ,simpleLowerCaseMapping:0x2F827 + ,simpleTitleCaseMapping:0x2F827 + }, + { code:0x2F828 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F828 + ,simpleLowerCaseMapping:0x2F828 + ,simpleTitleCaseMapping:0x2F828 + }, + { code:0x2F829 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F829 + ,simpleLowerCaseMapping:0x2F829 + ,simpleTitleCaseMapping:0x2F829 + }, + { code:0x2F82A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F82A + ,simpleLowerCaseMapping:0x2F82A + ,simpleTitleCaseMapping:0x2F82A + }, + { code:0x2F82B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F82B + ,simpleLowerCaseMapping:0x2F82B + ,simpleTitleCaseMapping:0x2F82B + }, + { code:0x2F82C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F82C + ,simpleLowerCaseMapping:0x2F82C + ,simpleTitleCaseMapping:0x2F82C + }, + { code:0x2F82D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F82D + ,simpleLowerCaseMapping:0x2F82D + ,simpleTitleCaseMapping:0x2F82D + }, + { code:0x2F82E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F82E + ,simpleLowerCaseMapping:0x2F82E + ,simpleTitleCaseMapping:0x2F82E + }, + { code:0x2F82F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F82F + ,simpleLowerCaseMapping:0x2F82F + ,simpleTitleCaseMapping:0x2F82F + }, + { code:0x2F830 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F830 + ,simpleLowerCaseMapping:0x2F830 + ,simpleTitleCaseMapping:0x2F830 + }, + { code:0x2F831 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F831 + ,simpleLowerCaseMapping:0x2F831 + ,simpleTitleCaseMapping:0x2F831 + }, + { code:0x2F832 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F832 + ,simpleLowerCaseMapping:0x2F832 + ,simpleTitleCaseMapping:0x2F832 + }, + { code:0x2F833 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F833 + ,simpleLowerCaseMapping:0x2F833 + ,simpleTitleCaseMapping:0x2F833 + }, + { code:0x2F834 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F834 + ,simpleLowerCaseMapping:0x2F834 + ,simpleTitleCaseMapping:0x2F834 + }, + { code:0x2F835 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F835 + ,simpleLowerCaseMapping:0x2F835 + ,simpleTitleCaseMapping:0x2F835 + }, + { code:0x2F836 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F836 + ,simpleLowerCaseMapping:0x2F836 + ,simpleTitleCaseMapping:0x2F836 + }, + { code:0x2F837 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F837 + ,simpleLowerCaseMapping:0x2F837 + ,simpleTitleCaseMapping:0x2F837 + }, + { code:0x2F838 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F838 + ,simpleLowerCaseMapping:0x2F838 + ,simpleTitleCaseMapping:0x2F838 + }, + { code:0x2F839 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F839 + ,simpleLowerCaseMapping:0x2F839 + ,simpleTitleCaseMapping:0x2F839 + }, + { code:0x2F83A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F83A + ,simpleLowerCaseMapping:0x2F83A + ,simpleTitleCaseMapping:0x2F83A + }, + { code:0x2F83B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F83B + ,simpleLowerCaseMapping:0x2F83B + ,simpleTitleCaseMapping:0x2F83B + }, + { code:0x2F83C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F83C + ,simpleLowerCaseMapping:0x2F83C + ,simpleTitleCaseMapping:0x2F83C + }, + { code:0x2F83D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F83D + ,simpleLowerCaseMapping:0x2F83D + ,simpleTitleCaseMapping:0x2F83D + }, + { code:0x2F83E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F83E + ,simpleLowerCaseMapping:0x2F83E + ,simpleTitleCaseMapping:0x2F83E + }, + { code:0x2F83F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F83F + ,simpleLowerCaseMapping:0x2F83F + ,simpleTitleCaseMapping:0x2F83F + }, + { code:0x2F840 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F840 + ,simpleLowerCaseMapping:0x2F840 + ,simpleTitleCaseMapping:0x2F840 + }, + { code:0x2F841 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F841 + ,simpleLowerCaseMapping:0x2F841 + ,simpleTitleCaseMapping:0x2F841 + }, + { code:0x2F842 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F842 + ,simpleLowerCaseMapping:0x2F842 + ,simpleTitleCaseMapping:0x2F842 + }, + { code:0x2F843 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F843 + ,simpleLowerCaseMapping:0x2F843 + ,simpleTitleCaseMapping:0x2F843 + }, + { code:0x2F844 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F844 + ,simpleLowerCaseMapping:0x2F844 + ,simpleTitleCaseMapping:0x2F844 + }, + { code:0x2F845 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F845 + ,simpleLowerCaseMapping:0x2F845 + ,simpleTitleCaseMapping:0x2F845 + }, + { code:0x2F846 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F846 + ,simpleLowerCaseMapping:0x2F846 + ,simpleTitleCaseMapping:0x2F846 + }, + { code:0x2F847 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F847 + ,simpleLowerCaseMapping:0x2F847 + ,simpleTitleCaseMapping:0x2F847 + }, + { code:0x2F848 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F848 + ,simpleLowerCaseMapping:0x2F848 + ,simpleTitleCaseMapping:0x2F848 + }, + { code:0x2F849 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F849 + ,simpleLowerCaseMapping:0x2F849 + ,simpleTitleCaseMapping:0x2F849 + }, + { code:0x2F84A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F84A + ,simpleLowerCaseMapping:0x2F84A + ,simpleTitleCaseMapping:0x2F84A + }, + { code:0x2F84B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F84B + ,simpleLowerCaseMapping:0x2F84B + ,simpleTitleCaseMapping:0x2F84B + }, + { code:0x2F84C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F84C + ,simpleLowerCaseMapping:0x2F84C + ,simpleTitleCaseMapping:0x2F84C + }, + { code:0x2F84D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F84D + ,simpleLowerCaseMapping:0x2F84D + ,simpleTitleCaseMapping:0x2F84D + }, + { code:0x2F84E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F84E + ,simpleLowerCaseMapping:0x2F84E + ,simpleTitleCaseMapping:0x2F84E + }, + { code:0x2F84F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F84F + ,simpleLowerCaseMapping:0x2F84F + ,simpleTitleCaseMapping:0x2F84F + }, + { code:0x2F850 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F850 + ,simpleLowerCaseMapping:0x2F850 + ,simpleTitleCaseMapping:0x2F850 + }, + { code:0x2F851 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F851 + ,simpleLowerCaseMapping:0x2F851 + ,simpleTitleCaseMapping:0x2F851 + }, + { code:0x2F852 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F852 + ,simpleLowerCaseMapping:0x2F852 + ,simpleTitleCaseMapping:0x2F852 + }, + { code:0x2F853 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F853 + ,simpleLowerCaseMapping:0x2F853 + ,simpleTitleCaseMapping:0x2F853 + }, + { code:0x2F854 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F854 + ,simpleLowerCaseMapping:0x2F854 + ,simpleTitleCaseMapping:0x2F854 + }, + { code:0x2F855 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F855 + ,simpleLowerCaseMapping:0x2F855 + ,simpleTitleCaseMapping:0x2F855 + }, + { code:0x2F856 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F856 + ,simpleLowerCaseMapping:0x2F856 + ,simpleTitleCaseMapping:0x2F856 + }, + { code:0x2F857 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F857 + ,simpleLowerCaseMapping:0x2F857 + ,simpleTitleCaseMapping:0x2F857 + }, + { code:0x2F858 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F858 + ,simpleLowerCaseMapping:0x2F858 + ,simpleTitleCaseMapping:0x2F858 + }, + { code:0x2F859 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F859 + ,simpleLowerCaseMapping:0x2F859 + ,simpleTitleCaseMapping:0x2F859 + }, + { code:0x2F85A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F85A + ,simpleLowerCaseMapping:0x2F85A + ,simpleTitleCaseMapping:0x2F85A + }, + { code:0x2F85B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F85B + ,simpleLowerCaseMapping:0x2F85B + ,simpleTitleCaseMapping:0x2F85B + }, + { code:0x2F85C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F85C + ,simpleLowerCaseMapping:0x2F85C + ,simpleTitleCaseMapping:0x2F85C + }, + { code:0x2F85D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F85D + ,simpleLowerCaseMapping:0x2F85D + ,simpleTitleCaseMapping:0x2F85D + }, + { code:0x2F85E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F85E + ,simpleLowerCaseMapping:0x2F85E + ,simpleTitleCaseMapping:0x2F85E + }, + { code:0x2F85F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F85F + ,simpleLowerCaseMapping:0x2F85F + ,simpleTitleCaseMapping:0x2F85F + }, + { code:0x2F860 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F860 + ,simpleLowerCaseMapping:0x2F860 + ,simpleTitleCaseMapping:0x2F860 + }, + { code:0x2F861 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F861 + ,simpleLowerCaseMapping:0x2F861 + ,simpleTitleCaseMapping:0x2F861 + }, + { code:0x2F862 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F862 + ,simpleLowerCaseMapping:0x2F862 + ,simpleTitleCaseMapping:0x2F862 + }, + { code:0x2F863 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F863 + ,simpleLowerCaseMapping:0x2F863 + ,simpleTitleCaseMapping:0x2F863 + }, + { code:0x2F864 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F864 + ,simpleLowerCaseMapping:0x2F864 + ,simpleTitleCaseMapping:0x2F864 + }, + { code:0x2F865 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F865 + ,simpleLowerCaseMapping:0x2F865 + ,simpleTitleCaseMapping:0x2F865 + }, + { code:0x2F866 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F866 + ,simpleLowerCaseMapping:0x2F866 + ,simpleTitleCaseMapping:0x2F866 + }, + { code:0x2F867 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F867 + ,simpleLowerCaseMapping:0x2F867 + ,simpleTitleCaseMapping:0x2F867 + }, + { code:0x2F868 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F868 + ,simpleLowerCaseMapping:0x2F868 + ,simpleTitleCaseMapping:0x2F868 + }, + { code:0x2F869 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F869 + ,simpleLowerCaseMapping:0x2F869 + ,simpleTitleCaseMapping:0x2F869 + }, + { code:0x2F86A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F86A + ,simpleLowerCaseMapping:0x2F86A + ,simpleTitleCaseMapping:0x2F86A + }, + { code:0x2F86B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F86B + ,simpleLowerCaseMapping:0x2F86B + ,simpleTitleCaseMapping:0x2F86B + }, + { code:0x2F86C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F86C + ,simpleLowerCaseMapping:0x2F86C + ,simpleTitleCaseMapping:0x2F86C + }, + { code:0x2F86D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F86D + ,simpleLowerCaseMapping:0x2F86D + ,simpleTitleCaseMapping:0x2F86D + }, + { code:0x2F86E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F86E + ,simpleLowerCaseMapping:0x2F86E + ,simpleTitleCaseMapping:0x2F86E + }, + { code:0x2F86F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F86F + ,simpleLowerCaseMapping:0x2F86F + ,simpleTitleCaseMapping:0x2F86F + }, + { code:0x2F870 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F870 + ,simpleLowerCaseMapping:0x2F870 + ,simpleTitleCaseMapping:0x2F870 + }, + { code:0x2F871 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F871 + ,simpleLowerCaseMapping:0x2F871 + ,simpleTitleCaseMapping:0x2F871 + }, + { code:0x2F872 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F872 + ,simpleLowerCaseMapping:0x2F872 + ,simpleTitleCaseMapping:0x2F872 + }, + { code:0x2F873 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F873 + ,simpleLowerCaseMapping:0x2F873 + ,simpleTitleCaseMapping:0x2F873 + }, + { code:0x2F874 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F874 + ,simpleLowerCaseMapping:0x2F874 + ,simpleTitleCaseMapping:0x2F874 + }, + { code:0x2F875 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F875 + ,simpleLowerCaseMapping:0x2F875 + ,simpleTitleCaseMapping:0x2F875 + }, + { code:0x2F876 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F876 + ,simpleLowerCaseMapping:0x2F876 + ,simpleTitleCaseMapping:0x2F876 + }, + { code:0x2F877 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F877 + ,simpleLowerCaseMapping:0x2F877 + ,simpleTitleCaseMapping:0x2F877 + }, + { code:0x2F878 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F878 + ,simpleLowerCaseMapping:0x2F878 + ,simpleTitleCaseMapping:0x2F878 + }, + { code:0x2F879 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F879 + ,simpleLowerCaseMapping:0x2F879 + ,simpleTitleCaseMapping:0x2F879 + }, + { code:0x2F87A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F87A + ,simpleLowerCaseMapping:0x2F87A + ,simpleTitleCaseMapping:0x2F87A + }, + { code:0x2F87B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F87B + ,simpleLowerCaseMapping:0x2F87B + ,simpleTitleCaseMapping:0x2F87B + }, + { code:0x2F87C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F87C + ,simpleLowerCaseMapping:0x2F87C + ,simpleTitleCaseMapping:0x2F87C + }, + { code:0x2F87D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F87D + ,simpleLowerCaseMapping:0x2F87D + ,simpleTitleCaseMapping:0x2F87D + }, + { code:0x2F87E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F87E + ,simpleLowerCaseMapping:0x2F87E + ,simpleTitleCaseMapping:0x2F87E + }, + { code:0x2F87F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F87F + ,simpleLowerCaseMapping:0x2F87F + ,simpleTitleCaseMapping:0x2F87F + }, + { code:0x2F880 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F880 + ,simpleLowerCaseMapping:0x2F880 + ,simpleTitleCaseMapping:0x2F880 + }, + { code:0x2F881 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F881 + ,simpleLowerCaseMapping:0x2F881 + ,simpleTitleCaseMapping:0x2F881 + }, + { code:0x2F882 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F882 + ,simpleLowerCaseMapping:0x2F882 + ,simpleTitleCaseMapping:0x2F882 + }, + { code:0x2F883 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F883 + ,simpleLowerCaseMapping:0x2F883 + ,simpleTitleCaseMapping:0x2F883 + }, + { code:0x2F884 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F884 + ,simpleLowerCaseMapping:0x2F884 + ,simpleTitleCaseMapping:0x2F884 + }, + { code:0x2F885 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F885 + ,simpleLowerCaseMapping:0x2F885 + ,simpleTitleCaseMapping:0x2F885 + }, + { code:0x2F886 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F886 + ,simpleLowerCaseMapping:0x2F886 + ,simpleTitleCaseMapping:0x2F886 + }, + { code:0x2F887 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F887 + ,simpleLowerCaseMapping:0x2F887 + ,simpleTitleCaseMapping:0x2F887 + }, + { code:0x2F888 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F888 + ,simpleLowerCaseMapping:0x2F888 + ,simpleTitleCaseMapping:0x2F888 + }, + { code:0x2F889 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F889 + ,simpleLowerCaseMapping:0x2F889 + ,simpleTitleCaseMapping:0x2F889 + }, + { code:0x2F88A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F88A + ,simpleLowerCaseMapping:0x2F88A + ,simpleTitleCaseMapping:0x2F88A + }, + { code:0x2F88B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F88B + ,simpleLowerCaseMapping:0x2F88B + ,simpleTitleCaseMapping:0x2F88B + }, + { code:0x2F88C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F88C + ,simpleLowerCaseMapping:0x2F88C + ,simpleTitleCaseMapping:0x2F88C + }, + { code:0x2F88D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F88D + ,simpleLowerCaseMapping:0x2F88D + ,simpleTitleCaseMapping:0x2F88D + }, + { code:0x2F88E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F88E + ,simpleLowerCaseMapping:0x2F88E + ,simpleTitleCaseMapping:0x2F88E + }, + { code:0x2F88F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F88F + ,simpleLowerCaseMapping:0x2F88F + ,simpleTitleCaseMapping:0x2F88F + }, + { code:0x2F890 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F890 + ,simpleLowerCaseMapping:0x2F890 + ,simpleTitleCaseMapping:0x2F890 + }, + { code:0x2F891 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F891 + ,simpleLowerCaseMapping:0x2F891 + ,simpleTitleCaseMapping:0x2F891 + }, + { code:0x2F892 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F892 + ,simpleLowerCaseMapping:0x2F892 + ,simpleTitleCaseMapping:0x2F892 + }, + { code:0x2F893 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F893 + ,simpleLowerCaseMapping:0x2F893 + ,simpleTitleCaseMapping:0x2F893 + }, + { code:0x2F894 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F894 + ,simpleLowerCaseMapping:0x2F894 + ,simpleTitleCaseMapping:0x2F894 + }, + { code:0x2F895 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F895 + ,simpleLowerCaseMapping:0x2F895 + ,simpleTitleCaseMapping:0x2F895 + }, + { code:0x2F896 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F896 + ,simpleLowerCaseMapping:0x2F896 + ,simpleTitleCaseMapping:0x2F896 + }, + { code:0x2F897 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F897 + ,simpleLowerCaseMapping:0x2F897 + ,simpleTitleCaseMapping:0x2F897 + }, + { code:0x2F898 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F898 + ,simpleLowerCaseMapping:0x2F898 + ,simpleTitleCaseMapping:0x2F898 + }, + { code:0x2F899 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F899 + ,simpleLowerCaseMapping:0x2F899 + ,simpleTitleCaseMapping:0x2F899 + }, + { code:0x2F89A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F89A + ,simpleLowerCaseMapping:0x2F89A + ,simpleTitleCaseMapping:0x2F89A + }, + { code:0x2F89B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F89B + ,simpleLowerCaseMapping:0x2F89B + ,simpleTitleCaseMapping:0x2F89B + }, + { code:0x2F89C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F89C + ,simpleLowerCaseMapping:0x2F89C + ,simpleTitleCaseMapping:0x2F89C + }, + { code:0x2F89D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F89D + ,simpleLowerCaseMapping:0x2F89D + ,simpleTitleCaseMapping:0x2F89D + }, + { code:0x2F89E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F89E + ,simpleLowerCaseMapping:0x2F89E + ,simpleTitleCaseMapping:0x2F89E + }, + { code:0x2F89F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F89F + ,simpleLowerCaseMapping:0x2F89F + ,simpleTitleCaseMapping:0x2F89F + }, + { code:0x2F8A0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8A0 + ,simpleLowerCaseMapping:0x2F8A0 + ,simpleTitleCaseMapping:0x2F8A0 + }, + { code:0x2F8A1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8A1 + ,simpleLowerCaseMapping:0x2F8A1 + ,simpleTitleCaseMapping:0x2F8A1 + }, + { code:0x2F8A2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8A2 + ,simpleLowerCaseMapping:0x2F8A2 + ,simpleTitleCaseMapping:0x2F8A2 + }, + { code:0x2F8A3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8A3 + ,simpleLowerCaseMapping:0x2F8A3 + ,simpleTitleCaseMapping:0x2F8A3 + }, + { code:0x2F8A4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8A4 + ,simpleLowerCaseMapping:0x2F8A4 + ,simpleTitleCaseMapping:0x2F8A4 + }, + { code:0x2F8A5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8A5 + ,simpleLowerCaseMapping:0x2F8A5 + ,simpleTitleCaseMapping:0x2F8A5 + }, + { code:0x2F8A6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8A6 + ,simpleLowerCaseMapping:0x2F8A6 + ,simpleTitleCaseMapping:0x2F8A6 + }, + { code:0x2F8A7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8A7 + ,simpleLowerCaseMapping:0x2F8A7 + ,simpleTitleCaseMapping:0x2F8A7 + }, + { code:0x2F8A8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8A8 + ,simpleLowerCaseMapping:0x2F8A8 + ,simpleTitleCaseMapping:0x2F8A8 + }, + { code:0x2F8A9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8A9 + ,simpleLowerCaseMapping:0x2F8A9 + ,simpleTitleCaseMapping:0x2F8A9 + }, + { code:0x2F8AA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8AA + ,simpleLowerCaseMapping:0x2F8AA + ,simpleTitleCaseMapping:0x2F8AA + }, + { code:0x2F8AB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8AB + ,simpleLowerCaseMapping:0x2F8AB + ,simpleTitleCaseMapping:0x2F8AB + }, + { code:0x2F8AC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8AC + ,simpleLowerCaseMapping:0x2F8AC + ,simpleTitleCaseMapping:0x2F8AC + }, + { code:0x2F8AD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8AD + ,simpleLowerCaseMapping:0x2F8AD + ,simpleTitleCaseMapping:0x2F8AD + }, + { code:0x2F8AE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8AE + ,simpleLowerCaseMapping:0x2F8AE + ,simpleTitleCaseMapping:0x2F8AE + }, + { code:0x2F8AF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8AF + ,simpleLowerCaseMapping:0x2F8AF + ,simpleTitleCaseMapping:0x2F8AF + }, + { code:0x2F8B0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8B0 + ,simpleLowerCaseMapping:0x2F8B0 + ,simpleTitleCaseMapping:0x2F8B0 + }, + { code:0x2F8B1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8B1 + ,simpleLowerCaseMapping:0x2F8B1 + ,simpleTitleCaseMapping:0x2F8B1 + }, + { code:0x2F8B2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8B2 + ,simpleLowerCaseMapping:0x2F8B2 + ,simpleTitleCaseMapping:0x2F8B2 + }, + { code:0x2F8B3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8B3 + ,simpleLowerCaseMapping:0x2F8B3 + ,simpleTitleCaseMapping:0x2F8B3 + }, + { code:0x2F8B4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8B4 + ,simpleLowerCaseMapping:0x2F8B4 + ,simpleTitleCaseMapping:0x2F8B4 + }, + { code:0x2F8B5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8B5 + ,simpleLowerCaseMapping:0x2F8B5 + ,simpleTitleCaseMapping:0x2F8B5 + }, + { code:0x2F8B6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8B6 + ,simpleLowerCaseMapping:0x2F8B6 + ,simpleTitleCaseMapping:0x2F8B6 + }, + { code:0x2F8B7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8B7 + ,simpleLowerCaseMapping:0x2F8B7 + ,simpleTitleCaseMapping:0x2F8B7 + }, + { code:0x2F8B8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8B8 + ,simpleLowerCaseMapping:0x2F8B8 + ,simpleTitleCaseMapping:0x2F8B8 + }, + { code:0x2F8B9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8B9 + ,simpleLowerCaseMapping:0x2F8B9 + ,simpleTitleCaseMapping:0x2F8B9 + }, + { code:0x2F8BA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8BA + ,simpleLowerCaseMapping:0x2F8BA + ,simpleTitleCaseMapping:0x2F8BA + }, + { code:0x2F8BB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8BB + ,simpleLowerCaseMapping:0x2F8BB + ,simpleTitleCaseMapping:0x2F8BB + }, + { code:0x2F8BC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8BC + ,simpleLowerCaseMapping:0x2F8BC + ,simpleTitleCaseMapping:0x2F8BC + }, + { code:0x2F8BD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8BD + ,simpleLowerCaseMapping:0x2F8BD + ,simpleTitleCaseMapping:0x2F8BD + }, + { code:0x2F8BE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8BE + ,simpleLowerCaseMapping:0x2F8BE + ,simpleTitleCaseMapping:0x2F8BE + }, + { code:0x2F8BF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8BF + ,simpleLowerCaseMapping:0x2F8BF + ,simpleTitleCaseMapping:0x2F8BF + }, + { code:0x2F8C0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8C0 + ,simpleLowerCaseMapping:0x2F8C0 + ,simpleTitleCaseMapping:0x2F8C0 + }, + { code:0x2F8C1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8C1 + ,simpleLowerCaseMapping:0x2F8C1 + ,simpleTitleCaseMapping:0x2F8C1 + }, + { code:0x2F8C2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8C2 + ,simpleLowerCaseMapping:0x2F8C2 + ,simpleTitleCaseMapping:0x2F8C2 + }, + { code:0x2F8C3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8C3 + ,simpleLowerCaseMapping:0x2F8C3 + ,simpleTitleCaseMapping:0x2F8C3 + }, + { code:0x2F8C4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8C4 + ,simpleLowerCaseMapping:0x2F8C4 + ,simpleTitleCaseMapping:0x2F8C4 + }, + { code:0x2F8C5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8C5 + ,simpleLowerCaseMapping:0x2F8C5 + ,simpleTitleCaseMapping:0x2F8C5 + }, + { code:0x2F8C6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8C6 + ,simpleLowerCaseMapping:0x2F8C6 + ,simpleTitleCaseMapping:0x2F8C6 + }, + { code:0x2F8C7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8C7 + ,simpleLowerCaseMapping:0x2F8C7 + ,simpleTitleCaseMapping:0x2F8C7 + }, + { code:0x2F8C8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8C8 + ,simpleLowerCaseMapping:0x2F8C8 + ,simpleTitleCaseMapping:0x2F8C8 + }, + { code:0x2F8C9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8C9 + ,simpleLowerCaseMapping:0x2F8C9 + ,simpleTitleCaseMapping:0x2F8C9 + }, + { code:0x2F8CA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8CA + ,simpleLowerCaseMapping:0x2F8CA + ,simpleTitleCaseMapping:0x2F8CA + }, + { code:0x2F8CB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8CB + ,simpleLowerCaseMapping:0x2F8CB + ,simpleTitleCaseMapping:0x2F8CB + }, + { code:0x2F8CC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8CC + ,simpleLowerCaseMapping:0x2F8CC + ,simpleTitleCaseMapping:0x2F8CC + }, + { code:0x2F8CD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8CD + ,simpleLowerCaseMapping:0x2F8CD + ,simpleTitleCaseMapping:0x2F8CD + }, + { code:0x2F8CE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8CE + ,simpleLowerCaseMapping:0x2F8CE + ,simpleTitleCaseMapping:0x2F8CE + }, + { code:0x2F8CF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8CF + ,simpleLowerCaseMapping:0x2F8CF + ,simpleTitleCaseMapping:0x2F8CF + }, + { code:0x2F8D0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8D0 + ,simpleLowerCaseMapping:0x2F8D0 + ,simpleTitleCaseMapping:0x2F8D0 + }, + { code:0x2F8D1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8D1 + ,simpleLowerCaseMapping:0x2F8D1 + ,simpleTitleCaseMapping:0x2F8D1 + }, + { code:0x2F8D2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8D2 + ,simpleLowerCaseMapping:0x2F8D2 + ,simpleTitleCaseMapping:0x2F8D2 + }, + { code:0x2F8D3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8D3 + ,simpleLowerCaseMapping:0x2F8D3 + ,simpleTitleCaseMapping:0x2F8D3 + }, + { code:0x2F8D4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8D4 + ,simpleLowerCaseMapping:0x2F8D4 + ,simpleTitleCaseMapping:0x2F8D4 + }, + { code:0x2F8D5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8D5 + ,simpleLowerCaseMapping:0x2F8D5 + ,simpleTitleCaseMapping:0x2F8D5 + }, + { code:0x2F8D6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8D6 + ,simpleLowerCaseMapping:0x2F8D6 + ,simpleTitleCaseMapping:0x2F8D6 + }, + { code:0x2F8D7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8D7 + ,simpleLowerCaseMapping:0x2F8D7 + ,simpleTitleCaseMapping:0x2F8D7 + }, + { code:0x2F8D8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8D8 + ,simpleLowerCaseMapping:0x2F8D8 + ,simpleTitleCaseMapping:0x2F8D8 + }, + { code:0x2F8D9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8D9 + ,simpleLowerCaseMapping:0x2F8D9 + ,simpleTitleCaseMapping:0x2F8D9 + }, + { code:0x2F8DA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8DA + ,simpleLowerCaseMapping:0x2F8DA + ,simpleTitleCaseMapping:0x2F8DA + }, + { code:0x2F8DB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8DB + ,simpleLowerCaseMapping:0x2F8DB + ,simpleTitleCaseMapping:0x2F8DB + }, + { code:0x2F8DC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8DC + ,simpleLowerCaseMapping:0x2F8DC + ,simpleTitleCaseMapping:0x2F8DC + }, + { code:0x2F8DD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8DD + ,simpleLowerCaseMapping:0x2F8DD + ,simpleTitleCaseMapping:0x2F8DD + }, + { code:0x2F8DE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8DE + ,simpleLowerCaseMapping:0x2F8DE + ,simpleTitleCaseMapping:0x2F8DE + }, + { code:0x2F8DF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8DF + ,simpleLowerCaseMapping:0x2F8DF + ,simpleTitleCaseMapping:0x2F8DF + }, + { code:0x2F8E0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8E0 + ,simpleLowerCaseMapping:0x2F8E0 + ,simpleTitleCaseMapping:0x2F8E0 + }, + { code:0x2F8E1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8E1 + ,simpleLowerCaseMapping:0x2F8E1 + ,simpleTitleCaseMapping:0x2F8E1 + }, + { code:0x2F8E2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8E2 + ,simpleLowerCaseMapping:0x2F8E2 + ,simpleTitleCaseMapping:0x2F8E2 + }, + { code:0x2F8E3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8E3 + ,simpleLowerCaseMapping:0x2F8E3 + ,simpleTitleCaseMapping:0x2F8E3 + }, + { code:0x2F8E4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8E4 + ,simpleLowerCaseMapping:0x2F8E4 + ,simpleTitleCaseMapping:0x2F8E4 + }, + { code:0x2F8E5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8E5 + ,simpleLowerCaseMapping:0x2F8E5 + ,simpleTitleCaseMapping:0x2F8E5 + }, + { code:0x2F8E6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8E6 + ,simpleLowerCaseMapping:0x2F8E6 + ,simpleTitleCaseMapping:0x2F8E6 + }, + { code:0x2F8E7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8E7 + ,simpleLowerCaseMapping:0x2F8E7 + ,simpleTitleCaseMapping:0x2F8E7 + }, + { code:0x2F8E8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8E8 + ,simpleLowerCaseMapping:0x2F8E8 + ,simpleTitleCaseMapping:0x2F8E8 + }, + { code:0x2F8E9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8E9 + ,simpleLowerCaseMapping:0x2F8E9 + ,simpleTitleCaseMapping:0x2F8E9 + }, + { code:0x2F8EA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8EA + ,simpleLowerCaseMapping:0x2F8EA + ,simpleTitleCaseMapping:0x2F8EA + }, + { code:0x2F8EB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8EB + ,simpleLowerCaseMapping:0x2F8EB + ,simpleTitleCaseMapping:0x2F8EB + }, + { code:0x2F8EC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8EC + ,simpleLowerCaseMapping:0x2F8EC + ,simpleTitleCaseMapping:0x2F8EC + }, + { code:0x2F8ED + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8ED + ,simpleLowerCaseMapping:0x2F8ED + ,simpleTitleCaseMapping:0x2F8ED + }, + { code:0x2F8EE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8EE + ,simpleLowerCaseMapping:0x2F8EE + ,simpleTitleCaseMapping:0x2F8EE + }, + { code:0x2F8EF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8EF + ,simpleLowerCaseMapping:0x2F8EF + ,simpleTitleCaseMapping:0x2F8EF + }, + { code:0x2F8F0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8F0 + ,simpleLowerCaseMapping:0x2F8F0 + ,simpleTitleCaseMapping:0x2F8F0 + }, + { code:0x2F8F1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8F1 + ,simpleLowerCaseMapping:0x2F8F1 + ,simpleTitleCaseMapping:0x2F8F1 + }, + { code:0x2F8F2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8F2 + ,simpleLowerCaseMapping:0x2F8F2 + ,simpleTitleCaseMapping:0x2F8F2 + }, + { code:0x2F8F3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8F3 + ,simpleLowerCaseMapping:0x2F8F3 + ,simpleTitleCaseMapping:0x2F8F3 + }, + { code:0x2F8F4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8F4 + ,simpleLowerCaseMapping:0x2F8F4 + ,simpleTitleCaseMapping:0x2F8F4 + }, + { code:0x2F8F5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8F5 + ,simpleLowerCaseMapping:0x2F8F5 + ,simpleTitleCaseMapping:0x2F8F5 + }, + { code:0x2F8F6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8F6 + ,simpleLowerCaseMapping:0x2F8F6 + ,simpleTitleCaseMapping:0x2F8F6 + }, + { code:0x2F8F7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8F7 + ,simpleLowerCaseMapping:0x2F8F7 + ,simpleTitleCaseMapping:0x2F8F7 + }, + { code:0x2F8F8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8F8 + ,simpleLowerCaseMapping:0x2F8F8 + ,simpleTitleCaseMapping:0x2F8F8 + }, + { code:0x2F8F9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8F9 + ,simpleLowerCaseMapping:0x2F8F9 + ,simpleTitleCaseMapping:0x2F8F9 + }, + { code:0x2F8FA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8FA + ,simpleLowerCaseMapping:0x2F8FA + ,simpleTitleCaseMapping:0x2F8FA + }, + { code:0x2F8FB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8FB + ,simpleLowerCaseMapping:0x2F8FB + ,simpleTitleCaseMapping:0x2F8FB + }, + { code:0x2F8FC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8FC + ,simpleLowerCaseMapping:0x2F8FC + ,simpleTitleCaseMapping:0x2F8FC + }, + { code:0x2F8FD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8FD + ,simpleLowerCaseMapping:0x2F8FD + ,simpleTitleCaseMapping:0x2F8FD + }, + { code:0x2F8FE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8FE + ,simpleLowerCaseMapping:0x2F8FE + ,simpleTitleCaseMapping:0x2F8FE + }, + { code:0x2F8FF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F8FF + ,simpleLowerCaseMapping:0x2F8FF + ,simpleTitleCaseMapping:0x2F8FF + }, + { code:0x2F900 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F900 + ,simpleLowerCaseMapping:0x2F900 + ,simpleTitleCaseMapping:0x2F900 + }, + { code:0x2F901 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F901 + ,simpleLowerCaseMapping:0x2F901 + ,simpleTitleCaseMapping:0x2F901 + }, + { code:0x2F902 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F902 + ,simpleLowerCaseMapping:0x2F902 + ,simpleTitleCaseMapping:0x2F902 + }, + { code:0x2F903 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F903 + ,simpleLowerCaseMapping:0x2F903 + ,simpleTitleCaseMapping:0x2F903 + }, + { code:0x2F904 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F904 + ,simpleLowerCaseMapping:0x2F904 + ,simpleTitleCaseMapping:0x2F904 + }, + { code:0x2F905 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F905 + ,simpleLowerCaseMapping:0x2F905 + ,simpleTitleCaseMapping:0x2F905 + }, + { code:0x2F906 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F906 + ,simpleLowerCaseMapping:0x2F906 + ,simpleTitleCaseMapping:0x2F906 + }, + { code:0x2F907 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F907 + ,simpleLowerCaseMapping:0x2F907 + ,simpleTitleCaseMapping:0x2F907 + }, + { code:0x2F908 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F908 + ,simpleLowerCaseMapping:0x2F908 + ,simpleTitleCaseMapping:0x2F908 + }, + { code:0x2F909 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F909 + ,simpleLowerCaseMapping:0x2F909 + ,simpleTitleCaseMapping:0x2F909 + }, + { code:0x2F90A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F90A + ,simpleLowerCaseMapping:0x2F90A + ,simpleTitleCaseMapping:0x2F90A + }, + { code:0x2F90B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F90B + ,simpleLowerCaseMapping:0x2F90B + ,simpleTitleCaseMapping:0x2F90B + }, + { code:0x2F90C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F90C + ,simpleLowerCaseMapping:0x2F90C + ,simpleTitleCaseMapping:0x2F90C + }, + { code:0x2F90D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F90D + ,simpleLowerCaseMapping:0x2F90D + ,simpleTitleCaseMapping:0x2F90D + }, + { code:0x2F90E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F90E + ,simpleLowerCaseMapping:0x2F90E + ,simpleTitleCaseMapping:0x2F90E + }, + { code:0x2F90F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F90F + ,simpleLowerCaseMapping:0x2F90F + ,simpleTitleCaseMapping:0x2F90F + }, + { code:0x2F910 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F910 + ,simpleLowerCaseMapping:0x2F910 + ,simpleTitleCaseMapping:0x2F910 + }, + { code:0x2F911 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F911 + ,simpleLowerCaseMapping:0x2F911 + ,simpleTitleCaseMapping:0x2F911 + }, + { code:0x2F912 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F912 + ,simpleLowerCaseMapping:0x2F912 + ,simpleTitleCaseMapping:0x2F912 + }, + { code:0x2F913 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F913 + ,simpleLowerCaseMapping:0x2F913 + ,simpleTitleCaseMapping:0x2F913 + }, + { code:0x2F914 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F914 + ,simpleLowerCaseMapping:0x2F914 + ,simpleTitleCaseMapping:0x2F914 + }, + { code:0x2F915 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F915 + ,simpleLowerCaseMapping:0x2F915 + ,simpleTitleCaseMapping:0x2F915 + }, + { code:0x2F916 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F916 + ,simpleLowerCaseMapping:0x2F916 + ,simpleTitleCaseMapping:0x2F916 + }, + { code:0x2F917 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F917 + ,simpleLowerCaseMapping:0x2F917 + ,simpleTitleCaseMapping:0x2F917 + }, + { code:0x2F918 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F918 + ,simpleLowerCaseMapping:0x2F918 + ,simpleTitleCaseMapping:0x2F918 + }, + { code:0x2F919 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F919 + ,simpleLowerCaseMapping:0x2F919 + ,simpleTitleCaseMapping:0x2F919 + }, + { code:0x2F91A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F91A + ,simpleLowerCaseMapping:0x2F91A + ,simpleTitleCaseMapping:0x2F91A + }, + { code:0x2F91B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F91B + ,simpleLowerCaseMapping:0x2F91B + ,simpleTitleCaseMapping:0x2F91B + }, + { code:0x2F91C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F91C + ,simpleLowerCaseMapping:0x2F91C + ,simpleTitleCaseMapping:0x2F91C + }, + { code:0x2F91D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F91D + ,simpleLowerCaseMapping:0x2F91D + ,simpleTitleCaseMapping:0x2F91D + }, + { code:0x2F91E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F91E + ,simpleLowerCaseMapping:0x2F91E + ,simpleTitleCaseMapping:0x2F91E + }, + { code:0x2F91F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F91F + ,simpleLowerCaseMapping:0x2F91F + ,simpleTitleCaseMapping:0x2F91F + }, + { code:0x2F920 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F920 + ,simpleLowerCaseMapping:0x2F920 + ,simpleTitleCaseMapping:0x2F920 + }, + { code:0x2F921 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F921 + ,simpleLowerCaseMapping:0x2F921 + ,simpleTitleCaseMapping:0x2F921 + }, + { code:0x2F922 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F922 + ,simpleLowerCaseMapping:0x2F922 + ,simpleTitleCaseMapping:0x2F922 + }, + { code:0x2F923 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F923 + ,simpleLowerCaseMapping:0x2F923 + ,simpleTitleCaseMapping:0x2F923 + }, + { code:0x2F924 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F924 + ,simpleLowerCaseMapping:0x2F924 + ,simpleTitleCaseMapping:0x2F924 + }, + { code:0x2F925 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F925 + ,simpleLowerCaseMapping:0x2F925 + ,simpleTitleCaseMapping:0x2F925 + }, + { code:0x2F926 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F926 + ,simpleLowerCaseMapping:0x2F926 + ,simpleTitleCaseMapping:0x2F926 + }, + { code:0x2F927 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F927 + ,simpleLowerCaseMapping:0x2F927 + ,simpleTitleCaseMapping:0x2F927 + }, + { code:0x2F928 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F928 + ,simpleLowerCaseMapping:0x2F928 + ,simpleTitleCaseMapping:0x2F928 + }, + { code:0x2F929 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F929 + ,simpleLowerCaseMapping:0x2F929 + ,simpleTitleCaseMapping:0x2F929 + }, + { code:0x2F92A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F92A + ,simpleLowerCaseMapping:0x2F92A + ,simpleTitleCaseMapping:0x2F92A + }, + { code:0x2F92B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F92B + ,simpleLowerCaseMapping:0x2F92B + ,simpleTitleCaseMapping:0x2F92B + }, + { code:0x2F92C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F92C + ,simpleLowerCaseMapping:0x2F92C + ,simpleTitleCaseMapping:0x2F92C + }, + { code:0x2F92D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F92D + ,simpleLowerCaseMapping:0x2F92D + ,simpleTitleCaseMapping:0x2F92D + }, + { code:0x2F92E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F92E + ,simpleLowerCaseMapping:0x2F92E + ,simpleTitleCaseMapping:0x2F92E + }, + { code:0x2F92F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F92F + ,simpleLowerCaseMapping:0x2F92F + ,simpleTitleCaseMapping:0x2F92F + }, + { code:0x2F930 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F930 + ,simpleLowerCaseMapping:0x2F930 + ,simpleTitleCaseMapping:0x2F930 + }, + { code:0x2F931 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F931 + ,simpleLowerCaseMapping:0x2F931 + ,simpleTitleCaseMapping:0x2F931 + }, + { code:0x2F932 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F932 + ,simpleLowerCaseMapping:0x2F932 + ,simpleTitleCaseMapping:0x2F932 + }, + { code:0x2F933 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F933 + ,simpleLowerCaseMapping:0x2F933 + ,simpleTitleCaseMapping:0x2F933 + }, + { code:0x2F934 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F934 + ,simpleLowerCaseMapping:0x2F934 + ,simpleTitleCaseMapping:0x2F934 + }, + { code:0x2F935 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F935 + ,simpleLowerCaseMapping:0x2F935 + ,simpleTitleCaseMapping:0x2F935 + }, + { code:0x2F936 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F936 + ,simpleLowerCaseMapping:0x2F936 + ,simpleTitleCaseMapping:0x2F936 + }, + { code:0x2F937 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F937 + ,simpleLowerCaseMapping:0x2F937 + ,simpleTitleCaseMapping:0x2F937 + }, + { code:0x2F938 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F938 + ,simpleLowerCaseMapping:0x2F938 + ,simpleTitleCaseMapping:0x2F938 + }, + { code:0x2F939 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F939 + ,simpleLowerCaseMapping:0x2F939 + ,simpleTitleCaseMapping:0x2F939 + }, + { code:0x2F93A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F93A + ,simpleLowerCaseMapping:0x2F93A + ,simpleTitleCaseMapping:0x2F93A + }, + { code:0x2F93B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F93B + ,simpleLowerCaseMapping:0x2F93B + ,simpleTitleCaseMapping:0x2F93B + }, + { code:0x2F93C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F93C + ,simpleLowerCaseMapping:0x2F93C + ,simpleTitleCaseMapping:0x2F93C + }, + { code:0x2F93D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F93D + ,simpleLowerCaseMapping:0x2F93D + ,simpleTitleCaseMapping:0x2F93D + }, + { code:0x2F93E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F93E + ,simpleLowerCaseMapping:0x2F93E + ,simpleTitleCaseMapping:0x2F93E + }, + { code:0x2F93F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F93F + ,simpleLowerCaseMapping:0x2F93F + ,simpleTitleCaseMapping:0x2F93F + }, + { code:0x2F940 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F940 + ,simpleLowerCaseMapping:0x2F940 + ,simpleTitleCaseMapping:0x2F940 + }, + { code:0x2F941 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F941 + ,simpleLowerCaseMapping:0x2F941 + ,simpleTitleCaseMapping:0x2F941 + }, + { code:0x2F942 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F942 + ,simpleLowerCaseMapping:0x2F942 + ,simpleTitleCaseMapping:0x2F942 + }, + { code:0x2F943 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F943 + ,simpleLowerCaseMapping:0x2F943 + ,simpleTitleCaseMapping:0x2F943 + }, + { code:0x2F944 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F944 + ,simpleLowerCaseMapping:0x2F944 + ,simpleTitleCaseMapping:0x2F944 + }, + { code:0x2F945 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F945 + ,simpleLowerCaseMapping:0x2F945 + ,simpleTitleCaseMapping:0x2F945 + }, + { code:0x2F946 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F946 + ,simpleLowerCaseMapping:0x2F946 + ,simpleTitleCaseMapping:0x2F946 + }, + { code:0x2F947 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F947 + ,simpleLowerCaseMapping:0x2F947 + ,simpleTitleCaseMapping:0x2F947 + }, + { code:0x2F948 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F948 + ,simpleLowerCaseMapping:0x2F948 + ,simpleTitleCaseMapping:0x2F948 + }, + { code:0x2F949 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F949 + ,simpleLowerCaseMapping:0x2F949 + ,simpleTitleCaseMapping:0x2F949 + }, + { code:0x2F94A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F94A + ,simpleLowerCaseMapping:0x2F94A + ,simpleTitleCaseMapping:0x2F94A + }, + { code:0x2F94B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F94B + ,simpleLowerCaseMapping:0x2F94B + ,simpleTitleCaseMapping:0x2F94B + }, + { code:0x2F94C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F94C + ,simpleLowerCaseMapping:0x2F94C + ,simpleTitleCaseMapping:0x2F94C + }, + { code:0x2F94D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F94D + ,simpleLowerCaseMapping:0x2F94D + ,simpleTitleCaseMapping:0x2F94D + }, + { code:0x2F94E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F94E + ,simpleLowerCaseMapping:0x2F94E + ,simpleTitleCaseMapping:0x2F94E + }, + { code:0x2F94F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F94F + ,simpleLowerCaseMapping:0x2F94F + ,simpleTitleCaseMapping:0x2F94F + }, + { code:0x2F950 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F950 + ,simpleLowerCaseMapping:0x2F950 + ,simpleTitleCaseMapping:0x2F950 + }, + { code:0x2F951 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F951 + ,simpleLowerCaseMapping:0x2F951 + ,simpleTitleCaseMapping:0x2F951 + }, + { code:0x2F952 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F952 + ,simpleLowerCaseMapping:0x2F952 + ,simpleTitleCaseMapping:0x2F952 + }, + { code:0x2F953 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F953 + ,simpleLowerCaseMapping:0x2F953 + ,simpleTitleCaseMapping:0x2F953 + }, + { code:0x2F954 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F954 + ,simpleLowerCaseMapping:0x2F954 + ,simpleTitleCaseMapping:0x2F954 + }, + { code:0x2F955 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F955 + ,simpleLowerCaseMapping:0x2F955 + ,simpleTitleCaseMapping:0x2F955 + }, + { code:0x2F956 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F956 + ,simpleLowerCaseMapping:0x2F956 + ,simpleTitleCaseMapping:0x2F956 + }, + { code:0x2F957 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F957 + ,simpleLowerCaseMapping:0x2F957 + ,simpleTitleCaseMapping:0x2F957 + }, + { code:0x2F958 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F958 + ,simpleLowerCaseMapping:0x2F958 + ,simpleTitleCaseMapping:0x2F958 + }, + { code:0x2F959 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F959 + ,simpleLowerCaseMapping:0x2F959 + ,simpleTitleCaseMapping:0x2F959 + }, + { code:0x2F95A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F95A + ,simpleLowerCaseMapping:0x2F95A + ,simpleTitleCaseMapping:0x2F95A + }, + { code:0x2F95B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F95B + ,simpleLowerCaseMapping:0x2F95B + ,simpleTitleCaseMapping:0x2F95B + }, + { code:0x2F95C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F95C + ,simpleLowerCaseMapping:0x2F95C + ,simpleTitleCaseMapping:0x2F95C + }, + { code:0x2F95D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F95D + ,simpleLowerCaseMapping:0x2F95D + ,simpleTitleCaseMapping:0x2F95D + }, + { code:0x2F95E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F95E + ,simpleLowerCaseMapping:0x2F95E + ,simpleTitleCaseMapping:0x2F95E + }, + { code:0x2F95F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F95F + ,simpleLowerCaseMapping:0x2F95F + ,simpleTitleCaseMapping:0x2F95F + }, + { code:0x2F960 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F960 + ,simpleLowerCaseMapping:0x2F960 + ,simpleTitleCaseMapping:0x2F960 + }, + { code:0x2F961 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F961 + ,simpleLowerCaseMapping:0x2F961 + ,simpleTitleCaseMapping:0x2F961 + }, + { code:0x2F962 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F962 + ,simpleLowerCaseMapping:0x2F962 + ,simpleTitleCaseMapping:0x2F962 + }, + { code:0x2F963 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F963 + ,simpleLowerCaseMapping:0x2F963 + ,simpleTitleCaseMapping:0x2F963 + }, + { code:0x2F964 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F964 + ,simpleLowerCaseMapping:0x2F964 + ,simpleTitleCaseMapping:0x2F964 + }, + { code:0x2F965 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F965 + ,simpleLowerCaseMapping:0x2F965 + ,simpleTitleCaseMapping:0x2F965 + }, + { code:0x2F966 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F966 + ,simpleLowerCaseMapping:0x2F966 + ,simpleTitleCaseMapping:0x2F966 + }, + { code:0x2F967 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F967 + ,simpleLowerCaseMapping:0x2F967 + ,simpleTitleCaseMapping:0x2F967 + }, + { code:0x2F968 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F968 + ,simpleLowerCaseMapping:0x2F968 + ,simpleTitleCaseMapping:0x2F968 + }, + { code:0x2F969 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F969 + ,simpleLowerCaseMapping:0x2F969 + ,simpleTitleCaseMapping:0x2F969 + }, + { code:0x2F96A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F96A + ,simpleLowerCaseMapping:0x2F96A + ,simpleTitleCaseMapping:0x2F96A + }, + { code:0x2F96B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F96B + ,simpleLowerCaseMapping:0x2F96B + ,simpleTitleCaseMapping:0x2F96B + }, + { code:0x2F96C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F96C + ,simpleLowerCaseMapping:0x2F96C + ,simpleTitleCaseMapping:0x2F96C + }, + { code:0x2F96D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F96D + ,simpleLowerCaseMapping:0x2F96D + ,simpleTitleCaseMapping:0x2F96D + }, + { code:0x2F96E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F96E + ,simpleLowerCaseMapping:0x2F96E + ,simpleTitleCaseMapping:0x2F96E + }, + { code:0x2F96F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F96F + ,simpleLowerCaseMapping:0x2F96F + ,simpleTitleCaseMapping:0x2F96F + }, + { code:0x2F970 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F970 + ,simpleLowerCaseMapping:0x2F970 + ,simpleTitleCaseMapping:0x2F970 + }, + { code:0x2F971 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F971 + ,simpleLowerCaseMapping:0x2F971 + ,simpleTitleCaseMapping:0x2F971 + }, + { code:0x2F972 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F972 + ,simpleLowerCaseMapping:0x2F972 + ,simpleTitleCaseMapping:0x2F972 + }, + { code:0x2F973 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F973 + ,simpleLowerCaseMapping:0x2F973 + ,simpleTitleCaseMapping:0x2F973 + }, + { code:0x2F974 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F974 + ,simpleLowerCaseMapping:0x2F974 + ,simpleTitleCaseMapping:0x2F974 + }, + { code:0x2F975 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F975 + ,simpleLowerCaseMapping:0x2F975 + ,simpleTitleCaseMapping:0x2F975 + }, + { code:0x2F976 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F976 + ,simpleLowerCaseMapping:0x2F976 + ,simpleTitleCaseMapping:0x2F976 + }, + { code:0x2F977 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F977 + ,simpleLowerCaseMapping:0x2F977 + ,simpleTitleCaseMapping:0x2F977 + }, + { code:0x2F978 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F978 + ,simpleLowerCaseMapping:0x2F978 + ,simpleTitleCaseMapping:0x2F978 + }, + { code:0x2F979 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F979 + ,simpleLowerCaseMapping:0x2F979 + ,simpleTitleCaseMapping:0x2F979 + }, + { code:0x2F97A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F97A + ,simpleLowerCaseMapping:0x2F97A + ,simpleTitleCaseMapping:0x2F97A + }, + { code:0x2F97B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F97B + ,simpleLowerCaseMapping:0x2F97B + ,simpleTitleCaseMapping:0x2F97B + }, + { code:0x2F97C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F97C + ,simpleLowerCaseMapping:0x2F97C + ,simpleTitleCaseMapping:0x2F97C + }, + { code:0x2F97D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F97D + ,simpleLowerCaseMapping:0x2F97D + ,simpleTitleCaseMapping:0x2F97D + }, + { code:0x2F97E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F97E + ,simpleLowerCaseMapping:0x2F97E + ,simpleTitleCaseMapping:0x2F97E + }, + { code:0x2F97F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F97F + ,simpleLowerCaseMapping:0x2F97F + ,simpleTitleCaseMapping:0x2F97F + }, + { code:0x2F980 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F980 + ,simpleLowerCaseMapping:0x2F980 + ,simpleTitleCaseMapping:0x2F980 + }, + { code:0x2F981 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F981 + ,simpleLowerCaseMapping:0x2F981 + ,simpleTitleCaseMapping:0x2F981 + }, + { code:0x2F982 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F982 + ,simpleLowerCaseMapping:0x2F982 + ,simpleTitleCaseMapping:0x2F982 + }, + { code:0x2F983 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F983 + ,simpleLowerCaseMapping:0x2F983 + ,simpleTitleCaseMapping:0x2F983 + }, + { code:0x2F984 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F984 + ,simpleLowerCaseMapping:0x2F984 + ,simpleTitleCaseMapping:0x2F984 + }, + { code:0x2F985 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F985 + ,simpleLowerCaseMapping:0x2F985 + ,simpleTitleCaseMapping:0x2F985 + }, + { code:0x2F986 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F986 + ,simpleLowerCaseMapping:0x2F986 + ,simpleTitleCaseMapping:0x2F986 + }, + { code:0x2F987 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F987 + ,simpleLowerCaseMapping:0x2F987 + ,simpleTitleCaseMapping:0x2F987 + }, + { code:0x2F988 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F988 + ,simpleLowerCaseMapping:0x2F988 + ,simpleTitleCaseMapping:0x2F988 + }, + { code:0x2F989 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F989 + ,simpleLowerCaseMapping:0x2F989 + ,simpleTitleCaseMapping:0x2F989 + }, + { code:0x2F98A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F98A + ,simpleLowerCaseMapping:0x2F98A + ,simpleTitleCaseMapping:0x2F98A + }, + { code:0x2F98B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F98B + ,simpleLowerCaseMapping:0x2F98B + ,simpleTitleCaseMapping:0x2F98B + }, + { code:0x2F98C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F98C + ,simpleLowerCaseMapping:0x2F98C + ,simpleTitleCaseMapping:0x2F98C + }, + { code:0x2F98D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F98D + ,simpleLowerCaseMapping:0x2F98D + ,simpleTitleCaseMapping:0x2F98D + }, + { code:0x2F98E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F98E + ,simpleLowerCaseMapping:0x2F98E + ,simpleTitleCaseMapping:0x2F98E + }, + { code:0x2F98F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F98F + ,simpleLowerCaseMapping:0x2F98F + ,simpleTitleCaseMapping:0x2F98F + }, + { code:0x2F990 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F990 + ,simpleLowerCaseMapping:0x2F990 + ,simpleTitleCaseMapping:0x2F990 + }, + { code:0x2F991 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F991 + ,simpleLowerCaseMapping:0x2F991 + ,simpleTitleCaseMapping:0x2F991 + }, + { code:0x2F992 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F992 + ,simpleLowerCaseMapping:0x2F992 + ,simpleTitleCaseMapping:0x2F992 + }, + { code:0x2F993 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F993 + ,simpleLowerCaseMapping:0x2F993 + ,simpleTitleCaseMapping:0x2F993 + }, + { code:0x2F994 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F994 + ,simpleLowerCaseMapping:0x2F994 + ,simpleTitleCaseMapping:0x2F994 + }, + { code:0x2F995 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F995 + ,simpleLowerCaseMapping:0x2F995 + ,simpleTitleCaseMapping:0x2F995 + }, + { code:0x2F996 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F996 + ,simpleLowerCaseMapping:0x2F996 + ,simpleTitleCaseMapping:0x2F996 + }, + { code:0x2F997 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F997 + ,simpleLowerCaseMapping:0x2F997 + ,simpleTitleCaseMapping:0x2F997 + }, + { code:0x2F998 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F998 + ,simpleLowerCaseMapping:0x2F998 + ,simpleTitleCaseMapping:0x2F998 + }, + { code:0x2F999 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F999 + ,simpleLowerCaseMapping:0x2F999 + ,simpleTitleCaseMapping:0x2F999 + }, + { code:0x2F99A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F99A + ,simpleLowerCaseMapping:0x2F99A + ,simpleTitleCaseMapping:0x2F99A + }, + { code:0x2F99B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F99B + ,simpleLowerCaseMapping:0x2F99B + ,simpleTitleCaseMapping:0x2F99B + }, + { code:0x2F99C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F99C + ,simpleLowerCaseMapping:0x2F99C + ,simpleTitleCaseMapping:0x2F99C + }, + { code:0x2F99D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F99D + ,simpleLowerCaseMapping:0x2F99D + ,simpleTitleCaseMapping:0x2F99D + }, + { code:0x2F99E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F99E + ,simpleLowerCaseMapping:0x2F99E + ,simpleTitleCaseMapping:0x2F99E + }, + { code:0x2F99F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F99F + ,simpleLowerCaseMapping:0x2F99F + ,simpleTitleCaseMapping:0x2F99F + }, + { code:0x2F9A0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9A0 + ,simpleLowerCaseMapping:0x2F9A0 + ,simpleTitleCaseMapping:0x2F9A0 + }, + { code:0x2F9A1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9A1 + ,simpleLowerCaseMapping:0x2F9A1 + ,simpleTitleCaseMapping:0x2F9A1 + }, + { code:0x2F9A2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9A2 + ,simpleLowerCaseMapping:0x2F9A2 + ,simpleTitleCaseMapping:0x2F9A2 + }, + { code:0x2F9A3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9A3 + ,simpleLowerCaseMapping:0x2F9A3 + ,simpleTitleCaseMapping:0x2F9A3 + }, + { code:0x2F9A4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9A4 + ,simpleLowerCaseMapping:0x2F9A4 + ,simpleTitleCaseMapping:0x2F9A4 + }, + { code:0x2F9A5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9A5 + ,simpleLowerCaseMapping:0x2F9A5 + ,simpleTitleCaseMapping:0x2F9A5 + }, + { code:0x2F9A6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9A6 + ,simpleLowerCaseMapping:0x2F9A6 + ,simpleTitleCaseMapping:0x2F9A6 + }, + { code:0x2F9A7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9A7 + ,simpleLowerCaseMapping:0x2F9A7 + ,simpleTitleCaseMapping:0x2F9A7 + }, + { code:0x2F9A8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9A8 + ,simpleLowerCaseMapping:0x2F9A8 + ,simpleTitleCaseMapping:0x2F9A8 + }, + { code:0x2F9A9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9A9 + ,simpleLowerCaseMapping:0x2F9A9 + ,simpleTitleCaseMapping:0x2F9A9 + }, + { code:0x2F9AA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9AA + ,simpleLowerCaseMapping:0x2F9AA + ,simpleTitleCaseMapping:0x2F9AA + }, + { code:0x2F9AB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9AB + ,simpleLowerCaseMapping:0x2F9AB + ,simpleTitleCaseMapping:0x2F9AB + }, + { code:0x2F9AC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9AC + ,simpleLowerCaseMapping:0x2F9AC + ,simpleTitleCaseMapping:0x2F9AC + }, + { code:0x2F9AD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9AD + ,simpleLowerCaseMapping:0x2F9AD + ,simpleTitleCaseMapping:0x2F9AD + }, + { code:0x2F9AE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9AE + ,simpleLowerCaseMapping:0x2F9AE + ,simpleTitleCaseMapping:0x2F9AE + }, + { code:0x2F9AF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9AF + ,simpleLowerCaseMapping:0x2F9AF + ,simpleTitleCaseMapping:0x2F9AF + }, + { code:0x2F9B0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9B0 + ,simpleLowerCaseMapping:0x2F9B0 + ,simpleTitleCaseMapping:0x2F9B0 + }, + { code:0x2F9B1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9B1 + ,simpleLowerCaseMapping:0x2F9B1 + ,simpleTitleCaseMapping:0x2F9B1 + }, + { code:0x2F9B2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9B2 + ,simpleLowerCaseMapping:0x2F9B2 + ,simpleTitleCaseMapping:0x2F9B2 + }, + { code:0x2F9B3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9B3 + ,simpleLowerCaseMapping:0x2F9B3 + ,simpleTitleCaseMapping:0x2F9B3 + }, + { code:0x2F9B4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9B4 + ,simpleLowerCaseMapping:0x2F9B4 + ,simpleTitleCaseMapping:0x2F9B4 + }, + { code:0x2F9B5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9B5 + ,simpleLowerCaseMapping:0x2F9B5 + ,simpleTitleCaseMapping:0x2F9B5 + }, + { code:0x2F9B6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9B6 + ,simpleLowerCaseMapping:0x2F9B6 + ,simpleTitleCaseMapping:0x2F9B6 + }, + { code:0x2F9B7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9B7 + ,simpleLowerCaseMapping:0x2F9B7 + ,simpleTitleCaseMapping:0x2F9B7 + }, + { code:0x2F9B8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9B8 + ,simpleLowerCaseMapping:0x2F9B8 + ,simpleTitleCaseMapping:0x2F9B8 + }, + { code:0x2F9B9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9B9 + ,simpleLowerCaseMapping:0x2F9B9 + ,simpleTitleCaseMapping:0x2F9B9 + }, + { code:0x2F9BA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9BA + ,simpleLowerCaseMapping:0x2F9BA + ,simpleTitleCaseMapping:0x2F9BA + }, + { code:0x2F9BB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9BB + ,simpleLowerCaseMapping:0x2F9BB + ,simpleTitleCaseMapping:0x2F9BB + }, + { code:0x2F9BC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9BC + ,simpleLowerCaseMapping:0x2F9BC + ,simpleTitleCaseMapping:0x2F9BC + }, + { code:0x2F9BD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9BD + ,simpleLowerCaseMapping:0x2F9BD + ,simpleTitleCaseMapping:0x2F9BD + }, + { code:0x2F9BE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9BE + ,simpleLowerCaseMapping:0x2F9BE + ,simpleTitleCaseMapping:0x2F9BE + }, + { code:0x2F9BF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9BF + ,simpleLowerCaseMapping:0x2F9BF + ,simpleTitleCaseMapping:0x2F9BF + }, + { code:0x2F9C0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9C0 + ,simpleLowerCaseMapping:0x2F9C0 + ,simpleTitleCaseMapping:0x2F9C0 + }, + { code:0x2F9C1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9C1 + ,simpleLowerCaseMapping:0x2F9C1 + ,simpleTitleCaseMapping:0x2F9C1 + }, + { code:0x2F9C2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9C2 + ,simpleLowerCaseMapping:0x2F9C2 + ,simpleTitleCaseMapping:0x2F9C2 + }, + { code:0x2F9C3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9C3 + ,simpleLowerCaseMapping:0x2F9C3 + ,simpleTitleCaseMapping:0x2F9C3 + }, + { code:0x2F9C4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9C4 + ,simpleLowerCaseMapping:0x2F9C4 + ,simpleTitleCaseMapping:0x2F9C4 + }, + { code:0x2F9C5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9C5 + ,simpleLowerCaseMapping:0x2F9C5 + ,simpleTitleCaseMapping:0x2F9C5 + }, + { code:0x2F9C6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9C6 + ,simpleLowerCaseMapping:0x2F9C6 + ,simpleTitleCaseMapping:0x2F9C6 + }, + { code:0x2F9C7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9C7 + ,simpleLowerCaseMapping:0x2F9C7 + ,simpleTitleCaseMapping:0x2F9C7 + }, + { code:0x2F9C8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9C8 + ,simpleLowerCaseMapping:0x2F9C8 + ,simpleTitleCaseMapping:0x2F9C8 + }, + { code:0x2F9C9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9C9 + ,simpleLowerCaseMapping:0x2F9C9 + ,simpleTitleCaseMapping:0x2F9C9 + }, + { code:0x2F9CA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9CA + ,simpleLowerCaseMapping:0x2F9CA + ,simpleTitleCaseMapping:0x2F9CA + }, + { code:0x2F9CB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9CB + ,simpleLowerCaseMapping:0x2F9CB + ,simpleTitleCaseMapping:0x2F9CB + }, + { code:0x2F9CC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9CC + ,simpleLowerCaseMapping:0x2F9CC + ,simpleTitleCaseMapping:0x2F9CC + }, + { code:0x2F9CD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9CD + ,simpleLowerCaseMapping:0x2F9CD + ,simpleTitleCaseMapping:0x2F9CD + }, + { code:0x2F9CE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9CE + ,simpleLowerCaseMapping:0x2F9CE + ,simpleTitleCaseMapping:0x2F9CE + }, + { code:0x2F9CF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9CF + ,simpleLowerCaseMapping:0x2F9CF + ,simpleTitleCaseMapping:0x2F9CF + }, + { code:0x2F9D0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9D0 + ,simpleLowerCaseMapping:0x2F9D0 + ,simpleTitleCaseMapping:0x2F9D0 + }, + { code:0x2F9D1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9D1 + ,simpleLowerCaseMapping:0x2F9D1 + ,simpleTitleCaseMapping:0x2F9D1 + }, + { code:0x2F9D2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9D2 + ,simpleLowerCaseMapping:0x2F9D2 + ,simpleTitleCaseMapping:0x2F9D2 + }, + { code:0x2F9D3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9D3 + ,simpleLowerCaseMapping:0x2F9D3 + ,simpleTitleCaseMapping:0x2F9D3 + }, + { code:0x2F9D4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9D4 + ,simpleLowerCaseMapping:0x2F9D4 + ,simpleTitleCaseMapping:0x2F9D4 + }, + { code:0x2F9D5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9D5 + ,simpleLowerCaseMapping:0x2F9D5 + ,simpleTitleCaseMapping:0x2F9D5 + }, + { code:0x2F9D6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9D6 + ,simpleLowerCaseMapping:0x2F9D6 + ,simpleTitleCaseMapping:0x2F9D6 + }, + { code:0x2F9D7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9D7 + ,simpleLowerCaseMapping:0x2F9D7 + ,simpleTitleCaseMapping:0x2F9D7 + }, + { code:0x2F9D8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9D8 + ,simpleLowerCaseMapping:0x2F9D8 + ,simpleTitleCaseMapping:0x2F9D8 + }, + { code:0x2F9D9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9D9 + ,simpleLowerCaseMapping:0x2F9D9 + ,simpleTitleCaseMapping:0x2F9D9 + }, + { code:0x2F9DA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9DA + ,simpleLowerCaseMapping:0x2F9DA + ,simpleTitleCaseMapping:0x2F9DA + }, + { code:0x2F9DB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9DB + ,simpleLowerCaseMapping:0x2F9DB + ,simpleTitleCaseMapping:0x2F9DB + }, + { code:0x2F9DC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9DC + ,simpleLowerCaseMapping:0x2F9DC + ,simpleTitleCaseMapping:0x2F9DC + }, + { code:0x2F9DD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9DD + ,simpleLowerCaseMapping:0x2F9DD + ,simpleTitleCaseMapping:0x2F9DD + }, + { code:0x2F9DE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9DE + ,simpleLowerCaseMapping:0x2F9DE + ,simpleTitleCaseMapping:0x2F9DE + }, + { code:0x2F9DF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9DF + ,simpleLowerCaseMapping:0x2F9DF + ,simpleTitleCaseMapping:0x2F9DF + }, + { code:0x2F9E0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9E0 + ,simpleLowerCaseMapping:0x2F9E0 + ,simpleTitleCaseMapping:0x2F9E0 + }, + { code:0x2F9E1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9E1 + ,simpleLowerCaseMapping:0x2F9E1 + ,simpleTitleCaseMapping:0x2F9E1 + }, + { code:0x2F9E2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9E2 + ,simpleLowerCaseMapping:0x2F9E2 + ,simpleTitleCaseMapping:0x2F9E2 + }, + { code:0x2F9E3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9E3 + ,simpleLowerCaseMapping:0x2F9E3 + ,simpleTitleCaseMapping:0x2F9E3 + }, + { code:0x2F9E4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9E4 + ,simpleLowerCaseMapping:0x2F9E4 + ,simpleTitleCaseMapping:0x2F9E4 + }, + { code:0x2F9E5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9E5 + ,simpleLowerCaseMapping:0x2F9E5 + ,simpleTitleCaseMapping:0x2F9E5 + }, + { code:0x2F9E6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9E6 + ,simpleLowerCaseMapping:0x2F9E6 + ,simpleTitleCaseMapping:0x2F9E6 + }, + { code:0x2F9E7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9E7 + ,simpleLowerCaseMapping:0x2F9E7 + ,simpleTitleCaseMapping:0x2F9E7 + }, + { code:0x2F9E8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9E8 + ,simpleLowerCaseMapping:0x2F9E8 + ,simpleTitleCaseMapping:0x2F9E8 + }, + { code:0x2F9E9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9E9 + ,simpleLowerCaseMapping:0x2F9E9 + ,simpleTitleCaseMapping:0x2F9E9 + }, + { code:0x2F9EA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9EA + ,simpleLowerCaseMapping:0x2F9EA + ,simpleTitleCaseMapping:0x2F9EA + }, + { code:0x2F9EB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9EB + ,simpleLowerCaseMapping:0x2F9EB + ,simpleTitleCaseMapping:0x2F9EB + }, + { code:0x2F9EC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9EC + ,simpleLowerCaseMapping:0x2F9EC + ,simpleTitleCaseMapping:0x2F9EC + }, + { code:0x2F9ED + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9ED + ,simpleLowerCaseMapping:0x2F9ED + ,simpleTitleCaseMapping:0x2F9ED + }, + { code:0x2F9EE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9EE + ,simpleLowerCaseMapping:0x2F9EE + ,simpleTitleCaseMapping:0x2F9EE + }, + { code:0x2F9EF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9EF + ,simpleLowerCaseMapping:0x2F9EF + ,simpleTitleCaseMapping:0x2F9EF + }, + { code:0x2F9F0 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9F0 + ,simpleLowerCaseMapping:0x2F9F0 + ,simpleTitleCaseMapping:0x2F9F0 + }, + { code:0x2F9F1 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9F1 + ,simpleLowerCaseMapping:0x2F9F1 + ,simpleTitleCaseMapping:0x2F9F1 + }, + { code:0x2F9F2 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9F2 + ,simpleLowerCaseMapping:0x2F9F2 + ,simpleTitleCaseMapping:0x2F9F2 + }, + { code:0x2F9F3 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9F3 + ,simpleLowerCaseMapping:0x2F9F3 + ,simpleTitleCaseMapping:0x2F9F3 + }, + { code:0x2F9F4 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9F4 + ,simpleLowerCaseMapping:0x2F9F4 + ,simpleTitleCaseMapping:0x2F9F4 + }, + { code:0x2F9F5 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9F5 + ,simpleLowerCaseMapping:0x2F9F5 + ,simpleTitleCaseMapping:0x2F9F5 + }, + { code:0x2F9F6 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9F6 + ,simpleLowerCaseMapping:0x2F9F6 + ,simpleTitleCaseMapping:0x2F9F6 + }, + { code:0x2F9F7 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9F7 + ,simpleLowerCaseMapping:0x2F9F7 + ,simpleTitleCaseMapping:0x2F9F7 + }, + { code:0x2F9F8 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9F8 + ,simpleLowerCaseMapping:0x2F9F8 + ,simpleTitleCaseMapping:0x2F9F8 + }, + { code:0x2F9F9 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9F9 + ,simpleLowerCaseMapping:0x2F9F9 + ,simpleTitleCaseMapping:0x2F9F9 + }, + { code:0x2F9FA + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9FA + ,simpleLowerCaseMapping:0x2F9FA + ,simpleTitleCaseMapping:0x2F9FA + }, + { code:0x2F9FB + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9FB + ,simpleLowerCaseMapping:0x2F9FB + ,simpleTitleCaseMapping:0x2F9FB + }, + { code:0x2F9FC + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9FC + ,simpleLowerCaseMapping:0x2F9FC + ,simpleTitleCaseMapping:0x2F9FC + }, + { code:0x2F9FD + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9FD + ,simpleLowerCaseMapping:0x2F9FD + ,simpleTitleCaseMapping:0x2F9FD + }, + { code:0x2F9FE + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9FE + ,simpleLowerCaseMapping:0x2F9FE + ,simpleTitleCaseMapping:0x2F9FE + }, + { code:0x2F9FF + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2F9FF + ,simpleLowerCaseMapping:0x2F9FF + ,simpleTitleCaseMapping:0x2F9FF + }, + { code:0x2FA00 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2FA00 + ,simpleLowerCaseMapping:0x2FA00 + ,simpleTitleCaseMapping:0x2FA00 + }, + { code:0x2FA01 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2FA01 + ,simpleLowerCaseMapping:0x2FA01 + ,simpleTitleCaseMapping:0x2FA01 + }, + { code:0x2FA02 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2FA02 + ,simpleLowerCaseMapping:0x2FA02 + ,simpleTitleCaseMapping:0x2FA02 + }, + { code:0x2FA03 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2FA03 + ,simpleLowerCaseMapping:0x2FA03 + ,simpleTitleCaseMapping:0x2FA03 + }, + { code:0x2FA04 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2FA04 + ,simpleLowerCaseMapping:0x2FA04 + ,simpleTitleCaseMapping:0x2FA04 + }, + { code:0x2FA05 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2FA05 + ,simpleLowerCaseMapping:0x2FA05 + ,simpleTitleCaseMapping:0x2FA05 + }, + { code:0x2FA06 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2FA06 + ,simpleLowerCaseMapping:0x2FA06 + ,simpleTitleCaseMapping:0x2FA06 + }, + { code:0x2FA07 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2FA07 + ,simpleLowerCaseMapping:0x2FA07 + ,simpleTitleCaseMapping:0x2FA07 + }, + { code:0x2FA08 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2FA08 + ,simpleLowerCaseMapping:0x2FA08 + ,simpleTitleCaseMapping:0x2FA08 + }, + { code:0x2FA09 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2FA09 + ,simpleLowerCaseMapping:0x2FA09 + ,simpleTitleCaseMapping:0x2FA09 + }, + { code:0x2FA0A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2FA0A + ,simpleLowerCaseMapping:0x2FA0A + ,simpleTitleCaseMapping:0x2FA0A + }, + { code:0x2FA0B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2FA0B + ,simpleLowerCaseMapping:0x2FA0B + ,simpleTitleCaseMapping:0x2FA0B + }, + { code:0x2FA0C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2FA0C + ,simpleLowerCaseMapping:0x2FA0C + ,simpleTitleCaseMapping:0x2FA0C + }, + { code:0x2FA0D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2FA0D + ,simpleLowerCaseMapping:0x2FA0D + ,simpleTitleCaseMapping:0x2FA0D + }, + { code:0x2FA0E + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2FA0E + ,simpleLowerCaseMapping:0x2FA0E + ,simpleTitleCaseMapping:0x2FA0E + }, + { code:0x2FA0F + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2FA0F + ,simpleLowerCaseMapping:0x2FA0F + ,simpleTitleCaseMapping:0x2FA0F + }, + { code:0x2FA10 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2FA10 + ,simpleLowerCaseMapping:0x2FA10 + ,simpleTitleCaseMapping:0x2FA10 + }, + { code:0x2FA11 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2FA11 + ,simpleLowerCaseMapping:0x2FA11 + ,simpleTitleCaseMapping:0x2FA11 + }, + { code:0x2FA12 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2FA12 + ,simpleLowerCaseMapping:0x2FA12 + ,simpleTitleCaseMapping:0x2FA12 + }, + { code:0x2FA13 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2FA13 + ,simpleLowerCaseMapping:0x2FA13 + ,simpleTitleCaseMapping:0x2FA13 + }, + { code:0x2FA14 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2FA14 + ,simpleLowerCaseMapping:0x2FA14 + ,simpleTitleCaseMapping:0x2FA14 + }, + { code:0x2FA15 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2FA15 + ,simpleLowerCaseMapping:0x2FA15 + ,simpleTitleCaseMapping:0x2FA15 + }, + { code:0x2FA16 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2FA16 + ,simpleLowerCaseMapping:0x2FA16 + ,simpleTitleCaseMapping:0x2FA16 + }, + { code:0x2FA17 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2FA17 + ,simpleLowerCaseMapping:0x2FA17 + ,simpleTitleCaseMapping:0x2FA17 + }, + { code:0x2FA18 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2FA18 + ,simpleLowerCaseMapping:0x2FA18 + ,simpleTitleCaseMapping:0x2FA18 + }, + { code:0x2FA19 + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2FA19 + ,simpleLowerCaseMapping:0x2FA19 + ,simpleTitleCaseMapping:0x2FA19 + }, + { code:0x2FA1A + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2FA1A + ,simpleLowerCaseMapping:0x2FA1A + ,simpleTitleCaseMapping:0x2FA1A + }, + { code:0x2FA1B + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2FA1B + ,simpleLowerCaseMapping:0x2FA1B + ,simpleTitleCaseMapping:0x2FA1B + }, + { code:0x2FA1C + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2FA1C + ,simpleLowerCaseMapping:0x2FA1C + ,simpleTitleCaseMapping:0x2FA1C + }, + { code:0x2FA1D + ,generalCategory:UnicodeData.GeneralCategory.Lo + ,simpleUpperCaseMapping:0x2FA1D + ,simpleLowerCaseMapping:0x2FA1D + ,simpleTitleCaseMapping:0x2FA1D + }, + { code:0xE0001 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0001 + ,simpleLowerCaseMapping:0xE0001 + ,simpleTitleCaseMapping:0xE0001 + }, + { code:0xE0020 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0020 + ,simpleLowerCaseMapping:0xE0020 + ,simpleTitleCaseMapping:0xE0020 + }, + { code:0xE0021 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0021 + ,simpleLowerCaseMapping:0xE0021 + ,simpleTitleCaseMapping:0xE0021 + }, + { code:0xE0022 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0022 + ,simpleLowerCaseMapping:0xE0022 + ,simpleTitleCaseMapping:0xE0022 + }, + { code:0xE0023 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0023 + ,simpleLowerCaseMapping:0xE0023 + ,simpleTitleCaseMapping:0xE0023 + }, + { code:0xE0024 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0024 + ,simpleLowerCaseMapping:0xE0024 + ,simpleTitleCaseMapping:0xE0024 + }, + { code:0xE0025 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0025 + ,simpleLowerCaseMapping:0xE0025 + ,simpleTitleCaseMapping:0xE0025 + }, + { code:0xE0026 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0026 + ,simpleLowerCaseMapping:0xE0026 + ,simpleTitleCaseMapping:0xE0026 + }, + { code:0xE0027 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0027 + ,simpleLowerCaseMapping:0xE0027 + ,simpleTitleCaseMapping:0xE0027 + }, + { code:0xE0028 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0028 + ,simpleLowerCaseMapping:0xE0028 + ,simpleTitleCaseMapping:0xE0028 + }, + { code:0xE0029 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0029 + ,simpleLowerCaseMapping:0xE0029 + ,simpleTitleCaseMapping:0xE0029 + }, + { code:0xE002A + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE002A + ,simpleLowerCaseMapping:0xE002A + ,simpleTitleCaseMapping:0xE002A + }, + { code:0xE002B + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE002B + ,simpleLowerCaseMapping:0xE002B + ,simpleTitleCaseMapping:0xE002B + }, + { code:0xE002C + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE002C + ,simpleLowerCaseMapping:0xE002C + ,simpleTitleCaseMapping:0xE002C + }, + { code:0xE002D + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE002D + ,simpleLowerCaseMapping:0xE002D + ,simpleTitleCaseMapping:0xE002D + }, + { code:0xE002E + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE002E + ,simpleLowerCaseMapping:0xE002E + ,simpleTitleCaseMapping:0xE002E + }, + { code:0xE002F + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE002F + ,simpleLowerCaseMapping:0xE002F + ,simpleTitleCaseMapping:0xE002F + }, + { code:0xE0030 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0030 + ,simpleLowerCaseMapping:0xE0030 + ,simpleTitleCaseMapping:0xE0030 + }, + { code:0xE0031 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0031 + ,simpleLowerCaseMapping:0xE0031 + ,simpleTitleCaseMapping:0xE0031 + }, + { code:0xE0032 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0032 + ,simpleLowerCaseMapping:0xE0032 + ,simpleTitleCaseMapping:0xE0032 + }, + { code:0xE0033 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0033 + ,simpleLowerCaseMapping:0xE0033 + ,simpleTitleCaseMapping:0xE0033 + }, + { code:0xE0034 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0034 + ,simpleLowerCaseMapping:0xE0034 + ,simpleTitleCaseMapping:0xE0034 + }, + { code:0xE0035 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0035 + ,simpleLowerCaseMapping:0xE0035 + ,simpleTitleCaseMapping:0xE0035 + }, + { code:0xE0036 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0036 + ,simpleLowerCaseMapping:0xE0036 + ,simpleTitleCaseMapping:0xE0036 + }, + { code:0xE0037 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0037 + ,simpleLowerCaseMapping:0xE0037 + ,simpleTitleCaseMapping:0xE0037 + }, + { code:0xE0038 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0038 + ,simpleLowerCaseMapping:0xE0038 + ,simpleTitleCaseMapping:0xE0038 + }, + { code:0xE0039 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0039 + ,simpleLowerCaseMapping:0xE0039 + ,simpleTitleCaseMapping:0xE0039 + }, + { code:0xE003A + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE003A + ,simpleLowerCaseMapping:0xE003A + ,simpleTitleCaseMapping:0xE003A + }, + { code:0xE003B + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE003B + ,simpleLowerCaseMapping:0xE003B + ,simpleTitleCaseMapping:0xE003B + }, + { code:0xE003C + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE003C + ,simpleLowerCaseMapping:0xE003C + ,simpleTitleCaseMapping:0xE003C + }, + { code:0xE003D + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE003D + ,simpleLowerCaseMapping:0xE003D + ,simpleTitleCaseMapping:0xE003D + }, + { code:0xE003E + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE003E + ,simpleLowerCaseMapping:0xE003E + ,simpleTitleCaseMapping:0xE003E + }, + { code:0xE003F + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE003F + ,simpleLowerCaseMapping:0xE003F + ,simpleTitleCaseMapping:0xE003F + }, + { code:0xE0040 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0040 + ,simpleLowerCaseMapping:0xE0040 + ,simpleTitleCaseMapping:0xE0040 + }, + { code:0xE0041 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0041 + ,simpleLowerCaseMapping:0xE0041 + ,simpleTitleCaseMapping:0xE0041 + }, + { code:0xE0042 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0042 + ,simpleLowerCaseMapping:0xE0042 + ,simpleTitleCaseMapping:0xE0042 + }, + { code:0xE0043 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0043 + ,simpleLowerCaseMapping:0xE0043 + ,simpleTitleCaseMapping:0xE0043 + }, + { code:0xE0044 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0044 + ,simpleLowerCaseMapping:0xE0044 + ,simpleTitleCaseMapping:0xE0044 + }, + { code:0xE0045 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0045 + ,simpleLowerCaseMapping:0xE0045 + ,simpleTitleCaseMapping:0xE0045 + }, + { code:0xE0046 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0046 + ,simpleLowerCaseMapping:0xE0046 + ,simpleTitleCaseMapping:0xE0046 + }, + { code:0xE0047 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0047 + ,simpleLowerCaseMapping:0xE0047 + ,simpleTitleCaseMapping:0xE0047 + }, + { code:0xE0048 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0048 + ,simpleLowerCaseMapping:0xE0048 + ,simpleTitleCaseMapping:0xE0048 + }, + { code:0xE0049 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0049 + ,simpleLowerCaseMapping:0xE0049 + ,simpleTitleCaseMapping:0xE0049 + }, + { code:0xE004A + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE004A + ,simpleLowerCaseMapping:0xE004A + ,simpleTitleCaseMapping:0xE004A + }, + { code:0xE004B + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE004B + ,simpleLowerCaseMapping:0xE004B + ,simpleTitleCaseMapping:0xE004B + }, + { code:0xE004C + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE004C + ,simpleLowerCaseMapping:0xE004C + ,simpleTitleCaseMapping:0xE004C + }, + { code:0xE004D + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE004D + ,simpleLowerCaseMapping:0xE004D + ,simpleTitleCaseMapping:0xE004D + }, + { code:0xE004E + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE004E + ,simpleLowerCaseMapping:0xE004E + ,simpleTitleCaseMapping:0xE004E + }, + { code:0xE004F + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE004F + ,simpleLowerCaseMapping:0xE004F + ,simpleTitleCaseMapping:0xE004F + }, + { code:0xE0050 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0050 + ,simpleLowerCaseMapping:0xE0050 + ,simpleTitleCaseMapping:0xE0050 + }, + { code:0xE0051 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0051 + ,simpleLowerCaseMapping:0xE0051 + ,simpleTitleCaseMapping:0xE0051 + }, + { code:0xE0052 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0052 + ,simpleLowerCaseMapping:0xE0052 + ,simpleTitleCaseMapping:0xE0052 + }, + { code:0xE0053 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0053 + ,simpleLowerCaseMapping:0xE0053 + ,simpleTitleCaseMapping:0xE0053 + }, + { code:0xE0054 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0054 + ,simpleLowerCaseMapping:0xE0054 + ,simpleTitleCaseMapping:0xE0054 + }, + { code:0xE0055 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0055 + ,simpleLowerCaseMapping:0xE0055 + ,simpleTitleCaseMapping:0xE0055 + }, + { code:0xE0056 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0056 + ,simpleLowerCaseMapping:0xE0056 + ,simpleTitleCaseMapping:0xE0056 + }, + { code:0xE0057 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0057 + ,simpleLowerCaseMapping:0xE0057 + ,simpleTitleCaseMapping:0xE0057 + }, + { code:0xE0058 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0058 + ,simpleLowerCaseMapping:0xE0058 + ,simpleTitleCaseMapping:0xE0058 + }, + { code:0xE0059 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0059 + ,simpleLowerCaseMapping:0xE0059 + ,simpleTitleCaseMapping:0xE0059 + }, + { code:0xE005A + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE005A + ,simpleLowerCaseMapping:0xE005A + ,simpleTitleCaseMapping:0xE005A + }, + { code:0xE005B + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE005B + ,simpleLowerCaseMapping:0xE005B + ,simpleTitleCaseMapping:0xE005B + }, + { code:0xE005C + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE005C + ,simpleLowerCaseMapping:0xE005C + ,simpleTitleCaseMapping:0xE005C + }, + { code:0xE005D + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE005D + ,simpleLowerCaseMapping:0xE005D + ,simpleTitleCaseMapping:0xE005D + }, + { code:0xE005E + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE005E + ,simpleLowerCaseMapping:0xE005E + ,simpleTitleCaseMapping:0xE005E + }, + { code:0xE005F + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE005F + ,simpleLowerCaseMapping:0xE005F + ,simpleTitleCaseMapping:0xE005F + }, + { code:0xE0060 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0060 + ,simpleLowerCaseMapping:0xE0060 + ,simpleTitleCaseMapping:0xE0060 + }, + { code:0xE0061 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0061 + ,simpleLowerCaseMapping:0xE0061 + ,simpleTitleCaseMapping:0xE0061 + }, + { code:0xE0062 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0062 + ,simpleLowerCaseMapping:0xE0062 + ,simpleTitleCaseMapping:0xE0062 + }, + { code:0xE0063 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0063 + ,simpleLowerCaseMapping:0xE0063 + ,simpleTitleCaseMapping:0xE0063 + }, + { code:0xE0064 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0064 + ,simpleLowerCaseMapping:0xE0064 + ,simpleTitleCaseMapping:0xE0064 + }, + { code:0xE0065 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0065 + ,simpleLowerCaseMapping:0xE0065 + ,simpleTitleCaseMapping:0xE0065 + }, + { code:0xE0066 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0066 + ,simpleLowerCaseMapping:0xE0066 + ,simpleTitleCaseMapping:0xE0066 + }, + { code:0xE0067 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0067 + ,simpleLowerCaseMapping:0xE0067 + ,simpleTitleCaseMapping:0xE0067 + }, + { code:0xE0068 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0068 + ,simpleLowerCaseMapping:0xE0068 + ,simpleTitleCaseMapping:0xE0068 + }, + { code:0xE0069 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0069 + ,simpleLowerCaseMapping:0xE0069 + ,simpleTitleCaseMapping:0xE0069 + }, + { code:0xE006A + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE006A + ,simpleLowerCaseMapping:0xE006A + ,simpleTitleCaseMapping:0xE006A + }, + { code:0xE006B + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE006B + ,simpleLowerCaseMapping:0xE006B + ,simpleTitleCaseMapping:0xE006B + }, + { code:0xE006C + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE006C + ,simpleLowerCaseMapping:0xE006C + ,simpleTitleCaseMapping:0xE006C + }, + { code:0xE006D + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE006D + ,simpleLowerCaseMapping:0xE006D + ,simpleTitleCaseMapping:0xE006D + }, + { code:0xE006E + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE006E + ,simpleLowerCaseMapping:0xE006E + ,simpleTitleCaseMapping:0xE006E + }, + { code:0xE006F + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE006F + ,simpleLowerCaseMapping:0xE006F + ,simpleTitleCaseMapping:0xE006F + }, + { code:0xE0070 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0070 + ,simpleLowerCaseMapping:0xE0070 + ,simpleTitleCaseMapping:0xE0070 + }, + { code:0xE0071 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0071 + ,simpleLowerCaseMapping:0xE0071 + ,simpleTitleCaseMapping:0xE0071 + }, + { code:0xE0072 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0072 + ,simpleLowerCaseMapping:0xE0072 + ,simpleTitleCaseMapping:0xE0072 + }, + { code:0xE0073 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0073 + ,simpleLowerCaseMapping:0xE0073 + ,simpleTitleCaseMapping:0xE0073 + }, + { code:0xE0074 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0074 + ,simpleLowerCaseMapping:0xE0074 + ,simpleTitleCaseMapping:0xE0074 + }, + { code:0xE0075 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0075 + ,simpleLowerCaseMapping:0xE0075 + ,simpleTitleCaseMapping:0xE0075 + }, + { code:0xE0076 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0076 + ,simpleLowerCaseMapping:0xE0076 + ,simpleTitleCaseMapping:0xE0076 + }, + { code:0xE0077 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0077 + ,simpleLowerCaseMapping:0xE0077 + ,simpleTitleCaseMapping:0xE0077 + }, + { code:0xE0078 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0078 + ,simpleLowerCaseMapping:0xE0078 + ,simpleTitleCaseMapping:0xE0078 + }, + { code:0xE0079 + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE0079 + ,simpleLowerCaseMapping:0xE0079 + ,simpleTitleCaseMapping:0xE0079 + }, + { code:0xE007A + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE007A + ,simpleLowerCaseMapping:0xE007A + ,simpleTitleCaseMapping:0xE007A + }, + { code:0xE007B + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE007B + ,simpleLowerCaseMapping:0xE007B + ,simpleTitleCaseMapping:0xE007B + }, + { code:0xE007C + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE007C + ,simpleLowerCaseMapping:0xE007C + ,simpleTitleCaseMapping:0xE007C + }, + { code:0xE007D + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE007D + ,simpleLowerCaseMapping:0xE007D + ,simpleTitleCaseMapping:0xE007D + }, + { code:0xE007E + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE007E + ,simpleLowerCaseMapping:0xE007E + ,simpleTitleCaseMapping:0xE007E + }, + { code:0xE007F + ,generalCategory:UnicodeData.GeneralCategory.Cf + ,simpleUpperCaseMapping:0xE007F + ,simpleLowerCaseMapping:0xE007F + ,simpleTitleCaseMapping:0xE007F + }, + { code:0xE0100 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0100 + ,simpleLowerCaseMapping:0xE0100 + ,simpleTitleCaseMapping:0xE0100 + }, + { code:0xE0101 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0101 + ,simpleLowerCaseMapping:0xE0101 + ,simpleTitleCaseMapping:0xE0101 + }, + { code:0xE0102 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0102 + ,simpleLowerCaseMapping:0xE0102 + ,simpleTitleCaseMapping:0xE0102 + }, + { code:0xE0103 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0103 + ,simpleLowerCaseMapping:0xE0103 + ,simpleTitleCaseMapping:0xE0103 + }, + { code:0xE0104 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0104 + ,simpleLowerCaseMapping:0xE0104 + ,simpleTitleCaseMapping:0xE0104 + }, + { code:0xE0105 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0105 + ,simpleLowerCaseMapping:0xE0105 + ,simpleTitleCaseMapping:0xE0105 + }, + { code:0xE0106 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0106 + ,simpleLowerCaseMapping:0xE0106 + ,simpleTitleCaseMapping:0xE0106 + }, + { code:0xE0107 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0107 + ,simpleLowerCaseMapping:0xE0107 + ,simpleTitleCaseMapping:0xE0107 + }, + { code:0xE0108 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0108 + ,simpleLowerCaseMapping:0xE0108 + ,simpleTitleCaseMapping:0xE0108 + }, + { code:0xE0109 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0109 + ,simpleLowerCaseMapping:0xE0109 + ,simpleTitleCaseMapping:0xE0109 + }, + { code:0xE010A + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE010A + ,simpleLowerCaseMapping:0xE010A + ,simpleTitleCaseMapping:0xE010A + }, + { code:0xE010B + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE010B + ,simpleLowerCaseMapping:0xE010B + ,simpleTitleCaseMapping:0xE010B + }, + { code:0xE010C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE010C + ,simpleLowerCaseMapping:0xE010C + ,simpleTitleCaseMapping:0xE010C + }, + { code:0xE010D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE010D + ,simpleLowerCaseMapping:0xE010D + ,simpleTitleCaseMapping:0xE010D + }, + { code:0xE010E + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE010E + ,simpleLowerCaseMapping:0xE010E + ,simpleTitleCaseMapping:0xE010E + }, + { code:0xE010F + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE010F + ,simpleLowerCaseMapping:0xE010F + ,simpleTitleCaseMapping:0xE010F + }, + { code:0xE0110 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0110 + ,simpleLowerCaseMapping:0xE0110 + ,simpleTitleCaseMapping:0xE0110 + }, + { code:0xE0111 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0111 + ,simpleLowerCaseMapping:0xE0111 + ,simpleTitleCaseMapping:0xE0111 + }, + { code:0xE0112 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0112 + ,simpleLowerCaseMapping:0xE0112 + ,simpleTitleCaseMapping:0xE0112 + }, + { code:0xE0113 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0113 + ,simpleLowerCaseMapping:0xE0113 + ,simpleTitleCaseMapping:0xE0113 + }, + { code:0xE0114 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0114 + ,simpleLowerCaseMapping:0xE0114 + ,simpleTitleCaseMapping:0xE0114 + }, + { code:0xE0115 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0115 + ,simpleLowerCaseMapping:0xE0115 + ,simpleTitleCaseMapping:0xE0115 + }, + { code:0xE0116 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0116 + ,simpleLowerCaseMapping:0xE0116 + ,simpleTitleCaseMapping:0xE0116 + }, + { code:0xE0117 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0117 + ,simpleLowerCaseMapping:0xE0117 + ,simpleTitleCaseMapping:0xE0117 + }, + { code:0xE0118 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0118 + ,simpleLowerCaseMapping:0xE0118 + ,simpleTitleCaseMapping:0xE0118 + }, + { code:0xE0119 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0119 + ,simpleLowerCaseMapping:0xE0119 + ,simpleTitleCaseMapping:0xE0119 + }, + { code:0xE011A + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE011A + ,simpleLowerCaseMapping:0xE011A + ,simpleTitleCaseMapping:0xE011A + }, + { code:0xE011B + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE011B + ,simpleLowerCaseMapping:0xE011B + ,simpleTitleCaseMapping:0xE011B + }, + { code:0xE011C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE011C + ,simpleLowerCaseMapping:0xE011C + ,simpleTitleCaseMapping:0xE011C + }, + { code:0xE011D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE011D + ,simpleLowerCaseMapping:0xE011D + ,simpleTitleCaseMapping:0xE011D + }, + { code:0xE011E + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE011E + ,simpleLowerCaseMapping:0xE011E + ,simpleTitleCaseMapping:0xE011E + }, + { code:0xE011F + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE011F + ,simpleLowerCaseMapping:0xE011F + ,simpleTitleCaseMapping:0xE011F + }, + { code:0xE0120 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0120 + ,simpleLowerCaseMapping:0xE0120 + ,simpleTitleCaseMapping:0xE0120 + }, + { code:0xE0121 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0121 + ,simpleLowerCaseMapping:0xE0121 + ,simpleTitleCaseMapping:0xE0121 + }, + { code:0xE0122 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0122 + ,simpleLowerCaseMapping:0xE0122 + ,simpleTitleCaseMapping:0xE0122 + }, + { code:0xE0123 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0123 + ,simpleLowerCaseMapping:0xE0123 + ,simpleTitleCaseMapping:0xE0123 + }, + { code:0xE0124 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0124 + ,simpleLowerCaseMapping:0xE0124 + ,simpleTitleCaseMapping:0xE0124 + }, + { code:0xE0125 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0125 + ,simpleLowerCaseMapping:0xE0125 + ,simpleTitleCaseMapping:0xE0125 + }, + { code:0xE0126 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0126 + ,simpleLowerCaseMapping:0xE0126 + ,simpleTitleCaseMapping:0xE0126 + }, + { code:0xE0127 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0127 + ,simpleLowerCaseMapping:0xE0127 + ,simpleTitleCaseMapping:0xE0127 + }, + { code:0xE0128 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0128 + ,simpleLowerCaseMapping:0xE0128 + ,simpleTitleCaseMapping:0xE0128 + }, + { code:0xE0129 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0129 + ,simpleLowerCaseMapping:0xE0129 + ,simpleTitleCaseMapping:0xE0129 + }, + { code:0xE012A + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE012A + ,simpleLowerCaseMapping:0xE012A + ,simpleTitleCaseMapping:0xE012A + }, + { code:0xE012B + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE012B + ,simpleLowerCaseMapping:0xE012B + ,simpleTitleCaseMapping:0xE012B + }, + { code:0xE012C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE012C + ,simpleLowerCaseMapping:0xE012C + ,simpleTitleCaseMapping:0xE012C + }, + { code:0xE012D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE012D + ,simpleLowerCaseMapping:0xE012D + ,simpleTitleCaseMapping:0xE012D + }, + { code:0xE012E + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE012E + ,simpleLowerCaseMapping:0xE012E + ,simpleTitleCaseMapping:0xE012E + }, + { code:0xE012F + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE012F + ,simpleLowerCaseMapping:0xE012F + ,simpleTitleCaseMapping:0xE012F + }, + { code:0xE0130 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0130 + ,simpleLowerCaseMapping:0xE0130 + ,simpleTitleCaseMapping:0xE0130 + }, + { code:0xE0131 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0131 + ,simpleLowerCaseMapping:0xE0131 + ,simpleTitleCaseMapping:0xE0131 + }, + { code:0xE0132 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0132 + ,simpleLowerCaseMapping:0xE0132 + ,simpleTitleCaseMapping:0xE0132 + }, + { code:0xE0133 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0133 + ,simpleLowerCaseMapping:0xE0133 + ,simpleTitleCaseMapping:0xE0133 + }, + { code:0xE0134 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0134 + ,simpleLowerCaseMapping:0xE0134 + ,simpleTitleCaseMapping:0xE0134 + }, + { code:0xE0135 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0135 + ,simpleLowerCaseMapping:0xE0135 + ,simpleTitleCaseMapping:0xE0135 + }, + { code:0xE0136 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0136 + ,simpleLowerCaseMapping:0xE0136 + ,simpleTitleCaseMapping:0xE0136 + }, + { code:0xE0137 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0137 + ,simpleLowerCaseMapping:0xE0137 + ,simpleTitleCaseMapping:0xE0137 + }, + { code:0xE0138 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0138 + ,simpleLowerCaseMapping:0xE0138 + ,simpleTitleCaseMapping:0xE0138 + }, + { code:0xE0139 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0139 + ,simpleLowerCaseMapping:0xE0139 + ,simpleTitleCaseMapping:0xE0139 + }, + { code:0xE013A + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE013A + ,simpleLowerCaseMapping:0xE013A + ,simpleTitleCaseMapping:0xE013A + }, + { code:0xE013B + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE013B + ,simpleLowerCaseMapping:0xE013B + ,simpleTitleCaseMapping:0xE013B + }, + { code:0xE013C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE013C + ,simpleLowerCaseMapping:0xE013C + ,simpleTitleCaseMapping:0xE013C + }, + { code:0xE013D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE013D + ,simpleLowerCaseMapping:0xE013D + ,simpleTitleCaseMapping:0xE013D + }, + { code:0xE013E + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE013E + ,simpleLowerCaseMapping:0xE013E + ,simpleTitleCaseMapping:0xE013E + }, + { code:0xE013F + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE013F + ,simpleLowerCaseMapping:0xE013F + ,simpleTitleCaseMapping:0xE013F + }, + { code:0xE0140 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0140 + ,simpleLowerCaseMapping:0xE0140 + ,simpleTitleCaseMapping:0xE0140 + }, + { code:0xE0141 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0141 + ,simpleLowerCaseMapping:0xE0141 + ,simpleTitleCaseMapping:0xE0141 + }, + { code:0xE0142 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0142 + ,simpleLowerCaseMapping:0xE0142 + ,simpleTitleCaseMapping:0xE0142 + }, + { code:0xE0143 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0143 + ,simpleLowerCaseMapping:0xE0143 + ,simpleTitleCaseMapping:0xE0143 + }, + { code:0xE0144 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0144 + ,simpleLowerCaseMapping:0xE0144 + ,simpleTitleCaseMapping:0xE0144 + }, + { code:0xE0145 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0145 + ,simpleLowerCaseMapping:0xE0145 + ,simpleTitleCaseMapping:0xE0145 + }, + { code:0xE0146 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0146 + ,simpleLowerCaseMapping:0xE0146 + ,simpleTitleCaseMapping:0xE0146 + }, + { code:0xE0147 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0147 + ,simpleLowerCaseMapping:0xE0147 + ,simpleTitleCaseMapping:0xE0147 + }, + { code:0xE0148 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0148 + ,simpleLowerCaseMapping:0xE0148 + ,simpleTitleCaseMapping:0xE0148 + }, + { code:0xE0149 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0149 + ,simpleLowerCaseMapping:0xE0149 + ,simpleTitleCaseMapping:0xE0149 + }, + { code:0xE014A + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE014A + ,simpleLowerCaseMapping:0xE014A + ,simpleTitleCaseMapping:0xE014A + }, + { code:0xE014B + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE014B + ,simpleLowerCaseMapping:0xE014B + ,simpleTitleCaseMapping:0xE014B + }, + { code:0xE014C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE014C + ,simpleLowerCaseMapping:0xE014C + ,simpleTitleCaseMapping:0xE014C + }, + { code:0xE014D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE014D + ,simpleLowerCaseMapping:0xE014D + ,simpleTitleCaseMapping:0xE014D + }, + { code:0xE014E + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE014E + ,simpleLowerCaseMapping:0xE014E + ,simpleTitleCaseMapping:0xE014E + }, + { code:0xE014F + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE014F + ,simpleLowerCaseMapping:0xE014F + ,simpleTitleCaseMapping:0xE014F + }, + { code:0xE0150 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0150 + ,simpleLowerCaseMapping:0xE0150 + ,simpleTitleCaseMapping:0xE0150 + }, + { code:0xE0151 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0151 + ,simpleLowerCaseMapping:0xE0151 + ,simpleTitleCaseMapping:0xE0151 + }, + { code:0xE0152 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0152 + ,simpleLowerCaseMapping:0xE0152 + ,simpleTitleCaseMapping:0xE0152 + }, + { code:0xE0153 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0153 + ,simpleLowerCaseMapping:0xE0153 + ,simpleTitleCaseMapping:0xE0153 + }, + { code:0xE0154 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0154 + ,simpleLowerCaseMapping:0xE0154 + ,simpleTitleCaseMapping:0xE0154 + }, + { code:0xE0155 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0155 + ,simpleLowerCaseMapping:0xE0155 + ,simpleTitleCaseMapping:0xE0155 + }, + { code:0xE0156 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0156 + ,simpleLowerCaseMapping:0xE0156 + ,simpleTitleCaseMapping:0xE0156 + }, + { code:0xE0157 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0157 + ,simpleLowerCaseMapping:0xE0157 + ,simpleTitleCaseMapping:0xE0157 + }, + { code:0xE0158 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0158 + ,simpleLowerCaseMapping:0xE0158 + ,simpleTitleCaseMapping:0xE0158 + }, + { code:0xE0159 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0159 + ,simpleLowerCaseMapping:0xE0159 + ,simpleTitleCaseMapping:0xE0159 + }, + { code:0xE015A + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE015A + ,simpleLowerCaseMapping:0xE015A + ,simpleTitleCaseMapping:0xE015A + }, + { code:0xE015B + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE015B + ,simpleLowerCaseMapping:0xE015B + ,simpleTitleCaseMapping:0xE015B + }, + { code:0xE015C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE015C + ,simpleLowerCaseMapping:0xE015C + ,simpleTitleCaseMapping:0xE015C + }, + { code:0xE015D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE015D + ,simpleLowerCaseMapping:0xE015D + ,simpleTitleCaseMapping:0xE015D + }, + { code:0xE015E + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE015E + ,simpleLowerCaseMapping:0xE015E + ,simpleTitleCaseMapping:0xE015E + }, + { code:0xE015F + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE015F + ,simpleLowerCaseMapping:0xE015F + ,simpleTitleCaseMapping:0xE015F + }, + { code:0xE0160 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0160 + ,simpleLowerCaseMapping:0xE0160 + ,simpleTitleCaseMapping:0xE0160 + }, + { code:0xE0161 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0161 + ,simpleLowerCaseMapping:0xE0161 + ,simpleTitleCaseMapping:0xE0161 + }, + { code:0xE0162 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0162 + ,simpleLowerCaseMapping:0xE0162 + ,simpleTitleCaseMapping:0xE0162 + }, + { code:0xE0163 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0163 + ,simpleLowerCaseMapping:0xE0163 + ,simpleTitleCaseMapping:0xE0163 + }, + { code:0xE0164 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0164 + ,simpleLowerCaseMapping:0xE0164 + ,simpleTitleCaseMapping:0xE0164 + }, + { code:0xE0165 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0165 + ,simpleLowerCaseMapping:0xE0165 + ,simpleTitleCaseMapping:0xE0165 + }, + { code:0xE0166 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0166 + ,simpleLowerCaseMapping:0xE0166 + ,simpleTitleCaseMapping:0xE0166 + }, + { code:0xE0167 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0167 + ,simpleLowerCaseMapping:0xE0167 + ,simpleTitleCaseMapping:0xE0167 + }, + { code:0xE0168 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0168 + ,simpleLowerCaseMapping:0xE0168 + ,simpleTitleCaseMapping:0xE0168 + }, + { code:0xE0169 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0169 + ,simpleLowerCaseMapping:0xE0169 + ,simpleTitleCaseMapping:0xE0169 + }, + { code:0xE016A + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE016A + ,simpleLowerCaseMapping:0xE016A + ,simpleTitleCaseMapping:0xE016A + }, + { code:0xE016B + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE016B + ,simpleLowerCaseMapping:0xE016B + ,simpleTitleCaseMapping:0xE016B + }, + { code:0xE016C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE016C + ,simpleLowerCaseMapping:0xE016C + ,simpleTitleCaseMapping:0xE016C + }, + { code:0xE016D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE016D + ,simpleLowerCaseMapping:0xE016D + ,simpleTitleCaseMapping:0xE016D + }, + { code:0xE016E + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE016E + ,simpleLowerCaseMapping:0xE016E + ,simpleTitleCaseMapping:0xE016E + }, + { code:0xE016F + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE016F + ,simpleLowerCaseMapping:0xE016F + ,simpleTitleCaseMapping:0xE016F + }, + { code:0xE0170 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0170 + ,simpleLowerCaseMapping:0xE0170 + ,simpleTitleCaseMapping:0xE0170 + }, + { code:0xE0171 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0171 + ,simpleLowerCaseMapping:0xE0171 + ,simpleTitleCaseMapping:0xE0171 + }, + { code:0xE0172 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0172 + ,simpleLowerCaseMapping:0xE0172 + ,simpleTitleCaseMapping:0xE0172 + }, + { code:0xE0173 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0173 + ,simpleLowerCaseMapping:0xE0173 + ,simpleTitleCaseMapping:0xE0173 + }, + { code:0xE0174 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0174 + ,simpleLowerCaseMapping:0xE0174 + ,simpleTitleCaseMapping:0xE0174 + }, + { code:0xE0175 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0175 + ,simpleLowerCaseMapping:0xE0175 + ,simpleTitleCaseMapping:0xE0175 + }, + { code:0xE0176 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0176 + ,simpleLowerCaseMapping:0xE0176 + ,simpleTitleCaseMapping:0xE0176 + }, + { code:0xE0177 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0177 + ,simpleLowerCaseMapping:0xE0177 + ,simpleTitleCaseMapping:0xE0177 + }, + { code:0xE0178 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0178 + ,simpleLowerCaseMapping:0xE0178 + ,simpleTitleCaseMapping:0xE0178 + }, + { code:0xE0179 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0179 + ,simpleLowerCaseMapping:0xE0179 + ,simpleTitleCaseMapping:0xE0179 + }, + { code:0xE017A + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE017A + ,simpleLowerCaseMapping:0xE017A + ,simpleTitleCaseMapping:0xE017A + }, + { code:0xE017B + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE017B + ,simpleLowerCaseMapping:0xE017B + ,simpleTitleCaseMapping:0xE017B + }, + { code:0xE017C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE017C + ,simpleLowerCaseMapping:0xE017C + ,simpleTitleCaseMapping:0xE017C + }, + { code:0xE017D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE017D + ,simpleLowerCaseMapping:0xE017D + ,simpleTitleCaseMapping:0xE017D + }, + { code:0xE017E + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE017E + ,simpleLowerCaseMapping:0xE017E + ,simpleTitleCaseMapping:0xE017E + }, + { code:0xE017F + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE017F + ,simpleLowerCaseMapping:0xE017F + ,simpleTitleCaseMapping:0xE017F + }, + { code:0xE0180 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0180 + ,simpleLowerCaseMapping:0xE0180 + ,simpleTitleCaseMapping:0xE0180 + }, + { code:0xE0181 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0181 + ,simpleLowerCaseMapping:0xE0181 + ,simpleTitleCaseMapping:0xE0181 + }, + { code:0xE0182 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0182 + ,simpleLowerCaseMapping:0xE0182 + ,simpleTitleCaseMapping:0xE0182 + }, + { code:0xE0183 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0183 + ,simpleLowerCaseMapping:0xE0183 + ,simpleTitleCaseMapping:0xE0183 + }, + { code:0xE0184 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0184 + ,simpleLowerCaseMapping:0xE0184 + ,simpleTitleCaseMapping:0xE0184 + }, + { code:0xE0185 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0185 + ,simpleLowerCaseMapping:0xE0185 + ,simpleTitleCaseMapping:0xE0185 + }, + { code:0xE0186 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0186 + ,simpleLowerCaseMapping:0xE0186 + ,simpleTitleCaseMapping:0xE0186 + }, + { code:0xE0187 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0187 + ,simpleLowerCaseMapping:0xE0187 + ,simpleTitleCaseMapping:0xE0187 + }, + { code:0xE0188 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0188 + ,simpleLowerCaseMapping:0xE0188 + ,simpleTitleCaseMapping:0xE0188 + }, + { code:0xE0189 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0189 + ,simpleLowerCaseMapping:0xE0189 + ,simpleTitleCaseMapping:0xE0189 + }, + { code:0xE018A + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE018A + ,simpleLowerCaseMapping:0xE018A + ,simpleTitleCaseMapping:0xE018A + }, + { code:0xE018B + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE018B + ,simpleLowerCaseMapping:0xE018B + ,simpleTitleCaseMapping:0xE018B + }, + { code:0xE018C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE018C + ,simpleLowerCaseMapping:0xE018C + ,simpleTitleCaseMapping:0xE018C + }, + { code:0xE018D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE018D + ,simpleLowerCaseMapping:0xE018D + ,simpleTitleCaseMapping:0xE018D + }, + { code:0xE018E + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE018E + ,simpleLowerCaseMapping:0xE018E + ,simpleTitleCaseMapping:0xE018E + }, + { code:0xE018F + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE018F + ,simpleLowerCaseMapping:0xE018F + ,simpleTitleCaseMapping:0xE018F + }, + { code:0xE0190 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0190 + ,simpleLowerCaseMapping:0xE0190 + ,simpleTitleCaseMapping:0xE0190 + }, + { code:0xE0191 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0191 + ,simpleLowerCaseMapping:0xE0191 + ,simpleTitleCaseMapping:0xE0191 + }, + { code:0xE0192 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0192 + ,simpleLowerCaseMapping:0xE0192 + ,simpleTitleCaseMapping:0xE0192 + }, + { code:0xE0193 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0193 + ,simpleLowerCaseMapping:0xE0193 + ,simpleTitleCaseMapping:0xE0193 + }, + { code:0xE0194 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0194 + ,simpleLowerCaseMapping:0xE0194 + ,simpleTitleCaseMapping:0xE0194 + }, + { code:0xE0195 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0195 + ,simpleLowerCaseMapping:0xE0195 + ,simpleTitleCaseMapping:0xE0195 + }, + { code:0xE0196 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0196 + ,simpleLowerCaseMapping:0xE0196 + ,simpleTitleCaseMapping:0xE0196 + }, + { code:0xE0197 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0197 + ,simpleLowerCaseMapping:0xE0197 + ,simpleTitleCaseMapping:0xE0197 + }, + { code:0xE0198 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0198 + ,simpleLowerCaseMapping:0xE0198 + ,simpleTitleCaseMapping:0xE0198 + }, + { code:0xE0199 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE0199 + ,simpleLowerCaseMapping:0xE0199 + ,simpleTitleCaseMapping:0xE0199 + }, + { code:0xE019A + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE019A + ,simpleLowerCaseMapping:0xE019A + ,simpleTitleCaseMapping:0xE019A + }, + { code:0xE019B + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE019B + ,simpleLowerCaseMapping:0xE019B + ,simpleTitleCaseMapping:0xE019B + }, + { code:0xE019C + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE019C + ,simpleLowerCaseMapping:0xE019C + ,simpleTitleCaseMapping:0xE019C + }, + { code:0xE019D + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE019D + ,simpleLowerCaseMapping:0xE019D + ,simpleTitleCaseMapping:0xE019D + }, + { code:0xE019E + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE019E + ,simpleLowerCaseMapping:0xE019E + ,simpleTitleCaseMapping:0xE019E + }, + { code:0xE019F + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE019F + ,simpleLowerCaseMapping:0xE019F + ,simpleTitleCaseMapping:0xE019F + }, + { code:0xE01A0 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01A0 + ,simpleLowerCaseMapping:0xE01A0 + ,simpleTitleCaseMapping:0xE01A0 + }, + { code:0xE01A1 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01A1 + ,simpleLowerCaseMapping:0xE01A1 + ,simpleTitleCaseMapping:0xE01A1 + }, + { code:0xE01A2 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01A2 + ,simpleLowerCaseMapping:0xE01A2 + ,simpleTitleCaseMapping:0xE01A2 + }, + { code:0xE01A3 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01A3 + ,simpleLowerCaseMapping:0xE01A3 + ,simpleTitleCaseMapping:0xE01A3 + }, + { code:0xE01A4 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01A4 + ,simpleLowerCaseMapping:0xE01A4 + ,simpleTitleCaseMapping:0xE01A4 + }, + { code:0xE01A5 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01A5 + ,simpleLowerCaseMapping:0xE01A5 + ,simpleTitleCaseMapping:0xE01A5 + }, + { code:0xE01A6 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01A6 + ,simpleLowerCaseMapping:0xE01A6 + ,simpleTitleCaseMapping:0xE01A6 + }, + { code:0xE01A7 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01A7 + ,simpleLowerCaseMapping:0xE01A7 + ,simpleTitleCaseMapping:0xE01A7 + }, + { code:0xE01A8 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01A8 + ,simpleLowerCaseMapping:0xE01A8 + ,simpleTitleCaseMapping:0xE01A8 + }, + { code:0xE01A9 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01A9 + ,simpleLowerCaseMapping:0xE01A9 + ,simpleTitleCaseMapping:0xE01A9 + }, + { code:0xE01AA + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01AA + ,simpleLowerCaseMapping:0xE01AA + ,simpleTitleCaseMapping:0xE01AA + }, + { code:0xE01AB + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01AB + ,simpleLowerCaseMapping:0xE01AB + ,simpleTitleCaseMapping:0xE01AB + }, + { code:0xE01AC + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01AC + ,simpleLowerCaseMapping:0xE01AC + ,simpleTitleCaseMapping:0xE01AC + }, + { code:0xE01AD + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01AD + ,simpleLowerCaseMapping:0xE01AD + ,simpleTitleCaseMapping:0xE01AD + }, + { code:0xE01AE + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01AE + ,simpleLowerCaseMapping:0xE01AE + ,simpleTitleCaseMapping:0xE01AE + }, + { code:0xE01AF + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01AF + ,simpleLowerCaseMapping:0xE01AF + ,simpleTitleCaseMapping:0xE01AF + }, + { code:0xE01B0 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01B0 + ,simpleLowerCaseMapping:0xE01B0 + ,simpleTitleCaseMapping:0xE01B0 + }, + { code:0xE01B1 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01B1 + ,simpleLowerCaseMapping:0xE01B1 + ,simpleTitleCaseMapping:0xE01B1 + }, + { code:0xE01B2 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01B2 + ,simpleLowerCaseMapping:0xE01B2 + ,simpleTitleCaseMapping:0xE01B2 + }, + { code:0xE01B3 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01B3 + ,simpleLowerCaseMapping:0xE01B3 + ,simpleTitleCaseMapping:0xE01B3 + }, + { code:0xE01B4 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01B4 + ,simpleLowerCaseMapping:0xE01B4 + ,simpleTitleCaseMapping:0xE01B4 + }, + { code:0xE01B5 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01B5 + ,simpleLowerCaseMapping:0xE01B5 + ,simpleTitleCaseMapping:0xE01B5 + }, + { code:0xE01B6 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01B6 + ,simpleLowerCaseMapping:0xE01B6 + ,simpleTitleCaseMapping:0xE01B6 + }, + { code:0xE01B7 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01B7 + ,simpleLowerCaseMapping:0xE01B7 + ,simpleTitleCaseMapping:0xE01B7 + }, + { code:0xE01B8 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01B8 + ,simpleLowerCaseMapping:0xE01B8 + ,simpleTitleCaseMapping:0xE01B8 + }, + { code:0xE01B9 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01B9 + ,simpleLowerCaseMapping:0xE01B9 + ,simpleTitleCaseMapping:0xE01B9 + }, + { code:0xE01BA + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01BA + ,simpleLowerCaseMapping:0xE01BA + ,simpleTitleCaseMapping:0xE01BA + }, + { code:0xE01BB + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01BB + ,simpleLowerCaseMapping:0xE01BB + ,simpleTitleCaseMapping:0xE01BB + }, + { code:0xE01BC + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01BC + ,simpleLowerCaseMapping:0xE01BC + ,simpleTitleCaseMapping:0xE01BC + }, + { code:0xE01BD + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01BD + ,simpleLowerCaseMapping:0xE01BD + ,simpleTitleCaseMapping:0xE01BD + }, + { code:0xE01BE + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01BE + ,simpleLowerCaseMapping:0xE01BE + ,simpleTitleCaseMapping:0xE01BE + }, + { code:0xE01BF + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01BF + ,simpleLowerCaseMapping:0xE01BF + ,simpleTitleCaseMapping:0xE01BF + }, + { code:0xE01C0 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01C0 + ,simpleLowerCaseMapping:0xE01C0 + ,simpleTitleCaseMapping:0xE01C0 + }, + { code:0xE01C1 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01C1 + ,simpleLowerCaseMapping:0xE01C1 + ,simpleTitleCaseMapping:0xE01C1 + }, + { code:0xE01C2 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01C2 + ,simpleLowerCaseMapping:0xE01C2 + ,simpleTitleCaseMapping:0xE01C2 + }, + { code:0xE01C3 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01C3 + ,simpleLowerCaseMapping:0xE01C3 + ,simpleTitleCaseMapping:0xE01C3 + }, + { code:0xE01C4 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01C4 + ,simpleLowerCaseMapping:0xE01C4 + ,simpleTitleCaseMapping:0xE01C4 + }, + { code:0xE01C5 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01C5 + ,simpleLowerCaseMapping:0xE01C5 + ,simpleTitleCaseMapping:0xE01C5 + }, + { code:0xE01C6 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01C6 + ,simpleLowerCaseMapping:0xE01C6 + ,simpleTitleCaseMapping:0xE01C6 + }, + { code:0xE01C7 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01C7 + ,simpleLowerCaseMapping:0xE01C7 + ,simpleTitleCaseMapping:0xE01C7 + }, + { code:0xE01C8 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01C8 + ,simpleLowerCaseMapping:0xE01C8 + ,simpleTitleCaseMapping:0xE01C8 + }, + { code:0xE01C9 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01C9 + ,simpleLowerCaseMapping:0xE01C9 + ,simpleTitleCaseMapping:0xE01C9 + }, + { code:0xE01CA + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01CA + ,simpleLowerCaseMapping:0xE01CA + ,simpleTitleCaseMapping:0xE01CA + }, + { code:0xE01CB + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01CB + ,simpleLowerCaseMapping:0xE01CB + ,simpleTitleCaseMapping:0xE01CB + }, + { code:0xE01CC + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01CC + ,simpleLowerCaseMapping:0xE01CC + ,simpleTitleCaseMapping:0xE01CC + }, + { code:0xE01CD + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01CD + ,simpleLowerCaseMapping:0xE01CD + ,simpleTitleCaseMapping:0xE01CD + }, + { code:0xE01CE + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01CE + ,simpleLowerCaseMapping:0xE01CE + ,simpleTitleCaseMapping:0xE01CE + }, + { code:0xE01CF + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01CF + ,simpleLowerCaseMapping:0xE01CF + ,simpleTitleCaseMapping:0xE01CF + }, + { code:0xE01D0 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01D0 + ,simpleLowerCaseMapping:0xE01D0 + ,simpleTitleCaseMapping:0xE01D0 + }, + { code:0xE01D1 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01D1 + ,simpleLowerCaseMapping:0xE01D1 + ,simpleTitleCaseMapping:0xE01D1 + }, + { code:0xE01D2 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01D2 + ,simpleLowerCaseMapping:0xE01D2 + ,simpleTitleCaseMapping:0xE01D2 + }, + { code:0xE01D3 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01D3 + ,simpleLowerCaseMapping:0xE01D3 + ,simpleTitleCaseMapping:0xE01D3 + }, + { code:0xE01D4 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01D4 + ,simpleLowerCaseMapping:0xE01D4 + ,simpleTitleCaseMapping:0xE01D4 + }, + { code:0xE01D5 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01D5 + ,simpleLowerCaseMapping:0xE01D5 + ,simpleTitleCaseMapping:0xE01D5 + }, + { code:0xE01D6 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01D6 + ,simpleLowerCaseMapping:0xE01D6 + ,simpleTitleCaseMapping:0xE01D6 + }, + { code:0xE01D7 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01D7 + ,simpleLowerCaseMapping:0xE01D7 + ,simpleTitleCaseMapping:0xE01D7 + }, + { code:0xE01D8 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01D8 + ,simpleLowerCaseMapping:0xE01D8 + ,simpleTitleCaseMapping:0xE01D8 + }, + { code:0xE01D9 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01D9 + ,simpleLowerCaseMapping:0xE01D9 + ,simpleTitleCaseMapping:0xE01D9 + }, + { code:0xE01DA + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01DA + ,simpleLowerCaseMapping:0xE01DA + ,simpleTitleCaseMapping:0xE01DA + }, + { code:0xE01DB + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01DB + ,simpleLowerCaseMapping:0xE01DB + ,simpleTitleCaseMapping:0xE01DB + }, + { code:0xE01DC + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01DC + ,simpleLowerCaseMapping:0xE01DC + ,simpleTitleCaseMapping:0xE01DC + }, + { code:0xE01DD + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01DD + ,simpleLowerCaseMapping:0xE01DD + ,simpleTitleCaseMapping:0xE01DD + }, + { code:0xE01DE + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01DE + ,simpleLowerCaseMapping:0xE01DE + ,simpleTitleCaseMapping:0xE01DE + }, + { code:0xE01DF + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01DF + ,simpleLowerCaseMapping:0xE01DF + ,simpleTitleCaseMapping:0xE01DF + }, + { code:0xE01E0 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01E0 + ,simpleLowerCaseMapping:0xE01E0 + ,simpleTitleCaseMapping:0xE01E0 + }, + { code:0xE01E1 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01E1 + ,simpleLowerCaseMapping:0xE01E1 + ,simpleTitleCaseMapping:0xE01E1 + }, + { code:0xE01E2 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01E2 + ,simpleLowerCaseMapping:0xE01E2 + ,simpleTitleCaseMapping:0xE01E2 + }, + { code:0xE01E3 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01E3 + ,simpleLowerCaseMapping:0xE01E3 + ,simpleTitleCaseMapping:0xE01E3 + }, + { code:0xE01E4 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01E4 + ,simpleLowerCaseMapping:0xE01E4 + ,simpleTitleCaseMapping:0xE01E4 + }, + { code:0xE01E5 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01E5 + ,simpleLowerCaseMapping:0xE01E5 + ,simpleTitleCaseMapping:0xE01E5 + }, + { code:0xE01E6 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01E6 + ,simpleLowerCaseMapping:0xE01E6 + ,simpleTitleCaseMapping:0xE01E6 + }, + { code:0xE01E7 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01E7 + ,simpleLowerCaseMapping:0xE01E7 + ,simpleTitleCaseMapping:0xE01E7 + }, + { code:0xE01E8 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01E8 + ,simpleLowerCaseMapping:0xE01E8 + ,simpleTitleCaseMapping:0xE01E8 + }, + { code:0xE01E9 + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01E9 + ,simpleLowerCaseMapping:0xE01E9 + ,simpleTitleCaseMapping:0xE01E9 + }, + { code:0xE01EA + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01EA + ,simpleLowerCaseMapping:0xE01EA + ,simpleTitleCaseMapping:0xE01EA + }, + { code:0xE01EB + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01EB + ,simpleLowerCaseMapping:0xE01EB + ,simpleTitleCaseMapping:0xE01EB + }, + { code:0xE01EC + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01EC + ,simpleLowerCaseMapping:0xE01EC + ,simpleTitleCaseMapping:0xE01EC + }, + { code:0xE01ED + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01ED + ,simpleLowerCaseMapping:0xE01ED + ,simpleTitleCaseMapping:0xE01ED + }, + { code:0xE01EE + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01EE + ,simpleLowerCaseMapping:0xE01EE + ,simpleTitleCaseMapping:0xE01EE + }, + { code:0xE01EF + ,generalCategory:UnicodeData.GeneralCategory.Mn + ,simpleUpperCaseMapping:0xE01EF + ,simpleLowerCaseMapping:0xE01EF + ,simpleTitleCaseMapping:0xE01EF + }, + { code:0xF0000 + ,generalCategory:UnicodeData.GeneralCategory.Co + ,simpleUpperCaseMapping:0xF0000 + ,simpleLowerCaseMapping:0xF0000 + ,simpleTitleCaseMapping:0xF0000 + }, + { code:0xFFFFD + ,generalCategory:UnicodeData.GeneralCategory.Co + ,simpleUpperCaseMapping:0xFFFFD + ,simpleLowerCaseMapping:0xFFFFD + ,simpleTitleCaseMapping:0xFFFFD + }, + { code:0x100000 + ,generalCategory:UnicodeData.GeneralCategory.Co + ,simpleUpperCaseMapping:0x100000 + ,simpleLowerCaseMapping:0x100000 + ,simpleTitleCaseMapping:0x100000 + }, + { code:0x10FFFD + ,generalCategory:UnicodeData.GeneralCategory.Co + ,simpleUpperCaseMapping:0x10FFFD + ,simpleLowerCaseMapping:0x10FFFD + ,simpleTitleCaseMapping:0x10FFFD + }, + +]; + SpecialCaseData internalSpecialCaseData[] = [ + { code:0x00DF + ,upperCaseMapping:[ 0x0053, 0x0053 ] + ,lowerCaseMapping:[ 0x00DF ] + ,titleCaseMapping:[ 0x0053, 0x0073 ] + + }, + { code:0x0130 + ,upperCaseMapping:[ 0x0130 ] + ,lowerCaseMapping:[ 0x0069, 0x0307 ] + ,titleCaseMapping:[ 0x0130 ] + + }, + { code:0x0149 + ,upperCaseMapping:[ 0x02BC, 0x004E ] + ,lowerCaseMapping:[ 0x0149 ] + ,titleCaseMapping:[ 0x02BC, 0x004E ] + + }, + { code:0x01F0 + ,upperCaseMapping:[ 0x004A, 0x030C ] + ,lowerCaseMapping:[ 0x01F0 ] + ,titleCaseMapping:[ 0x004A, 0x030C ] + + }, + { code:0x0390 + ,upperCaseMapping:[ 0x0399, 0x0308, 0x0301 ] + ,lowerCaseMapping:[ 0x0390 ] + ,titleCaseMapping:[ 0x0399, 0x0308, 0x0301 ] + + }, + { code:0x03B0 + ,upperCaseMapping:[ 0x03A5, 0x0308, 0x0301 ] + ,lowerCaseMapping:[ 0x03B0 ] + ,titleCaseMapping:[ 0x03A5, 0x0308, 0x0301 ] + + }, + { code:0x0587 + ,upperCaseMapping:[ 0x0535, 0x0552 ] + ,lowerCaseMapping:[ 0x0587 ] + ,titleCaseMapping:[ 0x0535, 0x0582 ] + + }, + { code:0x1E96 + ,upperCaseMapping:[ 0x0048, 0x0331 ] + ,lowerCaseMapping:[ 0x1E96 ] + ,titleCaseMapping:[ 0x0048, 0x0331 ] + + }, + { code:0x1E97 + ,upperCaseMapping:[ 0x0054, 0x0308 ] + ,lowerCaseMapping:[ 0x1E97 ] + ,titleCaseMapping:[ 0x0054, 0x0308 ] + + }, + { code:0x1E98 + ,upperCaseMapping:[ 0x0057, 0x030A ] + ,lowerCaseMapping:[ 0x1E98 ] + ,titleCaseMapping:[ 0x0057, 0x030A ] + + }, + { code:0x1E99 + ,upperCaseMapping:[ 0x0059, 0x030A ] + ,lowerCaseMapping:[ 0x1E99 ] + ,titleCaseMapping:[ 0x0059, 0x030A ] + + }, + { code:0x1E9A + ,upperCaseMapping:[ 0x0041, 0x02BE ] + ,lowerCaseMapping:[ 0x1E9A ] + ,titleCaseMapping:[ 0x0041, 0x02BE ] + + }, + { code:0x1F50 + ,upperCaseMapping:[ 0x03A5, 0x0313 ] + ,lowerCaseMapping:[ 0x1F50 ] + ,titleCaseMapping:[ 0x03A5, 0x0313 ] + + }, + { code:0x1F52 + ,upperCaseMapping:[ 0x03A5, 0x0313, 0x0300 ] + ,lowerCaseMapping:[ 0x1F52 ] + ,titleCaseMapping:[ 0x03A5, 0x0313, 0x0300 ] + + }, + { code:0x1F54 + ,upperCaseMapping:[ 0x03A5, 0x0313, 0x0301 ] + ,lowerCaseMapping:[ 0x1F54 ] + ,titleCaseMapping:[ 0x03A5, 0x0313, 0x0301 ] + + }, + { code:0x1F56 + ,upperCaseMapping:[ 0x03A5, 0x0313, 0x0342 ] + ,lowerCaseMapping:[ 0x1F56 ] + ,titleCaseMapping:[ 0x03A5, 0x0313, 0x0342 ] + + }, + { code:0x1F80 + ,upperCaseMapping:[ 0x1F08, 0x0399 ] + ,lowerCaseMapping:[ 0x1F80 ] + ,titleCaseMapping:[ 0x1F88 ] + + }, + { code:0x1F81 + ,upperCaseMapping:[ 0x1F09, 0x0399 ] + ,lowerCaseMapping:[ 0x1F81 ] + ,titleCaseMapping:[ 0x1F89 ] + + }, + { code:0x1F82 + ,upperCaseMapping:[ 0x1F0A, 0x0399 ] + ,lowerCaseMapping:[ 0x1F82 ] + ,titleCaseMapping:[ 0x1F8A ] + + }, + { code:0x1F83 + ,upperCaseMapping:[ 0x1F0B, 0x0399 ] + ,lowerCaseMapping:[ 0x1F83 ] + ,titleCaseMapping:[ 0x1F8B ] + + }, + { code:0x1F84 + ,upperCaseMapping:[ 0x1F0C, 0x0399 ] + ,lowerCaseMapping:[ 0x1F84 ] + ,titleCaseMapping:[ 0x1F8C ] + + }, + { code:0x1F85 + ,upperCaseMapping:[ 0x1F0D, 0x0399 ] + ,lowerCaseMapping:[ 0x1F85 ] + ,titleCaseMapping:[ 0x1F8D ] + + }, + { code:0x1F86 + ,upperCaseMapping:[ 0x1F0E, 0x0399 ] + ,lowerCaseMapping:[ 0x1F86 ] + ,titleCaseMapping:[ 0x1F8E ] + + }, + { code:0x1F87 + ,upperCaseMapping:[ 0x1F0F, 0x0399 ] + ,lowerCaseMapping:[ 0x1F87 ] + ,titleCaseMapping:[ 0x1F8F ] + + }, + { code:0x1F88 + ,upperCaseMapping:[ 0x1F08, 0x0399 ] + ,lowerCaseMapping:[ 0x1F80 ] + ,titleCaseMapping:[ 0x1F88 ] + + }, + { code:0x1F89 + ,upperCaseMapping:[ 0x1F09, 0x0399 ] + ,lowerCaseMapping:[ 0x1F81 ] + ,titleCaseMapping:[ 0x1F89 ] + + }, + { code:0x1F8A + ,upperCaseMapping:[ 0x1F0A, 0x0399 ] + ,lowerCaseMapping:[ 0x1F82 ] + ,titleCaseMapping:[ 0x1F8A ] + + }, + { code:0x1F8B + ,upperCaseMapping:[ 0x1F0B, 0x0399 ] + ,lowerCaseMapping:[ 0x1F83 ] + ,titleCaseMapping:[ 0x1F8B ] + + }, + { code:0x1F8C + ,upperCaseMapping:[ 0x1F0C, 0x0399 ] + ,lowerCaseMapping:[ 0x1F84 ] + ,titleCaseMapping:[ 0x1F8C ] + + }, + { code:0x1F8D + ,upperCaseMapping:[ 0x1F0D, 0x0399 ] + ,lowerCaseMapping:[ 0x1F85 ] + ,titleCaseMapping:[ 0x1F8D ] + + }, + { code:0x1F8E + ,upperCaseMapping:[ 0x1F0E, 0x0399 ] + ,lowerCaseMapping:[ 0x1F86 ] + ,titleCaseMapping:[ 0x1F8E ] + + }, + { code:0x1F8F + ,upperCaseMapping:[ 0x1F0F, 0x0399 ] + ,lowerCaseMapping:[ 0x1F87 ] + ,titleCaseMapping:[ 0x1F8F ] + + }, + { code:0x1F90 + ,upperCaseMapping:[ 0x1F28, 0x0399 ] + ,lowerCaseMapping:[ 0x1F90 ] + ,titleCaseMapping:[ 0x1F98 ] + + }, + { code:0x1F91 + ,upperCaseMapping:[ 0x1F29, 0x0399 ] + ,lowerCaseMapping:[ 0x1F91 ] + ,titleCaseMapping:[ 0x1F99 ] + + }, + { code:0x1F92 + ,upperCaseMapping:[ 0x1F2A, 0x0399 ] + ,lowerCaseMapping:[ 0x1F92 ] + ,titleCaseMapping:[ 0x1F9A ] + + }, + { code:0x1F93 + ,upperCaseMapping:[ 0x1F2B, 0x0399 ] + ,lowerCaseMapping:[ 0x1F93 ] + ,titleCaseMapping:[ 0x1F9B ] + + }, + { code:0x1F94 + ,upperCaseMapping:[ 0x1F2C, 0x0399 ] + ,lowerCaseMapping:[ 0x1F94 ] + ,titleCaseMapping:[ 0x1F9C ] + + }, + { code:0x1F95 + ,upperCaseMapping:[ 0x1F2D, 0x0399 ] + ,lowerCaseMapping:[ 0x1F95 ] + ,titleCaseMapping:[ 0x1F9D ] + + }, + { code:0x1F96 + ,upperCaseMapping:[ 0x1F2E, 0x0399 ] + ,lowerCaseMapping:[ 0x1F96 ] + ,titleCaseMapping:[ 0x1F9E ] + + }, + { code:0x1F97 + ,upperCaseMapping:[ 0x1F2F, 0x0399 ] + ,lowerCaseMapping:[ 0x1F97 ] + ,titleCaseMapping:[ 0x1F9F ] + + }, + { code:0x1F98 + ,upperCaseMapping:[ 0x1F28, 0x0399 ] + ,lowerCaseMapping:[ 0x1F90 ] + ,titleCaseMapping:[ 0x1F98 ] + + }, + { code:0x1F99 + ,upperCaseMapping:[ 0x1F29, 0x0399 ] + ,lowerCaseMapping:[ 0x1F91 ] + ,titleCaseMapping:[ 0x1F99 ] + + }, + { code:0x1F9A + ,upperCaseMapping:[ 0x1F2A, 0x0399 ] + ,lowerCaseMapping:[ 0x1F92 ] + ,titleCaseMapping:[ 0x1F9A ] + + }, + { code:0x1F9B + ,upperCaseMapping:[ 0x1F2B, 0x0399 ] + ,lowerCaseMapping:[ 0x1F93 ] + ,titleCaseMapping:[ 0x1F9B ] + + }, + { code:0x1F9C + ,upperCaseMapping:[ 0x1F2C, 0x0399 ] + ,lowerCaseMapping:[ 0x1F94 ] + ,titleCaseMapping:[ 0x1F9C ] + + }, + { code:0x1F9D + ,upperCaseMapping:[ 0x1F2D, 0x0399 ] + ,lowerCaseMapping:[ 0x1F95 ] + ,titleCaseMapping:[ 0x1F9D ] + + }, + { code:0x1F9E + ,upperCaseMapping:[ 0x1F2E, 0x0399 ] + ,lowerCaseMapping:[ 0x1F96 ] + ,titleCaseMapping:[ 0x1F9E ] + + }, + { code:0x1F9F + ,upperCaseMapping:[ 0x1F2F, 0x0399 ] + ,lowerCaseMapping:[ 0x1F97 ] + ,titleCaseMapping:[ 0x1F9F ] + + }, + { code:0x1FA0 + ,upperCaseMapping:[ 0x1F68, 0x0399 ] + ,lowerCaseMapping:[ 0x1FA0 ] + ,titleCaseMapping:[ 0x1FA8 ] + + }, + { code:0x1FA1 + ,upperCaseMapping:[ 0x1F69, 0x0399 ] + ,lowerCaseMapping:[ 0x1FA1 ] + ,titleCaseMapping:[ 0x1FA9 ] + + }, + { code:0x1FA2 + ,upperCaseMapping:[ 0x1F6A, 0x0399 ] + ,lowerCaseMapping:[ 0x1FA2 ] + ,titleCaseMapping:[ 0x1FAA ] + + }, + { code:0x1FA3 + ,upperCaseMapping:[ 0x1F6B, 0x0399 ] + ,lowerCaseMapping:[ 0x1FA3 ] + ,titleCaseMapping:[ 0x1FAB ] + + }, + { code:0x1FA4 + ,upperCaseMapping:[ 0x1F6C, 0x0399 ] + ,lowerCaseMapping:[ 0x1FA4 ] + ,titleCaseMapping:[ 0x1FAC ] + + }, + { code:0x1FA5 + ,upperCaseMapping:[ 0x1F6D, 0x0399 ] + ,lowerCaseMapping:[ 0x1FA5 ] + ,titleCaseMapping:[ 0x1FAD ] + + }, + { code:0x1FA6 + ,upperCaseMapping:[ 0x1F6E, 0x0399 ] + ,lowerCaseMapping:[ 0x1FA6 ] + ,titleCaseMapping:[ 0x1FAE ] + + }, + { code:0x1FA7 + ,upperCaseMapping:[ 0x1F6F, 0x0399 ] + ,lowerCaseMapping:[ 0x1FA7 ] + ,titleCaseMapping:[ 0x1FAF ] + + }, + { code:0x1FA8 + ,upperCaseMapping:[ 0x1F68, 0x0399 ] + ,lowerCaseMapping:[ 0x1FA0 ] + ,titleCaseMapping:[ 0x1FA8 ] + + }, + { code:0x1FA9 + ,upperCaseMapping:[ 0x1F69, 0x0399 ] + ,lowerCaseMapping:[ 0x1FA1 ] + ,titleCaseMapping:[ 0x1FA9 ] + + }, + { code:0x1FAA + ,upperCaseMapping:[ 0x1F6A, 0x0399 ] + ,lowerCaseMapping:[ 0x1FA2 ] + ,titleCaseMapping:[ 0x1FAA ] + + }, + { code:0x1FAB + ,upperCaseMapping:[ 0x1F6B, 0x0399 ] + ,lowerCaseMapping:[ 0x1FA3 ] + ,titleCaseMapping:[ 0x1FAB ] + + }, + { code:0x1FAC + ,upperCaseMapping:[ 0x1F6C, 0x0399 ] + ,lowerCaseMapping:[ 0x1FA4 ] + ,titleCaseMapping:[ 0x1FAC ] + + }, + { code:0x1FAD + ,upperCaseMapping:[ 0x1F6D, 0x0399 ] + ,lowerCaseMapping:[ 0x1FA5 ] + ,titleCaseMapping:[ 0x1FAD ] + + }, + { code:0x1FAE + ,upperCaseMapping:[ 0x1F6E, 0x0399 ] + ,lowerCaseMapping:[ 0x1FA6 ] + ,titleCaseMapping:[ 0x1FAE ] + + }, + { code:0x1FAF + ,upperCaseMapping:[ 0x1F6F, 0x0399 ] + ,lowerCaseMapping:[ 0x1FA7 ] + ,titleCaseMapping:[ 0x1FAF ] + + }, + { code:0x1FB2 + ,upperCaseMapping:[ 0x1FBA, 0x0399 ] + ,lowerCaseMapping:[ 0x1FB2 ] + ,titleCaseMapping:[ 0x1FBA, 0x0345 ] + + }, + { code:0x1FB3 + ,upperCaseMapping:[ 0x0391, 0x0399 ] + ,lowerCaseMapping:[ 0x1FB3 ] + ,titleCaseMapping:[ 0x1FBC ] + + }, + { code:0x1FB4 + ,upperCaseMapping:[ 0x0386, 0x0399 ] + ,lowerCaseMapping:[ 0x1FB4 ] + ,titleCaseMapping:[ 0x0386, 0x0345 ] + + }, + { code:0x1FB6 + ,upperCaseMapping:[ 0x0391, 0x0342 ] + ,lowerCaseMapping:[ 0x1FB6 ] + ,titleCaseMapping:[ 0x0391, 0x0342 ] + + }, + { code:0x1FB7 + ,upperCaseMapping:[ 0x0391, 0x0342, 0x0399 ] + ,lowerCaseMapping:[ 0x1FB7 ] + ,titleCaseMapping:[ 0x0391, 0x0342, 0x0345 ] + + }, + { code:0x1FBC + ,upperCaseMapping:[ 0x0391, 0x0399 ] + ,lowerCaseMapping:[ 0x1FB3 ] + ,titleCaseMapping:[ 0x1FBC ] + + }, + { code:0x1FC2 + ,upperCaseMapping:[ 0x1FCA, 0x0399 ] + ,lowerCaseMapping:[ 0x1FC2 ] + ,titleCaseMapping:[ 0x1FCA, 0x0345 ] + + }, + { code:0x1FC3 + ,upperCaseMapping:[ 0x0397, 0x0399 ] + ,lowerCaseMapping:[ 0x1FC3 ] + ,titleCaseMapping:[ 0x1FCC ] + + }, + { code:0x1FC4 + ,upperCaseMapping:[ 0x0389, 0x0399 ] + ,lowerCaseMapping:[ 0x1FC4 ] + ,titleCaseMapping:[ 0x0389, 0x0345 ] + + }, + { code:0x1FC6 + ,upperCaseMapping:[ 0x0397, 0x0342 ] + ,lowerCaseMapping:[ 0x1FC6 ] + ,titleCaseMapping:[ 0x0397, 0x0342 ] + + }, + { code:0x1FC7 + ,upperCaseMapping:[ 0x0397, 0x0342, 0x0399 ] + ,lowerCaseMapping:[ 0x1FC7 ] + ,titleCaseMapping:[ 0x0397, 0x0342, 0x0345 ] + + }, + { code:0x1FCC + ,upperCaseMapping:[ 0x0397, 0x0399 ] + ,lowerCaseMapping:[ 0x1FC3 ] + ,titleCaseMapping:[ 0x1FCC ] + + }, + { code:0x1FD2 + ,upperCaseMapping:[ 0x0399, 0x0308, 0x0300 ] + ,lowerCaseMapping:[ 0x1FD2 ] + ,titleCaseMapping:[ 0x0399, 0x0308, 0x0300 ] + + }, + { code:0x1FD3 + ,upperCaseMapping:[ 0x0399, 0x0308, 0x0301 ] + ,lowerCaseMapping:[ 0x1FD3 ] + ,titleCaseMapping:[ 0x0399, 0x0308, 0x0301 ] + + }, + { code:0x1FD6 + ,upperCaseMapping:[ 0x0399, 0x0342 ] + ,lowerCaseMapping:[ 0x1FD6 ] + ,titleCaseMapping:[ 0x0399, 0x0342 ] + + }, + { code:0x1FD7 + ,upperCaseMapping:[ 0x0399, 0x0308, 0x0342 ] + ,lowerCaseMapping:[ 0x1FD7 ] + ,titleCaseMapping:[ 0x0399, 0x0308, 0x0342 ] + + }, + { code:0x1FE2 + ,upperCaseMapping:[ 0x03A5, 0x0308, 0x0300 ] + ,lowerCaseMapping:[ 0x1FE2 ] + ,titleCaseMapping:[ 0x03A5, 0x0308, 0x0300 ] + + }, + { code:0x1FE3 + ,upperCaseMapping:[ 0x03A5, 0x0308, 0x0301 ] + ,lowerCaseMapping:[ 0x1FE3 ] + ,titleCaseMapping:[ 0x03A5, 0x0308, 0x0301 ] + + }, + { code:0x1FE4 + ,upperCaseMapping:[ 0x03A1, 0x0313 ] + ,lowerCaseMapping:[ 0x1FE4 ] + ,titleCaseMapping:[ 0x03A1, 0x0313 ] + + }, + { code:0x1FE6 + ,upperCaseMapping:[ 0x03A5, 0x0342 ] + ,lowerCaseMapping:[ 0x1FE6 ] + ,titleCaseMapping:[ 0x03A5, 0x0342 ] + + }, + { code:0x1FE7 + ,upperCaseMapping:[ 0x03A5, 0x0308, 0x0342 ] + ,lowerCaseMapping:[ 0x1FE7 ] + ,titleCaseMapping:[ 0x03A5, 0x0308, 0x0342 ] + + }, + { code:0x1FF2 + ,upperCaseMapping:[ 0x1FFA, 0x0399 ] + ,lowerCaseMapping:[ 0x1FF2 ] + ,titleCaseMapping:[ 0x1FFA, 0x0345 ] + + }, + { code:0x1FF3 + ,upperCaseMapping:[ 0x03A9, 0x0399 ] + ,lowerCaseMapping:[ 0x1FF3 ] + ,titleCaseMapping:[ 0x1FFC ] + + }, + { code:0x1FF4 + ,upperCaseMapping:[ 0x038F, 0x0399 ] + ,lowerCaseMapping:[ 0x1FF4 ] + ,titleCaseMapping:[ 0x038F, 0x0345 ] + + }, + { code:0x1FF6 + ,upperCaseMapping:[ 0x03A9, 0x0342 ] + ,lowerCaseMapping:[ 0x1FF6 ] + ,titleCaseMapping:[ 0x03A9, 0x0342 ] + + }, + { code:0x1FF7 + ,upperCaseMapping:[ 0x03A9, 0x0342, 0x0399 ] + ,lowerCaseMapping:[ 0x1FF7 ] + ,titleCaseMapping:[ 0x03A9, 0x0342, 0x0345 ] + + }, + { code:0x1FFC + ,upperCaseMapping:[ 0x03A9, 0x0399 ] + ,lowerCaseMapping:[ 0x1FF3 ] + ,titleCaseMapping:[ 0x1FFC ] + + }, + { code:0xFB00 + ,upperCaseMapping:[ 0x0046, 0x0046 ] + ,lowerCaseMapping:[ 0xFB00 ] + ,titleCaseMapping:[ 0x0046, 0x0066 ] + + }, + { code:0xFB01 + ,upperCaseMapping:[ 0x0046, 0x0049 ] + ,lowerCaseMapping:[ 0xFB01 ] + ,titleCaseMapping:[ 0x0046, 0x0069 ] + + }, + { code:0xFB02 + ,upperCaseMapping:[ 0x0046, 0x004C ] + ,lowerCaseMapping:[ 0xFB02 ] + ,titleCaseMapping:[ 0x0046, 0x006C ] + + }, + { code:0xFB03 + ,upperCaseMapping:[ 0x0046, 0x0046, 0x0049 ] + ,lowerCaseMapping:[ 0xFB03 ] + ,titleCaseMapping:[ 0x0046, 0x0066, 0x0069 ] + + }, + { code:0xFB04 + ,upperCaseMapping:[ 0x0046, 0x0046, 0x004C ] + ,lowerCaseMapping:[ 0xFB04 ] + ,titleCaseMapping:[ 0x0046, 0x0066, 0x006C ] + + }, + { code:0xFB05 + ,upperCaseMapping:[ 0x0053, 0x0054 ] + ,lowerCaseMapping:[ 0xFB05 ] + ,titleCaseMapping:[ 0x0053, 0x0074 ] + + }, + { code:0xFB06 + ,upperCaseMapping:[ 0x0053, 0x0054 ] + ,lowerCaseMapping:[ 0xFB06 ] + ,titleCaseMapping:[ 0x0053, 0x0074 ] + + }, + { code:0xFB13 + ,upperCaseMapping:[ 0x0544, 0x0546 ] + ,lowerCaseMapping:[ 0xFB13 ] + ,titleCaseMapping:[ 0x0544, 0x0576 ] + + }, + { code:0xFB14 + ,upperCaseMapping:[ 0x0544, 0x0535 ] + ,lowerCaseMapping:[ 0xFB14 ] + ,titleCaseMapping:[ 0x0544, 0x0565 ] + + }, + { code:0xFB15 + ,upperCaseMapping:[ 0x0544, 0x053B ] + ,lowerCaseMapping:[ 0xFB15 ] + ,titleCaseMapping:[ 0x0544, 0x056B ] + + }, + { code:0xFB16 + ,upperCaseMapping:[ 0x054E, 0x0546 ] + ,lowerCaseMapping:[ 0xFB16 ] + ,titleCaseMapping:[ 0x054E, 0x0576 ] + + }, + { code:0xFB17 + ,upperCaseMapping:[ 0x0544, 0x053D ] + ,lowerCaseMapping:[ 0xFB17 ] + ,titleCaseMapping:[ 0x0544, 0x056D ] + + }, + +]; + FoldingCaseData internalFoldingCaseData[] = [ + { + code:0x0041 + ,mapping: [ 0x0061 ] + }, + { + code:0x0042 + ,mapping: [ 0x0062 ] + }, + { + code:0x0043 + ,mapping: [ 0x0063 ] + }, + { + code:0x0044 + ,mapping: [ 0x0064 ] + }, + { + code:0x0045 + ,mapping: [ 0x0065 ] + }, + { + code:0x0046 + ,mapping: [ 0x0066 ] + }, + { + code:0x0047 + ,mapping: [ 0x0067 ] + }, + { + code:0x0048 + ,mapping: [ 0x0068 ] + }, + { + code:0x0049 + ,mapping: [ 0x0069 ] + }, + { + code:0x0049 + ,mapping: [ 0x0131 ] + }, + { + code:0x004A + ,mapping: [ 0x006A ] + }, + { + code:0x004B + ,mapping: [ 0x006B ] + }, + { + code:0x004C + ,mapping: [ 0x006C ] + }, + { + code:0x004D + ,mapping: [ 0x006D ] + }, + { + code:0x004E + ,mapping: [ 0x006E ] + }, + { + code:0x004F + ,mapping: [ 0x006F ] + }, + { + code:0x0050 + ,mapping: [ 0x0070 ] + }, + { + code:0x0051 + ,mapping: [ 0x0071 ] + }, + { + code:0x0052 + ,mapping: [ 0x0072 ] + }, + { + code:0x0053 + ,mapping: [ 0x0073 ] + }, + { + code:0x0054 + ,mapping: [ 0x0074 ] + }, + { + code:0x0055 + ,mapping: [ 0x0075 ] + }, + { + code:0x0056 + ,mapping: [ 0x0076 ] + }, + { + code:0x0057 + ,mapping: [ 0x0077 ] + }, + { + code:0x0058 + ,mapping: [ 0x0078 ] + }, + { + code:0x0059 + ,mapping: [ 0x0079 ] + }, + { + code:0x005A + ,mapping: [ 0x007A ] + }, + { + code:0x00B5 + ,mapping: [ 0x03BC ] + }, + { + code:0x00C0 + ,mapping: [ 0x00E0 ] + }, + { + code:0x00C1 + ,mapping: [ 0x00E1 ] + }, + { + code:0x00C2 + ,mapping: [ 0x00E2 ] + }, + { + code:0x00C3 + ,mapping: [ 0x00E3 ] + }, + { + code:0x00C4 + ,mapping: [ 0x00E4 ] + }, + { + code:0x00C5 + ,mapping: [ 0x00E5 ] + }, + { + code:0x00C6 + ,mapping: [ 0x00E6 ] + }, + { + code:0x00C7 + ,mapping: [ 0x00E7 ] + }, + { + code:0x00C8 + ,mapping: [ 0x00E8 ] + }, + { + code:0x00C9 + ,mapping: [ 0x00E9 ] + }, + { + code:0x00CA + ,mapping: [ 0x00EA ] + }, + { + code:0x00CB + ,mapping: [ 0x00EB ] + }, + { + code:0x00CC + ,mapping: [ 0x00EC ] + }, + { + code:0x00CD + ,mapping: [ 0x00ED ] + }, + { + code:0x00CE + ,mapping: [ 0x00EE ] + }, + { + code:0x00CF + ,mapping: [ 0x00EF ] + }, + { + code:0x00D0 + ,mapping: [ 0x00F0 ] + }, + { + code:0x00D1 + ,mapping: [ 0x00F1 ] + }, + { + code:0x00D2 + ,mapping: [ 0x00F2 ] + }, + { + code:0x00D3 + ,mapping: [ 0x00F3 ] + }, + { + code:0x00D4 + ,mapping: [ 0x00F4 ] + }, + { + code:0x00D5 + ,mapping: [ 0x00F5 ] + }, + { + code:0x00D6 + ,mapping: [ 0x00F6 ] + }, + { + code:0x00D8 + ,mapping: [ 0x00F8 ] + }, + { + code:0x00D9 + ,mapping: [ 0x00F9 ] + }, + { + code:0x00DA + ,mapping: [ 0x00FA ] + }, + { + code:0x00DB + ,mapping: [ 0x00FB ] + }, + { + code:0x00DC + ,mapping: [ 0x00FC ] + }, + { + code:0x00DD + ,mapping: [ 0x00FD ] + }, + { + code:0x00DE + ,mapping: [ 0x00FE ] + }, + { + code:0x00DF + ,mapping: [ 0x0073, 0x0073 ] + }, + { + code:0x0100 + ,mapping: [ 0x0101 ] + }, + { + code:0x0102 + ,mapping: [ 0x0103 ] + }, + { + code:0x0104 + ,mapping: [ 0x0105 ] + }, + { + code:0x0106 + ,mapping: [ 0x0107 ] + }, + { + code:0x0108 + ,mapping: [ 0x0109 ] + }, + { + code:0x010A + ,mapping: [ 0x010B ] + }, + { + code:0x010C + ,mapping: [ 0x010D ] + }, + { + code:0x010E + ,mapping: [ 0x010F ] + }, + { + code:0x0110 + ,mapping: [ 0x0111 ] + }, + { + code:0x0112 + ,mapping: [ 0x0113 ] + }, + { + code:0x0114 + ,mapping: [ 0x0115 ] + }, + { + code:0x0116 + ,mapping: [ 0x0117 ] + }, + { + code:0x0118 + ,mapping: [ 0x0119 ] + }, + { + code:0x011A + ,mapping: [ 0x011B ] + }, + { + code:0x011C + ,mapping: [ 0x011D ] + }, + { + code:0x011E + ,mapping: [ 0x011F ] + }, + { + code:0x0120 + ,mapping: [ 0x0121 ] + }, + { + code:0x0122 + ,mapping: [ 0x0123 ] + }, + { + code:0x0124 + ,mapping: [ 0x0125 ] + }, + { + code:0x0126 + ,mapping: [ 0x0127 ] + }, + { + code:0x0128 + ,mapping: [ 0x0129 ] + }, + { + code:0x012A + ,mapping: [ 0x012B ] + }, + { + code:0x012C + ,mapping: [ 0x012D ] + }, + { + code:0x012E + ,mapping: [ 0x012F ] + }, + { + code:0x0130 + ,mapping: [ 0x0069, 0x0307 ] + }, + { + code:0x0130 + ,mapping: [ 0x0069 ] + }, + { + code:0x0132 + ,mapping: [ 0x0133 ] + }, + { + code:0x0134 + ,mapping: [ 0x0135 ] + }, + { + code:0x0136 + ,mapping: [ 0x0137 ] + }, + { + code:0x0139 + ,mapping: [ 0x013A ] + }, + { + code:0x013B + ,mapping: [ 0x013C ] + }, + { + code:0x013D + ,mapping: [ 0x013E ] + }, + { + code:0x013F + ,mapping: [ 0x0140 ] + }, + { + code:0x0141 + ,mapping: [ 0x0142 ] + }, + { + code:0x0143 + ,mapping: [ 0x0144 ] + }, + { + code:0x0145 + ,mapping: [ 0x0146 ] + }, + { + code:0x0147 + ,mapping: [ 0x0148 ] + }, + { + code:0x0149 + ,mapping: [ 0x02BC, 0x006E ] + }, + { + code:0x014A + ,mapping: [ 0x014B ] + }, + { + code:0x014C + ,mapping: [ 0x014D ] + }, + { + code:0x014E + ,mapping: [ 0x014F ] + }, + { + code:0x0150 + ,mapping: [ 0x0151 ] + }, + { + code:0x0152 + ,mapping: [ 0x0153 ] + }, + { + code:0x0154 + ,mapping: [ 0x0155 ] + }, + { + code:0x0156 + ,mapping: [ 0x0157 ] + }, + { + code:0x0158 + ,mapping: [ 0x0159 ] + }, + { + code:0x015A + ,mapping: [ 0x015B ] + }, + { + code:0x015C + ,mapping: [ 0x015D ] + }, + { + code:0x015E + ,mapping: [ 0x015F ] + }, + { + code:0x0160 + ,mapping: [ 0x0161 ] + }, + { + code:0x0162 + ,mapping: [ 0x0163 ] + }, + { + code:0x0164 + ,mapping: [ 0x0165 ] + }, + { + code:0x0166 + ,mapping: [ 0x0167 ] + }, + { + code:0x0168 + ,mapping: [ 0x0169 ] + }, + { + code:0x016A + ,mapping: [ 0x016B ] + }, + { + code:0x016C + ,mapping: [ 0x016D ] + }, + { + code:0x016E + ,mapping: [ 0x016F ] + }, + { + code:0x0170 + ,mapping: [ 0x0171 ] + }, + { + code:0x0172 + ,mapping: [ 0x0173 ] + }, + { + code:0x0174 + ,mapping: [ 0x0175 ] + }, + { + code:0x0176 + ,mapping: [ 0x0177 ] + }, + { + code:0x0178 + ,mapping: [ 0x00FF ] + }, + { + code:0x0179 + ,mapping: [ 0x017A ] + }, + { + code:0x017B + ,mapping: [ 0x017C ] + }, + { + code:0x017D + ,mapping: [ 0x017E ] + }, + { + code:0x017F + ,mapping: [ 0x0073 ] + }, + { + code:0x0181 + ,mapping: [ 0x0253 ] + }, + { + code:0x0182 + ,mapping: [ 0x0183 ] + }, + { + code:0x0184 + ,mapping: [ 0x0185 ] + }, + { + code:0x0186 + ,mapping: [ 0x0254 ] + }, + { + code:0x0187 + ,mapping: [ 0x0188 ] + }, + { + code:0x0189 + ,mapping: [ 0x0256 ] + }, + { + code:0x018A + ,mapping: [ 0x0257 ] + }, + { + code:0x018B + ,mapping: [ 0x018C ] + }, + { + code:0x018E + ,mapping: [ 0x01DD ] + }, + { + code:0x018F + ,mapping: [ 0x0259 ] + }, + { + code:0x0190 + ,mapping: [ 0x025B ] + }, + { + code:0x0191 + ,mapping: [ 0x0192 ] + }, + { + code:0x0193 + ,mapping: [ 0x0260 ] + }, + { + code:0x0194 + ,mapping: [ 0x0263 ] + }, + { + code:0x0196 + ,mapping: [ 0x0269 ] + }, + { + code:0x0197 + ,mapping: [ 0x0268 ] + }, + { + code:0x0198 + ,mapping: [ 0x0199 ] + }, + { + code:0x019C + ,mapping: [ 0x026F ] + }, + { + code:0x019D + ,mapping: [ 0x0272 ] + }, + { + code:0x019F + ,mapping: [ 0x0275 ] + }, + { + code:0x01A0 + ,mapping: [ 0x01A1 ] + }, + { + code:0x01A2 + ,mapping: [ 0x01A3 ] + }, + { + code:0x01A4 + ,mapping: [ 0x01A5 ] + }, + { + code:0x01A6 + ,mapping: [ 0x0280 ] + }, + { + code:0x01A7 + ,mapping: [ 0x01A8 ] + }, + { + code:0x01A9 + ,mapping: [ 0x0283 ] + }, + { + code:0x01AC + ,mapping: [ 0x01AD ] + }, + { + code:0x01AE + ,mapping: [ 0x0288 ] + }, + { + code:0x01AF + ,mapping: [ 0x01B0 ] + }, + { + code:0x01B1 + ,mapping: [ 0x028A ] + }, + { + code:0x01B2 + ,mapping: [ 0x028B ] + }, + { + code:0x01B3 + ,mapping: [ 0x01B4 ] + }, + { + code:0x01B5 + ,mapping: [ 0x01B6 ] + }, + { + code:0x01B7 + ,mapping: [ 0x0292 ] + }, + { + code:0x01B8 + ,mapping: [ 0x01B9 ] + }, + { + code:0x01BC + ,mapping: [ 0x01BD ] + }, + { + code:0x01C4 + ,mapping: [ 0x01C6 ] + }, + { + code:0x01C5 + ,mapping: [ 0x01C6 ] + }, + { + code:0x01C7 + ,mapping: [ 0x01C9 ] + }, + { + code:0x01C8 + ,mapping: [ 0x01C9 ] + }, + { + code:0x01CA + ,mapping: [ 0x01CC ] + }, + { + code:0x01CB + ,mapping: [ 0x01CC ] + }, + { + code:0x01CD + ,mapping: [ 0x01CE ] + }, + { + code:0x01CF + ,mapping: [ 0x01D0 ] + }, + { + code:0x01D1 + ,mapping: [ 0x01D2 ] + }, + { + code:0x01D3 + ,mapping: [ 0x01D4 ] + }, + { + code:0x01D5 + ,mapping: [ 0x01D6 ] + }, + { + code:0x01D7 + ,mapping: [ 0x01D8 ] + }, + { + code:0x01D9 + ,mapping: [ 0x01DA ] + }, + { + code:0x01DB + ,mapping: [ 0x01DC ] + }, + { + code:0x01DE + ,mapping: [ 0x01DF ] + }, + { + code:0x01E0 + ,mapping: [ 0x01E1 ] + }, + { + code:0x01E2 + ,mapping: [ 0x01E3 ] + }, + { + code:0x01E4 + ,mapping: [ 0x01E5 ] + }, + { + code:0x01E6 + ,mapping: [ 0x01E7 ] + }, + { + code:0x01E8 + ,mapping: [ 0x01E9 ] + }, + { + code:0x01EA + ,mapping: [ 0x01EB ] + }, + { + code:0x01EC + ,mapping: [ 0x01ED ] + }, + { + code:0x01EE + ,mapping: [ 0x01EF ] + }, + { + code:0x01F0 + ,mapping: [ 0x006A, 0x030C ] + }, + { + code:0x01F1 + ,mapping: [ 0x01F3 ] + }, + { + code:0x01F2 + ,mapping: [ 0x01F3 ] + }, + { + code:0x01F4 + ,mapping: [ 0x01F5 ] + }, + { + code:0x01F6 + ,mapping: [ 0x0195 ] + }, + { + code:0x01F7 + ,mapping: [ 0x01BF ] + }, + { + code:0x01F8 + ,mapping: [ 0x01F9 ] + }, + { + code:0x01FA + ,mapping: [ 0x01FB ] + }, + { + code:0x01FC + ,mapping: [ 0x01FD ] + }, + { + code:0x01FE + ,mapping: [ 0x01FF ] + }, + { + code:0x0200 + ,mapping: [ 0x0201 ] + }, + { + code:0x0202 + ,mapping: [ 0x0203 ] + }, + { + code:0x0204 + ,mapping: [ 0x0205 ] + }, + { + code:0x0206 + ,mapping: [ 0x0207 ] + }, + { + code:0x0208 + ,mapping: [ 0x0209 ] + }, + { + code:0x020A + ,mapping: [ 0x020B ] + }, + { + code:0x020C + ,mapping: [ 0x020D ] + }, + { + code:0x020E + ,mapping: [ 0x020F ] + }, + { + code:0x0210 + ,mapping: [ 0x0211 ] + }, + { + code:0x0212 + ,mapping: [ 0x0213 ] + }, + { + code:0x0214 + ,mapping: [ 0x0215 ] + }, + { + code:0x0216 + ,mapping: [ 0x0217 ] + }, + { + code:0x0218 + ,mapping: [ 0x0219 ] + }, + { + code:0x021A + ,mapping: [ 0x021B ] + }, + { + code:0x021C + ,mapping: [ 0x021D ] + }, + { + code:0x021E + ,mapping: [ 0x021F ] + }, + { + code:0x0220 + ,mapping: [ 0x019E ] + }, + { + code:0x0222 + ,mapping: [ 0x0223 ] + }, + { + code:0x0224 + ,mapping: [ 0x0225 ] + }, + { + code:0x0226 + ,mapping: [ 0x0227 ] + }, + { + code:0x0228 + ,mapping: [ 0x0229 ] + }, + { + code:0x022A + ,mapping: [ 0x022B ] + }, + { + code:0x022C + ,mapping: [ 0x022D ] + }, + { + code:0x022E + ,mapping: [ 0x022F ] + }, + { + code:0x0230 + ,mapping: [ 0x0231 ] + }, + { + code:0x0232 + ,mapping: [ 0x0233 ] + }, + { + code:0x023A + ,mapping: [ 0x2C65 ] + }, + { + code:0x023B + ,mapping: [ 0x023C ] + }, + { + code:0x023D + ,mapping: [ 0x019A ] + }, + { + code:0x023E + ,mapping: [ 0x2C66 ] + }, + { + code:0x0241 + ,mapping: [ 0x0242 ] + }, + { + code:0x0243 + ,mapping: [ 0x0180 ] + }, + { + code:0x0244 + ,mapping: [ 0x0289 ] + }, + { + code:0x0245 + ,mapping: [ 0x028C ] + }, + { + code:0x0246 + ,mapping: [ 0x0247 ] + }, + { + code:0x0248 + ,mapping: [ 0x0249 ] + }, + { + code:0x024A + ,mapping: [ 0x024B ] + }, + { + code:0x024C + ,mapping: [ 0x024D ] + }, + { + code:0x024E + ,mapping: [ 0x024F ] + }, + { + code:0x0345 + ,mapping: [ 0x03B9 ] + }, + { + code:0x0386 + ,mapping: [ 0x03AC ] + }, + { + code:0x0388 + ,mapping: [ 0x03AD ] + }, + { + code:0x0389 + ,mapping: [ 0x03AE ] + }, + { + code:0x038A + ,mapping: [ 0x03AF ] + }, + { + code:0x038C + ,mapping: [ 0x03CC ] + }, + { + code:0x038E + ,mapping: [ 0x03CD ] + }, + { + code:0x038F + ,mapping: [ 0x03CE ] + }, + { + code:0x0390 + ,mapping: [ 0x03B9, 0x0308, 0x0301 ] + }, + { + code:0x0391 + ,mapping: [ 0x03B1 ] + }, + { + code:0x0392 + ,mapping: [ 0x03B2 ] + }, + { + code:0x0393 + ,mapping: [ 0x03B3 ] + }, + { + code:0x0394 + ,mapping: [ 0x03B4 ] + }, + { + code:0x0395 + ,mapping: [ 0x03B5 ] + }, + { + code:0x0396 + ,mapping: [ 0x03B6 ] + }, + { + code:0x0397 + ,mapping: [ 0x03B7 ] + }, + { + code:0x0398 + ,mapping: [ 0x03B8 ] + }, + { + code:0x0399 + ,mapping: [ 0x03B9 ] + }, + { + code:0x039A + ,mapping: [ 0x03BA ] + }, + { + code:0x039B + ,mapping: [ 0x03BB ] + }, + { + code:0x039C + ,mapping: [ 0x03BC ] + }, + { + code:0x039D + ,mapping: [ 0x03BD ] + }, + { + code:0x039E + ,mapping: [ 0x03BE ] + }, + { + code:0x039F + ,mapping: [ 0x03BF ] + }, + { + code:0x03A0 + ,mapping: [ 0x03C0 ] + }, + { + code:0x03A1 + ,mapping: [ 0x03C1 ] + }, + { + code:0x03A3 + ,mapping: [ 0x03C3 ] + }, + { + code:0x03A4 + ,mapping: [ 0x03C4 ] + }, + { + code:0x03A5 + ,mapping: [ 0x03C5 ] + }, + { + code:0x03A6 + ,mapping: [ 0x03C6 ] + }, + { + code:0x03A7 + ,mapping: [ 0x03C7 ] + }, + { + code:0x03A8 + ,mapping: [ 0x03C8 ] + }, + { + code:0x03A9 + ,mapping: [ 0x03C9 ] + }, + { + code:0x03AA + ,mapping: [ 0x03CA ] + }, + { + code:0x03AB + ,mapping: [ 0x03CB ] + }, + { + code:0x03B0 + ,mapping: [ 0x03C5, 0x0308, 0x0301 ] + }, + { + code:0x03C2 + ,mapping: [ 0x03C3 ] + }, + { + code:0x03D0 + ,mapping: [ 0x03B2 ] + }, + { + code:0x03D1 + ,mapping: [ 0x03B8 ] + }, + { + code:0x03D5 + ,mapping: [ 0x03C6 ] + }, + { + code:0x03D6 + ,mapping: [ 0x03C0 ] + }, + { + code:0x03D8 + ,mapping: [ 0x03D9 ] + }, + { + code:0x03DA + ,mapping: [ 0x03DB ] + }, + { + code:0x03DC + ,mapping: [ 0x03DD ] + }, + { + code:0x03DE + ,mapping: [ 0x03DF ] + }, + { + code:0x03E0 + ,mapping: [ 0x03E1 ] + }, + { + code:0x03E2 + ,mapping: [ 0x03E3 ] + }, + { + code:0x03E4 + ,mapping: [ 0x03E5 ] + }, + { + code:0x03E6 + ,mapping: [ 0x03E7 ] + }, + { + code:0x03E8 + ,mapping: [ 0x03E9 ] + }, + { + code:0x03EA + ,mapping: [ 0x03EB ] + }, + { + code:0x03EC + ,mapping: [ 0x03ED ] + }, + { + code:0x03EE + ,mapping: [ 0x03EF ] + }, + { + code:0x03F0 + ,mapping: [ 0x03BA ] + }, + { + code:0x03F1 + ,mapping: [ 0x03C1 ] + }, + { + code:0x03F4 + ,mapping: [ 0x03B8 ] + }, + { + code:0x03F5 + ,mapping: [ 0x03B5 ] + }, + { + code:0x03F7 + ,mapping: [ 0x03F8 ] + }, + { + code:0x03F9 + ,mapping: [ 0x03F2 ] + }, + { + code:0x03FA + ,mapping: [ 0x03FB ] + }, + { + code:0x03FD + ,mapping: [ 0x037B ] + }, + { + code:0x03FE + ,mapping: [ 0x037C ] + }, + { + code:0x03FF + ,mapping: [ 0x037D ] + }, + { + code:0x0400 + ,mapping: [ 0x0450 ] + }, + { + code:0x0401 + ,mapping: [ 0x0451 ] + }, + { + code:0x0402 + ,mapping: [ 0x0452 ] + }, + { + code:0x0403 + ,mapping: [ 0x0453 ] + }, + { + code:0x0404 + ,mapping: [ 0x0454 ] + }, + { + code:0x0405 + ,mapping: [ 0x0455 ] + }, + { + code:0x0406 + ,mapping: [ 0x0456 ] + }, + { + code:0x0407 + ,mapping: [ 0x0457 ] + }, + { + code:0x0408 + ,mapping: [ 0x0458 ] + }, + { + code:0x0409 + ,mapping: [ 0x0459 ] + }, + { + code:0x040A + ,mapping: [ 0x045A ] + }, + { + code:0x040B + ,mapping: [ 0x045B ] + }, + { + code:0x040C + ,mapping: [ 0x045C ] + }, + { + code:0x040D + ,mapping: [ 0x045D ] + }, + { + code:0x040E + ,mapping: [ 0x045E ] + }, + { + code:0x040F + ,mapping: [ 0x045F ] + }, + { + code:0x0410 + ,mapping: [ 0x0430 ] + }, + { + code:0x0411 + ,mapping: [ 0x0431 ] + }, + { + code:0x0412 + ,mapping: [ 0x0432 ] + }, + { + code:0x0413 + ,mapping: [ 0x0433 ] + }, + { + code:0x0414 + ,mapping: [ 0x0434 ] + }, + { + code:0x0415 + ,mapping: [ 0x0435 ] + }, + { + code:0x0416 + ,mapping: [ 0x0436 ] + }, + { + code:0x0417 + ,mapping: [ 0x0437 ] + }, + { + code:0x0418 + ,mapping: [ 0x0438 ] + }, + { + code:0x0419 + ,mapping: [ 0x0439 ] + }, + { + code:0x041A + ,mapping: [ 0x043A ] + }, + { + code:0x041B + ,mapping: [ 0x043B ] + }, + { + code:0x041C + ,mapping: [ 0x043C ] + }, + { + code:0x041D + ,mapping: [ 0x043D ] + }, + { + code:0x041E + ,mapping: [ 0x043E ] + }, + { + code:0x041F + ,mapping: [ 0x043F ] + }, + { + code:0x0420 + ,mapping: [ 0x0440 ] + }, + { + code:0x0421 + ,mapping: [ 0x0441 ] + }, + { + code:0x0422 + ,mapping: [ 0x0442 ] + }, + { + code:0x0423 + ,mapping: [ 0x0443 ] + }, + { + code:0x0424 + ,mapping: [ 0x0444 ] + }, + { + code:0x0425 + ,mapping: [ 0x0445 ] + }, + { + code:0x0426 + ,mapping: [ 0x0446 ] + }, + { + code:0x0427 + ,mapping: [ 0x0447 ] + }, + { + code:0x0428 + ,mapping: [ 0x0448 ] + }, + { + code:0x0429 + ,mapping: [ 0x0449 ] + }, + { + code:0x042A + ,mapping: [ 0x044A ] + }, + { + code:0x042B + ,mapping: [ 0x044B ] + }, + { + code:0x042C + ,mapping: [ 0x044C ] + }, + { + code:0x042D + ,mapping: [ 0x044D ] + }, + { + code:0x042E + ,mapping: [ 0x044E ] + }, + { + code:0x042F + ,mapping: [ 0x044F ] + }, + { + code:0x0460 + ,mapping: [ 0x0461 ] + }, + { + code:0x0462 + ,mapping: [ 0x0463 ] + }, + { + code:0x0464 + ,mapping: [ 0x0465 ] + }, + { + code:0x0466 + ,mapping: [ 0x0467 ] + }, + { + code:0x0468 + ,mapping: [ 0x0469 ] + }, + { + code:0x046A + ,mapping: [ 0x046B ] + }, + { + code:0x046C + ,mapping: [ 0x046D ] + }, + { + code:0x046E + ,mapping: [ 0x046F ] + }, + { + code:0x0470 + ,mapping: [ 0x0471 ] + }, + { + code:0x0472 + ,mapping: [ 0x0473 ] + }, + { + code:0x0474 + ,mapping: [ 0x0475 ] + }, + { + code:0x0476 + ,mapping: [ 0x0477 ] + }, + { + code:0x0478 + ,mapping: [ 0x0479 ] + }, + { + code:0x047A + ,mapping: [ 0x047B ] + }, + { + code:0x047C + ,mapping: [ 0x047D ] + }, + { + code:0x047E + ,mapping: [ 0x047F ] + }, + { + code:0x0480 + ,mapping: [ 0x0481 ] + }, + { + code:0x048A + ,mapping: [ 0x048B ] + }, + { + code:0x048C + ,mapping: [ 0x048D ] + }, + { + code:0x048E + ,mapping: [ 0x048F ] + }, + { + code:0x0490 + ,mapping: [ 0x0491 ] + }, + { + code:0x0492 + ,mapping: [ 0x0493 ] + }, + { + code:0x0494 + ,mapping: [ 0x0495 ] + }, + { + code:0x0496 + ,mapping: [ 0x0497 ] + }, + { + code:0x0498 + ,mapping: [ 0x0499 ] + }, + { + code:0x049A + ,mapping: [ 0x049B ] + }, + { + code:0x049C + ,mapping: [ 0x049D ] + }, + { + code:0x049E + ,mapping: [ 0x049F ] + }, + { + code:0x04A0 + ,mapping: [ 0x04A1 ] + }, + { + code:0x04A2 + ,mapping: [ 0x04A3 ] + }, + { + code:0x04A4 + ,mapping: [ 0x04A5 ] + }, + { + code:0x04A6 + ,mapping: [ 0x04A7 ] + }, + { + code:0x04A8 + ,mapping: [ 0x04A9 ] + }, + { + code:0x04AA + ,mapping: [ 0x04AB ] + }, + { + code:0x04AC + ,mapping: [ 0x04AD ] + }, + { + code:0x04AE + ,mapping: [ 0x04AF ] + }, + { + code:0x04B0 + ,mapping: [ 0x04B1 ] + }, + { + code:0x04B2 + ,mapping: [ 0x04B3 ] + }, + { + code:0x04B4 + ,mapping: [ 0x04B5 ] + }, + { + code:0x04B6 + ,mapping: [ 0x04B7 ] + }, + { + code:0x04B8 + ,mapping: [ 0x04B9 ] + }, + { + code:0x04BA + ,mapping: [ 0x04BB ] + }, + { + code:0x04BC + ,mapping: [ 0x04BD ] + }, + { + code:0x04BE + ,mapping: [ 0x04BF ] + }, + { + code:0x04C0 + ,mapping: [ 0x04CF ] + }, + { + code:0x04C1 + ,mapping: [ 0x04C2 ] + }, + { + code:0x04C3 + ,mapping: [ 0x04C4 ] + }, + { + code:0x04C5 + ,mapping: [ 0x04C6 ] + }, + { + code:0x04C7 + ,mapping: [ 0x04C8 ] + }, + { + code:0x04C9 + ,mapping: [ 0x04CA ] + }, + { + code:0x04CB + ,mapping: [ 0x04CC ] + }, + { + code:0x04CD + ,mapping: [ 0x04CE ] + }, + { + code:0x04D0 + ,mapping: [ 0x04D1 ] + }, + { + code:0x04D2 + ,mapping: [ 0x04D3 ] + }, + { + code:0x04D4 + ,mapping: [ 0x04D5 ] + }, + { + code:0x04D6 + ,mapping: [ 0x04D7 ] + }, + { + code:0x04D8 + ,mapping: [ 0x04D9 ] + }, + { + code:0x04DA + ,mapping: [ 0x04DB ] + }, + { + code:0x04DC + ,mapping: [ 0x04DD ] + }, + { + code:0x04DE + ,mapping: [ 0x04DF ] + }, + { + code:0x04E0 + ,mapping: [ 0x04E1 ] + }, + { + code:0x04E2 + ,mapping: [ 0x04E3 ] + }, + { + code:0x04E4 + ,mapping: [ 0x04E5 ] + }, + { + code:0x04E6 + ,mapping: [ 0x04E7 ] + }, + { + code:0x04E8 + ,mapping: [ 0x04E9 ] + }, + { + code:0x04EA + ,mapping: [ 0x04EB ] + }, + { + code:0x04EC + ,mapping: [ 0x04ED ] + }, + { + code:0x04EE + ,mapping: [ 0x04EF ] + }, + { + code:0x04F0 + ,mapping: [ 0x04F1 ] + }, + { + code:0x04F2 + ,mapping: [ 0x04F3 ] + }, + { + code:0x04F4 + ,mapping: [ 0x04F5 ] + }, + { + code:0x04F6 + ,mapping: [ 0x04F7 ] + }, + { + code:0x04F8 + ,mapping: [ 0x04F9 ] + }, + { + code:0x04FA + ,mapping: [ 0x04FB ] + }, + { + code:0x04FC + ,mapping: [ 0x04FD ] + }, + { + code:0x04FE + ,mapping: [ 0x04FF ] + }, + { + code:0x0500 + ,mapping: [ 0x0501 ] + }, + { + code:0x0502 + ,mapping: [ 0x0503 ] + }, + { + code:0x0504 + ,mapping: [ 0x0505 ] + }, + { + code:0x0506 + ,mapping: [ 0x0507 ] + }, + { + code:0x0508 + ,mapping: [ 0x0509 ] + }, + { + code:0x050A + ,mapping: [ 0x050B ] + }, + { + code:0x050C + ,mapping: [ 0x050D ] + }, + { + code:0x050E + ,mapping: [ 0x050F ] + }, + { + code:0x0510 + ,mapping: [ 0x0511 ] + }, + { + code:0x0512 + ,mapping: [ 0x0513 ] + }, + { + code:0x0531 + ,mapping: [ 0x0561 ] + }, + { + code:0x0532 + ,mapping: [ 0x0562 ] + }, + { + code:0x0533 + ,mapping: [ 0x0563 ] + }, + { + code:0x0534 + ,mapping: [ 0x0564 ] + }, + { + code:0x0535 + ,mapping: [ 0x0565 ] + }, + { + code:0x0536 + ,mapping: [ 0x0566 ] + }, + { + code:0x0537 + ,mapping: [ 0x0567 ] + }, + { + code:0x0538 + ,mapping: [ 0x0568 ] + }, + { + code:0x0539 + ,mapping: [ 0x0569 ] + }, + { + code:0x053A + ,mapping: [ 0x056A ] + }, + { + code:0x053B + ,mapping: [ 0x056B ] + }, + { + code:0x053C + ,mapping: [ 0x056C ] + }, + { + code:0x053D + ,mapping: [ 0x056D ] + }, + { + code:0x053E + ,mapping: [ 0x056E ] + }, + { + code:0x053F + ,mapping: [ 0x056F ] + }, + { + code:0x0540 + ,mapping: [ 0x0570 ] + }, + { + code:0x0541 + ,mapping: [ 0x0571 ] + }, + { + code:0x0542 + ,mapping: [ 0x0572 ] + }, + { + code:0x0543 + ,mapping: [ 0x0573 ] + }, + { + code:0x0544 + ,mapping: [ 0x0574 ] + }, + { + code:0x0545 + ,mapping: [ 0x0575 ] + }, + { + code:0x0546 + ,mapping: [ 0x0576 ] + }, + { + code:0x0547 + ,mapping: [ 0x0577 ] + }, + { + code:0x0548 + ,mapping: [ 0x0578 ] + }, + { + code:0x0549 + ,mapping: [ 0x0579 ] + }, + { + code:0x054A + ,mapping: [ 0x057A ] + }, + { + code:0x054B + ,mapping: [ 0x057B ] + }, + { + code:0x054C + ,mapping: [ 0x057C ] + }, + { + code:0x054D + ,mapping: [ 0x057D ] + }, + { + code:0x054E + ,mapping: [ 0x057E ] + }, + { + code:0x054F + ,mapping: [ 0x057F ] + }, + { + code:0x0550 + ,mapping: [ 0x0580 ] + }, + { + code:0x0551 + ,mapping: [ 0x0581 ] + }, + { + code:0x0552 + ,mapping: [ 0x0582 ] + }, + { + code:0x0553 + ,mapping: [ 0x0583 ] + }, + { + code:0x0554 + ,mapping: [ 0x0584 ] + }, + { + code:0x0555 + ,mapping: [ 0x0585 ] + }, + { + code:0x0556 + ,mapping: [ 0x0586 ] + }, + { + code:0x0587 + ,mapping: [ 0x0565, 0x0582 ] + }, + { + code:0x10A0 + ,mapping: [ 0x2D00 ] + }, + { + code:0x10A1 + ,mapping: [ 0x2D01 ] + }, + { + code:0x10A2 + ,mapping: [ 0x2D02 ] + }, + { + code:0x10A3 + ,mapping: [ 0x2D03 ] + }, + { + code:0x10A4 + ,mapping: [ 0x2D04 ] + }, + { + code:0x10A5 + ,mapping: [ 0x2D05 ] + }, + { + code:0x10A6 + ,mapping: [ 0x2D06 ] + }, + { + code:0x10A7 + ,mapping: [ 0x2D07 ] + }, + { + code:0x10A8 + ,mapping: [ 0x2D08 ] + }, + { + code:0x10A9 + ,mapping: [ 0x2D09 ] + }, + { + code:0x10AA + ,mapping: [ 0x2D0A ] + }, + { + code:0x10AB + ,mapping: [ 0x2D0B ] + }, + { + code:0x10AC + ,mapping: [ 0x2D0C ] + }, + { + code:0x10AD + ,mapping: [ 0x2D0D ] + }, + { + code:0x10AE + ,mapping: [ 0x2D0E ] + }, + { + code:0x10AF + ,mapping: [ 0x2D0F ] + }, + { + code:0x10B0 + ,mapping: [ 0x2D10 ] + }, + { + code:0x10B1 + ,mapping: [ 0x2D11 ] + }, + { + code:0x10B2 + ,mapping: [ 0x2D12 ] + }, + { + code:0x10B3 + ,mapping: [ 0x2D13 ] + }, + { + code:0x10B4 + ,mapping: [ 0x2D14 ] + }, + { + code:0x10B5 + ,mapping: [ 0x2D15 ] + }, + { + code:0x10B6 + ,mapping: [ 0x2D16 ] + }, + { + code:0x10B7 + ,mapping: [ 0x2D17 ] + }, + { + code:0x10B8 + ,mapping: [ 0x2D18 ] + }, + { + code:0x10B9 + ,mapping: [ 0x2D19 ] + }, + { + code:0x10BA + ,mapping: [ 0x2D1A ] + }, + { + code:0x10BB + ,mapping: [ 0x2D1B ] + }, + { + code:0x10BC + ,mapping: [ 0x2D1C ] + }, + { + code:0x10BD + ,mapping: [ 0x2D1D ] + }, + { + code:0x10BE + ,mapping: [ 0x2D1E ] + }, + { + code:0x10BF + ,mapping: [ 0x2D1F ] + }, + { + code:0x10C0 + ,mapping: [ 0x2D20 ] + }, + { + code:0x10C1 + ,mapping: [ 0x2D21 ] + }, + { + code:0x10C2 + ,mapping: [ 0x2D22 ] + }, + { + code:0x10C3 + ,mapping: [ 0x2D23 ] + }, + { + code:0x10C4 + ,mapping: [ 0x2D24 ] + }, + { + code:0x10C5 + ,mapping: [ 0x2D25 ] + }, + { + code:0x1E00 + ,mapping: [ 0x1E01 ] + }, + { + code:0x1E02 + ,mapping: [ 0x1E03 ] + }, + { + code:0x1E04 + ,mapping: [ 0x1E05 ] + }, + { + code:0x1E06 + ,mapping: [ 0x1E07 ] + }, + { + code:0x1E08 + ,mapping: [ 0x1E09 ] + }, + { + code:0x1E0A + ,mapping: [ 0x1E0B ] + }, + { + code:0x1E0C + ,mapping: [ 0x1E0D ] + }, + { + code:0x1E0E + ,mapping: [ 0x1E0F ] + }, + { + code:0x1E10 + ,mapping: [ 0x1E11 ] + }, + { + code:0x1E12 + ,mapping: [ 0x1E13 ] + }, + { + code:0x1E14 + ,mapping: [ 0x1E15 ] + }, + { + code:0x1E16 + ,mapping: [ 0x1E17 ] + }, + { + code:0x1E18 + ,mapping: [ 0x1E19 ] + }, + { + code:0x1E1A + ,mapping: [ 0x1E1B ] + }, + { + code:0x1E1C + ,mapping: [ 0x1E1D ] + }, + { + code:0x1E1E + ,mapping: [ 0x1E1F ] + }, + { + code:0x1E20 + ,mapping: [ 0x1E21 ] + }, + { + code:0x1E22 + ,mapping: [ 0x1E23 ] + }, + { + code:0x1E24 + ,mapping: [ 0x1E25 ] + }, + { + code:0x1E26 + ,mapping: [ 0x1E27 ] + }, + { + code:0x1E28 + ,mapping: [ 0x1E29 ] + }, + { + code:0x1E2A + ,mapping: [ 0x1E2B ] + }, + { + code:0x1E2C + ,mapping: [ 0x1E2D ] + }, + { + code:0x1E2E + ,mapping: [ 0x1E2F ] + }, + { + code:0x1E30 + ,mapping: [ 0x1E31 ] + }, + { + code:0x1E32 + ,mapping: [ 0x1E33 ] + }, + { + code:0x1E34 + ,mapping: [ 0x1E35 ] + }, + { + code:0x1E36 + ,mapping: [ 0x1E37 ] + }, + { + code:0x1E38 + ,mapping: [ 0x1E39 ] + }, + { + code:0x1E3A + ,mapping: [ 0x1E3B ] + }, + { + code:0x1E3C + ,mapping: [ 0x1E3D ] + }, + { + code:0x1E3E + ,mapping: [ 0x1E3F ] + }, + { + code:0x1E40 + ,mapping: [ 0x1E41 ] + }, + { + code:0x1E42 + ,mapping: [ 0x1E43 ] + }, + { + code:0x1E44 + ,mapping: [ 0x1E45 ] + }, + { + code:0x1E46 + ,mapping: [ 0x1E47 ] + }, + { + code:0x1E48 + ,mapping: [ 0x1E49 ] + }, + { + code:0x1E4A + ,mapping: [ 0x1E4B ] + }, + { + code:0x1E4C + ,mapping: [ 0x1E4D ] + }, + { + code:0x1E4E + ,mapping: [ 0x1E4F ] + }, + { + code:0x1E50 + ,mapping: [ 0x1E51 ] + }, + { + code:0x1E52 + ,mapping: [ 0x1E53 ] + }, + { + code:0x1E54 + ,mapping: [ 0x1E55 ] + }, + { + code:0x1E56 + ,mapping: [ 0x1E57 ] + }, + { + code:0x1E58 + ,mapping: [ 0x1E59 ] + }, + { + code:0x1E5A + ,mapping: [ 0x1E5B ] + }, + { + code:0x1E5C + ,mapping: [ 0x1E5D ] + }, + { + code:0x1E5E + ,mapping: [ 0x1E5F ] + }, + { + code:0x1E60 + ,mapping: [ 0x1E61 ] + }, + { + code:0x1E62 + ,mapping: [ 0x1E63 ] + }, + { + code:0x1E64 + ,mapping: [ 0x1E65 ] + }, + { + code:0x1E66 + ,mapping: [ 0x1E67 ] + }, + { + code:0x1E68 + ,mapping: [ 0x1E69 ] + }, + { + code:0x1E6A + ,mapping: [ 0x1E6B ] + }, + { + code:0x1E6C + ,mapping: [ 0x1E6D ] + }, + { + code:0x1E6E + ,mapping: [ 0x1E6F ] + }, + { + code:0x1E70 + ,mapping: [ 0x1E71 ] + }, + { + code:0x1E72 + ,mapping: [ 0x1E73 ] + }, + { + code:0x1E74 + ,mapping: [ 0x1E75 ] + }, + { + code:0x1E76 + ,mapping: [ 0x1E77 ] + }, + { + code:0x1E78 + ,mapping: [ 0x1E79 ] + }, + { + code:0x1E7A + ,mapping: [ 0x1E7B ] + }, + { + code:0x1E7C + ,mapping: [ 0x1E7D ] + }, + { + code:0x1E7E + ,mapping: [ 0x1E7F ] + }, + { + code:0x1E80 + ,mapping: [ 0x1E81 ] + }, + { + code:0x1E82 + ,mapping: [ 0x1E83 ] + }, + { + code:0x1E84 + ,mapping: [ 0x1E85 ] + }, + { + code:0x1E86 + ,mapping: [ 0x1E87 ] + }, + { + code:0x1E88 + ,mapping: [ 0x1E89 ] + }, + { + code:0x1E8A + ,mapping: [ 0x1E8B ] + }, + { + code:0x1E8C + ,mapping: [ 0x1E8D ] + }, + { + code:0x1E8E + ,mapping: [ 0x1E8F ] + }, + { + code:0x1E90 + ,mapping: [ 0x1E91 ] + }, + { + code:0x1E92 + ,mapping: [ 0x1E93 ] + }, + { + code:0x1E94 + ,mapping: [ 0x1E95 ] + }, + { + code:0x1E96 + ,mapping: [ 0x0068, 0x0331 ] + }, + { + code:0x1E97 + ,mapping: [ 0x0074, 0x0308 ] + }, + { + code:0x1E98 + ,mapping: [ 0x0077, 0x030A ] + }, + { + code:0x1E99 + ,mapping: [ 0x0079, 0x030A ] + }, + { + code:0x1E9A + ,mapping: [ 0x0061, 0x02BE ] + }, + { + code:0x1E9B + ,mapping: [ 0x1E61 ] + }, + { + code:0x1EA0 + ,mapping: [ 0x1EA1 ] + }, + { + code:0x1EA2 + ,mapping: [ 0x1EA3 ] + }, + { + code:0x1EA4 + ,mapping: [ 0x1EA5 ] + }, + { + code:0x1EA6 + ,mapping: [ 0x1EA7 ] + }, + { + code:0x1EA8 + ,mapping: [ 0x1EA9 ] + }, + { + code:0x1EAA + ,mapping: [ 0x1EAB ] + }, + { + code:0x1EAC + ,mapping: [ 0x1EAD ] + }, + { + code:0x1EAE + ,mapping: [ 0x1EAF ] + }, + { + code:0x1EB0 + ,mapping: [ 0x1EB1 ] + }, + { + code:0x1EB2 + ,mapping: [ 0x1EB3 ] + }, + { + code:0x1EB4 + ,mapping: [ 0x1EB5 ] + }, + { + code:0x1EB6 + ,mapping: [ 0x1EB7 ] + }, + { + code:0x1EB8 + ,mapping: [ 0x1EB9 ] + }, + { + code:0x1EBA + ,mapping: [ 0x1EBB ] + }, + { + code:0x1EBC + ,mapping: [ 0x1EBD ] + }, + { + code:0x1EBE + ,mapping: [ 0x1EBF ] + }, + { + code:0x1EC0 + ,mapping: [ 0x1EC1 ] + }, + { + code:0x1EC2 + ,mapping: [ 0x1EC3 ] + }, + { + code:0x1EC4 + ,mapping: [ 0x1EC5 ] + }, + { + code:0x1EC6 + ,mapping: [ 0x1EC7 ] + }, + { + code:0x1EC8 + ,mapping: [ 0x1EC9 ] + }, + { + code:0x1ECA + ,mapping: [ 0x1ECB ] + }, + { + code:0x1ECC + ,mapping: [ 0x1ECD ] + }, + { + code:0x1ECE + ,mapping: [ 0x1ECF ] + }, + { + code:0x1ED0 + ,mapping: [ 0x1ED1 ] + }, + { + code:0x1ED2 + ,mapping: [ 0x1ED3 ] + }, + { + code:0x1ED4 + ,mapping: [ 0x1ED5 ] + }, + { + code:0x1ED6 + ,mapping: [ 0x1ED7 ] + }, + { + code:0x1ED8 + ,mapping: [ 0x1ED9 ] + }, + { + code:0x1EDA + ,mapping: [ 0x1EDB ] + }, + { + code:0x1EDC + ,mapping: [ 0x1EDD ] + }, + { + code:0x1EDE + ,mapping: [ 0x1EDF ] + }, + { + code:0x1EE0 + ,mapping: [ 0x1EE1 ] + }, + { + code:0x1EE2 + ,mapping: [ 0x1EE3 ] + }, + { + code:0x1EE4 + ,mapping: [ 0x1EE5 ] + }, + { + code:0x1EE6 + ,mapping: [ 0x1EE7 ] + }, + { + code:0x1EE8 + ,mapping: [ 0x1EE9 ] + }, + { + code:0x1EEA + ,mapping: [ 0x1EEB ] + }, + { + code:0x1EEC + ,mapping: [ 0x1EED ] + }, + { + code:0x1EEE + ,mapping: [ 0x1EEF ] + }, + { + code:0x1EF0 + ,mapping: [ 0x1EF1 ] + }, + { + code:0x1EF2 + ,mapping: [ 0x1EF3 ] + }, + { + code:0x1EF4 + ,mapping: [ 0x1EF5 ] + }, + { + code:0x1EF6 + ,mapping: [ 0x1EF7 ] + }, + { + code:0x1EF8 + ,mapping: [ 0x1EF9 ] + }, + { + code:0x1F08 + ,mapping: [ 0x1F00 ] + }, + { + code:0x1F09 + ,mapping: [ 0x1F01 ] + }, + { + code:0x1F0A + ,mapping: [ 0x1F02 ] + }, + { + code:0x1F0B + ,mapping: [ 0x1F03 ] + }, + { + code:0x1F0C + ,mapping: [ 0x1F04 ] + }, + { + code:0x1F0D + ,mapping: [ 0x1F05 ] + }, + { + code:0x1F0E + ,mapping: [ 0x1F06 ] + }, + { + code:0x1F0F + ,mapping: [ 0x1F07 ] + }, + { + code:0x1F18 + ,mapping: [ 0x1F10 ] + }, + { + code:0x1F19 + ,mapping: [ 0x1F11 ] + }, + { + code:0x1F1A + ,mapping: [ 0x1F12 ] + }, + { + code:0x1F1B + ,mapping: [ 0x1F13 ] + }, + { + code:0x1F1C + ,mapping: [ 0x1F14 ] + }, + { + code:0x1F1D + ,mapping: [ 0x1F15 ] + }, + { + code:0x1F28 + ,mapping: [ 0x1F20 ] + }, + { + code:0x1F29 + ,mapping: [ 0x1F21 ] + }, + { + code:0x1F2A + ,mapping: [ 0x1F22 ] + }, + { + code:0x1F2B + ,mapping: [ 0x1F23 ] + }, + { + code:0x1F2C + ,mapping: [ 0x1F24 ] + }, + { + code:0x1F2D + ,mapping: [ 0x1F25 ] + }, + { + code:0x1F2E + ,mapping: [ 0x1F26 ] + }, + { + code:0x1F2F + ,mapping: [ 0x1F27 ] + }, + { + code:0x1F38 + ,mapping: [ 0x1F30 ] + }, + { + code:0x1F39 + ,mapping: [ 0x1F31 ] + }, + { + code:0x1F3A + ,mapping: [ 0x1F32 ] + }, + { + code:0x1F3B + ,mapping: [ 0x1F33 ] + }, + { + code:0x1F3C + ,mapping: [ 0x1F34 ] + }, + { + code:0x1F3D + ,mapping: [ 0x1F35 ] + }, + { + code:0x1F3E + ,mapping: [ 0x1F36 ] + }, + { + code:0x1F3F + ,mapping: [ 0x1F37 ] + }, + { + code:0x1F48 + ,mapping: [ 0x1F40 ] + }, + { + code:0x1F49 + ,mapping: [ 0x1F41 ] + }, + { + code:0x1F4A + ,mapping: [ 0x1F42 ] + }, + { + code:0x1F4B + ,mapping: [ 0x1F43 ] + }, + { + code:0x1F4C + ,mapping: [ 0x1F44 ] + }, + { + code:0x1F4D + ,mapping: [ 0x1F45 ] + }, + { + code:0x1F50 + ,mapping: [ 0x03C5, 0x0313 ] + }, + { + code:0x1F52 + ,mapping: [ 0x03C5, 0x0313, 0x0300 ] + }, + { + code:0x1F54 + ,mapping: [ 0x03C5, 0x0313, 0x0301 ] + }, + { + code:0x1F56 + ,mapping: [ 0x03C5, 0x0313, 0x0342 ] + }, + { + code:0x1F59 + ,mapping: [ 0x1F51 ] + }, + { + code:0x1F5B + ,mapping: [ 0x1F53 ] + }, + { + code:0x1F5D + ,mapping: [ 0x1F55 ] + }, + { + code:0x1F5F + ,mapping: [ 0x1F57 ] + }, + { + code:0x1F68 + ,mapping: [ 0x1F60 ] + }, + { + code:0x1F69 + ,mapping: [ 0x1F61 ] + }, + { + code:0x1F6A + ,mapping: [ 0x1F62 ] + }, + { + code:0x1F6B + ,mapping: [ 0x1F63 ] + }, + { + code:0x1F6C + ,mapping: [ 0x1F64 ] + }, + { + code:0x1F6D + ,mapping: [ 0x1F65 ] + }, + { + code:0x1F6E + ,mapping: [ 0x1F66 ] + }, + { + code:0x1F6F + ,mapping: [ 0x1F67 ] + }, + { + code:0x1F80 + ,mapping: [ 0x1F00, 0x03B9 ] + }, + { + code:0x1F81 + ,mapping: [ 0x1F01, 0x03B9 ] + }, + { + code:0x1F82 + ,mapping: [ 0x1F02, 0x03B9 ] + }, + { + code:0x1F83 + ,mapping: [ 0x1F03, 0x03B9 ] + }, + { + code:0x1F84 + ,mapping: [ 0x1F04, 0x03B9 ] + }, + { + code:0x1F85 + ,mapping: [ 0x1F05, 0x03B9 ] + }, + { + code:0x1F86 + ,mapping: [ 0x1F06, 0x03B9 ] + }, + { + code:0x1F87 + ,mapping: [ 0x1F07, 0x03B9 ] + }, + { + code:0x1F88 + ,mapping: [ 0x1F00, 0x03B9 ] + }, + { + code:0x1F89 + ,mapping: [ 0x1F01, 0x03B9 ] + }, + { + code:0x1F8A + ,mapping: [ 0x1F02, 0x03B9 ] + }, + { + code:0x1F8B + ,mapping: [ 0x1F03, 0x03B9 ] + }, + { + code:0x1F8C + ,mapping: [ 0x1F04, 0x03B9 ] + }, + { + code:0x1F8D + ,mapping: [ 0x1F05, 0x03B9 ] + }, + { + code:0x1F8E + ,mapping: [ 0x1F06, 0x03B9 ] + }, + { + code:0x1F8F + ,mapping: [ 0x1F07, 0x03B9 ] + }, + { + code:0x1F90 + ,mapping: [ 0x1F20, 0x03B9 ] + }, + { + code:0x1F91 + ,mapping: [ 0x1F21, 0x03B9 ] + }, + { + code:0x1F92 + ,mapping: [ 0x1F22, 0x03B9 ] + }, + { + code:0x1F93 + ,mapping: [ 0x1F23, 0x03B9 ] + }, + { + code:0x1F94 + ,mapping: [ 0x1F24, 0x03B9 ] + }, + { + code:0x1F95 + ,mapping: [ 0x1F25, 0x03B9 ] + }, + { + code:0x1F96 + ,mapping: [ 0x1F26, 0x03B9 ] + }, + { + code:0x1F97 + ,mapping: [ 0x1F27, 0x03B9 ] + }, + { + code:0x1F98 + ,mapping: [ 0x1F20, 0x03B9 ] + }, + { + code:0x1F99 + ,mapping: [ 0x1F21, 0x03B9 ] + }, + { + code:0x1F9A + ,mapping: [ 0x1F22, 0x03B9 ] + }, + { + code:0x1F9B + ,mapping: [ 0x1F23, 0x03B9 ] + }, + { + code:0x1F9C + ,mapping: [ 0x1F24, 0x03B9 ] + }, + { + code:0x1F9D + ,mapping: [ 0x1F25, 0x03B9 ] + }, + { + code:0x1F9E + ,mapping: [ 0x1F26, 0x03B9 ] + }, + { + code:0x1F9F + ,mapping: [ 0x1F27, 0x03B9 ] + }, + { + code:0x1FA0 + ,mapping: [ 0x1F60, 0x03B9 ] + }, + { + code:0x1FA1 + ,mapping: [ 0x1F61, 0x03B9 ] + }, + { + code:0x1FA2 + ,mapping: [ 0x1F62, 0x03B9 ] + }, + { + code:0x1FA3 + ,mapping: [ 0x1F63, 0x03B9 ] + }, + { + code:0x1FA4 + ,mapping: [ 0x1F64, 0x03B9 ] + }, + { + code:0x1FA5 + ,mapping: [ 0x1F65, 0x03B9 ] + }, + { + code:0x1FA6 + ,mapping: [ 0x1F66, 0x03B9 ] + }, + { + code:0x1FA7 + ,mapping: [ 0x1F67, 0x03B9 ] + }, + { + code:0x1FA8 + ,mapping: [ 0x1F60, 0x03B9 ] + }, + { + code:0x1FA9 + ,mapping: [ 0x1F61, 0x03B9 ] + }, + { + code:0x1FAA + ,mapping: [ 0x1F62, 0x03B9 ] + }, + { + code:0x1FAB + ,mapping: [ 0x1F63, 0x03B9 ] + }, + { + code:0x1FAC + ,mapping: [ 0x1F64, 0x03B9 ] + }, + { + code:0x1FAD + ,mapping: [ 0x1F65, 0x03B9 ] + }, + { + code:0x1FAE + ,mapping: [ 0x1F66, 0x03B9 ] + }, + { + code:0x1FAF + ,mapping: [ 0x1F67, 0x03B9 ] + }, + { + code:0x1FB2 + ,mapping: [ 0x1F70, 0x03B9 ] + }, + { + code:0x1FB3 + ,mapping: [ 0x03B1, 0x03B9 ] + }, + { + code:0x1FB4 + ,mapping: [ 0x03AC, 0x03B9 ] + }, + { + code:0x1FB6 + ,mapping: [ 0x03B1, 0x0342 ] + }, + { + code:0x1FB7 + ,mapping: [ 0x03B1, 0x0342, 0x03B9 ] + }, + { + code:0x1FB8 + ,mapping: [ 0x1FB0 ] + }, + { + code:0x1FB9 + ,mapping: [ 0x1FB1 ] + }, + { + code:0x1FBA + ,mapping: [ 0x1F70 ] + }, + { + code:0x1FBB + ,mapping: [ 0x1F71 ] + }, + { + code:0x1FBC + ,mapping: [ 0x03B1, 0x03B9 ] + }, + { + code:0x1FBE + ,mapping: [ 0x03B9 ] + }, + { + code:0x1FC2 + ,mapping: [ 0x1F74, 0x03B9 ] + }, + { + code:0x1FC3 + ,mapping: [ 0x03B7, 0x03B9 ] + }, + { + code:0x1FC4 + ,mapping: [ 0x03AE, 0x03B9 ] + }, + { + code:0x1FC6 + ,mapping: [ 0x03B7, 0x0342 ] + }, + { + code:0x1FC7 + ,mapping: [ 0x03B7, 0x0342, 0x03B9 ] + }, + { + code:0x1FC8 + ,mapping: [ 0x1F72 ] + }, + { + code:0x1FC9 + ,mapping: [ 0x1F73 ] + }, + { + code:0x1FCA + ,mapping: [ 0x1F74 ] + }, + { + code:0x1FCB + ,mapping: [ 0x1F75 ] + }, + { + code:0x1FCC + ,mapping: [ 0x03B7, 0x03B9 ] + }, + { + code:0x1FD2 + ,mapping: [ 0x03B9, 0x0308, 0x0300 ] + }, + { + code:0x1FD3 + ,mapping: [ 0x03B9, 0x0308, 0x0301 ] + }, + { + code:0x1FD6 + ,mapping: [ 0x03B9, 0x0342 ] + }, + { + code:0x1FD7 + ,mapping: [ 0x03B9, 0x0308, 0x0342 ] + }, + { + code:0x1FD8 + ,mapping: [ 0x1FD0 ] + }, + { + code:0x1FD9 + ,mapping: [ 0x1FD1 ] + }, + { + code:0x1FDA + ,mapping: [ 0x1F76 ] + }, + { + code:0x1FDB + ,mapping: [ 0x1F77 ] + }, + { + code:0x1FE2 + ,mapping: [ 0x03C5, 0x0308, 0x0300 ] + }, + { + code:0x1FE3 + ,mapping: [ 0x03C5, 0x0308, 0x0301 ] + }, + { + code:0x1FE4 + ,mapping: [ 0x03C1, 0x0313 ] + }, + { + code:0x1FE6 + ,mapping: [ 0x03C5, 0x0342 ] + }, + { + code:0x1FE7 + ,mapping: [ 0x03C5, 0x0308, 0x0342 ] + }, + { + code:0x1FE8 + ,mapping: [ 0x1FE0 ] + }, + { + code:0x1FE9 + ,mapping: [ 0x1FE1 ] + }, + { + code:0x1FEA + ,mapping: [ 0x1F7A ] + }, + { + code:0x1FEB + ,mapping: [ 0x1F7B ] + }, + { + code:0x1FEC + ,mapping: [ 0x1FE5 ] + }, + { + code:0x1FF2 + ,mapping: [ 0x1F7C, 0x03B9 ] + }, + { + code:0x1FF3 + ,mapping: [ 0x03C9, 0x03B9 ] + }, + { + code:0x1FF4 + ,mapping: [ 0x03CE, 0x03B9 ] + }, + { + code:0x1FF6 + ,mapping: [ 0x03C9, 0x0342 ] + }, + { + code:0x1FF7 + ,mapping: [ 0x03C9, 0x0342, 0x03B9 ] + }, + { + code:0x1FF8 + ,mapping: [ 0x1F78 ] + }, + { + code:0x1FF9 + ,mapping: [ 0x1F79 ] + }, + { + code:0x1FFA + ,mapping: [ 0x1F7C ] + }, + { + code:0x1FFB + ,mapping: [ 0x1F7D ] + }, + { + code:0x1FFC + ,mapping: [ 0x03C9, 0x03B9 ] + }, + { + code:0x2126 + ,mapping: [ 0x03C9 ] + }, + { + code:0x212A + ,mapping: [ 0x006B ] + }, + { + code:0x212B + ,mapping: [ 0x00E5 ] + }, + { + code:0x2132 + ,mapping: [ 0x214E ] + }, + { + code:0x2160 + ,mapping: [ 0x2170 ] + }, + { + code:0x2161 + ,mapping: [ 0x2171 ] + }, + { + code:0x2162 + ,mapping: [ 0x2172 ] + }, + { + code:0x2163 + ,mapping: [ 0x2173 ] + }, + { + code:0x2164 + ,mapping: [ 0x2174 ] + }, + { + code:0x2165 + ,mapping: [ 0x2175 ] + }, + { + code:0x2166 + ,mapping: [ 0x2176 ] + }, + { + code:0x2167 + ,mapping: [ 0x2177 ] + }, + { + code:0x2168 + ,mapping: [ 0x2178 ] + }, + { + code:0x2169 + ,mapping: [ 0x2179 ] + }, + { + code:0x216A + ,mapping: [ 0x217A ] + }, + { + code:0x216B + ,mapping: [ 0x217B ] + }, + { + code:0x216C + ,mapping: [ 0x217C ] + }, + { + code:0x216D + ,mapping: [ 0x217D ] + }, + { + code:0x216E + ,mapping: [ 0x217E ] + }, + { + code:0x216F + ,mapping: [ 0x217F ] + }, + { + code:0x2183 + ,mapping: [ 0x2184 ] + }, + { + code:0x24B6 + ,mapping: [ 0x24D0 ] + }, + { + code:0x24B7 + ,mapping: [ 0x24D1 ] + }, + { + code:0x24B8 + ,mapping: [ 0x24D2 ] + }, + { + code:0x24B9 + ,mapping: [ 0x24D3 ] + }, + { + code:0x24BA + ,mapping: [ 0x24D4 ] + }, + { + code:0x24BB + ,mapping: [ 0x24D5 ] + }, + { + code:0x24BC + ,mapping: [ 0x24D6 ] + }, + { + code:0x24BD + ,mapping: [ 0x24D7 ] + }, + { + code:0x24BE + ,mapping: [ 0x24D8 ] + }, + { + code:0x24BF + ,mapping: [ 0x24D9 ] + }, + { + code:0x24C0 + ,mapping: [ 0x24DA ] + }, + { + code:0x24C1 + ,mapping: [ 0x24DB ] + }, + { + code:0x24C2 + ,mapping: [ 0x24DC ] + }, + { + code:0x24C3 + ,mapping: [ 0x24DD ] + }, + { + code:0x24C4 + ,mapping: [ 0x24DE ] + }, + { + code:0x24C5 + ,mapping: [ 0x24DF ] + }, + { + code:0x24C6 + ,mapping: [ 0x24E0 ] + }, + { + code:0x24C7 + ,mapping: [ 0x24E1 ] + }, + { + code:0x24C8 + ,mapping: [ 0x24E2 ] + }, + { + code:0x24C9 + ,mapping: [ 0x24E3 ] + }, + { + code:0x24CA + ,mapping: [ 0x24E4 ] + }, + { + code:0x24CB + ,mapping: [ 0x24E5 ] + }, + { + code:0x24CC + ,mapping: [ 0x24E6 ] + }, + { + code:0x24CD + ,mapping: [ 0x24E7 ] + }, + { + code:0x24CE + ,mapping: [ 0x24E8 ] + }, + { + code:0x24CF + ,mapping: [ 0x24E9 ] + }, + { + code:0x2C00 + ,mapping: [ 0x2C30 ] + }, + { + code:0x2C01 + ,mapping: [ 0x2C31 ] + }, + { + code:0x2C02 + ,mapping: [ 0x2C32 ] + }, + { + code:0x2C03 + ,mapping: [ 0x2C33 ] + }, + { + code:0x2C04 + ,mapping: [ 0x2C34 ] + }, + { + code:0x2C05 + ,mapping: [ 0x2C35 ] + }, + { + code:0x2C06 + ,mapping: [ 0x2C36 ] + }, + { + code:0x2C07 + ,mapping: [ 0x2C37 ] + }, + { + code:0x2C08 + ,mapping: [ 0x2C38 ] + }, + { + code:0x2C09 + ,mapping: [ 0x2C39 ] + }, + { + code:0x2C0A + ,mapping: [ 0x2C3A ] + }, + { + code:0x2C0B + ,mapping: [ 0x2C3B ] + }, + { + code:0x2C0C + ,mapping: [ 0x2C3C ] + }, + { + code:0x2C0D + ,mapping: [ 0x2C3D ] + }, + { + code:0x2C0E + ,mapping: [ 0x2C3E ] + }, + { + code:0x2C0F + ,mapping: [ 0x2C3F ] + }, + { + code:0x2C10 + ,mapping: [ 0x2C40 ] + }, + { + code:0x2C11 + ,mapping: [ 0x2C41 ] + }, + { + code:0x2C12 + ,mapping: [ 0x2C42 ] + }, + { + code:0x2C13 + ,mapping: [ 0x2C43 ] + }, + { + code:0x2C14 + ,mapping: [ 0x2C44 ] + }, + { + code:0x2C15 + ,mapping: [ 0x2C45 ] + }, + { + code:0x2C16 + ,mapping: [ 0x2C46 ] + }, + { + code:0x2C17 + ,mapping: [ 0x2C47 ] + }, + { + code:0x2C18 + ,mapping: [ 0x2C48 ] + }, + { + code:0x2C19 + ,mapping: [ 0x2C49 ] + }, + { + code:0x2C1A + ,mapping: [ 0x2C4A ] + }, + { + code:0x2C1B + ,mapping: [ 0x2C4B ] + }, + { + code:0x2C1C + ,mapping: [ 0x2C4C ] + }, + { + code:0x2C1D + ,mapping: [ 0x2C4D ] + }, + { + code:0x2C1E + ,mapping: [ 0x2C4E ] + }, + { + code:0x2C1F + ,mapping: [ 0x2C4F ] + }, + { + code:0x2C20 + ,mapping: [ 0x2C50 ] + }, + { + code:0x2C21 + ,mapping: [ 0x2C51 ] + }, + { + code:0x2C22 + ,mapping: [ 0x2C52 ] + }, + { + code:0x2C23 + ,mapping: [ 0x2C53 ] + }, + { + code:0x2C24 + ,mapping: [ 0x2C54 ] + }, + { + code:0x2C25 + ,mapping: [ 0x2C55 ] + }, + { + code:0x2C26 + ,mapping: [ 0x2C56 ] + }, + { + code:0x2C27 + ,mapping: [ 0x2C57 ] + }, + { + code:0x2C28 + ,mapping: [ 0x2C58 ] + }, + { + code:0x2C29 + ,mapping: [ 0x2C59 ] + }, + { + code:0x2C2A + ,mapping: [ 0x2C5A ] + }, + { + code:0x2C2B + ,mapping: [ 0x2C5B ] + }, + { + code:0x2C2C + ,mapping: [ 0x2C5C ] + }, + { + code:0x2C2D + ,mapping: [ 0x2C5D ] + }, + { + code:0x2C2E + ,mapping: [ 0x2C5E ] + }, + { + code:0x2C60 + ,mapping: [ 0x2C61 ] + }, + { + code:0x2C62 + ,mapping: [ 0x026B ] + }, + { + code:0x2C63 + ,mapping: [ 0x1D7D ] + }, + { + code:0x2C64 + ,mapping: [ 0x027D ] + }, + { + code:0x2C67 + ,mapping: [ 0x2C68 ] + }, + { + code:0x2C69 + ,mapping: [ 0x2C6A ] + }, + { + code:0x2C6B + ,mapping: [ 0x2C6C ] + }, + { + code:0x2C75 + ,mapping: [ 0x2C76 ] + }, + { + code:0x2C80 + ,mapping: [ 0x2C81 ] + }, + { + code:0x2C82 + ,mapping: [ 0x2C83 ] + }, + { + code:0x2C84 + ,mapping: [ 0x2C85 ] + }, + { + code:0x2C86 + ,mapping: [ 0x2C87 ] + }, + { + code:0x2C88 + ,mapping: [ 0x2C89 ] + }, + { + code:0x2C8A + ,mapping: [ 0x2C8B ] + }, + { + code:0x2C8C + ,mapping: [ 0x2C8D ] + }, + { + code:0x2C8E + ,mapping: [ 0x2C8F ] + }, + { + code:0x2C90 + ,mapping: [ 0x2C91 ] + }, + { + code:0x2C92 + ,mapping: [ 0x2C93 ] + }, + { + code:0x2C94 + ,mapping: [ 0x2C95 ] + }, + { + code:0x2C96 + ,mapping: [ 0x2C97 ] + }, + { + code:0x2C98 + ,mapping: [ 0x2C99 ] + }, + { + code:0x2C9A + ,mapping: [ 0x2C9B ] + }, + { + code:0x2C9C + ,mapping: [ 0x2C9D ] + }, + { + code:0x2C9E + ,mapping: [ 0x2C9F ] + }, + { + code:0x2CA0 + ,mapping: [ 0x2CA1 ] + }, + { + code:0x2CA2 + ,mapping: [ 0x2CA3 ] + }, + { + code:0x2CA4 + ,mapping: [ 0x2CA5 ] + }, + { + code:0x2CA6 + ,mapping: [ 0x2CA7 ] + }, + { + code:0x2CA8 + ,mapping: [ 0x2CA9 ] + }, + { + code:0x2CAA + ,mapping: [ 0x2CAB ] + }, + { + code:0x2CAC + ,mapping: [ 0x2CAD ] + }, + { + code:0x2CAE + ,mapping: [ 0x2CAF ] + }, + { + code:0x2CB0 + ,mapping: [ 0x2CB1 ] + }, + { + code:0x2CB2 + ,mapping: [ 0x2CB3 ] + }, + { + code:0x2CB4 + ,mapping: [ 0x2CB5 ] + }, + { + code:0x2CB6 + ,mapping: [ 0x2CB7 ] + }, + { + code:0x2CB8 + ,mapping: [ 0x2CB9 ] + }, + { + code:0x2CBA + ,mapping: [ 0x2CBB ] + }, + { + code:0x2CBC + ,mapping: [ 0x2CBD ] + }, + { + code:0x2CBE + ,mapping: [ 0x2CBF ] + }, + { + code:0x2CC0 + ,mapping: [ 0x2CC1 ] + }, + { + code:0x2CC2 + ,mapping: [ 0x2CC3 ] + }, + { + code:0x2CC4 + ,mapping: [ 0x2CC5 ] + }, + { + code:0x2CC6 + ,mapping: [ 0x2CC7 ] + }, + { + code:0x2CC8 + ,mapping: [ 0x2CC9 ] + }, + { + code:0x2CCA + ,mapping: [ 0x2CCB ] + }, + { + code:0x2CCC + ,mapping: [ 0x2CCD ] + }, + { + code:0x2CCE + ,mapping: [ 0x2CCF ] + }, + { + code:0x2CD0 + ,mapping: [ 0x2CD1 ] + }, + { + code:0x2CD2 + ,mapping: [ 0x2CD3 ] + }, + { + code:0x2CD4 + ,mapping: [ 0x2CD5 ] + }, + { + code:0x2CD6 + ,mapping: [ 0x2CD7 ] + }, + { + code:0x2CD8 + ,mapping: [ 0x2CD9 ] + }, + { + code:0x2CDA + ,mapping: [ 0x2CDB ] + }, + { + code:0x2CDC + ,mapping: [ 0x2CDD ] + }, + { + code:0x2CDE + ,mapping: [ 0x2CDF ] + }, + { + code:0x2CE0 + ,mapping: [ 0x2CE1 ] + }, + { + code:0x2CE2 + ,mapping: [ 0x2CE3 ] + }, + { + code:0xFB00 + ,mapping: [ 0x0066, 0x0066 ] + }, + { + code:0xFB01 + ,mapping: [ 0x0066, 0x0069 ] + }, + { + code:0xFB02 + ,mapping: [ 0x0066, 0x006C ] + }, + { + code:0xFB03 + ,mapping: [ 0x0066, 0x0066, 0x0069 ] + }, + { + code:0xFB04 + ,mapping: [ 0x0066, 0x0066, 0x006C ] + }, + { + code:0xFB05 + ,mapping: [ 0x0073, 0x0074 ] + }, + { + code:0xFB06 + ,mapping: [ 0x0073, 0x0074 ] + }, + { + code:0xFB13 + ,mapping: [ 0x0574, 0x0576 ] + }, + { + code:0xFB14 + ,mapping: [ 0x0574, 0x0565 ] + }, + { + code:0xFB15 + ,mapping: [ 0x0574, 0x056B ] + }, + { + code:0xFB16 + ,mapping: [ 0x057E, 0x0576 ] + }, + { + code:0xFB17 + ,mapping: [ 0x0574, 0x056D ] + }, + { + code:0xFF21 + ,mapping: [ 0xFF41 ] + }, + { + code:0xFF22 + ,mapping: [ 0xFF42 ] + }, + { + code:0xFF23 + ,mapping: [ 0xFF43 ] + }, + { + code:0xFF24 + ,mapping: [ 0xFF44 ] + }, + { + code:0xFF25 + ,mapping: [ 0xFF45 ] + }, + { + code:0xFF26 + ,mapping: [ 0xFF46 ] + }, + { + code:0xFF27 + ,mapping: [ 0xFF47 ] + }, + { + code:0xFF28 + ,mapping: [ 0xFF48 ] + }, + { + code:0xFF29 + ,mapping: [ 0xFF49 ] + }, + { + code:0xFF2A + ,mapping: [ 0xFF4A ] + }, + { + code:0xFF2B + ,mapping: [ 0xFF4B ] + }, + { + code:0xFF2C + ,mapping: [ 0xFF4C ] + }, + { + code:0xFF2D + ,mapping: [ 0xFF4D ] + }, + { + code:0xFF2E + ,mapping: [ 0xFF4E ] + }, + { + code:0xFF2F + ,mapping: [ 0xFF4F ] + }, + { + code:0xFF30 + ,mapping: [ 0xFF50 ] + }, + { + code:0xFF31 + ,mapping: [ 0xFF51 ] + }, + { + code:0xFF32 + ,mapping: [ 0xFF52 ] + }, + { + code:0xFF33 + ,mapping: [ 0xFF53 ] + }, + { + code:0xFF34 + ,mapping: [ 0xFF54 ] + }, + { + code:0xFF35 + ,mapping: [ 0xFF55 ] + }, + { + code:0xFF36 + ,mapping: [ 0xFF56 ] + }, + { + code:0xFF37 + ,mapping: [ 0xFF57 ] + }, + { + code:0xFF38 + ,mapping: [ 0xFF58 ] + }, + { + code:0xFF39 + ,mapping: [ 0xFF59 ] + }, + { + code:0xFF3A + ,mapping: [ 0xFF5A ] + }, + { + code:0x10400 + ,mapping: [ 0x10428 ] + }, + { + code:0x10401 + ,mapping: [ 0x10429 ] + }, + { + code:0x10402 + ,mapping: [ 0x1042A ] + }, + { + code:0x10403 + ,mapping: [ 0x1042B ] + }, + { + code:0x10404 + ,mapping: [ 0x1042C ] + }, + { + code:0x10405 + ,mapping: [ 0x1042D ] + }, + { + code:0x10406 + ,mapping: [ 0x1042E ] + }, + { + code:0x10407 + ,mapping: [ 0x1042F ] + }, + { + code:0x10408 + ,mapping: [ 0x10430 ] + }, + { + code:0x10409 + ,mapping: [ 0x10431 ] + }, + { + code:0x1040A + ,mapping: [ 0x10432 ] + }, + { + code:0x1040B + ,mapping: [ 0x10433 ] + }, + { + code:0x1040C + ,mapping: [ 0x10434 ] + }, + { + code:0x1040D + ,mapping: [ 0x10435 ] + }, + { + code:0x1040E + ,mapping: [ 0x10436 ] + }, + { + code:0x1040F + ,mapping: [ 0x10437 ] + }, + { + code:0x10410 + ,mapping: [ 0x10438 ] + }, + { + code:0x10411 + ,mapping: [ 0x10439 ] + }, + { + code:0x10412 + ,mapping: [ 0x1043A ] + }, + { + code:0x10413 + ,mapping: [ 0x1043B ] + }, + { + code:0x10414 + ,mapping: [ 0x1043C ] + }, + { + code:0x10415 + ,mapping: [ 0x1043D ] + }, + { + code:0x10416 + ,mapping: [ 0x1043E ] + }, + { + code:0x10417 + ,mapping: [ 0x1043F ] + }, + { + code:0x10418 + ,mapping: [ 0x10440 ] + }, + { + code:0x10419 + ,mapping: [ 0x10441 ] + }, + { + code:0x1041A + ,mapping: [ 0x10442 ] + }, + { + code:0x1041B + ,mapping: [ 0x10443 ] + }, + { + code:0x1041C + ,mapping: [ 0x10444 ] + }, + { + code:0x1041D + ,mapping: [ 0x10445 ] + }, + { + code:0x1041E + ,mapping: [ 0x10446 ] + }, + { + code:0x1041F + ,mapping: [ 0x10447 ] + }, + { + code:0x10420 + ,mapping: [ 0x10448 ] + }, + { + code:0x10421 + ,mapping: [ 0x10449 ] + }, + { + code:0x10422 + ,mapping: [ 0x1044A ] + }, + { + code:0x10423 + ,mapping: [ 0x1044B ] + }, + { + code:0x10424 + ,mapping: [ 0x1044C ] + }, + { + code:0x10425 + ,mapping: [ 0x1044D ] + }, + { + code:0x10426 + ,mapping: [ 0x1044E ] + }, + { + code:0x10427 + ,mapping: [ 0x1044F ] + }, + +]; + +} + +static this() { + foreach(inout entry; internalUnicodeData) + unicodeData[entry.code] = &entry; + unicodeData.rehash; + + foreach(inout entry; internalSpecialCaseData) + specialCaseData[entry.code] = &entry; + specialCaseData.rehash; + + foreach(inout entry; internalFoldingCaseData) + foldingCaseData[entry.code] = &entry; + foldingCaseData.rehash; +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/text/Util.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/text/Util.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,1421 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Apr 2004: Initial release + Dec 2006: South Seas version + + author: Kris + + + Placeholder for a variety of wee functions. These functions are all + templated with the intent of being used for arrays of char, wchar, + and dchar. However, they operate correctly with other array types + also. + + Several of these functions return an index value, representing where + some criteria was identified. When said criteria is not matched, the + functions return a value representing the array length provided to + them. That is, for those scenarios where C functions might typically + return -1 these functions return length instead. This operate nicely + with D slices: + --- + auto text = "happy:faces"; + + assert (text[0 .. locate (text, ':')] == "happy"); + + assert (text[0 .. locate (text, '!')] == "happy:faces"); + --- + + The contains() function is more convenient for trivial lookup + cases: + --- + if (contains ("fubar", '!')) + ... + --- + + Note that where some functions expect a uint as an argument, the + D template-matching algorithm will fail where an int is provided + instead. This is the typically the cause of "template not found" + errors. Also note that name overloading is not supported cleanly + by IFTI at this time, so is not applied here. + + + Applying the D "import alias" mechanism to this module is highly + recommended, in order to limit namespace pollution: + --- + import Util = tango.text.Util; + + auto s = Util.trim (" foo "); + --- + + + Function templates: + --- + trim (source) // trim whitespace + triml (source) // trim whitespace + trimr (source) // trim whitespace + strip (source, match) // trim elements + stripl (source, match) // trim left elements + stripr (source, match) // trim right elements + delimit (src, set) // split on delims + split (source, pattern) // split on pattern + splitLines (source); // split on lines + head (source, pattern, tail) // split to head & tail + join (source, postfix, output) // join text segments + repeat (source, count, output) // repeat source + replace (source, match, replacement) // replace chars + substitute (source, match, replacement) // replace patterns + contains (source, match) // has char? + containsPattern (source, match) // has pattern? + locate (source, match, start) // find char + locatePrior (source, match, start) // find prior char + locatePattern (source, match, start); // find pattern + locatePatternPrior (source, match, start); // find prior pattern + indexOf (s*, match, length) // low-level lookup + mismatch (s1*, s2*, length) // low-level compare + matching (s1*, s2*, length) // low-level compare + isSpace (match) // is whitespace? + layout (destination, format ...) // featherweight printf + lines (str) // foreach lines + quotes (str, set) // foreach quotes + delimiters (str, set) // foreach delimiters + patterns (str, pattern) // foreach patterns + --- + +*******************************************************************************/ + +module tango.text.Util; + +/****************************************************************************** + + Trim the provided array by stripping whitespace from both + ends. Returns a slice of the original content + +******************************************************************************/ + +T[] trim(T) (T[] source) +{ + T* head = source.ptr, + tail = head + source.length; + + while (head < tail && isSpace(*head)) + ++head; + + while (tail > head && isSpace(*(tail-1))) + --tail; + + return head [0 .. tail - head]; +} + +/****************************************************************************** + + Trim the provided array by stripping whitespace from the left. + Returns a slice of the original content + +******************************************************************************/ + +T[] triml(T) (T[] source) +{ + T* head = source.ptr, + tail = head + source.length; + + while (head < tail && isSpace(*head)) + ++head; + + return head [0 .. tail - head]; +} + +/****************************************************************************** + + Trim the provided array by stripping whitespace from the right. + Returns a slice of the original content + +******************************************************************************/ + +T[] trimr(T) (T[] source) +{ + T* head = source.ptr, + tail = head + source.length; + + while (tail > head && isSpace(*(tail-1))) + --tail; + + return head [0 .. tail - head]; +} + +/****************************************************************************** + + Trim the given array by stripping the provided match from + both ends. Returns a slice of the original content + +******************************************************************************/ + +T[] strip(T) (T[] source, T match) +{ + T* head = source.ptr, + tail = head + source.length; + + while (head < tail && *head is match) + ++head; + + while (tail > head && *(tail-1) is match) + --tail; + + return head [0 .. tail - head]; +} + +/****************************************************************************** + + Trim the given array by stripping the provided match from + the left hand side. Returns a slice of the original content + +******************************************************************************/ + +T[] stripl(T) (T[] source, T match) +{ + T* head = source.ptr, + tail = head + source.length; + + while (head < tail && *head is match) + ++head; + + return head [0 .. tail - head]; +} + +/****************************************************************************** + + Chop the given source by stripping the provided match from + the left hand side. Returns a slice of the original content + +******************************************************************************/ + +T[] chopl(T) (T[] source, T[] match) +{ + if (match.length <= source.length) + if (source[0 .. match.length] == match) + source = source [match.length .. $]; + + return source; +} + +/****************************************************************************** + + Chop the given source by stripping the provided match from + the right hand side. Returns a slice of the original content + +******************************************************************************/ + +T[] chopr(T) (T[] source, T[] match) +{ + if (match.length <= source.length) + if (source[$-match.length .. $] == match) + source = source [0 .. $-match.length]; + + return source; +} + +/****************************************************************************** + + Trim the given array by stripping the provided match from + the right hand side. Returns a slice of the original content + +******************************************************************************/ + +T[] stripr(T) (T[] source, T match) +{ + T* head = source.ptr, + tail = head + source.length; + + while (tail > head && *(tail-1) is match) + --tail; + + return head [0 .. tail - head]; +} + +/****************************************************************************** + + Replace all instances of one element with another (in place) + +******************************************************************************/ + +T[] replace(T) (T[] source, T match, T replacement) +{ + foreach (inout c; source) + if (c is match) + c = replacement; + return source; +} + +/****************************************************************************** + + Replace all instances of one array with another + +******************************************************************************/ + +T[] substitute(T) (T[] source, T[] match, T[] replacement) +{ + T[] output; + + foreach (s; patterns (source, match, replacement)) + output ~= s; + return output; +} + +/****************************************************************************** + + Returns whether or not the provided array contains an instance + of the given match + +******************************************************************************/ + +bool contains(T) (T[] source, T match) +{ + return indexOf (source.ptr, match, source.length) != source.length; +} + +/****************************************************************************** + + Returns whether or not the provided array contains an instance + of the given match + +******************************************************************************/ + +bool containsPattern(T) (T[] source, T[] match) +{ + return locatePattern (source, match) != source.length; +} + +/****************************************************************************** + + Return the index of the next instance of 'match' starting at + position 'start', or source.length where there is no match. + + Parameter 'start' defaults to 0 + +******************************************************************************/ + +uint locate(T, U=uint) (T[] source, T match, U start=0) +{return locate!(T) (source, match, start);} + +uint locate(T) (T[] source, T match, uint start=0) +{ + if (start > source.length) + start = source.length; + + return indexOf (source.ptr+start, match, source.length - start) + start; +} + +/****************************************************************************** + + Return the index of the prior instance of 'match' starting + just before 'start', or source.length where there is no match. + + Parameter 'start' defaults to source.length + +******************************************************************************/ + +uint locatePrior(T, U=uint) (T[] source, T match, U start=uint.max) +{return locatePrior!(T)(source, match, start);} + +uint locatePrior(T) (T[] source, T match, uint start=uint.max) +{ + if (start > source.length) + start = source.length; + + while (start > 0) + if (source[--start] is match) + return start; + return source.length; +} + +/****************************************************************************** + + Return the index of the next instance of 'match' starting at + position 'start', or source.length where there is no match. + + Parameter 'start' defaults to 0 + +******************************************************************************/ + +uint locatePattern(T, U=uint) (T[] source, T[] match, U start=0) +{return locatePattern!(T) (source, match, start);} + +uint locatePattern(T) (T[] source, T[] match, uint start=0) +{ + uint idx; + T* p = source.ptr + start; + uint extent = source.length - start - match.length + 1; + + if (match.length && extent <= source.length) + while (extent) + if ((idx = indexOf (p, match[0], extent)) is extent) + break; + else + if (matching (p+=idx, match.ptr, match.length)) + return p - source.ptr; + else + { + extent -= (idx+1); + ++p; + } + + return source.length; +} + +/****************************************************************************** + + Return the index of the prior instance of 'match' starting + just before 'start', or source.length where there is no match. + + Parameter 'start' defaults to source.length + +******************************************************************************/ + +uint locatePatternPrior(T, U=uint) (T[] source, T[] match, U start=uint.max) +{return locatePatternPrior!(T)(source, match, start);} + +uint locatePatternPrior(T) (T[] source, T[] match, uint start=uint.max) +{ + auto len = source.length; + + if (start > len) + start = len; + + if (match.length && match.length <= len) + while (start) + { + start = locatePrior (source, match[0], start); + if (start is len) + break; + else + if ((start + match.length) <= len) + if (matching (source.ptr+start, match.ptr, match.length)) + return start; + } + + return len; +} + +/****************************************************************************** + + Split the provided array on the first pattern instance, and + return the resultant head and tail. The pattern is excluded + from the two segments. + + Where a segment is not found, tail will be null and the return + value will be the original array. + +******************************************************************************/ + +T[] head(T) (T[] src, T[] pattern, out T[] tail) +{ + auto i = locatePattern (src, pattern); + if (i != src.length) + { + tail = src [i + pattern.length .. $]; + src = src [0 .. i]; + } + return src; +} + +/****************************************************************************** + + Split the provided array on the last pattern instance, and + return the resultant head and tail. The pattern is excluded + from the two segments. + + Where a segment is not found, head will be null and the return + value will be the original array. + +******************************************************************************/ + +T[] tail(T) (T[] src, T[] pattern, out T[] head) +{ + auto i = locatePatternPrior (src, pattern); + if (i != src.length) + { + head = src [0 .. i]; + src = src [i + pattern.length .. $]; + } + return src; +} + +/****************************************************************************** + + Split the provided array wherever a delimiter-set instance is + found, and return the resultant segments. The delimiters are + excluded from each of the segments. Note that delimiters are + matched as a set of alternates rather than as a pattern. + + Splitting on a single delimiter is considerably faster than + splitting upon a set of alternatives + +******************************************************************************/ + +T[][] delimit(T) (T[] src, T[] set) +{ + T[][] result; + + foreach (segment; delimiters (src, set)) + result ~= segment; + return result; +} + +/****************************************************************************** + + Split the provided array wherever a pattern instance is + found, and return the resultant segments. The pattern is + excluded from each of the segments. + +******************************************************************************/ + +T[][] split(T) (T[] src, T[] pattern) +{ + T[][] result; + + foreach (segment; patterns (src, pattern)) + result ~= segment; + return result; +} + +/****************************************************************************** + + Convert text into a set of lines, where each line is identified + by a \n or \r\n combination. The line terminator is stripped from + each resultant array + +******************************************************************************/ + +T[][] splitLines(T) (T[] src) +{ + int count; + + foreach (line; lines (src)) + ++count; + + T[][] result = new T[][count]; + + count = 0; + foreach (line; lines (src)) + result [count++] = line; + + return result; +} + +/****************************************************************************** + + Combine a series of text segments together, each appended with an + optional postfix pattern. An optional output buffer can be provided + to avoid heap activity - it should be large enough to contain the + entire output, otherwise the heap will be used instead. + + Returns a valid slice of the output, containing the concatenated + text. + +******************************************************************************/ + +T[] join(T) (T[][] src, T[] postfix=null, T[] dst=null) +{ + uint len = src.length * postfix.length; + + foreach (segment; src) + len += segment.length; + + if (dst.length < len) + dst.length = len; + + T* p = dst.ptr; + foreach (segment; src) + { + p[0 .. segment.length] = segment; + p += segment.length; + p[0 .. postfix.length] = postfix; + p += postfix.length; + } + + // remove trailing seperator + if (len) + len -= postfix.length; + return dst [0 .. len]; +} + +/****************************************************************************** + + Combine a series of text segments together, each appended with an + optional postfix pattern. An optional output buffer can be provided + to avoid heap activity - it should be large enough to contain the + entire output, otherwise the heap will be used instead. + + Returns a valid slice of the output, containing the concatenated + text. + +******************************************************************************/ + +T[] repeat(T, U=uint) (T[] src, U count, T[] dst=null) +{return repeat!(T)(src, count, dst);} + +T[] repeat(T) (T[] src, uint count, T[] dst=null) +{ + uint len = src.length * count; + if (len is 0) + return null; + + if (dst.length < len) + dst.length = len; + + for (auto p = dst.ptr; count--; p += src.length) + p[0 .. src.length] = src; + + return dst [0 .. len]; +} + +/****************************************************************************** + + Is the argument a whitespace character? + +******************************************************************************/ + +bool isSpace(T) (T c) +{ + static if (T.sizeof is 1) + return (c <= 32 && (c is ' ' | c is '\t' | c is '\r' | c is '\n' | c is '\f' | c is '\v')); + else + return (c <= 32 && (c is ' ' | c is '\t' | c is '\r' | c is '\n' | c is '\f' | c is '\v')) || (c is '\u2028' | c is '\u2029'); +} + +/****************************************************************************** + + Return whether or not the two arrays have matching content + +******************************************************************************/ + +bool matching(T, U=uint) (T* s1, T* s2, U length) +{return matching!(T) (s1, s2, length);} + +bool matching(T) (T* s1, T* s2, uint length) +{ + return mismatch(s1, s2, length) is length; +} + +/****************************************************************************** + + Returns the index of the first match in str, failing once + length is reached. Note that we return 'length' for failure + and a 0-based index on success + +******************************************************************************/ + +uint indexOf(T, U=uint) (T* str, T match, U length) +{return indexOf!(T) (str, match, length);} + +uint indexOf(T) (T* str, T match, uint length) +{ + version (D_InlineAsm_X86) + { + static if (T.sizeof == 1) + { + asm { + mov EDI, str; + mov ECX, length; + movzx EAX, match; + mov ESI, ECX; + and ESI, ESI; + jz end; + + cld; + repnz; + scasb; + jnz end; + sub ESI, ECX; + dec ESI; + end:; + mov EAX, ESI; + } + } + else static if (T.sizeof == 2) + { + asm { + mov EDI, str; + mov ECX, length; + movzx EAX, match; + mov ESI, ECX; + and ESI, ESI; + jz end; + + cld; + repnz; + scasw; + jnz end; + sub ESI, ECX; + dec ESI; + end:; + mov EAX, ESI; + } + } + else static if (T.sizeof == 4) + { + asm { + mov EDI, str; + mov ECX, length; + mov EAX, match; + mov ESI, ECX; + and ESI, ESI; + jz end; + + cld; + repnz; + scasd; + jnz end; + sub ESI, ECX; + dec ESI; + end:; + mov EAX, ESI; + } + } + else + { + auto len = length; + for (auto p=str-1; len--;) + if (*++p is match) + return p - str; + return length; + } + } + else + { + auto len = length; + for (auto p=str-1; len--;) + if (*++p is match) + return p - str; + return length; + } +} + +/****************************************************************************** + + Returns the index of a mismatch between s1 & s2, failing when + length is reached. Note that we return 'length' upon failure + (array content matches) and a 0-based index upon success. + + Use this as a faster opEquals (the assembler version). Also + provides the basis for a much faster opCmp, since the index + of the first mismatched character can be used to determine + the (greater or less than zero) return value + +******************************************************************************/ + +uint mismatch(T, U=uint) (T* s1, T* s2, U length) +{return mismatch!(T)(s1, s2, length);} + +uint mismatch(T) (T* s1, T* s2, uint length) +{ + version (D_InlineAsm_X86) + { + static if (T.sizeof == 1) + { + asm { + mov EDI, s1; + mov ESI, s2; + mov ECX, length; + mov EAX, ECX; + and EAX, EAX; + jz end; + + cld; + repz; + cmpsb; + jz end; + sub EAX, ECX; + dec EAX; + end:; + } + } + else static if (T.sizeof == 2) + { + asm { + mov EDI, s1; + mov ESI, s2; + mov ECX, length; + mov EAX, ECX; + and EAX, EAX; + jz end; + + cld; + repz; + cmpsw; + jz end; + sub EAX, ECX; + dec EAX; + sar ESI, 1; + end:; + } + } + else static if (T.sizeof == 4) + { + asm { + mov EDI, s1; + mov ESI, s2; + mov ECX, length; + mov EAX, ECX; + and EAX, EAX; + jz end; + + cld; + repz; + cmpsd; + jz end; + sub EAX, ECX; + dec EAX; + sar ESI, 2; + end:; + } + } + else + { + auto len = length; + for (auto p=s1-1; len--;) + if (*++p != *s2++) + return p - s1; + return length; + } + } + else + { + auto len = length; + for (auto p=s1-1; len--;) + if (*++p != *s2++) + return p - s1; + return length; + } +} + +/****************************************************************************** + + Freachable iterator to isolate lines. + + Converts text into a set of lines, where each line is identified + by a \n or \r\n combination. The line terminator is stripped from + each resultant array. + + --- + foreach (line; lines ("one\ntwo\nthree")) + ... + --- + +******************************************************************************/ + +LineFreach!(T) lines(T) (T[] src) +{ + LineFreach!(T) lines; + lines.src = src; + return lines; +} + +/****************************************************************************** + + Freachable iterator to isolate text elements. + + Splits the provided array wherever a delimiter-set instance is + found, and return the resultant segments. The delimiters are + excluded from each of the segments. Note that delimiters are + matched as a set of alternates rather than as a pattern. + + Splitting on a single delimiter is considerably faster than + splitting upon a set of alternatives. + + --- + foreach (segment; delimiters ("one,two;three", ",;")) + ... + --- + +******************************************************************************/ + +DelimFreach!(T) delimiters(T) (T[] src, T[] set) +{ + DelimFreach!(T) elements; + elements.set = set; + elements.src = src; + return elements; +} + +/****************************************************************************** + + Freachable iterator to isolate text elements. + + Split the provided array wherever a pattern instance is found, + and return the resultant segments. Pattern are excluded from + each of the segments, and an optional sub argument enables + replacement. + + --- + foreach (segment; patterns ("one, two, three", ", ")) + ... + --- + +******************************************************************************/ + +PatternFreach!(T) patterns(T) (T[] src, T[] pattern, T[] sub=null) +{ + PatternFreach!(T) elements; + elements.pattern = pattern; + elements.sub = sub; + elements.src = src; + return elements; +} + +/****************************************************************************** + + Freachable iterator to isolate optionally quoted text elements. + + As per elements(), but with the extension of being quote-aware; + the set of delimiters is ignored inside a pair of quotes. Note + that an unterminated quote will consume remaining content. + + --- + foreach (quote; quotes ("one two 'three four' five", " ")) + ... + --- + +******************************************************************************/ + +QuoteFreach!(T) quotes(T) (T[] src, T[] set) +{ + QuoteFreach!(T) quotes; + quotes.set = set; + quotes.src = src; + return quotes; +} + +/******************************************************************************* + + Arranges text strings in order, using indices to specify where + each particular argument should be positioned within the text. + This is handy for collating I18N components, or as a simplistic + and lightweight formatter. Indices range from zero through nine. + + --- + // write ordered text to the console + char[64] tmp; + + Cout (layout (tmp, "%1 is after %0", "zero", "one")).newline; + --- + +*******************************************************************************/ + +T[] layout(T) (T[] output, T[][] layout ...) +{ + static T[] badarg = "{index out of range}"; + static T[] toosmall = "{output buffer too small}"; + + int pos, + args; + bool state; + + args = layout.length - 1; + foreach (c; layout[0]) + { + if (state) + { + state = false; + if (c >= '0' && c <= '9') + { + uint index = c - '0'; + if (index < args) + { + T[] x = layout[index+1]; + + int limit = pos + x.length; + if (limit < output.length) + { + output [pos .. limit] = x; + pos = limit; + continue; + } + else + return toosmall; + } + else + return badarg; + } + } + else + if (c is '%') + { + state = true; + continue; + } + + if (pos < output.length) + { + output[pos] = c; + ++pos; + } + else + return toosmall; + } + + return output [0..pos]; +} + +/****************************************************************************** + + jhash() -- hash a variable-length key into a 32-bit value + + k : the key (the unaligned variable-length array of bytes) + len : the length of the key, counting by bytes + level : can be any 4-byte value + + Returns a 32-bit value. Every bit of the key affects every bit of + the return value. Every 1-bit and 2-bit delta achieves avalanche. + + About 4.3*len + 80 X86 instructions, with excellent pipelining + + The best hash table sizes are powers of 2. There is no need to do + mod a prime (mod is sooo slow!). If you need less than 32 bits, + use a bitmask. For example, if you need only 10 bits, do + + h = (h & hashmask(10)); + + In which case, the hash table should have hashsize(10) elements. + If you are hashing n strings (ub1 **)k, do it like this: + + for (i=0, h=0; i= 12) + { + a += *cast(uint *)(k+0); + b += *cast(uint *)(k+4); + c += *cast(uint *)(k+8); + + a -= b; a -= c; a ^= (c>>13); + b -= c; b -= a; b ^= (a<<8); + c -= a; c -= b; c ^= (b>>13); + a -= b; a -= c; a ^= (c>>12); + b -= c; b -= a; b ^= (a<<16); + c -= a; c -= b; c ^= (b>>5); + a -= b; a -= c; a ^= (c>>3); + b -= c; b -= a; b ^= (a<<10); + c -= a; c -= b; c ^= (b>>15); + k += 12; i -= 12; + } + + // handle the last 11 bytes + c += len; + switch (i) + { + case 11: c+=(cast(uint)k[10]<<24); + case 10: c+=(cast(uint)k[9]<<16); + case 9 : c+=(cast(uint)k[8]<<8); + case 8 : b+=(cast(uint)k[7]<<24); + case 7 : b+=(cast(uint)k[6]<<16); + case 6 : b+=(cast(uint)k[5]<<8); + case 5 : b+=(cast(uint)k[4]); + case 4 : a+=(cast(uint)k[3]<<24); + case 3 : a+=(cast(uint)k[2]<<16); + case 2 : a+=(cast(uint)k[1]<<8); + case 1 : a+=(cast(uint)k[0]); + default: + } + + a -= b; a -= c; a ^= (c>>13); + b -= c; b -= a; b ^= (a<<8); + c -= a; c -= b; c ^= (b>>13); + a -= b; a -= c; a ^= (c>>12); + b -= c; b -= a; b ^= (a<<16); + c -= a; c -= b; c ^= (b>>5); + a -= b; a -= c; a ^= (c>>3); + b -= c; b -= a; b ^= (a<<10); + c -= a; c -= b; c ^= (b>>15); + + return c; +} + +/// ditto +uint jhash (void[] x, uint c = 0) +{ + return jhash (cast(ubyte*) x.ptr, x.length, c); +} + + +/****************************************************************************** + + Helper struct for iterator lines() + +******************************************************************************/ + +private struct LineFreach(T) +{ + private T[] src; + + int opApply (int delegate (inout T[] line) dg) + { + uint ret, + pos, + mark; + T[] line; + + const T nl = '\n'; + const T cr = '\r'; + + while ((pos = locate (src, nl, mark)) < src.length) + { + auto end = pos; + if (end && src[end-1] is cr) + --end; + + line = src [mark .. end]; + if ((ret = dg (line)) != 0) + return ret; + mark = pos + 1; + } + + line = src [mark .. $]; + if (mark < src.length) + ret = dg (line); + + return ret; + } +} + +/****************************************************************************** + + Helper struct for iterator delimiters() + +******************************************************************************/ + +private struct DelimFreach(T) +{ + private T[] src; + private T[] set; + + int opApply (int delegate (inout T[] token) dg) + { + uint ret, + pos, + mark; + T[] token; + + // optimize for single delimiter case + if (set.length is 1) + while ((pos = locate (src, set[0], mark)) < src.length) + { + token = src [mark .. pos]; + if ((ret = dg (token)) != 0) + return ret; + mark = pos + 1; + } + else + if (set.length > 1) + foreach (i, elem; src) + if (contains (set, elem)) + { + token = src [mark .. i]; + if ((ret = dg (token)) != 0) + return ret; + mark = i + 1; + } + + token = src [mark .. $]; + if (mark < src.length) + ret = dg (token); + + return ret; + } +} + +/****************************************************************************** + + Helper struct for iterator patterns() + +******************************************************************************/ + +private struct PatternFreach(T) +{ + private T[] src, + sub, + pattern; + + int opApply (int delegate (inout T[] token) dg) + { + uint ret, + pos, + mark; + T[] token; + + // optimize for single-element pattern + if (pattern.length is 1) + while ((pos = locate (src, pattern[0], mark)) < src.length) + { + token = src [mark .. pos]; + if ((ret = dg(token)) != 0) + return ret; + if (sub.ptr) + if ((ret = dg(sub)) != 0) + return ret; + mark = pos + 1; + } + else + if (pattern.length > 1) + while ((pos = locatePattern (src, pattern, mark)) < src.length) + { + token = src [mark .. pos]; + if ((ret = dg(token)) != 0) + return ret; + if (sub.ptr) + if ((ret = dg(sub)) != 0) + return ret; + mark = pos + pattern.length; + } + + token = src [mark .. $]; + if (mark < src.length) + ret = dg (token); + + return ret; + } +} + +/****************************************************************************** + + Helper struct for iterator quotes() + +******************************************************************************/ + +private struct QuoteFreach(T) +{ + private T[] src; + private T[] set; + + int opApply (int delegate (inout T[] token) dg) + { + int ret, + mark; + T[] token; + + if (set.length) + for (uint i=0; i < src.length; ++i) + { + T c = src[i]; + if (c is '"' || c is '\'') + i = locate (src, c, i+1); + else + if (contains (set, c)) + { + token = src [mark .. i]; + if ((ret = dg (token)) != 0) + return ret; + mark = i + 1; + } + } + + token = src [mark .. $]; + if (mark < src.length) + ret = dg (token); + + return ret; + } +} + + +/****************************************************************************** + +******************************************************************************/ + +debug (UnitTest) +{ + //void main() {} + + unittest + { + char[64] tmp; + + assert (isSpace (' ') && !isSpace ('d')); + + assert (indexOf ("abc".ptr, 'a', 3) is 0); + assert (indexOf ("abc".ptr, 'b', 3) is 1); + assert (indexOf ("abc".ptr, 'c', 3) is 2); + assert (indexOf ("abc".ptr, 'd', 3) is 3); + + assert (indexOf ("abc"d.ptr, cast(dchar)'c', 3) is 2); + assert (indexOf ("abc"d.ptr, cast(dchar)'d', 3) is 3); + + assert (indexOf ("abc"w.ptr, cast(wchar)'c', 3) is 2); + assert (indexOf ("abc"w.ptr, cast(wchar)'d', 3) is 3); + + assert (mismatch ("abc".ptr, "abc".ptr, 3) is 3); + assert (mismatch ("abc".ptr, "abd".ptr, 3) is 2); + assert (mismatch ("abc".ptr, "acc".ptr, 3) is 1); + assert (mismatch ("abc".ptr, "ccc".ptr, 3) is 0); + + assert (mismatch ("abc"w.ptr, "abc"w.ptr, 3) is 3); + assert (mismatch ("abc"w.ptr, "acc"w.ptr, 3) is 1); + + assert (mismatch ("abc"d.ptr, "abc"d.ptr, 3) is 3); + assert (mismatch ("abc"d.ptr, "acc"d.ptr, 3) is 1); + + assert (matching ("abc".ptr, "abc".ptr, 3)); + assert (matching ("abc".ptr, "abb".ptr, 3) is false); + + assert (contains ("abc", 'a')); + assert (contains ("abc", 'b')); + assert (contains ("abc", 'c')); + assert (contains ("abc", 'd') is false); + + assert (containsPattern ("abc", "ab")); + assert (containsPattern ("abc", "bc")); + assert (containsPattern ("abc", "abc")); + assert (containsPattern ("abc", "zabc") is false); + assert (containsPattern ("abc", "abcd") is false); + assert (containsPattern ("abc", "za") is false); + assert (containsPattern ("abc", "cd") is false); + + assert (trim ("") == ""); + assert (trim (" abc ") == "abc"); + assert (trim (" ") == ""); + + assert (strip ("", '%') == ""); + assert (strip ("%abc%%%", '%') == "abc"); + assert (strip ("#####", '#') == ""); + assert (stripl ("#####", '#') == ""); + assert (stripl (" ###", ' ') == "###"); + assert (stripl ("#####", 's') == "#####"); + assert (stripr ("#####", '#') == ""); + assert (stripr ("### ", ' ') == "###"); + assert (stripr ("#####", 's') == "#####"); + + assert (replace ("abc".dup, 'b', ':') == "a:c"); + assert (substitute ("abc".dup, "bc", "x") == "ax"); + + assert (locate ("abc", 'c', 1) is 2); + + assert (locate ("abc", 'c') is 2); + assert (locate ("abc", 'a') is 0); + assert (locate ("abc", 'd') is 3); + assert (locate ("", 'c') is 0); + + assert (locatePrior ("abce", 'c') is 2); + assert (locatePrior ("abce", 'a') is 0); + assert (locatePrior ("abce", 'd') is 4); + assert (locatePrior ("abce", 'c', 3) is 2); + assert (locatePrior ("abce", 'c', 2) is 4); + assert (locatePrior ("", 'c') is 0); + + auto x = delimit ("::b", ":"); + assert (x.length is 3 && x[0] == "" && x[1] == "" && x[2] == "b"); + x = delimit ("a:bc:d", ":"); + assert (x.length is 3 && x[0] == "a" && x[1] == "bc" && x[2] == "d"); + x = delimit ("abcd", ":"); + assert (x.length is 1 && x[0] == "abcd"); + x = delimit ("abcd:", ":"); + assert (x.length is 1 && x[0] == "abcd"); + x = delimit ("a;b$c#d:e@f", ";:$#@"); + assert (x.length is 6 && x[0]=="a" && x[1]=="b" && x[2]=="c" && + x[3]=="d" && x[4]=="e" && x[5]=="f"); + + assert (locatePattern ("abcdefg", "") is 7); + assert (locatePattern ("abcdefg", "g") is 6); + assert (locatePattern ("abcdefg", "abcdefg") is 0); + assert (locatePattern ("abcdefg", "abcdefgx") is 7); + assert (locatePattern ("abcdefg", "cce") is 7); + assert (locatePattern ("abcdefg", "cde") is 2); + assert (locatePattern ("abcdefgcde", "cde", 3) is 7); + + assert (locatePatternPrior ("abcdefg", "") is 7); + assert (locatePatternPrior ("abcdefg", "cce") is 7); + assert (locatePatternPrior ("abcdefg", "cde") is 2); + assert (locatePatternPrior ("abcdefgcde", "cde", 6) is 2); + assert (locatePatternPrior ("abcdefgcde", "cde", 4) is 2); + assert (locatePatternPrior ("abcdefg", "abcdefgx") is 7); + + x = splitLines ("a\nb\n"); + assert (x.length is 2 && x[0] == "a" && x[1] == "b"); + x = splitLines ("a\r\n"); + assert (x.length is 1 && x[0] == "a"); + x = splitLines ("a"); + assert (x.length is 1 && x[0] == "a"); + x = splitLines (""); + assert (x.length is 0); + + char[][] q; + foreach (element; quotes ("1 'avcc cc ' 3", " ")) + q ~= element; + assert (q.length is 3 && q[0] == "1" && q[1] == "'avcc cc '" && q[2] == "3"); + + assert (layout (tmp, "%1,%%%c %0", "abc", "efg") == "efg,%c abc"); + + x = split ("one, two, three", ","); + assert (x.length is 3 && x[0] == "one" && x[1] == " two" && x[2] == " three"); + x = split ("one, two, three", ", "); + assert (x.length is 3 && x[0] == "one" && x[1] == "two" && x[2] == "three"); + x = split ("one, two, three", ",,"); + assert (x.length is 1 && x[0] == "one, two, three"); + + char[] h, t; + h = head ("one:two:three", ":", t); + assert (h == "one" && t == "two:three"); + h = head ("one:::two:three", ":::", t); + assert (h == "one" && t == "two:three"); + h = head ("one:two:three", "*", t); + assert (h == "one:two:three" && t is null); + + t = tail ("one:two:three", ":", h); + assert (h == "one:two" && t == "three"); + t = tail ("one:::two:three", ":::", h); + assert (h == "one" && t == "two:three"); + t = tail ("one:two:three", "*", h); + assert (t == "one:two:three" && h is null); + + assert (chopl("hello world", "hello ") == "world"); + assert (chopl("hello", "hello") == ""); + assert (chopl("hello world", " ") == "hello world"); + assert (chopl("hello world", "") == "hello world"); + + assert (chopr("hello world", " world") == "hello"); + assert (chopr("hello", "hello") == ""); + assert (chopr("hello world", " ") == "hello world"); + assert (chopr("hello world", "") == "hello world"); + + char[][] foo = ["one", "two", "three"]; + auto j = join (foo); + assert (j == "onetwothree"); + j = join (foo, ", "); + assert (j == "one, two, three"); + j = join (foo, " ", tmp); + assert (j == "one two three"); + assert (j.ptr is tmp.ptr); + + assert (repeat ("abc", 0) == ""); + assert (repeat ("abc", 1) == "abc"); + assert (repeat ("abc", 2) == "abcabc"); + assert (repeat ("abc", 4) == "abcabcabcabc"); + assert (repeat ("", 4) == ""); + char[10] rep; + assert (repeat ("abc", 0, rep) == ""); + assert (repeat ("abc", 1, rep) == "abc"); + assert (repeat ("abc", 2, rep) == "abcabc"); + assert (repeat ("", 4, rep) == ""); + } +} + + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/text/convert/Float.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/text/convert/Float.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,520 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: Nov 2005 + + author: Kris + + A set of functions for converting between string and floating- + point values. + + Applying the D "import alias" mechanism to this module is highly + recommended, in order to limit namespace pollution: + --- + import Float = tango.text.convert.Float; + + auto f = Float.parse ("3.14159"); + --- + +*******************************************************************************/ + +module tango.text.convert.Float; + +private import tango.core.Exception; + +private import Integer = tango.text.convert.Integer; + +private alias real NumType; + +private extern (C) NumType log10l(NumType x); + +/****************************************************************************** + + Constants + +******************************************************************************/ + +private enum +{ + Dec = 2, // default decimal places + Exp = 10, // default switch to scientific notation +} + +/****************************************************************************** + + Convert a formatted string of digits to a floating-point + number. Throws an exception where the input text is not + parsable in its entirety. + +******************************************************************************/ + +NumType toFloat(T) (T[] src) +{ + uint len; + + auto x = parse (src, &len); + if (len < src.length) + throw new IllegalArgumentException ("Float.toFloat :: invalid number"); + return x; +} + +/****************************************************************************** + + Template wrapper to make life simpler. Returns a text version + of the provided value. + + See format() for details + +******************************************************************************/ + +char[] toString (NumType d, uint decimals=Dec, int e=Exp) +{ + char[64] tmp = void; + + return format (tmp, d, decimals, e).dup; +} + +/****************************************************************************** + + Template wrapper to make life simpler. Returns a text version + of the provided value. + + See format() for details + +******************************************************************************/ + +wchar[] toString16 (NumType d, uint decimals=Dec, int e=Exp) +{ + wchar[64] tmp = void; + + return format (tmp, d, decimals, e).dup; +} + +/****************************************************************************** + + Template wrapper to make life simpler. Returns a text version + of the provided value. + + See format() for details + +******************************************************************************/ + +dchar[] toString32 (NumType d, uint decimals=Dec, int e=Exp) +{ + dchar[64] tmp = void; + + return format (tmp, d, decimals, e).dup; +} + +/****************************************************************************** + + Convert a float to a string. This produces pretty good results + for the most part, though one should use David Gay's dtoa package + for best accuracy. + + Note that the approach first normalizes a base10 mantissa, then + pulls digits from the left side whilst emitting them (rightward) + to the output. + + The e parameter controls the number of exponent places emitted, + and can thus control where the output switches to the scientific + notation. For example, setting e=2 for 0.01 or 10.0 would result + in normal output. Whereas setting e=1 would result in both those + values being rendered in scientific notation instead. Setting e + to 0 forces that notation on for everything. + + TODO: this should be replaced, as it is not sufficiently accurate + +******************************************************************************/ + +T[] format(T, D=double, U=uint) (T[] dst, D x, U decimals=Dec, int e=Exp) +{return format!(T)(dst, x, decimals, e);} + +T[] format(T) (T[] dst, NumType x, uint decimals=Dec, int e=Exp) +{ + static T[] inf = "-inf"; + static T[] nan = "-nan"; + + // extract the sign bit + static bool signed (NumType x) + { + static if (NumType.sizeof is 4) + return ((*cast(uint *)&x) & 0x8000_0000) != 0; + + static if (NumType.sizeof is 8) + return ((*cast(ulong *)&x) & 0x8000_0000_0000_0000) != 0; + else + { + auto pe = cast(ubyte *)&x; + return (pe[9] & 0x80) != 0; + } + } + + // strip digits from the left of a normalized base-10 number + static int toDigit (inout NumType v, inout int count) + { + int digit; + + // Don't exceed max digits storable in a real + // (-1 because the last digit is not always storable) + if (--count <= 0) + digit = 0; + else + { + // remove leading digit, and bump + digit = cast(int) v; + v = (v - digit) * 10.0; + } + return digit + '0'; + } + + // extract the sign + bool sign = signed (x); + if (sign) + x = -x; + + if (x !<>= x) + return sign ? nan : nan[1..$]; + + if (x is x.infinity) + return sign ? inf : inf[1..$]; + + // assume no exponent + int exp = 0; + + // don't scale if zero + if (x > 0.0) + { + // extract base10 exponent + exp = cast(int) log10l (x); + + // round up a bit + auto d = decimals; + if (exp < 0) + d -= exp; + x += 0.5 / pow10 (d); + + // extract base10 exponent + exp = cast(int) log10l (x); + + // normalize base10 mantissa (0 < m < 10) + int len = exp; + if (exp < 0) + x *= pow10 (len = -exp); + else + x /= pow10 (exp); + + // switch to short display if not enough space + if (len >= e) + e = 0; + } + + T* p = dst.ptr; + int count = NumType.dig; + + // emit sign + if (sign) + *p++ = '-'; + + // are we doing +/-exp format? + if (e is 0) + { + assert (dst.length > decimals + 7); + + // emit first digit, and decimal point + *p++ = toDigit (x, count); + if (decimals) + { + *p++ = '.'; + if (exp < 0) + count += exp; + } + + // emit rest of mantissa + while (decimals-- > 0) + *p++ = toDigit (x, count); + + // emit exponent, if non zero + if (exp) + { + *p++ = 'e'; + *p++ = (exp < 0) ? '-' : '+'; + if (exp < 0) + exp = -exp; + + if (exp >= 100) + { + *p++ = (exp/100) + '0'; + exp %= 100; + } + + *p++ = (exp/10) + '0'; + *p++ = (exp%10) + '0'; + } + } + else + { + assert (dst.length >= (((exp < 0) ? 0 : exp) + decimals + 1)); + + // if fraction only, emit a leading zero + if (exp < 0) + *p++ = '0'; + else + // emit all digits to the left of point + for (; exp >= 0; --exp) + *p++ = toDigit (x, count); + + // emit point + if (decimals) + *p++ = '.'; + + // emit leading fractional zeros? + for (++exp; exp < 0 && decimals > 0; --decimals, ++exp) + *p++ = '0'; + + // output remaining digits, if any. Trailing + // zeros are also returned from toDigit() + while (decimals-- > 0) + *p++ = toDigit (x, count); + } + + return dst [0..(p - dst.ptr)]; +} + + +/****************************************************************************** + + Convert a formatted string of digits to a floating-point number. + Good for general use, but use David Gay's dtoa package if serious + rounding adjustments should be applied. + +******************************************************************************/ + +NumType parse(T) (T[] src, uint* ate=null) +{ + T c; + T* p; + int exp; + bool sign; + uint radix; + NumType value = 0.0; + + // remove leading space, and sign + c = *(p = src.ptr + Integer.trim (src, sign, radix)); + + // handle non-decimal representations + if (radix != 10) + { + long v = Integer.parse (src, radix, ate); + return *cast(NumType*) &v; + } + + // set begin and end checks + auto begin = p; + auto end = src.ptr + src.length; + + // read leading digits; note that leading + // zeros are simply multiplied away + while (c >= '0' && c <= '9' && p < end) + { + value = value * 10 + (c - '0'); + c = *++p; + } + + // gobble up the point + if (c is '.' && p < end) + c = *++p; + + // read fractional digits; note that we accumulate + // all digits ... very long numbers impact accuracy + // to a degree, but perhaps not as much as one might + // expect. A prior version limited the digit count, + // but did not show marked improvement. For maximum + // accuracy when reading and writing, use David Gay's + // dtoa package instead + while (c >= '0' && c <= '9' && p < end) + { + value = value * 10 + (c - '0'); + c = *++p; + --exp; + } + + // did we get something? + if (value) + { + // parse base10 exponent? + if ((c is 'e' || c is 'E') && p < end ) + { + uint eaten; + exp += Integer.parse (src[(++p-src.ptr) .. $], 0, &eaten); + p += eaten; + } + + // adjust mantissa; note that the exponent has + // already been adjusted for fractional digits + if (exp < 0) + value /= pow10 (-exp); + else + value *= pow10 (exp); + } + else + // was it was nan instead? + if (p is begin) + if (p[0..3] == "inf") + p += 3, value = value.infinity; + else + if (p[0..3] == "nan") + p += 3, value = value.nan; + + // set parse length, and return value + if (ate) + *ate = p - src.ptr; + + if (sign) + value = -value; + return value; +} + +/****************************************************************************** + + Truncate trailing '0' and '.' from a string, such that 200.000 + becomes 200, and 20.10 becomes 20.1 + + Returns a potentially shorter slice of what you give it. + +******************************************************************************/ + +T[] truncate(T) (T[] s) +{ + auto tmp = s; + auto i = tmp.length; + foreach (idx, c; tmp) + if (c is '.') + while (--i >= idx) + if (tmp[i] != '0') + { + if (tmp[i] is '.') + --i; + s = tmp [0 .. i+1]; + while (--i >= idx) + if (tmp[i] is 'e') + return tmp; + break; + } + return s; +} + +/****************************************************************************** + + Internal function to convert an exponent specifier to a floating + point value. + +******************************************************************************/ + +private NumType pow10 (uint exp) +{ + static NumType[] Powers = + [ + 1.0e1L, + 1.0e2L, + 1.0e4L, + 1.0e8L, + 1.0e16L, + 1.0e32L, + 1.0e64L, + 1.0e128L, + 1.0e256L, + ]; + + if (exp >= 512) + throw new IllegalArgumentException ("Float.pow10 :: exponent too large"); + + NumType mult = 1.0; + foreach (NumType power; Powers) + { + if (exp & 1) + mult *= power; + if ((exp >>= 1) is 0) + break; + } + return mult; +} + + +/****************************************************************************** + +******************************************************************************/ + +debug (UnitTest) +{ + unittest + { + char[64] tmp; + + auto f = parse ("nan"); + assert (format(tmp, f) == "nan"); + f = parse ("inf"); + assert (format(tmp, f) == "inf"); + f = parse ("-nan"); + assert (format(tmp, f) == "-nan"); + f = parse (" -inf"); + assert (format(tmp, f) == "-inf"); + + assert (format (tmp, 3.14159, 6) == "3.141590"); + assert (format (tmp, 3.14159, 4) == "3.1416"); + assert (parse ("3.5") == 3.5); + assert (format(tmp, parse ("3.14159"), 6) == "3.141590"); + } +} + + +debug (Float) +{ + import tango.io.Console; + + void main() + { + char[20] tmp; + + Cout (format(tmp, 1)).newline; + Cout (format(tmp, 0)).newline; + Cout (format(tmp, 0.000001)).newline; + + Cout (format(tmp, 3.14159, 6, 0)).newline; + Cout (format(tmp, 3e100, 6, 3)).newline; + Cout (format(tmp, 314159, 6)).newline; + Cout (format(tmp, 314159123213, 6, 15)).newline; + Cout (format(tmp, 3.14159, 6, 2)).newline; + Cout (format(tmp, 3.14159, 6, 2)).newline; + Cout (format(tmp, 0.00003333, 6, 2)).newline; + Cout (format(tmp, 0.00333333, 6, 3)).newline; + Cout (format(tmp, 0.03333333, 6, 2)).newline; + Cout.newline; + + Cout (format(tmp, -3.14159, 6, 0)).newline; + Cout (format(tmp, -3e100, 6, 3)).newline; + Cout (format(tmp, -314159, 6)).newline; + Cout (format(tmp, -314159123213, 6, 15)).newline; + Cout (format(tmp, -3.14159, 6, 2)).newline; + Cout (format(tmp, -3.14159, 6, 2)).newline; + Cout (format(tmp, -0.00003333, 6, 2)).newline; + Cout (format(tmp, -0.00333333, 6, 3)).newline; + Cout (format(tmp, -0.03333333, 6, 2)).newline; + Cout.newline; + + Cout (truncate(format(tmp, 30, 6))).newline; + Cout (truncate(format(tmp, 3.14159, 6, 0))).newline; + Cout (truncate(format(tmp, 3e100, 6, 3))).newline; + Cout (truncate(format(tmp, 314159, 6))).newline; + Cout (truncate(format(tmp, 314159123213, 6, 15))).newline; + Cout (truncate(format(tmp, 3.14159, 6, 2))).newline; + Cout (truncate(format(tmp, 3.14159, 6, 2))).newline; + Cout (truncate(format(tmp, 0.00003333, 6, 2))).newline; + Cout (truncate(format(tmp, 0.00333333, 6, 3))).newline; + Cout (truncate(format(tmp, 0.03333333, 6, 2))).newline; + + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/text/convert/Format.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/text/convert/Format.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,74 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Sep 2007: Initial release + version: Nov 2007: Added stream wrappers + + author: Kris + +*******************************************************************************/ + +module tango.text.convert.Format; + +private import tango.io.model.IConduit; + +private import tango.text.convert.Layout; + +/****************************************************************************** + + Constructs a global utf8 instance of Layout + +******************************************************************************/ + +public Layout!(char) Format; + +static this() +{ + Format = new Layout!(char); +} + +/****************************************************************************** + + Global function to format into a stream + +******************************************************************************/ + +deprecated void format (OutputStream output, char[] fmt, ...) +{ + Format.convert ((char[] s){return output.write(s);}, _arguments, _argptr, fmt); +} + +/****************************************************************************** + + Global function to format into a stream, and add a newline + +******************************************************************************/ + +deprecated void formatln (OutputStream output, char[] fmt, ...) +{ + version (Win32) + const char[] Eol = "\r\n"; + else + const char[] Eol = "\n"; + + Format.convert ((char[] s){return output.write(s);}, _arguments, _argptr, fmt); + output.write (Eol); +} + + +/****************************************************************************** + +******************************************************************************/ + +debug (Format) +{ + import tango.io.Console; + + void main() + { + formatln (Cout.stream, "hello {}", "world"); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/text/convert/Integer.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/text/convert/Integer.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,598 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: Nov 2005 + + author: Kris + + A set of functions for converting between string and integer + values. + + Applying the D "import alias" mechanism to this module is highly + recommended, in order to limit namespace pollution: + --- + import Integer = tango.text.convert.Integer; + + auto i = Integer.parse ("32767"); + --- + +*******************************************************************************/ + +module tango.text.convert.Integer; + +private import tango.core.Exception; + +/****************************************************************************** + + Style identifiers + +******************************************************************************/ + +enum Style +{ + Signed = 'd', /// signed decimal + Binary = 'b', /// binary output + Octal = 'o', /// octal output + Hex = 'x', /// lowercase hexadecimal + HexUpper = 'X', /// uppercase hexadecimal + Unsigned = 'u', /// unsigned integer +} + +/****************************************************************************** + + Style flags + +******************************************************************************/ + +enum Flags +{ + None = 0x00, /// no flags + Prefix = 0x01, /// prefix value with type + Zero = 0x02, /// prefix value with zeroes + Plus = 0x04, /// prefix decimal with '+' + Space = 0x08, /// prefix decimal with space + Throw = 0x10, /// throw on output truncation +} + +/****************************************************************************** + + Parse an integer value from the provided 'digits' string. + + The string is inspected for a sign and an optional radix + prefix. A radix may be provided as an argument instead, + whereupon it must match the prefix (where present). When + radix is set to zero, conversion will default to decimal. + + Throws an exception where the input text is not parsable + in its entirety. + +******************************************************************************/ + +int toInt(T, U=uint) (T[] digits, U radix=0) +{return toInt!(T)(digits, radix);} + +int toInt(T) (T[] digits, uint radix=0) +{ + auto x = toLong (digits, radix); + if (x > int.max) + throw new IllegalArgumentException ("Integer.toInt :: integer overflow"); + return cast(int) x; +} + +/****************************************************************************** + + Parse an integer value from the provided 'digits' string. + + The string is inspected for a sign and an optional radix + prefix. A radix may be provided as an argument instead, + whereupon it must match the prefix (where present). When + radix is set to zero, conversion will default to decimal. + + Throws an exception where the input text is not parsable + in its entirety. + +******************************************************************************/ + +long toLong(T, U=uint) (T[] digits, U radix=0) +{return toLong!(T)(digits, radix);} + +long toLong(T) (T[] digits, uint radix=0) +{ + uint len; + + auto x = parse (digits, radix, &len); + if (len < digits.length) + throw new IllegalArgumentException ("Integer.toLong :: invalid literal"); + return x; +} + +/****************************************************************************** + + Template wrapper to make life simpler. Returns a text version + of the provided value. + + See format() for details + +******************************************************************************/ + +char[] toString (long i, Style t=Style.Signed, Flags f=Flags.None) +{ + char[66] tmp = void; + + return format (tmp, i, t, f).dup; +} + +/****************************************************************************** + + Template wrapper to make life simpler. Returns a text version + of the provided value. + + See format() for details + +******************************************************************************/ + +wchar[] toString16 (long i, Style t=Style.Signed, Flags f=Flags.None) +{ + wchar[66] tmp = void; + + return format (tmp, i, t, f).dup; +} + +/****************************************************************************** + + Template wrapper to make life simpler. Returns a text version + of the provided value. + + See format() for details + +******************************************************************************/ + +dchar[] toString32 (long i, Style t=Style.Signed, Flags f=Flags.None) +{ + dchar[66] tmp = void; + + return format (tmp, i, t, f).dup; +} + +/******************************************************************************* + + Style numeric values into the provided output buffer. The + following types are supported: + + Unsigned - unsigned decimal + Signed - signed decimal + Octal - octal + Hex - lowercase hexadecimal + HexUpper - uppercase hexadecimal + Binary - binary + + Modifiers supported include: + + Prefix - prefix the conversion with a type identifier + Plus - prefix positive decimals with a '+' + Space - prefix positive decimals with one space + Zero - left-pad the number with zeros + Throw - throw an exception when output would be truncated + + The provided 'dst' buffer should be sufficiently large + enough to house the output. A 64-element array is often + the maximum required (for a padded binary 64-bit string) + +*******************************************************************************/ + +T[] format(T, U=long) (T[] dst, U i, Style fmt=Style.Signed, Flags flags=Flags.None) +{return format!(T)(dst, i, fmt, flags);} + +T[] format(T) (T[] dst, long i, Style fmt=Style.Signed, Flags flags=Flags.None) +{ + T[] prefix; + auto len = dst.length; + + static T[] error (T[] msg) + { + if (1 & Flags.Throw) + throw new IllegalArgumentException ("Integer.format :: invalid arguments"); + return msg; + } + + // must have some buffer space to operate within! + if (len) + { + uint radix; + T[] numbers = "0123456789abcdef"; + + // pre-conversion setup + switch (cast(byte) fmt) + { + case 'd': + case 'D': + if (i < 0) + { + prefix = "-"; + i = -i; + } + else + if (flags & Flags.Space) + prefix = " "; + else + if (flags & Flags.Plus) + prefix = "+"; + // fall through! + case 'u': + case 'U': + radix = 10; + break; + + case 'b': + case 'B': + radix = 2; + if (flags & Flags.Prefix) + prefix = "0b"; + break; + + case 'o': + case 'O': + radix = 8; + if (flags & Flags.Prefix) + prefix = "0o"; + break; + + case 'x': + radix = 16; + if (flags & Flags.Prefix) + prefix = "0x"; + break; + + case 'X': + radix = 16; + numbers = "0123456789ABCDEF"; + if (flags & Flags.Prefix) + prefix = "0X"; + break; + + default: + return error (cast(T[])"{unknown format '"~cast(T)fmt~"'}"); + } + + // convert number to text + T* p = dst.ptr + len; + if (uint.max >= cast(ulong) i) + { + uint v = cast (uint) i; + do { + *--p = numbers[v % radix]; + } while ((v /= radix) && --len); + } + else + { + ulong v = cast (ulong) i; + do { + *--p = numbers[cast(uint) (v % radix)]; + } while ((v /= radix) && --len); + } + } + + // are we about to overflow? + if (len > prefix.length) + { + len -= prefix.length + 1; + + // prefix number with zeros? + if (flags & Flags.Zero) + { + dst [prefix.length .. len + prefix.length] = '0'; + len = 0; + } + + // write optional prefix string ... + dst [len .. len + prefix.length] = prefix[]; + } + else + return error ("{output width too small}"); + + // return slice of provided output buffer + return dst [len .. $]; +} + + +/****************************************************************************** + + Parse an integer value from the provided 'digits' string. + + The string is inspected for a sign and an optional radix + prefix. A radix may be provided as an argument instead, + whereupon it must match the prefix (where present). When + radix is set to zero, conversion will default to decimal. + + A non-null 'ate' will return the number of characters used + to construct the returned value. + +******************************************************************************/ + +long parse(T, U=uint) (T[] digits, U radix=0, uint* ate=null) +{return parse!(T)(digits, radix, ate);} + +long parse(T) (T[] digits, uint radix=0, uint* ate=null) +{ + bool sign; + + auto eaten = trim (digits, sign, radix); + auto value = convert (digits[eaten..$], radix, ate); + + if (ate) + *ate += eaten; + + return cast(long) (sign ? -value : value); +} + +/****************************************************************************** + + Convert the provided 'digits' into an integer value, + without checking for a sign or radix. The radix defaults + to decimal (10). + + Returns the value and updates 'ate' with the number of + characters consumed. + +******************************************************************************/ + +ulong convert(T, U=uint) (T[] digits, U radix=10, uint* ate=null) +{return convert!(T)(digits, radix, ate);} + +ulong convert(T) (T[] digits, uint radix=10, uint* ate=null) +{ + uint eaten; + ulong value; + + foreach (c; digits) + { + if (c >= '0' && c <= '9') + {} + else + if (c >= 'a' && c <= 'f') + c -= 39; + else + if (c >= 'A' && c <= 'F') + c -= 7; + else + break; + + if ((c -= '0') < radix) + { + value = value * radix + c; + ++eaten; + } + else + break; + } + + if (ate) + *ate = eaten; + + return value; +} + + +/****************************************************************************** + + Strip leading whitespace, extract an optional +/- sign, + and an optional radix prefix. If the radix value matches + an optional prefix, or the radix is zero, the prefix will + be consumed and assigned. Where the radix is non zero and + does not match an explicit prefix, the latter will remain + unconsumed. Otherwise, radix will default to 10. + + Returns the number of characters consumed. + +******************************************************************************/ + +uint trim(T, U=uint) (T[] digits, inout bool sign, inout U radix) +{return trim!(T)(digits, sign, radix);} + +uint trim(T) (T[] digits, inout bool sign, inout uint radix) +{ + T c; + T* p = digits.ptr; + int len = digits.length; + + if (len) + { + // strip off whitespace and sign characters + for (c = *p; len; c = *++p, --len) + if (c is ' ' || c is '\t') + {} + else + if (c is '-') + sign = true; + else + if (c is '+') + sign = false; + else + break; + + // strip off a radix specifier also? + auto r = radix; + if (c is '0' && len > 1) + switch (*++p) + { + case 'x': + case 'X': + r = 16, ++p; + break; + + case 'b': + case 'B': + r = 2, ++p; + break; + + case 'o': + case 'O': + r = 8, ++p; + break; + + default: + break; + } + + // default the radix to 10 + if (r is 0) + radix = 10; + else + // explicit radix must match (optional) prefix + if (radix != r) + if (radix) + --p; + else + radix = r; + } + + // return number of characters eaten + return (p - digits.ptr); +} + + +/****************************************************************************** + + quick & dirty text-to-unsigned int converter. Use only when you + know what the content is, or use parse() or convert() instead. + + Return the parsed uint + +******************************************************************************/ + +uint atoi(T) (T[] s) +{ + uint value; + + foreach (c; s) + if (c >= '0' && c <= '9') + value = value * 10 + (c - '0'); + else + break; + return value; +} + + +/****************************************************************************** + + quick & dirty unsigned to text converter, where the provided output + must be large enough to house the result (10 digits in the largest + case). For mainstream use, consider utilizing format() instead. + + Returns a populated slice of the provided output + +******************************************************************************/ + +T[] itoa(T, U=uint) (T[] output, U value) +{return itoa!(T)(output, value);} + +T[] itoa(T) (T[] output, uint value) +{ + T* p = output.ptr + output.length; + + do { + *--p = value % 10 + '0'; + } while (value /= 10); + return output[p-output.ptr .. $]; +} + + +/****************************************************************************** + +******************************************************************************/ + +debug (UnitTest) +{ + unittest + { + char[64] tmp; + + assert (toInt("1") is 1); + assert (toLong("1") is 1); + assert (toInt("1", 10) is 1); + assert (toLong("1", 10) is 1); + + assert (atoi ("12345") is 12345); + assert (itoa (tmp, 12345) == "12345"); + + assert(parse( "0"w ) == 0 ); + assert(parse( "1"w ) == 1 ); + assert(parse( "-1"w ) == -1 ); + assert(parse( "+1"w ) == 1 ); + + // numerical limits + assert(parse( "-2147483648" ) == int.min ); + assert(parse( "2147483647" ) == int.max ); + assert(parse( "4294967295" ) == uint.max ); + + assert(parse( "-9223372036854775808" ) == long.min ); + assert(parse( "9223372036854775807" ) == long.max ); + assert(parse( "18446744073709551615" ) == ulong.max ); + + // hex + assert(parse( "a", 16) == 0x0A ); + assert(parse( "b", 16) == 0x0B ); + assert(parse( "c", 16) == 0x0C ); + assert(parse( "d", 16) == 0x0D ); + assert(parse( "e", 16) == 0x0E ); + assert(parse( "f", 16) == 0x0F ); + assert(parse( "A", 16) == 0x0A ); + assert(parse( "B", 16) == 0x0B ); + assert(parse( "C", 16) == 0x0C ); + assert(parse( "D", 16) == 0x0D ); + assert(parse( "E", 16) == 0x0E ); + assert(parse( "F", 16) == 0x0F ); + assert(parse( "FFFF", 16) == ushort.max ); + assert(parse( "ffffFFFF", 16) == uint.max ); + assert(parse( "ffffFFFFffffFFFF", 16u ) == ulong.max ); + // oct + assert(parse( "55", 8) == 055 ); + assert(parse( "100", 8) == 0100 ); + // bin + assert(parse( "10000", 2) == 0x10 ); + // trim + assert(parse( " \t20") == 20 ); + assert(parse( " \t-20") == -20 ); + assert(parse( "- \t 20") == -20 ); + // recognise radix prefix + assert(parse( "0xFFFF" ) == ushort.max ); + assert(parse( "0XffffFFFF" ) == uint.max ); + assert(parse( "0o55") == 055 ); + assert(parse( "0O55" ) == 055 ); + assert(parse( "0b10000") == 0x10 ); + assert(parse( "0B10000") == 0x10 ); + + // prefix tests + char[] str = "0x"; + assert(parse( str[0..1] ) == 0 ); + assert(parse("0x10", 10) == 0); + assert(parse("0b10", 10) == 0); + assert(parse("0o10", 10) == 0); + assert(parse("0b10") == 0b10); + assert(parse("0o10") == 010); + assert(parse("0b10", 2) == 0b10); + assert(parse("0o10", 8) == 010); + + // format tests + assert (format (tmp, 12345L) == "12345"); + assert (format (tmp, 0) == "0"); + assert (format (tmp, 0x10101L, Style.Hex) == "10101"); + assert (format (tmp, 0xfafaL, Style.Hex) == "fafa"); + assert (format (tmp, 0xfafaL, Style.HexUpper, Flags.Prefix) == "0XFAFA"); + assert (format (tmp, -1L, Style.HexUpper, Flags.Prefix) == "0XFFFFFFFFFFFFFFFF"); + assert (format (tmp, -101L) == "-101"); + assert (format (tmp, 101L, Style.Signed, Flags.Plus) == "+101"); + assert (format (tmp, 101L, Style.Signed, Flags.Space) == " 101"); + assert (format (tmp[0..8], 0x5L, Style.Binary, Flags.Prefix | Flags.Zero) == "0b000101"); + + assert (format (tmp[0..8], -1, Style.Binary, Flags.Prefix | Flags.Zero) == "{output width too small}"); + assert (format (tmp[0..2], 0x3, Style.Binary, Flags.Throw) == "11"); + assert (format (tmp[0..4], 0x3, Style.Binary, Flags.Prefix | Flags.Zero | Flags.Throw) == "0b11"); + assert (format (tmp[0..5], 0x3, Style.Binary, Flags.Prefix | Flags.Zero | Flags.Throw) == "0b011"); + assert (format (tmp[0..5], 0x3, Style.Binary, Flags.Zero | Flags.Throw) == "00011"); + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/text/convert/Layout.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/text/convert/Layout.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,920 @@ +/******************************************************************************* + + copyright: Copyright (c) 2005 Kris. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: 2005 + + author: Kris + + This module provides a general-purpose formatting system to + convert values to text suitable for display. There is support + for alignment, justification, and common format specifiers for + numbers. + + Layout can be customized via configuring various handlers and + associated meta-date. This is utilized to plug in text.locale + for handling custom formats, date/time and culture-specific + conversions. + + The format notation is influenced by that used by the .NET + and ICU frameworks, rather than C-style printf or D-style + writef notation. + +******************************************************************************/ + +module tango.text.convert.Layout; + +private import tango.core.Exception; + +private import Unicode = tango.text.convert.Utf; + +private import Float = tango.text.convert.Float, + Integer = tango.text.convert.Integer; + +/******************************************************************************* + + Platform issues ... + +*******************************************************************************/ + +version (DigitalMars) + { + alias void* Arg; + alias void* ArgList; + } + else + version (X86_64) + { + private import std.stdarg; + alias void* Arg; + alias va_list ArgList; + } + else + { + alias char* Arg; + alias char* ArgList; + } + +/******************************************************************************* + + Contains methods for replacing format items in a string with string + equivalents of each argument. + +*******************************************************************************/ + +class Layout(T) +{ + public alias convert opCall; + public alias uint delegate (T[]) Sink; + + /********************************************************************** + + **********************************************************************/ + + public final T[] sprint (T[] result, T[] formatStr, ...) + { + return vprint (result, formatStr, _arguments, _argptr); + } + + /********************************************************************** + + **********************************************************************/ + + public final T[] vprint (T[] result, T[] formatStr, TypeInfo[] arguments, ArgList args) + { + T* p = result.ptr; + + uint sink (T[] s) + { + int len = s.length; + if (len < (result.ptr + result.length) - p) + { + p [0..len] = s; + p += len; + } + else + error ("Layout.vprint :: output buffer is full"); + return len; + } + + convert (&sink, arguments, args, formatStr); + return result [0 .. p-result.ptr]; + } + + /********************************************************************** + + Replaces the _format item in a string with the string + equivalent of each argument. + + Params: + formatStr = A string containing _format items. + args = A list of arguments. + + Returns: A copy of formatStr in which the items have been + replaced by the string equivalent of the arguments. + + Remarks: The formatStr parameter is embedded with _format + items of the form: $(BR)$(BR) + {index[,alignment][:_format-string]}$(BR)$(BR) + $(UL $(LI index $(BR) + An integer indicating the element in a list to _format.) + $(LI alignment $(BR) + An optional integer indicating the minimum width. The + result is padded with spaces if the length of the value + is less than alignment.) + $(LI _format-string $(BR) + An optional string of formatting codes.) + )$(BR) + + The leading and trailing braces are required. To include a + literal brace character, use two leading or trailing brace + characters.$(BR)$(BR) + If formatStr is "{0} bottles of beer on the wall" and the + argument is an int with the value of 99, the return value + will be:$(BR) "99 bottles of beer on the wall". + + **********************************************************************/ + + public final T[] convert (T[] formatStr, ...) + { + return convert (_arguments, _argptr, formatStr); + } + + /********************************************************************** + + **********************************************************************/ + + public final uint convert (Sink sink, T[] formatStr, ...) + { + return convert (sink, _arguments, _argptr, formatStr); + } + + /********************************************************************** + + **********************************************************************/ + + public final T[] convert (TypeInfo[] arguments, ArgList args, T[] formatStr) + { + T[] output; + + uint sink (T[] s) + { + output ~= s; + return s.length; + } + + convert (&sink, arguments, args, formatStr); + return output; + } + + /********************************************************************** + + **********************************************************************/ + + public final T[] convertOne (T[] result, TypeInfo ti, Arg arg) + { + return munge (result, null, ti, arg); + } + + /********************************************************************** + + **********************************************************************/ + + public final uint convert (Sink sink, TypeInfo[] arguments, ArgList args, T[] formatStr) + { + assert (formatStr, "null format specifier"); + assert (arguments.length < 64, "too many args in Layout.convert"); + + version (X86_64) + { + Arg[64] arglist = void; + int[64] intargs = void; + byte[64] byteargs = void; + long[64] longargs = void; + short[64] shortargs = void; + void[][64] voidargs = void; + real[64] realargs = void; + float[64] floatargs = void; + double[64] doubleargs = void; + + foreach (i, arg; arguments) + { + arglist[i] = args.ptr; + /* Since floating point types don't live on + * the stack, they must be accessed by the + * correct type. */ + bool converted = false; + switch (arg.classinfo.name[9]) + { + case TypeCode.FLOAT: + floatargs[i] = va_arg!(float)(args); + arglist[i] = &floatargs[i]; + converted = true; + break; + + case TypeCode.DOUBLE: + doubleargs[i] = va_arg!(double)(args); + arglist[i] = &doubleargs[i]; + converted = true; + break; + + case TypeCode.REAL: + realargs[i] = va_arg!(real)(args); + arglist[i] = &realargs[i]; + converted = true; + break; + + default: + break; + } + if (! converted) + { + switch (arg.tsize) + { + case 1: + byteargs[i] = va_arg!(byte)(args); + arglist[i] = &byteargs[i]; + break; + case 2: + shortargs[i] = va_arg!(short)(args); + arglist[i] = &shortargs[i]; + break; + case 4: + intargs[i] = va_arg!(int)(args); + arglist[i] = &intargs[i]; + break; + case 8: + longargs[i] = va_arg!(long)(args); + arglist[i] = &longargs[i]; + break; + case 16: + voidargs[i] = va_arg!(void[])(args); + arglist[i] = &voidargs[i]; + break; + default: + assert (false, "Unknown size: " ~ Integer.toString (arg.tsize)); + } + } + } + } + else + { + Arg[64] arglist = void; + foreach (i, arg; arguments) + { + arglist[i] = args; + args += (arg.tsize + int.sizeof - 1) & ~ (int.sizeof - 1); + } + } + return parse (formatStr, arguments, arglist, sink); + } + + /********************************************************************** + + Parse the format-string, emitting formatted args and text + fragments as we go. + + **********************************************************************/ + + private uint parse (T[] layout, TypeInfo[] ti, Arg[] args, Sink sink) + { + T[384] result = void; + int length, nextIndex; + + + T* s = layout.ptr; + T* fragment = s; + T* end = s + layout.length; + + while (true) + { + while (s < end && *s != '{') + ++s; + + // emit fragment + length += sink (fragment [0 .. s - fragment]); + + // all done? + if (s is end) + break; + + // check for "{{" and skip if so + if (*++s is '{') + { + fragment = s++; + continue; + } + + int index = 0; + bool indexed = false; + + // extract index + while (*s >= '0' && *s <= '9') + { + index = index * 10 + *s++ -'0'; + indexed = true; + } + + // skip spaces + while (s < end && *s is ' ') + ++s; + + int width; + bool leftAlign; + + // has width? + if (*s is ',') + { + while (++s < end && *s is ' ') {} + + if (*s is '-') + { + leftAlign = true; + ++s; + } + + // get width + while (*s >= '0' && *s <= '9') + width = width * 10 + *s++ -'0'; + + // skip spaces + while (s < end && *s is ' ') + ++s; + } + + T[] format; + + // has a format string? + if (*s is ':' && s < end) + { + T* fs = ++s; + + // eat everything up to closing brace + while (s < end && *s != '}') + ++s; + format = fs [0 .. s - fs]; + } + + // insist on a closing brace + if (*s != '}') + { + length += sink ("{missing or misplaced '}'}"); + continue; + } + + // check for default index & set next default counter + if (! indexed) + index = nextIndex; + nextIndex = index + 1; + + // next char is start of following fragment + fragment = ++s; + + // handle alignment + void process (T[] str) + { + int padding = width - str.length; + + // if not left aligned, pad out with spaces + if (! leftAlign && padding > 0) + length += spaces (sink, padding); + + // emit formatted argument + length += sink (str); + + // finally, pad out on right + if (leftAlign && padding > 0) + length += spaces (sink, padding); + } + + // an astonishing number of typehacks needed to handle arrays :( + void processElement (TypeInfo _ti, Arg _arg) + { + if (_ti.classinfo.name.length is 20 && _ti.classinfo.name[9..$] == "StaticArray" ) + { + auto tiStat = cast(TypeInfo_StaticArray)_ti; + auto p = _arg; + length += sink ("[ "); + for (int i = 0; i < tiStat.len; i++) + { + if (p !is _arg ) + length += sink (", "); + processElement (tiStat.value, p); + p += tiStat.tsize; + } + length += sink (" ]"); + } + else + if (_ti.classinfo.name.length is 25 && _ti.classinfo.name[9..$] == "AssociativeArray") + { + auto tiAsso = cast(TypeInfo_AssociativeArray)_ti; + auto tiKey = tiAsso.key; + auto tiVal = tiAsso.next(); + // the knowledge of the internal k/v storage is used + // so this might break if, that internal storage changes + alias ubyte AV; // any type for key, value might be ok, the sizes are corrected later + alias ubyte AK; + auto aa = *cast(AV[AK]*) _arg; + + length += sink ("{ "); + bool first = true; + + int roundUp (int sz) + { + return (sz + (void*).sizeof -1) & ~((void*).sizeof - 1); + } + + foreach (inout v; aa) + { + // the key is befor the value, so substrace with fixed key size from above + auto pk = cast(Arg)( &v - roundUp(AK.sizeof)); + // now the real value pos is plus the real key size + auto pv = cast(Arg)(pk + roundUp(tiKey.tsize())); + + if (!first) + length += sink (", "); + processElement (tiKey, pk); + length += sink ("=>"); + processElement (tiVal, pv); + first = false; + } + length += sink (" }"); + } + else + if (_ti.classinfo.name[9] is TypeCode.ARRAY && + (_ti !is typeid(char[])) && + (_ti !is typeid(wchar[])) && + (_ti !is typeid(dchar[]))) + { + // for all non string array types (including char[][]) + auto arr = *cast(void[]*)_arg; + auto len = arr.length; + auto ptr = cast(Arg) arr.ptr; + auto elTi = _ti.next(); + auto size = elTi.tsize(); + length += sink ("[ "); + while (len > 0) + { + if (ptr !is arr.ptr) + length += sink (", "); + processElement (elTi, ptr); + len -= 1; + ptr += size; + } + length += sink (" ]"); + } + else + // the standard processing + process (munge(result, format, _ti, _arg)); + } + + + // process this argument + if (index >= ti.length) + process ("{invalid index}"); + else + processElement (ti[index], args[index]); + } + return length; + } + + /********************************************************************** + + **********************************************************************/ + + private void error (char[] msg) + { + throw new IllegalArgumentException (msg); + } + + /********************************************************************** + + **********************************************************************/ + + private uint spaces (Sink sink, int count) + { + uint ret; + + static const T[32] Spaces = ' '; + while (count > Spaces.length) + { + ret += sink (Spaces); + count -= Spaces.length; + } + return ret + sink (Spaces[0..count]); + } + + /*********************************************************************** + + ***********************************************************************/ + + private T[] munge (T[] result, T[] format, TypeInfo type, Arg p) + { + switch (type.classinfo.name[9]) + { + case TypeCode.ARRAY: + if (type is typeid(char[])) + return fromUtf8 (*cast(char[]*) p, result); + + if (type is typeid(wchar[])) + return fromUtf16 (*cast(wchar[]*) p, result); + + if (type is typeid(dchar[])) + return fromUtf32 (*cast(dchar[]*) p, result); + + return fromUtf8 (type.toString, result); + + case TypeCode.BOOL: + static T[] t = "true"; + static T[] f = "false"; + return (*cast(bool*) p) ? t : f; + + case TypeCode.BYTE: + return integer (result, *cast(byte*) p, format); + + case TypeCode.UBYTE: + return integer (result, *cast(ubyte*) p, format, 'u'); + + case TypeCode.SHORT: + return integer (result, *cast(short*) p, format); + + case TypeCode.USHORT: + return integer (result, *cast(ushort*) p, format, 'u'); + + case TypeCode.INT: + return integer (result, *cast(int*) p, format); + + case TypeCode.UINT: + return integer (result, *cast(uint*) p, format, 'u'); + + case TypeCode.ULONG: + return integer (result, *cast(long*) p, format, 'u'); + + case TypeCode.LONG: + return integer (result, *cast(long*) p, format); + + case TypeCode.FLOAT: + return floater (result, *cast(float*) p, format); + + case TypeCode.DOUBLE: + return floater (result, *cast(double*) p, format); + + case TypeCode.REAL: + return floater (result, *cast(real*) p, format); + + case TypeCode.CHAR: + return fromUtf8 ((cast(char*) p)[0..1], result); + + case TypeCode.WCHAR: + return fromUtf16 ((cast(wchar*) p)[0..1], result); + + case TypeCode.DCHAR: + return fromUtf32 ((cast(dchar*) p)[0..1], result); + + case TypeCode.POINTER: + return integer (result, *cast(size_t*) p, format, 'x'); + + case TypeCode.CLASS: + auto c = *cast(Object*) p; + if (c) + return fromUtf8 (c.toString, result); + break; + + case TypeCode.STRUCT: + auto s = cast(TypeInfo_Struct) type; + if (s.xtoString) + return fromUtf8 (s.xtoString(p), result); + goto default; + + case TypeCode.INTERFACE: + auto x = *cast(void**) p; + if (x) + { + auto pi = **cast(Interface ***) x; + auto o = cast(Object)(*cast(void**)p - pi.offset); + return fromUtf8 (o.toString, result); + } + break; + + case TypeCode.ENUM: + return munge (result, format, (cast(TypeInfo_Enum) type).base, p); + + case TypeCode.TYPEDEF: + return munge (result, format, (cast(TypeInfo_Typedef) type).base, p); + + default: + return unknown (result, format, type, p); + } + + return cast(T[]) "{null}"; + } + + /********************************************************************** + + **********************************************************************/ + + protected T[] unknown (T[] result, T[] format, TypeInfo type, Arg p) + { + return "{unhandled argument type: " ~ fromUtf8 (type.toString, result) ~ "}"; + } + + /********************************************************************** + + **********************************************************************/ + + protected T[] integer (T[] output, long v, T[] format, T style = 'd') + { + Integer.Flags flags; + uint width = output.length; + + if (parseGeneric (format, width, style)) + if (width <= output.length) + { + output = output [0 .. width]; + flags |= flags.Zero; + } + return Integer.format (output, v, cast(Integer.Style) style, flags); + } + + /********************************************************************** + + **********************************************************************/ + + protected T[] floater (T[] output, real v, T[] format) + { + T style = 'f'; + uint places = 2; + + parseGeneric (format, places, style); + return Float.format (output, v, places, (style is 'e' || style is 'E') ? 0 : 10); + } + + /********************************************************************** + + **********************************************************************/ + + private bool parseGeneric (T[] format, ref uint width, ref T style) + { + if (format.length) + { + uint number; + auto p = format.ptr; + auto e = p + format.length; + style = *p; + while (++p < e) + if (*p >= '0' && *p <= '9') + number = number * 10 + *p - '0'; + else + break; + + if (p - format.ptr > 1) + { + width = number; + return true; + } + } + return false; + } + + /*********************************************************************** + + ***********************************************************************/ + + private static T[] fromUtf8 (char[] s, T[] scratch) + { + static if (is (T == char)) + return s; + + static if (is (T == wchar)) + return Unicode.toString16 (s, scratch); + + static if (is (T == dchar)) + return Unicode.toString32 (s, scratch); + } + + /*********************************************************************** + + ***********************************************************************/ + + private static T[] fromUtf16 (wchar[] s, T[] scratch) + { + static if (is (T == wchar)) + return s; + + static if (is (T == char)) + return Unicode.toString (s, scratch); + + static if (is (T == dchar)) + return Unicode.toString32 (s, scratch); + } + + /*********************************************************************** + + ***********************************************************************/ + + private static T[] fromUtf32 (dchar[] s, T[] scratch) + { + static if (is (T == dchar)) + return s; + + static if (is (T == char)) + return Unicode.toString (s, scratch); + + static if (is (T == wchar)) + return Unicode.toString16 (s, scratch); + } +} + + +/******************************************************************************* + +*******************************************************************************/ + +private enum TypeCode +{ + EMPTY = 0, + BOOL = 'b', + UBYTE = 'h', + BYTE = 'g', + USHORT = 't', + SHORT = 's', + UINT = 'k', + INT = 'i', + ULONG = 'm', + LONG = 'l', + REAL = 'e', + FLOAT = 'f', + DOUBLE = 'd', + CHAR = 'a', + WCHAR = 'u', + DCHAR = 'w', + ARRAY = 'A', + CLASS = 'C', + STRUCT = 'S', + ENUM = 'E', + POINTER = 'P', + TYPEDEF = 'T', + INTERFACE = 'I', +} + + + +/******************************************************************************* + +*******************************************************************************/ + +debug (UnitTest) +{ + //void main() {} + + unittest + { + auto Formatter = new Layout!(char); + + assert( Formatter( "abc" ) == "abc" ); + assert( Formatter( "{0}", 1 ) == "1" ); + assert( Formatter( "{0}", -1 ) == "-1" ); + + assert( Formatter( "{}", 1 ) == "1" ); + assert( Formatter( "{} {}", 1, 2) == "1 2" ); + assert( Formatter( "{} {0} {}", 1, 3) == "1 1 3" ); + assert( Formatter( "{} {0} {} {}", 1, 3) == "1 1 3 {invalid index}" ); + assert( Formatter( "{} {0} {} {:x}", 1, 3) == "1 1 3 {invalid index}" ); + + assert( Formatter( "{0}", true ) == "true" , Formatter( "{0}", true )); + assert( Formatter( "{0}", false ) == "false" ); + + assert( Formatter( "{0}", cast(byte)-128 ) == "-128" ); + assert( Formatter( "{0}", cast(byte)127 ) == "127" ); + assert( Formatter( "{0}", cast(ubyte)255 ) == "255" ); + + assert( Formatter( "{0}", cast(short)-32768 ) == "-32768" ); + assert( Formatter( "{0}", cast(short)32767 ) == "32767" ); + assert( Formatter( "{0}", cast(ushort)65535 ) == "65535" ); + // assert( Formatter( "{0:x4}", cast(ushort)0xafe ) == "0afe" ); + // assert( Formatter( "{0:X4}", cast(ushort)0xafe ) == "0AFE" ); + + assert( Formatter( "{0}", -2147483648 ) == "-2147483648" ); + assert( Formatter( "{0}", 2147483647 ) == "2147483647" ); + assert( Formatter( "{0}", 4294967295 ) == "4294967295" ); + // compiler error + assert( Formatter( "{0}", -9223372036854775807L) == "-9223372036854775807" ); + assert( Formatter( "{0}", 0x8000_0000_0000_0000L) == "9223372036854775808" ); + assert( Formatter( "{0}", 9223372036854775807L ) == "9223372036854775807" ); + // Error: prints -1 + // assert( Formatter( "{0}", 18446744073709551615UL ) == "18446744073709551615" ); + + assert( Formatter( "{0}", "s" ) == "s" ); + // fragments before and after + assert( Formatter( "d{0}d", "s" ) == "dsd" ); + assert( Formatter( "d{0}d", "1234567890" ) == "d1234567890d" ); + + // brace escaping + assert( Formatter( "d{0}d", "" ) == "dd"); + assert( Formatter( "d{{0}d", "" ) == "d{0}d"); + assert( Formatter( "d{{{0}d", "" ) == "d{d"); + assert( Formatter( "d{0}}d", "" ) == "d}d"); + + assert( Formatter( "{0:x}", 0xafe0000 ) == "afe0000" ); + // todo: is it correct to print 7 instead of 6 chars??? + assert( Formatter( "{0:x7}", 0xafe0000 ) == "afe0000" ); + assert( Formatter( "{0:x8}", 0xafe0000 ) == "0afe0000" ); + assert( Formatter( "{0:X8}", 0xafe0000 ) == "0AFE0000" ); + assert( Formatter( "{0:X9}", 0xafe0000 ) == "00AFE0000" ); + assert( Formatter( "{0:X13}", 0xafe0000 ) == "000000AFE0000" ); + assert( Formatter( "{0:x13}", 0xafe0000 ) == "000000afe0000" ); + // decimal width + assert( Formatter( "{0:d6}", 123 ) == "000123" ); + assert( Formatter( "{0,7:d6}", 123 ) == " 000123" ); + assert( Formatter( "{0,-7:d6}", 123 ) == "000123 " ); + + assert( Formatter( "{0:d7}", -123 ) == "-000123" ); + assert( Formatter( "{0,7:d6}", 123 ) == " 000123" ); + assert( Formatter( "{0,7:d7}", -123 ) == "-000123" ); + assert( Formatter( "{0,8:d7}", -123 ) == " -000123" ); + assert( Formatter( "{0,5:d7}", -123 ) == "-000123" ); + + assert( Formatter( "{0:X}", 0xFFFF_FFFF_FFFF_FFFF) == "FFFFFFFFFFFFFFFF" ); + assert( Formatter( "{0:x}", 0xFFFF_FFFF_FFFF_FFFF) == "ffffffffffffffff" ); + assert( Formatter( "{0:x}", 0xFFFF_1234_FFFF_FFFF) == "ffff1234ffffffff" ); + assert( Formatter( "{0:x19}", 0x1234_FFFF_FFFF) == "00000001234ffffffff" ); + // Error: prints -1 + // assert( Formatter( "{0}", 18446744073709551615UL ) == "18446744073709551615" ); + assert( Formatter( "{0}", "s" ) == "s" ); + // fragments before and after + assert( Formatter( "d{0}d", "s" ) == "dsd" ); + + // argument index + assert( Formatter( "a{0}b{1}c{2}", "x", "y", "z" ) == "axbycz" ); + assert( Formatter( "a{2}b{1}c{0}", "x", "y", "z" ) == "azbycx" ); + assert( Formatter( "a{1}b{1}c{1}", "x", "y", "z" ) == "aybycy" ); + + // alignment + // align does not restrict the length + assert( Formatter( "{0,5}", "hellohello" ) == "hellohello" ); + // align fills with spaces + assert( Formatter( "->{0,-10}<-", "hello" ) == "->hello <-" ); + assert( Formatter( "->{0,10}<-", "hello" ) == "-> hello<-" ); + assert( Formatter( "->{0,-10}<-", 12345 ) == "->12345 <-" ); + assert( Formatter( "->{0,10}<-", 12345 ) == "-> 12345<-" ); + + assert( Formatter( "{0:f}", 1.23f ) == "1.23" ); + assert( Formatter( "{0:f4}", 1.23456789L ) == "1.2346" ); + assert( Formatter( "{0:e4}", 0.0001) == "0.1000e-03"); + + int[] a = [ 51, 52, 53, 54, 55 ]; + assert( Formatter( "{}", a ) == "[ 51, 52, 53, 54, 55 ]" ); + assert( Formatter( "{:x}", a ) == "[ 33, 34, 35, 36, 37 ]" ); + assert( Formatter( "{,-4}", a ) == "[ 51 , 52 , 53 , 54 , 55 ]" ); + assert( Formatter( "{,4}", a ) == "[ 51, 52, 53, 54, 55 ]" ); + int[][] b = [ [ 51, 52 ], [ 53, 54, 55 ] ]; + assert( Formatter( "{}", b ) == "[ [ 51, 52 ], [ 53, 54, 55 ] ]" ); + + ushort[3] c = [ cast(ushort)51, 52, 53 ]; + assert( Formatter( "{}", c ) == "[ 51, 52, 53 ]" ); + + ushort[long] d; + d[234] = 2; + d[345] = 3; + assert( Formatter( "{}", d ) == "{ 234=>2, 345=>3 }" ); + + bool[char[]] e; + e[ "key".dup ] = true; + e[ "value".dup ] = false; + assert( Formatter( "{}", e ) == "{ key=>true, value=>false }" ); + + char[][ double ] f; + f[ 1.0 ] = "one".dup; + f[ 3.14 ] = "PI".dup; + assert( Formatter( "{}", f ) == "{ 1.00=>one, 3.14=>PI }" ); + } +} + + + +debug (Layout) +{ + import tango.io.Console; + + void main () + { + auto layout = new Layout!(char); + + Cout (layout ("{:d2}", 56)).newline; + Cout (layout ("{:f4}", 0.001)).newline; + Cout (layout ("{:f8}", 3.14159)).newline; + Cout (layout ("{:e20}", 0.001)).newline; + Cout (layout ("{:e4}", 0.0000001)).newline; + Cout (layout ("ptr:{}", &layout)).newline; + + struct S + { + char[] toString () {return "foo";} + } + + S s; + Cout (layout ("struct: {}", s)).newline; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/text/convert/Sprint.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/text/convert/Sprint.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,111 @@ +/******************************************************************************* + + copyright: Copyright (c) 2005 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Nov 2005: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.text.convert.Sprint; + +private import tango.text.convert.Layout; + +/****************************************************************************** + + Constructs sprintf-style output. This is a replacement for the + vsprintf() family of functions, and writes its output into a + lookaside buffer: + --- + // create a Sprint instance + auto sprint = new Sprint!(char); + + // write formatted text to a logger + log.info (sprint ("{} green bottles, sitting on a wall\n", 10)); + --- + + Sprint can be handy when you wish to format text for a Logger + or similar, since it avoids heap activity during conversion by + hosting a fixed size conversion buffer. This is important when + debugging since heap activity can be responsible for behavioral + changes. One would create a Sprint instance ahead of time, and + utilize it in conjunction with the logging package. + + Please note that the class itself is stateful, and therefore a + single instance is not shareable across multiple threads. The + returned content is not .dup'd either, so do that yourself if + you require a persistent copy. + + Note also that Sprint is templated, and can be instantiated for + wide chars through a Sprint!(dchar) or Sprint!(wchar). The wide + versions differ in that both the output and the format-string + are of the target type. Variadic text arguments are transcoded + appropriately. + + See also: tango.text.convert.Layout + +******************************************************************************/ + +class Sprint(T) +{ + protected T[] buffer; + static Layout!(T) global; + Layout!(T) layout; + + alias format opCall; + + /********************************************************************** + + Create new Sprint instances with a buffer of the specified + size + + **********************************************************************/ + + this (int size = 256) + { + // Workaround for bug with static ctors in GDC + if (global is null) + global = new Layout!(T); + this (size, global); + } + + /********************************************************************** + + Create new Sprint instances with a buffer of the specified + size, and the provided formatter. The second argument can be + used to apply cultural specifics (I18N) to Sprint + + **********************************************************************/ + + this (int size, Layout!(T) formatter) + { + buffer = new T[size]; + this.layout = formatter; + } + + /********************************************************************** + + Layout a set of arguments + + **********************************************************************/ + + T[] format (T[] fmt, ...) + { + return layout.vprint (buffer, fmt, _arguments, _argptr); + } + + /********************************************************************** + + Layout a set of arguments + + **********************************************************************/ + + T[] format (T[] fmt, TypeInfo[] arguments, ArgList argptr) + { + return layout.vprint (buffer, fmt, arguments, argptr); + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/text/convert/TimeStamp.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/text/convert/TimeStamp.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,589 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: May 2005 + + author: Kris + + Converts between native and text representations of HTTP time + values. Internally, time is represented as UTC with an epoch + fixed at Jan 1st 1970. The text representation is formatted in + accordance with RFC 1123, and the parser will accept one of + RFC 1123, RFC 850, or asctime formats. + + See http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html for + further detail. + + Applying the D "import alias" mechanism to this module is highly + recommended, in order to limit namespace pollution: + --- + import TimeStamp = tango.text.convert.TimeStamp; + + auto t = TimeStamp.parse ("Sun, 06 Nov 1994 08:49:37 GMT"); + --- + +*******************************************************************************/ + +module tango.text.convert.TimeStamp; + +private import tango.time.Time; + +private import tango.core.Exception; + +private import Util = tango.text.Util; + +private import tango.time.chrono.Gregorian; + +private import Int = tango.text.convert.Integer; + +/****************************************************************************** + + Parse provided input and return a UTC epoch time. An exception + is raised where the provided string is not fully parsed. + +******************************************************************************/ + +ulong toTime(T) (T[] src) +{ + uint len; + + auto x = parse (src, &len); + if (len < src.length) + throw new IllegalArgumentException ("unknown time format: "~src); + return x; +} + +/****************************************************************************** + + Template wrapper to make life simpler. Returns a text version + of the provided value. + + See format() for details + +******************************************************************************/ + +char[] toString (Time time) +{ + char[32] tmp = void; + + return format (tmp, time).dup; +} + +/****************************************************************************** + + Template wrapper to make life simpler. Returns a text version + of the provided value. + + See format() for details + +******************************************************************************/ + +wchar[] toString16 (Time time) +{ + wchar[32] tmp = void; + + return format (tmp, time).dup; +} + +/****************************************************************************** + + Template wrapper to make life simpler. Returns a text version + of the provided value. + + See format() for details + +******************************************************************************/ + +dchar[] toString32 (Time time) +{ + dchar[32] tmp = void; + + return format (tmp, time).dup; +} + +/****************************************************************************** + + RFC1123 formatted time + + Converts to the format "Sun, 06 Nov 1994 08:49:37 GMT", and + returns a populated slice of the provided buffer. Note that + RFC1123 format is always in absolute GMT time, and a thirty- + element buffer is sufficient for the produced output + + Throws an exception where the supplied time is invalid + +******************************************************************************/ + +T[] format(T, U=Time) (T[] output, U t) +{return format!(T)(output, cast(Time) t);} + +T[] format(T) (T[] output, Time t) +{ + static T[][] Months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + static T[][] Days = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; + + T[] convert (T[] tmp, int i) + { + return Int.format!(T) (tmp, i, Int.Style.Unsigned, Int.Flags.Zero); + } + + + assert (output.length >= 29); + if (t is t.max) + throw new IllegalArgumentException ("TimeStamp.format :: invalid Time argument"); + + // convert time to field values + auto time = t.time; + auto date = Gregorian.generic.toDate (t); + + // use the featherweight formatter ... + T[14] tmp = void; + return Util.layout (output, "%0, %1 %2 %3 %4:%5:%6 GMT", + Days[date.dow], + convert (tmp[0..2], date.day), + Months[date.month-1], + convert (tmp[2..6], date.year), + convert (tmp[6..8], time.hours), + convert (tmp[8..10], time.minutes), + convert (tmp[10..12], time.seconds) + ); +} + + +/****************************************************************************** + + Parse provided input and return a UTC epoch time. A return value + of Time.max indicated a parse-failure. + + An option is provided to return the count of characters parsed - + an unchanged value here also indicates invalid input. + +******************************************************************************/ + +Time parse(T) (T[] src, uint* ate = null) +{ + int len; + Time value; + + if ((len = rfc1123 (src, value)) > 0 || + (len = rfc850 (src, value)) > 0 || + (len = asctime (src, value)) > 0) + { + if (ate) + *ate = len; + return value; + } + + return Time.max; +} + + +/****************************************************************************** + + RFC 822, updated by RFC 1123 :: "Sun, 06 Nov 1994 08:49:37 GMT" + + Returns the number of elements consumed by the parse; zero if + the parse failed + +******************************************************************************/ + +int rfc1123(T) (T[] src, inout Time value) +{ + TimeOfDay tod; + Date date; + T* p = src.ptr; + + bool dt (inout T* p) + { + return ((date.day = parseInt(p)) > 0 && + *p++ == ' ' && + (date.month = parseMonth(p)) > 0 && + *p++ == ' ' && + (date.year = parseInt(p)) > 0); + } + + if (parseShortDay(p) >= 0 && + *p++ == ',' && + *p++ == ' ' && + dt (p) && + *p++ == ' ' && + time (tod, p) && + *p++ == ' ' && + p[0..3] == "GMT") + { + value = Gregorian.generic.toTime (date, tod); + return (p+3) - src.ptr; + } + + return 0; +} + + +/****************************************************************************** + + RFC 850, obsoleted by RFC 1036 :: "Sunday, 06-Nov-94 08:49:37 GMT" + + Returns the number of elements consumed by the parse; zero if + the parse failed + +******************************************************************************/ + +int rfc850(T) (T[] src, inout Time value) +{ + TimeOfDay tod; + Date date; + T* p = src.ptr; + + bool dt (inout T* p) + { + return ((date.day = parseInt(p)) > 0 && + *p++ == '-' && + (date.month = parseMonth(p)) > 0 && + *p++ == '-' && + (date.year = parseInt(p)) > 0); + } + + if (parseFullDay(p) >= 0 && + *p++ == ',' && + *p++ == ' ' && + dt (p) && + *p++ == ' ' && + time (tod, p) && + *p++ == ' ' && + p[0..3] == "GMT") + { + if (date.year < 70) + date.year += 2000; + else + if (date.year < 100) + date.year += 1900; + + value = Gregorian.generic.toTime (date, tod); + return (p+3) - src.ptr; + } + + return 0; +} + + +/****************************************************************************** + + ANSI C's asctime() format :: "Sun Nov 6 08:49:37 1994" + + Returns the number of elements consumed by the parse; zero if + the parse failed + +******************************************************************************/ + +int asctime(T) (T[] src, inout Time value) +{ + TimeOfDay tod; + Date date; + T* p = src.ptr; + + bool dt (inout T* p) + { + return ((date.month = parseMonth(p)) > 0 && + *p++ == ' ' && + ((date.day = parseInt(p)) > 0 || + (*p++ == ' ' && + (date.day = parseInt(p)) > 0))); + } + + if (parseShortDay(p) >= 0 && + *p++ == ' ' && + dt (p) && + *p++ == ' ' && + time (tod, p) && + *p++ == ' ' && + (date.year = parseInt (p)) > 0) + { + value = Gregorian.generic.toTime (date, tod); + return p - src.ptr; + } + + return 0; +} + +/****************************************************************************** + + DOS time format :: "12-31-06 08:49AM" + + Returns the number of elements consumed by the parse; zero if + the parse failed + +******************************************************************************/ + +int dostime(T) (T[] src, inout Time value) +{ + TimeOfDay tod; + Date date; + T* p = src.ptr; + + bool dt (inout T* p) + { + return ((date.month = parseInt(p)) > 0 && + *p++ == '-' && + ((date.day = parseInt(p)) > 0 && + (*p++ == '-' && + (date.year = parseInt(p)) > 0))); + } + + if (dt(p) >= 0 && + *p++ == ' ' && + (tod.hours = parseInt(p)) > 0 && + *p++ == ':' && + (tod.minutes = parseInt(p)) > 0 && + (*p == 'A' || *p == 'P')) + { + if (*p is 'P') + tod.hours += 12; + + if (date.year < 70) + date.year += 2000; + else + if (date.year < 100) + date.year += 1900; + + value = Gregorian.generic.toTime (date, tod); + return (p+2) - src.ptr; + } + + return 0; +} + +/****************************************************************************** + + ISO-8601 format :: "2006-01-31 14:49:30,001" + + Returns the number of elements consumed by the parse; zero if + the parse failed + +******************************************************************************/ + +int iso8601(T) (T[] src, inout Time value) +{ + TimeOfDay tod; + Date date; + T* p = src.ptr; + + bool dt (inout T* p) + { + return ((date.year = parseInt(p)) > 0 && + *p++ == '-' && + ((date.month = parseInt(p)) > 0 && + (*p++ == '-' && + (date.day = parseInt(p)) > 0))); + } + + if (dt(p) >= 0 && + *p++ == ' ' && + time (tod, p) && + *p++ == ',') + { + tod.millis = parseInt (p); + value = Gregorian.generic.toTime (date, tod); + return p - src.ptr; + } + + return 0; +} + + +/****************************************************************************** + + Parse a time field + +******************************************************************************/ + +private bool time(T) (inout TimeOfDay time, inout T* p) +{ + return ((time.hours = parseInt(p)) > 0 && + *p++ == ':' && + (time.minutes = parseInt(p)) > 0 && + *p++ == ':' && + (time.seconds = parseInt(p)) > 0); +} + + +/****************************************************************************** + + Match a month from the input + +******************************************************************************/ + +private int parseMonth(T) (inout T* p) +{ + int month; + + switch (p[0..3]) + { + case "Jan": + month = 1; + break; + case "Feb": + month = 2; + break; + case "Mar": + month = 3; + break; + case "Apr": + month = 4; + break; + case "May": + month = 5; + break; + case "Jun": + month = 6; + break; + case "Jul": + month = 7; + break; + case "Aug": + month = 8; + break; + case "Sep": + month = 9; + break; + case "Oct": + month = 10; + break; + case "Nov": + month = 11; + break; + case "Dec": + month = 12; + break; + default: + return month; + } + + p += 3; + return month; +} + + +/****************************************************************************** + + Match a day from the input + +******************************************************************************/ + +private int parseShortDay(T) (inout T* p) +{ + int day; + + switch (p[0..3]) + { + case "Sun": + day = 0; + break; + case "Mon": + day = 1; + break; + case "Tue": + day = 2; + break; + case "Wed": + day = 3; + break; + case "Thu": + day = 4; + break; + case "Fri": + day = 5; + break; + case "Sat": + day = 6; + break; + default: + return -1; + } + + p += 3; + return day; +} + + +/****************************************************************************** + + Match a day from the input. Sunday is 0 + +******************************************************************************/ + +private int parseFullDay(T) (inout T* p) +{ + static T[][] days = + [ + "Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", + ]; + + foreach (i, day; days) + if (day == p[0..day.length]) + { + p += day.length; + return i; + } + return -1; +} + + +/****************************************************************************** + + Extract an integer from the input + +******************************************************************************/ + +private static int parseInt(T) (inout T* p) +{ + int value; + + while (*p >= '0' && *p <= '9') + value = value * 10 + *p++ - '0'; + return value; +} + + +/****************************************************************************** + +******************************************************************************/ + +debug (UnitTest) +{ + unittest + { + wchar[30] tmp; + wchar[] test = "Sun, 06 Nov 1994 08:49:37 GMT"; + + auto time = parse (test); + auto text = format (tmp, time); + assert (text == test); + } +} + +/****************************************************************************** + +******************************************************************************/ + +debug (TimeStamp) +{ + void main() + { + wchar[30] tmp; + wchar[] test = "Sun, 06 Nov 1994 08:49:37 GMT"; + + auto time = parse (test); + auto text = format (tmp, time); + assert (text == test); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/text/convert/UnicodeBom.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/text/convert/UnicodeBom.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,394 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: December 2005 + + author: Kris + +*******************************************************************************/ + +module tango.text.convert.UnicodeBom; + +private import tango.core.ByteSwap; + +private import Utf = tango.text.convert.Utf; + + +private extern (C) void onUnicodeError (char[] msg, size_t idx = 0); + +/******************************************************************************* + + see http://icu.sourceforge.net/docs/papers/forms_of_unicode/#t2 + +*******************************************************************************/ + +enum Encoding { + Unknown, + UTF_8, + UTF_8N, + UTF_16, + UTF_16BE, + UTF_16LE, + UTF_32, + UTF_32BE, + UTF_32LE, + }; + +/******************************************************************************* + + Convert unicode content + + Unicode is an encoding of textual material. The purpose of this module + is to interface external-encoding with a programmer-defined internal- + encoding. This internal encoding is declared via the template argument + T, whilst the external encoding is either specified or derived. + + Three internal encodings are supported: char, wchar, and dchar. The + methods herein operate upon arrays of this type. That is, decode() + returns an array of the type, while encode() expect an array of said + type. + + Supported external encodings are as follow: + + Encoding.Unknown + Encoding.UTF_8 + Encoding.UTF_8N + Encoding.UTF_16 + Encoding.UTF_16BE + Encoding.UTF_16LE + Encoding.UTF_32 + Encoding.UTF_32BE + Encoding.UTF_32LE + + These can be divided into non-explicit and explicit encodings: + + Encoding.Unknown + Encoding.UTF_8 + Encoding.UTF_16 + Encoding.UTF_32 + + + Encoding.UTF_8N + Encoding.UTF_16BE + Encoding.UTF_16LE + Encoding.UTF_32BE + Encoding.UTF_32LE + + The former group of non-explicit encodings may be used to 'discover' + an unknown encoding, by examining the first few bytes of the content + for a signature. This signature is optional, but is often written such + that the content is self-describing. When an encoding is unknown, using + one of the non-explicit encodings will cause the decode() method to look + for a signature and adjust itself accordingly. It is possible that a + ZWNBSP character might be confused with the signature; today's unicode + content is supposed to use the WORD-JOINER character instead. + + The group of explicit encodings are for use when the content encoding + is known. These *must* be used when converting back to external encoding, + since written content must be in a known format. It should be noted that, + during a decode() operation, the existence of a signature is in conflict + with these explicit varieties. + + + See + $(LINK http://www.utf-8.com/) + $(LINK http://www.hackcraft.net/xmlUnicode/) + $(LINK http://www.unicode.org/faq/utf_bom.html/) + $(LINK http://www.azillionmonkeys.com/qed/unicode.html/) + $(LINK http://icu.sourceforge.net/docs/papers/forms_of_unicode/) + +*******************************************************************************/ + +class UnicodeBom(T) : BomSniffer +{ + static if (!is (T == char) && !is (T == wchar) && !is (T == dchar)) + pragma (msg, "Template type must be char, wchar, or dchar"); + + /*********************************************************************** + + Construct a instance using the given external encoding ~ one + of the Encoding.xx types + + ***********************************************************************/ + + this (Encoding encoding) + { + setup (encoding); + } + + /*********************************************************************** + + Convert the provided content. The content is inspected + for a BOM signature, which is stripped. An exception is + thrown if a signature is present when, according to the + encoding type, it should not be. Conversely, An exception + is thrown if there is no known signature where the current + encoding expects one to be present + + ***********************************************************************/ + + final T[] decode (void[] content, T[] dst=null, uint* ate=null) + { + // look for a BOM + auto info = test (content); + + // are we expecting a BOM? + if (lookup[encoding].test) + if (info) + { + // yep ~ and we got one + setup (info.encoding); + + // strip BOM from content + content = content [info.bom.length .. length]; + } + else + // can this encoding be defaulted? + if (settings.fallback) + setup (settings.fallback); + else + onUnicodeError ("UnicodeBom.decode :: unknown or missing BOM"); + else + if (info) + // found a BOM when using an explicit encoding + onUnicodeError ("UnicodeBom.decode :: explicit encoding does not permit BOM"); + + // convert it to internal representation + return into (swapBytes(content), settings.type, dst, ate); + } + + /*********************************************************************** + + Perform encoding of content. Note that the encoding must be + of the explicit variety by the time we get here + + ***********************************************************************/ + + final void[] encode (T[] content, void[] dst=null, uint* ate=null) + { + if (settings.test) + onUnicodeError ("UnicodeBom.encode :: cannot write to a non-specific encoding"); + + // convert it to external representation, and write + return swapBytes (from (content, settings.type, dst, ate)); + } + + /*********************************************************************** + + Swap bytes around, as required by the encoding + + ***********************************************************************/ + + private final void[] swapBytes (void[] content) + { + bool endian = settings.endian; + bool swap = settings.bigEndian; + + version (BigEndian) + swap = !swap; + + if (endian && swap) + { + if (settings.type == Utf16) + ByteSwap.swap16 (content.ptr, content.length); + else + ByteSwap.swap32 (content.ptr, content.length); + } + return content; + } + + /*********************************************************************** + + + ***********************************************************************/ + + static T[] into (void[] x, uint type, T[] dst=null, uint* ate=null) + { + T[] ret; + + static if (is (T == char)) + { + if (type == Utf8) + return cast(T[]) x; + + if (type == Utf16) + ret = Utf.toString (cast(wchar[]) x, dst, ate); + else + if (type == Utf32) + ret = Utf.toString (cast(dchar[]) x, dst, ate); + } + + static if (is (T == wchar)) + { + if (type == Utf16) + return cast(T[]) x; + + if (type == Utf8) + ret = Utf.toString16 (cast(char[]) x, dst, ate); + else + if (type == Utf32) + ret = Utf.toString16 (cast(dchar[]) x, dst, ate); + } + + static if (is (T == dchar)) + { + if (type == Utf32) + return cast(T[]) x; + + if (type == Utf8) + ret = Utf.toString32 (cast(char[]) x, dst, ate); + else + if (type == Utf16) + ret = Utf.toString32 (cast(wchar[]) x, dst, ate); + } + + return ret; + } + + + /*********************************************************************** + + ***********************************************************************/ + + static void[] from (T[] x, uint type, void[] dst=null, uint* ate=null) + { + void[] ret; + + static if (is (T == char)) + { + if (type == Utf8) + return x; + + if (type == Utf16) + ret = Utf.toString16 (x, cast(wchar[]) dst, ate); + else + if (type == Utf32) + ret = Utf.toString32 (x, cast(dchar[]) dst, ate); + } + + static if (is (T == wchar)) + { + if (type == Utf16) + return x; + + if (type == Utf8) + ret = Utf.toString (x, cast(char[]) dst, ate); + else + if (type == Utf32) + ret = Utf.toString32 (x, cast(dchar[]) dst, ate); + } + + static if (is (T == dchar)) + { + if (type == Utf32) + return x; + + if (type == Utf8) + ret = Utf.toString (x, cast(char[]) dst, ate); + else + if (type == Utf16) + ret = Utf.toString16 (x, cast(wchar[]) dst, ate); + } + + return ret; + } +} + + + +/******************************************************************************* + +*******************************************************************************/ + +class BomSniffer +{ + private Encoding encoder; // the current encoding + private Info* settings; // pointer to encoding configuration + + private struct Info + { + int type; // type of element (char/wchar/dchar) + Encoding encoding; // Encoding.xx encoding + char[] bom; // pattern to match for signature + bool test, // should we test for this encoding? + endian, // this encoding have endian concerns? + bigEndian; // is this a big-endian encoding? + Encoding fallback; // can this encoding be defaulted? + }; + + private enum {Utf8, Utf16, Utf32}; + + private const Info[] lookup = + [ + {Utf8, Encoding.Unknown, null, true, false, false, Encoding.UTF_8N}, + {Utf8, Encoding.UTF_8, null, true, false, false, Encoding.UTF_8N}, + {Utf8, Encoding.UTF_8N, x"efbbbf", false}, + {Utf16, Encoding.UTF_16, null, true, false, false, Encoding.UTF_16BE}, + {Utf16, Encoding.UTF_16BE, x"feff", false, true, true}, + {Utf16, Encoding.UTF_16LE, x"fffe", false, true}, + {Utf32, Encoding.UTF_32, null, true, false, false, Encoding.UTF_32BE}, + {Utf32, Encoding.UTF_32BE, x"0000feff", false, true, true}, + {Utf32, Encoding.UTF_32LE, x"fffe0000", false, true}, + ]; + + /*********************************************************************** + + Return the current encoding. This is either the originally + specified encoding, or a derived one obtained by inspecting + the content for a BOM. The latter is performed as part of + the decode() method + + ***********************************************************************/ + + final Encoding encoding () + { + return encoder; + } + + /*********************************************************************** + + Return the signature (BOM) of the current encoding + + ***********************************************************************/ + + final void[] signature () + { + return settings.bom; + } + + /*********************************************************************** + + Configure this instance with unicode converters + + ***********************************************************************/ + + final void setup (Encoding encoding) + { + this.settings = &lookup[encoding]; + this.encoder = encoding; + } + + /*********************************************************************** + + Scan the BOM signatures looking for a match. We scan in + reverse order to get the longest match first + + ***********************************************************************/ + + static final Info* test (void[] content) + { + for (Info* info=lookup.ptr+lookup.length; --info >= lookup.ptr;) + if (info.bom) + { + int len = info.bom.length; + if (len <= content.length) + if (content[0..len] == info.bom[0..len]) + return info; + } + return null; + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/text/convert/Utf.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/text/convert/Utf.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,532 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: Oct 2004 + + authors: Kris + + Fast Unicode transcoders. These are particularly sensitive to + minor changes on 32bit x86 devices, because the register set of + those devices is so small. Beware of subtle changes which might + extend the execution-period by as much as 200%. Because of this, + three of the six transcoders might read past the end of input by + one, two, or three bytes before arresting themselves. Note that + support for streaming adds a 15% overhead to the dchar => char + conversion, but has little effect on the others. + + These routines were tuned on an Intel P4; other devices may work + more efficiently with a slightly different approach, though this + is likely to be reasonably optimal on AMD x86 CPUs also. These + algorithms would benefit significantly from those extra AMD64 + registers. On a 3GHz P4, the dchar/char conversions take around + 2500ns to process an array of 1000 ASCII elements. Invoking the + memory manager doubles that period, and quadruples the time for + arrays of 100 elements. Memory allocation can slow down notably + in a multi-threaded environment, so avoid that where possible. + + Surrogate-pairs are dealt with in a non-optimal fashion when + transcoding between utf16 and utf8. Such cases are considered + to be boundary-conditions for this module. + + There are three common cases where the input may be incomplete, + including each 'widening' case of utf8 => utf16, utf8 => utf32, + and utf16 => utf32. An edge-case is utf16 => utf8, if surrogate + pairs are present. Such cases will throw an exception, unless + streaming-mode is enabled ~ in the latter mode, an additional + integer is returned indicating how many elements of the input + have been consumed. In all cases, a correct slice of the output + is returned. + + For details on Unicode processing see: + $(UL $(LINK http://www.utf-8.com/)) + $(UL $(LINK http://www.hackcraft.net/xmlUnicode/)) + $(UL $(LINK http://www.azillionmonkeys.com/qed/unicode.html/)) + $(UL $(LINK http://icu.sourceforge.net/docs/papers/forms_of_unicode/)) + +*******************************************************************************/ + +module tango.text.convert.Utf; + +public extern (C) void onUnicodeError (char[] msg, size_t idx = 0); + + +/******************************************************************************* + + Encode Utf8 up to a maximum of 4 bytes long (five & six byte + variations are not supported). + + If the output is provided off the stack, it should be large + enough to encompass the entire transcoding; failing to do + so will cause the output to be moved onto the heap instead. + + Returns a slice of the output buffer, corresponding to the + converted characters. For optimum performance, the returned + buffer should be specified as 'output' on subsequent calls. + For example: + + --- + char[] output; + + char[] result = toString (input, output); + + // reset output after a realloc + if (result.length > output.length) + output = result; + --- + +*******************************************************************************/ + +char[] toString (wchar[] input, char[] output=null, uint* ate=null) +{ + if (ate) + *ate = input.length; + else + { + // potentially reallocate output + int estimate = input.length * 2 + 3; + if (output.length < estimate) + output.length = estimate; + } + + char* pOut = output.ptr; + char* pMax = pOut + output.length - 3; + + foreach (int eaten, wchar b; input) + { + // about to overflow the output? + if (pOut > pMax) + { + // if streaming, just return the unused input + if (ate) + { + *ate = eaten; + break; + } + + // reallocate the output buffer + int len = pOut - output.ptr; + output.length = len + len / 2; + pOut = output.ptr + len; + pMax = output.ptr + output.length - 3; + } + + if (b < 0x80) + *pOut++ = b; + else + if (b < 0x0800) + { + pOut[0] = 0xc0 | ((b >> 6) & 0x3f); + pOut[1] = 0x80 | (b & 0x3f); + pOut += 2; + } + else + if (b < 0xd800 || b > 0xdfff) + { + pOut[0] = 0xe0 | ((b >> 12) & 0x3f); + pOut[1] = 0x80 | ((b >> 6) & 0x3f); + pOut[2] = 0x80 | (b & 0x3f); + pOut += 3; + } + else + // deal with surrogate-pairs + return toString (toString32(input, null, ate), output); + } + + // return the produced output + return output [0..(pOut - output.ptr)]; +} + +/******************************************************************************* + + Decode Utf8 produced by the above toString() method. + + If the output is provided off the stack, it should be large + enough to encompass the entire transcoding; failing to do + so will cause the output to be moved onto the heap instead. + + Returns a slice of the output buffer, corresponding to the + converted characters. For optimum performance, the returned + buffer should be specified as 'output' on subsequent calls. + +*******************************************************************************/ + +wchar[] toString16 (char[] input, wchar[] output=null, uint* ate=null) +{ + int produced; + char* pIn = input.ptr; + char* pMax = pIn + input.length; + char* pValid; + + if (ate is null) + if (input.length > output.length) + output.length = input.length; + + if (input.length) + foreach (inout wchar d; output) + { + pValid = pIn; + wchar b = cast(wchar) *pIn; + + if (b & 0x80) + if (b < 0xe0) + { + b &= 0x1f; + b = (b << 6) | (*++pIn & 0x3f); + } + else + if (b < 0xf0) + { + b &= 0x0f; + b = (b << 6) | (pIn[1] & 0x3f); + b = (b << 6) | (pIn[2] & 0x3f); + pIn += 2; + } + else + // deal with surrogate-pairs + return toString16 (toString32(input, null, ate), output); + + d = b; + ++produced; + + // did we read past the end of the input? + if (++pIn >= pMax) + if (pIn > pMax) + { + // yep ~ return tail or throw error? + if (ate) + { + pIn = pValid; + --produced; + break; + } + onUnicodeError ("Unicode.toString16 : incomplete utf8 input", pIn - input.ptr); + } + else + break; + } + + // do we still have some input left? + if (ate) + *ate = pIn - input.ptr; + else + if (pIn < pMax) + // this should never happen! + onUnicodeError ("Unicode.toString16 : utf8 overflow", pIn - input.ptr); + + // return the produced output + return output [0..produced]; +} + + +/******************************************************************************* + + Encode Utf8 up to a maximum of 4 bytes long (five & six + byte variations are not supported). Throws an exception + where the input dchar is greater than 0x10ffff. + + If the output is provided off the stack, it should be large + enough to encompass the entire transcoding; failing to do + so will cause the output to be moved onto the heap instead. + + Returns a slice of the output buffer, corresponding to the + converted characters. For optimum performance, the returned + buffer should be specified as 'output' on subsequent calls. + +*******************************************************************************/ + +char[] toString (dchar[] input, char[] output=null, uint* ate=null) +{ + if (ate) + *ate = input.length; + else + { + // potentially reallocate output + int estimate = input.length * 2 + 4; + if (output.length < estimate) + output.length = estimate; + } + + char* pOut = output.ptr; + char* pMax = pOut + output.length - 4; + + foreach (int eaten, dchar b; input) + { + // about to overflow the output? + if (pOut > pMax) + { + // if streaming, just return the unused input + if (ate) + { + *ate = eaten; + break; + } + + // reallocate the output buffer + int len = pOut - output.ptr; + output.length = len + len / 2; + pOut = output.ptr + len; + pMax = output.ptr + output.length - 4; + } + + if (b < 0x80) + *pOut++ = b; + else + if (b < 0x0800) + { + pOut[0] = 0xc0 | ((b >> 6) & 0x3f); + pOut[1] = 0x80 | (b & 0x3f); + pOut += 2; + } + else + if (b < 0x10000) + { + pOut[0] = 0xe0 | ((b >> 12) & 0x3f); + pOut[1] = 0x80 | ((b >> 6) & 0x3f); + pOut[2] = 0x80 | (b & 0x3f); + pOut += 3; + } + else + if (b < 0x110000) + { + pOut[0] = 0xf0 | ((b >> 18) & 0x3f); + pOut[1] = 0x80 | ((b >> 12) & 0x3f); + pOut[2] = 0x80 | ((b >> 6) & 0x3f); + pOut[3] = 0x80 | (b & 0x3f); + pOut += 4; + } + else + onUnicodeError ("Unicode.toString : invalid dchar", eaten); + } + + // return the produced output + return output [0..(pOut - output.ptr)]; +} + + +/******************************************************************************* + + Decode Utf8 produced by the above toString() method. + + If the output is provided off the stack, it should be large + enough to encompass the entire transcoding; failing to do + so will cause the output to be moved onto the heap instead. + + Returns a slice of the output buffer, corresponding to the + converted characters. For optimum performance, the returned + buffer should be specified as 'output' on subsequent calls. + +*******************************************************************************/ + +dchar[] toString32 (char[] input, dchar[] output=null, uint* ate=null) +{ + int produced; + char* pIn = input.ptr; + char* pMax = pIn + input.length; + char* pValid; + + if (ate is null) + if (input.length > output.length) + output.length = input.length; + + if (input.length) + foreach (inout dchar d; output) + { + pValid = pIn; + dchar b = cast(dchar) *pIn; + + if (b & 0x80) + if (b < 0xe0) + { + b &= 0x1f; + b = (b << 6) | (*++pIn & 0x3f); + } + else + if (b < 0xf0) + { + b &= 0x0f; + b = (b << 6) | (pIn[1] & 0x3f); + b = (b << 6) | (pIn[2] & 0x3f); + pIn += 2; + } + else + { + b &= 0x07; + b = (b << 6) | (pIn[1] & 0x3f); + b = (b << 6) | (pIn[2] & 0x3f); + b = (b << 6) | (pIn[3] & 0x3f); + + if (b >= 0x110000) + onUnicodeError ("Unicode.toString32 : invalid utf8 input", pIn - input.ptr); + pIn += 3; + } + + d = b; + ++produced; + + // did we read past the end of the input? + if (++pIn >= pMax) + if (pIn > pMax) + { + // yep ~ return tail or throw error? + if (ate) + { + pIn = pValid; + --produced; + break; + } + onUnicodeError ("Unicode.toString32 : incomplete utf8 input", pIn - input.ptr); + } + else + break; + } + + // do we still have some input left? + if (ate) + *ate = pIn - input.ptr; + else + if (pIn < pMax) + // this should never happen! + onUnicodeError ("Unicode.toString32 : utf8 overflow", pIn - input.ptr); + + // return the produced output + return output [0..produced]; +} + +/******************************************************************************* + + Encode Utf16 up to a maximum of 2 bytes long. Throws an exception + where the input dchar is greater than 0x10ffff. + + If the output is provided off the stack, it should be large + enough to encompass the entire transcoding; failing to do + so will cause the output to be moved onto the heap instead. + + Returns a slice of the output buffer, corresponding to the + converted characters. For optimum performance, the returned + buffer should be specified as 'output' on subsequent calls. + +*******************************************************************************/ + +wchar[] toString16 (dchar[] input, wchar[] output=null, uint* ate=null) +{ + if (ate) + *ate = input.length; + else + { + int estimate = input.length * 2 + 2; + if (output.length < estimate) + output.length = estimate; + } + + wchar* pOut = output.ptr; + wchar* pMax = pOut + output.length - 2; + + foreach (int eaten, dchar b; input) + { + // about to overflow the output? + if (pOut > pMax) + { + // if streaming, just return the unused input + if (ate) + { + *ate = eaten; + break; + } + + // reallocate the output buffer + int len = pOut - output.ptr; + output.length = len + len / 2; + pOut = output.ptr + len; + pMax = output.ptr + output.length - 2; + } + + if (b < 0x10000) + *pOut++ = b; + else + if (b < 0x110000) + { + pOut[0] = 0xd800 | (((b - 0x10000) >> 10) & 0x3ff); + pOut[1] = 0xdc00 | ((b - 0x10000) & 0x3ff); + pOut += 2; + } + else + onUnicodeError ("Unicode.toString16 : invalid dchar", eaten); + } + + // return the produced output + return output [0..(pOut - output.ptr)]; +} + +/******************************************************************************* + + Decode Utf16 produced by the above toString16() method. + + If the output is provided off the stack, it should be large + enough to encompass the entire transcoding; failing to do + so will cause the output to be moved onto the heap instead. + + Returns a slice of the output buffer, corresponding to the + converted characters. For optimum performance, the returned + buffer should be specified as 'output' on subsequent calls. + +*******************************************************************************/ + +dchar[] toString32 (wchar[] input, dchar[] output=null, uint* ate=null) +{ + int produced; + wchar* pIn = input.ptr; + wchar* pMax = pIn + input.length; + wchar* pValid; + + if (ate is null) + if (input.length > output.length) + output.length = input.length; + + if (input.length) + foreach (inout dchar d; output) + { + pValid = pIn; + dchar b = cast(dchar) *pIn; + + // simple conversion ~ see http://www.unicode.org/faq/utf_bom.html#35 + if (b >= 0xd800 && b <= 0xdfff) + b = ((b - 0xd7c0) << 10) + (*++pIn - 0xdc00); + + if (b >= 0x110000) + onUnicodeError ("Unicode.toString32 : invalid utf16 input", pIn - input.ptr); + + d = b; + ++produced; + + if (++pIn >= pMax) + if (pIn > pMax) + { + // yep ~ return tail or throw error? + if (ate) + { + pIn = pValid; + --produced; + break; + } + onUnicodeError ("Unicode.toString32 : incomplete utf16 input", pIn - input.ptr); + } + else + break; + } + + // do we still have some input left? + if (ate) + *ate = pIn - input.ptr; + else + if (pIn < pMax) + // this should never happen! + onUnicodeError ("Unicode.toString32 : utf16 overflow", pIn - input.ptr); + + // return the produced output + return output [0..produced]; +} + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/text/locale/Collation.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/text/locale/Collation.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,243 @@ +/******************************************************************************* + + copyright: Copyright (c) 2005 John Chapman. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: 2005 + + author: John Chapman + +******************************************************************************/ + +module tango.text.locale.Collation; + +private import tango.text.locale.Core; + +version (Windows) + private import tango.text.locale.Win32; +else version (Posix) + private import tango.text.locale.Posix; + + /** + Compares strings using the specified case and cultural comparision rules. + */ +public class StringComparer { + + private static StringComparer invariant_; + private static StringComparer invariantIgnoreCase_; + private Culture culture_; + private bool ignoreCase_; + + static this() { + invariant_ = new StringComparer(Culture.invariantCulture, false); + invariantIgnoreCase_ = new StringComparer(Culture.invariantCulture, true); + } + + /** + Creates an instance that compares strings using the rules of the specified culture. + Params: + culture = A Culture instance whose rules are used to compare strings. + ignoreCase = true to perform case-insensitive comparisons; false to perform case-sensitive comparisions. + */ + public this(Culture culture, bool ignoreCase) { + culture_ = culture; + ignoreCase_ = ignoreCase; + } + + /** + Compares two strings and returns the sort order. + Returns: + -1 is strA is less than strB; 0 if strA is equal to strB; 1 if strA is greater than strB. + Params: + strA = A string to compare to strB. + strB = A string to compare to strA. + */ + public int compare(char[] strA, char[] strB) { + return nativeMethods.compareString(culture_.id, strA, 0, strA.length, strB, 0, strB.length, ignoreCase_); + } + + /** + Indicates whether the two strings are equal. + Returns: + true if strA and strB are equal; otherwise, false. + Params: + strA = A string to compare to strB. + strB = A string to compare to strA. + */ + public bool equals(char[] strA, char[] strB) { + return (compare(strA, strB) == 0); + } + + /** + $(I Property.) Retrieves an instance that performs case-sensitive comparisons using the rules of the current culture. + Returns: + A new StringComparer instance. + */ + public static StringComparer currentCulture() { + return new StringComparer(Culture.current, false); + } + + /** + $(I Property.) Retrieves an instance that performs case-insensitive comparisons using the rules of the current culture. + Returns: + A new StringComparer instance. + */ + public static StringComparer currentCultureIgnoreCase() { + return new StringComparer(Culture.current, true); + } + + /** + $(I Property.) Retrieves an instance that performs case-sensitive comparisons using the rules of the invariant culture. + Returns: + A new StringComparer instance. + */ + public static StringComparer invariantCulture() { + return invariant_; + } + + /** + $(I Property.) Retrieves an instance that performs case-insensitive comparisons using the rules of the invariant culture. + Returns: + A new StringComparer instance. + */ + public static StringComparer invariantCultureIgnoreCase() { + return invariantIgnoreCase_; + } + +} + +/** + $(I Delegate.) Represents the method that will handle the string comparison. + Remarks: + The delegate has the signature $(I int delegate(char[], char[])). + */ +alias int delegate(char[], char[]) StringComparison; + +/** + Sorts strings according to the rules of the specified culture. + */ +public class StringSorter { + + private static StringSorter invariant_; + private static StringSorter invariantIgnoreCase_; + private Culture culture_; + private StringComparison comparison_; + + static this() { + invariant_ = new StringSorter(StringComparer.invariantCulture); + invariantIgnoreCase_ = new StringSorter(StringComparer.invariantCultureIgnoreCase); + } + + /** + Creates an instance using the specified StringComparer. + Params: + comparer = The StringComparer to use when comparing strings. $(I Optional.) + */ + public this(StringComparer comparer = null) { + if (comparer is null) + comparer = StringComparer.currentCulture; + comparison_ = &comparer.compare; + } + + /** + Creates an instance using the specified delegate. + Params: + comparison = The delegate to use when comparing strings. + Remarks: + The comparison parameter must have the same signature as StringComparison. + */ + public this(StringComparison comparison) { + comparison_ = comparison; + } + + /** + Sorts all the elements in an array. + Params: + array = The array of strings to _sort. + */ + public void sort(inout char[][] array) { + sort(array, 0, array.length); + } + + /** + Sorts a range of the elements in an array. + Params: + array = The array of strings to _sort. + index = The starting index of the range. + count = The number of elements in the range. + */ + public void sort(inout char[][] array, int index, int count) { + + void qsort(int left, int right) { + do { + int i = left, j = right; + char[] pivot = array[left + ((right - left) >> 1)]; + + do { + while (comparison_(array[i], pivot) < 0) + i++; + while (comparison_(pivot, array[j]) < 0) + j--; + + if (i > j) + break; + else if (i < j) { + char[] temp = array[i]; + array[i] = array[j]; + array[j] = temp; + } + + i++; + j--; + } while (i <= j); + + if (j - left <= right - i) { + if (left < j) + qsort(left, j); + left = i; + } + else { + if (i < right) + qsort(i, right); + right = j; + } + } while (left < right); + } + + qsort(index, index + (count - 1)); + } + + /** + $(I Property.) Retrieves an instance that performs a case-sensitive sort using the rules of the current culture. + Returns: A StringSorter instance. + */ + public static StringSorter currentCulture() { + return new StringSorter(StringComparer.currentCulture); + } + + /** + $(I Property.) Retrieves an instance that performs a case-insensitive sort using the rules of the current culture. + Returns: A StringSorter instance. + */ + public static StringSorter currentCultureIgnoreCase() { + return new StringSorter(StringComparer.currentCultureIgnoreCase); + } + + /** + $(I Property.) Retrieves an instance that performs a case-sensitive sort using the rules of the invariant culture. + Returns: A StringSorter instance. + */ + public static StringSorter invariantCulture() { + return invariant_; + } + + /** + $(I Property.) Retrieves an instance that performs a case-insensitive sort using the rules of the invariant culture. + Returns: A StringSorter instance. + */ + public static StringSorter invariantCultureIgnoreCase() { + return invariantIgnoreCase_; + } + +} \ No newline at end of file diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/text/locale/Convert.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/text/locale/Convert.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,1560 @@ +/******************************************************************************* + + copyright: Copyright (c) 2005 John Chapman. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: 2005 + + author: John Chapman + +******************************************************************************/ + +module tango.text.locale.Convert; + +private import tango.time.WallClock; + +private import tango.core.Exception; + +private import tango.text.locale.Core; + +private import tango.time.chrono.Calendar; + +private import Integer = tango.text.convert.Integer; + +/****************************************************************************** + +******************************************************************************/ + +private struct Result +{ + private uint index; + private char[] target_; + + /********************************************************************** + + **********************************************************************/ + + private static Result opCall (char[] target) + { + Result result; + + result.target_ = target; + return result; + } + + /********************************************************************** + + **********************************************************************/ + + private void opCatAssign (char[] rhs) + { + uint end = index + rhs.length; + + target_[index .. end] = rhs; + index = end; + } + + /********************************************************************** + + **********************************************************************/ + + private void opCatAssign (char rhs) + { + target_[index++] = rhs; + } + + /********************************************************************** + + **********************************************************************/ + + private char[] get () + { + return target_[0 .. index]; + } + + /********************************************************************** + + **********************************************************************/ + + private char[] scratch () + { + return target_; + } +} + + +/****************************************************************************** + + * Converts the value of this instance to its equivalent string representation using the specified _format and culture-specific formatting information. + * Params: + * format = A _format string. + * formatService = An IFormatService that provides culture-specific formatting information. + * Returns: A string representation of the value of this instance as specified by format and formatService. + * Remarks: See $(LINK2 datetimeformat.html, Time Formatting) for more information about date and time formatting. + * Examples: + * --- + * import tango.io.Print, tango.text.locale.Core, tango.time.WallClock; + * + * void main() { + * Culture culture = Culture.current; + * Time now = WallClock.now; + * + * Println("Current date and time: %s", now.toString()); + * Println(); + * + * // Format the current date and time in a number of ways. + * Println("Culture: %s", culture.englishName); + * Println(); + * + * Println("Short date: %s", now.toString("d")); + * Println("Long date: %s", now.toString("D")); + * Println("Short time: %s", now.toString("t")); + * Println("Long time: %s", now.toString("T")); + * Println("General date short time: %s", now.toString("g")); + * Println("General date long time: %s", now.toString("G")); + * Println("Month: %s", now.toString("M")); + * Println("RFC1123: %s", now.toString("R")); + * Println("Sortable: %s", now.toString("s")); + * Println("Year: %s", now.toString("Y")); + * Println(); + * + * // Display the same values using a different culture. + * culture = Culture.getCulture("fr-FR"); + * Println("Culture: %s", culture.englishName); + * Println(); + * + * Println("Short date: %s", now.toString("d", culture)); + * Println("Long date: %s", now.toString("D", culture)); + * Println("Short time: %s", now.toString("t", culture)); + * Println("Long time: %s", now.toString("T", culture)); + * Println("General date short time: %s", now.toString("g", culture)); + * Println("General date long time: %s", now.toString("G", culture)); + * Println("Month: %s", now.toString("M", culture)); + * Println("RFC1123: %s", now.toString("R", culture)); + * Println("Sortable: %s", now.toString("s", culture)); + * Println("Year: %s", now.toString("Y", culture)); + * Println(); + * } + * + * // Produces the following output: + * // Current date and time: 26/05/2006 10:04:57 AM + * // + * // Culture: English (United Kingdom) + * // + * // Short date: 26/05/2006 + * // Long date: 26 May 2006 + * // Short time: 10:04 + * // Long time: 10:04:57 AM + * // General date short time: 26/05/2006 10:04 + * // General date long time: 26/05/2006 10:04:57 AM + * // Month: 26 May + * // RFC1123: Fri, 26 May 2006 10:04:57 GMT + * // Sortable: 2006-05-26T10:04:57 + * // Year: May 2006 + * // + * // Culture: French (France) + * // + * // Short date: 26/05/2006 + * // Long date: vendredi 26 mai 2006 + * // Short time: 10:04 + * // Long time: 10:04:57 + * // General date short time: 26/05/2006 10:04 + * // General date long time: 26/05/2006 10:04:57 + * // Month: 26 mai + * // RFC1123: ven., 26 mai 2006 10:04:57 GMT + * // Sortable: 2006-05-26T10:04:57 + * // Year: mai 2006 + * --- + +******************************************************************************/ + +public char[] formatDateTime (char[] output, Time dateTime, char[] format, IFormatService formatService = null) +{ + return formatDateTime (output, dateTime, format, DateTimeFormat.getInstance(formatService)); +} + +char[] formatDateTime (char[] output, Time dateTime, char[] format, DateTimeFormat dtf) +{ + /********************************************************************** + + **********************************************************************/ + + char[] expandKnownFormat(char[] format, inout Time dateTime) + { + char[] f; + + switch (format[0]) + { + case 'd': + f = dtf.shortDatePattern; + break; + case 'D': + f = dtf.longDatePattern; + break; + case 'f': + f = dtf.longDatePattern ~ " " ~ dtf.shortTimePattern; + break; + case 'F': + f = dtf.fullDateTimePattern; + break; + case 'g': + f = dtf.generalShortTimePattern; + break; + case 'G': + f = dtf.generalLongTimePattern; + break; + case 'm': + case 'M': + f = dtf.monthDayPattern; + break; + case 'r': + case 'R': + f = dtf.rfc1123Pattern; + break; + case 's': + f = dtf.sortableDateTimePattern; + break; + case 't': + f = dtf.shortTimePattern; + break; + case 'T': + f = dtf.longTimePattern; + break; +version (Full) +{ + case 'u': + dateTime = dateTime.toUniversalTime(); + dtf = DateTimeFormat.invariantFormat; + f = dtf.universalSortableDateTimePattern; + break; + case 'U': + dtf = cast(DateTimeFormat) dtf.clone(); + dateTime = dateTime.toUniversalTime(); + if (typeid(typeof(dtf.calendar)) !is typeid(Gregorian)) + dtf.calendar = Gregorian.generic; + f = dtf.fullDateTimePattern; + break; +} + case 'y': + case 'Y': + f = dtf.yearMonthPattern; + break; + default: + throw new IllegalArgumentException("Invalid date format."); + } + + return f; + } + + /********************************************************************** + + **********************************************************************/ + + char[] formatCustom (inout Result result, Time dateTime, char[] format) + { + + int parseRepeat(char[] format, int pos, char c) + { + int n = pos + 1; + while (n < format.length && format[n] is c) + n++; + return n - pos; + } + + char[] formatDayOfWeek(Calendar.DayOfWeek dayOfWeek, int rpt) + { + if (rpt is 3) + return dtf.getAbbreviatedDayName(dayOfWeek); + return dtf.getDayName(dayOfWeek); + } + + char[] formatMonth(int month, int rpt) + { + if (rpt is 3) + return dtf.getAbbreviatedMonthName(month); + return dtf.getMonthName(month); + } + + char[] formatInt (char[] tmp, int v, int minimum) + { + auto num = Integer.format (tmp, v, Integer.Style.Unsigned); + if ((minimum -= num.length) > 0) + { + auto p = tmp.ptr + tmp.length - num.length; + while (minimum--) + *--p = '0'; + num = tmp [p-tmp.ptr .. $]; + } + return num; + } + + int parseQuote(char[] format, int pos, out char[] result) + { + int start = pos; + char chQuote = format[pos++]; + bool found; + while (pos < format.length) + { + char c = format[pos++]; + if (c is chQuote) + { + found = true; + break; + } + else + if (c is '\\') + { // escaped + if (pos < format.length) + result ~= format[pos++]; + } + else + result ~= c; + } + return pos - start; + } + + + Calendar calendar = dtf.calendar; + bool justTime = true; + int index, len; + char[10] tmp; + + if (format[0] is '%') + { + // specifiers for both standard format strings and custom ones + const char[] commonSpecs = "dmMsty"; + foreach (c; commonSpecs) + if (format[1] is c) + { + index += 1; + break; + } + } + + while (index < format.length) + { + char c = format[index]; + auto time = dateTime.time; + + switch (c) + { + case 'd': // day + len = parseRepeat(format, index, c); + if (len <= 2) + { + int day = calendar.getDayOfMonth(dateTime); + result ~= formatInt (tmp, day, len); + } + else + result ~= formatDayOfWeek(calendar.getDayOfWeek(dateTime), len); + justTime = false; + break; + + case 'M': // month + len = parseRepeat(format, index, c); + int month = calendar.getMonth(dateTime); + if (len <= 2) + result ~= formatInt (tmp, month, len); + else + result ~= formatMonth(month, len); + justTime = false; + break; + case 'y': // year + len = parseRepeat(format, index, c); + int year = calendar.getYear(dateTime); + // Two-digit years for Japanese + if (calendar.id is Calendar.JAPAN) + result ~= formatInt (tmp, year, 2); + else + { + if (len <= 2) + result ~= formatInt (tmp, year % 100, len); + else + result ~= formatInt (tmp, year, len); + } + justTime = false; + break; + case 'h': // hour (12-hour clock) + len = parseRepeat(format, index, c); + int hour = time.hours % 12; + if (hour is 0) + hour = 12; + result ~= formatInt (tmp, hour, len); + break; + case 'H': // hour (24-hour clock) + len = parseRepeat(format, index, c); + result ~= formatInt (tmp, time.hours, len); + break; + case 'm': // minute + len = parseRepeat(format, index, c); + result ~= formatInt (tmp, time.minutes, len); + break; + case 's': // second + len = parseRepeat(format, index, c); + result ~= formatInt (tmp, time.seconds, len); + break; + case 't': // AM/PM + len = parseRepeat(format, index, c); + if (len is 1) + { + if (time.hours < 12) + { + if (dtf.amDesignator.length != 0) + result ~= dtf.amDesignator[0]; + } + else + { + if (dtf.pmDesignator.length != 0) + result ~= dtf.pmDesignator[0]; + } + } + else + result ~= (time.hours < 12) ? dtf.amDesignator : dtf.pmDesignator; + break; + case 'z': // timezone offset + len = parseRepeat(format, index, c); +version (Full) +{ + TimeSpan offset = (justTime && dateTime.ticks < TICKS_PER_DAY) + ? TimeZone.current.getUtcOffset(WallClock.now) + : TimeZone.current.getUtcOffset(dateTime); + int hours = offset.hours; + int minutes = offset.minutes; + result ~= (offset.backward) ? '-' : '+'; +} +else +{ + auto minutes = cast(int) (WallClock.zone.minutes); + if (minutes < 0) + minutes = -minutes, result ~= '-'; + else + result ~= '+'; + int hours = minutes / 60; + minutes %= 60; +} + if (len is 1) + result ~= formatInt (tmp, hours, 1); + else + if (len is 2) + result ~= formatInt (tmp, hours, 2); + else + { + result ~= formatInt (tmp, hours, 2); + result ~= ':'; + result ~= formatInt (tmp, minutes, 2); + } + break; + case ':': // time separator + len = 1; + result ~= dtf.timeSeparator; + break; + case '/': // date separator + len = 1; + result ~= dtf.dateSeparator; + break; + case '\"': // string literal + case '\'': // char literal + char[] quote; + len = parseQuote(format, index, quote); + result ~= quote; + break; + default: + len = 1; + result ~= c; + break; + } + index += len; + } + return result.get; + } + + + auto result = Result (output); + + if (format is null) + format = "G"; // Default to general format. + + if (format.length is 1) // It might be one of our shortcuts. + format = expandKnownFormat (format, dateTime); + + return formatCustom (result, dateTime, format); +} + + + +/******************************************************************************* + +*******************************************************************************/ + +private extern (C) private char* ecvt(double d, int digits, out int decpt, out bool sign); + +/******************************************************************************* + +*******************************************************************************/ + +// Must match NumberFormat.decimalPositivePattern +package const char[] positiveNumberFormat = "#"; + +// Must match NumberFormat.decimalNegativePattern +package const char[][] negativeNumberFormats = + [ + "(#)", "-#", "- #", "#-", "# -" + ]; + +// Must match NumberFormat.currencyPositivePattern +package const char[][] positiveCurrencyFormats = + [ + "$#", "#$", "$ #", "# $" + ]; + +// Must match NumberFormat.currencyNegativePattern +package const char[][] negativeCurrencyFormats = + [ + "($#)", "-$#", "$-#", "$#-", "(#$)", + "-#$", "#-$", "#$-", "-# $", "-$ #", + "# $-", "$ #-", "$ -#", "#- $", "($ #)", "(# $)" + ]; + +/******************************************************************************* + +*******************************************************************************/ + +package template charTerm (T) +{ + package int charTerm(T* s) + { + int i; + while (*s++ != '\0') + i++; + return i; + } +} + +/******************************************************************************* + +*******************************************************************************/ + +char[] longToString (char[] buffer, long value, int digits, char[] negativeSign) +{ + if (digits < 1) + digits = 1; + + int n = buffer.length; + ulong uv = (value >= 0) ? value : cast(ulong) -value; + + if (uv > uint.max) + { + while (--digits >= 0 || uv != 0) + { + buffer[--n] = uv % 10 + '0'; + uv /= 10; + } + } + else + { + uint v = cast(uint) uv; + while (--digits >= 0 || v != 0) + { + buffer[--n] = v % 10 + '0'; + v /= 10; + } + } + + + if (value < 0) + { + for (int i = negativeSign.length - 1; i >= 0; i--) + buffer[--n] = negativeSign[i]; + } + + return buffer[n .. $]; +} + +/******************************************************************************* + +*******************************************************************************/ + +char[] longToHexString (char[] buffer, ulong value, int digits, char format) +{ + if (digits < 1) + digits = 1; + + int n = buffer.length; + while (--digits >= 0 || value != 0) + { + auto v = cast(uint) value & 0xF; + buffer[--n] = (v < 10) ? v + '0' : v + format - ('X' - 'A' + 10); + value >>= 4; + } + + return buffer[n .. $]; +} + +/******************************************************************************* + +*******************************************************************************/ + +char[] longToBinString (char[] buffer, ulong value, int digits) +{ + if (digits < 1) + digits = 1; + + int n = buffer.length; + while (--digits >= 0 || value != 0) + { + buffer[--n] = (value & 1) + '0'; + value >>= 1; + } + + return buffer[n .. $]; +} + +/******************************************************************************* + +*******************************************************************************/ + +char parseFormatSpecifier (char[] format, out int length) +{ + int i = -1; + char specifier; + + if (format.length) + { + auto s = format[0]; + + if (s >= 'A' && s <= 'Z' || s >= 'a' && s <= 'z') + { + specifier = s; + + foreach (c; format [1..$]) + if (c >= '0' && c <= '9') + { + c -= '0'; + if (i < 0) + i = c; + else + i = i * 10 + c; + } + else + break; + } + } + else + specifier = 'G'; + + length = i; + return specifier; +} + +/******************************************************************************* + +*******************************************************************************/ + +char[] formatInteger (char[] output, long value, char[] format, NumberFormat nf) +{ + int length; + auto specifier = parseFormatSpecifier (format, length); + + switch (specifier) + { + case 'g': + case 'G': + if (length > 0) + break; + // Fall through. + + case 'd': + case 'D': + return longToString (output, value, length, nf.negativeSign); + + case 'x': + case 'X': + return longToHexString (output, cast(ulong)value, length, specifier); + + case 'b': + case 'B': + return longToBinString (output, cast(ulong)value, length); + + default: + break; + } + + Result result = Result (output); + Number number = Number (value); + if (specifier != char.init) + return toString (number, result, specifier, length, nf); + + return number.toStringFormat (result, format, nf); +} + +/******************************************************************************* + +*******************************************************************************/ + +private enum { + EXP = 0x7ff, + NAN_FLAG = 0x80000000, + INFINITY_FLAG = 0x7fffffff, + } + +char[] formatDouble (char[] output, double value, char[] format, NumberFormat nf) +{ + int length; + int precision = 6; + Result result = Result (output); + char specifier = parseFormatSpecifier (format, length); + + switch (specifier) + { + case 'r': + case 'R': + Number number = Number (value, 15); + + if (number.scale == NAN_FLAG) + return nf.nanSymbol; + + if (number.scale == INFINITY_FLAG) + return number.sign ? nf.negativeInfinitySymbol + : nf.positiveInfinitySymbol; + + double d; + number.toDouble(d); + if (d == value) + return toString (number, result, 'G', 15, nf); + + number = Number(value, 17); + return toString (number, result, 'G', 17, nf); + + case 'g': + case 'G': + if (length > 15) + precision = 17; + // Fall through. + + default: + break; + } + + Number number = Number(value, precision); + + if (number.scale == NAN_FLAG) + return nf.nanSymbol; + + if (number.scale == INFINITY_FLAG) + return number.sign ? nf.negativeInfinitySymbol + : nf.positiveInfinitySymbol; + + if (specifier != char.init) + return toString (number, result, specifier, length, nf); + + return number.toStringFormat (result, format, nf); +} + +/******************************************************************************* + +*******************************************************************************/ + +void formatGeneral (inout Number number, inout Result target, int length, char format, NumberFormat nf) +{ + int pos = number.scale; + + auto p = number.digits.ptr; + if (pos > 0) + { + while (pos > 0) + { + target ~= (*p != '\0') ? *p++ : '0'; + pos--; + } + } + else + target ~= '0'; + + if (*p != '\0') + { + target ~= nf.numberDecimalSeparator; + while (pos < 0) + { + target ~= '0'; + pos++; + } + + while (*p != '\0') + target ~= *p++; + } +} + +/******************************************************************************* + +*******************************************************************************/ + +void formatNumber (inout Number number, inout Result target, int length, NumberFormat nf) +{ + char[] format = number.sign ? negativeNumberFormats[nf.numberNegativePattern] + : positiveNumberFormat; + + // Parse the format. + foreach (c; format) + { + switch (c) + { + case '#': + formatFixed (number, target, length, nf.numberGroupSizes, + nf.numberDecimalSeparator, nf.numberGroupSeparator); + break; + + case '-': + target ~= nf.negativeSign; + break; + + default: + target ~= c; + break; + } + } +} + +/******************************************************************************* + +*******************************************************************************/ + +void formatCurrency (inout Number number, inout Result target, int length, NumberFormat nf) +{ + char[] format = number.sign ? negativeCurrencyFormats[nf.currencyNegativePattern] + : positiveCurrencyFormats[nf.currencyPositivePattern]; + + // Parse the format. + foreach (c; format) + { + switch (c) + { + case '#': + formatFixed (number, target, length, nf.currencyGroupSizes, + nf.currencyDecimalSeparator, nf.currencyGroupSeparator); + break; + + case '-': + target ~= nf.negativeSign; + break; + + case '$': + target ~= nf.currencySymbol; + break; + + default: + target ~= c; + break; + } + } +} + +/******************************************************************************* + +*******************************************************************************/ + +void formatFixed (inout Number number, inout Result target, int length, + int[] groupSizes, char[] decimalSeparator, char[] groupSeparator) +{ + int pos = number.scale; + auto p = number.digits.ptr; + + if (pos > 0) + { + if (groupSizes.length != 0) + { + // Calculate whether we have enough digits to format. + int count = groupSizes[0]; + int index, size; + + while (pos > count) + { + size = groupSizes[index]; + if (size == 0) + break; + + if (index < groupSizes.length - 1) + index++; + + count += groupSizes[index]; + } + + size = (count == 0) ? 0 : groupSizes[0]; + + // Insert the separator according to groupSizes. + int end = charTerm(p); + int start = (pos < end) ? pos : end; + + + char[] separator = groupSeparator; + index = 0; + + // questionable: use the back end of the output buffer to + // format the separators, and then copy back to start + char[] temp = target.scratch; + uint ii = temp.length; + + for (int c, i = pos - 1; i >= 0; i--) + { + temp[--ii] = (i < start) ? number.digits[i] : '0'; + if (size > 0) + { + c++; + if (c == size && i != 0) + { + uint iii = ii - separator.length; + temp[iii .. ii] = separator; + ii = iii; + + if (index < groupSizes.length - 1) + size = groupSizes[++index]; + + c = 0; + } + } + } + target ~= temp[ii..$]; + p += start; + } + else + { + while (pos > 0) + { + target ~= (*p != '\0') ? *p++ : '0'; + pos--; + } + } + } + else + // Negative scale. + target ~= '0'; + + if (length > 0) + { + target ~= decimalSeparator; + while (pos < 0 && length > 0) + { + target ~= '0'; + pos++; + length--; + } + + while (length > 0) + { + target ~= (*p != '\0') ? *p++ : '0'; + length--; + } + } +} + +/****************************************************************************** + +******************************************************************************/ + +char[] toString (inout Number number, inout Result result, char format, int length, NumberFormat nf) +{ + switch (format) + { + case 'c': + case 'C': + // Currency + if (length < 0) + length = nf.currencyDecimalDigits; + + number.round(number.scale + length); + formatCurrency (number, result, length, nf); + break; + + case 'f': + case 'F': + // Fixed + if (length < 0) + length = nf.numberDecimalDigits; + + number.round(number.scale + length); + if (number.sign) + result ~= nf.negativeSign; + + formatFixed (number, result, length, null, nf.numberDecimalSeparator, null); + break; + + case 'n': + case 'N': + // Number + if (length < 0) + length = nf.numberDecimalDigits; + + number.round (number.scale + length); + formatNumber (number, result, length, nf); + break; + + case 'g': + case 'G': + // General + if (length < 1) + length = number.precision; + + number.round(length); + if (number.sign) + result ~= nf.negativeSign; + + formatGeneral (number, result, length, (format == 'g') ? 'e' : 'E', nf); + break; + + default: + return "{invalid FP format specifier '" ~ format ~ "'}"; + } + return result.get; +} + + +/******************************************************************************* + +*******************************************************************************/ + +private struct Number +{ + int scale; + bool sign; + int precision; + char[32] digits = void; + + /********************************************************************** + + **********************************************************************/ + + private static Number opCall (long value) + { + Number number; + number.precision = 20; + + if (value < 0) + { + number.sign = true; + value = -value; + } + + char[20] buffer = void; + int n = buffer.length; + + while (value != 0) + { + buffer[--n] = value % 10 + '0'; + value /= 10; + } + + int end = number.scale = -(n - buffer.length); + number.digits[0 .. end] = buffer[n .. n + end]; + number.digits[end] = '\0'; + + return number; + } + + /********************************************************************** + + **********************************************************************/ + + private static Number opCall (double value, int precision) + { + Number number; + number.precision = precision; + + auto p = number.digits.ptr; + long bits = *cast(long*) & value; + long mant = bits & 0x000FFFFFFFFFFFFFL; + int exp = cast(int)((bits >> 52) & EXP); + + if (exp == EXP) + { + number.scale = (mant != 0) ? NAN_FLAG : INFINITY_FLAG; + if (((bits >> 63) & 1) != 0) + number.sign = true; + } + else + { + // Get the digits, decimal point and sign. + char* chars = ecvt(value, number.precision, number.scale, number.sign); + if (*chars != '\0') + { + while (*chars != '\0') + *p++ = *chars++; + } + } + + *p = '\0'; + return number; + } + + /********************************************************************** + + **********************************************************************/ + + private bool toDouble(out double value) + { + const ulong[] pow10 = + [ + 0xa000000000000000UL, + 0xc800000000000000UL, + 0xfa00000000000000UL, + 0x9c40000000000000UL, + 0xc350000000000000UL, + 0xf424000000000000UL, + 0x9896800000000000UL, + 0xbebc200000000000UL, + 0xee6b280000000000UL, + 0x9502f90000000000UL, + 0xba43b74000000000UL, + 0xe8d4a51000000000UL, + 0x9184e72a00000000UL, + 0xb5e620f480000000UL, + 0xe35fa931a0000000UL, + 0xcccccccccccccccdUL, + 0xa3d70a3d70a3d70bUL, + 0x83126e978d4fdf3cUL, + 0xd1b71758e219652eUL, + 0xa7c5ac471b478425UL, + 0x8637bd05af6c69b7UL, + 0xd6bf94d5e57a42beUL, + 0xabcc77118461ceffUL, + 0x89705f4136b4a599UL, + 0xdbe6fecebdedd5c2UL, + 0xafebff0bcb24ab02UL, + 0x8cbccc096f5088cfUL, + 0xe12e13424bb40e18UL, + 0xb424dc35095cd813UL, + 0x901d7cf73ab0acdcUL, + 0x8e1bc9bf04000000UL, + 0x9dc5ada82b70b59eUL, + 0xaf298d050e4395d6UL, + 0xc2781f49ffcfa6d4UL, + 0xd7e77a8f87daf7faUL, + 0xefb3ab16c59b14a0UL, + 0x850fadc09923329cUL, + 0x93ba47c980e98cdeUL, + 0xa402b9c5a8d3a6e6UL, + 0xb616a12b7fe617a8UL, + 0xca28a291859bbf90UL, + 0xe070f78d39275566UL, + 0xf92e0c3537826140UL, + 0x8a5296ffe33cc92cUL, + 0x9991a6f3d6bf1762UL, + 0xaa7eebfb9df9de8aUL, + 0xbd49d14aa79dbc7eUL, + 0xd226fc195c6a2f88UL, + 0xe950df20247c83f8UL, + 0x81842f29f2cce373UL, + 0x8fcac257558ee4e2UL, + ]; + + const uint[] pow10Exp = + [ + 4, 7, 10, 14, 17, 20, 24, 27, 30, 34, + 37, 40, 44, 47, 50, 54, 107, 160, 213, 266, + 319, 373, 426, 479, 532, 585, 638, 691, 745, 798, + 851, 904, 957, 1010, 1064, 1117 + ]; + + uint getDigits(char* p, int len) + { + char* end = p + len; + uint r = *p - '0'; + p++; + while (p < end) + { + r = 10 * r + *p - '0'; + p++; + } + return r; + } + + ulong mult64(uint val1, uint val2) + { + return cast(ulong)val1 * cast(ulong)val2; + } + + ulong mult64L(ulong val1, ulong val2) + { + ulong v = mult64(cast(uint)(val1 >> 32), cast(uint)(val2 >> 32)); + v += mult64(cast(uint)(val1 >> 32), cast(uint)val2) >> 32; + v += mult64(cast(uint)val1, cast(uint)(val2 >> 32)) >> 32; + return v; + } + + auto p = digits.ptr; + int count = charTerm(p); + int left = count; + + while (*p == '0') + { + left--; + p++; + } + + // If the digits consist of nothing but zeros... + if (left == 0) + { + value = 0.0; + return true; + } + + // Get digits, 9 at a time. + int n = (left > 9) ? 9 : left; + left -= n; + ulong bits = getDigits(p, n); + if (left > 0) + { + n = (left > 9) ? 9 : left; + left -= n; + bits = mult64(cast(uint)bits, cast(uint)(pow10[n - 1] >>> (64 - pow10Exp[n - 1]))); + bits += getDigits(p + 9, n); + } + + int scale = this.scale - (count - left); + int s = (scale < 0) ? -scale : scale; + + if (s >= 352) + { + *cast(long*)&value = (scale > 0) ? 0x7FF0000000000000 : 0; + return false; + } + + // Normalise mantissa and bits. + int bexp = 64; + int nzero; + if ((bits >> 32) != 0) + nzero = 32; + + if ((bits >> (16 + nzero)) != 0) + nzero += 16; + + if ((bits >> (8 + nzero)) != 0) + nzero += 8; + + if ((bits >> (4 + nzero)) != 0) + nzero += 4; + + if ((bits >> (2 + nzero)) != 0) + nzero += 2; + + if ((bits >> (1 + nzero)) != 0) + nzero++; + + if ((bits >> nzero) != 0) + nzero++; + + bits <<= 64 - nzero; + bexp -= 64 - nzero; + + // Get decimal exponent. + if ((s & 15) != 0) + { + int expMult = pow10Exp[(s & 15) - 1]; + bexp += (scale < 0) ? ( -expMult + 1) : expMult; + bits = mult64L(bits, pow10[(s & 15) + ((scale < 0) ? 15 : 0) - 1]); + if ((bits & 0x8000000000000000L) == 0) + { + bits <<= 1; + bexp--; + } + } + + if ((s >> 4) != 0) + { + int expMult = pow10Exp[15 + ((s >> 4) - 1)]; + bexp += (scale < 0) ? ( -expMult + 1) : expMult; + bits = mult64L(bits, pow10[30 + ((s >> 4) + ((scale < 0) ? 21 : 0) - 1)]); + if ((bits & 0x8000000000000000L) == 0) + { + bits <<= 1; + bexp--; + } + } + + // Round and scale. + if (cast(uint)bits & (1 << 10) != 0) + { + bits += (1 << 10) - 1 + (bits >>> 11) & 1; + bits >>= 11; + if (bits == 0) + bexp++; + } + else + bits >>= 11; + + bexp += 1022; + if (bexp <= 0) + { + if (bexp < -53) + bits = 0; + else + bits >>= ( -bexp + 1); + } + bits = (cast(ulong)bexp << 52) + (bits & 0x000FFFFFFFFFFFFFL); + + if (sign) + bits |= 0x8000000000000000L; + + value = *cast(double*) & bits; + return true; + } + + + + /********************************************************************** + + **********************************************************************/ + + private char[] toStringFormat (inout Result result, char[] format, NumberFormat nf) + { + bool hasGroups; + int groupCount; + int groupPos = -1, pointPos = -1; + int first = int.max, last, count; + bool scientific; + int n; + char c; + + while (n < format.length) + { + c = format[n++]; + switch (c) + { + case '#': + count++; + break; + + case '0': + if (first == int.max) + first = count; + count++; + last = count; + break; + + case '.': + if (pointPos < 0) + pointPos = count; + break; + + case ',': + if (count > 0 && pointPos < 0) + { + if (groupPos >= 0) + { + if (groupPos == count) + { + groupCount++; + break; + } + hasGroups = true; + } + groupPos = count; + groupCount = 1; + } + break; + + case '\'': + case '\"': + while (n < format.length && format[n++] != c) + {} + break; + + case '\\': + if (n < format.length) + n++; + break; + + default: + break; + } + } + + if (pointPos < 0) + pointPos = count; + + int adjust; + if (groupPos >= 0) + { + if (groupPos == pointPos) + adjust -= groupCount * 3; + else + hasGroups = true; + } + + if (digits[0] != '\0') + { + scale += adjust; + round(scientific ? count : scale + count - pointPos); + } + + first = (first < pointPos) ? pointPos - first : 0; + last = (last > pointPos) ? pointPos - last : 0; + + int pos = pointPos; + int extra; + if (!scientific) + { + pos = (scale > pointPos) ? scale : pointPos; + extra = scale - pointPos; + } + + char[] groupSeparator = nf.numberGroupSeparator; + char[] decimalSeparator = nf.numberDecimalSeparator; + + // Work out the positions of the group separator. + int[] groupPositions; + int groupIndex = -1; + if (hasGroups) + { + if (nf.numberGroupSizes.length == 0) + hasGroups = false; + else + { + int groupSizesTotal = nf.numberGroupSizes[0]; + int groupSize = groupSizesTotal; + int digitsTotal = pos + ((extra < 0) ? extra : 0); + int digitCount = (first > digitsTotal) ? first : digitsTotal; + + int sizeIndex; + while (digitCount > groupSizesTotal) + { + if (groupSize == 0) + break; + + groupPositions ~= groupSizesTotal; + groupIndex++; + + if (sizeIndex < nf.numberGroupSizes.length - 1) + groupSize = nf.numberGroupSizes[++sizeIndex]; + + groupSizesTotal += groupSize; + } + } + } + + //char[] result; + if (sign) + result ~= nf.negativeSign; + + auto p = digits.ptr; + n = 0; + bool pointWritten; + + while (n < format.length) + { + c = format[n++]; + if (extra > 0 && (c == '#' || c == '0' || c == '.')) + { + while (extra > 0) + { + result ~= (*p != '\0') ? *p++ : '0'; + + if (hasGroups && pos > 1 && groupIndex >= 0) + { + if (pos == groupPositions[groupIndex] + 1) + { + result ~= groupSeparator; + groupIndex--; + } + } + pos--; + extra--; + } + } + + switch (c) + { + case '#': + case '0': + if (extra < 0) + { + extra++; + c = (pos <= first) ? '0' : char.init; + } + else + c = (*p != '\0') ? *p++ : pos > last ? '0' : char.init; + + if (c != char.init) + { + result ~= c; + + if (hasGroups && pos > 1 && groupIndex >= 0) + { + if (pos == groupPositions[groupIndex] + 1) + { + result ~= groupSeparator; + groupIndex--; + } + } + } + pos--; + break; + + case '.': + if (pos != 0 || pointWritten) + break; + if (last < 0 || (pointPos < count && *p != '\0')) + { + result ~= decimalSeparator; + pointWritten = true; + } + break; + + case ',': + break; + + case '\'': + case '\"': + if (n < format.length) + n++; + break; + + case '\\': + if (n < format.length) + result ~= format[n++]; + break; + + default: + result ~= c; + break; + } + } + return result.get; + } + + /********************************************************************** + + **********************************************************************/ + + private void round (int pos) + { + int index; + while (index < pos && digits[index] != '\0') + index++; + + if (index == pos && digits[index] >= '5') + { + while (index > 0 && digits[index - 1] == '9') + index--; + + if (index > 0) + digits[index - 1]++; + else + { + scale++; + digits[0] = '1'; + index = 1; + } + } + else + while (index > 0 && digits[index - 1] == '0') + index--; + + if (index == 0) + { + scale = 0; + sign = false; + } + + digits[index] = '\0'; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/text/locale/Core.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/text/locale/Core.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,2171 @@ +/******************************************************************************* + + copyright: Copyright (c) 2005 John Chapman. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: 2005 + + author: John Chapman + + Contains classes that provide information about locales, such as + the language and calendars, as well as cultural conventions used + for formatting dates, currency and numbers. Use these classes when + writing applications for an international audience. + +******************************************************************************/ + +/** + * $(MEMBERTABLE + * $(TR + * $(TH Interface) + * $(TH Description) + * ) + * $(TR + * $(TD $(LINK2 #IFormatService, IFormatService)) + * $(TD Retrieves an object to control formatting.) + * ) + * ) + * + * $(MEMBERTABLE + * $(TR + * $(TH Class) + * $(TH Description) + * ) + * $(TR + * $(TD $(LINK2 #Calendar, Calendar)) + * $(TD Represents time in week, month and year divisions.) + * ) + * $(TR + * $(TD $(LINK2 #Culture, Culture)) + * $(TD Provides information about a culture, such as its name, calendar and date and number format patterns.) + * ) + * $(TR + * $(TD $(LINK2 #DateTimeFormat, DateTimeFormat)) + * $(TD Determines how $(LINK2 #Time, Time) values are formatted, depending on the culture.) + * ) + * $(TR + * $(TD $(LINK2 #DaylightSavingTime, DaylightSavingTime)) + * $(TD Represents a period of daylight-saving time.) + * ) + * $(TR + * $(TD $(LINK2 #Gregorian, Gregorian)) + * $(TD Represents the Gregorian calendar.) + * ) + * $(TR + * $(TD $(LINK2 #Hebrew, Hebrew)) + * $(TD Represents the Hebrew calendar.) + * ) + * $(TR + * $(TD $(LINK2 #Hijri, Hijri)) + * $(TD Represents the Hijri calendar.) + * ) + * $(TR + * $(TD $(LINK2 #Japanese, Japanese)) + * $(TD Represents the Japanese calendar.) + * ) + * $(TR + * $(TD $(LINK2 #Korean, Korean)) + * $(TD Represents the Korean calendar.) + * ) + * $(TR + * $(TD $(LINK2 #NumberFormat, NumberFormat)) + * $(TD Determines how numbers are formatted, according to the current culture.) + * ) + * $(TR + * $(TD $(LINK2 #Region, Region)) + * $(TD Provides information about a region.) + * ) + * $(TR + * $(TD $(LINK2 #Taiwan, Taiwan)) + * $(TD Represents the Taiwan calendar.) + * ) + * $(TR + * $(TD $(LINK2 #ThaiBuddhist, ThaiBuddhist)) + * $(TD Represents the Thai Buddhist calendar.) + * ) + * ) + * + * $(MEMBERTABLE + * $(TR + * $(TH Struct) + * $(TH Description) + * ) + * $(TR + * $(TD $(LINK2 #Time, Time)) + * $(TD Represents time expressed as a date and time of day.) + * ) + * $(TR + * $(TD $(LINK2 #TimeSpan, TimeSpan)) + * $(TD Represents a time interval.) + * ) + * ) + */ + +module tango.text.locale.Core; + +private import tango.core.Exception; + +private import tango.text.locale.Data; + +private import tango.time.Time; + +private import tango.time.chrono.Hijri, + tango.time.chrono.Korean, + tango.time.chrono.Taiwan, + tango.time.chrono.Hebrew, + tango.time.chrono.Calendar, + tango.time.chrono.Japanese, + tango.time.chrono.Gregorian, + tango.time.chrono.ThaiBuddhist; + +version (Windows) + private import tango.text.locale.Win32; + +version (Posix) + private import tango.text.locale.Posix; + + +// Initializes an array. +private template arrayOf(T) { + private T[] arrayOf(T[] params ...) { + return params.dup; + } +} + + +/** + * Defines the types of cultures that can be retrieved from Culture.getCultures. + */ +public enum CultureTypes { + Neutral = 1, /// Refers to cultures that are associated with a language but not specific to a country or region. + Specific = 2, /// Refers to cultures that are specific to a country or region. + All = Neutral | Specific /// Refers to all cultures. +} + + +/** + * $(ANCHOR _IFormatService) + * Retrieves an object to control formatting. + * + * A class implements $(LINK2 #IFormatService_getFormat, getFormat) to retrieve an object that provides format information for the implementing type. + * Remarks: IFormatService is implemented by $(LINK2 #Culture, Culture), $(LINK2 #NumberFormat, NumberFormat) and $(LINK2 #DateTimeFormat, DateTimeFormat) to provide locale-specific formatting of + * numbers and date and time values. + */ +public interface IFormatService { + + /** + * $(ANCHOR IFormatService_getFormat) + * Retrieves an object that supports formatting for the specified _type. + * Returns: The current instance if type is the same _type as the current instance; otherwise, null. + * Params: type = An object that specifies the _type of formatting to retrieve. + */ + Object getFormat(TypeInfo type); + +} + +/** + * $(ANCHOR _Culture) + * Provides information about a culture, such as its name, calendar and date and number format patterns. + * Remarks: tango.text.locale adopts the RFC 1766 standard for culture names in the format <language>"-"<region>. + * <language> is a lower-case two-letter code defined by ISO 639-1. <region> is an upper-case + * two-letter code defined by ISO 3166. For example, "en-GB" is UK English. + * $(BR)$(BR)There are three types of culture: invariant, neutral and specific. The invariant culture is not tied to + * any specific region, although it is associated with the English language. A neutral culture is associated with + * a language, but not with a region. A specific culture is associated with a language and a region. "es" is a neutral + * culture. "es-MX" is a specific culture. + * $(BR)$(BR)Instances of $(LINK2 #DateTimeFormat, DateTimeFormat) and $(LINK2 #NumberFormat, NumberFormat) cannot be created for neutral cultures. + * Examples: + * --- + * import tango.io.Stdout, tango.text.locale.Core; + * + * void main() { + * Culture culture = new Culture("it-IT"); + * + * Stdout.formatln("englishName: {}", culture.englishName); + * Stdout.formatln("nativeName: {}", culture.nativeName); + * Stdout.formatln("name: {}", culture.name); + * Stdout.formatln("parent: {}", culture.parent.name); + * Stdout.formatln("isNeutral: {}", culture.isNeutral); + * } + * + * // Produces the following output: + * // englishName: Italian (Italy) + * // nativeName: italiano (Italia) + * // name: it-IT + * // parent: it + * // isNeutral: false + * --- + */ +public class Culture : IFormatService { + + private const int LCID_INVARIANT = 0x007F; + + private static Culture[char[]] namedCultures; + private static Culture[int] idCultures; + private static Culture[char[]] ietfCultures; + + private static Culture currentCulture_; + private static Culture userDefaultCulture_; // The user's default culture (GetUserDefaultLCID). + private static Culture invariantCulture_; // The invariant culture is associated with the English language. + private Calendar calendar_; + private Culture parent_; + private CultureData* cultureData_; + private bool isReadOnly_; + private NumberFormat numberFormat_; + private DateTimeFormat dateTimeFormat_; + + static this() { + invariantCulture_ = new Culture(LCID_INVARIANT); + invariantCulture_.isReadOnly_ = true; + + userDefaultCulture_ = new Culture(nativeMethods.getUserCulture()); + if (userDefaultCulture_ is null) + // Fallback + userDefaultCulture_ = invariantCulture; + else + userDefaultCulture_.isReadOnly_ = true; + } + + static ~this() { + namedCultures = null; + idCultures = null; + ietfCultures = null; + } + + /** + * Initializes a new Culture instance from the supplied name. + * Params: cultureName = The name of the Culture. + */ + public this(char[] cultureName) { + cultureData_ = CultureData.getDataFromCultureName(cultureName); + } + + /** + * Initializes a new Culture instance from the supplied culture identifier. + * Params: cultureID = The identifer (LCID) of the Culture. + * Remarks: Culture identifiers correspond to a Windows LCID. + */ + public this(int cultureID) { + cultureData_ = CultureData.getDataFromCultureID(cultureID); + } + + /** + * Retrieves an object defining how to format the specified type. + * Params: type = The TypeInfo of the resulting formatting object. + * Returns: If type is typeid($(LINK2 #NumberFormat, NumberFormat)), the value of the $(LINK2 #Culture_numberFormat, numberFormat) property. If type is typeid($(LINK2 #DateTimeFormat, DateTimeFormat)), the + * value of the $(LINK2 #Culture_dateTimeFormat, dateTimeFormat) property. Otherwise, null. + * Remarks: Implements $(LINK2 #IFormatService_getFormat, IFormatService.getFormat). + */ + public Object getFormat(TypeInfo type) { + if (type is typeid(NumberFormat)) + return numberFormat; + else if (type is typeid(DateTimeFormat)) + return dateTimeFormat; + return null; + } + +version (Clone) +{ + /** + * Copies the current Culture instance. + * Returns: A copy of the current Culture instance. + * Remarks: The values of the $(LINK2 #Culture_numberFormat, numberFormat), $(LINK2 #Culture_dateTimeFormat, dateTimeFormat) and $(LINK2 #Culture_calendar, calendar) properties are copied also. + */ + public Object clone() { + Culture culture = cast(Culture)cloneObject(this); + if (!culture.isNeutral) { + if (dateTimeFormat_ !is null) + culture.dateTimeFormat_ = cast(DateTimeFormat)dateTimeFormat_.clone(); + if (numberFormat_ !is null) + culture.numberFormat_ = cast(NumberFormat)numberFormat_.clone(); + } + if (calendar_ !is null) + culture.calendar_ = cast(Calendar)calendar_.clone(); + return culture; + } +} + + /** + * Returns a read-only instance of a culture using the specified culture identifier. + * Params: cultureID = The identifier of the culture. + * Returns: A read-only culture instance. + * Remarks: Instances returned by this method are cached. + */ + public static Culture getCulture(int cultureID) { + Culture culture = getCultureInternal(cultureID, null); + if (culture is null) + error("Culture is not supported."); + return culture; + } + + /** + * Returns a read-only instance of a culture using the specified culture name. + * Params: cultureName = The name of the culture. + * Returns: A read-only culture instance. + * Remarks: Instances returned by this method are cached. + */ + public static Culture getCulture(char[] cultureName) { + if (cultureName == null) + error("Value cannot be null."); + Culture culture = getCultureInternal(0, cultureName); + if (culture is null) + error("Culture name " ~ cultureName ~ " is not supported."); + return culture; + } + + /** + * Returns a read-only instance using the specified name, as defined by the RFC 3066 standard and maintained by the IETF. + * Params: name = The name of the language. + * Returns: A read-only culture instance. + */ + public static Culture getCultureFromIetfLanguageTag(char[] name) { + if (name == null) + error("Value cannot be null."); + Culture culture = getCultureInternal(-1, name); + if (culture is null) + error("Culture IETF name " ~ name ~ " is not a known IETF name."); + return culture; + } + + private static Culture getCultureInternal(int cultureID, char[] name) { + // If cultureID is - 1, name is an IETF name; if it's 0, name is a culture name; otherwise, it's a valid LCID. + + // Look up tables first. + if (cultureID == 0) { + if (Culture* culture = name in namedCultures) + return *culture; + } + else if (cultureID > 0) { + if (Culture* culture = cultureID in idCultures) + return *culture; + } + else if (cultureID == -1) { + if (Culture* culture = name in ietfCultures) + return *culture; + } + + // Nothing found, create a new instance. + Culture culture; + + try { + if (cultureID == -1) { + name = CultureData.getCultureNameFromIetfName(name); + if (name == null) + return null; + } + else if (cultureID == 0) + culture = new Culture(name); + else if (userDefaultCulture_ !is null && userDefaultCulture_.id == cultureID) { + culture = userDefaultCulture_; + } + else + culture = new Culture(cultureID); + } + catch (LocaleException) { + return null; + } + + culture.isReadOnly_ = true; + + // Now cache the new instance in all tables. + ietfCultures[culture.ietfLanguageTag] = culture; + namedCultures[culture.name] = culture; + idCultures[culture.id] = culture; + + return culture; + } + + /** + * Returns a list of cultures filtered by the specified $(LINK2 constants.html#CultureTypes, CultureTypes). + * Params: types = A combination of CultureTypes. + * Returns: An array of Culture instances containing cultures specified by types. + */ + public static Culture[] getCultures(CultureTypes types) { + bool includeSpecific = (types & CultureTypes.Specific) != 0; + bool includeNeutral = (types & CultureTypes.Neutral) != 0; + + int[] cultures; + for (int i = 0; i < CultureData.cultureDataTable.length; i++) { + if ((CultureData.cultureDataTable[i].isNeutral && includeNeutral) || (!CultureData.cultureDataTable[i].isNeutral && includeSpecific)) + cultures ~= CultureData.cultureDataTable[i].lcid; + } + + Culture[] result = new Culture[cultures.length]; + foreach (int i, int cultureID; cultures) + result[i] = new Culture(cultureID); + return result; + } + + /** + * Returns the name of the Culture. + * Returns: A string containing the name of the Culture in the format <language>"-"<region>. + */ + public override char[] toString() { + return cultureData_.name; + } + + public override int opEquals(Object obj) { + if (obj is this) + return true; + Culture other = cast(Culture)obj; + if (other is null) + return false; + return other.name == name; // This needs to be changed so it's culturally aware. + } + + /** + * $(ANCHOR Culture_current) + * $(I Property.) Retrieves the culture of the current user. + * Returns: The Culture instance representing the user's current culture. + */ + public static Culture current() { + if (currentCulture_ !is null) + return currentCulture_; + + if (userDefaultCulture_ !is null) { + // If the user has changed their locale settings since last we checked, invalidate our data. + if (userDefaultCulture_.id != nativeMethods.getUserCulture()) + userDefaultCulture_ = null; + } + if (userDefaultCulture_ is null) { + userDefaultCulture_ = new Culture(nativeMethods.getUserCulture()); + if (userDefaultCulture_ is null) + userDefaultCulture_ = invariantCulture; + else + userDefaultCulture_.isReadOnly_ = true; + } + + return userDefaultCulture_; + } + /** + * $(I Property.) Assigns the culture of the _current user. + * Params: value = The Culture instance representing the user's _current culture. + * Examples: + * The following examples shows how to change the _current culture. + * --- + * import tango.io.Print, tango.text.locale.Common; + * + * void main() { + * // Displays the name of the current culture. + * Println("The current culture is %s.", Culture.current.englishName); + * + * // Changes the current culture to el-GR. + * Culture.current = new Culture("el-GR"); + * Println("The current culture is now %s.", Culture.current.englishName); + * } + * + * // Produces the following output: + * // The current culture is English (United Kingdom). + * // The current culture is now Greek (Greece). + * --- + */ + public static void current(Culture value) { + checkNeutral(value); + nativeMethods.setUserCulture(value.id); + currentCulture_ = value; + } + + /** + * $(I Property.) Retrieves the invariant Culture. + * Returns: The Culture instance that is invariant. + * Remarks: The invariant culture is culture-independent. It is not tied to any specific region, but is associated + * with the English language. + */ + public static Culture invariantCulture() { + return invariantCulture_; + } + + /** + * $(I Property.) Retrieves the identifier of the Culture. + * Returns: The culture identifier of the current instance. + * Remarks: The culture identifier corresponds to the Windows locale identifier (LCID). It can therefore be used when + * interfacing with the Windows NLS functions. + */ + public int id() { + return cultureData_.lcid; + } + + /** + * $(ANCHOR Culture_name) + * $(I Property.) Retrieves the name of the Culture in the format <language>"-"<region>. + * Returns: The name of the current instance. For example, the name of the UK English culture is "en-GB". + */ + public char[] name() { + return cultureData_.name; + } + + /** + * $(I Property.) Retrieves the name of the Culture in the format <languagename> (<regionname>) in English. + * Returns: The name of the current instance in English. For example, the englishName of the UK English culture + * is "English (United Kingdom)". + */ + public char[] englishName() { + return cultureData_.englishName; + } + + /** + * $(I Property.) Retrieves the name of the Culture in the format <languagename> (<regionname>) in its native language. + * Returns: The name of the current instance in its native language. For example, if Culture.name is "de-DE", nativeName is + * "Deutsch (Deutschland)". + */ + public char[] nativeName() { + return cultureData_.nativeName; + } + + /** + * $(I Property.) Retrieves the two-letter language code of the culture. + * Returns: The two-letter language code of the Culture instance. For example, the twoLetterLanguageName for English is "en". + */ + public char[] twoLetterLanguageName() { + return cultureData_.isoLangName; + } + + /** + * $(I Property.) Retrieves the three-letter language code of the culture. + * Returns: The three-letter language code of the Culture instance. For example, the threeLetterLanguageName for English is "eng". + */ + public char[] threeLetterLanguageName() { + return cultureData_.isoLangName2; + } + + /** + * $(I Property.) Retrieves the RFC 3066 identification for a language. + * Returns: A string representing the RFC 3066 language identification. + */ + public final char[] ietfLanguageTag() { + return cultureData_.ietfTag; + } + + /** + * $(I Property.) Retrieves the Culture representing the parent of the current instance. + * Returns: The Culture representing the parent of the current instance. + */ + public Culture parent() { + if (parent_ is null) { + try { + int parentCulture = cultureData_.parent; + if (parentCulture == LCID_INVARIANT) + parent_ = invariantCulture; + else + parent_ = new Culture(parentCulture); + } + catch { + parent_ = invariantCulture; + } + } + return parent_; + } + + /** + * $(I Property.) Retrieves a value indicating whether the current instance is a neutral culture. + * Returns: true is the current Culture represents a neutral culture; otherwise, false. + * Examples: + * The following example displays which cultures using Chinese are neutral. + * --- + * import tango.io.Print, tango.text.locale.Common; + * + * void main() { + * foreach (c; Culture.getCultures(CultureTypes.All)) { + * if (c.twoLetterLanguageName == "zh") { + * Print(c.englishName); + * if (c.isNeutral) + * Println("neutral"); + * else + * Println("specific"); + * } + * } + * } + * + * // Produces the following output: + * // Chinese (Simplified) - neutral + * // Chinese (Taiwan) - specific + * // Chinese (People's Republic of China) - specific + * // Chinese (Hong Kong S.A.R.) - specific + * // Chinese (Singapore) - specific + * // Chinese (Macao S.A.R.) - specific + * // Chinese (Traditional) - neutral + * --- + */ + public bool isNeutral() { + return cultureData_.isNeutral; + } + + /** + * $(I Property.) Retrieves a value indicating whether the instance is read-only. + * Returns: true if the instance is read-only; otherwise, false. + * Remarks: If the culture is read-only, the $(LINK2 #Culture_dateTimeFormat, dateTimeFormat) and $(LINK2 #Culture_numberFormat, numberFormat) properties return + * read-only instances. + */ + public final bool isReadOnly() { + return isReadOnly_; + } + + /** + * $(ANCHOR Culture_calendar) + * $(I Property.) Retrieves the calendar used by the culture. + * Returns: A Calendar instance respresenting the calendar used by the culture. + */ + public Calendar calendar() { + if (calendar_ is null) { + calendar_ = getCalendarInstance(cultureData_.calendarType, isReadOnly_); + } + return calendar_; + } + + /** + * $(I Property.) Retrieves the list of calendars that can be used by the culture. + * Returns: An array of type Calendar representing the calendars that can be used by the culture. + */ + public Calendar[] optionalCalendars() { + Calendar[] cals = new Calendar[cultureData_.optionalCalendars.length]; + foreach (int i, int calID; cultureData_.optionalCalendars) + cals[i] = getCalendarInstance(calID); + return cals; + } + + /** + * $(ANCHOR Culture_numberFormat) + * $(I Property.) Retrieves a NumberFormat defining the culturally appropriate format for displaying numbers and currency. + * Returns: A NumberFormat defining the culturally appropriate format for displaying numbers and currency. + */ + public NumberFormat numberFormat() { + checkNeutral(this); + if (numberFormat_ is null) { + numberFormat_ = new NumberFormat(cultureData_); + numberFormat_.isReadOnly_ = isReadOnly_; + } + return numberFormat_; + } + /** + * $(I Property.) Assigns a NumberFormat defining the culturally appropriate format for displaying numbers and currency. + * Params: values = A NumberFormat defining the culturally appropriate format for displaying numbers and currency. + */ + public void numberFormat(NumberFormat value) { + checkReadOnly(); + numberFormat_ = value; + } + + /** + * $(ANCHOR Culture_dateTimeFormat) + * $(I Property.) Retrieves a DateTimeFormat defining the culturally appropriate format for displaying dates and times. + * Returns: A DateTimeFormat defining the culturally appropriate format for displaying dates and times. + */ + public DateTimeFormat dateTimeFormat() { + checkNeutral(this); + if (dateTimeFormat_ is null) { + dateTimeFormat_ = new DateTimeFormat(cultureData_, calendar); + dateTimeFormat_.isReadOnly_ = isReadOnly_; + } + return dateTimeFormat_; + } + /** + * $(I Property.) Assigns a DateTimeFormat defining the culturally appropriate format for displaying dates and times. + * Params: values = A DateTimeFormat defining the culturally appropriate format for displaying dates and times. + */ + public void dateTimeFormat(DateTimeFormat value) { + checkReadOnly(); + dateTimeFormat_ = value; + } + + private static void checkNeutral(Culture culture) { + if (culture.isNeutral) + error("Culture '" ~ culture.name ~ "' is a neutral culture. It cannot be used in formatting and therefore cannot be set as the current culture."); + } + + private void checkReadOnly() { + if (isReadOnly_) + error("Instance is read-only."); + } + + private static Calendar getCalendarInstance(int calendarType, bool readOnly=false) { + switch (calendarType) { + case Calendar.JAPAN: + return new Japanese(); + case Calendar.TAIWAN: + return new Taiwan(); + case Calendar.KOREA: + return new Korean(); + case Calendar.HIJRI: + return new Hijri(); + case Calendar.THAI: + return new ThaiBuddhist(); + case Calendar.HEBREW: + return new Hebrew; + case Calendar.GREGORIAN_US: + case Calendar.GREGORIAN_ME_FRENCH: + case Calendar.GREGORIAN_ARABIC: + case Calendar.GREGORIAN_XLIT_ENGLISH: + case Calendar.GREGORIAN_XLIT_FRENCH: + return new Gregorian(cast(Gregorian.Type) calendarType); + default: + break; + } + return new Gregorian(); + } + +} + +/** + * $(ANCHOR _Region) + * Provides information about a region. + * Remarks: Region does not represent user preferences. It does not depend on the user's language or culture. + * Examples: + * The following example displays some of the properties of the Region class: + * --- + * import tango.io.Print, tango.text.locale.Common; + * + * void main() { + * Region region = new Region("en-GB"); + * Println("name: %s", region.name); + * Println("englishName: %s", region.englishName); + * Println("isMetric: %s", region.isMetric); + * Println("currencySymbol: %s", region.currencySymbol); + * Println("isoCurrencySymbol: %s", region.isoCurrencySymbol); + * } + * + * // Produces the following output. + * // name: en-GB + * // englishName: United Kingdom + * // isMetric: true + * // currencySymbol: £ + * // isoCurrencySymbol: GBP + * --- + */ +public class Region { + + private CultureData* cultureData_; + private static Region currentRegion_; + private char[] name_; + + /** + * Initializes a new Region instance based on the region associated with the specified culture identifier. + * Params: cultureID = A culture indentifier. + * Remarks: The name of the Region instance is set to the ISO 3166 two-letter code for that region. + */ + public this(int cultureID) { + cultureData_ = CultureData.getDataFromCultureID(cultureID); + if (cultureData_.isNeutral) + error ("Cannot use a neutral culture to create a region."); + name_ = cultureData_.regionName; + } + + /** + * $(ANCHOR Region_ctor_name) + * Initializes a new Region instance based on the region specified by name. + * Params: name = A two-letter ISO 3166 code for the region. Or, a culture $(LINK2 #Culture_name, _name) consisting of the language and region. + */ + public this(char[] name) { + cultureData_ = CultureData.getDataFromRegionName(name); + name_ = name; + if (cultureData_.isNeutral) + error ("The region name " ~ name ~ " corresponds to a neutral culture and cannot be used to create a region."); + } + + package this(CultureData* cultureData) { + cultureData_ = cultureData; + name_ = cultureData.regionName; + } + + /** + * $(I Property.) Retrieves the Region used by the current $(LINK2 #Culture, Culture). + * Returns: The Region instance associated with the current Culture. + */ + public static Region current() { + if (currentRegion_ is null) + currentRegion_ = new Region(Culture.current.cultureData_); + return currentRegion_; + } + + /** + * $(I Property.) Retrieves a unique identifier for the geographical location of the region. + * Returns: An $(B int) uniquely identifying the geographical location. + */ + public int geoID() { + return cultureData_.geoId; + } + + /** + * $(ANCHOR Region_name) + * $(I Property.) Retrieves the ISO 3166 code, or the name, of the current Region. + * Returns: The value specified by the name parameter of the $(LINK2 #Region_ctor_name, Region(char[])) constructor. + */ + public char[] name() { + return name_; + } + + /** + * $(I Property.) Retrieves the full name of the region in English. + * Returns: The full name of the region in English. + */ + public char[] englishName() { + return cultureData_.englishCountry; + } + + /** + * $(I Property.) Retrieves the full name of the region in its native language. + * Returns: The full name of the region in the language associated with the region code. + */ + public char[] nativeName() { + return cultureData_.nativeCountry; + } + + /** + * $(I Property.) Retrieves the two-letter ISO 3166 code of the region. + * Returns: The two-letter ISO 3166 code of the region. + */ + public char[] twoLetterRegionName() { + return cultureData_.regionName; + } + + /** + * $(I Property.) Retrieves the three-letter ISO 3166 code of the region. + * Returns: The three-letter ISO 3166 code of the region. + */ + public char[] threeLetterRegionName() { + return cultureData_.isoRegionName; + } + + /** + * $(I Property.) Retrieves the currency symbol of the region. + * Returns: The currency symbol of the region. + */ + public char[] currencySymbol() { + return cultureData_.currency; + } + + /** + * $(I Property.) Retrieves the three-character currency symbol of the region. + * Returns: The three-character currency symbol of the region. + */ + public char[] isoCurrencySymbol() { + return cultureData_.intlSymbol; + } + + /** + * $(I Property.) Retrieves the name in English of the currency used in the region. + * Returns: The name in English of the currency used in the region. + */ + public char[] currencyEnglishName() { + return cultureData_.englishCurrency; + } + + /** + * $(I Property.) Retrieves the name in the native language of the region of the currency used in the region. + * Returns: The name in the native language of the region of the currency used in the region. + */ + public char[] currencyNativeName() { + return cultureData_.nativeCurrency; + } + + /** + * $(I Property.) Retrieves a value indicating whether the region uses the metric system for measurements. + * Returns: true is the region uses the metric system; otherwise, false. + */ + public bool isMetric() { + return cultureData_.isMetric; + } + + /** + * Returns a string containing the ISO 3166 code, or the $(LINK2 #Region_name, name), of the current Region. + * Returns: A string containing the ISO 3166 code, or the name, of the current Region. + */ + public override char[] toString() { + return name_; + } + +} + +/** + * $(ANCHOR _NumberFormat) + * Determines how numbers are formatted, according to the current culture. + * Remarks: Numbers are formatted using format patterns retrieved from a NumberFormat instance. + * This class implements $(LINK2 #IFormatService_getFormat, IFormatService.getFormat). + * Examples: + * The following example shows how to retrieve an instance of NumberFormat for a Culture + * and use it to display number formatting information. + * --- + * import tango.io.Print, tango.text.locale.Common; + * + * void main(char[][] args) { + * foreach (c; Culture.getCultures(CultureTypes.Specific)) { + * if (c.twoLetterLanguageName == "en") { + * NumberFormat fmt = c.numberFormat; + * Println("The currency symbol for %s is '%s'", + * c.englishName, + * fmt.currencySymbol); + * } + * } + * } + * + * // Produces the following output: + * // The currency symbol for English (United States) is '$' + * // The currency symbol for English (United Kingdom) is '£' + * // The currency symbol for English (Australia) is '$' + * // The currency symbol for English (Canada) is '$' + * // The currency symbol for English (New Zealand) is '$' + * // The currency symbol for English (Ireland) is '€' + * // The currency symbol for English (South Africa) is 'R' + * // The currency symbol for English (Jamaica) is 'J$' + * // The currency symbol for English (Caribbean) is '$' + * // The currency symbol for English (Belize) is 'BZ$' + * // The currency symbol for English (Trinidad and Tobago) is 'TT$' + * // The currency symbol for English (Zimbabwe) is 'Z$' + * // The currency symbol for English (Republic of the Philippines) is 'Php' + *--- + */ +public class NumberFormat : IFormatService { + + package bool isReadOnly_; + private static NumberFormat invariantFormat_; + + private int numberDecimalDigits_; + private int numberNegativePattern_; + private int currencyDecimalDigits_; + private int currencyNegativePattern_; + private int currencyPositivePattern_; + private int[] numberGroupSizes_; + private int[] currencyGroupSizes_; + private char[] numberGroupSeparator_; + private char[] numberDecimalSeparator_; + private char[] currencyGroupSeparator_; + private char[] currencyDecimalSeparator_; + private char[] currencySymbol_; + private char[] negativeSign_; + private char[] positiveSign_; + private char[] nanSymbol_; + private char[] negativeInfinitySymbol_; + private char[] positiveInfinitySymbol_; + private char[][] nativeDigits_; + + /** + * Initializes a new, culturally independent instance. + * + * Remarks: Modify the properties of the new instance to define custom formatting. + */ + public this() { + this(null); + } + + package this(CultureData* cultureData) { + // Initialize invariant data. + numberDecimalDigits_ = 2; + numberNegativePattern_ = 1; + currencyDecimalDigits_ = 2; + numberGroupSizes_ = arrayOf!(int)(3); + currencyGroupSizes_ = arrayOf!(int)(3); + numberGroupSeparator_ = ","; + numberDecimalSeparator_ = "."; + currencyGroupSeparator_ = ","; + currencyDecimalSeparator_ = "."; + currencySymbol_ = "\u00A4"; + negativeSign_ = "-"; + positiveSign_ = "+"; + nanSymbol_ = "NaN"; + negativeInfinitySymbol_ = "-Infinity"; + positiveInfinitySymbol_ = "Infinity"; + nativeDigits_ = arrayOf!(char[])("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); + + if (cultureData !is null && cultureData.lcid != Culture.LCID_INVARIANT) { + // Initialize culture-specific data. + numberDecimalDigits_ = cultureData.digits; + numberNegativePattern_ = cultureData.negativeNumber; + currencyDecimalDigits_ = cultureData.currencyDigits; + currencyNegativePattern_ = cultureData.negativeCurrency; + currencyPositivePattern_ = cultureData.positiveCurrency; + numberGroupSizes_ = cultureData.grouping; + currencyGroupSizes_ = cultureData.monetaryGrouping; + numberGroupSeparator_ = cultureData.thousand; + numberDecimalSeparator_ = cultureData.decimal; + currencyGroupSeparator_ = cultureData.monetaryThousand; + currencyDecimalSeparator_ = cultureData.monetaryDecimal; + currencySymbol_ = cultureData.currency; + negativeSign_ = cultureData.negativeSign; + positiveSign_ = cultureData.positiveSign; + nanSymbol_ = cultureData.nan; + negativeInfinitySymbol_ = cultureData.negInfinity; + positiveInfinitySymbol_ = cultureData.posInfinity; + nativeDigits_ = cultureData.nativeDigits; + } + } + + /** + * Retrieves an object defining how to format the specified type. + * Params: type = The TypeInfo of the resulting formatting object. + * Returns: If type is typeid($(LINK2 #NumberFormat, NumberFormat)), the current NumberFormat instance. Otherwise, null. + * Remarks: Implements $(LINK2 #IFormatService_getFormat, IFormatService.getFormat). + */ + public Object getFormat(TypeInfo type) { + return (type is typeid(NumberFormat)) ? this : null; + } + +version (Clone) +{ + /** + * Creates a copy of the instance. + */ + public Object clone() { + NumberFormat copy = cast(NumberFormat)cloneObject(this); + copy.isReadOnly_ = false; + return copy; + } +} + + /** + * Retrieves the NumberFormat for the specified $(LINK2 #IFormatService, IFormatService). + * Params: formatService = The IFormatService used to retrieve NumberFormat. + * Returns: The NumberFormat for the specified IFormatService. + * Remarks: The method calls $(LINK2 #IFormatService_getFormat, IFormatService.getFormat) with typeof(NumberFormat). If formatService is null, + * then the value of the current property is returned. + */ + public static NumberFormat getInstance(IFormatService formatService) { + Culture culture = cast(Culture)formatService; + if (culture !is null) { + if (culture.numberFormat_ !is null) + return culture.numberFormat_; + return culture.numberFormat; + } + if (NumberFormat numberFormat = cast(NumberFormat)formatService) + return numberFormat; + if (formatService !is null) { + if (NumberFormat numberFormat = cast(NumberFormat)(formatService.getFormat(typeid(NumberFormat)))) + return numberFormat; + } + return current; + } + + /** + * $(I Property.) Retrieves a read-only NumberFormat instance from the current culture. + * Returns: A read-only NumberFormat instance from the current culture. + */ + public static NumberFormat current() { + return Culture.current.numberFormat; + } + + /** + * $(ANCHOR NumberFormat_invariantFormat) + * $(I Property.) Retrieves the read-only, culturally independent NumberFormat instance. + * Returns: The read-only, culturally independent NumberFormat instance. + */ + public static NumberFormat invariantFormat() { + if (invariantFormat_ is null) { + invariantFormat_ = new NumberFormat; + invariantFormat_.isReadOnly_ = true; + } + return invariantFormat_; + } + + /** + * $(I Property.) Retrieves a value indicating whether the instance is read-only. + * Returns: true if the instance is read-only; otherwise, false. + */ + public final bool isReadOnly() { + return isReadOnly_; + } + + /** + * $(I Property.) Retrieves the number of decimal places used for numbers. + * Returns: The number of decimal places used for numbers. For $(LINK2 #NumberFormat_invariantFormat, invariantFormat), the default is 2. + */ + public final int numberDecimalDigits() { + return numberDecimalDigits_; + } + /** + * Assigns the number of decimal digits used for numbers. + * Params: value = The number of decimal places used for numbers. + * Throws: Exception if the property is being set and the instance is read-only. + * Examples: + * The following example shows the effect of changing numberDecimalDigits. + * --- + * import tango.io.Print, tango.text.locale.Common; + * + * void main() { + * // Get the NumberFormat from the en-GB culture. + * NumberFormat fmt = (new Culture("en-GB")).numberFormat; + * + * // Display a value with the default number of decimal digits. + * int n = 5678; + * Println(Formatter.format(fmt, "{0:N}", n)); + * + * // Display the value with six decimal digits. + * fmt.numberDecimalDigits = 6; + * Println(Formatter.format(fmt, "{0:N}", n)); + * } + * + * // Produces the following output: + * // 5,678.00 + * // 5,678.000000 + * --- + */ + public final void numberDecimalDigits(int value) { + checkReadOnly(); + numberDecimalDigits_ = value; + } + + /** + * $(I Property.) Retrieves the format pattern for negative numbers. + * Returns: The format pattern for negative numbers. For invariantFormat, the default is 1 (representing "-n"). + * Remarks: The following table shows valid values for this property. + * + * + * + * + * + * + * + * + *
ValuePattern
0(n)
1-n
2- n
3n-
4n -
+ */ + public final int numberNegativePattern() { + return numberNegativePattern_; + } + /** + * $(I Property.) Assigns the format pattern for negative numbers. + * Params: value = The format pattern for negative numbers. + * Examples: + * The following example shows the effect of the different patterns. + * --- + * import tango.io.Print, tango.text.locale.Common; + * + * void main() { + * NumberFormat fmt = new NumberFormat; + * int n = -5678; + * + * // Display the default pattern. + * Println(Formatter.format(fmt, "{0:N}", n)); + * + * // Display all patterns. + * for (int i = 0; i <= 4; i++) { + * fmt.numberNegativePattern = i; + * Println(Formatter.format(fmt, "{0:N}", n)); + * } + * } + * + * // Produces the following output: + * // (5,678.00) + * // (5,678.00) + * // -5,678.00 + * // - 5,678.00 + * // 5,678.00- + * // 5,678.00 - + * --- + */ + public final void numberNegativePattern(int value) { + checkReadOnly(); + numberNegativePattern_ = value; + } + + /** + * $(I Property.) Retrieves the number of decimal places to use in currency values. + * Returns: The number of decimal digits to use in currency values. + */ + public final int currencyDecimalDigits() { + return currencyDecimalDigits_; + } + /** + * $(I Property.) Assigns the number of decimal places to use in currency values. + * Params: value = The number of decimal digits to use in currency values. + */ + public final void currencyDecimalDigits(int value) { + checkReadOnly(); + currencyDecimalDigits_ = value; + } + + /** + * $(I Property.) Retrieves the formal pattern to use for negative currency values. + * Returns: The format pattern to use for negative currency values. + */ + public final int currencyNegativePattern() { + return currencyNegativePattern_; + } + /** + * $(I Property.) Assigns the formal pattern to use for negative currency values. + * Params: value = The format pattern to use for negative currency values. + */ + public final void currencyNegativePattern(int value) { + checkReadOnly(); + currencyNegativePattern_ = value; + } + + /** + * $(I Property.) Retrieves the formal pattern to use for positive currency values. + * Returns: The format pattern to use for positive currency values. + */ + public final int currencyPositivePattern() { + return currencyPositivePattern_; + } + /** + * $(I Property.) Assigns the formal pattern to use for positive currency values. + * Returns: The format pattern to use for positive currency values. + */ + public final void currencyPositivePattern(int value) { + checkReadOnly(); + currencyPositivePattern_ = value; + } + + /** + * $(I Property.) Retrieves the number of digits int each group to the left of the decimal place in numbers. + * Returns: The number of digits int each group to the left of the decimal place in numbers. + */ + public final int[] numberGroupSizes() { + return numberGroupSizes_; + } + /** + * $(I Property.) Assigns the number of digits int each group to the left of the decimal place in numbers. + * Params: value = The number of digits int each group to the left of the decimal place in numbers. + */ + public final void numberGroupSizes(int[] value) { + checkReadOnly(); + numberGroupSizes_ = value; + } + + /** + * $(I Property.) Retrieves the number of digits int each group to the left of the decimal place in currency values. + * Returns: The number of digits int each group to the left of the decimal place in currency values. + */ + public final int[] currencyGroupSizes() { + return currencyGroupSizes_; + } + /** + * $(I Property.) Assigns the number of digits int each group to the left of the decimal place in currency values. + * Params: value = The number of digits int each group to the left of the decimal place in currency values. + */ + public final void currencyGroupSizes(int[] value) { + checkReadOnly(); + currencyGroupSizes_ = value; + } + + /** + * $(I Property.) Retrieves the string separating groups of digits to the left of the decimal place in numbers. + * Returns: The string separating groups of digits to the left of the decimal place in numbers. For example, ",". + */ + public final char[] numberGroupSeparator() { + return numberGroupSeparator_; + } + /** + * $(I Property.) Assigns the string separating groups of digits to the left of the decimal place in numbers. + * Params: value = The string separating groups of digits to the left of the decimal place in numbers. + */ + public final void numberGroupSeparator(char[] value) { + checkReadOnly(); + numberGroupSeparator_ = value; + } + + /** + * $(I Property.) Retrieves the string used as the decimal separator in numbers. + * Returns: The string used as the decimal separator in numbers. For example, ".". + */ + public final char[] numberDecimalSeparator() { + return numberDecimalSeparator_; + } + /** + * $(I Property.) Assigns the string used as the decimal separator in numbers. + * Params: value = The string used as the decimal separator in numbers. + */ + public final void numberDecimalSeparator(char[] value) { + checkReadOnly(); + numberDecimalSeparator_ = value; + } + + /** + * $(I Property.) Retrieves the string separating groups of digits to the left of the decimal place in currency values. + * Returns: The string separating groups of digits to the left of the decimal place in currency values. For example, ",". + */ + public final char[] currencyGroupSeparator() { + return currencyGroupSeparator_; + } + /** + * $(I Property.) Assigns the string separating groups of digits to the left of the decimal place in currency values. + * Params: value = The string separating groups of digits to the left of the decimal place in currency values. + */ + public final void currencyGroupSeparator(char[] value) { + checkReadOnly(); + currencyGroupSeparator_ = value; + } + + /** + * $(I Property.) Retrieves the string used as the decimal separator in currency values. + * Returns: The string used as the decimal separator in currency values. For example, ".". + */ + public final char[] currencyDecimalSeparator() { + return currencyDecimalSeparator_; + } + /** + * $(I Property.) Assigns the string used as the decimal separator in currency values. + * Params: value = The string used as the decimal separator in currency values. + */ + public final void currencyDecimalSeparator(char[] value) { + checkReadOnly(); + currencyDecimalSeparator_ = value; + } + + /** + * $(I Property.) Retrieves the string used as the currency symbol. + * Returns: The string used as the currency symbol. For example, "£". + */ + public final char[] currencySymbol() { + return currencySymbol_; + } + /** + * $(I Property.) Assigns the string used as the currency symbol. + * Params: value = The string used as the currency symbol. + */ + public final void currencySymbol(char[] value) { + checkReadOnly(); + currencySymbol_ = value; + } + + /** + * $(I Property.) Retrieves the string denoting that a number is negative. + * Returns: The string denoting that a number is negative. For example, "-". + */ + public final char[] negativeSign() { + return negativeSign_; + } + /** + * $(I Property.) Assigns the string denoting that a number is negative. + * Params: value = The string denoting that a number is negative. + */ + public final void negativeSign(char[] value) { + checkReadOnly(); + negativeSign_ = value; + } + + /** + * $(I Property.) Retrieves the string denoting that a number is positive. + * Returns: The string denoting that a number is positive. For example, "+". + */ + public final char[] positiveSign() { + return positiveSign_; + } + /** + * $(I Property.) Assigns the string denoting that a number is positive. + * Params: value = The string denoting that a number is positive. + */ + public final void positiveSign(char[] value) { + checkReadOnly(); + positiveSign_ = value; + } + + /** + * $(I Property.) Retrieves the string representing the NaN (not a number) value. + * Returns: The string representing the NaN value. For example, "NaN". + */ + public final char[] nanSymbol() { + return nanSymbol_; + } + /** + * $(I Property.) Assigns the string representing the NaN (not a number) value. + * Params: value = The string representing the NaN value. + */ + public final void nanSymbol(char[] value) { + checkReadOnly(); + nanSymbol_ = value; + } + + /** + * $(I Property.) Retrieves the string representing negative infinity. + * Returns: The string representing negative infinity. For example, "-Infinity". + */ + public final char[] negativeInfinitySymbol() { + return negativeInfinitySymbol_; + } + /** + * $(I Property.) Assigns the string representing negative infinity. + * Params: value = The string representing negative infinity. + */ + public final void negativeInfinitySymbol(char[] value) { + checkReadOnly(); + negativeInfinitySymbol_ = value; + } + + /** + * $(I Property.) Retrieves the string representing positive infinity. + * Returns: The string representing positive infinity. For example, "Infinity". + */ + public final char[] positiveInfinitySymbol() { + return positiveInfinitySymbol_; + } + /** + * $(I Property.) Assigns the string representing positive infinity. + * Params: value = The string representing positive infinity. + */ + public final void positiveInfinitySymbol(char[] value) { + checkReadOnly(); + positiveInfinitySymbol_ = value; + } + + /** + * $(I Property.) Retrieves a string array of native equivalents of the digits 0 to 9. + * Returns: A string array of native equivalents of the digits 0 to 9. + */ + public final char[][] nativeDigits() { + return nativeDigits_; + } + /** + * $(I Property.) Assigns a string array of native equivalents of the digits 0 to 9. + * Params: value = A string array of native equivalents of the digits 0 to 9. + */ + public final void nativeDigits(char[][] value) { + checkReadOnly(); + nativeDigits_ = value; + } + + private void checkReadOnly() { + if (isReadOnly_) + error("NumberFormat instance is read-only."); + } + +} + +/** + * $(ANCHOR _DateTimeFormat) + * Determines how $(LINK2 #Time, Time) values are formatted, depending on the culture. + * Remarks: To create a DateTimeFormat for a specific culture, create a $(LINK2 #Culture, Culture) for that culture and + * retrieve its $(LINK2 #Culture_dateTimeFormat, dateTimeFormat) property. To create a DateTimeFormat for the user's current + * culture, use the $(LINK2 #Culture_current, current) property. + */ +public class DateTimeFormat : IFormatService { + + private const char[] rfc1123Pattern_ = "ddd, dd MMM yyyy HH':'mm':'ss 'GMT'"; + private const char[] sortableDateTimePattern_ = "yyyy'-'MM'-'dd'T'HH':'mm':'ss"; + private const char[] universalSortableDateTimePattern_ = "yyyy'-'MM'-'dd' 'HH':'mm':'ss'Z'"; + private const char[] allStandardFormats = [ 'd', 'D', 'f', 'F', 'g', 'G', 'm', 'M', 'r', 'R', 's', 't', 'T', 'u', 'U', 'y', 'Y' ]; + + + package bool isReadOnly_; + private static DateTimeFormat invariantFormat_; + private CultureData* cultureData_; + + private Calendar calendar_; + private int[] optionalCalendars_; + private int firstDayOfWeek_ = -1; + private int calendarWeekRule_ = -1; + private char[] dateSeparator_; + private char[] timeSeparator_; + private char[] amDesignator_; + private char[] pmDesignator_; + private char[] shortDatePattern_; + private char[] shortTimePattern_; + private char[] longDatePattern_; + private char[] longTimePattern_; + private char[] monthDayPattern_; + private char[] yearMonthPattern_; + private char[][] abbreviatedDayNames_; + private char[][] dayNames_; + private char[][] abbreviatedMonthNames_; + private char[][] monthNames_; + + private char[] fullDateTimePattern_; + private char[] generalShortTimePattern_; + private char[] generalLongTimePattern_; + + private char[][] shortTimePatterns_; + private char[][] shortDatePatterns_; + private char[][] longTimePatterns_; + private char[][] longDatePatterns_; + private char[][] yearMonthPatterns_; + + /** + * $(ANCHOR DateTimeFormat_ctor) + * Initializes an instance that is writable and culture-independent. + */ + public this() { + // This ctor is used by invariantFormat so we can't set the calendar property. + cultureData_ = Culture.invariantCulture.cultureData_; + calendar_ = Gregorian.generic; + initialize(); + } + + package this(CultureData* cultureData, Calendar calendar) { + cultureData_ = cultureData; + this.calendar = calendar; + } + + /** + * $(ANCHOR DateTimeFormat_getFormat) + * Retrieves an object defining how to format the specified type. + * Params: type = The TypeInfo of the resulting formatting object. + * Returns: If type is typeid(DateTimeFormat), the current DateTimeFormat instance. Otherwise, null. + * Remarks: Implements $(LINK2 #IFormatService_getFormat, IFormatService.getFormat). + */ + public Object getFormat(TypeInfo type) { + return (type is typeid(DateTimeFormat)) ? this : null; + } + +version(Clone) +{ + /** + */ + public Object clone() { + DateTimeFormat other = cast(DateTimeFormat)cloneObject(this); + other.calendar_ = cast(Calendar)calendar.clone(); + other.isReadOnly_ = false; + return other; + } +} + + package char[][] shortTimePatterns() { + if (shortTimePatterns_ == null) + shortTimePatterns_ = cultureData_.shortTimes; + return shortTimePatterns_.dup; + } + + package char[][] shortDatePatterns() { + if (shortDatePatterns_ == null) + shortDatePatterns_ = cultureData_.shortDates; + return shortDatePatterns_.dup; + } + + package char[][] longTimePatterns() { + if (longTimePatterns_ == null) + longTimePatterns_ = cultureData_.longTimes; + return longTimePatterns_.dup; + } + + package char[][] longDatePatterns() { + if (longDatePatterns_ == null) + longDatePatterns_ = cultureData_.longDates; + return longDatePatterns_.dup; + } + + package char[][] yearMonthPatterns() { + if (yearMonthPatterns_ == null) + yearMonthPatterns_ = cultureData_.yearMonths; + return yearMonthPatterns_; + } + + /** + * $(ANCHOR DateTimeFormat_getAllDateTimePatterns) + * Retrieves the standard patterns in which Time values can be formatted. + * Returns: An array of strings containing the standard patterns in which Time values can be formatted. + */ + public final char[][] getAllDateTimePatterns() { + char[][] result; + foreach (char format; DateTimeFormat.allStandardFormats) + result ~= getAllDateTimePatterns(format); + return result; + } + + /** + * $(ANCHOR DateTimeFormat_getAllDateTimePatterns_char) + * Retrieves the standard patterns in which Time values can be formatted using the specified format character. + * Returns: An array of strings containing the standard patterns in which Time values can be formatted using the specified format character. + */ + public final char[][] getAllDateTimePatterns(char format) { + + char[][] combinePatterns(char[][] patterns1, char[][] patterns2) { + char[][] result = new char[][patterns1.length * patterns2.length]; + for (int i = 0; i < patterns1.length; i++) { + for (int j = 0; j < patterns2.length; j++) + result[i * patterns2.length + j] = patterns1[i] ~ " " ~ patterns2[j]; + } + return result; + } + + // format must be one of allStandardFormats. + char[][] result; + switch (format) { + case 'd': + result ~= shortDatePatterns; + break; + case 'D': + result ~= longDatePatterns; + break; + case 'f': + result ~= combinePatterns(longDatePatterns, shortTimePatterns); + break; + case 'F': + result ~= combinePatterns(longDatePatterns, longTimePatterns); + break; + case 'g': + result ~= combinePatterns(shortDatePatterns, shortTimePatterns); + break; + case 'G': + result ~= combinePatterns(shortDatePatterns, longTimePatterns); + break; + case 'm': + case 'M': + result ~= monthDayPattern; + break; + case 'r': + case 'R': + result ~= rfc1123Pattern_; + break; + case 's': + result ~= sortableDateTimePattern_; + break; + case 't': + result ~= shortTimePatterns; + break; + case 'T': + result ~= longTimePatterns; + case 'u': + result ~= universalSortableDateTimePattern_; + break; + case 'U': + result ~= combinePatterns(longDatePatterns, longTimePatterns); + break; + case 'y': + case 'Y': + result ~= yearMonthPatterns; + break; + default: + error("The specified format was not valid."); + } + return result; + } + + /** + * $(ANCHOR DateTimeFormat_getAbbreviatedDayName) + * Retrieves the abbreviated name of the specified day of the week based on the culture of the instance. + * Params: dayOfWeek = A DayOfWeek value. + * Returns: The abbreviated name of the day of the week represented by dayOfWeek. + */ + public final char[] getAbbreviatedDayName(Calendar.DayOfWeek dayOfWeek) { + return abbreviatedDayNames[cast(int)dayOfWeek]; + } + + /** + * $(ANCHOR DateTimeFormat_getDayName) + * Retrieves the full name of the specified day of the week based on the culture of the instance. + * Params: dayOfWeek = A DayOfWeek value. + * Returns: The full name of the day of the week represented by dayOfWeek. + */ + public final char[] getDayName(Calendar.DayOfWeek dayOfWeek) { + return dayNames[cast(int)dayOfWeek]; + } + + /** + * $(ANCHOR DateTimeFormat_getAbbreviatedMonthName) + * Retrieves the abbreviated name of the specified month based on the culture of the instance. + * Params: month = An integer between 1 and 13 indicating the name of the _month to return. + * Returns: The abbreviated name of the _month represented by month. + */ + public final char[] getAbbreviatedMonthName(int month) { + return abbreviatedMonthNames[month - 1]; + } + + /** + * $(ANCHOR DateTimeFormat_getMonthName) + * Retrieves the full name of the specified month based on the culture of the instance. + * Params: month = An integer between 1 and 13 indicating the name of the _month to return. + * Returns: The full name of the _month represented by month. + */ + public final char[] getMonthName(int month) { + return monthNames[month - 1]; + } + + /** + * $(ANCHOR DateTimeFormat_getInstance) + * Retrieves the DateTimeFormat for the specified IFormatService. + * Params: formatService = The IFormatService used to retrieve DateTimeFormat. + * Returns: The DateTimeFormat for the specified IFormatService. + * Remarks: The method calls $(LINK2 #IFormatService_getFormat, IFormatService.getFormat) with typeof(DateTimeFormat). If formatService is null, + * then the value of the current property is returned. + */ + public static DateTimeFormat getInstance(IFormatService formatService) { + Culture culture = cast(Culture)formatService; + if (culture !is null) { + if (culture.dateTimeFormat_ !is null) + return culture.dateTimeFormat_; + return culture.dateTimeFormat; + } + if (DateTimeFormat dateTimeFormat = cast(DateTimeFormat)formatService) + return dateTimeFormat; + if (formatService !is null) { + if (DateTimeFormat dateTimeFormat = cast(DateTimeFormat)(formatService.getFormat(typeid(DateTimeFormat)))) + return dateTimeFormat; + } + return current; + } + + /** + * $(ANCHOR DateTimeFormat_current) + * $(I Property.) Retrieves a read-only DateTimeFormat instance from the current culture. + * Returns: A read-only DateTimeFormat instance from the current culture. + */ + public static DateTimeFormat current() { + return Culture.current.dateTimeFormat; + } + + /** + * $(ANCHOR DateTimeFormat_invariantFormat) + * $(I Property.) Retrieves a read-only DateTimeFormat instance that is culturally independent. + * Returns: A read-only DateTimeFormat instance that is culturally independent. + */ + public static DateTimeFormat invariantFormat() { + if (invariantFormat_ is null) { + invariantFormat_ = new DateTimeFormat; + invariantFormat_.calendar = new Gregorian(); + invariantFormat_.isReadOnly_ = true; + } + return invariantFormat_; + } + + /** + * $(ANCHOR DateTimeFormat_isReadOnly) + * $(I Property.) Retrieves a value indicating whether the instance is read-only. + * Returns: true is the instance is read-only; otherwise, false. + */ + public final bool isReadOnly() { + return isReadOnly_; + } + + /** + * $(I Property.) Retrieves the calendar used by the current culture. + * Returns: The Calendar determining the calendar used by the current culture. For example, the Gregorian. + */ + public final Calendar calendar() { + assert(calendar_ !is null); + return calendar_; + } + /** + * $(ANCHOR DateTimeFormat_calendar) + * $(I Property.) Assigns the calendar to be used by the current culture. + * Params: value = The Calendar determining the calendar to be used by the current culture. + * Exceptions: If value is not valid for the current culture, an Exception is thrown. + */ + public final void calendar(Calendar value) { + checkReadOnly(); + if (value !is calendar_) { + for (int i = 0; i < optionalCalendars.length; i++) { + if (optionalCalendars[i] == value.id) { + if (calendar_ !is null) { + // Clear current properties. + shortDatePattern_ = null; + longDatePattern_ = null; + shortTimePattern_ = null; + yearMonthPattern_ = null; + monthDayPattern_ = null; + generalShortTimePattern_ = null; + generalLongTimePattern_ = null; + fullDateTimePattern_ = null; + shortDatePatterns_ = null; + longDatePatterns_ = null; + yearMonthPatterns_ = null; + abbreviatedDayNames_ = null; + abbreviatedMonthNames_ = null; + dayNames_ = null; + monthNames_ = null; + } + calendar_ = value; + initialize(); + return; + } + } + error("Not a valid calendar for the culture."); + } + } + + /** + * $(ANCHOR DateTimeFormat_firstDayOfWeek) + * $(I Property.) Retrieves the first day of the week. + * Returns: A DayOfWeek value indicating the first day of the week. + */ + public final Calendar.DayOfWeek firstDayOfWeek() { + return cast(Calendar.DayOfWeek)firstDayOfWeek_; + } + /** + * $(I Property.) Assigns the first day of the week. + * Params: valie = A DayOfWeek value indicating the first day of the week. + */ + public final void firstDayOfWeek(Calendar.DayOfWeek value) { + checkReadOnly(); + firstDayOfWeek_ = value; + } + + /** + * $(ANCHOR DateTimeFormat_calendarWeekRule) + * $(I Property.) Retrieves the _value indicating the rule used to determine the first week of the year. + * Returns: A CalendarWeekRule _value determining the first week of the year. + */ + public final Calendar.WeekRule calendarWeekRule() { + return cast(Calendar.WeekRule) calendarWeekRule_; + } + /** + * $(I Property.) Assigns the _value indicating the rule used to determine the first week of the year. + * Params: value = A CalendarWeekRule _value determining the first week of the year. + */ + public final void calendarWeekRule(Calendar.WeekRule value) { + checkReadOnly(); + calendarWeekRule_ = value; + } + + /** + * $(ANCHOR DateTimeFormat_nativeCalendarName) + * $(I Property.) Retrieves the native name of the calendar associated with the current instance. + * Returns: The native name of the calendar associated with the current instance. + */ + public final char[] nativeCalendarName() { + return cultureData_.nativeCalName; + } + + /** + * $(ANCHOR DateTimeFormat_dateSeparator) + * $(I Property.) Retrieves the string separating date components. + * Returns: The string separating date components. + */ + public final char[] dateSeparator() { + if (dateSeparator_ == null) + dateSeparator_ = cultureData_.date; + return dateSeparator_; + } + /** + * $(I Property.) Assigns the string separating date components. + * Params: value = The string separating date components. + */ + public final void dateSeparator(char[] value) { + checkReadOnly(); + dateSeparator_ = value; + } + + /** + * $(ANCHOR DateTimeFormat_timeSeparator) + * $(I Property.) Retrieves the string separating time components. + * Returns: The string separating time components. + */ + public final char[] timeSeparator() { + if (timeSeparator_ == null) + timeSeparator_ = cultureData_.time; + return timeSeparator_; + } + /** + * $(I Property.) Assigns the string separating time components. + * Params: value = The string separating time components. + */ + public final void timeSeparator(char[] value) { + checkReadOnly(); + timeSeparator_ = value; + } + + /** + * $(ANCHOR DateTimeFormat_amDesignator) + * $(I Property.) Retrieves the string designator for hours before noon. + * Returns: The string designator for hours before noon. For example, "AM". + */ + public final char[] amDesignator() { + assert(amDesignator_ != null); + return amDesignator_; + } + /** + * $(I Property.) Assigns the string designator for hours before noon. + * Params: value = The string designator for hours before noon. + */ + public final void amDesignator(char[] value) { + checkReadOnly(); + amDesignator_ = value; + } + + /** + * $(ANCHOR DateTimeFormat_pmDesignator) + * $(I Property.) Retrieves the string designator for hours after noon. + * Returns: The string designator for hours after noon. For example, "PM". + */ + public final char[] pmDesignator() { + assert(pmDesignator_ != null); + return pmDesignator_; + } + /** + * $(I Property.) Assigns the string designator for hours after noon. + * Params: value = The string designator for hours after noon. + */ + public final void pmDesignator(char[] value) { + checkReadOnly(); + pmDesignator_ = value; + } + + /** + * $(ANCHOR DateTimeFormat_shortDatePattern) + * $(I Property.) Retrieves the format pattern for a short date value. + * Returns: The format pattern for a short date value. + */ + public final char[] shortDatePattern() { + assert(shortDatePattern_ != null); + return shortDatePattern_; + } + /** + * $(I Property.) Assigns the format pattern for a short date _value. + * Params: value = The format pattern for a short date _value. + */ + public final void shortDatePattern(char[] value) { + checkReadOnly(); + if (shortDatePatterns_ != null) + shortDatePatterns_[0] = value; + shortDatePattern_ = value; + generalLongTimePattern_ = null; + generalShortTimePattern_ = null; + } + + /** + * $(ANCHOR DateTimeFormat_shortTimePattern) + * $(I Property.) Retrieves the format pattern for a short time value. + * Returns: The format pattern for a short time value. + */ + public final char[] shortTimePattern() { + if (shortTimePattern_ == null) + shortTimePattern_ = cultureData_.shortTime; + return shortTimePattern_; + } + /** + * $(I Property.) Assigns the format pattern for a short time _value. + * Params: value = The format pattern for a short time _value. + */ + public final void shortTimePattern(char[] value) { + checkReadOnly(); + shortTimePattern_ = value; + generalShortTimePattern_ = null; + } + + /** + * $(ANCHOR DateTimeFormat_longDatePattern) + * $(I Property.) Retrieves the format pattern for a long date value. + * Returns: The format pattern for a long date value. + */ + public final char[] longDatePattern() { + assert(longDatePattern_ != null); + return longDatePattern_; + } + /** + * $(I Property.) Assigns the format pattern for a long date _value. + * Params: value = The format pattern for a long date _value. + */ + public final void longDatePattern(char[] value) { + checkReadOnly(); + if (longDatePatterns_ != null) + longDatePatterns_[0] = value; + longDatePattern_ = value; + fullDateTimePattern_ = null; + } + + /** + * $(ANCHOR DateTimeFormat_longTimePattern) + * $(I Property.) Retrieves the format pattern for a long time value. + * Returns: The format pattern for a long time value. + */ + public final char[] longTimePattern() { + assert(longTimePattern_ != null); + return longTimePattern_; + } + /** + * $(I Property.) Assigns the format pattern for a long time _value. + * Params: value = The format pattern for a long time _value. + */ + public final void longTimePattern(char[] value) { + checkReadOnly(); + longTimePattern_ = value; + fullDateTimePattern_ = null; + } + + /** + * $(ANCHOR DateTimeFormat_monthDayPattern) + * $(I Property.) Retrieves the format pattern for a month and day value. + * Returns: The format pattern for a month and day value. + */ + public final char[] monthDayPattern() { + if (monthDayPattern_ == null) + monthDayPattern_ = cultureData_.monthDay; + return monthDayPattern_; + } + /** + * $(I Property.) Assigns the format pattern for a month and day _value. + * Params: value = The format pattern for a month and day _value. + */ + public final void monthDayPattern(char[] value) { + checkReadOnly(); + monthDayPattern_ = value; + } + + /** + * $(ANCHOR DateTimeFormat_yearMonthPattern) + * $(I Property.) Retrieves the format pattern for a year and month value. + * Returns: The format pattern for a year and month value. + */ + public final char[] yearMonthPattern() { + assert(yearMonthPattern_ != null); + return yearMonthPattern_; + } + /** + * $(I Property.) Assigns the format pattern for a year and month _value. + * Params: value = The format pattern for a year and month _value. + */ + public final void yearMonthPattern(char[] value) { + checkReadOnly(); + yearMonthPattern_ = value; + } + + /** + * $(ANCHOR DateTimeFormat_abbreviatedDayNames) + * $(I Property.) Retrieves a string array containing the abbreviated names of the days of the week. + * Returns: A string array containing the abbreviated names of the days of the week. For $(LINK2 #DateTimeFormat_invariantFormat, invariantFormat), + * this contains "Sun", "Mon", "Tue", "Wed", "Thu", "Fri" and "Sat". + */ + public final char[][] abbreviatedDayNames() { + if (abbreviatedDayNames_ == null) + abbreviatedDayNames_ = cultureData_.abbrevDayNames; + return abbreviatedDayNames_.dup; + } + /** + * $(I Property.) Assigns a string array containing the abbreviated names of the days of the week. + * Params: value = A string array containing the abbreviated names of the days of the week. + */ + public final void abbreviatedDayNames(char[][] value) { + checkReadOnly(); + abbreviatedDayNames_ = value; + } + + /** + * $(ANCHOR DateTimeFormat_dayNames) + * $(I Property.) Retrieves a string array containing the full names of the days of the week. + * Returns: A string array containing the full names of the days of the week. For $(LINK2 #DateTimeFormat_invariantFormat, invariantFormat), + * this contains "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" and "Saturday". + */ + public final char[][] dayNames() { + if (dayNames_ == null) + dayNames_ = cultureData_.dayNames; + return dayNames_.dup; + } + /** + * $(I Property.) Assigns a string array containing the full names of the days of the week. + * Params: value = A string array containing the full names of the days of the week. + */ + public final void dayNames(char[][] value) { + checkReadOnly(); + dayNames_ = value; + } + + /** + * $(ANCHOR DateTimeFormat_abbreviatedMonthNames) + * $(I Property.) Retrieves a string array containing the abbreviated names of the months. + * Returns: A string array containing the abbreviated names of the months. For $(LINK2 #DateTimeFormat_invariantFormat, invariantFormat), + * this contains "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" and "". + */ + public final char[][] abbreviatedMonthNames() { + if (abbreviatedMonthNames_ == null) + abbreviatedMonthNames_ = cultureData_.abbrevMonthNames; + return abbreviatedMonthNames_.dup; + } + /** + * $(I Property.) Assigns a string array containing the abbreviated names of the months. + * Params: value = A string array containing the abbreviated names of the months. + */ + public final void abbreviatedMonthNames(char[][] value) { + checkReadOnly(); + abbreviatedMonthNames_ = value; + } + + /** + * $(ANCHOR DateTimeFormat_monthNames) + * $(I Property.) Retrieves a string array containing the full names of the months. + * Returns: A string array containing the full names of the months. For $(LINK2 #DateTimeFormat_invariantFormat, invariantFormat), + * this contains "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" and "". + */ + public final char[][] monthNames() { + if (monthNames_ == null) + monthNames_ = cultureData_.monthNames; + return monthNames_.dup; + } + /** + * $(I Property.) Assigns a string array containing the full names of the months. + * Params: value = A string array containing the full names of the months. + */ + public final void monthNames(char[][] value) { + checkReadOnly(); + monthNames_ = value; + } + + /** + * $(ANCHOR DateTimeFormat_fullDateTimePattern) + * $(I Property.) Retrieves the format pattern for a long date and a long time value. + * Returns: The format pattern for a long date and a long time value. + */ + public final char[] fullDateTimePattern() { + if (fullDateTimePattern_ == null) + fullDateTimePattern_ = longDatePattern ~ " " ~ longTimePattern; + return fullDateTimePattern_; + } + /** + * $(I Property.) Assigns the format pattern for a long date and a long time _value. + * Params: value = The format pattern for a long date and a long time _value. + */ + public final void fullDateTimePattern(char[] value) { + checkReadOnly(); + fullDateTimePattern_ = value; + } + + /** + * $(ANCHOR DateTimeFormat_rfc1123Pattern) + * $(I Property.) Retrieves the format pattern based on the IETF RFC 1123 specification, for a time value. + * Returns: The format pattern based on the IETF RFC 1123 specification, for a time value. + */ + public final char[] rfc1123Pattern() { + return rfc1123Pattern_; + } + + /** + * $(ANCHOR DateTimeFormat_sortableDateTimePattern) + * $(I Property.) Retrieves the format pattern for a sortable date and time value. + * Returns: The format pattern for a sortable date and time value. + */ + public final char[] sortableDateTimePattern() { + return sortableDateTimePattern_; + } + + /** + * $(ANCHOR DateTimeFormat_universalSortableDateTimePattern) + * $(I Property.) Retrieves the format pattern for a universal date and time value. + * Returns: The format pattern for a universal date and time value. + */ + public final char[] universalSortableDateTimePattern() { + return universalSortableDateTimePattern_; + } + + package char[] generalShortTimePattern() { + if (generalShortTimePattern_ == null) + generalShortTimePattern_ = shortDatePattern ~ " " ~ shortTimePattern; + return generalShortTimePattern_; + } + + package char[] generalLongTimePattern() { + if (generalLongTimePattern_ == null) + generalLongTimePattern_ = shortDatePattern ~ " " ~ longTimePattern; + return generalLongTimePattern_; + } + + private void checkReadOnly() { + if (isReadOnly_) + error("DateTimeFormat instance is read-only."); + } + + private void initialize() { + if (longTimePattern_ == null) + longTimePattern_ = cultureData_.longTime; + if (shortDatePattern_ == null) + shortDatePattern_ = cultureData_.shortDate; + if (longDatePattern_ == null) + longDatePattern_ = cultureData_.longDate; + if (yearMonthPattern_ == null) + yearMonthPattern_ = cultureData_.yearMonth; + if (amDesignator_ == null) + amDesignator_ = cultureData_.am; + if (pmDesignator_ == null) + pmDesignator_ = cultureData_.pm; + if (firstDayOfWeek_ == -1) + firstDayOfWeek_ = cultureData_.firstDayOfWeek; + if (calendarWeekRule_ == -1) + calendarWeekRule_ = cultureData_.firstDayOfYear; + } + + private int[] optionalCalendars() { + if (optionalCalendars_ is null) + optionalCalendars_ = cultureData_.optionalCalendars; + return optionalCalendars_; + } + + private void error(char[] msg) { + throw new LocaleException (msg); + } + +} + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/text/locale/Data.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/text/locale/Data.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,408 @@ +module tango.text.locale.Data; + +private import tango.core.Exception; + +package void error(char[] msg) { + throw new LocaleException (msg); +} + +package int compareString(char[] strA, char[] strB) { + // Comparison ignores case + int strALength = strA.length; + int strBLength = strB.length; + int l = strALength; + if (strBLength < l) + l = strBLength; + + int result; + + for (int i = 0; i < l; i++) { + if (strA[i] != strB[i]) { + char chA = strA[i]; + char chB = strB[i]; + if (chA >= 'A' && chA <= 'Z') + chA += cast(int)'a' - cast(int)'A'; + if (chB >= 'A' && chB <= 'Z') + chB += cast(int)'a' - cast(int)'A'; + result = cast(int)chA - cast(int)chB; + if (result != 0) + break; + } + } + if (result == 0) + result = strALength - strBLength; + return result; +} + +package struct CultureData { + + package int lcid; + package int parent; + package char[] name; + package char[] isoLangName; + package char[] isoLangName2; + package char[] ietfTag; + package char[] englishName; + package char[] nativeName; + package bool isNeutral; + + package int geoId; + package char[] regionName; + package char[] isoRegionName; + package char[] englishCountry; + package char[] nativeCountry; + package char[] intlSymbol; + package char[] englishCurrency; + package char[] nativeCurrency; + package bool isMetric; + + package int digits; + package int negativeNumber; + package int currencyDigits; + package int negativeCurrency; + package int positiveCurrency; + package int[] grouping; + package int[] monetaryGrouping; + package char[] decimal; + package char[] thousand; + package char[] monetaryDecimal; + package char[] monetaryThousand; + package char[] currency; + package char[] negativeSign; + package char[] positiveSign; + package char[] nan; + package char[] negInfinity; + package char[] posInfinity; + package char[][] nativeDigits; + + package int calendarType; + package int[] optionalCalendars; + package char[] nativeCalName; + package int firstDayOfWeek; + package int firstDayOfYear; + package char[] date; + package char[] time; + package char[] am; + package char[] pm; + package char[] shortDate; + package char[] shortTime; + package char[] longDate; + package char[] longTime; + package char[] monthDay; + package char[] yearMonth; + package char[][] shortTimes; + package char[][] shortDates; + package char[][] longTimes; + package char[][] longDates; + package char[][] yearMonths; + package char[][] abbrevDayNames; + package char[][] dayNames; + package char[][] abbrevMonthNames; + package char[][] monthNames; + + private static const CultureData[] cultureDataTable = [ +{ 0x0001, 0x007F, "ar", "ar", "ara", "ar", "\u0041\u0072\u0061\u0062\u0069\u0063", "\u0627\u0644\u0639\u0631\u0628\u064A\u0629", true }, +{ 0x0002, 0x007F, "bg", "bg", "bul", "bg", "\u0042\u0075\u006C\u0067\u0061\u0072\u0069\u0061\u006E", "\u0431\u044A\u043B\u0433\u0430\u0440\u0441\u043A\u0438", true }, +{ 0x0003, 0x007F, "ca", "ca", "cat", "ca", "\u0043\u0061\u0074\u0061\u006C\u0061\u006E", "\u0063\u0061\u0074\u0061\u006C\u00E0", true }, +{ 0x0004, 0x007F, "zh-CHS", "zh", "zho", "zh-Hans", "\u0043\u0068\u0069\u006E\u0065\u0073\u0065\u0020\u0028\u0053\u0069\u006D\u0070\u006C\u0069\u0066\u0069\u0065\u0064\u0029", "\u4E2D\u6587\u0028\u7B80\u4F53\u0029", true }, +{ 0x0005, 0x007F, "cs", "cs", "ces", "cs", "\u0043\u007A\u0065\u0063\u0068", "\u010D\u0065\u0161\u0074\u0069\u006E\u0061", true }, +{ 0x0006, 0x007F, "da", "da", "dan", "da", "\u0044\u0061\u006E\u0069\u0073\u0068", "\u0064\u0061\u006E\u0073\u006B", true }, +{ 0x0007, 0x007F, "de", "de", "deu", "de", "\u0047\u0065\u0072\u006D\u0061\u006E", "\u0044\u0065\u0075\u0074\u0073\u0063\u0068", true }, +{ 0x0008, 0x007F, "el", "el", "ell", "el", "\u0047\u0072\u0065\u0065\u006B", "\u03B5\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC", true }, +{ 0x0009, 0x007F, "en", "en", "eng", "en", "\u0045\u006E\u0067\u006C\u0069\u0073\u0068", "\u0045\u006E\u0067\u006C\u0069\u0073\u0068", true }, +{ 0x000A, 0x007F, "es", "es", "spa", "es", "\u0053\u0070\u0061\u006E\u0069\u0073\u0068", "\u0065\u0073\u0070\u0061\u00F1\u006F\u006C", true }, +{ 0x000B, 0x007F, "fi", "fi", "fin", "fi", "\u0046\u0069\u006E\u006E\u0069\u0073\u0068", "\u0073\u0075\u006F\u006D\u0069", true }, +{ 0x000C, 0x007F, "fr", "fr", "fra", "fr", "\u0046\u0072\u0065\u006E\u0063\u0068", "\u0066\u0072\u0061\u006E\u00E7\u0061\u0069\u0073", true }, +{ 0x000D, 0x007F, "he", "he", "heb", "he", "\u0048\u0065\u0062\u0072\u0065\u0077", "\u05E2\u05D1\u05E8\u05D9\u05EA", true }, +{ 0x000E, 0x007F, "hu", "hu", "hun", "hu", "\u0048\u0075\u006E\u0067\u0061\u0072\u0069\u0061\u006E", "\u006D\u0061\u0067\u0079\u0061\u0072", true }, +{ 0x000F, 0x007F, "is", "is", "isl", "is", "\u0049\u0063\u0065\u006C\u0061\u006E\u0064\u0069\u0063", "\u00ED\u0073\u006C\u0065\u006E\u0073\u006B\u0061", true }, +{ 0x0010, 0x007F, "it", "it", "ita", "it", "\u0049\u0074\u0061\u006C\u0069\u0061\u006E", "\u0069\u0074\u0061\u006C\u0069\u0061\u006E\u006F", true }, +{ 0x0011, 0x007F, "ja", "ja", "jpn", "ja", "\u004A\u0061\u0070\u0061\u006E\u0065\u0073\u0065", "\u65E5\u672C\u8A9E", true }, +{ 0x0012, 0x007F, "ko", "ko", "kor", "ko", "\u004B\u006F\u0072\u0065\u0061\u006E", "\uD55C\uAD6D\uC5B4", true }, +{ 0x0013, 0x007F, "nl", "nl", "nld", "nl", "\u0044\u0075\u0074\u0063\u0068", "\u004E\u0065\u0064\u0065\u0072\u006C\u0061\u006E\u0064\u0073", true }, +{ 0x0014, 0x007F, "no", "no", "nor", "no", "\u004E\u006F\u0072\u0077\u0065\u0067\u0069\u0061\u006E", "\u006E\u006F\u0072\u0073\u006B", true }, +{ 0x0015, 0x007F, "pl", "pl", "pol", "pl", "\u0050\u006F\u006C\u0069\u0073\u0068", "\u0070\u006F\u006C\u0073\u006B\u0069", true }, +{ 0x0016, 0x007F, "pt", "pt", "por", "pt", "\u0050\u006F\u0072\u0074\u0075\u0067\u0075\u0065\u0073\u0065", "\u0050\u006F\u0072\u0074\u0075\u0067\u0075\u00EA\u0073", true }, +{ 0x0018, 0x007F, "ro", "ro", "ron", "ro", "\u0052\u006F\u006D\u0061\u006E\u0069\u0061\u006E", "\u0072\u006F\u006D\u00E2\u006E\u0103", true }, +{ 0x0019, 0x007F, "ru", "ru", "rus", "ru", "\u0052\u0075\u0073\u0073\u0069\u0061\u006E", "\u0440\u0443\u0441\u0441\u043A\u0438\u0439", true }, +{ 0x001A, 0x007F, "hr", "hr", "hrv", "hr", "\u0043\u0072\u006F\u0061\u0074\u0069\u0061\u006E", "\u0068\u0072\u0076\u0061\u0074\u0073\u006B\u0069", true }, +{ 0x001B, 0x007F, "sk", "sk", "slk", "sk", "\u0053\u006C\u006F\u0076\u0061\u006B", "\u0073\u006C\u006F\u0076\u0065\u006E\u010D\u0069\u006E\u0061", true }, +{ 0x001C, 0x007F, "sq", "sq", "sqi", "sq", "\u0041\u006C\u0062\u0061\u006E\u0069\u0061\u006E", "\u0073\u0068\u0071\u0069\u0070\u0065", true }, +{ 0x001D, 0x007F, "sv", "sv", "swe", "sv", "\u0053\u0077\u0065\u0064\u0069\u0073\u0068", "\u0073\u0076\u0065\u006E\u0073\u006B\u0061", true }, +{ 0x001E, 0x007F, "th", "th", "tha", "th", "\u0054\u0068\u0061\u0069", "\u0E44\u0E17\u0E22", true }, +{ 0x001F, 0x007F, "tr", "tr", "tur", "tr", "\u0054\u0075\u0072\u006B\u0069\u0073\u0068", "\u0054\u00FC\u0072\u006B\u00E7\u0065", true }, +{ 0x0020, 0x007F, "ur", "ur", "urd", "ur", "\u0055\u0072\u0064\u0075", "\u0627\u064F\u0631\u062F\u0648", true }, +{ 0x0021, 0x007F, "id", "id", "ind", "id", "\u0049\u006E\u0064\u006F\u006E\u0065\u0073\u0069\u0061\u006E", "\u0042\u0061\u0068\u0061\u0073\u0061\u0020\u0049\u006E\u0064\u006F\u006E\u0065\u0073\u0069\u0061", true }, +{ 0x0022, 0x007F, "uk", "uk", "ukr", "uk", "\u0055\u006B\u0072\u0061\u0069\u006E\u0069\u0061\u006E", "\u0443\u043A\u0440\u0430\u0457\u043D\u044C\u0441\u043A\u0430", true }, +{ 0x0023, 0x007F, "be", "be", "bel", "be", "\u0042\u0065\u006C\u0061\u0072\u0075\u0073\u0069\u0061\u006E", "\u0411\u0435\u043B\u0430\u0440\u0443\u0441\u043A\u0456", true }, +{ 0x0024, 0x007F, "sl", "sl", "slv", "sl", "\u0053\u006C\u006F\u0076\u0065\u006E\u0069\u0061\u006E", "\u0073\u006C\u006F\u0076\u0065\u006E\u0073\u006B\u0069", true }, +{ 0x0025, 0x007F, "et", "et", "est", "et", "\u0045\u0073\u0074\u006F\u006E\u0069\u0061\u006E", "\u0065\u0065\u0073\u0074\u0069", true }, +{ 0x0026, 0x007F, "lv", "lv", "lav", "lv", "\u004C\u0061\u0074\u0076\u0069\u0061\u006E", "\u006C\u0061\u0074\u0076\u0069\u0065\u0161\u0075", true }, +{ 0x0027, 0x007F, "lt", "lt", "lit", "lt", "\u004C\u0069\u0074\u0068\u0075\u0061\u006E\u0069\u0061\u006E", "\u006C\u0069\u0065\u0074\u0075\u0076\u0069\u0173", true }, +{ 0x0029, 0x007F, "fa", "fa", "fas", "fa", "\u0050\u0065\u0072\u0073\u0069\u0061\u006E", "\u0641\u0627\u0631\u0633\u0649", true }, +{ 0x002A, 0x007F, "vi", "vi", "vie", "vi", "\u0056\u0069\u0065\u0074\u006E\u0061\u006D\u0065\u0073\u0065", "\u0054\u0069\u00EA\u0301\u006E\u0067\u0020\u0056\u0069\u00EA\u0323\u0074", true }, +{ 0x002B, 0x007F, "hy", "hy", "hye", "hy", "\u0041\u0072\u006D\u0065\u006E\u0069\u0061\u006E", "\u0540\u0561\u0575\u0565\u0580\u0565\u0576", true }, +{ 0x002C, 0x007F, "az", "az", "aze", "az", "\u0041\u007A\u0065\u0072\u0069", "\u0041\u007A\u0259\u0072\u0062\u0061\u0079\u0063\u0061\u006E\u00AD\u0131\u006C\u0131", true }, +{ 0x002D, 0x007F, "eu", "eu", "eus", "eu", "\u0042\u0061\u0073\u0071\u0075\u0065", "\u0065\u0075\u0073\u006B\u0061\u0072\u0061", true }, +{ 0x002F, 0x007F, "mk", "mk", "mkd", "mk", "\u004D\u0061\u0063\u0065\u0064\u006F\u006E\u0069\u0061\u006E", "\u043C\u0430\u043A\u0435\u0434\u043E\u043D\u0441\u043A\u0438\u0020\u0458\u0430\u0437\u0438\u043A", true }, +{ 0x0036, 0x007F, "af", "af", "afr", "af", "\u0041\u0066\u0072\u0069\u006B\u0061\u0061\u006E\u0073", "\u0041\u0066\u0072\u0069\u006B\u0061\u0061\u006E\u0073", true }, +{ 0x0037, 0x007F, "ka", "ka", "kat", "ka", "\u0047\u0065\u006F\u0072\u0067\u0069\u0061\u006E", "\u10E5\u10D0\u10E0\u10D7\u10E3\u10DA\u10D8", true }, +{ 0x0038, 0x007F, "fo", "fo", "fao", "fo", "\u0046\u0061\u0072\u006F\u0065\u0073\u0065", "\u0066\u00F8\u0072\u006F\u0079\u0073\u006B\u0074", true }, +{ 0x0039, 0x007F, "hi", "hi", "hin", "hi", "\u0048\u0069\u006E\u0064\u0069", "\u0939\u093F\u0902\u0926\u0940", true }, +{ 0x003E, 0x007F, "ms", "ms", "msa", "ms", "\u004D\u0061\u006C\u0061\u0079", "\u0042\u0061\u0068\u0061\u0073\u0061\u0020\u004D\u0061\u006C\u0061\u0079\u0073\u0069\u0061", true }, +{ 0x003F, 0x007F, "kk", "kk", "kaz", "kk", "\u004B\u0061\u007A\u0061\u006B\u0068", "\u049A\u0430\u0437\u0430\u0449\u0062", true }, +{ 0x0040, 0x007F, "ky", "ky", "kir", "ky", "\u004B\u0079\u0072\u0067\u0079\u007A", "\u041A\u044B\u0440\u0433\u044B\u0437", true }, +{ 0x0041, 0x007F, "sw", "sw", "swa", "sw", "\u004B\u0069\u0073\u0077\u0061\u0068\u0069\u006C\u0069", "\u004B\u0069\u0073\u0077\u0061\u0068\u0069\u006C\u0069", true }, +{ 0x0043, 0x007F, "uz", "uz", "uzb", "uz", "\u0055\u007A\u0062\u0065\u006B", "\u0055\u0027\u007A\u0062\u0065\u006B", true }, +{ 0x0044, 0x007F, "tt", "tt", "tat", "tt", "\u0054\u0061\u0074\u0061\u0072", "\u0422\u0430\u0442\u0430\u0440", true }, +{ 0x0046, 0x007F, "pa", "pa", "pan", "pa", "\u0050\u0075\u006E\u006A\u0061\u0062\u0069", "\u0A2A\u0A70\u0A1C\u0A3E\u0A2C\u0A40", true }, +{ 0x0047, 0x007F, "gu", "gu", "guj", "gu", "\u0047\u0075\u006A\u0061\u0072\u0061\u0074\u0069", "\u0A97\u0AC1\u0A9C\u0AB0\u0ABE\u0AA4\u0AC0", true }, +{ 0x0049, 0x007F, "ta", "ta", "tam", "ta", "\u0054\u0061\u006D\u0069\u006C", "\u0BA4\u0BAE\u0BBF\u0BB4\u0BCD", true }, +{ 0x004A, 0x007F, "te", "te", "tel", "te", "\u0054\u0065\u006C\u0075\u0067\u0075", "\u0C24\u0C46\u0C32\u0C41\u0C17\u0C41", true }, +{ 0x004B, 0x007F, "kn", "kn", "kan", "kn", "\u004B\u0061\u006E\u006E\u0061\u0064\u0061", "\u0C95\u0CA8\u0CCD\u0CA8\u0CA1", true }, +{ 0x004E, 0x007F, "mr", "mr", "mar", "mr", "\u004D\u0061\u0072\u0061\u0074\u0068\u0069", "\u092E\u0930\u093E\u0920\u0940", true }, +{ 0x004F, 0x007F, "sa", "sa", "san", "sa", "\u0053\u0061\u006E\u0073\u006B\u0072\u0069\u0074", "\u0938\u0902\u0938\u094D\u0915\u0943\u0924", true }, +{ 0x0050, 0x007F, "mn", "mn", "mon", "mn", "\u004D\u006F\u006E\u0067\u006F\u006C\u0069\u0061\u006E", "\u041C\u043E\u043D\u0433\u043E\u043B\u00A0\u0445\u044D\u043B", true }, +{ 0x0056, 0x007F, "gl", "gl", "glg", "gl", "\u0047\u0061\u006C\u0069\u0063\u0069\u0061\u006E", "\u0067\u0061\u006C\u0065\u0067\u006F", true }, +{ 0x0057, 0x007F, "kok", "kok", "kok", "kok", "\u004B\u006F\u006E\u006B\u0061\u006E\u0069", "\u0915\u094B\u0902\u0915\u0923\u0940", true }, +{ 0x005A, 0x007F, "syr", "syr", "syr", "syr", "\u0053\u0079\u0072\u0069\u0061\u0063", "\u0723\u0718\u072A\u071D\u071D\u0710", true }, +{ 0x0065, 0x007F, "div", "div", "div", "div", "\u0044\u0069\u0076\u0065\u0068\u0069", "\u078B\u07A8\u0788\u07AC\u0780\u07A8\u0784\u07A6\u0790\u07B0", true }, +{ 0x007F, 0x007F, "", "iv", "IVL", "", "\u0049\u006E\u0076\u0061\u0072\u0069\u0061\u006E\u0074\u0020\u004C\u0061\u006E\u0067\u0075\u0061\u0067\u0065\u0020\u0028\u0049\u006E\u0076\u0061\u0072\u0069\u0061\u006E\u0074\u0020\u0043\u006F\u0075\u006E\u0074\u0072\u0079\u0029", "\u0049\u006E\u0076\u0061\u0072\u0069\u0061\u006E\u0074\u0020\u004C\u0061\u006E\u0067\u0075\u0061\u0067\u0065\u0020\u0028\u0049\u006E\u0076\u0061\u0072\u0069\u0061\u006E\u0074\u0020\u0043\u006F\u0075\u006E\u0074\u0072\u0079\u0029", false }, +{ 0x0401, 0x0001, "ar-SA", "ar", "ara", "ar-SA", "\u0041\u0072\u0061\u0062\u0069\u0063\u0020\u0028\u0053\u0061\u0075\u0064\u0069\u0020\u0041\u0072\u0061\u0062\u0069\u0061\u0029", "\u0627\u0644\u0639\u0631\u0628\u064A\u0629\u0020\u0028\u0627\u0644\u0645\u0645\u0644\u0643\u0629\u0020\u0627\u0644\u0639\u0631\u0628\u064A\u0629\u0020\u0627\u0644\u0633\u0639\u0648\u062F\u064A\u0629\u0029", false, 0x00CD, "SA", "SAU", "\u0053\u0061\u0075\u0064\u0069\u0020\u0041\u0072\u0061\u0062\u0069\u0061", "\u0627\u0644\u0645\u0645\u0644\u0643\u0629\u0020\u0627\u0644\u0639\u0631\u0628\u064A\u0629\u0020\u0627\u0644\u0633\u0639\u0648\u062F\u064A\u0629", "\u0053\u0041\u0052", "\u0053\u0061\u0075\u0064\u0069\u0020\u0052\u0069\u0079\u0061\u006C", "\u0631\u064A\u0627\u0644\u00A0\u0633\u0639\u0648\u062F\u064A", true, 2, 3, 2, 3, 2, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0631\u002E\u0633\u002E\u200F", "\u002D", "\u002B", "\u0644\u064A\u0633\u0020\u0628\u0631\u0642\u0645", "\u002D\u0644\u0627\u0020\u0646\u0647\u0627\u064A\u0629", "\u002B\u0644\u0627\u0020\u0646\u0647\u0627\u064A\u0629", [ "\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669" ], 6, [ 6, 23, 2, 9, 10, 1, 12 ], "\u0627\u0644\u062A\u0642\u0648\u064A\u0645\u00A0\u0627\u0644\u0647\u062C\u0631\u064A", 6, 0, "\u002F", "\u003A", "\u0635", "\u0645", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u002F\u004D\u004D\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u002F\u004D\u004D\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0627\u0644\u0627\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0627\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" ], [ "\u0627\u0644\u0627\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0627\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" ], [ "\u0645\u062D\u0631\u0645", "\u0635\u0641\u0631", "\u0631\u0628\u064A\u0639\u00A0\u0627\u0644\u0627\u0648\u0644", "\u0631\u0628\u064A\u0639\u00A0\u0627\u0644\u062B\u0627\u0646\u064A", "\u062C\u0645\u0627\u062F\u0649\u00A0\u0627\u0644\u0627\u0648\u0644\u0649", "\u062C\u0645\u0627\u062F\u0649\u00A0\u0627\u0644\u062B\u0627\u0646\u064A\u0629", "\u0631\u062C\u0628", "\u0634\u0639\u0628\u0627\u0646", "\u0631\u0645\u0636\u0627\u0646", "\u0634\u0648\u0627\u0644", "\u0630\u0648\u00A0\u0627\u0644\u0642\u0639\u062F\u0629", "\u0630\u0648\u00A0\u0627\u0644\u062D\u062C\u0629", "" ], [ "\u0645\u062D\u0631\u0645", "\u0635\u0641\u0631", "\u0631\u0628\u064A\u0639\u00A0\u0627\u0644\u0623\u0648\u0644", "\u0631\u0628\u064A\u0639\u00A0\u0627\u0644\u062B\u0627\u0646\u064A", "\u062C\u0645\u0627\u062F\u0649\u00A0\u0627\u0644\u0623\u0648\u0644\u0649", "\u062C\u0645\u0627\u062F\u0649\u00A0\u0627\u0644\u062B\u0627\u0646\u064A\u0629", "\u0631\u062C\u0628", "\u0634\u0639\u0628\u0627\u0646", "\u0631\u0645\u0636\u0627\u0646", "\u0634\u0648\u0627\u0644", "\u0630\u0648\u00A0\u0627\u0644\u0642\u0639\u062F\u0629", "\u0630\u0648\u00A0\u0627\u0644\u062D\u062C\u0629", "" ] }, +{ 0x0402, 0x0002, "bg-BG", "bg", "bul", "bg-BG", "\u0042\u0075\u006C\u0067\u0061\u0072\u0069\u0061\u006E\u0020\u0028\u0042\u0075\u006C\u0067\u0061\u0072\u0069\u0061\u0029", "\u0431\u044A\u043B\u0433\u0430\u0440\u0441\u043A\u0438\u0020\u0028\u0411\u044A\u043B\u0433\u0430\u0440\u0438\u044F\u0029", false, 0x0023, "BG", "BGR", "\u0042\u0075\u006C\u0067\u0061\u0072\u0069\u0061", "\u0411\u044A\u043B\u0433\u0430\u0440\u0438\u044F", "\u0042\u0047\u004C", "\u0042\u0075\u006C\u0067\u0061\u0072\u0069\u0061\u006E\u0020\u004C\u0065\u0076", "\u043B\u0432\u002E", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002C", "\u00A0", "\u043B\u0432", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0413\u0440\u0435\u0433\u043E\u0440\u0438\u0430\u043D\u0441\u043A\u0438\u0020\u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440", 1, 0, "\u002E", "\u003A", "", "", "\u0064\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079\u0020\'\u0433\u002E\'", "\u0048\u0048\u003A\u006D\u006D", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079\u0020\'\u0433\u002E\'", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079\u0020\'\u0433\u002E\'", [ "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079\u0020\'\u0433\u002E\'", "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079\u0020\'\u0433\u002E\'", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079\u0020\'\u0433\u002E\'", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079\u0020\'\u0433\u002E\'", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079\u0020\'\u0433\u002E\'" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079\u0020\'\u0433\u002E\'" ], [ "\u041D\u0434", "\u041F\u043D", "\u0412\u0442", "\u0421\u0440", "\u0427\u0442", "\u041F\u0442", "\u0421\u0431" ], [ "\u043D\u0435\u0434\u0435\u043B\u044F", "\u043F\u043E\u043D\u0435\u0434\u0435\u043B\u043D\u0438\u043A", "\u0432\u0442\u043E\u0440\u043D\u0438\u043A", "\u0441\u0440\u044F\u0434\u0430", "\u0447\u0435\u0442\u0432\u044A\u0440\u0442\u044A\u043A", "\u043F\u0435\u0442\u044A\u043A", "\u0441\u044A\u0431\u043E\u0442\u0430" ], [ "\u042F\u043D\u0443\u0430\u0440\u0438", "\u0424\u0435\u0432\u0440\u0443\u0430\u0440\u0438", "\u041C\u0430\u0440\u0442", "\u0410\u043F\u0440\u0438\u043B", "\u041C\u0430\u0439", "\u042E\u043D\u0438", "\u042E\u043B\u0438", "\u0410\u0432\u0433\u0443\u0441\u0442", "\u0421\u0435\u043F\u0442\u0435\u043C\u0432\u0440\u0438", "\u041E\u043A\u0442\u043E\u043C\u0432\u0440\u0438", "\u041D\u043E\u0435\u043C\u0432\u0440\u0438", "\u0414\u0435\u043A\u0435\u043C\u0432\u0440\u0438", "" ], [ "\u042F\u043D\u0443\u0430\u0440\u0438", "\u0424\u0435\u0432\u0440\u0443\u0430\u0440\u0438", "\u041C\u0430\u0440\u0442", "\u0410\u043F\u0440\u0438\u043B", "\u041C\u0430\u0439", "\u042E\u043D\u0438", "\u042E\u043B\u0438", "\u0410\u0432\u0433\u0443\u0441\u0442", "\u0421\u0435\u043F\u0442\u0435\u043C\u0432\u0440\u0438", "\u041E\u043A\u0442\u043E\u043C\u0432\u0440\u0438", "\u041D\u043E\u0435\u043C\u0432\u0440\u0438", "\u0414\u0435\u043A\u0435\u043C\u0432\u0440\u0438", "" ] }, +{ 0x0403, 0x0003, "ca-ES", "ca", "cat", "ca-ES", "\u0043\u0061\u0074\u0061\u006C\u0061\u006E\u0020\u0028\u0043\u0061\u0074\u0061\u006C\u0061\u006E\u0029", "\u0063\u0061\u0074\u0061\u006C\u00E0\u0020\u0028\u0063\u0061\u0074\u0061\u006C\u00E0\u0029", false, 0x00D9, "ES", "ESP", "\u0053\u0070\u0061\u0069\u006E", "\u0045\u0073\u0070\u0061\u006E\u0079\u0061", "\u0045\u0055\u0052", "\u0045\u0075\u0072\u006F", "\u0065\u0075\u0072\u006F", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u20AC", "\u002D", "\u002B", "\u004E\u0065\u0075\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0063\u0061\u006C\u0065\u006E\u0064\u0061\u0072\u0069\u0020\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u00E0", 1, 0, "\u002F", "\u003A", "", "", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\'\u0020\u002F\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u002F\u0020\'\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\'\u0020\u002F\u0020\'\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D", "\u0048\u0048\'\u0048\'\u006D\u006D\'\u005C\'\'" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\'\u0048\'\u006D\u006D\'\u005C\'\'\u0073\u0073\'\u005C\'\u005C\'\'" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\'\u0020\u002F\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u002F\u0020\'\u0079\u0079\u0079\u0079", "\u0064\'\u002F\'\u004D\u004D\u004D\u004D\'\u002F\'\u0079\u0079\u0079\u0079", "\u0064\'\u0020\'\u004D\u004D\u004D\u004D\'\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\'\u0020\u002F\u0020\'\u0079\u0079\u0079\u0079", "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u0064\u0067\u002E", "\u0064\u006C\u002E", "\u0064\u0074\u002E", "\u0064\u0063\u002E", "\u0064\u006A\u002E", "\u0064\u0076\u002E", "\u0064\u0073\u002E" ], [ "\u0064\u0069\u0075\u006D\u0065\u006E\u0067\u0065", "\u0064\u0069\u006C\u006C\u0075\u006E\u0073", "\u0064\u0069\u006D\u0061\u0072\u0074\u0073", "\u0064\u0069\u006D\u0065\u0063\u0072\u0065\u0073", "\u0064\u0069\u006A\u006F\u0075\u0073", "\u0064\u0069\u0076\u0065\u006E\u0064\u0072\u0065\u0073", "\u0064\u0069\u0073\u0073\u0061\u0062\u0074\u0065" ], [ "\u0067\u0065\u006E", "\u0066\u0065\u0062", "\u006D\u0061\u0072\u00E7", "\u0061\u0062\u0072", "\u006D\u0061\u0069\u0067", "\u006A\u0075\u006E\u0079", "\u006A\u0075\u006C", "\u0061\u0067", "\u0073\u0065\u0074", "\u006F\u0063\u0074", "\u006E\u006F\u0076", "\u0064\u0065\u0073", "" ], [ "\u0067\u0065\u006E\u0065\u0072", "\u0066\u0065\u0062\u0072\u0065\u0072", "\u006D\u0061\u0072\u00E7", "\u0061\u0062\u0072\u0069\u006C", "\u006D\u0061\u0069\u0067", "\u006A\u0075\u006E\u0079", "\u006A\u0075\u006C\u0069\u006F\u006C", "\u0061\u0067\u006F\u0073\u0074", "\u0073\u0065\u0074\u0065\u006D\u0062\u0072\u0065", "\u006F\u0063\u0074\u0075\u0062\u0072\u0065", "\u006E\u006F\u0076\u0065\u006D\u0062\u0072\u0065", "\u0064\u0065\u0073\u0065\u006D\u0062\u0072\u0065", "" ] }, +{ 0x0404, 0x7C04, "zh-TW", "zh", "zho", "zh-TW", "\u0043\u0068\u0069\u006E\u0065\u0073\u0065\u0020\u0028\u0054\u0061\u0069\u0077\u0061\u006E\u0029", "\u4E2D\u6587\u0028\u53F0\u7063\u0029", false, 0x00ED, "TW", "TWN", "\u0054\u0061\u0069\u0077\u0061\u006E", "\u53F0\u7063", "\u0054\u0057\u0044", "\u004E\u0065\u0077\u0020\u0054\u0061\u0069\u0077\u0061\u006E\u0020\u0044\u006F\u006C\u006C\u0061\u0072", "\u65B0\u53F0\u5E63", true, 2, 1, 2, 1, 0, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u004E\u0054\u0024", "\u002D", "\u002B", "\u4E0D\u662F\u4E00\u500B\u6578\u5B57", "\u8CA0\u7121\u7AAE\u5927", "\u6B63\u7121\u7AAE\u5927", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1, 2, 4 ], "\u897F\u66C6\u0020\u0028\u4E2D\u6587\u0029", 0, 0, "\u002F", "\u003A", "\u4E0A\u5348", "\u4E0B\u5348", "\u0079\u0079\u0079\u0079\u002F\u004D\u002F\u0064", "\u0074\u0074\u0020\u0068\u0068\u003A\u006D\u006D", "\u0079\u0079\u0079\u0079\'\u5E74\'\u004D\'\u6708\'\u0064\'\u65E5\'", "\u0074\u0074\u0020\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073", "\u004D\'\u6708\'\u0064\'\u65E5\'", "\u0079\u0079\u0079\u0079\'\u5E74\'\u004D\'\u6708\'", [ "\u0074\u0074\u0020\u0068\u0068\u003A\u006D\u006D", "\u0074\u0074\u0020\u0068\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D" ], [ "\u0079\u0079\u0079\u0079\u002F\u004D\u002F\u0064", "\u0079\u0079\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0074\u0074\u0020\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073", "\u0074\u0074\u0020\u0068\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0079\u0079\u0079\u0079\'\u5E74\'\u004D\'\u6708\'\u0064\'\u65E5\'", "\u0079\u0079\u0079\u0079\'\u5E74\'\u004D\u004D\'\u6708\'\u0064\u0064\'\u65E5\'" ], [ "\u0079\u0079\u0079\u0079\'\u5E74\'\u004D\'\u6708\'" ], [ "\u661F\u671F\u65E5", "\u661F\u671F\u4E00", "\u661F\u671F\u4E8C", "\u661F\u671F\u4E09", "\u661F\u671F\u56DB", "\u661F\u671F\u4E94", "\u661F\u671F\u516D" ], [ "\u661F\u671F\u65E5", "\u661F\u671F\u4E00", "\u661F\u671F\u4E8C", "\u661F\u671F\u4E09", "\u661F\u671F\u56DB", "\u661F\u671F\u4E94", "\u661F\u671F\u516D" ], [ "\u4E00\u6708", "\u4E8C\u6708", "\u4E09\u6708", "\u56DB\u6708", "\u4E94\u6708", "\u516D\u6708", "\u4E03\u6708", "\u516B\u6708", "\u4E5D\u6708", "\u5341\u6708", "\u5341\u4E00\u6708", "\u5341\u4E8C\u6708", "" ], [ "\u4E00\u6708", "\u4E8C\u6708", "\u4E09\u6708", "\u56DB\u6708", "\u4E94\u6708", "\u516D\u6708", "\u4E03\u6708", "\u516B\u6708", "\u4E5D\u6708", "\u5341\u6708", "\u5341\u4E00\u6708", "\u5341\u4E8C\u6708", "" ] }, +{ 0x0405, 0x0005, "cs-CZ", "cs", "ces", "cs-CZ", "\u0043\u007A\u0065\u0063\u0068\u0020\u0028\u0043\u007A\u0065\u0063\u0068\u0020\u0052\u0065\u0070\u0075\u0062\u006C\u0069\u0063\u0029", "\u010D\u0065\u0161\u0074\u0069\u006E\u0061\u0020\u0028\u010C\u0065\u0073\u006B\u00E1\u00A0\u0072\u0065\u0070\u0075\u0062\u006C\u0069\u006B\u0061\u0029", false, 0x004B, "CZ", "CZE", "\u0043\u007A\u0065\u0063\u0068\u0020\u0052\u0065\u0070\u0075\u0062\u006C\u0069\u0063", "\u010C\u0065\u0073\u006B\u00E1\u00A0\u0072\u0065\u0070\u0075\u0062\u006C\u0069\u006B\u0061", "\u0043\u005A\u004B", "\u0043\u007A\u0065\u0063\u0068\u0020\u004B\u006F\u0072\u0075\u006E\u0061", "\u004B\u006F\u0072\u0075\u006E\u0061\u0020\u010C\u0065\u0073\u006B\u00E1", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002C", "\u00A0", "\u004B\u010D", "\u002D", "\u002B", "\u004E\u0065\u006E\u00ED\u0020\u010D\u00ED\u0073\u006C\u006F", "\u002D\u006E\u0065\u006B\u006F\u006E\u0065\u010D\u006E\u006F", "\u002B\u006E\u0065\u006B\u006F\u006E\u0065\u010D\u006E\u006F", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u00E1\u006E\u0073\u006B\u00FD\u0020\u006B\u0061\u006C\u0065\u006E\u0064\u00E1\u0159", 1, 0, "\u002E", "\u003A", "\u0064\u006F\u0070\u002E", "\u006F\u0064\u0070\u002E", "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D", "\u0068\u002E\u006D\u006D\u0020\u0074\u0074", "\u0048\u002E\u006D\u006D" ], [ "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u002D\u004D\u002D\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0079\u0079\u0079\u0079\u002D\u004D\u002D\u0064", "\u0079\u0079\u002D\u004D\u002D\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0068\u002E\u006D\u006D\u002E\u0073\u0073\u0020\u0074\u0074", "\u0048\u002E\u006D\u006D\u002E\u0073\u0073" ], [ "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u006E\u0065", "\u0070\u006F", "\u00FA\u0074", "\u0073\u0074", "\u010D\u0074", "\u0070\u00E1", "\u0073\u006F" ], [ "\u006E\u0065\u0064\u011B\u006C\u0065", "\u0070\u006F\u006E\u0064\u011B\u006C\u00ED", "\u00FA\u0074\u0065\u0072\u00FD", "\u0073\u0074\u0159\u0065\u0064\u0061", "\u010D\u0074\u0076\u0072\u0074\u0065\u006B", "\u0070\u00E1\u0074\u0065\u006B", "\u0073\u006F\u0062\u006F\u0074\u0061" ], [ "\u0049", "\u0049\u0049", "\u0049\u0049\u0049", "\u0049\u0056", "\u0056", "\u0056\u0049", "\u0056\u0049\u0049", "\u0056\u0049\u0049\u0049", "\u0049\u0058", "\u0058", "\u0058\u0049", "\u0058\u0049\u0049", "" ], [ "\u006C\u0065\u0064\u0065\u006E", "\u00FA\u006E\u006F\u0072", "\u0062\u0159\u0065\u007A\u0065\u006E", "\u0064\u0075\u0062\u0065\u006E", "\u006B\u0076\u011B\u0074\u0065\u006E", "\u010D\u0065\u0072\u0076\u0065\u006E", "\u010D\u0065\u0072\u0076\u0065\u006E\u0065\u0063", "\u0073\u0072\u0070\u0065\u006E", "\u007A\u00E1\u0159\u00ED", "\u0159\u00ED\u006A\u0065\u006E", "\u006C\u0069\u0073\u0074\u006F\u0070\u0061\u0064", "\u0070\u0072\u006F\u0073\u0069\u006E\u0065\u0063", "" ] }, +{ 0x0406, 0x0006, "da-DK", "da", "dan", "da-DK", "\u0044\u0061\u006E\u0069\u0073\u0068\u0020\u0028\u0044\u0065\u006E\u006D\u0061\u0072\u006B\u0029", "\u0064\u0061\u006E\u0073\u006B\u0020\u0028\u0044\u0061\u006E\u006D\u0061\u0072\u006B\u0029", false, 0x003D, "DK", "DNK", "\u0044\u0065\u006E\u006D\u0061\u0072\u006B", "\u0044\u0061\u006E\u006D\u0061\u0072\u006B", "\u0044\u004B\u004B", "\u0044\u0061\u006E\u0069\u0073\u0068\u0020\u004B\u0072\u006F\u006E\u0065", "\u0044\u0061\u006E\u0073\u006B\u0020\u006B\u0072\u006F\u006E\u0065", true, 2, 1, 2, 12, 2, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u006B\u0072", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u004E\u0046", "\u0049\u004E\u0046", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0044\u0065\u006E\u0020\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0073\u006B\u0065\u0020\u006B\u0061\u006C\u0065\u006E\u0064\u0065\u0072", 1, 2, "\u002D", "\u003A", "", "", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0079\u0079\u0079\u0079\u0020\u004D\u004D\u0020\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0073\u00F8", "\u006D\u0061", "\u0074\u0069", "\u006F\u006E", "\u0074\u006F", "\u0066\u0072", "\u006C\u00F8" ], [ "\u0073\u00F8\u006E\u0064\u0061\u0067", "\u006D\u0061\u006E\u0064\u0061\u0067", "\u0074\u0069\u0072\u0073\u0064\u0061\u0067", "\u006F\u006E\u0073\u0064\u0061\u0067", "\u0074\u006F\u0072\u0073\u0064\u0061\u0067", "\u0066\u0072\u0065\u0064\u0061\u0067", "\u006C\u00F8\u0072\u0064\u0061\u0067" ], [ "\u006A\u0061\u006E", "\u0066\u0065\u0062", "\u006D\u0061\u0072", "\u0061\u0070\u0072", "\u006D\u0061\u006A", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0075\u0067", "\u0073\u0065\u0070", "\u006F\u006B\u0074", "\u006E\u006F\u0076", "\u0064\u0065\u0063", "" ], [ "\u006A\u0061\u006E\u0075\u0061\u0072", "\u0066\u0065\u0062\u0072\u0075\u0061\u0072", "\u006D\u0061\u0072\u0074\u0073", "\u0061\u0070\u0072\u0069\u006C", "\u006D\u0061\u006A", "\u006A\u0075\u006E\u0069", "\u006A\u0075\u006C\u0069", "\u0061\u0075\u0067\u0075\u0073\u0074", "\u0073\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u006F\u006B\u0074\u006F\u0062\u0065\u0072", "\u006E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0064\u0065\u0063\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x0407, 0x0007, "de-DE", "de", "deu", "de-DE", "\u0047\u0065\u0072\u006D\u0061\u006E\u0020\u0028\u0047\u0065\u0072\u006D\u0061\u006E\u0079\u0029", "\u0044\u0065\u0075\u0074\u0073\u0063\u0068\u0020\u0028\u0044\u0065\u0075\u0074\u0073\u0063\u0068\u006C\u0061\u006E\u0064\u0029", false, 0x005E, "DE", "DEU", "\u0047\u0065\u0072\u006D\u0061\u006E\u0079", "\u0044\u0065\u0075\u0074\u0073\u0063\u0068\u006C\u0061\u006E\u0064", "\u0045\u0055\u0052", "\u0045\u0075\u0072\u006F", "\u0045\u0075\u0072\u006F", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u20AC", "\u002D", "\u002B", "\u006E\u002E\u0020\u0064\u0065\u0066\u002E", "\u002D\u0075\u006E\u0065\u006E\u0064\u006C\u0069\u0063\u0068", "\u002B\u0075\u006E\u0065\u006E\u0064\u006C\u0069\u0063\u0068", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0047\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0069\u0073\u0063\u0068\u0065\u0072\u0020\u004B\u0061\u006C\u0065\u006E\u0064\u0065\u0072", 1, 2, "\u002E", "\u003A", "", "", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D", "\u0048\u002E\u006D\u006D", "\u0048\u002E\u006D\u006D\'\u0020\u0055\u0068\u0072\u0020\'" ], [ "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u002E\u006D\u006D", "\u0048\u002E\u006D\u006D\'\u0020\u0055\u0068\u0072\u0020\'" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u002E\u0020\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0053\u006F", "\u004D\u006F", "\u0044\u0069", "\u004D\u0069", "\u0044\u006F", "\u0046\u0072", "\u0053\u0061" ], [ "\u0053\u006F\u006E\u006E\u0074\u0061\u0067", "\u004D\u006F\u006E\u0074\u0061\u0067", "\u0044\u0069\u0065\u006E\u0073\u0074\u0061\u0067", "\u004D\u0069\u0074\u0074\u0077\u006F\u0063\u0068", "\u0044\u006F\u006E\u006E\u0065\u0072\u0073\u0074\u0061\u0067", "\u0046\u0072\u0065\u0069\u0074\u0061\u0067", "\u0053\u0061\u006D\u0073\u0074\u0061\u0067" ], [ "\u004A\u0061\u006E", "\u0046\u0065\u0062", "\u004D\u0072\u007A", "\u0041\u0070\u0072", "\u004D\u0061\u0069", "\u004A\u0075\u006E", "\u004A\u0075\u006C", "\u0041\u0075\u0067", "\u0053\u0065\u0070", "\u004F\u006B\u0074", "\u004E\u006F\u0076", "\u0044\u0065\u007A", "" ], [ "\u004A\u0061\u006E\u0075\u0061\u0072", "\u0046\u0065\u0062\u0072\u0075\u0061\u0072", "\u004D\u00E4\u0072\u007A", "\u0041\u0070\u0072\u0069\u006C", "\u004D\u0061\u0069", "\u004A\u0075\u006E\u0069", "\u004A\u0075\u006C\u0069", "\u0041\u0075\u0067\u0075\u0073\u0074", "\u0053\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u004F\u006B\u0074\u006F\u0062\u0065\u0072", "\u004E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0044\u0065\u007A\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x0408, 0x0008, "el-GR", "el", "ell", "el-GR", "\u0047\u0072\u0065\u0065\u006B\u0020\u0028\u0047\u0072\u0065\u0065\u0063\u0065\u0029", "\u03B5\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC\u0020\u0028\u0395\u03BB\u03BB\u03AC\u03B4\u03B1\u0029", false, 0x0062, "GR", "GRC", "\u0047\u0072\u0065\u0065\u0063\u0065", "\u0395\u03BB\u03BB\u03AC\u03B4\u03B1", "\u0045\u0055\u0052", "\u0045\u0075\u0072\u006F", "\u03B5\u03C5\u03C1\u03CE", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u20AC", "\u002D", "\u002B", "\u03BC\u03B7\u00A0\u03B1\u03C1\u03B9\u03B8\u03BC\u03CC\u03C2", "\u002D\u0386\u03C0\u03B5\u03B9\u03C1\u03BF", "\u0386\u03C0\u03B5\u03B9\u03C1\u03BF", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0393\u03C1\u03B7\u03B3\u03BF\u03C1\u03B9\u03B1\u03BD\u03CC\u0020\u0397\u03BC\u03B5\u03C1\u03BF\u03BB\u03CC\u03B3\u03B9\u03BF", 1, 0, "\u002F", "\u003A", "\u03C0\u03BC", "\u03BC\u03BC", "\u0064\u002F\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u002F\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u039A\u03C5\u03C1", "\u0394\u03B5\u03C5", "\u03A4\u03C1\u03B9", "\u03A4\u03B5\u03C4", "\u03A0\u03B5\u03BC", "\u03A0\u03B1\u03C1", "\u03A3\u03B1\u03B2" ], [ "\u039A\u03C5\u03C1\u03B9\u03B1\u03BA\u03AE", "\u0394\u03B5\u03C5\u03C4\u03AD\u03C1\u03B1", "\u03A4\u03C1\u03AF\u03C4\u03B7", "\u03A4\u03B5\u03C4\u03AC\u03C1\u03C4\u03B7", "\u03A0\u03AD\u03BC\u03C0\u03C4\u03B7", "\u03A0\u03B1\u03C1\u03B1\u03C3\u03BA\u03B5\u03C5\u03AE", "\u03A3\u03AC\u03B2\u03B2\u03B1\u03C4\u03BF" ], [ "\u0399\u03B1\u03BD", "\u03A6\u03B5\u03B2", "\u039C\u03B1\u03C1", "\u0391\u03C0\u03C1", "\u039C\u03B1\u03CA", "\u0399\u03BF\u03C5\u03BD", "\u0399\u03BF\u03C5\u03BB", "\u0391\u03C5\u03B3", "\u03A3\u03B5\u03C0", "\u039F\u03BA\u03C4", "\u039D\u03BF\u03B5", "\u0394\u03B5\u03BA", "" ], [ "\u0399\u03B1\u03BD\u03BF\u03C5\u03AC\u03C1\u03B9\u03BF\u03C2", "\u03A6\u03B5\u03B2\u03C1\u03BF\u03C5\u03AC\u03C1\u03B9\u03BF\u03C2", "\u039C\u03AC\u03C1\u03C4\u03B9\u03BF\u03C2", "\u0391\u03C0\u03C1\u03AF\u03BB\u03B9\u03BF\u03C2", "\u039C\u03AC\u03B9\u03BF\u03C2", "\u0399\u03BF\u03CD\u03BD\u03B9\u03BF\u03C2", "\u0399\u03BF\u03CD\u03BB\u03B9\u03BF\u03C2", "\u0391\u03CD\u03B3\u03BF\u03C5\u03C3\u03C4\u03BF\u03C2", "\u03A3\u03B5\u03C0\u03C4\u03AD\u03BC\u03B2\u03C1\u03B9\u03BF\u03C2", "\u039F\u03BA\u03C4\u03CE\u03B2\u03C1\u03B9\u03BF\u03C2", "\u039D\u03BF\u03AD\u03BC\u03B2\u03C1\u03B9\u03BF\u03C2", "\u0394\u03B5\u03BA\u03AD\u03BC\u03B2\u03C1\u03B9\u03BF\u03C2", "" ] }, +{ 0x0409, 0x0009, "en-US", "en", "eng", "en-US", "\u0045\u006E\u0067\u006C\u0069\u0073\u0068\u0020\u0028\u0055\u006E\u0069\u0074\u0065\u0064\u0020\u0053\u0074\u0061\u0074\u0065\u0073\u0029", "\u0045\u006E\u0067\u006C\u0069\u0073\u0068\u0020\u0028\u0055\u006E\u0069\u0074\u0065\u0064\u0020\u0053\u0074\u0061\u0074\u0065\u0073\u0029", false, 0x00F4, "US", "USA", "\u0055\u006E\u0069\u0074\u0065\u0064\u0020\u0053\u0074\u0061\u0074\u0065\u0073", "\u0055\u006E\u0069\u0074\u0065\u0064\u0020\u0053\u0074\u0061\u0074\u0065\u0073", "\u0055\u0053\u0044", "\u0055\u0053\u0020\u0044\u006F\u006C\u006C\u0061\u0072", "\u0055\u0053\u0020\u0044\u006F\u006C\u006C\u0061\u0072", false, 2, 1, 2, 0, 0, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0024", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1, 2 ], "\u0047\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0020\u0043\u0061\u006C\u0065\u006E\u0064\u0061\u0072", 0, 0, "\u002F", "\u003A", "\u0041\u004D", "\u0050\u004D", "\u004D\u002F\u0064\u002F\u0079\u0079\u0079\u0079", "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0064\u0064\u002C\u0020\u004D\u004D\u004D\u004D\u0020\u0064\u0064\u002C\u0020\u0079\u0079\u0079\u0079", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u004D\u002F\u0064\u002F\u0079\u0079\u0079\u0079", "\u004D\u002F\u0064\u002F\u0079\u0079", "\u004D\u004D\u002F\u0064\u0064\u002F\u0079\u0079", "\u004D\u004D\u002F\u0064\u0064\u002F\u0079\u0079\u0079\u0079", "\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0064\u0064\u002D\u004D\u004D\u004D\u002D\u0079\u0079" ], [ "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u004D\u004D\u004D\u004D\u0020\u0064\u0064\u002C\u0020\u0079\u0079\u0079\u0079", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0053\u0075\u006E", "\u004D\u006F\u006E", "\u0054\u0075\u0065", "\u0057\u0065\u0064", "\u0054\u0068\u0075", "\u0046\u0072\u0069", "\u0053\u0061\u0074" ], [ "\u0053\u0075\u006E\u0064\u0061\u0079", "\u004D\u006F\u006E\u0064\u0061\u0079", "\u0054\u0075\u0065\u0073\u0064\u0061\u0079", "\u0057\u0065\u0064\u006E\u0065\u0073\u0064\u0061\u0079", "\u0054\u0068\u0075\u0072\u0073\u0064\u0061\u0079", "\u0046\u0072\u0069\u0064\u0061\u0079", "\u0053\u0061\u0074\u0075\u0072\u0064\u0061\u0079" ], [ "\u004A\u0061\u006E", "\u0046\u0065\u0062", "\u004D\u0061\u0072", "\u0041\u0070\u0072", "\u004D\u0061\u0079", "\u004A\u0075\u006E", "\u004A\u0075\u006C", "\u0041\u0075\u0067", "\u0053\u0065\u0070", "\u004F\u0063\u0074", "\u004E\u006F\u0076", "\u0044\u0065\u0063", "" ], [ "\u004A\u0061\u006E\u0075\u0061\u0072\u0079", "\u0046\u0065\u0062\u0072\u0075\u0061\u0072\u0079", "\u004D\u0061\u0072\u0063\u0068", "\u0041\u0070\u0072\u0069\u006C", "\u004D\u0061\u0079", "\u004A\u0075\u006E\u0065", "\u004A\u0075\u006C\u0079", "\u0041\u0075\u0067\u0075\u0073\u0074", "\u0053\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u004F\u0063\u0074\u006F\u0062\u0065\u0072", "\u004E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0044\u0065\u0063\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x040B, 0x000B, "fi-FI", "fi", "fin", "fi-FI", "\u0046\u0069\u006E\u006E\u0069\u0073\u0068\u0020\u0028\u0046\u0069\u006E\u006C\u0061\u006E\u0064\u0029", "\u0073\u0075\u006F\u006D\u0069\u0020\u0028\u0053\u0075\u006F\u006D\u0069\u0029", false, 0x004D, "FI", "FIN", "\u0046\u0069\u006E\u006C\u0061\u006E\u0064", "\u0053\u0075\u006F\u006D\u0069", "\u0045\u0055\u0052", "\u0045\u0075\u0072\u006F", "\u0065\u0075\u0072\u006F", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002C", "\u00A0", "\u20AC", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u004E\u0046", "\u0049\u004E\u0046", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u0061\u006E\u0069\u006E\u0065\u006E\u0020\u006B\u0061\u006C\u0065\u006E\u0074\u0065\u0072\u0069", 1, 2, "\u002E", "\u003A", "", "", "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\'\u0074\u0061\u0020\'\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\'\u0074\u0061\'", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D" ], [ "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\'\u0074\u0061\u0020\'\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u0020\u004D\u004D\u004D\u004D\'\u0074\u0061\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0073\u0075", "\u006D\u0061", "\u0074\u0069", "\u006B\u0065", "\u0074\u006F", "\u0070\u0065", "\u006C\u0061" ], [ "\u0073\u0075\u006E\u006E\u0075\u006E\u0074\u0061\u0069", "\u006D\u0061\u0061\u006E\u0061\u006E\u0074\u0061\u0069", "\u0074\u0069\u0069\u0073\u0074\u0061\u0069", "\u006B\u0065\u0073\u006B\u0069\u0076\u0069\u0069\u006B\u006B\u006F", "\u0074\u006F\u0072\u0073\u0074\u0061\u0069", "\u0070\u0065\u0072\u006A\u0061\u006E\u0074\u0061\u0069", "\u006C\u0061\u0075\u0061\u006E\u0074\u0061\u0069" ], [ "\u0074\u0061\u006D\u006D\u0069", "\u0068\u0065\u006C\u006D\u0069", "\u006D\u0061\u0061\u006C\u0069\u0073", "\u0068\u0075\u0068\u0074\u0069", "\u0074\u006F\u0075\u006B\u006F", "\u006B\u0065\u0073\u00E4", "\u0068\u0065\u0069\u006E\u00E4", "\u0065\u006C\u006F", "\u0073\u0079\u0079\u0073", "\u006C\u006F\u006B\u0061", "\u006D\u0061\u0072\u0072\u0061\u0073", "\u006A\u006F\u0075\u006C\u0075", "" ], [ "\u0074\u0061\u006D\u006D\u0069\u006B\u0075\u0075", "\u0068\u0065\u006C\u006D\u0069\u006B\u0075\u0075", "\u006D\u0061\u0061\u006C\u0069\u0073\u006B\u0075\u0075", "\u0068\u0075\u0068\u0074\u0069\u006B\u0075\u0075", "\u0074\u006F\u0075\u006B\u006F\u006B\u0075\u0075", "\u006B\u0065\u0073\u00E4\u006B\u0075\u0075", "\u0068\u0065\u0069\u006E\u00E4\u006B\u0075\u0075", "\u0065\u006C\u006F\u006B\u0075\u0075", "\u0073\u0079\u0079\u0073\u006B\u0075\u0075", "\u006C\u006F\u006B\u0061\u006B\u0075\u0075", "\u006D\u0061\u0072\u0072\u0061\u0073\u006B\u0075\u0075", "\u006A\u006F\u0075\u006C\u0075\u006B\u0075\u0075", "" ] }, +{ 0x040C, 0x000C, "fr-FR", "fr", "fra", "fr-FR", "\u0046\u0072\u0065\u006E\u0063\u0068\u0020\u0028\u0046\u0072\u0061\u006E\u0063\u0065\u0029", "\u0066\u0072\u0061\u006E\u00E7\u0061\u0069\u0073\u0020\u0028\u0046\u0072\u0061\u006E\u0063\u0065\u0029", false, 0x0054, "FR", "FRA", "\u0046\u0072\u0061\u006E\u0063\u0065", "\u0046\u0072\u0061\u006E\u0063\u0065", "\u0045\u0055\u0052", "\u0045\u0075\u0072\u006F", "\u0065\u0075\u0072\u006F", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002C", "\u00A0", "\u20AC", "\u002D", "\u002B", "\u004E\u006F\u006E\u0020\u004E\u0075\u006D\u00E9\u0072\u0069\u0071\u0075\u0065", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069", "\u002B\u0049\u006E\u0066\u0069\u006E\u0069", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0063\u0061\u006C\u0065\u006E\u0064\u0072\u0069\u0065\u0072\u0020\u0067\u0072\u00E9\u0067\u006F\u0072\u0069\u0065\u006E", 1, 0, "\u002F", "\u003A", "", "", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D", "\u0064\u0064\u0064\u0064\u0020\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D", "\u0048\u0048\u002E\u006D\u006D", "\u0048\u0048\'\u0020\u0068\u0020\'\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u002E\u006D\u006D", "\u0048\u0048\'\u0020\u0068\u0020\'\u006D\u006D" ], [ "\u0064\u0064\u0064\u0064\u0020\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0020\u004D\u004D\u004D\u0020\u0079\u0079", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0064\u0069\u006D\u002E", "\u006C\u0075\u006E\u002E", "\u006D\u0061\u0072\u002E", "\u006D\u0065\u0072\u002E", "\u006A\u0065\u0075\u002E", "\u0076\u0065\u006E\u002E", "\u0073\u0061\u006D\u002E" ], [ "\u0064\u0069\u006D\u0061\u006E\u0063\u0068\u0065", "\u006C\u0075\u006E\u0064\u0069", "\u006D\u0061\u0072\u0064\u0069", "\u006D\u0065\u0072\u0063\u0072\u0065\u0064\u0069", "\u006A\u0065\u0075\u0064\u0069", "\u0076\u0065\u006E\u0064\u0072\u0065\u0064\u0069", "\u0073\u0061\u006D\u0065\u0064\u0069" ], [ "\u006A\u0061\u006E\u0076\u002E", "\u0066\u00E9\u0076\u0072\u002E", "\u006D\u0061\u0072\u0073", "\u0061\u0076\u0072\u002E", "\u006D\u0061\u0069", "\u006A\u0075\u0069\u006E", "\u006A\u0075\u0069\u006C\u002E", "\u0061\u006F\u00FB\u0074", "\u0073\u0065\u0070\u0074\u002E", "\u006F\u0063\u0074\u002E", "\u006E\u006F\u0076\u002E", "\u0064\u00E9\u0063\u002E", "" ], [ "\u006A\u0061\u006E\u0076\u0069\u0065\u0072", "\u0066\u00E9\u0076\u0072\u0069\u0065\u0072", "\u006D\u0061\u0072\u0073", "\u0061\u0076\u0072\u0069\u006C", "\u006D\u0061\u0069", "\u006A\u0075\u0069\u006E", "\u006A\u0075\u0069\u006C\u006C\u0065\u0074", "\u0061\u006F\u00FB\u0074", "\u0073\u0065\u0070\u0074\u0065\u006D\u0062\u0072\u0065", "\u006F\u0063\u0074\u006F\u0062\u0072\u0065", "\u006E\u006F\u0076\u0065\u006D\u0062\u0072\u0065", "\u0064\u00E9\u0063\u0065\u006D\u0062\u0072\u0065", "" ] }, +{ 0x040D, 0x000D, "he-IL", "he", "heb", "he-IL", "\u0048\u0065\u0062\u0072\u0065\u0077\u0020\u0028\u0049\u0073\u0072\u0061\u0065\u006C\u0029", "\u05E2\u05D1\u05E8\u05D9\u05EA\u0020\u0028\u05D9\u05E9\u05E8\u05D0\u05DC\u0029", false, 0x0075, "IL", "ISR", "\u0049\u0073\u0072\u0061\u0065\u006C", "\u05D9\u05E9\u05E8\u05D0\u05DC", "\u0049\u004C\u0053", "\u0049\u0073\u0072\u0061\u0065\u006C\u0069\u0020\u004E\u0065\u0077\u0020\u0053\u0068\u0065\u006B\u0065\u006C", "\u05E9\u05E7\u05DC\u0020\u05D7\u05D3\u05E9", true, 2, 1, 2, 2, 2, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u20AA", "\u002D", "\u002B", "\u05DC\u05D0\u0020\u05DE\u05E1\u05E4\u05E8", "\u05D0\u05D9\u05E0\u05E1\u05D5\u05E3\u00A0\u05E9\u05DC\u05D9\u05DC\u05D9", "\u05D0\u05D9\u05E0\u05E1\u05D5\u05E3\u00A0\u05D7\u05D9\u05D5\u05D1\u05D9", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1, 8 ], "\u05DC\u05D5\u05D7\u00A0\u05E9\u05E0\u05D4\u00A0\u05D2\u05E8\u05D2\u05D5\u05E8\u05D9\u05D0\u05E0\u05D9", 0, 0, "\u002F", "\u003A", "\u0041\u004D", "\u0050\u004D", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D", "\u0064\u0064\u0064\u0064\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0064\u0064\u0020\u05D1\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0020\u004D\u004D\u004D\u0020\u0079\u0079" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074" ], [ "\u0064\u0064\u0064\u0064\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u0020\u0064\u0064\u0020\u05D1\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0020\u0064\u0064\u0020\u05D1\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0020\u05D1\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u05D9\u05D5\u05DD\u00A0\u05D0", "\u05D9\u05D5\u05DD\u00A0\u05D1", "\u05D9\u05D5\u05DD\u00A0\u05D2", "\u05D9\u05D5\u05DD\u00A0\u05D3", "\u05D9\u05D5\u05DD\u00A0\u05D4", "\u05D9\u05D5\u05DD\u00A0\u05D5", "\u05E9\u05D1\u05EA" ], [ "\u05D9\u05D5\u05DD\u00A0\u05E8\u05D0\u05E9\u05D5\u05DF", "\u05D9\u05D5\u05DD\u00A0\u05E9\u05E0\u05D9", "\u05D9\u05D5\u05DD\u00A0\u05E9\u05DC\u05D9\u05E9\u05D9", "\u05D9\u05D5\u05DD\u00A0\u05E8\u05D1\u05D9\u05E2\u05D9", "\u05D9\u05D5\u05DD\u00A0\u05D7\u05DE\u05D9\u05E9\u05D9", "\u05D9\u05D5\u05DD\u00A0\u05E9\u05D9\u05E9\u05D9", "\u05E9\u05D1\u05EA" ], [ "\u05D9\u05E0\u05D5", "\u05E4\u05D1\u05E8", "\u05DE\u05E8\u05E5", "\u05D0\u05E4\u05E8", "\u05DE\u05D0\u05D9", "\u05D9\u05D5\u05E0", "\u05D9\u05D5\u05DC", "\u05D0\u05D5\u05D2", "\u05E1\u05E4\u05D8", "\u05D0\u05D5\u05E7", "\u05E0\u05D5\u05D1", "\u05D3\u05E6\u05DE", "" ], [ "\u05D9\u05E0\u05D5\u05D0\u05E8", "\u05E4\u05D1\u05E8\u05D5\u05D0\u05E8", "\u05DE\u05E8\u05E5", "\u05D0\u05E4\u05E8\u05D9\u05DC", "\u05DE\u05D0\u05D9", "\u05D9\u05D5\u05E0\u05D9", "\u05D9\u05D5\u05DC\u05D9", "\u05D0\u05D5\u05D2\u05D5\u05E1\u05D8", "\u05E1\u05E4\u05D8\u05DE\u05D1\u05E8", "\u05D0\u05D5\u05E7\u05D8\u05D5\u05D1\u05E8", "\u05E0\u05D5\u05D1\u05DE\u05D1\u05E8", "\u05D3\u05E6\u05DE\u05D1\u05E8", "" ] }, +{ 0x040E, 0x000E, "hu-HU", "hu", "hun", "hu-HU", "\u0048\u0075\u006E\u0067\u0061\u0072\u0069\u0061\u006E\u0020\u0028\u0048\u0075\u006E\u0067\u0061\u0072\u0079\u0029", "\u006D\u0061\u0067\u0079\u0061\u0072\u0020\u0028\u004D\u0061\u0067\u0079\u0061\u0072\u006F\u0072\u0073\u007A\u00E1\u0067\u0029", false, 0x006D, "HU", "HUN", "\u0048\u0075\u006E\u0067\u0061\u0072\u0079", "\u004D\u0061\u0067\u0079\u0061\u0072\u006F\u0072\u0073\u007A\u00E1\u0067", "\u0048\u0055\u0046", "\u0048\u0075\u006E\u0067\u0061\u0072\u0069\u0061\u006E\u0020\u0046\u006F\u0072\u0069\u006E\u0074", "\u0066\u006F\u0072\u0069\u006E\u0074", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002C", "\u00A0", "\u0046\u0074", "\u002D", "\u002B", "\u006E\u0065\u006D\u0020\u0073\u007A\u00E1\u006D", "\u006E\u0065\u0067\u0061\u0074\u00ED\u0076\u0020\u0076\u00E9\u0067\u0074\u0065\u006C\u0065\u006E", "\u0076\u00E9\u0067\u0074\u0065\u006C\u0065\u006E", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0047\u0065\u0072\u0067\u0065\u006C\u0079\u002D\u006E\u0061\u0070\u0074\u00E1\u0072", 1, 0, "\u002E\u0020", "\u003A", "\u0064\u0065\u002E", "\u0064\u0075\u002E", "\u0079\u0079\u0079\u0079\u002E\u0020\u004D\u004D\u002E\u0020\u0064\u0064\u002E", "\u0048\u003A\u006D\u006D", "\u0079\u0079\u0079\u0079\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0064\u002E", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u004D\u004D\u004D\u004D\u0020\u0064\u002E", "\u0079\u0079\u0079\u0079\u002E\u0020\u004D\u004D\u004D\u004D", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D", "\u0068\u003A\u006D\u006D\u0020\u0074\u0074" ], [ "\u0079\u0079\u0079\u0079\u002E\u0020\u004D\u004D\u002E\u0020\u0064\u0064\u002E", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074" ], [ "\u0079\u0079\u0079\u0079\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0064\u002E" ], [ "\u0079\u0079\u0079\u0079\u002E\u0020\u004D\u004D\u004D\u004D" ], [ "\u0056", "\u0048", "\u004B", "\u0053\u007A\u0065", "\u0043\u0073", "\u0050", "\u0053\u007A\u006F" ], [ "\u0076\u0061\u0073\u00E1\u0072\u006E\u0061\u0070", "\u0068\u00E9\u0074\u0066\u0151", "\u006B\u0065\u0064\u0064", "\u0073\u007A\u0065\u0072\u0064\u0061", "\u0063\u0073\u00FC\u0074\u00F6\u0072\u0074\u00F6\u006B", "\u0070\u00E9\u006E\u0074\u0065\u006B", "\u0073\u007A\u006F\u006D\u0062\u0061\u0074" ], [ "\u006A\u0061\u006E\u002E", "\u0066\u0065\u0062\u0072\u002E", "\u006D\u00E1\u0072\u0063\u002E", "\u00E1\u0070\u0072\u002E", "\u006D\u00E1\u006A\u002E", "\u006A\u00FA\u006E\u002E", "\u006A\u00FA\u006C\u002E", "\u0061\u0075\u0067\u002E", "\u0073\u007A\u0065\u0070\u0074\u002E", "\u006F\u006B\u0074\u002E", "\u006E\u006F\u0076\u002E", "\u0064\u0065\u0063\u002E", "" ], [ "\u006A\u0061\u006E\u0075\u00E1\u0072", "\u0066\u0065\u0062\u0072\u0075\u00E1\u0072", "\u006D\u00E1\u0072\u0063\u0069\u0075\u0073", "\u00E1\u0070\u0072\u0069\u006C\u0069\u0073", "\u006D\u00E1\u006A\u0075\u0073", "\u006A\u00FA\u006E\u0069\u0075\u0073", "\u006A\u00FA\u006C\u0069\u0075\u0073", "\u0061\u0075\u0067\u0075\u0073\u007A\u0074\u0075\u0073", "\u0073\u007A\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u006F\u006B\u0074\u00F3\u0062\u0065\u0072", "\u006E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0064\u0065\u0063\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x040F, 0x000F, "is-IS", "is", "isl", "is-IS", "\u0049\u0063\u0065\u006C\u0061\u006E\u0064\u0069\u0063\u0020\u0028\u0049\u0063\u0065\u006C\u0061\u006E\u0064\u0029", "\u00ED\u0073\u006C\u0065\u006E\u0073\u006B\u0061\u0020\u0028\u00CD\u0073\u006C\u0061\u006E\u0064\u0029", false, 0x006E, "IS", "ISL", "\u0049\u0063\u0065\u006C\u0061\u006E\u0064", "\u00CD\u0073\u006C\u0061\u006E\u0064", "\u0049\u0053\u004B", "\u0049\u0063\u0065\u006C\u0061\u006E\u0064\u0069\u0063\u0020\u004B\u0072\u006F\u006E\u0061", "\u004B\u0072\u00F3\u006E\u0061", true, 2, 1, 0, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u006B\u0072\u002E", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u004E\u0046", "\u0049\u004E\u0046", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0067\u0072\u0065\u0067\u006F\u0072\u00ED\u0073\u006B\u0074\u0020\u0074\u00ED\u006D\u0061\u0074\u0061\u006C", 1, 2, "\u002E", "\u003A", "", "", "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D" ], [ "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u002E\u0020\u004D\u002E\u0020\u0079\u0079\u0079\u0079\u002E", "\u0064\u002E\u0020\u004D\u002E\u0020\'\u005C\'\'\u0079\u0079\u002E", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0079\u0079\u0020\u004D\u004D\u0020\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0073\u0075\u006E\u002E", "\u006D\u00E1\u006E\u002E", "\u00FE\u0072\u0069\u002E", "\u006D\u0069\u00F0\u002E", "\u0066\u0069\u006D\u002E", "\u0066\u00F6\u0073\u002E", "\u006C\u0061\u0075\u002E" ], [ "\u0073\u0075\u006E\u006E\u0075\u0064\u0061\u0067\u0075\u0072", "\u006D\u00E1\u006E\u0075\u0064\u0061\u0067\u0075\u0072", "\u00FE\u0072\u0069\u00F0\u006A\u0075\u0064\u0061\u0067\u0075\u0072", "\u006D\u0069\u00F0\u0076\u0069\u006B\u0075\u0064\u0061\u0067\u0075\u0072", "\u0066\u0069\u006D\u006D\u0074\u0075\u0064\u0061\u0067\u0075\u0072", "\u0066\u00F6\u0073\u0074\u0075\u0064\u0061\u0067\u0075\u0072", "\u006C\u0061\u0075\u0067\u0061\u0072\u0064\u0061\u0067\u0075\u0072" ], [ "\u006A\u0061\u006E\u002E", "\u0066\u0065\u0062\u002E", "\u006D\u0061\u0072\u002E", "\u0061\u0070\u0072\u002E", "\u006D\u0061\u00ED", "\u006A\u00FA\u006E\u002E", "\u006A\u00FA\u006C\u002E", "\u00E1\u0067\u00FA\u002E", "\u0073\u0065\u0070\u002E", "\u006F\u006B\u0074\u002E", "\u006E\u00F3\u0076\u002E", "\u0064\u0065\u0073\u002E", "" ], [ "\u006A\u0061\u006E\u00FA\u0061\u0072", "\u0066\u0065\u0062\u0072\u00FA\u0061\u0072", "\u006D\u0061\u0072\u0073", "\u0061\u0070\u0072\u00ED\u006C", "\u006D\u0061\u00ED", "\u006A\u00FA\u006E\u00ED", "\u006A\u00FA\u006C\u00ED", "\u00E1\u0067\u00FA\u0073\u0074", "\u0073\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u006F\u006B\u0074\u00F3\u0062\u0065\u0072", "\u006E\u00F3\u0076\u0065\u006D\u0062\u0065\u0072", "\u0064\u0065\u0073\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x0410, 0x0010, "it-IT", "it", "ita", "it-IT", "\u0049\u0074\u0061\u006C\u0069\u0061\u006E\u0020\u0028\u0049\u0074\u0061\u006C\u0079\u0029", "\u0069\u0074\u0061\u006C\u0069\u0061\u006E\u006F\u0020\u0028\u0049\u0074\u0061\u006C\u0069\u0061\u0029", false, 0x0076, "IT", "ITA", "\u0049\u0074\u0061\u006C\u0079", "\u0049\u0074\u0061\u006C\u0069\u0061", "\u0045\u0055\u0052", "\u0045\u0075\u0072\u006F", "\u0065\u0075\u0072\u006F", true, 2, 1, 2, 9, 2, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u20AC", "\u002D", "\u002B", "\u004E\u006F\u006E\u0020\u0075\u006E\u0020\u006E\u0075\u006D\u0065\u0072\u006F\u0020\u0072\u0065\u0061\u006C\u0065", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", "\u002B\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0063\u0061\u006C\u0065\u006E\u0064\u0061\u0072\u0069\u006F\u0020\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u006F", 1, 2, "\u002F", "\u002E", "", "", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0048\u002E\u006D\u006D", "\u0064\u0064\u0064\u0064\u0020\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u002E\u006D\u006D\u002E\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u002E\u006D\u006D", "\u0048\u0048\u002E\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u0064\u002E\u004D\u002E\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u002E\u006D\u006D\u002E\u0073\u0073", "\u0048\u0048\u002E\u006D\u006D\u002E\u0073\u0073", "\u0048\u002E\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u0064\u0064\u0020\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u002D\u004D\u004D\u004D\u002D\u0079\u0079", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0064\u006F\u006D", "\u006C\u0075\u006E", "\u006D\u0061\u0072", "\u006D\u0065\u0072", "\u0067\u0069\u006F", "\u0076\u0065\u006E", "\u0073\u0061\u0062" ], [ "\u0064\u006F\u006D\u0065\u006E\u0069\u0063\u0061", "\u006C\u0075\u006E\u0065\u0064\u00EC", "\u006D\u0061\u0072\u0074\u0065\u0064\u00EC", "\u006D\u0065\u0072\u0063\u006F\u006C\u0065\u0064\u00EC", "\u0067\u0069\u006F\u0076\u0065\u0064\u00EC", "\u0076\u0065\u006E\u0065\u0072\u0064\u00EC", "\u0073\u0061\u0062\u0061\u0074\u006F" ], [ "\u0067\u0065\u006E", "\u0066\u0065\u0062", "\u006D\u0061\u0072", "\u0061\u0070\u0072", "\u006D\u0061\u0067", "\u0067\u0069\u0075", "\u006C\u0075\u0067", "\u0061\u0067\u006F", "\u0073\u0065\u0074", "\u006F\u0074\u0074", "\u006E\u006F\u0076", "\u0064\u0069\u0063", "" ], [ "\u0067\u0065\u006E\u006E\u0061\u0069\u006F", "\u0066\u0065\u0062\u0062\u0072\u0061\u0069\u006F", "\u006D\u0061\u0072\u007A\u006F", "\u0061\u0070\u0072\u0069\u006C\u0065", "\u006D\u0061\u0067\u0067\u0069\u006F", "\u0067\u0069\u0075\u0067\u006E\u006F", "\u006C\u0075\u0067\u006C\u0069\u006F", "\u0061\u0067\u006F\u0073\u0074\u006F", "\u0073\u0065\u0074\u0074\u0065\u006D\u0062\u0072\u0065", "\u006F\u0074\u0074\u006F\u0062\u0072\u0065", "\u006E\u006F\u0076\u0065\u006D\u0062\u0072\u0065", "\u0064\u0069\u0063\u0065\u006D\u0062\u0072\u0065", "" ] }, +{ 0x0411, 0x0011, "ja-JP", "ja", "jpn", "ja-JP", "\u004A\u0061\u0070\u0061\u006E\u0065\u0073\u0065\u0020\u0028\u004A\u0061\u0070\u0061\u006E\u0029", "\u65E5\u672C\u8A9E\u0020\u0028\u65E5\u672C\u0029", false, 0x007A, "JP", "JPN", "\u004A\u0061\u0070\u0061\u006E", "\u65E5\u672C", "\u004A\u0050\u0059", "\u004A\u0061\u0070\u0061\u006E\u0065\u0073\u0065\u0020\u0059\u0065\u006E", "\u5186", true, 2, 1, 0, 1, 0, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u00A5", "\u002D", "\u002B", "\u004E\u0061\u004E\u0020\u0028\u975E\u6570\u5024\u0029", "\u002D\u221E", "\u002B\u221E", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1, 3, 2 ], "\u897F\u66A6\u0020\u0028\u65E5\u672C\u8A9E\u0029", 0, 0, "\u002F", "\u003A", "\u5348\u524D", "\u5348\u5F8C", "\u0079\u0079\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0048\u003A\u006D\u006D", "\u0079\u0079\u0079\u0079\'\u5E74\'\u004D\'\u6708\'\u0064\'\u65E5\'", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u004D\'\u6708\'\u0064\'\u65E5\'", "\u0079\u0079\u0079\u0079\'\u5E74\'\u004D\'\u6708\'", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D", "\u0074\u0074\u0020\u0068\u003A\u006D\u006D", "\u0074\u0074\u0020\u0068\u0068\u003A\u006D\u006D" ], [ "\u0079\u0079\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0079\u0079\u002F\u004D\u002F\u0064", "\u0079\u0079\u0079\u0079\u002F\u004D\u002F\u0064", "\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064\'\u0020\u0028\'\u0064\u0064\u0064\'\u0029\'", "\u0079\u0079\u002F\u004D\u002F\u0064\'\u0020\u0028\'\u0064\u0064\u0064\'\u0029\'", "\u0079\u0079\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064\'\u0020\u0028\'\u0064\u0064\u0064\'\u0029\'", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0074\u0074\u0020\u0068\u003A\u006D\u006D\u003A\u0073\u0073", "\u0074\u0074\u0020\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0079\u0079\u0079\u0079\'\u5E74\'\u004D\'\u6708\'\u0064\'\u65E5\'", "\u0079\u0079\u0079\u0079\'\u5E74\'\u004D\u004D\'\u6708\'\u0064\u0064\'\u65E5\'", "\u0079\u0079\u0079\u0079\'\u5E74\'\u004D\'\u6708\'\u0064\'\u65E5\'\u0020\u0064\u0064\u0064\u0064", "\u0079\u0079\u0079\u0079\'\u5E74\'\u004D\u004D\'\u6708\'\u0064\u0064\'\u65E5\'\u0020\u0064\u0064\u0064\u0064" ], [ "\u0079\u0079\u0079\u0079\'\u5E74\'\u004D\'\u6708\'" ], [ "\u65E5", "\u6708", "\u706B", "\u6C34", "\u6728", "\u91D1", "\u571F" ], [ "\u65E5\u66DC\u65E5", "\u6708\u66DC\u65E5", "\u706B\u66DC\u65E5", "\u6C34\u66DC\u65E5", "\u6728\u66DC\u65E5", "\u91D1\u66DC\u65E5", "\u571F\u66DC\u65E5" ], [ "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039", "\u0031\u0030", "\u0031\u0031", "\u0031\u0032", "" ], [ "\u0031\u6708", "\u0032\u6708", "\u0033\u6708", "\u0034\u6708", "\u0035\u6708", "\u0036\u6708", "\u0037\u6708", "\u0038\u6708", "\u0039\u6708", "\u0031\u0030\u6708", "\u0031\u0031\u6708", "\u0031\u0032\u6708", "" ] }, +{ 0x0412, 0x0012, "ko-KR", "ko", "kor", "ko-KR", "\u004B\u006F\u0072\u0065\u0061\u006E\u0020\u0028\u004B\u006F\u0072\u0065\u0061\u0029", "\uD55C\uAD6D\uC5B4\u0020\u0028\uB300\uD55C\uBBFC\uAD6D\u0029", false, 0x0086, "KR", "KOR", "\u004B\u006F\u0072\u0065\u0061", "\uB300\uD55C\uBBFC\uAD6D", "\u004B\u0052\u0057", "\u004B\u006F\u0072\u0065\u0061\u006E\u0020\u0057\u006F\u006E", "\uC6D0", true, 2, 1, 0, 1, 0, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u20A9", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1, 5, 2 ], "\uC11C\uAE30\u0020\u0028\uD55C\uAE00\u0029", 0, 0, "\u002D", "\u003A", "\uC624\uC804", "\uC624\uD6C4", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0074\u0074\u0020\u0068\u003A\u006D\u006D", "\u0079\u0079\u0079\u0079\'\uB144\'\u0020\u004D\'\uC6D4\'\u0020\u0064\'\uC77C\'\u0020\u0064\u0064\u0064\u0064", "\u0074\u0074\u0020\u0068\u003A\u006D\u006D\u003A\u0073\u0073", "\u004D\'\uC6D4\'\u0020\u0064\'\uC77C\'", "\u0079\u0079\u0079\u0079\'\uB144\'\u0020\u004D\'\uC6D4\'", [ "\u0074\u0074\u0020\u0068\u003A\u006D\u006D", "\u0074\u0074\u0020\u0068\u0068\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0079\u0079\u002D\u004D\u002D\u0064", "\u0079\u0079\u0079\u0079\u002D\u004D\u002D\u0064" ], [ "\u0074\u0074\u0020\u0068\u003A\u006D\u006D\u003A\u0073\u0073", "\u0074\u0074\u0020\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0079\u0079\u0079\u0079\'\uB144\'\u0020\u004D\'\uC6D4\'\u0020\u0064\'\uC77C\'\u0020\u0064\u0064\u0064\u0064", "\u0079\u0079\u0079\u0079\'\uB144\'\u0020\u004D\'\uC6D4\'\u0020\u0064\'\uC77C\'", "\u0079\u0079\'\uB144\'\u0020\u004D\'\uC6D4\'\u0020\u0064\'\uC77C\'\u0020\u0064\u0064\u0064\u0064", "\u0079\u0079\'\uB144\'\u0020\u004D\'\uC6D4\'\u0020\u0064\'\uC77C\'", "\u0079\u0079\u0079\u0079\'\uB144\'\u0020\u004D\u004D\'\uC6D4\'\u0020\u0064\u0064\'\uC77C\'\u0020\u0064\u0064\u0064\u0064", "\u0079\u0079\u0079\u0079\'\uB144\'\u0020\u004D\u004D\'\uC6D4\'\u0020\u0064\u0064\'\uC77C\'" ], [ "\u0079\u0079\u0079\u0079\'\uB144\'\u0020\u004D\'\uC6D4\'" ], [ "\uC77C", "\uC6D4", "\uD654", "\uC218", "\uBAA9", "\uAE08", "\uD1A0" ], [ "\uC77C\uC694\uC77C", "\uC6D4\uC694\uC77C", "\uD654\uC694\uC77C", "\uC218\uC694\uC77C", "\uBAA9\uC694\uC77C", "\uAE08\uC694\uC77C", "\uD1A0\uC694\uC77C" ], [ "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039", "\u0031\u0030", "\u0031\u0031", "\u0031\u0032", "" ], [ "\u0031\uC6D4", "\u0032\uC6D4", "\u0033\uC6D4", "\u0034\uC6D4", "\u0035\uC6D4", "\u0036\uC6D4", "\u0037\uC6D4", "\u0038\uC6D4", "\u0039\uC6D4", "\u0031\u0030\uC6D4", "\u0031\u0031\uC6D4", "\u0031\u0032\uC6D4", "" ] }, +{ 0x0413, 0x0013, "nl-NL", "nl", "nld", "nl-NL", "\u0044\u0075\u0074\u0063\u0068\u0020\u0028\u004E\u0065\u0074\u0068\u0065\u0072\u006C\u0061\u006E\u0064\u0073\u0029", "\u004E\u0065\u0064\u0065\u0072\u006C\u0061\u006E\u0064\u0073\u0020\u0028\u004E\u0065\u0064\u0065\u0072\u006C\u0061\u006E\u0064\u0029", false, 0x00B0, "NL", "NLD", "\u004E\u0065\u0074\u0068\u0065\u0072\u006C\u0061\u006E\u0064\u0073", "\u004E\u0065\u0064\u0065\u0072\u006C\u0061\u006E\u0064", "\u0045\u0055\u0052", "\u0045\u0075\u0072\u006F", "\u0065\u0075\u0072\u006F", true, 2, 1, 2, 12, 2, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u20AC", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0047\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u0061\u006E\u0073\u0065\u0020\u006B\u0061\u006C\u0065\u006E\u0064\u0065\u0072", 1, 2, "\u002D", "\u003A", "", "", "\u0064\u002D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\u0064\u0064\u0064\u0020\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D", "\u0048\u002E\u006D\u006D", "\u0048\u0048\u002E\u006D\u006D\'\u0020\u0075\u0075\u0072\'", "\u0048\u0048\u003A\u006D\u006D\'\u0020\u0075\u0075\u0072\'" ], [ "\u0064\u002D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0064\u002D\u004D\u002D\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D", "\u0048\u002E\u006D\u006D", "\u0048\u0048\u002E\u006D\u006D\u002E\u0073\u0073\'\u0020\u0075\u0075\u0072\'", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073\'\u0020\u0075\u0075\u0072\'" ], [ "\u0064\u0064\u0064\u0064\u0020\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u002D\u004D\u004D\u004D\u002D\u0079\u0079", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0020\u004D\u004D\u004D\u0020\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u007A\u006F", "\u006D\u0061", "\u0064\u0069", "\u0077\u006F", "\u0064\u006F", "\u0076\u0072", "\u007A\u0061" ], [ "\u007A\u006F\u006E\u0064\u0061\u0067", "\u006D\u0061\u0061\u006E\u0064\u0061\u0067", "\u0064\u0069\u006E\u0073\u0064\u0061\u0067", "\u0077\u006F\u0065\u006E\u0073\u0064\u0061\u0067", "\u0064\u006F\u006E\u0064\u0065\u0072\u0064\u0061\u0067", "\u0076\u0072\u0069\u006A\u0064\u0061\u0067", "\u007A\u0061\u0074\u0065\u0072\u0064\u0061\u0067" ], [ "\u006A\u0061\u006E", "\u0066\u0065\u0062", "\u006D\u0072\u0074", "\u0061\u0070\u0072", "\u006D\u0065\u0069", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0075\u0067", "\u0073\u0065\u0070", "\u006F\u006B\u0074", "\u006E\u006F\u0076", "\u0064\u0065\u0063", "" ], [ "\u006A\u0061\u006E\u0075\u0061\u0072\u0069", "\u0066\u0065\u0062\u0072\u0075\u0061\u0072\u0069", "\u006D\u0061\u0061\u0072\u0074", "\u0061\u0070\u0072\u0069\u006C", "\u006D\u0065\u0069", "\u006A\u0075\u006E\u0069", "\u006A\u0075\u006C\u0069", "\u0061\u0075\u0067\u0075\u0073\u0074\u0075\u0073", "\u0073\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u006F\u006B\u0074\u006F\u0062\u0065\u0072", "\u006E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0064\u0065\u0063\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x0414, 0x0014, "nb-NO", "nb", "nob", "nb-NO", "\u004E\u006F\u0072\u0077\u0065\u0067\u0069\u0061\u006E\u002C\u0020\u0042\u006F\u006B\u006D\u00E5\u006C\u0020\u0028\u004E\u006F\u0072\u0077\u0061\u0079\u0029", "\u006E\u006F\u0072\u0073\u006B\u002C\u0020\u0062\u006F\u006B\u006D\u00E5\u006C\u0020\u0028\u004E\u006F\u0072\u0067\u0065\u0029", false, 0x00B1, "NO", "NOR", "\u004E\u006F\u0072\u0077\u0061\u0079", "\u004E\u006F\u0072\u0067\u0065", "\u004E\u004F\u004B", "\u004E\u006F\u0072\u0077\u0065\u0067\u0069\u0061\u006E\u0020\u004B\u0072\u006F\u006E\u0065", "\u004E\u006F\u0072\u0073\u006B\u0020\u006B\u0072\u006F\u006E\u0065", true, 2, 1, 2, 12, 2, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002C", "\u00A0", "\u006B\u0072", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u004E\u0046", "\u0049\u004E\u0046", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0073\u006B\u0020\u006B\u0061\u006C\u0065\u006E\u0064\u0065\u0072", 1, 2, "\u002E", "\u003A", "", "", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D", "\'\u006B\u006C\u0020\'\u0048\u0048\u002E\u006D\u006D", "\u0048\u0048\u002E\u006D\u006D" ], [ "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\'\u006B\u006C\u0020\'\u0048\u0048\u002E\u006D\u006D", "\u0048\u0048\u002E\u006D\u006D\u002E\u0073\u0073" ], [ "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0073\u00F8", "\u006D\u0061", "\u0074\u0069", "\u006F\u006E", "\u0074\u006F", "\u0066\u0072", "\u006C\u00F8" ], [ "\u0073\u00F8\u006E\u0064\u0061\u0067", "\u006D\u0061\u006E\u0064\u0061\u0067", "\u0074\u0069\u0072\u0073\u0064\u0061\u0067", "\u006F\u006E\u0073\u0064\u0061\u0067", "\u0074\u006F\u0072\u0073\u0064\u0061\u0067", "\u0066\u0072\u0065\u0064\u0061\u0067", "\u006C\u00F8\u0072\u0064\u0061\u0067" ], [ "\u006A\u0061\u006E", "\u0066\u0065\u0062", "\u006D\u0061\u0072", "\u0061\u0070\u0072", "\u006D\u0061\u0069", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0075\u0067", "\u0073\u0065\u0070", "\u006F\u006B\u0074", "\u006E\u006F\u0076", "\u0064\u0065\u0073", "" ], [ "\u006A\u0061\u006E\u0075\u0061\u0072", "\u0066\u0065\u0062\u0072\u0075\u0061\u0072", "\u006D\u0061\u0072\u0073", "\u0061\u0070\u0072\u0069\u006C", "\u006D\u0061\u0069", "\u006A\u0075\u006E\u0069", "\u006A\u0075\u006C\u0069", "\u0061\u0075\u0067\u0075\u0073\u0074", "\u0073\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u006F\u006B\u0074\u006F\u0062\u0065\u0072", "\u006E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0064\u0065\u0073\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x0415, 0x0015, "pl-PL", "pl", "pol", "pl-PL", "\u0050\u006F\u006C\u0069\u0073\u0068\u0020\u0028\u0050\u006F\u006C\u0061\u006E\u0064\u0029", "\u0070\u006F\u006C\u0073\u006B\u0069\u0020\u0028\u0050\u006F\u006C\u0073\u006B\u0061\u0029", false, 0x00BF, "PL", "POL", "\u0050\u006F\u006C\u0061\u006E\u0064", "\u0050\u006F\u006C\u0073\u006B\u0061", "\u0050\u004C\u004E", "\u0050\u006F\u006C\u0069\u0073\u0068\u0020\u005A\u006C\u006F\u0074\u0079", "\u005A\u0142\u006F\u0074\u0079", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002C", "\u00A0", "\u007A\u0142", "\u002D", "\u002B", "\u006E\u0069\u0065\u0020\u006A\u0065\u0073\u0074\u0020\u006C\u0069\u0063\u007A\u0062\u0105", "\u002D\u006E\u0069\u0065\u0073\u006B\u006F\u0144\u0063\u007A\u006F\u006E\u006F\u015B\u0107", "\u002B\u006E\u0069\u0065\u0073\u006B\u006F\u0144\u0063\u007A\u006F\u006E\u006F\u015B\u0107", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u004B\u0061\u006C\u0065\u006E\u0064\u0061\u0072\u007A\u0020\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u0144\u0073\u006B\u0069", 1, 2, "\u002D", "\u003A", "", "", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0048\u0048\u003A\u006D\u006D", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D" ], [ "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004E", "\u0050\u006E", "\u0057\u0074", "\u015A\u0072", "\u0043\u007A", "\u0050\u0074", "\u0053\u006F" ], [ "\u006E\u0069\u0065\u0064\u007A\u0069\u0065\u006C\u0061", "\u0070\u006F\u006E\u0069\u0065\u0064\u007A\u0069\u0061\u0142\u0065\u006B", "\u0077\u0074\u006F\u0072\u0065\u006B", "\u015B\u0072\u006F\u0064\u0061", "\u0063\u007A\u0077\u0061\u0072\u0074\u0065\u006B", "\u0070\u0069\u0105\u0074\u0065\u006B", "\u0073\u006F\u0062\u006F\u0074\u0061" ], [ "\u0073\u0074\u0079", "\u006C\u0075\u0074", "\u006D\u0061\u0072", "\u006B\u0077\u0069", "\u006D\u0061\u006A", "\u0063\u007A\u0065", "\u006C\u0069\u0070", "\u0073\u0069\u0065", "\u0077\u0072\u007A", "\u0070\u0061\u017A", "\u006C\u0069\u0073", "\u0067\u0072\u0075", "" ], [ "\u0073\u0074\u0079\u0063\u007A\u0065\u0144", "\u006C\u0075\u0074\u0079", "\u006D\u0061\u0072\u007A\u0065\u0063", "\u006B\u0077\u0069\u0065\u0063\u0069\u0065\u0144", "\u006D\u0061\u006A", "\u0063\u007A\u0065\u0072\u0077\u0069\u0065\u0063", "\u006C\u0069\u0070\u0069\u0065\u0063", "\u0073\u0069\u0065\u0072\u0070\u0069\u0065\u0144", "\u0077\u0072\u007A\u0065\u0073\u0069\u0065\u0144", "\u0070\u0061\u017A\u0064\u007A\u0069\u0065\u0072\u006E\u0069\u006B", "\u006C\u0069\u0073\u0074\u006F\u0070\u0061\u0064", "\u0067\u0072\u0075\u0064\u007A\u0069\u0065\u0144", "" ] }, +{ 0x0416, 0x0016, "pt-BR", "pt", "por", "pt-BR", "\u0050\u006F\u0072\u0074\u0075\u0067\u0075\u0065\u0073\u0065\u0020\u0028\u0042\u0072\u0061\u007A\u0069\u006C\u0029", "\u0050\u006F\u0072\u0074\u0075\u0067\u0075\u00EA\u0073\u0020\u0028\u0042\u0072\u0061\u0073\u0069\u006C\u0029", false, 0x0020, "BR", "BRA", "\u0042\u0072\u0061\u007A\u0069\u006C", "\u0042\u0072\u0061\u0073\u0069\u006C", "\u0042\u0052\u004C", "\u0052\u0065\u0061\u006C", "\u0052\u0065\u0061\u006C", true, 2, 1, 2, 9, 2, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u0052\u0024", "\u002D", "\u002B", "\u004E\u0061\u004E\u0020\u0028\u004E\u00E3\u006F\u0020\u00E9\u0020\u0075\u006D\u0020\u006E\u00FA\u006D\u0065\u0072\u006F\u0029", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", "\u002B\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0043\u0061\u006C\u0065\u006E\u0064\u00E1\u0072\u0069\u006F\u0020\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u006F", 0, 0, "\u002F", "\u003A", "", "", "\u0064\u002F\u004D\u002F\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u002F\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u002D\u004D\u002D\u0079\u0079", "\u0064\u002D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0079\u0079\u0079\u0079\u002E\u004D\u004D\u002E\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u0064\u006F\u006D", "\u0073\u0065\u0067", "\u0074\u0065\u0072", "\u0071\u0075\u0061", "\u0071\u0075\u0069", "\u0073\u0065\u0078", "\u0073\u00E1\u0062" ], [ "\u0064\u006F\u006D\u0069\u006E\u0067\u006F", "\u0073\u0065\u0067\u0075\u006E\u0064\u0061\u002D\u0066\u0065\u0069\u0072\u0061", "\u0074\u0065\u0072\u00E7\u0061\u002D\u0066\u0065\u0069\u0072\u0061", "\u0071\u0075\u0061\u0072\u0074\u0061\u002D\u0066\u0065\u0069\u0072\u0061", "\u0071\u0075\u0069\u006E\u0074\u0061\u002D\u0066\u0065\u0069\u0072\u0061", "\u0073\u0065\u0078\u0074\u0061\u002D\u0066\u0065\u0069\u0072\u0061", "\u0073\u00E1\u0062\u0061\u0064\u006F" ], [ "\u006A\u0061\u006E", "\u0066\u0065\u0076", "\u006D\u0061\u0072", "\u0061\u0062\u0072", "\u006D\u0061\u0069", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0067\u006F", "\u0073\u0065\u0074", "\u006F\u0075\u0074", "\u006E\u006F\u0076", "\u0064\u0065\u007A", "" ], [ "\u006A\u0061\u006E\u0065\u0069\u0072\u006F", "\u0066\u0065\u0076\u0065\u0072\u0065\u0069\u0072\u006F", "\u006D\u0061\u0072\u00E7\u006F", "\u0061\u0062\u0072\u0069\u006C", "\u006D\u0061\u0069\u006F", "\u006A\u0075\u006E\u0068\u006F", "\u006A\u0075\u006C\u0068\u006F", "\u0061\u0067\u006F\u0073\u0074\u006F", "\u0073\u0065\u0074\u0065\u006D\u0062\u0072\u006F", "\u006F\u0075\u0074\u0075\u0062\u0072\u006F", "\u006E\u006F\u0076\u0065\u006D\u0062\u0072\u006F", "\u0064\u0065\u007A\u0065\u006D\u0062\u0072\u006F", "" ] }, +{ 0x0418, 0x0018, "ro-RO", "ro", "ron", "ro-RO", "\u0052\u006F\u006D\u0061\u006E\u0069\u0061\u006E\u0020\u0028\u0052\u006F\u006D\u0061\u006E\u0069\u0061\u0029", "\u0072\u006F\u006D\u00E2\u006E\u0103\u0020\u0028\u0052\u006F\u006D\u00E2\u006E\u0069\u0061\u0029", false, 0x00C8, "RO", "ROU", "\u0052\u006F\u006D\u0061\u006E\u0069\u0061", "\u0052\u006F\u006D\u00E2\u006E\u0069\u0061", "\u0052\u004F\u004C", "\u0052\u006F\u006D\u0061\u006E\u0069\u0061\u006E\u0020\u004C\u0065\u0075", "\u004C\u0065\u0075", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u006C\u0065\u0069", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0063\u0061\u006C\u0065\u006E\u0064\u0061\u0072\u0020\u0047\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E", 1, 0, "\u002E", "\u003A", "", "", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0044", "\u004C", "\u004D\u0061", "\u004D\u0069", "\u004A", "\u0056", "\u0053" ], [ "\u0064\u0075\u006D\u0069\u006E\u0069\u0063\u0103", "\u006C\u0075\u006E\u0069", "\u006D\u0061\u0072\u0163\u0069", "\u006D\u0069\u0065\u0072\u0063\u0075\u0072\u0069", "\u006A\u006F\u0069", "\u0076\u0069\u006E\u0065\u0072\u0069", "\u0073\u00E2\u006D\u0062\u0103\u0074\u0103" ], [ "\u0069\u0061\u006E\u002E", "\u0066\u0065\u0062\u002E", "\u006D\u0061\u0072\u002E", "\u0061\u0070\u0072\u002E", "\u006D\u0061\u0069\u002E", "\u0069\u0075\u006E\u002E", "\u0069\u0075\u006C\u002E", "\u0061\u0075\u0067\u002E", "\u0073\u0065\u0070\u002E", "\u006F\u0063\u0074\u002E", "\u006E\u006F\u0076\u002E", "\u0064\u0065\u0063\u002E", "" ], [ "\u0069\u0061\u006E\u0075\u0061\u0072\u0069\u0065", "\u0066\u0065\u0062\u0072\u0075\u0061\u0072\u0069\u0065", "\u006D\u0061\u0072\u0074\u0069\u0065", "\u0061\u0070\u0072\u0069\u006C\u0069\u0065", "\u006D\u0061\u0069", "\u0069\u0075\u006E\u0069\u0065", "\u0069\u0075\u006C\u0069\u0065", "\u0061\u0075\u0067\u0075\u0073\u0074", "\u0073\u0065\u0070\u0074\u0065\u006D\u0062\u0072\u0069\u0065", "\u006F\u0063\u0074\u006F\u006D\u0062\u0072\u0069\u0065", "\u006E\u006F\u0069\u0065\u006D\u0062\u0072\u0069\u0065", "\u0064\u0065\u0063\u0065\u006D\u0062\u0072\u0069\u0065", "" ] }, +{ 0x0419, 0x0019, "ru-RU", "ru", "rus", "ru-RU", "\u0052\u0075\u0073\u0073\u0069\u0061\u006E\u0020\u0028\u0052\u0075\u0073\u0073\u0069\u0061\u0029", "\u0440\u0443\u0441\u0441\u043A\u0438\u0439\u0020\u0028\u0420\u043E\u0441\u0441\u0438\u044F\u0029", false, 0x00CB, "RU", "RUS", "\u0052\u0075\u0073\u0073\u0069\u0061", "\u0420\u043E\u0441\u0441\u0438\u044F", "\u0052\u0055\u0052", "\u0052\u0075\u0073\u0073\u0069\u0061\u006E\u0020\u0052\u0075\u0062\u006C\u0065", "\u0440\u0443\u0431\u043B\u044C", true, 2, 1, 2, 5, 1, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002C", "\u00A0", "\u0440\u002E", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0431\u0435\u0441\u043A\u043E\u043D\u0435\u0447\u043D\u043E\u0441\u0442\u044C", "\u0431\u0435\u0441\u043A\u043E\u043D\u0435\u0447\u043D\u043E\u0441\u0442\u044C", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0433\u0440\u0438\u0433\u043E\u0440\u0438\u0430\u043D\u0441\u043A\u0438\u0439\u0020\u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u044C", 1, 0, "\u002E", "\u003A", "", "", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079\u0020\'\u0433\u002E\'", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079\u0020\'\u0433\u002E\'", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079\u0020\'\u0433\u002E\'", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079\u0020\'\u0433\u002E\'" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079\u0020\'\u0433\u002E\'" ], [ "\u0412\u0441", "\u041F\u043D", "\u0412\u0442", "\u0421\u0440", "\u0427\u0442", "\u041F\u0442", "\u0421\u0431" ], [ "\u0432\u043E\u0441\u043A\u0440\u0435\u0441\u0435\u043D\u044C\u0435", "\u043F\u043E\u043D\u0435\u0434\u0435\u043B\u044C\u043D\u0438\u043A", "\u0432\u0442\u043E\u0440\u043D\u0438\u043A", "\u0441\u0440\u0435\u0434\u0430", "\u0447\u0435\u0442\u0432\u0435\u0440\u0433", "\u043F\u044F\u0442\u043D\u0438\u0446\u0430", "\u0441\u0443\u0431\u0431\u043E\u0442\u0430" ], [ "\u044F\u043D\u0432", "\u0444\u0435\u0432", "\u043C\u0430\u0440", "\u0430\u043F\u0440", "\u043C\u0430\u0439", "\u0438\u044E\u043D", "\u0438\u044E\u043B", "\u0430\u0432\u0433", "\u0441\u0435\u043D", "\u043E\u043A\u0442", "\u043D\u043E\u044F", "\u0434\u0435\u043A", "" ], [ "\u042F\u043D\u0432\u0430\u0440\u044C", "\u0424\u0435\u0432\u0440\u0430\u043B\u044C", "\u041C\u0430\u0440\u0442", "\u0410\u043F\u0440\u0435\u043B\u044C", "\u041C\u0430\u0439", "\u0418\u044E\u043D\u044C", "\u0418\u044E\u043B\u044C", "\u0410\u0432\u0433\u0443\u0441\u0442", "\u0421\u0435\u043D\u0442\u044F\u0431\u0440\u044C", "\u041E\u043A\u0442\u044F\u0431\u0440\u044C", "\u041D\u043E\u044F\u0431\u0440\u044C", "\u0414\u0435\u043A\u0430\u0431\u0440\u044C", "" ] }, +{ 0x041A, 0x001A, "hr-HR", "hr", "hrv", "hr-HR", "\u0043\u0072\u006F\u0061\u0074\u0069\u0061\u006E\u0020\u0028\u0043\u0072\u006F\u0061\u0074\u0069\u0061\u0029", "\u0068\u0072\u0076\u0061\u0074\u0073\u006B\u0069\u0020\u0028\u0048\u0072\u0076\u0061\u0074\u0073\u006B\u0061\u0029", false, 0x006C, "HR", "HRV", "\u0043\u0072\u006F\u0061\u0074\u0069\u0061", "\u0048\u0072\u0076\u0061\u0074\u0073\u006B\u0061", "\u0048\u0052\u004B", "\u0043\u0072\u006F\u0061\u0074\u0069\u0061\u006E\u0020\u004B\u0075\u006E\u0061", "\u0068\u0072\u0076\u0061\u0074\u0073\u006B\u0061\u0020\u006B\u0075\u006E\u0061", true, 2, 2, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u006B\u006E", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u006A\u0061\u006E\u0073\u006B\u0069\u0020\u006B\u0061\u006C\u0065\u006E\u0064\u0061\u0072", 1, 0, "\u002E", "\u003A", "", "", "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0064\u002E\u0020\u004D\u002E\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u002E\u0020\u004D\u002E\u0020\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u0064\u002E\u0020\u004D\u004D\u002E\u0020\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u006E\u0065\u0064", "\u0070\u006F\u006E", "\u0075\u0074\u006F", "\u0073\u0072\u0069", "\u010D\u0065\u0074", "\u0070\u0065\u0074", "\u0073\u0075\u0062" ], [ "\u006E\u0065\u0064\u006A\u0065\u006C\u006A\u0061", "\u0070\u006F\u006E\u0065\u0064\u006A\u0065\u006C\u006A\u0061\u006B", "\u0075\u0074\u006F\u0072\u0061\u006B", "\u0073\u0072\u0069\u006A\u0065\u0064\u0061", "\u010D\u0065\u0074\u0076\u0072\u0074\u0061\u006B", "\u0070\u0065\u0074\u0061\u006B", "\u0073\u0075\u0062\u006F\u0074\u0061" ], [ "\u0073\u0069\u006A", "\u0076\u006C\u006A", "\u006F\u017E\u0075", "\u0074\u0072\u0061", "\u0073\u0076\u0069", "\u006C\u0069\u0070", "\u0073\u0072\u0070", "\u006B\u006F\u006C", "\u0072\u0075\u006A", "\u006C\u0069\u0073", "\u0073\u0074\u0075", "\u0070\u0072\u006F", "" ], [ "\u0073\u0069\u006A\u0065\u010D\u0061\u006E\u006A", "\u0076\u0065\u006C\u006A\u0061\u010D\u0061", "\u006F\u017E\u0075\u006A\u0061\u006B", "\u0074\u0072\u0061\u0076\u0061\u006E\u006A", "\u0073\u0076\u0069\u0062\u0061\u006E\u006A", "\u006C\u0069\u0070\u0061\u006E\u006A", "\u0073\u0072\u0070\u0061\u006E\u006A", "\u006B\u006F\u006C\u006F\u0076\u006F\u007A", "\u0072\u0075\u006A\u0061\u006E", "\u006C\u0069\u0073\u0074\u006F\u0070\u0061\u0064", "\u0073\u0074\u0075\u0064\u0065\u006E\u0069", "\u0070\u0072\u006F\u0073\u0069\u006E\u0061\u0063", "" ] }, +{ 0x041B, 0x001B, "sk-SK", "sk", "slk", "sk-SK", "\u0053\u006C\u006F\u0076\u0061\u006B\u0020\u0028\u0053\u006C\u006F\u0076\u0061\u006B\u0069\u0061\u0029", "\u0073\u006C\u006F\u0076\u0065\u006E\u010D\u0069\u006E\u0061\u0020\u0028\u0053\u006C\u006F\u0076\u0065\u006E\u0073\u006B\u00E1\u0020\u0072\u0065\u0070\u0075\u0062\u006C\u0069\u006B\u0061\u0029", false, 0x008F, "SK", "SVK", "\u0053\u006C\u006F\u0076\u0061\u006B\u0069\u0061", "\u0053\u006C\u006F\u0076\u0065\u006E\u0073\u006B\u00E1\u0020\u0072\u0065\u0070\u0075\u0062\u006C\u0069\u006B\u0061", "\u0053\u004B\u004B", "\u0053\u006C\u006F\u0076\u0061\u006B\u0020\u004B\u006F\u0072\u0075\u006E\u0061", "\u0053\u006C\u006F\u0076\u0065\u006E\u0073\u006B\u00E1\u0020\u006B\u006F\u0072\u0075\u006E\u0061", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002C", "\u00A0", "\u0053\u006B", "\u002D", "\u002B", "\u004E\u0069\u0065\u0020\u006A\u0065\u0020\u010D\u00ED\u0073\u006C\u006F", "\u002D\u006E\u0065\u006B\u006F\u006E\u0065\u010D\u006E\u006F", "\u002B\u006E\u0065\u006B\u006F\u006E\u0065\u010D\u006E\u006F", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u00E1\u006E\u0073\u006B\u0079\u0020\u006B\u0061\u006C\u0065\u006E\u0064\u00E1\u0072", 1, 0, "\u002E\u0020", "\u003A", "", "", "\u0064\u002E\u0020\u004D\u002E\u0020\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D", "\u0048\u002E\u006D\u006D" ], [ "\u0064\u002E\u0020\u004D\u002E\u0020\u0079\u0079\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u002E\u0020\u004D\u002E\u0020\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u002E\u006D\u006D\u002E\u0073\u0073" ], [ "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u006E\u0065", "\u0070\u006F", "\u0075\u0074", "\u0073\u0074", "\u0161\u0074", "\u0070\u0069", "\u0073\u006F" ], [ "\u006E\u0065\u0064\u0065\u013E\u0061", "\u0070\u006F\u006E\u0064\u0065\u006C\u006F\u006B", "\u0075\u0074\u006F\u0072\u006F\u006B", "\u0073\u0074\u0072\u0065\u0064\u0061", "\u0161\u0074\u0076\u0072\u0074\u006F\u006B", "\u0070\u0069\u0061\u0074\u006F\u006B", "\u0073\u006F\u0062\u006F\u0074\u0061" ], [ "\u0049", "\u0049\u0049", "\u0049\u0049\u0049", "\u0049\u0056", "\u0056", "\u0056\u0049", "\u0056\u0049\u0049", "\u0056\u0049\u0049\u0049", "\u0049\u0058", "\u0058", "\u0058\u0049", "\u0058\u0049\u0049", "" ], [ "\u006A\u0061\u006E\u0075\u00E1\u0072", "\u0066\u0065\u0062\u0072\u0075\u00E1\u0072", "\u006D\u0061\u0072\u0065\u0063", "\u0061\u0070\u0072\u00ED\u006C", "\u006D\u00E1\u006A", "\u006A\u00FA\u006E", "\u006A\u00FA\u006C", "\u0061\u0075\u0067\u0075\u0073\u0074", "\u0073\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u006F\u006B\u0074\u00F3\u0062\u0065\u0072", "\u006E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0064\u0065\u0063\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x041C, 0x001C, "sq-AL", "sq", "sqi", "sq-AL", "\u0041\u006C\u0062\u0061\u006E\u0069\u0061\u006E\u0020\u0028\u0041\u006C\u0062\u0061\u006E\u0069\u0061\u0029", "\u0073\u0068\u0071\u0069\u0070\u0065\u0020\u0028\u0053\u0068\u0071\u0069\u0070\u00EB\u0072\u0069\u0061\u0029", false, 0x0006, "AL", "ALB", "\u0041\u006C\u0062\u0061\u006E\u0069\u0061", "\u0053\u0068\u0071\u0069\u0070\u00EB\u0072\u0069\u0061", "\u0041\u004C\u004C", "\u0041\u006C\u0062\u0061\u006E\u0069\u0061\u006E\u0020\u004C\u0065\u006B", "\u004C\u0065\u006B", true, 2, 1, 2, 5, 1, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u004C\u0065\u006B", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0047\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0020\u0043\u0061\u006C\u0065\u006E\u0064\u0061\u0072", 1, 0, "\u002D", "\u003A", "\u0050\u0044", "\u004D\u0044", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0068\u003A\u006D\u006D\u002E\u0074\u0074", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u002E\u0074\u0074", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D", [ "\u0068\u003A\u006D\u006D\u002E\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u002E\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0079\u0079\u0079\u0079\u002D\u004D\u004D" ], [ "\u0044\u0069\u0065", "\u0048\u00EB\u006E", "\u004D\u0061\u0072", "\u004D\u00EB\u0072", "\u0045\u006E\u006A", "\u0050\u0072\u0065", "\u0053\u0068\u0074" ], [ "\u0065\u0020\u0064\u0069\u0065\u006C", "\u0065\u0020\u0068\u00EB\u006E\u00EB", "\u0065\u0020\u006D\u0061\u0072\u0074\u00EB", "\u0065\u0020\u006D\u00EB\u0072\u006B\u0075\u0072\u00EB", "\u0065\u0020\u0065\u006E\u006A\u0074\u0065", "\u0065\u0020\u0070\u0072\u0065\u006D\u0074\u0065", "\u0065\u0020\u0073\u0068\u0074\u0075\u006E\u00EB" ], [ "\u004A\u0061\u006E", "\u0053\u0068\u006B", "\u004D\u0061\u0072", "\u0050\u0072\u0069", "\u004D\u0061\u006A", "\u0051\u0065\u0072", "\u004B\u006F\u0072", "\u0047\u0073\u0068", "\u0053\u0068\u0074", "\u0054\u0065\u0074", "\u004E\u00EB\u006E", "\u0044\u0068\u006A", "" ], [ "\u006A\u0061\u006E\u0061\u0072", "\u0073\u0068\u006B\u0075\u0072\u0074", "\u006D\u0061\u0072\u0073", "\u0070\u0072\u0069\u006C\u006C", "\u006D\u0061\u006A", "\u0071\u0065\u0072\u0073\u0068\u006F\u0072", "\u006B\u006F\u0072\u0072\u0069\u006B", "\u0067\u0075\u0073\u0068\u0074", "\u0073\u0068\u0074\u0061\u0074\u006F\u0072", "\u0074\u0065\u0074\u006F\u0072", "\u006E\u00EB\u006E\u0074\u006F\u0072", "\u0064\u0068\u006A\u0065\u0074\u006F\u0072", "" ] }, +{ 0x041D, 0x001D, "sv-SE", "sv", "swe", "sv-SE", "\u0053\u0077\u0065\u0064\u0069\u0073\u0068\u0020\u0028\u0053\u0077\u0065\u0064\u0065\u006E\u0029", "\u0073\u0076\u0065\u006E\u0073\u006B\u0061\u0020\u0028\u0053\u0076\u0065\u0072\u0069\u0067\u0065\u0029", false, 0x00DD, "SE", "SWE", "\u0053\u0077\u0065\u0064\u0065\u006E", "\u0053\u0076\u0065\u0072\u0069\u0067\u0065", "\u0053\u0045\u004B", "\u0053\u0077\u0065\u0064\u0069\u0073\u0068\u0020\u004B\u0072\u006F\u006E\u0061", "\u0053\u0076\u0065\u006E\u0073\u006B\u0020\u006B\u0072\u006F\u006E\u0061", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002C", "\u002E", "\u006B\u0072", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u004E\u0046", "\u0049\u004E\u0046", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0073\u006B\u0020\u006B\u0061\u006C\u0065\u006E\u0064\u0065\u0072", 1, 2, "\u002D", "\u003A", "", "", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0048\u0048\u003A\u006D\u006D", "\'\u0064\u0065\u006E\u0020\'\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\'\u0064\u0065\u006E\u0020\'\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D", "\'\u006B\u006C\u0020\'\u0048\u003A\u006D\u006D" ], [ "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\'\u006B\u006C\u0020\'\u0048\u003A\u006D\u006D" ], [ "\'\u0064\u0065\u006E\u0020\'\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0073\u00F6", "\u006D\u00E5", "\u0074\u0069", "\u006F\u006E", "\u0074\u006F", "\u0066\u0072", "\u006C\u00F6" ], [ "\u0073\u00F6\u006E\u0064\u0061\u0067", "\u006D\u00E5\u006E\u0064\u0061\u0067", "\u0074\u0069\u0073\u0064\u0061\u0067", "\u006F\u006E\u0073\u0064\u0061\u0067", "\u0074\u006F\u0072\u0073\u0064\u0061\u0067", "\u0066\u0072\u0065\u0064\u0061\u0067", "\u006C\u00F6\u0072\u0064\u0061\u0067" ], [ "\u006A\u0061\u006E", "\u0066\u0065\u0062", "\u006D\u0061\u0072", "\u0061\u0070\u0072", "\u006D\u0061\u006A", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0075\u0067", "\u0073\u0065\u0070", "\u006F\u006B\u0074", "\u006E\u006F\u0076", "\u0064\u0065\u0063", "" ], [ "\u006A\u0061\u006E\u0075\u0061\u0072\u0069", "\u0066\u0065\u0062\u0072\u0075\u0061\u0072\u0069", "\u006D\u0061\u0072\u0073", "\u0061\u0070\u0072\u0069\u006C", "\u006D\u0061\u006A", "\u006A\u0075\u006E\u0069", "\u006A\u0075\u006C\u0069", "\u0061\u0075\u0067\u0075\u0073\u0074\u0069", "\u0073\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u006F\u006B\u0074\u006F\u0062\u0065\u0072", "\u006E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0064\u0065\u0063\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x041E, 0x001E, "th-TH", "th", "tha", "th-TH", "\u0054\u0068\u0061\u0069\u0020\u0028\u0054\u0068\u0061\u0069\u006C\u0061\u006E\u0064\u0029", "\u0E44\u0E17\u0E22\u0020\u0028\u0E44\u0E17\u0E22\u0029", false, 0x00E3, "TH", "THA", "\u0054\u0068\u0061\u0069\u006C\u0061\u006E\u0064", "\u0E44\u0E17\u0E22", "\u0054\u0048\u0042", "\u0054\u0068\u0061\u0069\u0020\u0042\u0061\u0068\u0074", "\u0E1A\u0E32\u0E17", true, 2, 1, 2, 1, 0, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0E3F", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0E50", "\u0E51", "\u0E52", "\u0E53", "\u0E54", "\u0E55", "\u0E56", "\u0E57", "\u0E58", "\u0E59" ], 7, [ 7, 1 ], "\u0E1E\u0E38\u0E17\u0E18\u0E28\u0E31\u0E01\u0E23\u0E32\u0E0A", 1, 0, "\u002F", "\u003A", "\u0041\u004D", "\u0050\u004D", "\u0064\u002F\u004D\u002F\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D", "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074" ], [ "\u0064\u002F\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0020\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0020\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074" ], [ "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0020\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\'\u0E27\u0E31\u0E19\'\u0064\u0064\u0064\u0064\'\u0E17\u0E35\u0E48\'\u0020\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0067\u0067\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0E2D\u0E32\u002E", "\u0E08\u002E", "\u0E2D\u002E", "\u0E1E\u002E", "\u0E1E\u0E24\u002E", "\u0E28\u002E", "\u0E2A\u002E" ], [ "\u0E2D\u0E32\u0E17\u0E34\u0E15\u0E22\u0E4C", "\u0E08\u0E31\u0E19\u0E17\u0E23\u0E4C", "\u0E2D\u0E31\u0E07\u0E04\u0E32\u0E23", "\u0E1E\u0E38\u0E18", "\u0E1E\u0E24\u0E2B\u0E31\u0E2A\u0E1A\u0E14\u0E35", "\u0E28\u0E38\u0E01\u0E23\u0E4C", "\u0E40\u0E2A\u0E32\u0E23\u0E4C" ], [ "\u0E21\u002E\u0E04\u002E", "\u0E01\u002E\u0E1E\u002E", "\u0E21\u0E35\u002E\u0E04\u002E", "\u0E40\u0E21\u002E\u0E22\u002E", "\u0E1E\u002E\u0E04\u002E", "\u0E21\u0E34\u002E\u0E22\u002E", "\u0E01\u002E\u0E04\u002E", "\u0E2A\u002E\u0E04\u002E", "\u0E01\u002E\u0E22\u002E", "\u0E15\u002E\u0E04\u002E", "\u0E1E\u002E\u0E22\u002E", "\u0E18\u002E\u0E04\u002E", "" ], [ "\u0E21\u0E01\u0E23\u0E32\u0E04\u0E21", "\u0E01\u0E38\u0E21\u0E20\u0E32\u0E1E\u0E31\u0E19\u0E18\u0E4C", "\u0E21\u0E35\u0E19\u0E32\u0E04\u0E21", "\u0E40\u0E21\u0E29\u0E32\u0E22\u0E19", "\u0E1E\u0E24\u0E29\u0E20\u0E32\u0E04\u0E21", "\u0E21\u0E34\u0E16\u0E38\u0E19\u0E32\u0E22\u0E19", "\u0E01\u0E23\u0E01\u0E0E\u0E32\u0E04\u0E21", "\u0E2A\u0E34\u0E07\u0E2B\u0E32\u0E04\u0E21", "\u0E01\u0E31\u0E19\u0E22\u0E32\u0E22\u0E19", "\u0E15\u0E38\u0E25\u0E32\u0E04\u0E21", "\u0E1E\u0E24\u0E28\u0E08\u0E34\u0E01\u0E32\u0E22\u0E19", "\u0E18\u0E31\u0E19\u0E27\u0E32\u0E04\u0E21", "" ] }, +{ 0x041F, 0x001F, "tr-TR", "tr", "tur", "tr-TR", "\u0054\u0075\u0072\u006B\u0069\u0073\u0068\u0020\u0028\u0054\u0075\u0072\u006B\u0065\u0079\u0029", "\u0054\u00FC\u0072\u006B\u00E7\u0065\u0020\u0028\u0054\u00FC\u0072\u006B\u0069\u0079\u0065\u0029", false, 0x00EB, "TR", "TUR", "\u0054\u0075\u0072\u006B\u0065\u0079", "\u0054\u00FC\u0072\u006B\u0069\u0079\u0065", "\u0054\u0052\u0059", "\u004E\u0065\u0077\u0020\u0054\u0075\u0072\u006B\u0069\u0073\u0068\u0020\u004C\u0069\u0072\u0061", "\u0059\u0065\u006E\u0069\u0020\u0054\u00FC\u0072\u006B\u0020\u004C\u0069\u0072\u0061\u0073\u0131", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u0059\u0054\u004C", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0047\u0072\u0065\u0067\u006F\u0072\u0079\u0065\u006E\u0020\u0054\u0061\u006B\u0076\u0069\u006D\u0069", 1, 0, "\u002E", "\u003A", "", "", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079\u0020\u0064\u0064\u0064\u0064", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079\u0020\u0064\u0064\u0064\u0064", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0050\u0061\u007A", "\u0050\u007A\u0074", "\u0053\u0061\u006C", "\u00C7\u0061\u0072", "\u0050\u0065\u0072", "\u0043\u0075\u006D", "\u0043\u006D\u0074" ], [ "\u0050\u0061\u007A\u0061\u0072", "\u0050\u0061\u007A\u0061\u0072\u0074\u0065\u0073\u0069", "\u0053\u0061\u006C\u0131", "\u00C7\u0061\u0072\u015F\u0061\u006D\u0062\u0061", "\u0050\u0065\u0072\u015F\u0065\u006D\u0062\u0065", "\u0043\u0075\u006D\u0061", "\u0043\u0075\u006D\u0061\u0072\u0074\u0065\u0073\u0069" ], [ "\u004F\u0063\u0061", "\u015E\u0075\u0062", "\u004D\u0061\u0072", "\u004E\u0069\u0073", "\u004D\u0061\u0079", "\u0048\u0061\u007A", "\u0054\u0065\u006D", "\u0041\u011F\u0075", "\u0045\u0079\u006C", "\u0045\u006B\u0069", "\u004B\u0061\u0073", "\u0041\u0072\u0061", "" ], [ "\u004F\u0063\u0061\u006B", "\u015E\u0075\u0062\u0061\u0074", "\u004D\u0061\u0072\u0074", "\u004E\u0069\u0073\u0061\u006E", "\u004D\u0061\u0079\u0131\u0073", "\u0048\u0061\u007A\u0069\u0072\u0061\u006E", "\u0054\u0065\u006D\u006D\u0075\u007A", "\u0041\u011F\u0075\u0073\u0074\u006F\u0073", "\u0045\u0079\u006C\u00FC\u006C", "\u0045\u006B\u0069\u006D", "\u004B\u0061\u0073\u0131\u006D", "\u0041\u0072\u0061\u006C\u0131\u006B", "" ] }, +{ 0x0420, 0x0020, "ur-PK", "ur", "urd", "ur-PK", "\u0055\u0072\u0064\u0075\u0020\u0028\u0049\u0073\u006C\u0061\u006D\u0069\u0063\u0020\u0052\u0065\u0070\u0075\u0062\u006C\u0069\u0063\u0020\u006F\u0066\u0020\u0050\u0061\u006B\u0069\u0073\u0074\u0061\u006E\u0029", "\u0627\u064F\u0631\u062F\u0648\u0020\u0028\u067E\u0627\u06A9\u0633\u062A\u0627\u0646\u0029", false, 0x00BE, "PK", "PAK", "\u0049\u0073\u006C\u0061\u006D\u0069\u0063\u0020\u0052\u0065\u0070\u0075\u0062\u006C\u0069\u0063\u0020\u006F\u0066\u0020\u0050\u0061\u006B\u0069\u0073\u0074\u0061\u006E", "\u067E\u0627\u06A9\u0633\u062A\u0627\u0646", "\u0050\u004B\u0052", "\u0050\u0061\u006B\u0069\u0073\u0074\u0061\u006E\u0020\u0052\u0075\u0070\u0065\u0065", "\u0631\u0648\u067E\u064A\u0647", true, 2, 1, 2, 3, 0, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0052\u0073", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u06F0", "\u06F1", "\u06F2", "\u06F3", "\u06F4", "\u06F5", "\u06F6", "\u06F7", "\u06F8", "\u06F9" ], 1, [ 1, 2, 6 ], "\u0639\u064A\u0633\u0648\u0649\u00A0\u0633\u0627\u0644", 1, 1, "\u002F", "\u003A", "\u0041\u004D", "\u0050\u004D", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0627\u062A\u0648\u0627\u0631", "\u067E\u064A\u0631", "\u0645\u0646\u06AF\u0644", "\u0628\u062F\u06BE", "\u062C\u0645\u0639\u0631\u0627\u062A", "\u062C\u0645\u0639\u0647", "\u0647\u0641\u062A\u0647" ], [ "\u0627\u062A\u0648\u0627\u0631", "\u067E\u064A\u0631", "\u0645\u0646\u06AF\u0644", "\u0628\u062F\u06BE", "\u062C\u0645\u0639\u0631\u0627\u062A", "\u062C\u0645\u0639\u0647", "\u0647\u0641\u062A\u0647" ], [ "\u062C\u0646\u0648\u0631\u0649", "\u0641\u0631\u0648\u0631\u0649", "\u0645\u0627\u0631\u0686", "\u0627\u067E\u0631\u064A\u0644", "\u0645\u0626", "\u062C\u0648\u0646", "\u062C\u0648\u0644\u0627\u0678", "\u0627\u06AF\u0633\u062A", "\u0633\u062A\u0645\u0628\u0631", "\u0627\u06A9\u062A\u0648\u0628\u0631", "\u0646\u0648\u0645\u0628\u0631", "\u062F\u0633\u0645\u0628\u0631", "" ], [ "\u062C\u0646\u0648\u0631\u0649", "\u0641\u0631\u0648\u0631\u0649", "\u0645\u0627\u0631\u0686", "\u0627\u067E\u0631\u064A\u0644", "\u0645\u0626", "\u062C\u0648\u0646", "\u062C\u0648\u0644\u0627\u0678", "\u0627\u06AF\u0633\u062A", "\u0633\u062A\u0645\u0628\u0631", "\u0627\u06A9\u062A\u0648\u0628\u0631", "\u0646\u0648\u0645\u0628\u0631", "\u062F\u0633\u0645\u0628\u0631", "" ] }, +{ 0x0421, 0x0021, "id-ID", "id", "ind", "id-ID", "\u0049\u006E\u0064\u006F\u006E\u0065\u0073\u0069\u0061\u006E\u0020\u0028\u0049\u006E\u0064\u006F\u006E\u0065\u0073\u0069\u0061\u0029", "\u0042\u0061\u0068\u0061\u0073\u0061\u0020\u0049\u006E\u0064\u006F\u006E\u0065\u0073\u0069\u0061\u0020\u0028\u0049\u006E\u0064\u006F\u006E\u0065\u0073\u0069\u0061\u0029", false, 0x006F, "ID", "IDN", "\u0049\u006E\u0064\u006F\u006E\u0065\u0073\u0069\u0061", "\u0049\u006E\u0064\u006F\u006E\u0065\u0073\u0069\u0061", "\u0049\u0044\u0052", "\u0049\u006E\u0064\u006F\u006E\u0065\u0073\u0069\u0061\u006E\u0020\u0052\u0075\u0070\u0069\u0061\u0068", "\u0052\u0075\u0070\u0069\u0061\u0068", true, 2, 1, 0, 0, 0, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u0052\u0070", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u006B\u0061\u006C\u0065\u006E\u0064\u0061\u0072\u0020\u004D\u0061\u0073\u0065\u0068\u0069", 1, 0, "\u002F", "\u003A", "", "", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u0069\u006E\u0067\u0067\u0075", "\u0053\u0065\u006E", "\u0053\u0065\u006C", "\u0052\u0061\u0062\u0075", "\u004B\u0061\u006D\u0069\u0073", "\u004A\u0075\u006D\u0061\u0074", "\u0053\u0061\u0062\u0074\u0075" ], [ "\u004D\u0069\u006E\u0067\u0067\u0075", "\u0053\u0065\u006E\u0069\u006E", "\u0053\u0065\u006C\u0061\u0073\u0061", "\u0052\u0061\u0062\u0075", "\u004B\u0061\u006D\u0069\u0073", "\u004A\u0075\u006D\u0061\u0074", "\u0053\u0061\u0062\u0074\u0075" ], [ "\u004A\u0061\u006E", "\u0046\u0065\u0062", "\u004D\u0061\u0072", "\u0041\u0070\u0072", "\u004D\u0065\u0069", "\u004A\u0075\u006E", "\u004A\u0075\u006C", "\u0041\u0067\u0075\u0073\u0074", "\u0053\u0065\u0070", "\u004F\u006B\u0074", "\u004E\u006F\u0070", "\u0044\u0065\u0073", "" ], [ "\u004A\u0061\u006E\u0075\u0061\u0072\u0069", "\u0046\u0065\u0062\u0072\u0075\u0061\u0072\u0069", "\u004D\u0061\u0072\u0065\u0074", "\u0041\u0070\u0072\u0069\u006C", "\u004D\u0065\u0069", "\u004A\u0075\u006E\u0069", "\u004A\u0075\u006C\u0069", "\u0041\u0067\u0075\u0073\u0074\u0075\u0073", "\u0053\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u004F\u006B\u0074\u006F\u0062\u0065\u0072", "\u004E\u006F\u0070\u0065\u006D\u0062\u0065\u0072", "\u0044\u0065\u0073\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x0422, 0x0022, "uk-UA", "uk", "ukr", "uk-UA", "\u0055\u006B\u0072\u0061\u0069\u006E\u0069\u0061\u006E\u0020\u0028\u0055\u006B\u0072\u0061\u0069\u006E\u0065\u0029", "\u0443\u043A\u0440\u0430\u0457\u043D\u044C\u0441\u043A\u0430\u0020\u0028\u0423\u043A\u0440\u0430\u0457\u043D\u0430\u0029", false, 0x00F1, "UA", "UKR", "\u0055\u006B\u0072\u0061\u0069\u006E\u0065", "\u0423\u043A\u0440\u0430\u0457\u043D\u0430", "\u0055\u0041\u0048", "\u0055\u006B\u0072\u0061\u0069\u006E\u0069\u0061\u006E\u0020\u0047\u0072\u0069\u0076\u006E\u0061", "\u0433\u0440\u0438\u0432\u043D\u044F", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002C", "\u00A0", "\u0433\u0440\u043D\u002E", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0431\u0435\u0437\u043C\u0435\u0436\u043D\u0456\u0441\u0442\u044C", "\u0431\u0435\u0437\u043C\u0435\u0436\u043D\u0456\u0441\u0442\u044C", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0413\u0440\u0438\u0433\u043E\u0440\u0456\u0430\u043D\u044C\u0441\u043A\u0438\u0439\u0020\u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440", 1, 0, "\u002E", "\u003A", "", "", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079\'\u0020\u0440\u002E\'", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079\'\u0020\u0440\u002E\'", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079\'\u0020\u0440\u002E\'" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079\'\u0020\u0440\u002E\'" ], [ "\u041D\u0434", "\u041F\u043D", "\u0412\u0442", "\u0421\u0440", "\u0427\u0442", "\u041F\u0442", "\u0421\u0431" ], [ "\u043D\u0435\u0434\u0456\u043B\u044F", "\u043F\u043E\u043D\u0435\u0434\u0456\u043B\u043E\u043A", "\u0432\u0456\u0432\u0442\u043E\u0440\u043E\u043A", "\u0441\u0435\u0440\u0435\u0434\u0430", "\u0447\u0435\u0442\u0432\u0435\u0440", "\u043F\u0027\u044F\u0442\u043D\u0438\u0446\u044F", "\u0441\u0443\u0431\u043E\u0442\u0430" ], [ "\u0421\u0456\u0447", "\u041B\u044E\u0442", "\u0411\u0435\u0440", "\u041A\u0432\u0456", "\u0422\u0440\u0430", "\u0427\u0435\u0440", "\u041B\u0438\u043F", "\u0421\u0435\u0440", "\u0412\u0435\u0440", "\u0416\u043E\u0432", "\u041B\u0438\u0441", "\u0413\u0440\u0443", "" ], [ "\u0421\u0456\u0447\u0435\u043D\u044C", "\u041B\u044E\u0442\u0438\u0439", "\u0411\u0435\u0440\u0435\u0437\u0435\u043D\u044C", "\u041A\u0432\u0456\u0442\u0435\u043D\u044C", "\u0422\u0440\u0430\u0432\u0435\u043D\u044C", "\u0427\u0435\u0440\u0432\u0435\u043D\u044C", "\u041B\u0438\u043F\u0435\u043D\u044C", "\u0421\u0435\u0440\u043F\u0435\u043D\u044C", "\u0412\u0435\u0440\u0435\u0441\u0435\u043D\u044C", "\u0416\u043E\u0432\u0442\u0435\u043D\u044C", "\u041B\u0438\u0441\u0442\u043E\u043F\u0430\u0434", "\u0413\u0440\u0443\u0434\u0435\u043D\u044C", "" ] }, +{ 0x0423, 0x0023, "be-BY", "be", "bel", "be-BY", "\u0042\u0065\u006C\u0061\u0072\u0075\u0073\u0069\u0061\u006E\u0020\u0028\u0042\u0065\u006C\u0061\u0072\u0075\u0073\u0029", "\u0411\u0435\u043B\u0430\u0440\u0443\u0441\u043A\u0456\u0020\u0028\u0411\u0435\u043B\u0430\u0440\u0443\u0441\u044C\u0029", false, 0x001D, "BY", "BLR", "\u0042\u0065\u006C\u0061\u0072\u0075\u0073", "\u0411\u0435\u043B\u0430\u0440\u0443\u0441\u044C", "\u0042\u0059\u0042", "\u0042\u0065\u006C\u0061\u0072\u0075\u0073\u0069\u0061\u006E\u0020\u0052\u0075\u0062\u006C\u0065", "\u0440\u0443\u0431\u043B\u044C", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002C", "\u00A0", "\u0440\u002E", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0433\u0440\u0438\u0433\u043E\u0440\u0438\u0430\u043D\u0441\u043A\u0438\u0439\u0020\u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u044C", 1, 0, "\u002E", "\u003A", "", "", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u043D\u0434", "\u043F\u043D", "\u0430\u045E", "\u0441\u0440", "\u0447\u0446", "\u043F\u0442", "\u0441\u0431" ], [ "\u043D\u044F\u0434\u0437\u0435\u043B\u044F", "\u043F\u0430\u043D\u044F\u0434\u0437\u0435\u043B\u0430\u043A", "\u0430\u045E\u0442\u043E\u0440\u0430\u043A", "\u0441\u0435\u0440\u0430\u0434\u0430", "\u0447\u0430\u0446\u0432\u0435\u0440", "\u043F\u044F\u0442\u043D\u0456\u0446\u0430", "\u0441\u0443\u0431\u043E\u0442\u0430" ], [ "\u0421\u0442\u0443", "\u041B\u044E\u0442", "\u0421\u0430\u043A", "\u041A\u0440\u0430", "\u041C\u0430\u0439", "\u0427\u044D\u0440", "\u041B\u0456\u043F", "\u0416\u043D\u0456", "\u0412\u0435\u0440", "\u041A\u0430\u0441", "\u041B\u0456\u0441", "\u0421\u043D\u0435", "" ], [ "\u0421\u0442\u0443\u0434\u0437\u0435\u043D\u044C", "\u041B\u044E\u0442\u044B", "\u0421\u0430\u043A\u0430\u0432\u0456\u043A", "\u041A\u0440\u0430\u0441\u0430\u0432\u0456\u043A", "\u041C\u0430\u0439", "\u0427\u044D\u0440\u0432\u0435\u043D\u044C", "\u041B\u0456\u043F\u0435\u043D\u044C", "\u0416\u043D\u0456\u0432\u0435\u043D\u044C", "\u0412\u0435\u0440\u0430\u0441\u0435\u043D\u044C", "\u041A\u0430\u0441\u0442\u0440\u044B\u0447\u043D\u0456\u043A", "\u041B\u0456\u0441\u0442\u0430\u043F\u0430\u0434", "\u0421\u043D\u0435\u0436\u0430\u043D\u044C", "" ] }, +{ 0x0424, 0x0024, "sl-SI", "sl", "slv", "sl-SI", "\u0053\u006C\u006F\u0076\u0065\u006E\u0069\u0061\u006E\u0020\u0028\u0053\u006C\u006F\u0076\u0065\u006E\u0069\u0061\u0029", "\u0073\u006C\u006F\u0076\u0065\u006E\u0073\u006B\u0069\u0020\u0028\u0053\u006C\u006F\u0076\u0065\u006E\u0069\u006A\u0061\u0029", false, 0x00D4, "SI", "SVN", "\u0053\u006C\u006F\u0076\u0065\u006E\u0069\u0061", "\u0053\u006C\u006F\u0076\u0065\u006E\u0069\u006A\u0061", "\u0053\u0049\u0054", "\u0053\u006C\u006F\u0076\u0065\u006E\u0069\u0061\u006E\u0020\u0054\u006F\u006C\u0061\u0072", "\u0073\u006C\u006F\u0076\u0065\u006E\u0073\u006B\u0069\u0020\u0074\u006F\u006C\u0061\u0072", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u0053\u0049\u0054", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u006E\u0065\u0073\u006B\u006F\u006E\u010D\u006E\u006F\u0073\u0074", "\u006E\u0065\u0073\u006B\u006F\u006E\u010D\u006E\u006F\u0073\u0074", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u006A\u0061\u006E\u0073\u006B\u0069\u0020\u006B\u006F\u006C\u0065\u0064\u0061\u0072", 1, 0, "\u002E", "\u003A", "", "", "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0064\u002E\u0020\u004D\u002E\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u002E\u0020\u004D\u002E\u0020\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u0064\u002E\u0020\u004D\u004D\u002E\u0020\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u006E\u0065\u0064", "\u0070\u006F\u006E", "\u0074\u006F\u0072", "\u0073\u0072\u0065", "\u010D\u0065\u0074", "\u0070\u0065\u0074", "\u0073\u006F\u0062" ], [ "\u006E\u0065\u0064\u0065\u006C\u006A\u0061", "\u0070\u006F\u006E\u0065\u0064\u0065\u006C\u006A\u0065\u006B", "\u0074\u006F\u0072\u0065\u006B", "\u0073\u0072\u0065\u0064\u0061", "\u010D\u0065\u0074\u0072\u0074\u0065\u006B", "\u0070\u0065\u0074\u0065\u006B", "\u0073\u006F\u0062\u006F\u0074\u0061" ], [ "\u006A\u0061\u006E", "\u0066\u0065\u0062", "\u006D\u0061\u0072", "\u0061\u0070\u0072", "\u006D\u0061\u006A", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0076\u0067", "\u0073\u0065\u0070", "\u006F\u006B\u0074", "\u006E\u006F\u0076", "\u0064\u0065\u0063", "" ], [ "\u006A\u0061\u006E\u0075\u0061\u0072", "\u0066\u0065\u0062\u0072\u0075\u0061\u0072", "\u006D\u0061\u0072\u0065\u0063", "\u0061\u0070\u0072\u0069\u006C", "\u006D\u0061\u006A", "\u006A\u0075\u006E\u0069\u006A", "\u006A\u0075\u006C\u0069\u006A", "\u0061\u0076\u0067\u0075\u0073\u0074", "\u0073\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u006F\u006B\u0074\u006F\u0062\u0065\u0072", "\u006E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0064\u0065\u0063\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x0425, 0x0025, "et-EE", "et", "est", "et-EE", "\u0045\u0073\u0074\u006F\u006E\u0069\u0061\u006E\u0020\u0028\u0045\u0073\u0074\u006F\u006E\u0069\u0061\u0029", "\u0065\u0065\u0073\u0074\u0069\u0020\u0028\u0045\u0065\u0073\u0074\u0069\u0029", false, 0x0046, "EE", "EST", "\u0045\u0073\u0074\u006F\u006E\u0069\u0061", "\u0045\u0065\u0073\u0074\u0069", "\u0045\u0045\u004B", "\u0045\u0073\u0074\u006F\u006E\u0069\u0061\u006E\u0020\u004B\u0072\u006F\u006F\u006E", "\u004B\u0072\u006F\u006F\u006E", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002E", "\u00A0", "\u006B\u0072", "\u002D", "\u002B", "\u0061\u0076\u0061\u006C\u0064\u0061\u006D\u0061\u0074\u0075", "\u006D\u0069\u0069\u006E\u0075\u0073\u006C\u00F5\u0070\u006D\u0061\u0074\u0075\u0073", "\u0070\u006C\u0075\u0073\u0073\u006C\u00F5\u0070\u006D\u0061\u0074\u0075\u0073", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0047\u0072\u0065\u0067\u006F\u0072\u0069\u0075\u0073\u0065\u0020\u006B\u0061\u006C\u0065\u006E\u0064\u0065\u0072", 1, 2, "\u002E", "\u003A", "\u0045\u004C", "\u0050\u004C", "\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079\'\u002E\u0020\u0061\u002E\'", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079\'\u002E\u0020\u0061\u002E\'", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079\'\u002E\u0020\u0061\u002E\'", "\u0064\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079\'\u002E\u0020\u0061\u002E\'", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079\'\u002E\u0020\u0061\u002E\'" ], [ "\u0050", "\u0045", "\u0054", "\u004B", "\u004E", "\u0052", "\u004C" ], [ "\u0070\u00FC\u0068\u0061\u0070\u00E4\u0065\u0076", "\u0065\u0073\u006D\u0061\u0073\u0070\u00E4\u0065\u0076", "\u0074\u0065\u0069\u0073\u0069\u0070\u00E4\u0065\u0076", "\u006B\u006F\u006C\u006D\u0061\u0070\u00E4\u0065\u0076", "\u006E\u0065\u006C\u006A\u0061\u0070\u00E4\u0065\u0076", "\u0072\u0065\u0065\u0064\u0065", "\u006C\u0061\u0075\u0070\u00E4\u0065\u0076" ], [ "\u006A\u0061\u0061\u006E", "\u0076\u0065\u0065\u0062\u0072", "\u006D\u00E4\u0072\u0074\u0073", "\u0061\u0070\u0072", "\u006D\u0061\u0069", "\u006A\u0075\u0075\u006E\u0069", "\u006A\u0075\u0075\u006C\u0069", "\u0061\u0075\u0067", "\u0073\u0065\u0070\u0074", "\u006F\u006B\u0074", "\u006E\u006F\u0076", "\u0064\u0065\u0074\u0073", "" ], [ "\u006A\u0061\u0061\u006E\u0075\u0061\u0072", "\u0076\u0065\u0065\u0062\u0072\u0075\u0061\u0072", "\u006D\u00E4\u0072\u0074\u0073", "\u0061\u0070\u0072\u0069\u006C\u006C", "\u006D\u0061\u0069", "\u006A\u0075\u0075\u006E\u0069", "\u006A\u0075\u0075\u006C\u0069", "\u0061\u0075\u0067\u0075\u0073\u0074", "\u0073\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u006F\u006B\u0074\u006F\u006F\u0062\u0065\u0072", "\u006E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0064\u0065\u0074\u0073\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x0426, 0x0026, "lv-LV", "lv", "lav", "lv-LV", "\u004C\u0061\u0074\u0076\u0069\u0061\u006E\u0020\u0028\u004C\u0061\u0074\u0076\u0069\u0061\u0029", "\u006C\u0061\u0074\u0076\u0069\u0065\u0161\u0075\u0020\u0028\u004C\u0061\u0074\u0076\u0069\u006A\u0061\u0029", false, 0x008C, "LV", "LVA", "\u004C\u0061\u0074\u0076\u0069\u0061", "\u004C\u0061\u0074\u0076\u0069\u006A\u0061", "\u004C\u0056\u004C", "\u004C\u0061\u0074\u0076\u0069\u0061\u006E\u0020\u004C\u0061\u0074\u0073", "\u004C\u0061\u0074\u0073", true, 2, 1, 2, 9, 2, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002C", "\u00A0", "\u004C\u0073", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0062\u0065\u007A\u0067\u0061\u006C\u012B\u0062\u0061", "\u0062\u0065\u007A\u0067\u0061\u006C\u012B\u0062\u0061", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0047\u0072\u0065\u0067\u006F\u0072\u0061\u0020\u006B\u0061\u006C\u0065\u006E\u0064\u0101\u0072\u0073", 1, 2, "\u002E", "\u003A", "", "", "\u0079\u0079\u0079\u0079\u002E\u004D\u004D\u002E\u0064\u0064\u002E", "\u0048\u003A\u006D\u006D", "\u0064\u0064\u0064\u0064\u002C\u0020\u0079\u0079\u0079\u0079\'\u002E\u0020\u0067\u0061\u0064\u0061\u0020\'\u0064\u002E\u0020\u004D\u004D\u004D\u004D", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D", "\u0079\u0079\u0079\u0079\u002E\u0020\u004D\u004D\u004D\u004D", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0079\u0079\u0079\u0079\u002E\u004D\u004D\u002E\u0064\u0064\u002E", "\u0079\u0079\u002E\u004D\u004D\u002E\u0064\u0064\u002E", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0079\u0079\u0079\u0079\'\u002E\u0020\u0067\u0061\u0064\u0061\u0020\'\u0064\u002E\u0020\u004D\u004D\u004D\u004D" ], [ "\u0079\u0079\u0079\u0079\u002E\u0020\u004D\u004D\u004D\u004D" ], [ "\u0053\u0076", "\u0050\u0072", "\u004F\u0074", "\u0054\u0072", "\u0043\u0065", "\u0050\u006B", "\u0053\u0065" ], [ "\u0073\u0076\u0113\u0074\u0064\u0069\u0065\u006E\u0061", "\u0070\u0069\u0072\u006D\u0064\u0069\u0065\u006E\u0061", "\u006F\u0074\u0072\u0064\u0069\u0065\u006E\u0061", "\u0074\u0072\u0065\u0161\u0064\u0069\u0065\u006E\u0061", "\u0063\u0065\u0074\u0075\u0072\u0074\u0064\u0069\u0065\u006E\u0061", "\u0070\u0069\u0065\u006B\u0074\u0064\u0069\u0065\u006E\u0061", "\u0073\u0065\u0073\u0074\u0064\u0069\u0065\u006E\u0061" ], [ "\u004A\u0061\u006E", "\u0046\u0065\u0062", "\u004D\u0061\u0072", "\u0041\u0070\u0072", "\u004D\u0061\u0069", "\u004A\u016B\u006E", "\u004A\u016B\u006C", "\u0041\u0075\u0067", "\u0053\u0065\u0070", "\u004F\u006B\u0074", "\u004E\u006F\u0076", "\u0044\u0065\u0063", "" ], [ "\u006A\u0061\u006E\u0076\u0101\u0072\u0069\u0073", "\u0066\u0065\u0062\u0072\u0075\u0101\u0072\u0069\u0073", "\u006D\u0061\u0072\u0074\u0073", "\u0061\u0070\u0072\u012B\u006C\u0069\u0073", "\u006D\u0061\u0069\u006A\u0073", "\u006A\u016B\u006E\u0069\u006A\u0073", "\u006A\u016B\u006C\u0069\u006A\u0073", "\u0061\u0075\u0067\u0075\u0073\u0074\u0073", "\u0073\u0065\u0070\u0074\u0065\u006D\u0062\u0072\u0069\u0073", "\u006F\u006B\u0074\u006F\u0062\u0072\u0069\u0073", "\u006E\u006F\u0076\u0065\u006D\u0062\u0072\u0069\u0073", "\u0064\u0065\u0063\u0065\u006D\u0062\u0072\u0069\u0073", "" ] }, +{ 0x0427, 0x0027, "lt-LT", "lt", "lit", "lt-LT", "\u004C\u0069\u0074\u0068\u0075\u0061\u006E\u0069\u0061\u006E\u0020\u0028\u004C\u0069\u0074\u0068\u0075\u0061\u006E\u0069\u0061\u0029", "\u006C\u0069\u0065\u0074\u0075\u0076\u0069\u0173\u0020\u0028\u004C\u0069\u0065\u0074\u0075\u0076\u0061\u0029", false, 0x008D, "LT", "LTU", "\u004C\u0069\u0074\u0068\u0075\u0061\u006E\u0069\u0061", "\u004C\u0069\u0065\u0074\u0075\u0076\u0061", "\u004C\u0054\u004C", "\u004C\u0069\u0074\u0068\u0075\u0061\u006E\u0069\u0061\u006E\u0020\u004C\u0069\u0074\u0061\u0073", "\u004C\u0069\u0074\u0061\u0073", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u004C\u0074", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0062\u0065\u0067\u0061\u006C\u0079\u0062\u0117", "\u0062\u0065\u0067\u0061\u006C\u0079\u0062\u0117", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0047\u0072\u0069\u0067\u0061\u006C\u0069\u0061\u0075\u0073\u0020\u006B\u0061\u006C\u0065\u006E\u0064\u006F\u0072\u0069\u0075\u0073", 1, 0, "\u002E", "\u003A", "", "", "\u0079\u0079\u0079\u0079\u002E\u004D\u004D\u002E\u0064\u0064", "\u0048\u0048\u003A\u006D\u006D", "\u0079\u0079\u0079\u0079\u0020\'\u006D\u002E\'\u0020\u004D\u004D\u004D\u004D\u0020\u0064\u0020\'\u0064\u002E\'", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u004D\u004D\u004D\u004D\u0020\u0064\u0020\'\u0064\u002E\'", "\u0079\u0079\u0079\u0079\u0020\'\u006D\u002E\'\u0020\u004D\u004D\u004D\u004D", [ "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0079\u0079\u0079\u0079\u002E\u004D\u004D\u002E\u0064\u0064", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0079\u0079\u0079\u0079\u0020\'\u006D\u002E\'\u0020\u004D\u004D\u004D\u004D\u0020\u0064\u0020\'\u0064\u002E\'" ], [ "\u0079\u0079\u0079\u0079\u0020\'\u006D\u002E\'\u0020\u004D\u004D\u004D\u004D" ], [ "\u0053\u006B", "\u0050\u0072", "\u0041\u006E", "\u0054\u0072", "\u004B\u0074", "\u0050\u006E", "\u0160\u0074" ], [ "\u0073\u0065\u006B\u006D\u0061\u0064\u0069\u0065\u006E\u0069\u0073", "\u0070\u0069\u0072\u006D\u0061\u0064\u0069\u0065\u006E\u0069\u0073", "\u0061\u006E\u0074\u0072\u0061\u0064\u0069\u0065\u006E\u0069\u0073", "\u0074\u0072\u0065\u010D\u0069\u0061\u0064\u0069\u0065\u006E\u0069\u0073", "\u006B\u0065\u0074\u0076\u0069\u0072\u0074\u0061\u0064\u0069\u0065\u006E\u0069\u0073", "\u0070\u0065\u006E\u006B\u0074\u0061\u0064\u0069\u0065\u006E\u0069\u0073", "\u0161\u0065\u0161\u0074\u0061\u0064\u0069\u0065\u006E\u0069\u0073" ], [ "\u0053\u0061\u0075", "\u0056\u0061\u0073", "\u004B\u006F\u0076", "\u0042\u0061\u006C", "\u0047\u0065\u0067", "\u0042\u0069\u0072", "\u004C\u0069\u0065", "\u0052\u0067\u0070", "\u0052\u0067\u0073", "\u0053\u0070\u006C", "\u004C\u0061\u0070", "\u0047\u0072\u0064", "" ], [ "\u0073\u0061\u0075\u0073\u0069\u0073", "\u0076\u0061\u0073\u0061\u0072\u0069\u0073", "\u006B\u006F\u0076\u0061\u0073", "\u0062\u0061\u006C\u0061\u006E\u0064\u0069\u0073", "\u0067\u0065\u0067\u0075\u017E\u0117", "\u0062\u0069\u0072\u017E\u0065\u006C\u0069\u0073", "\u006C\u0069\u0065\u0070\u0061", "\u0072\u0075\u0067\u0070\u006A\u016B\u0074\u0069\u0073", "\u0072\u0075\u0067\u0073\u0117\u006A\u0069\u0073", "\u0073\u0070\u0061\u006C\u0069\u0073", "\u006C\u0061\u0070\u006B\u0072\u0069\u0074\u0069\u0073", "\u0067\u0072\u0075\u006F\u0064\u0069\u0073", "" ] }, +{ 0x0429, 0x0029, "fa-IR", "fa", "fas", "fa-IR", "\u0050\u0065\u0072\u0073\u0069\u0061\u006E\u0020\u0028\u0049\u0072\u0061\u006E\u0029", "\u0641\u0627\u0631\u0633\u0649\u0020\u0028\u0627\u064A\u0631\u0627\u0646\u0029", false, 0x0074, "IR", "IRN", "\u0049\u0072\u0061\u006E", "\u0627\u064A\u0631\u0627\u0646", "\u0049\u0052\u0052", "\u0049\u0072\u0061\u006E\u0069\u0061\u006E\u0020\u0052\u0069\u0061\u006C", "\u0631\u0649\u0627\u0644", true, 2, 3, 2, 3, 2, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002F", "\u002C", "\u0631\u064A\u0627\u0644", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u06F0", "\u06F1", "\u06F2", "\u06F3", "\u06F4", "\u06F5", "\u06F6", "\u06F7", "\u06F8", "\u06F9" ], 2, [ 2, 1, 6, 11 ], "\u0047\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0020\u0043\u0061\u006C\u0065\u006E\u0064\u0061\u0072\u0020\u0028\u0045\u006E\u0067\u006C\u0069\u0073\u0068\u0029", 0, 0, "\u002F", "\u003A", "\u0642\u002E\u0638", "\u0628\u002E\u0638", "\u004D\u002F\u0064\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0064\u0064\u002C\u0020\u004D\u004D\u004D\u004D\u0020\u0064\u0064\u002C\u0020\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u004D\u002F\u0064\u002F\u0079\u0079\u0079\u0079", "\u004D\u002F\u0064\u002F\u0079\u0079", "\u004D\u004D\u002F\u0064\u0064\u002F\u0079\u0079", "\u004D\u004D\u002F\u0064\u0064\u002F\u0079\u0079\u0079\u0079" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u004D\u004D\u004D\u004D\u0020\u0064\u0064\u002C\u0020\u0079\u0079\u0079\u0079", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0053\u0075\u006E", "\u004D\u006F\u006E", "\u0054\u0075\u0065", "\u0057\u0065\u0064", "\u0054\u0068\u0075", "\u0046\u0072\u0069", "\u0053\u0061\u0074" ], [ "\u0053\u0075\u006E\u0064\u0061\u0079", "\u004D\u006F\u006E\u0064\u0061\u0079", "\u0054\u0075\u0065\u0073\u0064\u0061\u0079", "\u0057\u0065\u0064\u006E\u0065\u0073\u0064\u0061\u0079", "\u0054\u0068\u0075\u0072\u0073\u0064\u0061\u0079", "\u0046\u0072\u0069\u0064\u0061\u0079", "\u0053\u0061\u0074\u0075\u0072\u0064\u0061\u0079" ], [ "\u004A\u0061\u006E", "\u0046\u0065\u0062", "\u004D\u0061\u0072", "\u0041\u0070\u0072", "\u004D\u0061\u0079", "\u004A\u0075\u006E", "\u004A\u0075\u006C", "\u0041\u0075\u0067", "\u0053\u0065\u0070", "\u004F\u0063\u0074", "\u004E\u006F\u0076", "\u0044\u0065\u0063", "" ], [ "\u004A\u0061\u006E\u0075\u0061\u0072\u0079", "\u0046\u0065\u0062\u0072\u0075\u0061\u0072\u0079", "\u004D\u0061\u0072\u0063\u0068", "\u0041\u0070\u0072\u0069\u006C", "\u004D\u0061\u0079", "\u004A\u0075\u006E\u0065", "\u004A\u0075\u006C\u0079", "\u0041\u0075\u0067\u0075\u0073\u0074", "\u0053\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u004F\u0063\u0074\u006F\u0062\u0065\u0072", "\u004E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0044\u0065\u0063\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x042A, 0x002A, "vi-VN", "vi", "vie", "vi-VN", "\u0056\u0069\u0065\u0074\u006E\u0061\u006D\u0065\u0073\u0065\u0020\u0028\u0056\u0069\u0065\u0074\u006E\u0061\u006D\u0029", "\u0054\u0069\u00EA\u0301\u006E\u0067\u0020\u0056\u0069\u00EA\u0323\u0074\u0020\u0028\u0056\u0069\u00EA\u0323\u0074\u0020\u004E\u0061\u006D\u0029", false, 0x00FB, "VN", "VNM", "\u0056\u0069\u0065\u0074\u006E\u0061\u006D", "\u0056\u0069\u00EA\u0323\u0074\u0020\u004E\u0061\u006D", "\u0056\u004E\u0044", "\u0056\u0069\u0065\u0074\u006E\u0061\u006D\u0065\u0073\u0065\u0020\u0044\u006F\u006E\u0067", "\u0110\u00F4\u0300\u006E\u0067", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u20AB", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0044\u01B0\u01A1\u006E\u0067\u00A0\u004C\u0069\u0323\u0063\u0068", 1, 0, "\u002F", "\u003A", "\u0053\u0041", "\u0043\u0048", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0043\u004E", "\u0048\u0061\u0069", "\u0042\u0061", "\u0054\u01B0", "\u004E\u0103\u006D", "\u0053\u0061\u0301\u0075", "\u0042\u0061\u0309\u0079" ], [ "\u0043\u0068\u0075\u0309\u0020\u004E\u0068\u00E2\u0323\u0074", "\u0054\u0068\u01B0\u0301\u0020\u0048\u0061\u0069", "\u0054\u0068\u01B0\u0301\u0020\u0042\u0061", "\u0054\u0068\u01B0\u0301\u0020\u0054\u01B0", "\u0054\u0068\u01B0\u0301\u0020\u004E\u0103\u006D", "\u0054\u0068\u01B0\u0301\u0020\u0053\u0061\u0301\u0075", "\u0054\u0068\u01B0\u0301\u0020\u0042\u0061\u0309\u0079" ], [ "\u0054\u0068\u0067\u0031", "\u0054\u0068\u0067\u0032", "\u0054\u0068\u0067\u0033", "\u0054\u0068\u0067\u0034", "\u0054\u0068\u0067\u0035", "\u0054\u0068\u0067\u0036", "\u0054\u0068\u0067\u0037", "\u0054\u0068\u0067\u0038", "\u0054\u0068\u0067\u0039", "\u0054\u0068\u0067\u0031\u0030", "\u0054\u0068\u0067\u0031\u0031", "\u0054\u0068\u0067\u0031\u0032", "" ], [ "\u0054\u0068\u0061\u0301\u006E\u0067\u0020\u0047\u0069\u00EA\u006E\u0067", "\u0054\u0068\u0061\u0301\u006E\u0067\u0020\u0048\u0061\u0069", "\u0054\u0068\u0061\u0301\u006E\u0067\u0020\u0042\u0061", "\u0054\u0068\u0061\u0301\u006E\u0067\u0020\u0054\u01B0", "\u0054\u0068\u0061\u0301\u006E\u0067\u0020\u004E\u0103\u006D", "\u0054\u0068\u0061\u0301\u006E\u0067\u0020\u0053\u0061\u0301\u0075", "\u0054\u0068\u0061\u0301\u006E\u0067\u0020\u0042\u0061\u0309\u0079", "\u0054\u0068\u0061\u0301\u006E\u0067\u0020\u0054\u0061\u0301\u006D", "\u0054\u0068\u0061\u0301\u006E\u0067\u0020\u0043\u0068\u0069\u0301\u006E", "\u0054\u0068\u0061\u0301\u006E\u0067\u0020\u004D\u01B0\u01A1\u0300\u0069", "\u0054\u0068\u0061\u0301\u006E\u0067\u0020\u004D\u01B0\u01A1\u0300\u0069\u0020\u004D\u00F4\u0323\u0074", "\u0054\u0068\u0061\u0301\u006E\u0067\u0020\u004D\u01B0\u01A1\u0300\u0069\u0020\u0048\u0061\u0069", "" ] }, +{ 0x042B, 0x002B, "hy-AM", "hy", "hye", "hy-AM", "\u0041\u0072\u006D\u0065\u006E\u0069\u0061\u006E\u0020\u0028\u0041\u0072\u006D\u0065\u006E\u0069\u0061\u0029", "\u0540\u0561\u0575\u0565\u0580\u0565\u0576\u0020\u0028\u0540\u0561\u0575\u0561\u057D\u057F\u0561\u0576\u0029", false, 0x0007, "AM", "ARM", "\u0041\u0072\u006D\u0065\u006E\u0069\u0061", "\u0540\u0561\u0575\u0561\u057D\u057F\u0561\u0576", "\u0041\u004D\u0044", "\u0041\u0072\u006D\u0065\u006E\u0069\u0061\u006E\u0020\u0044\u0072\u0061\u006D", "\u0564\u0580\u0561\u0574", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0564\u0580\u002E", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0555\u0580\u0561\u0581\u0578\u0582\u0575\u0581", 1, 0, "\u002E", "\u003A", "", "", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u002F\u004D\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u002D\u004D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u002C\u0020\u0064\u002D\u004D\u004D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u002D\u004D\u004D\u004D\u004D\u002D\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u053F\u056B\u0580", "\u0535\u0580\u056F", "\u0535\u0580\u0584", "\u0549\u0580\u0584", "\u0540\u0576\u0563", "\u0548\u0552\u0580", "\u0547\u0562\u0569" ], [ "\u053F\u056B\u0580\u0561\u056F\u056B", "\u0535\u0580\u056F\u0578\u0582\u0577\u0561\u0562\u0569\u056B", "\u0535\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056B", "\u0549\u0578\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056B", "\u0540\u056B\u0576\u0563\u0577\u0561\u0562\u0569\u056B", "\u0548\u0552\u0580\u0562\u0561\u0569", "\u0547\u0561\u0562\u0561\u0569" ], [ "\u0540\u0546\u054E", "\u0553\u054F\u054E", "\u0544\u0550\u054F", "\u0531\u054A\u0550", "\u0544\u0545\u054D", "\u0540\u0546\u054D", "\u0540\u053C\u054D", "\u0555\u0533\u054D", "\u054D\u0535\u054A", "\u0540\u0548\u053F", "\u0546\u0548\u0545", "\u0534\u0535\u053F", "" ], [ "\u0540\u0578\u0582\u0576\u057E\u0561\u0580", "\u0553\u0565\u057F\u0580\u057E\u0561\u0580", "\u0544\u0561\u0580\u057F", "\u0531\u057A\u0580\u056B\u056C", "\u0544\u0561\u0575\u056B\u057D", "\u0540\u0578\u0582\u0576\u056B\u057D", "\u0540\u0578\u0582\u056C\u056B\u057D", "\u0555\u0563\u0578\u057D\u057F\u0578\u057D", "\u054D\u0565\u057A\u057F\u0565\u0574\u0562\u0565\u0580", "\u0540\u0578\u056F\u057F\u0565\u0574\u0562\u0565\u0580", "\u0546\u0578\u0575\u0565\u0574\u0562\u0565\u0580", "\u0534\u0565\u056F\u057F\u0565\u0574\u0562\u0565\u0580", "" ] }, +{ 0x042C, 0x002C, "az-AZ-Latn", "az", "aze", "az-Latn-AZ", "\u0041\u007A\u0065\u0072\u0069\u0020\u0028\u004C\u0061\u0074\u0069\u006E\u002C\u0020\u0041\u007A\u0065\u0072\u0062\u0061\u0069\u006A\u0061\u006E\u0029", "\u0041\u007A\u0259\u0072\u0062\u0061\u0079\u0063\u0061\u006E\u00AD\u0131\u006C\u0131\u0020\u0028\u0041\u007A\u0259\u0072\u0062\u0061\u0079\u0063\u0061\u006E\u0063\u0061\u0029", false, 0x0005, "AZ", "AZE", "\u0041\u007A\u0065\u0072\u0062\u0061\u0069\u006A\u0061\u006E", "\u0041\u007A\u0259\u0072\u0062\u0061\u0079\u0063\u0061\u006E\u0063\u0061", "\u0041\u005A\u004D", "\u0041\u007A\u0065\u0072\u0062\u0061\u0069\u006A\u0061\u006E\u0069\u0061\u006E\u0020\u004D\u0061\u006E\u0061\u0074", "\u006D\u0061\u006E\u0061\u0074", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002C", "\u00A0", "\u006D\u0061\u006E\u002E", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0051\u0072\u0069\u0071\u006F\u0072\u0069\u0061\u006E", 1, 0, "\u002E", "\u003A", "", "", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0042", "\u0042\u0065", "\u00C7\u0061", "\u00C7", "\u0043\u0061", "\u0043", "\u015E" ], [ "\u0042\u0061\u007A\u0061\u0072", "\u0042\u0061\u007A\u0061\u0072\u00A0\u0065\u0072\u0074\u0259\u0073\u0069", "\u00C7\u0259\u0072\u015F\u0259\u006E\u0062\u0259\u00A0\u0061\u0078\u015F\u0061\u006D\u0131", "\u00C7\u0259\u0072\u015F\u0259\u006E\u0062\u0259", "\u0043\u00FC\u006D\u0259\u00A0\u0061\u0078\u015F\u0061\u006D\u0131", "\u0043\u00FC\u006D\u0259", "\u015E\u0259\u006E\u0062\u0259" ], [ "\u0059\u0061\u006E", "\u0046\u0065\u0076", "\u004D\u0061\u0072", "\u0041\u0070\u0072", "\u004D\u0061\u0079", "\u0130\u0079\u0075\u006E", "\u0130\u0079\u0075\u006C", "\u0041\u0076\u0067", "\u0053\u0065\u006E", "\u004F\u006B\u0074", "\u004E\u006F\u0079", "\u0044\u0065\u006B", "" ], [ "\u0059\u0061\u006E\u0076\u0061\u0072", "\u0046\u0065\u0076\u0072\u0061\u006C", "\u004D\u0061\u0072\u0074", "\u0041\u0070\u0072\u0065\u006C", "\u004D\u0061\u0079", "\u0130\u0079\u0075\u006E", "\u0130\u0079\u0075\u006C", "\u0041\u0076\u0067\u0075\u0073\u0074", "\u0053\u0065\u006E\u0074\u0079\u0061\u0062\u0072", "\u004F\u006B\u0074\u0079\u0061\u0062\u0072", "\u004E\u006F\u0079\u0061\u0062\u0072", "\u0044\u0065\u006B\u0061\u0062\u0072", "" ] }, +{ 0x042D, 0x002D, "eu-ES", "eu", "eus", "eu-ES", "\u0042\u0061\u0073\u0071\u0075\u0065\u0020\u0028\u0042\u0061\u0073\u0071\u0075\u0065\u0029", "\u0065\u0075\u0073\u006B\u0061\u0072\u0061\u0020\u0028\u0065\u0075\u0073\u006B\u0061\u0072\u0061\u0029", false, 0x00D9, "ES", "ESP", "\u0053\u0070\u0061\u0069\u006E", "\u0045\u0073\u0070\u0061\u0069\u006E\u0069\u0061", "\u0045\u0055\u0052", "\u0045\u0075\u0072\u006F", "\u0065\u0075\u0072\u006F", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u20AC", "\u002D", "\u002B", "\u0045\u0064\u005A", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0075", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0075", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0065\u0067\u0075\u0074\u0065\u0067\u0069\u0020\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u006F\u0074\u0061\u0072\u0072\u0061", 1, 0, "\u002F", "\u003A", "", "", "\u0079\u0079\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0048\u0048\u003A\u006D\u006D", "\u0064\u0064\u0064\u0064\u002C\u0020\u0079\u0079\u0079\u0079\u002E\'\u0065\u006B\u006F\'\u0020\u004D\u004D\u004D\u004D\'\u006B\u0020\'\u0064", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064", "\u0079\u0079\u0079\u0079\u002E\'\u0065\u006B\u006F\'\u0020\u004D\u004D\u004D\u004D", [ "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0079\u0079\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0079\u0079\u0079\u0079\u002E\'\u0065\u006B\u006F\'\u0020\u004D\u004D\u004D\u004D\'\u006B\u0020\'\u0064" ], [ "\u0079\u0079\u0079\u0079\u002E\'\u0065\u006B\u006F\'\u0020\u004D\u004D\u004D\u004D" ], [ "\u0069\u0067\u002E", "\u0061\u006C\u002E", "\u0061\u0073\u002E", "\u0061\u007A\u002E", "\u006F\u0067\u002E", "\u006F\u0072\u002E", "\u006C\u0072\u002E" ], [ "\u0069\u0067\u0061\u006E\u0064\u0065\u0061", "\u0061\u0073\u0074\u0065\u006C\u0065\u0068\u0065\u006E\u0061", "\u0061\u0073\u0074\u0065\u0061\u0072\u0074\u0065\u0061", "\u0061\u0073\u0074\u0065\u0061\u007A\u006B\u0065\u006E\u0061", "\u006F\u0073\u0074\u0065\u0067\u0075\u006E\u0061", "\u006F\u0073\u0074\u0069\u0072\u0061\u006C\u0061", "\u006C\u0061\u0072\u0075\u006E\u0062\u0061\u0074\u0061" ], [ "\u0075\u0072\u0074\u002E", "\u006F\u0074\u0073\u002E", "\u006D\u0061\u0072\u002E", "\u0061\u0070\u0069\u002E", "\u006D\u0061\u0069\u002E", "\u0065\u006B\u0061\u002E", "\u0075\u007A\u0074\u002E", "\u0061\u0062\u0075\u002E", "\u0069\u0072\u0061\u002E", "\u0075\u0072\u0072\u002E", "\u0061\u007A\u0061\u002E", "\u0061\u0062\u0065\u002E", "" ], [ "\u0075\u0072\u0074\u0061\u0072\u0072\u0069\u006C\u0061", "\u006F\u0074\u0073\u0061\u0069\u006C\u0061", "\u006D\u0061\u0072\u0074\u0078\u006F\u0061", "\u0061\u0070\u0069\u0072\u0069\u006C\u0061", "\u006D\u0061\u0069\u0061\u0074\u007A\u0061", "\u0065\u006B\u0061\u0069\u006E\u0061", "\u0075\u007A\u0074\u0061\u0069\u006C\u0061", "\u0061\u0062\u0075\u007A\u0074\u0075\u0061", "\u0069\u0072\u0061\u0069\u006C\u0061", "\u0075\u0072\u0072\u0069\u0061", "\u0061\u007A\u0061\u0072\u006F\u0061", "\u0061\u0062\u0065\u006E\u0064\u0075\u0061", "" ] }, +{ 0x042F, 0x002F, "mk-MK", "mk", "mkd", "mk-MK", "\u004D\u0061\u0063\u0065\u0064\u006F\u006E\u0069\u0061\u006E\u0020\u0028\u0046\u006F\u0072\u006D\u0065\u0072\u0020\u0059\u0075\u0067\u006F\u0073\u006C\u0061\u0076\u0020\u0052\u0065\u0070\u0075\u0062\u006C\u0069\u0063\u0020\u006F\u0066\u0020\u004D\u0061\u0063\u0065\u0064\u006F\u006E\u0069\u0061\u0029", "\u043C\u0430\u043A\u0435\u0434\u043E\u043D\u0441\u043A\u0438\u0020\u0458\u0430\u0437\u0438\u043A\u0020\u0028\u041C\u0430\u043A\u0435\u0434\u043E\u043D\u0438\u0458\u0430\u0029", false, 0x4CA2, "MK", "MKD", "\u004D\u0061\u0063\u0065\u0064\u006F\u006E\u0069\u0061\u0020\u0028\u0046\u0059\u0052\u004F\u004D\u0029", "\u041C\u0430\u043A\u0435\u0434\u043E\u043D\u0438\u0458\u0430", "\u004D\u004B\u0044", "\u004D\u0061\u0063\u0065\u0064\u006F\u006E\u0069\u0061\u006E\u0020\u0044\u0065\u006E\u0061\u0072", "\u0434\u0435\u043D\u0430\u0440", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u0434\u0435\u043D\u002E", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0433\u0440\u0435\u0433\u043E\u0440\u0438\u0458\u0430\u043D\u0441\u043A\u0438\u0020\u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440", 1, 2, "\u002E", "\u003A", "", "", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u043D\u0435\u0434", "\u043F\u043E\u043D", "\u0432\u0442\u0440", "\u0441\u0440\u0434", "\u0447\u0435\u0442", "\u043F\u0435\u0442", "\u0441\u0430\u0431" ], [ "\u043D\u0435\u0434\u0435\u043B\u0430", "\u043F\u043E\u043D\u0435\u0434\u0435\u043B\u043D\u0438\u043A", "\u0432\u0442\u043E\u0440\u043D\u0438\u043A", "\u0441\u0440\u0435\u0434\u0430", "\u0447\u0435\u0442\u0432\u0440\u0442\u043E\u043A", "\u043F\u0435\u0442\u043E\u043A", "\u0441\u0430\u0431\u043E\u0442\u0430" ], [ "\u0458\u0430\u043D", "\u0444\u0435\u0432", "\u043C\u0430\u0440", "\u0430\u043F\u0440", "\u043C\u0430\u0458", "\u0458\u0443\u043D", "\u0458\u0443\u043B", "\u0430\u0432\u0433", "\u0441\u0435\u043F", "\u043E\u043A\u0442", "\u043D\u043E\u0435", "\u0434\u0435\u043A", "" ], [ "\u0458\u0430\u043D\u0443\u0430\u0440\u0438", "\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438", "\u043C\u0430\u0440\u0442", "\u0430\u043F\u0440\u0438\u043B", "\u043C\u0430\u0458", "\u0458\u0443\u043D\u0438", "\u0458\u0443\u043B\u0438", "\u0430\u0432\u0433\u0443\u0441\u0442", "\u0441\u0435\u043F\u0442\u0435\u043C\u0432\u0440\u0438", "\u043E\u043A\u0442\u043E\u043C\u0432\u0440\u0438", "\u043D\u043E\u0435\u043C\u0432\u0440\u0438", "\u0434\u0435\u043A\u0435\u043C\u0432\u0440\u0438", "" ] }, +{ 0x0436, 0x0036, "af-ZA", "af", "afr", "af-ZA", "\u0041\u0066\u0072\u0069\u006B\u0061\u0061\u006E\u0073\u0020\u0028\u0053\u006F\u0075\u0074\u0068\u0020\u0041\u0066\u0072\u0069\u0063\u0061\u0029", "\u0041\u0066\u0072\u0069\u006B\u0061\u0061\u006E\u0073\u0020\u0028\u0053\u0075\u0069\u0064\u0020\u0041\u0066\u0072\u0069\u006B\u0061\u0029", false, 0x00D1, "ZA", "ZAF", "\u0053\u006F\u0075\u0074\u0068\u0020\u0041\u0066\u0072\u0069\u0063\u0061", "\u0053\u0075\u0069\u0064\u0020\u0041\u0066\u0072\u0069\u006B\u0061", "\u005A\u0041\u0052", "\u0053\u006F\u0075\u0074\u0068\u0020\u0041\u0066\u0072\u0069\u0063\u0061\u006E\u0020\u0052\u0061\u006E\u0064", "\u0052\u0061\u006E\u0064", true, 2, 1, 2, 2, 2, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0052", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0047\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u0061\u006E\u0073\u0065\u0020\u006B\u0061\u006C\u0065\u006E\u0064\u0065\u0072", 0, 0, "\u002F", "\u003A", "", "\u006E\u006D", "\u0079\u0079\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0079\u0079\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0053\u006F\u006E", "\u004D\u0061\u0061\u006E", "\u0044\u0069\u006E\u0073", "\u0057\u006F\u0065\u006E", "\u0044\u006F\u006E\u0064", "\u0056\u0072\u0079", "\u0053\u0061\u0074" ], [ "\u0053\u006F\u006E\u0064\u0061\u0067", "\u004D\u0061\u0061\u006E\u0064\u0061\u0067", "\u0044\u0069\u006E\u0073\u0064\u0061\u0067", "\u0057\u006F\u0065\u006E\u0073\u0064\u0061\u0067", "\u0044\u006F\u006E\u0064\u0065\u0072\u0064\u0061\u0067", "\u0056\u0072\u0079\u0064\u0061\u0067", "\u0053\u0061\u0074\u0065\u0072\u0064\u0061\u0067" ], [ "\u004A\u0061\u006E", "\u0046\u0065\u0062", "\u004D\u0061\u0072", "\u0041\u0070\u0072", "\u004D\u0065\u0069", "\u004A\u0075\u006E", "\u004A\u0075\u006C", "\u0041\u0075\u0067", "\u0053\u0065\u0070", "\u004F\u006B\u0074", "\u004E\u006F\u0076", "\u0044\u0065\u0073", "" ], [ "\u004A\u0061\u006E\u0075\u0061\u0072\u0069\u0065", "\u0046\u0065\u0062\u0072\u0075\u0061\u0072\u0069\u0065", "\u004D\u0061\u0061\u0072\u0074", "\u0041\u0070\u0072\u0069\u006C", "\u004D\u0065\u0069", "\u004A\u0075\u006E\u0069\u0065", "\u004A\u0075\u006C\u0069\u0065", "\u0041\u0075\u0067\u0075\u0073\u0074\u0075\u0073", "\u0053\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u004F\u006B\u0074\u006F\u0062\u0065\u0072", "\u004E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0044\u0065\u0073\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x0437, 0x0037, "ka-GE", "ka", "kat", "ka-GE", "\u0047\u0065\u006F\u0072\u0067\u0069\u0061\u006E\u0020\u0028\u0047\u0065\u006F\u0072\u0067\u0069\u0061\u0029", "\u10E5\u10D0\u10E0\u10D7\u10E3\u10DA\u10D8\u0020\u0028\u10E1\u10D0\u10E5\u10D0\u10E0\u10D7\u10D5\u10D4\u10DA\u10DD\u0029", false, 0x0058, "GE", "GEO", "\u0047\u0065\u006F\u0072\u0067\u0069\u0061", "\u10E1\u10D0\u10E5\u10D0\u10E0\u10D7\u10D5\u10D4\u10DA\u10DD", "\u0047\u0045\u004C", "\u004C\u0061\u0072\u0069", "\u10DA\u10D0\u10E0\u10D8", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002C", "\u00A0", "\u004C\u0061\u0072\u0069", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u10D2\u10E0\u10D8\u10D2\u10DD\u10E0\u10D8\u10D0\u10DC\u10E3\u10DA\u10D8\u00A0\u10D9\u10D0\u10DA\u10D4\u10DC\u10D3\u10D0\u10E0\u10D8", 1, 0, "\u002E", "\u003A", "", "", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0079\u0079\u0079\u0079\u0020\'\u10EC\u10DA\u10D8\u10E1\'\u0020\u0064\u0064\u0020\u004D\u004D\u002C\u0020\u0064\u0064\u0064\u0064", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0079\u0079\u0079\u0079\u0020\'\u10EC\u10DA\u10D8\u10E1\'\u0020\u0064\u0064\u0020\u004D\u004D\u002C\u0020\u0064\u0064\u0064\u0064" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u10D9\u10D5\u10D8\u10E0\u10D0", "\u10DD\u10E0\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8", "\u10E1\u10D0\u10DB\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8", "\u10DD\u10D7\u10EE\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8", "\u10EE\u10E3\u10D7\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8", "\u10DE\u10D0\u10E0\u10D0\u10E1\u10D9\u10D4\u10D5\u10D8", "\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8" ], [ "\u10D9\u10D5\u10D8\u10E0\u10D0", "\u10DD\u10E0\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8", "\u10E1\u10D0\u10DB\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8", "\u10DD\u10D7\u10EE\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8", "\u10EE\u10E3\u10D7\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8", "\u10DE\u10D0\u10E0\u10D0\u10E1\u10D9\u10D4\u10D5\u10D8", "\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8" ], [ "\u10D8\u10D0\u10DC", "\u10D7\u10D4\u10D1", "\u10DB\u10D0\u10E0", "\u10D0\u10DE\u10E0", "\u10DB\u10D0\u10D8\u10E1", "\u10D8\u10D5\u10DC", "\u10D8\u10D5\u10DA", "\u10D0\u10D2\u10D5", "\u10E1\u10D4\u10E5", "\u10DD\u10E5\u10E2", "\u10DC\u10DD\u10D4\u10DB", "\u10D3\u10D4\u10D9", "" ], [ "\u10D8\u10D0\u10DC\u10D5\u10D0\u10E0\u10D8", "\u10D7\u10D4\u10D1\u10D4\u10E0\u10D5\u10D0\u10DA\u10D8", "\u10DB\u10D0\u10E0\u10E2\u10D8", "\u10D0\u10DE\u10E0\u10D8\u10DA\u10D8", "\u10DB\u10D0\u10D8\u10E1\u10D8", "\u10D8\u10D5\u10DC\u10D8\u10E1\u10D8", "\u10D8\u10D5\u10DA\u10D8\u10E1\u10D8", "\u10D0\u10D2\u10D5\u10D8\u10E1\u10E2\u10DD", "\u10E1\u10D4\u10E5\u10E2\u10D4\u10DB\u10D1\u10D4\u10E0\u10D8", "\u10DD\u10E5\u10E2\u10DD\u10DB\u10D1\u10D4\u10E0\u10D8", "\u10DC\u10DD\u10D4\u10DB\u10D1\u10D4\u10E0\u10D8", "\u10D3\u10D4\u10D9\u10D4\u10DB\u10D1\u10D4\u10E0\u10D8", "" ] }, +{ 0x0438, 0x0038, "fo-FO", "fo", "fao", "fo-FO", "\u0046\u0061\u0072\u006F\u0065\u0073\u0065\u0020\u0028\u0046\u0061\u0072\u006F\u0065\u0020\u0049\u0073\u006C\u0061\u006E\u0064\u0073\u0029", "\u0066\u00F8\u0072\u006F\u0079\u0073\u006B\u0074\u0020\u0028\u0046\u00F8\u0072\u006F\u0079\u0061\u0072\u0029", false, 0x0051, "FO", "FRO", "\u0046\u0061\u0072\u006F\u0065\u0020\u0049\u0073\u006C\u0061\u006E\u0064\u0073", "\u0046\u00F8\u0072\u006F\u0079\u0061\u0072", "\u0044\u004B\u004B", "\u0044\u0061\u006E\u0069\u0073\u0068\u0020\u004B\u0072\u006F\u006E\u0065", "\u0044\u0061\u006E\u0073\u006B\u0020\u006B\u0072\u006F\u006E\u0065", true, 2, 1, 2, 12, 2, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u006B\u0072", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u004E\u0046", "\u0049\u004E\u0046", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0047\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0073\u006B\u0069\u0020\u00E1\u006C\u006D\u0061\u006E\u0061\u006B\u006B\u0069\u006E", 1, 2, "\u002D", "\u002E", "", "", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0048\u0048\u002E\u006D\u006D", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u0048\u002E\u006D\u006D\u002E\u0073\u0073", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u002E\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u002E\u006D\u006D\u002E\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0073\u0075\u006E", "\u006D\u00E1\u006E", "\u0074\u00FD\u0073", "\u006D\u0069\u006B", "\u0068\u00F3\u0073", "\u0066\u0072\u00ED", "\u006C\u0065\u0079\u0067" ], [ "\u0073\u0075\u006E\u006E\u0075\u0064\u0061\u0067\u0075\u0072", "\u006D\u00E1\u006E\u0061\u0064\u0061\u0067\u0075\u0072", "\u0074\u00FD\u0073\u0064\u0061\u0067\u0075\u0072", "\u006D\u0069\u006B\u0075\u0064\u0061\u0067\u0075\u0072", "\u0068\u00F3\u0073\u0064\u0061\u0067\u0075\u0072", "\u0066\u0072\u00ED\u0067\u0067\u006A\u0061\u0064\u0061\u0067\u0075\u0072", "\u006C\u0065\u0079\u0067\u0061\u0072\u0064\u0061\u0067\u0075\u0072" ], [ "\u006A\u0061\u006E", "\u0066\u0065\u0062", "\u006D\u0061\u0072", "\u0061\u0070\u0072", "\u006D\u0061\u0069", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0075\u0067", "\u0073\u0065\u0070", "\u006F\u006B\u0074", "\u006E\u006F\u0076", "\u0064\u0065\u0073", "" ], [ "\u006A\u0061\u006E\u0075\u0061\u0072", "\u0066\u0065\u0062\u0072\u0075\u0061\u0072", "\u006D\u0061\u0072\u0073", "\u0061\u0070\u0072\u00ED\u006C", "\u006D\u0061\u0069", "\u006A\u0075\u006E\u0069", "\u006A\u0075\u006C\u0069", "\u0061\u0075\u0067\u0075\u0073\u0074", "\u0073\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u006F\u006B\u0074\u006F\u0062\u0065\u0072", "\u006E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0064\u0065\u0073\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x0439, 0x0039, "hi-IN", "hi", "hin", "hi-IN", "\u0048\u0069\u006E\u0064\u0069\u0020\u0028\u0049\u006E\u0064\u0069\u0061\u0029", "\u0939\u093F\u0902\u0926\u0940\u0020\u0028\u092D\u093E\u0930\u0924\u0029", false, 0x0071, "IN", "IND", "\u0049\u006E\u0064\u0069\u0061", "\u092D\u093E\u0930\u0924", "\u0049\u004E\u0052", "\u0049\u006E\u0064\u0069\u0061\u006E\u0020\u0052\u0075\u0070\u0065\u0065", "\u0930\u0941\u092A\u092F\u093E", true, 2, 1, 2, 12, 2, [ 3, 2 ], [ 3, 2 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0930\u0941", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0905\u0902\u0917\u094D\u0930\u0947\u091C\u093C\u0940\u00A0\u0915\u0948\u0932\u0947\u0928\u094D\u0921\u0930", 1, 0, "\u002D", "\u003A", "\u092A\u0942\u0930\u094D\u0935\u093E\u0939\u094D\u0928", "\u0905\u092A\u0930\u093E\u0939\u094D\u0928", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D", "\u0074\u0074\u0020\u0068\u0068\u003A\u006D\u006D", "\u0074\u0074\u0020\u0068\u003A\u006D\u006D" ], [ "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0064\u002D\u004D\u002D\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0074\u0074\u0020\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073", "\u0074\u0074\u0020\u0068\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0930\u0935\u093F\u002E", "\u0938\u094B\u092E\u002E", "\u092E\u0902\u0917\u0932\u002E", "\u092C\u0941\u0927\u002E", "\u0917\u0941\u0930\u0941\u002E", "\u0936\u0941\u0915\u094D\u0930\u002E", "\u0936\u0928\u093F\u002E" ], [ "\u0930\u0935\u093F\u0935\u093E\u0930", "\u0938\u094B\u092E\u0935\u093E\u0930", "\u092E\u0902\u0917\u0932\u0935\u093E\u0930", "\u092C\u0941\u0927\u0935\u093E\u0930", "\u0917\u0941\u0930\u0941\u0935\u093E\u0930", "\u0936\u0941\u0915\u094D\u0930\u0935\u093E\u0930", "\u0936\u0928\u093F\u0935\u093E\u0930" ], [ "\u091C\u0928\u0935\u0930\u0940", "\u092B\u0930\u0935\u0930\u0940", "\u092E\u093E\u0930\u094D\u091A", "\u0905\u092A\u094D\u0930\u0948\u0932", "\u092E\u0908", "\u091C\u0942\u0928", "\u091C\u0941\u0932\u093E\u0908", "\u0905\u0917\u0938\u094D\u0924", "\u0938\u093F\u0924\u092E\u094D\u092C\u0930", "\u0905\u0915\u094D\u0924\u0942\u092C\u0930", "\u0928\u0935\u092E\u094D\u092C\u0930", "\u0926\u093F\u0938\u092E\u094D\u092C\u0930", "" ], [ "\u091C\u0928\u0935\u0930\u0940", "\u092B\u0930\u0935\u0930\u0940", "\u092E\u093E\u0930\u094D\u091A", "\u0905\u092A\u094D\u0930\u0948\u0932", "\u092E\u0908", "\u091C\u0942\u0928", "\u091C\u0941\u0932\u093E\u0908", "\u0905\u0917\u0938\u094D\u0924", "\u0938\u093F\u0924\u092E\u094D\u092C\u0930", "\u0905\u0915\u094D\u0924\u0942\u092C\u0930", "\u0928\u0935\u092E\u094D\u092C\u0930", "\u0926\u093F\u0938\u092E\u094D\u092C\u0930", "" ] }, +{ 0x043E, 0x003E, "ms-MY", "ms", "msa", "ms-MY", "\u004D\u0061\u006C\u0061\u0079\u0020\u0028\u004D\u0061\u006C\u0061\u0079\u0073\u0069\u0061\u0029", "\u0042\u0061\u0068\u0061\u0073\u0061\u0020\u004D\u0061\u006C\u0061\u0079\u0073\u0069\u0061\u0020\u0028\u004D\u0061\u006C\u0061\u0079\u0073\u0069\u0061\u0029", false, 0x00A7, "MY", "MYS", "\u004D\u0061\u006C\u0061\u0079\u0073\u0069\u0061", "\u004D\u0061\u006C\u0061\u0079\u0073\u0069\u0061", "\u004D\u0059\u0052", "\u004D\u0061\u006C\u0061\u0079\u0073\u0069\u0061\u006E\u0020\u0052\u0069\u006E\u0067\u0067\u0069\u0074", "\u0052\u0069\u006E\u0067\u0067\u0069\u0074\u0020\u004D\u0061\u006C\u0061\u0079\u0073\u0069\u0061", true, 2, 1, 0, 0, 0, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u0052", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u006B\u0061\u006C\u0065\u006E\u0064\u0061\u0072\u0020\u004D\u0061\u0073\u0065\u0068\u0069", 1, 0, "\u002F", "\u003A", "", "", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0041\u0068\u0061\u0064", "\u0049\u0073\u006E\u0069\u006E", "\u0053\u0065\u006C", "\u0052\u0061\u0062\u0075", "\u004B\u0068\u0061\u006D\u0069\u0073", "\u004A\u0075\u006D\u0061\u0061\u0074", "\u0053\u0061\u0062\u0074\u0075" ], [ "\u0041\u0068\u0061\u0064", "\u0049\u0073\u006E\u0069\u006E", "\u0053\u0065\u006C\u0061\u0073\u0061", "\u0052\u0061\u0062\u0075", "\u004B\u0068\u0061\u006D\u0069\u0073", "\u004A\u0075\u006D\u0061\u0061\u0074", "\u0053\u0061\u0062\u0074\u0075" ], [ "\u004A\u0061\u006E", "\u0046\u0065\u0062", "\u004D\u0061\u0063", "\u0041\u0070\u0072", "\u004D\u0065\u0069", "\u004A\u0075\u006E", "\u004A\u0075\u006C", "\u004F\u0067\u006F\u0073", "\u0053\u0065\u0070\u0074", "\u004F\u006B\u0074", "\u004E\u006F\u0076", "\u0044\u0069\u0073", "" ], [ "\u004A\u0061\u006E\u0075\u0061\u0072\u0069", "\u0046\u0065\u0062\u0072\u0075\u0061\u0072\u0069", "\u004D\u0061\u0063", "\u0041\u0070\u0072\u0069\u006C", "\u004D\u0065\u0069", "\u004A\u0075\u006E", "\u004A\u0075\u006C\u0061\u0069", "\u004F\u0067\u006F\u0073", "\u0053\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u004F\u006B\u0074\u006F\u0062\u0065\u0072", "\u004E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0044\u0069\u0073\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x043F, 0x003F, "kk-KZ", "kk", "kaz", "kk-KZ", "\u004B\u0061\u007A\u0061\u006B\u0068\u0020\u0028\u004B\u0061\u007A\u0061\u006B\u0068\u0073\u0074\u0061\u006E\u0029", "\u049A\u0430\u0437\u0430\u049B\u0020\u0028\u049A\u0430\u0437\u0430\u049B\u0441\u0442\u0430\u043D\u0029", false, 0x0089, "KZ", "KAZ", "\u004B\u0061\u007A\u0061\u006B\u0068\u0073\u0074\u0061\u006E", "\u049A\u0430\u0437\u0430\u049B\u0441\u0442\u0430\u043D", "\u004B\u005A\u0054", "\u0054\u0065\u006E\u0067\u0065", "\u0422", true, 2, 1, 2, 1, 0, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002D", "\u00A0", "\u0422", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0433\u0440\u0438\u0433\u043E\u0440\u0438\u0430\u043D\u043A\u04AF\u043D\u0442\u0456\u0437\u0431\u0435\u043A", 1, 0, "\u002E", "\u003A", "", "", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079\u0020\'\u0436\u002E\'", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079\u0020\'\u0436\u002E\'", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079\u0020\'\u0436\u002E\'" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0416\u043A", "\u0414\u0441", "\u0421\u0441", "\u0421\u0440", "\u0411\u0441", "\u0416\u043C", "\u0421\u043D" ], [ "\u0416\u0435\u043A\u0441\u0435\u043D\u0431\u0456", "\u0414\u04AF\u0439\u0441\u0435\u043D\u0431\u0456", "\u0421\u0435\u0439\u0441\u0435\u043D\u0431\u0456", "\u0421\u04D9\u0440\u0441\u0435\u043D\u0431\u0456", "\u0411\u0435\u0439\u0441\u0435\u043D\u0431\u0456", "\u0416\u04B1\u043C\u0430", "\u0421\u0435\u043D\u0431\u0456" ], [ "\u049A\u0430\u04A3", "\u0410\u049B\u043F", "\u041D\u0430\u0443", "\u0421\u04D9\u0443", "\u041C\u0430\u043C", "\u041C\u0430\u0443", "\u0428\u0456\u043B", "\u0422\u0430\u043C", "\u049A\u044B\u0440", "\u049A\u0430\u0437", "\u049A\u0430\u0440", "\u0416\u0435\u043B", "" ], [ "\u049B\u0430\u04A3\u0442\u0430\u0440", "\u0430\u049B\u043F\u0430\u043D", "\u043D\u0430\u0443\u0440\u044B\u0437", "\u0441\u04D9\u0443\u0456\u0440", "\u043C\u0430\u043C\u044B\u0440", "\u043C\u0430\u0443\u0441\u044B\u043C", "\u0448\u0456\u043B\u0434\u0435", "\u0442\u0430\u043C\u044B\u0437", "\u049B\u044B\u0440\u043A\u04AF\u0439\u0435\u043A", "\u049B\u0430\u0437\u0430\u043D", "\u049B\u0430\u0440\u0430\u0448\u0430", "\u0436\u0435\u043B\u0442\u043E\u049B\u0441\u0430\u043D", "" ] }, +{ 0x0440, 0x0040, "ky-KG", "ky", "kir", "ky-KG", "\u004B\u0079\u0072\u0067\u0079\u007A\u0020\u0028\u004B\u0079\u0072\u0067\u0079\u007A\u0073\u0074\u0061\u006E\u0029", "\u041A\u044B\u0440\u0433\u044B\u0437\u0020\u0028\u041A\u044B\u0440\u0433\u044B\u0437\u0441\u0442\u0430\u043D\u0029", false, 0x0082, "KG", "KGZ", "\u004B\u0079\u0072\u0067\u0079\u007A\u0073\u0074\u0061\u006E", "\u041A\u044B\u0440\u0433\u044B\u0437\u0441\u0442\u0430\u043D", "\u004B\u0047\u0053", "\u0073\u006F\u006D", "\u0441\u043E\u043C", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002D", "\u00A0", "\u0441\u043E\u043C", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0433\u0440\u0438\u0433\u043E\u0440\u0438\u0430\u043D\u00A0\u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u044B", 1, 0, "\u002E", "\u003A", "", "", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\'\u002D\'\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079\'\u002D\u0436\u002E\'", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079\'\u002D\u0436\u002E\'", [ "\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\'\u002D\'\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079\'\u002D\u0436\u002E\'" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079\'\u002D\u0436\u002E\'" ], [ "\u0416\u0448", "\u0414\u0448", "\u0428\u0448", "\u0428\u0440", "\u0411\u0448", "\u0416\u043C", "\u0418\u0448" ], [ "\u0416\u0435\u043A\u0448\u0435\u043C\u0431\u0438", "\u0414\u04AF\u0439\u0448\u04E9\u043C\u0431\u04AF", "\u0428\u0435\u0439\u0448\u0435\u043C\u0431\u0438", "\u0428\u0430\u0440\u0448\u0435\u043C\u0431\u0438", "\u0411\u0435\u0439\u0448\u0435\u043C\u0431\u0438", "\u0416\u0443\u043C\u0430", "\u0418\u0448\u0435\u043C\u0431\u0438" ], [ "\u042F\u043D\u0432", "\u0424\u0435\u0432", "\u041C\u0430\u0440", "\u0410\u043F\u0440", "\u041C\u0430\u0439", "\u0418\u044E\u043D", "\u0418\u044E\u043B", "\u0410\u0432\u0433", "\u0421\u0435\u043D", "\u041E\u043A\u0442", "\u041D\u043E\u044F", "\u0414\u0435\u043A", "" ], [ "\u042F\u043D\u0432\u0430\u0440\u044C", "\u0424\u0435\u0432\u0440\u0430\u043B\u044C", "\u041C\u0430\u0440\u0442", "\u0410\u043F\u0440\u0435\u043B\u044C", "\u041C\u0430\u0439", "\u0418\u044E\u043D\u044C", "\u0418\u044E\u043B\u044C", "\u0410\u0432\u0433\u0443\u0441\u0442", "\u0421\u0435\u043D\u0442\u044F\u0431\u0440\u044C", "\u041E\u043A\u0442\u044F\u0431\u0440\u044C", "\u041D\u043E\u044F\u0431\u0440\u044C", "\u0414\u0435\u043A\u0430\u0431\u0440\u044C", "" ] }, +{ 0x0441, 0x0041, "sw-KE", "sw", "swa", "sw-KE", "\u004B\u0069\u0073\u0077\u0061\u0068\u0069\u006C\u0069\u0020\u0028\u004B\u0065\u006E\u0079\u0061\u0029", "\u004B\u0069\u0073\u0077\u0061\u0068\u0069\u006C\u0069\u0020\u0028\u004B\u0065\u006E\u0079\u0061\u0029", false, 0x0081, "KE", "KEN", "\u004B\u0065\u006E\u0079\u0061", "\u004B\u0065\u006E\u0079\u0061", "\u004B\u0045\u0053", "\u004B\u0065\u006E\u0079\u0061\u006E\u0020\u0053\u0068\u0069\u006C\u006C\u0069\u006E\u0067", "\u0053\u0068\u0069\u006C\u0069\u006E\u0067\u0069", false, 2, 1, 2, 0, 0, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0053", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0047\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0020\u0043\u0061\u006C\u0065\u006E\u0064\u0061\u0072", 0, 0, "\u002F", "\u003A", "\u0041\u004D", "\u0050\u004D", "\u004D\u002F\u0064\u002F\u0079\u0079\u0079\u0079", "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0064\u0064\u002C\u0020\u004D\u004D\u004D\u004D\u0020\u0064\u0064\u002C\u0020\u0079\u0079\u0079\u0079", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u004D\u002F\u0064\u002F\u0079\u0079\u0079\u0079", "\u004D\u002F\u0064\u002F\u0079\u0079", "\u004D\u004D\u002F\u0064\u0064\u002F\u0079\u0079", "\u004D\u004D\u002F\u0064\u0064\u002F\u0079\u0079\u0079\u0079", "\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0064\u0064\u002D\u004D\u004D\u004D\u002D\u0079\u0079" ], [ "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u004D\u004D\u004D\u004D\u0020\u0064\u0064\u002C\u0020\u0079\u0079\u0079\u0079", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0053\u0075\u006E", "\u004D\u006F\u006E", "\u0054\u0075\u0065", "\u0057\u0065\u0064", "\u0054\u0068\u0075", "\u0046\u0072\u0069", "\u0053\u0061\u0074" ], [ "\u0053\u0075\u006E\u0064\u0061\u0079", "\u004D\u006F\u006E\u0064\u0061\u0079", "\u0054\u0075\u0065\u0073\u0064\u0061\u0079", "\u0057\u0065\u0064\u006E\u0065\u0073\u0064\u0061\u0079", "\u0054\u0068\u0075\u0072\u0073\u0064\u0061\u0079", "\u0046\u0072\u0069\u0064\u0061\u0079", "\u0053\u0061\u0074\u0075\u0072\u0064\u0061\u0079" ], [ "\u004A\u0061\u006E", "\u0046\u0065\u0062", "\u004D\u0061\u0072", "\u0041\u0070\u0072", "\u004D\u0061\u0079", "\u004A\u0075\u006E", "\u004A\u0075\u006C", "\u0041\u0075\u0067", "\u0053\u0065\u0070", "\u004F\u0063\u0074", "\u004E\u006F\u0076", "\u0044\u0065\u0063", "" ], [ "\u004A\u0061\u006E\u0075\u0061\u0072\u0079", "\u0046\u0065\u0062\u0072\u0075\u0061\u0072\u0079", "\u004D\u0061\u0072\u0063\u0068", "\u0041\u0070\u0072\u0069\u006C", "\u004D\u0061\u0079", "\u004A\u0075\u006E\u0065", "\u004A\u0075\u006C\u0079", "\u0041\u0075\u0067\u0075\u0073\u0074", "\u0053\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u004F\u0063\u0074\u006F\u0062\u0065\u0072", "\u004E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0044\u0065\u0063\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x0443, 0x0043, "uz-UZ-Latn", "uz", "uzb", "uz-Latn-UZ", "\u0055\u007A\u0062\u0065\u006B\u0020\u0028\u004C\u0061\u0074\u0069\u006E\u002C\u0020\u0055\u007A\u0062\u0065\u006B\u0069\u0073\u0074\u0061\u006E\u0029", "\u0055\u0027\u007A\u0062\u0065\u006B\u0020\u0028\u0055\u0027\u007A\u0062\u0065\u006B\u0069\u0073\u0074\u006F\u006E\u0020\u0052\u0065\u0073\u0070\u0075\u0062\u006C\u0069\u006B\u0061\u0073\u0069\u0029", false, 0x00F7, "UZ", "UZB", "\u0055\u007A\u0062\u0065\u006B\u0069\u0073\u0074\u0061\u006E", "\u0055\u0027\u007A\u0062\u0065\u006B\u0069\u0073\u0074\u006F\u006E\u0020\u0052\u0065\u0073\u0070\u0075\u0062\u006C\u0069\u006B\u0061\u0073\u0069", "\u0055\u005A\u0053", "\u0055\u007A\u0062\u0065\u006B\u0069\u0073\u0074\u0061\u006E\u0020\u0053\u0075\u006D", "\u0440\u0443\u0431\u043B\u044C", true, 2, 1, 0, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002C", "\u00A0", "\u0073\u0075\u0027\u006D", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0047\u0072\u0069\u0067\u006F\u0072\u0069\u0061\u006E\u0073\u006B\u0069", 1, 0, "\u002F", "\u003A", "", "", "\u0064\u0064\u002F\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D", "\u0079\u0079\u0079\u0079\u0020\'\u0079\u0069\u006C\'\u0020\u0064\u002D\u004D\u004D\u004D\u004D", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u002D\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0079\u0079\u0079\u0079\u0020\'\u0079\u0069\u006C\'\u0020\u0064\u002D\u004D\u004D\u004D\u004D", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0079\u0061\u006B\u002E", "\u0064\u0073\u0068\u002E", "\u0073\u0065\u0073\u0068\u002E", "\u0063\u0068\u0072\u002E", "\u0070\u0073\u0068\u002E", "\u006A\u006D\u002E", "\u0073\u0068\u002E" ], [ "\u0079\u0061\u006B\u0073\u0068\u0061\u006E\u0062\u0061", "\u0064\u0075\u0073\u0068\u0061\u006E\u0062\u0061", "\u0073\u0065\u0073\u0068\u0061\u006E\u0062\u0061", "\u0063\u0068\u006F\u0072\u0073\u0068\u0061\u006E\u0062\u0061", "\u0070\u0061\u0079\u0073\u0068\u0061\u006E\u0062\u0061", "\u006A\u0075\u006D\u0061", "\u0073\u0068\u0061\u006E\u0062\u0061" ], [ "\u0079\u0061\u006E\u0076\u0061\u0072", "\u0066\u0065\u0076\u0072\u0061\u006C", "\u006D\u0061\u0072\u0074", "\u0061\u0070\u0072\u0065\u006C", "\u006D\u0061\u0079", "\u0069\u0079\u0075\u006E", "\u0069\u0079\u0075\u006C", "\u0061\u0076\u0067\u0075\u0073\u0074", "\u0073\u0065\u006E\u0074\u0079\u0061\u0062\u0072", "\u006F\u006B\u0074\u0079\u0061\u0062\u0072", "\u006E\u006F\u0079\u0061\u0062\u0072", "\u0064\u0065\u006B\u0061\u0062\u0072", "" ], [ "\u0079\u0061\u006E\u0076\u0061\u0072", "\u0066\u0065\u0076\u0072\u0061\u006C", "\u006D\u0061\u0072\u0074", "\u0061\u0070\u0072\u0065\u006C", "\u006D\u0061\u0079", "\u0069\u0079\u0075\u006E", "\u0069\u0079\u0075\u006C", "\u0061\u0076\u0067\u0075\u0073\u0074", "\u0073\u0065\u006E\u0074\u0079\u0061\u0062\u0072", "\u006F\u006B\u0074\u0079\u0061\u0062\u0072", "\u006E\u006F\u0079\u0061\u0062\u0072", "\u0064\u0065\u006B\u0061\u0062\u0072", "" ] }, +{ 0x0444, 0x0044, "tt-RU", "tt", "tat", "tt-RU", "\u0054\u0061\u0074\u0061\u0072\u0020\u0028\u0052\u0075\u0073\u0073\u0069\u0061\u0029", "\u0422\u0430\u0442\u0430\u0440\u0020\u0028\u0420\u043E\u0441\u0441\u0438\u044F\u0029", false, 0x00CB, "RU", "RUS", "\u0052\u0075\u0073\u0073\u0069\u0061", "\u0420\u043E\u0441\u0441\u0438\u044F", "\u0052\u0055\u0052", "\u0052\u0075\u0073\u0073\u0069\u0061\u006E\u0020\u0052\u0075\u0062\u006C\u0065", "\u0440\u0443\u0431\u043B\u044C", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002C", "\u00A0", "\u0440\u002E", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0413\u0440\u0438\u0433\u043E\u0440\u0438\u0430\u043D\u00A0\u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u0435", 1, 0, "\u002E", "\u003A", "", "", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u042F\u043A\u0448", "\u0414\u04AF\u0448", "\u0421\u0438\u0448", "\u0427\u04D9\u0440\u0448", "\u041F\u04D9\u043D\u0497", "\u0496\u043E\u043C", "\u0428\u0438\u043C" ], [ "\u042F\u043A\u0448\u04D9\u043C\u0431\u0435", "\u0414\u04AF\u0448\u04D9\u043C\u0431\u0435", "\u0421\u0438\u0448\u04D9\u043C\u0431\u0435", "\u0427\u04D9\u0440\u0448\u04D9\u043C\u0431\u0435", "\u041F\u04D9\u043D\u0497\u0435\u0448\u04D9\u043C\u0431\u0435", "\u0496\u043E\u043C\u0433\u0430", "\u0428\u0438\u043C\u0431\u04D9" ], [ "\u0413\u044B\u0439\u043D\u0432", "\u0424\u0435\u0432", "\u041C\u0430\u0440", "\u0410\u043F\u0440", "\u041C\u0430\u0439", "\u0418\u044E\u043D", "\u0418\u044E\u043B", "\u0410\u0432\u0433", "\u0421\u0435\u043D", "\u041E\u043A\u0442", "\u041D\u043E\u044F", "\u0414\u0435\u043A", "" ], [ "\u0413\u044B\u0439\u043D\u0432\u0430\u0440\u044C", "\u0424\u0435\u0432\u0440\u0430\u043B\u044C", "\u041C\u0430\u0440\u0442", "\u0410\u043F\u0440\u0435\u043B\u044C", "\u041C\u0430\u0439", "\u0418\u044E\u043D\u044C", "\u0418\u044E\u043B\u044C", "\u0410\u0432\u0433\u0443\u0441\u0442", "\u0421\u0435\u043D\u0442\u044F\u0431\u0440\u044C", "\u041E\u043A\u0442\u044F\u0431\u0440\u044C", "\u041D\u043E\u044F\u0431\u0440\u044C", "\u0414\u0435\u043A\u0430\u0431\u0440\u044C", "" ] }, +{ 0x0446, 0x0046, "pa-IN", "pa", "pan", "pa-IN", "\u0050\u0075\u006E\u006A\u0061\u0062\u0069\u0020\u0028\u0049\u006E\u0064\u0069\u0061\u0029", "\u0A2A\u0A70\u0A1C\u0A3E\u0A2C\u0A40\u0020\u0028\u0A2D\u0A3E\u0A30\u0A24\u0029", false, 0x0071, "IN", "IND", "\u0049\u006E\u0064\u0069\u0061", "\u0A2D\u0A3E\u0A30\u0A24", "\u0049\u004E\u0052", "\u0049\u006E\u0064\u0069\u0061\u006E\u0020\u0052\u0075\u0070\u0065\u0065", "\u0A30\u0A41\u0A2A\u0A3F\u0A06", true, 2, 1, 2, 12, 2, [ 3, 2 ], [ 3, 2 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0A30\u0A41", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0A66", "\u0A67", "\u0A68", "\u0A69", "\u0A6A", "\u0A6B", "\u0A6C", "\u0A6D", "\u0A6E", "\u0A6F" ], 1, [ 1 ], "\u0A05\u0A70\u0A17\u0A4D\u0A30\u0A47\u0A5B\u0A40\u00A0\u0A15\u0A32\u0A70\u0A21\u0A30", 1, 0, "\u002D", "\u003A", "\u0A38\u0A35\u0A47\u0A30\u0A47", "\u0A36\u0A3E\u0A2E", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0074\u0074\u0020\u0068\u0068\u003A\u006D\u006D", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079\u0020\u0064\u0064\u0064\u0064", "\u0074\u0074\u0020\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0074\u0074\u0020\u0068\u0068\u003A\u006D\u006D", "\u0074\u0074\u0020\u0068\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0064\u002D\u004D\u002D\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0074\u0074\u0020\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073", "\u0074\u0074\u0020\u0068\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079\u0020\u0064\u0064\u0064\u0064", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0A10\u0A24\u002E", "\u0A38\u0A4B\u0A2E\u002E", "\u0A2E\u0A70\u0A17\u0A32\u002E", "\u0A2C\u0A41\u0A27\u002E", "\u0A35\u0A40\u0A30\u002E", "\u0A36\u0A41\u0A15\u0A30\u002E", "\u0A36\u0A28\u0A40\u002E" ], [ "\u0A10\u0A24\u0A35\u0A3E\u0A30", "\u0A38\u0A4B\u0A2E\u0A35\u0A3E\u0A30", "\u0A2E\u0A70\u0A17\u0A32\u0A35\u0A3E\u0A30", "\u0A2C\u0A41\u0A27\u0A35\u0A3E\u0A30", "\u0A35\u0A40\u0A30\u0A35\u0A3E\u0A30", "\u0A36\u0A41\u0A71\u0A15\u0A30\u0A35\u0A3E\u0A30", "\u0A36\u0A28\u0A40\u0A1A\u0A30\u0A35\u0A3E\u0A30" ], [ "\u0A1C\u0A28\u0A35\u0A30\u0A40", "\u0A5E\u0A30\u0A35\u0A30\u0A40", "\u0A2E\u0A3E\u0A30\u0A1A", "\u0A05\u0A2A\u0A4D\u0A30\u0A48\u0A32", "\u0A2E\u0A08", "\u0A1C\u0A42\u0A28", "\u0A1C\u0A41\u0A32\u0A3E\u0A08", "\u0A05\u0A17\u0A38\u0A24", "\u0A38\u0A24\u0A70\u0A2C\u0A30", "\u0A05\u0A15\u0A24\u0A42\u0A2C\u0A30", "\u0A28\u0A35\u0A70\u0A2C\u0A30", "\u0A26\u0A38\u0A70\u0A2C\u0A30", "" ], [ "\u0A1C\u0A28\u0A35\u0A30\u0A40", "\u0A5E\u0A30\u0A35\u0A30\u0A40", "\u0A2E\u0A3E\u0A30\u0A1A", "\u0A05\u0A2A\u0A4D\u0A30\u0A48\u0A32", "\u0A2E\u0A08", "\u0A1C\u0A42\u0A28", "\u0A1C\u0A41\u0A32\u0A3E\u0A08", "\u0A05\u0A17\u0A38\u0A24", "\u0A38\u0A24\u0A70\u0A2C\u0A30", "\u0A05\u0A15\u0A24\u0A42\u0A2C\u0A30", "\u0A28\u0A35\u0A70\u0A2C\u0A30", "\u0A26\u0A38\u0A70\u0A2C\u0A30", "" ] }, +{ 0x0447, 0x0047, "gu-IN", "gu", "guj", "gu-IN", "\u0047\u0075\u006A\u0061\u0072\u0061\u0074\u0069\u0020\u0028\u0049\u006E\u0064\u0069\u0061\u0029", "\u0A97\u0AC1\u0A9C\u0AB0\u0ABE\u0AA4\u0AC0\u0020\u0028\u0AAD\u0ABE\u0AB0\u0AA4\u0029", false, 0x0071, "IN", "IND", "\u0049\u006E\u0064\u0069\u0061", "\u0AAD\u0ABE\u0AB0\u0AA4", "\u0049\u004E\u0052", "\u0049\u006E\u0064\u0069\u0061\u006E\u0020\u0052\u0075\u0070\u0065\u0065", "\u0AB0\u0AC2\u0AAA\u0ABF\u0AAF\u0ACB", true, 2, 1, 2, 12, 2, [ 3, 2 ], [ 3, 2 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0AB0\u0AC2", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0AE6", "\u0AE7", "\u0AE8", "\u0AE9", "\u0AEA", "\u0AEB", "\u0AEC", "\u0AED", "\u0AEE", "\u0AEF" ], 1, [ 1 ], "\u0A85\u0A82\u0A97\u0ACD\u0AB0\u0AC7\u0A9C\u0AC0\u00A0\u0A95\u0AC5\u0AB2\u0AC7\u0AA8\u0ACD\u0AA1\u0AB0", 1, 0, "\u002D", "\u003A", "\u0AAA\u0AC2\u0AB0\u0ACD\u0AB5\u00A0\u0AAE\u0AA7\u0ACD\u0AAF\u0ABE\u0AB9\u0ACD\u0AA8", "\u0A89\u0AA4\u0ACD\u0AA4\u0AB0\u00A0\u0AAE\u0AA7\u0ACD\u0AAF\u0ABE\u0AB9\u0ACD\u0AA8", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D", "\u0074\u0074\u0020\u0068\u0068\u003A\u006D\u006D", "\u0074\u0074\u0020\u0068\u003A\u006D\u006D" ], [ "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0064\u002D\u004D\u002D\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0074\u0074\u0020\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073", "\u0074\u0074\u0020\u0068\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0AB0\u0AB5\u0ABF", "\u0AB8\u0ACB\u0AAE", "\u0AAE\u0A82\u0A97\u0AB3", "\u0AAC\u0AC1\u0AA7", "\u0A97\u0AC1\u0AB0\u0AC1", "\u0AB6\u0AC1\u0A95\u0ACD\u0AB0", "\u0AB6\u0AA8\u0ABF" ], [ "\u0AB0\u0AB5\u0ABF\u0AB5\u0ABE\u0AB0", "\u0AB8\u0ACB\u0AAE\u0AB5\u0ABE\u0AB0", "\u0AAE\u0A82\u0A97\u0AB3\u0AB5\u0ABE\u0AB0", "\u0AAC\u0AC1\u0AA7\u0AB5\u0ABE\u0AB0", "\u0A97\u0AC1\u0AB0\u0AC1\u0AB5\u0ABE\u0AB0", "\u0AB6\u0AC1\u0A95\u0ACD\u0AB0\u0AB5\u0ABE\u0AB0", "\u0AB6\u0AA8\u0ABF\u0AB5\u0ABE\u0AB0" ], [ "\u0A9C\u0ABE\u0AA8\u0ACD\u0AAF\u0AC1", "\u0AAB\u0AC7\u0AAC\u0ACD\u0AB0\u0AC1", "\u0AAE\u0ABE\u0AB0\u0ACD\u0A9A", "\u0A8F\u0AAA\u0ACD\u0AB0\u0ABF\u0AB2", "\u0AAE\u0AC7", "\u0A9C\u0AC2\u0AA8", "\u0A9C\u0AC1\u0AB2\u0ABE\u0A88", "\u0A91\u0A97\u0AB8\u0ACD\u0A9F", "\u0AB8\u0AAA\u0ACD\u0A9F\u0AC7", "\u0A91\u0A95\u0ACD\u0A9F\u0ACB", "\u0AA8\u0AB5\u0AC7", "\u0AA1\u0ABF\u0AB8\u0AC7", "" ], [ "\u0A9C\u0ABE\u0AA8\u0ACD\u0AAF\u0AC1\u0A86\u0AB0\u0AC0", "\u0AAB\u0AC7\u0AAC\u0ACD\u0AB0\u0AC1\u0A86\u0AB0\u0AC0", "\u0AAE\u0ABE\u0AB0\u0ACD\u0A9A", "\u0A8F\u0AAA\u0ACD\u0AB0\u0ABF\u0AB2", "\u0AAE\u0AC7", "\u0A9C\u0AC2\u0AA8", "\u0A9C\u0AC1\u0AB2\u0ABE\u0A88", "\u0A91\u0A97\u0AB8\u0ACD\u0A9F", "\u0AB8\u0AAA\u0ACD\u0A9F\u0AC7\u0AAE\u0ACD\u0AAC\u0AB0", "\u0A91\u0A95\u0ACD\u0A9F\u0ACD\u0AAC\u0AB0", "\u0AA8\u0AB5\u0AC7\u0AAE\u0ACD\u0AAC\u0AB0", "\u0AA1\u0ABF\u0AB8\u0AC7\u0AAE\u0ACD\u0AAC\u0AB0", "" ] }, +{ 0x0449, 0x0049, "ta-IN", "ta", "tam", "ta-IN", "\u0054\u0061\u006D\u0069\u006C\u0020\u0028\u0049\u006E\u0064\u0069\u0061\u0029", "\u0BA4\u0BAE\u0BBF\u0BB4\u0BCD\u0020\u0028\u0B87\u0BA8\u0BCD\u0BA4\u0BBF\u0BAF\u0BBE\u0029", false, 0x0071, "IN", "IND", "\u0049\u006E\u0064\u0069\u0061", "\u0B87\u0BA8\u0BCD\u0BA4\u0BBF\u0BAF\u0BBE", "\u0049\u004E\u0052", "\u0049\u006E\u0064\u0069\u0061\u006E\u0020\u0052\u0075\u0070\u0065\u0065", "\u0BB0\u0BC2\u0BAA\u0BBE\u0BAF\u0BCD", true, 2, 1, 2, 12, 2, [ 3, 2 ], [ 3, 2 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0BB0\u0BC2", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0B86\u0B99\u0BCD\u0B95\u0BBF\u0BB2\u00A0\u0BB5\u0BB0\u0BC1\u0B9F\u0BAE\u0BCD", 1, 0, "\u002D", "\u003A", "\u0B95\u0BBE\u0BB2\u0BC8", "\u0BAE\u0BBE\u0BB2\u0BC8", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D", "\u0074\u0074\u0020\u0068\u0068\u003A\u006D\u006D", "\u0074\u0074\u0020\u0068\u003A\u006D\u006D" ], [ "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0064\u002D\u004D\u002D\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0074\u0074\u0020\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073", "\u0074\u0074\u0020\u0068\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0B9E\u0BBE", "\u0BA4\u0BBF", "\u0B9A\u0BC6", "\u0BAA\u0BC1", "\u0BB5\u0BBF", "\u0BB5\u0BC6", "\u0B9A" ], [ "\u0B9E\u0BBE\u0BAF\u0BBF\u0BB1\u0BC1", "\u0BA4\u0BBF\u0B99\u0BCD\u0B95\u0BB3\u0BCD", "\u0B9A\u0BC6\u0BB5\u0BCD\u0BB5\u0BBE\u0BAF\u0BCD", "\u0BAA\u0BC1\u0BA4\u0BA9\u0BCD", "\u0BB5\u0BBF\u0BAF\u0BBE\u0BB4\u0BA9\u0BCD", "\u0BB5\u0BC6\u0BB3\u0BCD\u0BB3\u0BBF", "\u0B9A\u0BA9\u0BBF" ], [ "\u0B9C\u0BA9\u002E", "\u0BAA\u0BC6\u0BAA\u0BCD\u002E", "\u0BAE\u0BBE\u0BB0\u0BCD\u002E", "\u0B8F\u0BAA\u0BCD\u002E", "\u0BAE\u0BC7", "\u0B9C\u0BC2\u0BA9\u0BCD", "\u0B9C\u0BC2\u0BB2\u0BC8", "\u0B86\u0B95\u002E", "\u0B9A\u0BC6\u0BAA\u0BCD\u002E", "\u0B85\u0B95\u0BCD\u002E", "\u0BA8\u0BB5\u002E", "\u0B9F\u0BBF\u0B9A\u002E", "" ], [ "\u0B9C\u0BA9\u0BB5\u0BB0\u0BBF", "\u0BAA\u0BC6\u0BAA\u0BCD\u0BB0\u0BB5\u0BB0\u0BBF", "\u0BAE\u0BBE\u0BB0\u0BCD\u0B9A\u0BCD", "\u0B8F\u0BAA\u0BCD\u0BB0\u0BB2\u0BCD", "\u0BAE\u0BC7", "\u0B9C\u0BC2\u0BA9\u0BCD", "\u0B9C\u0BC2\u0BB2\u0BC8", "\u0B86\u0B95\u0BB8\u0BCD\u0B9F\u0BCD", "\u0B9A\u0BC6\u0BAA\u0BCD\u0B9F\u0BAE\u0BCD\u0BAA\u0BB0\u0BCD", "\u0B85\u0B95\u0BCD\u0B9F\u0BCB\u0BAA\u0BB0\u0BCD", "\u0BA8\u0BB5\u0BAE\u0BCD\u0BAA\u0BB0\u0BCD", "\u0B9F\u0BBF\u0B9A\u0BAE\u0BCD\u0BAA\u0BB0\u0BCD", "" ] }, +{ 0x044A, 0x004A, "te-IN", "te", "tel", "te-IN", "\u0054\u0065\u006C\u0075\u0067\u0075\u0020\u0028\u0049\u006E\u0064\u0069\u0061\u0029", "\u0C24\u0C46\u0C32\u0C41\u0C17\u0C41\u0020\u0028\u0C2D\u0C3E\u0C30\u0C24\u00A0\u0C26\u0C47\u0C36\u0C02\u0029", false, 0x0071, "IN", "IND", "\u0049\u006E\u0064\u0069\u0061", "\u0C2D\u0C3E\u0C30\u0C24\u00A0\u0C26\u0C47\u0C36\u0C02", "\u0049\u004E\u0052", "\u0049\u006E\u0064\u0069\u0061\u006E\u0020\u0052\u0075\u0070\u0065\u0065", "\u0C30\u0C42\u0C2A\u0C3E\u0C2F\u0C3F", true, 2, 1, 2, 12, 2, [ 3, 2 ], [ 3, 2 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0C30\u0C42", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0C66", "\u0C67", "\u0C68", "\u0C69", "\u0C6A", "\u0C6B", "\u0C6C", "\u0C6D", "\u0C6E", "\u0C6F" ], 1, [ 1 ], "\u0C07\u0C02\u0C17\u0C4D\u0C32\u0C40\u0C37\u0C41\u00A0\u0C15\u0C4D\u0C2F\u0C3E\u0C32\u0C02\u0C21\u0C30\u0C4D", 1, 0, "\u002D", "\u003A", "\u0C2A\u0C42\u0C30\u0C4D\u0C35\u0C3E\u0C39\u0C4D\u0C28", "\u0C05\u0C2A\u0C30\u0C3E\u0C39\u0C4D\u0C28", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D", "\u0074\u0074\u0020\u0068\u0068\u003A\u006D\u006D", "\u0074\u0074\u0020\u0068\u003A\u006D\u006D" ], [ "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0064\u002D\u004D\u002D\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0074\u0074\u0020\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073", "\u0074\u0074\u0020\u0068\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0C06\u0C26\u0C3F\u002E", "\u0C38\u0C4B\u0C2E\u002E", "\u0C2E\u0C02\u0C17\u0C33\u002E", "\u0C2C\u0C41\u0C27\u002E", "\u0C17\u0C41\u0C30\u0C41\u002E", "\u0C36\u0C41\u0C15\u0C4D\u0C30\u002E", "\u0C36\u0C28\u0C3F\u002E" ], [ "\u0C06\u0C26\u0C3F\u0C35\u0C3E\u0C30\u0C02", "\u0C38\u0C4B\u0C2E\u0C35\u0C3E\u0C30\u0C02", "\u0C2E\u0C02\u0C17\u0C33\u0C35\u0C3E\u0C30\u0C02", "\u0C2C\u0C41\u0C27\u0C35\u0C3E\u0C30\u0C02", "\u0C17\u0C41\u0C30\u0C41\u0C35\u0C3E\u0C30\u0C02", "\u0C36\u0C41\u0C15\u0C4D\u0C30\u0C35\u0C3E\u0C30\u0C02", "\u0C36\u0C28\u0C3F\u0C35\u0C3E\u0C30\u0C02" ], [ "\u0C1C\u0C28\u0C35\u0C30\u0C3F", "\u0C2B\u0C3F\u0C2C\u0C4D\u0C30\u0C35\u0C30\u0C3F", "\u0C2E\u0C3E\u0C30\u0C4D\u0C1A\u0C3F", "\u0C0F\u0C2A\u0C4D\u0C30\u0C3F\u0C32\u0C4D", "\u0C2E\u0C47", "\u0C1C\u0C42\u0C28\u0C4D", "\u0C1C\u0C42\u0C32\u0C48", "\u0C06\u0C17\u0C38\u0C4D\u0C1F\u0C41", "\u0C38\u0C46\u0C2A\u0C4D\u0C1F\u0C46\u0C02\u0C2C\u0C30\u0C4D", "\u0C05\u0C15\u0C4D\u0C1F\u0C4B\u0C2C\u0C30\u0C4D", "\u0C28\u0C35\u0C02\u0C2C\u0C30\u0C4D", "\u0C21\u0C3F\u0C38\u0C46\u0C02\u0C2C\u0C30\u0C4D", "" ], [ "\u0C1C\u0C28\u0C35\u0C30\u0C3F", "\u0C2B\u0C3F\u0C2C\u0C4D\u0C30\u0C35\u0C30\u0C3F", "\u0C2E\u0C3E\u0C30\u0C4D\u0C1A\u0C3F", "\u0C0F\u0C2A\u0C4D\u0C30\u0C3F\u0C32\u0C4D", "\u0C2E\u0C47", "\u0C1C\u0C42\u0C28\u0C4D", "\u0C1C\u0C42\u0C32\u0C48", "\u0C06\u0C17\u0C38\u0C4D\u0C1F\u0C41", "\u0C38\u0C46\u0C2A\u0C4D\u0C1F\u0C46\u0C02\u0C2C\u0C30\u0C4D", "\u0C05\u0C15\u0C4D\u0C1F\u0C4B\u0C2C\u0C30\u0C4D", "\u0C28\u0C35\u0C02\u0C2C\u0C30\u0C4D", "\u0C21\u0C3F\u0C38\u0C46\u0C02\u0C2C\u0C30\u0C4D", "" ] }, +{ 0x044B, 0x004B, "kn-IN", "kn", "kan", "kn-IN", "\u004B\u0061\u006E\u006E\u0061\u0064\u0061\u0020\u0028\u0049\u006E\u0064\u0069\u0061\u0029", "\u0C95\u0CA8\u0CCD\u0CA8\u0CA1\u0020\u0028\u0CAD\u0CBE\u0CB0\u0CA4\u0029", false, 0x0071, "IN", "IND", "\u0049\u006E\u0064\u0069\u0061", "\u0CAD\u0CBE\u0CB0\u0CA4", "\u0049\u004E\u0052", "\u0049\u006E\u0064\u0069\u0061\u006E\u0020\u0052\u0075\u0070\u0065\u0065", "\u0CB0\u0CC2\u0CAA\u0CBE\u0CAF\u0CBF", true, 2, 1, 2, 12, 2, [ 3, 2 ], [ 3, 2 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0CB0\u0CC2", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0CE6", "\u0CE7", "\u0CE8", "\u0CE9", "\u0CEA", "\u0CEB", "\u0CEC", "\u0CED", "\u0CEE", "\u0CEF" ], 1, [ 1 ], "\u0C87\u0C82\u0C97\u0CCD\u0CB2\u0CBF\u0CB7\u0CCD\u00A0\u0C95\u0CCD\u0CAF\u0CBE\u0CB2\u0CC6\u0C82\u0CA1\u0CB0\u0CCD", 1, 0, "\u002D", "\u003A", "\u0CAA\u0CC2\u0CB0\u0CCD\u0CB5\u0CBE\u0CB9\u0CCD\u0CA8", "\u0C85\u0CAA\u0CB0\u0CBE\u0CB9\u0CCD\u0CA8", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D", "\u0074\u0074\u0020\u0068\u0068\u003A\u006D\u006D", "\u0074\u0074\u0020\u0068\u003A\u006D\u006D" ], [ "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0064\u002D\u004D\u002D\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0074\u0074\u0020\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073", "\u0074\u0074\u0020\u0068\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0CAD\u0CBE\u0CA8\u0CC1\u002E", "\u0CB8\u0CCB\u0CAE\u002E", "\u0CAE\u0C82\u0C97\u0CB3\u002E", "\u0CAC\u0CC1\u0CA7\u002E", "\u0C97\u0CC1\u0CB0\u0CC1\u002E", "\u0CB6\u0CC1\u0C95\u0CCD\u0CB0\u002E", "\u0CB6\u0CA8\u0CBF\u002E" ], [ "\u0CAD\u0CBE\u0CA8\u0CC1\u0CB5\u0CBE\u0CB0", "\u0CB8\u0CCB\u0CAE\u0CB5\u0CBE\u0CB0", "\u0CAE\u0C82\u0C97\u0CB3\u0CB5\u0CBE\u0CB0", "\u0CAC\u0CC1\u0CA7\u0CB5\u0CBE\u0CB0", "\u0C97\u0CC1\u0CB0\u0CC1\u0CB5\u0CBE\u0CB0", "\u0CB6\u0CC1\u0C95\u0CCD\u0CB0\u0CB5\u0CBE\u0CB0", "\u0CB6\u0CA8\u0CBF\u0CB5\u0CBE\u0CB0" ], [ "\u0C9C\u0CA8\u0CB5\u0CB0\u0CBF", "\u0CAB\u0CC6\u0CAC\u0CCD\u0CB0\u0CB5\u0CB0\u0CBF", "\u0CAE\u0CBE\u0CB0\u0CCD\u0C9A\u0CCD", "\u0C8E\u0CAA\u0CCD\u0CB0\u0CBF\u0CB2\u0CCD", "\u0CAE\u0CC7", "\u0C9C\u0CC2\u0CA8\u0CCD", "\u0C9C\u0CC1\u0CB2\u0CC8", "\u0C86\u0C97\u0CB8\u0CCD\u0C9F\u0CCD", "\u0CB8\u0CC6\u0CAA\u0CCD\u0C9F\u0C82\u0CAC\u0CB0\u0CCD", "\u0C85\u0C95\u0CCD\u0C9F\u0CCB\u0CAC\u0CB0\u0CCD", "\u0CA8\u0CB5\u0CC6\u0C82\u0CAC\u0CB0\u0CCD", "\u0CA1\u0CBF\u0CB8\u0CC6\u0C82\u0CAC\u0CB0\u0CCD", "" ], [ "\u0C9C\u0CA8\u0CB5\u0CB0\u0CBF", "\u0CAB\u0CC6\u0CAC\u0CCD\u0CB0\u0CB5\u0CB0\u0CBF", "\u0CAE\u0CBE\u0CB0\u0CCD\u0C9A\u0CCD", "\u0C8E\u0CAA\u0CCD\u0CB0\u0CBF\u0CB2\u0CCD", "\u0CAE\u0CC7", "\u0C9C\u0CC2\u0CA8\u0CCD", "\u0C9C\u0CC1\u0CB2\u0CC8", "\u0C86\u0C97\u0CB8\u0CCD\u0C9F\u0CCD", "\u0CB8\u0CC6\u0CAA\u0CCD\u0C9F\u0C82\u0CAC\u0CB0\u0CCD", "\u0C85\u0C95\u0CCD\u0C9F\u0CCB\u0CAC\u0CB0\u0CCD", "\u0CA8\u0CB5\u0CC6\u0C82\u0CAC\u0CB0\u0CCD", "\u0CA1\u0CBF\u0CB8\u0CC6\u0C82\u0CAC\u0CB0\u0CCD", "" ] }, +{ 0x044E, 0x004E, "mr-IN", "mr", "mar", "mr-IN", "\u004D\u0061\u0072\u0061\u0074\u0068\u0069\u0020\u0028\u0049\u006E\u0064\u0069\u0061\u0029", "\u092E\u0930\u093E\u0920\u0940\u0020\u0028\u092D\u093E\u0930\u0924\u0029", false, 0x0071, "IN", "IND", "\u0049\u006E\u0064\u0069\u0061", "\u092D\u093E\u0930\u0924", "\u0049\u004E\u0052", "\u0049\u006E\u0064\u0069\u0061\u006E\u0020\u0052\u0075\u0070\u0065\u0065", "\u0930\u0941\u092A\u092F\u093E", true, 2, 1, 2, 12, 2, [ 3, 2 ], [ 3, 2 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0930\u0941", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0966", "\u0967", "\u0968", "\u0969", "\u096A", "\u096B", "\u096C", "\u096D", "\u096E", "\u096F" ], 1, [ 1 ], "\u0907\u0902\u0917\u094D\u0930\u091C\u0940\u00A0\u0915\u0945\u0932\u0947\u0928\u094D\u0921\u0930", 1, 0, "\u002D", "\u003A", "\u092E\u002E\u092A\u0942\u002E", "\u092E\u002E\u0928\u0902\u002E", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D", "\u0074\u0074\u0020\u0068\u0068\u003A\u006D\u006D", "\u0074\u0074\u0020\u0068\u003A\u006D\u006D" ], [ "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0064\u002D\u004D\u002D\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0074\u0074\u0020\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073", "\u0074\u0074\u0020\u0068\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0930\u0935\u093F\u002E", "\u0938\u094B\u092E\u002E", "\u092E\u0902\u0917\u0933\u002E", "\u092C\u0941\u0927\u002E", "\u0917\u0941\u0930\u0941\u002E", "\u0936\u0941\u0915\u094D\u0930\u002E", "\u0936\u0928\u093F\u002E" ], [ "\u0930\u0935\u093F\u0935\u093E\u0930", "\u0938\u094B\u092E\u0935\u093E\u0930", "\u092E\u0902\u0917\u0933\u0935\u093E\u0930", "\u092C\u0941\u0927\u0935\u093E\u0930", "\u0917\u0941\u0930\u0941\u0935\u093E\u0930", "\u0936\u0941\u0915\u094D\u0930\u0935\u093E\u0930", "\u0936\u0928\u093F\u0935\u093E\u0930" ], [ "\u091C\u093E\u0928\u0947\u002E", "\u092B\u0947\u092C\u094D\u0930\u0941\u002E", "\u092E\u093E\u0930\u094D\u091A", "\u090F\u092A\u094D\u0930\u093F\u0932", "\u092E\u0947", "\u091C\u0942\u0928", "\u091C\u0941\u0932\u0948", "\u0911\u0917\u0938\u094D\u091F", "\u0938\u092A\u094D\u091F\u0947\u0902\u002E", "\u0911\u0915\u094D\u091F\u094B\u002E", "\u0928\u094B\u0935\u094D\u0939\u0947\u0902\u002E", "\u0921\u093F\u0938\u0947\u0902\u002E", "" ], [ "\u091C\u093E\u0928\u0947\u0935\u093E\u0930\u0940", "\u092B\u0947\u092C\u094D\u0930\u0941\u0935\u093E\u0930\u0940", "\u092E\u093E\u0930\u094D\u091A", "\u090F\u092A\u094D\u0930\u093F\u0932", "\u092E\u0947", "\u091C\u0942\u0928", "\u091C\u0941\u0932\u0948", "\u0911\u0917\u0938\u094D\u091F", "\u0938\u092A\u094D\u091F\u0947\u0902\u092C\u0930", "\u0911\u0915\u094D\u091F\u094B\u092C\u0930", "\u0928\u094B\u0935\u094D\u0939\u0947\u0902\u092C\u0930", "\u0921\u093F\u0938\u0947\u0902\u092C\u0930", "" ] }, +{ 0x044F, 0x004F, "sa-IN", "sa", "san", "sa-IN", "\u0053\u0061\u006E\u0073\u006B\u0072\u0069\u0074\u0020\u0028\u0049\u006E\u0064\u0069\u0061\u0029", "\u0938\u0902\u0938\u094D\u0915\u0943\u0924\u0020\u0028\u092D\u093E\u0930\u0924\u092E\u094D\u0029", false, 0x0071, "IN", "IND", "\u0049\u006E\u0064\u0069\u0061", "\u092D\u093E\u0930\u0924\u092E\u094D", "\u0049\u004E\u0052", "\u0049\u006E\u0064\u0069\u0061\u006E\u0020\u0052\u0075\u0070\u0065\u0065", "\u0930\u0941\u094D\u092F\u0915\u092E\u094D", true, 2, 1, 2, 12, 2, [ 3, 2 ], [ 3, 2 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0930\u0941", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0966", "\u0967", "\u0968", "\u0969", "\u096A", "\u096B", "\u096C", "\u096D", "\u096E", "\u096F" ], 1, [ 1 ], "\u0916\u094D\u0930\u093F\u0938\u094D\u0924\u093E\u092C\u094D\u0926\u00A0\u092A\u091E\u094D\u091C\u093F\u0915\u093E", 0, 0, "\u002D", "\u003A", "\u092A\u0942\u0930\u094D\u0935\u093E\u0939\u094D\u0928", "\u0905\u092A\u0930\u093E\u0939\u094D\u0928", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079\u0020\u0064\u0064\u0064\u0064", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D", "\u0074\u0074\u0020\u0068\u0068\u003A\u006D\u006D", "\u0074\u0074\u0020\u0068\u003A\u006D\u006D" ], [ "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0064\u002D\u004D\u002D\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0074\u0074\u0020\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073", "\u0074\u0074\u0020\u0068\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079\u0020\u0064\u0064\u0064\u0064", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0930\u0935\u093F\u0935\u093E\u0938\u0930\u0903", "\u0938\u094B\u092E\u0935\u093E\u0938\u0930\u0903", "\u092E\u0919\u094D\u0917\u0932\u0935\u093E\u0938\u0930\u0903", "\u092C\u0941\u0927\u0935\u093E\u0938\u0930\u0903", "\u0917\u0941\u0930\u0941\u0935\u093E\u0938\u0930\u0903", "\u0936\u0941\u0915\u094D\u0930\u0935\u093E\u0938\u0930\u0903", "\u0936\u0928\u093F\u0935\u093E\u0938\u0930\u0903" ], [ "\u0930\u0935\u093F\u0935\u093E\u0938\u0930\u0903", "\u0938\u094B\u092E\u0935\u093E\u0938\u0930\u0903", "\u092E\u0919\u094D\u0917\u0932\u0935\u093E\u0938\u0930\u0903", "\u092C\u0941\u0927\u0935\u093E\u0938\u0930\u0903", "\u0917\u0941\u0930\u0941\u0935\u093E\u0938\u0930\u0903", "\u0936\u0941\u0915\u094D\u0930\u0935\u093E\u0938\u0930\u0903", "\u0936\u0928\u093F\u0935\u093E\u0938\u0930\u0903" ], [ "\u091C\u0928\u0935\u0930\u0940", "\u092B\u0930\u0935\u0930\u0940", "\u092E\u093E\u0930\u094D\u091A", "\u0905\u092A\u094D\u0930\u0948\u0932", "\u092E\u0908", "\u091C\u0942\u0928", "\u091C\u0941\u0932\u093E\u0908", "\u0905\u0917\u0938\u094D\u0924", "\u0938\u093F\u0924\u092E\u094D\u092C\u0930", "\u0905\u0915\u094D\u0924\u0942\u092C\u0930", "\u0928\u0935\u092E\u094D\u092C\u0930", "\u0926\u093F\u0938\u092E\u094D\u092C\u0930", "" ], [ "\u091C\u0928\u0935\u0930\u0940", "\u092B\u0930\u0935\u0930\u0940", "\u092E\u093E\u0930\u094D\u091A", "\u0905\u092A\u094D\u0930\u0948\u0932", "\u092E\u0908", "\u091C\u0942\u0928", "\u091C\u0941\u0932\u093E\u0908", "\u0905\u0917\u0938\u094D\u0924", "\u0938\u093F\u0924\u092E\u094D\u092C\u0930", "\u0905\u0915\u094D\u0924\u0942\u092C\u0930", "\u0928\u0935\u092E\u094D\u092C\u0930", "\u0926\u093F\u0938\u092E\u094D\u092C\u0930", "" ] }, +{ 0x0450, 0x0050, "mn-MN", "mn", "mon", "mn-MN", "\u004D\u006F\u006E\u0067\u006F\u006C\u0069\u0061\u006E\u0020\u0028\u0043\u0079\u0072\u0069\u006C\u006C\u0069\u0063\u002C\u0020\u004D\u006F\u006E\u0067\u006F\u006C\u0069\u0061\u0029", "\u041C\u043E\u043D\u0433\u043E\u043B\u00A0\u0445\u044D\u043B\u0020\u0028\u041C\u043E\u043D\u0433\u043E\u043B\u00A0\u0443\u043B\u0441\u0029", false, 0x009A, "MN", "MNG", "\u004D\u006F\u006E\u0067\u006F\u006C\u0069\u0061", "\u041C\u043E\u043D\u0433\u043E\u043B\u00A0\u0443\u043B\u0441", "\u004D\u004E\u0054", "\u0054\u0075\u0067\u0072\u0069\u006B", "\u0422\u04E9\u0433\u0440\u04E9\u0433", true, 2, 1, 2, 5, 1, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002C", "\u00A0", "\u20AE", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0413\u0440\u0435\u0433\u043E\u0440\u0438\u0439\u043D\u00A0\u043E\u043D\u00A0\u0442\u043E\u043E\u043B\u043E\u043B", 1, 0, "\u002E", "\u003A", "", "", "\u0079\u0079\u002E\u004D\u004D\u002E\u0064\u0064", "\u0048\u003A\u006D\u006D", "\u0079\u0079\u0079\u0079\u0020\'\u043E\u043D\u044B\'\u0020\u004D\u004D\u004D\u004D\u0020\u0064", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0020\u004D\u004D\u004D\u004D", "\u0079\u0079\u0079\u0079\u0020\'\u043E\u043D\'\u0020\u004D\u004D\u004D\u004D", [ "\u0048\u003A\u006D\u006D" ], [ "\u0079\u0079\u002E\u004D\u004D\u002E\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0079\u0079\u0079\u0079\u0020\'\u043E\u043D\u044B\'\u0020\u004D\u004D\u004D\u004D\u0020\u0064" ], [ "\u0079\u0079\u0079\u0079\u0020\'\u043E\u043D\'\u0020\u004D\u004D\u004D\u004D" ], [ "\u041D\u044F", "\u0414\u0430", "\u041C\u044F", "\u041B\u0445", "\u041F\u04AF", "\u0411\u0430", "\u0411\u044F" ], [ "\u041D\u044F\u043C", "\u0414\u0430\u0432\u0430\u0430", "\u041C\u044F\u0433\u043C\u0430\u0440", "\u041B\u0445\u0430\u0433\u0432\u0430", "\u041F\u04AF\u0440\u044D\u0432", "\u0411\u0430\u0430\u0441\u0430\u043D", "\u0411\u044F\u043C\u0431\u0430" ], [ "\u0049", "\u0049\u0049", "\u0049\u0049\u0049", "\u0049\u0056", "\u0056", "\u0056\u0049", "\u0056\u0049\u0049", "\u0056\u0428", "\u0049\u0058", "\u0058", "\u0058\u0049", "\u0058\u0049\u0049", "" ], [ "\u0031\u00A0\u0434\u04AF\u0433\u044D\u044D\u0440\u00A0\u0441\u0430\u0440", "\u0032\u00A0\u0434\u0443\u0433\u0430\u0430\u0440\u00A0\u0441\u0430\u0440", "\u0033\u00A0\u0434\u0443\u0433\u0430\u0430\u0440\u00A0\u0441\u0430\u0440", "\u0034\u00A0\u0434\u04AF\u0433\u044D\u044D\u0440\u00A0\u0441\u0430\u0440", "\u0035\u00A0\u0434\u0443\u0433\u0430\u0430\u0440\u00A0\u0441\u0430\u0440", "\u0036\u00A0\u0434\u0443\u0433\u0430\u0430\u0440\u00A0\u0441\u0430\u0440", "\u0037\u00A0\u0434\u0443\u0433\u0430\u0430\u0440\u00A0\u0441\u0430\u0440", "\u0038\u00A0\u0434\u0443\u0433\u0430\u0430\u0440\u00A0\u0441\u0430\u0440", "\u0039\u00A0\u0434\u04AF\u0433\u044D\u044D\u0440\u00A0\u0441\u0430\u0440", "\u0031\u0030\u00A0\u0434\u0443\u0433\u0430\u0430\u0440\u00A0\u0441\u0430\u0440", "\u0031\u0031\u00A0\u0434\u04AF\u0433\u044D\u044D\u0440\u00A0\u0441\u0430\u0440", "\u0031\u0032\u00A0\u0434\u0443\u0433\u0430\u0430\u0440\u00A0\u0441\u0430\u0440", "" ] }, +{ 0x0456, 0x0056, "gl-ES", "gl", "glg", "gl-ES", "\u0047\u0061\u006C\u0069\u0063\u0069\u0061\u006E\u0020\u0028\u0047\u0061\u006C\u0069\u0063\u0069\u0061\u006E\u0029", "\u0067\u0061\u006C\u0065\u0067\u006F\u0020\u0028\u0067\u0061\u006C\u0065\u0067\u006F\u0029", false, 0x00D9, "ES", "ESP", "\u0053\u0070\u0061\u0069\u006E", "\u0045\u0073\u0070\u0061\u00F1\u0061", "\u0045\u0055\u0052", "\u0045\u0075\u0072\u006F", "\u0065\u0075\u0072\u006F", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u20AC", "\u002D", "\u002B", "\u004E\u0065\u0075\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0043\u0061\u006C\u0065\u006E\u0064\u0061\u0072\u0069\u006F\u0020\u0047\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u006F", 1, 0, "\u002F", "\u003A", "\u0061\u002E\u006D\u002E", "\u0070\u002E\u006D\u002E", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u0048\'\u0048\'\u006D\u006D\'\u005C\'\'" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\'\u0048\'\u006D\u006D\'\u005C\'\'\u0073\u0073\'\u005C\'\u005C\'\'" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u0020\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u0064\u006F\u006D", "\u006C\u0075\u006E\u0073", "\u006D\u0061\u0072", "\u006D\u00E9\u0072", "\u0078\u006F\u0076", "\u0076\u0065\u006E", "\u0073\u0061\u0062" ], [ "\u0064\u006F\u006D\u0069\u006E\u0067\u006F", "\u006C\u0075\u006E\u0073", "\u006D\u0061\u0072\u0074\u0065\u0073", "\u006D\u00E9\u0072\u0063\u006F\u0072\u0065\u0073", "\u0078\u006F\u0076\u0065\u0073", "\u0076\u0065\u006E\u0072\u0065\u0073", "\u0073\u00E1\u0062\u0061\u0064\u006F" ], [ "\u0078\u0061\u006E", "\u0066\u0065\u0062", "\u006D\u0061\u0072", "\u0061\u0062\u0072", "\u006D\u0061\u0069\u006F", "\u0078\u0075\u00F1", "\u0078\u0075\u006C\u006C", "\u0061\u0067\u006F", "\u0073\u0065\u0074", "\u006F\u0075\u0074", "\u006E\u006F\u0076", "\u0064\u0065\u0063", "" ], [ "\u0078\u0061\u006E\u0065\u0069\u0072\u006F", "\u0066\u0065\u0062\u0072\u0065\u0069\u0072\u006F", "\u006D\u0061\u0072\u007A\u006F", "\u0061\u0062\u0072\u0069\u006C", "\u006D\u0061\u0069\u006F", "\u0078\u0075\u00F1\u006F", "\u0078\u0075\u006C\u006C\u006F", "\u0061\u0067\u006F\u0073\u0074\u006F", "\u0073\u0065\u0074\u0065\u006D\u0062\u0072\u006F", "\u006F\u0075\u0074\u0075\u0062\u0072\u006F", "\u006E\u006F\u0076\u0065\u006D\u0062\u0072\u006F", "\u0064\u0065\u0063\u0065\u006D\u0062\u0072\u006F", "" ] }, +{ 0x0457, 0x0057, "kok-IN", "kok", "kok", "kok-IN", "\u004B\u006F\u006E\u006B\u0061\u006E\u0069\u0020\u0028\u0049\u006E\u0064\u0069\u0061\u0029", "\u0915\u094B\u0902\u0915\u0923\u0940\u0020\u0028\u092D\u093E\u0930\u0924\u0029", false, 0x0071, "IN", "IND", "\u0049\u006E\u0064\u0069\u0061", "\u092D\u093E\u0930\u0924", "\u0049\u004E\u0052", "\u0049\u006E\u0064\u0069\u0061\u006E\u0020\u0052\u0075\u0070\u0065\u0065", "\u0930\u0941\u092A\u092F", true, 2, 1, 2, 12, 2, [ 3, 2 ], [ 3, 2 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0930\u0941", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0966", "\u0967", "\u0968", "\u0969", "\u096A", "\u096B", "\u096C", "\u096D", "\u096E", "\u096F" ], 1, [ 1 ], "\u0907\u0902\u0917\u094D\u0930\u091C\u0940\u00A0\u0915\u0945\u0932\u0947\u0928\u094D\u0921\u0930", 1, 0, "\u002D", "\u003A", "\u092E\u002E\u092A\u0942\u002E", "\u092E\u002E\u0928\u0902\u002E", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D", "\u0074\u0074\u0020\u0068\u0068\u003A\u006D\u006D", "\u0074\u0074\u0020\u0068\u003A\u006D\u006D" ], [ "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0064\u002D\u004D\u002D\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0074\u0074\u0020\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073", "\u0074\u0074\u0020\u0068\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0906\u092F\u002E", "\u0938\u094B\u092E\u002E", "\u092E\u0902\u0917\u0933\u002E", "\u092C\u0941\u0927\u002E", "\u092C\u093F\u0930\u0947\u002E", "\u0938\u0941\u0915\u094D\u0930\u002E", "\u0936\u0947\u0928\u002E" ], [ "\u0906\u092F\u0924\u093E\u0930", "\u0938\u094B\u092E\u093E\u0930", "\u092E\u0902\u0917\u0933\u093E\u0930", "\u092C\u0941\u0927\u0935\u093E\u0930", "\u092C\u093F\u0930\u0947\u0938\u094D\u0924\u093E\u0930", "\u0938\u0941\u0915\u094D\u0930\u093E\u0930", "\u0936\u0947\u0928\u0935\u093E\u0930" ], [ "\u091C\u093E\u0928\u0947\u0935\u093E\u0930\u0940", "\u092B\u0947\u092C\u094D\u0930\u0941\u0935\u093E\u0930\u0940", "\u092E\u093E\u0930\u094D\u091A", "\u090F\u092A\u094D\u0930\u093F\u0932", "\u092E\u0947", "\u091C\u0942\u0928", "\u091C\u0941\u0932\u0948", "\u0911\u0917\u0938\u094D\u091F", "\u0938\u092A\u094D\u091F\u0947\u0902\u092C\u0930", "\u0911\u0915\u094D\u091F\u094B\u092C\u0930", "\u0928\u094B\u0935\u0947\u092E\u094D\u092C\u0930", "\u0921\u093F\u0938\u0947\u0902\u092C\u0930", "" ], [ "\u091C\u093E\u0928\u0947\u0935\u093E\u0930\u0940", "\u092B\u0947\u092C\u094D\u0930\u0941\u0935\u093E\u0930\u0940", "\u092E\u093E\u0930\u094D\u091A", "\u090F\u092A\u094D\u0930\u093F\u0932", "\u092E\u0947", "\u091C\u0942\u0928", "\u091C\u0941\u0932\u0948", "\u0911\u0917\u0938\u094D\u091F", "\u0938\u092A\u094D\u091F\u0947\u0902\u092C\u0930", "\u0911\u0915\u094D\u091F\u094B\u092C\u0930", "\u0928\u094B\u0935\u0947\u092E\u094D\u092C\u0930", "\u0921\u093F\u0938\u0947\u0902\u092C\u0930", "" ] }, +{ 0x045A, 0x005A, "syr-SY", "syr", "syr", "syr-SY", "\u0053\u0079\u0072\u0069\u0061\u0063\u0020\u0028\u0053\u0079\u0072\u0069\u0061\u0029", "\u0723\u0718\u072A\u071D\u071D\u0710\u0020\u0028\u0633\u0648\u0631\u064A\u0627\u0029", false, 0x00DE, "SY", "SYR", "\u0053\u0079\u0072\u0069\u0061", "\u0633\u0648\u0631\u064A\u0627", "\u0053\u0059\u0050", "\u0053\u0079\u0072\u0069\u0061\u006E\u0020\u0050\u006F\u0075\u006E\u0064", "\u062C\u0646\u064A\u0647\u00A0\u0633\u0648\u0631\u064A", true, 2, 1, 2, 3, 2, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0644\u002E\u0633\u002E\u200F", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0723\u0718\u072A\u0713\u0715\u0710\u00A0\u0713\u072A\u071D\u0713\u0718\u072A\u071D\u0710", 6, 0, "\u002F", "\u003A", "\u0729\u002E\u071B", "\u0712\u002E\u071B", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u070F\u0710\u00A0\u070F\u0712\u072B", "\u070F\u0712\u00A0\u070F\u0712\u072B", "\u070F\u0713\u00A0\u070F\u0712\u072B", "\u070F\u0715\u00A0\u070F\u0712\u072B", "\u070F\u0717\u00A0\u070F\u0712\u072B", "\u070F\u0725\u072A\u0718\u0712", "\u070F\u072B\u0712" ], [ "\u071A\u0715\u00A0\u0712\u072B\u0712\u0710", "\u072C\u072A\u071D\u0722\u00A0\u0712\u072B\u0712\u0710", "\u072C\u0720\u072C\u0710\u00A0\u0712\u072B\u0712\u0710", "\u0710\u072A\u0712\u0725\u0710\u00A0\u0712\u072B\u0712\u0710", "\u071A\u0721\u072B\u0710\u00A0\u0712\u072B\u0712\u0710", "\u0725\u072A\u0718\u0712\u072C\u0710", "\u072B\u0712\u072C\u0710" ], [ "\u070F\u071F\u0722\u00A0\u070F\u0712", "\u072B\u0712\u071B", "\u0710\u0715\u072A", "\u0722\u071D\u0723\u0722", "\u0710\u071D\u072A", "\u071A\u0719\u071D\u072A\u0722", "\u072C\u0721\u0718\u0719", "\u0710\u0712", "\u0710\u071D\u0720\u0718\u0720", "\u070F\u072C\u072B\u00A0\u070F\u0710", "\u070F\u072C\u072B\u00A0\u070F\u0712", "\u070F\u071F\u0722\u00A0\u070F\u0710", "" ], [ "\u071F\u0722\u0718\u0722\u00A0\u0710\u071A\u072A\u071D", "\u072B\u0712\u071B", "\u0710\u0715\u072A", "\u0722\u071D\u0723\u0722", "\u0710\u071D\u072A", "\u071A\u0719\u071D\u072A\u0722", "\u072C\u0721\u0718\u0719", "\u0710\u0712", "\u0710\u071D\u0720\u0718\u0720", "\u072C\u072B\u072A\u071D\u00A0\u0729\u0715\u071D\u0721", "\u072C\u072B\u072A\u071D\u00A0\u0710\u071A\u072A\u071D", "\u071F\u0722\u0718\u0722\u00A0\u0729\u0715\u071D\u0721", "" ] }, +{ 0x0465, 0x0065, "div-MV", "div", "div", "div-MV", "\u0044\u0069\u0076\u0065\u0068\u0069\u0020\u0028\u004D\u0061\u006C\u0064\u0069\u0076\u0065\u0073\u0029", "\u078B\u07A8\u0788\u07AC\u0780\u07A8\u0784\u07A6\u0790\u07B0\u0020\u0028\u078B\u07A8\u0788\u07AC\u0780\u07A8\u0020\u0783\u07A7\u0787\u07B0\u0796\u07AC\u0029", false, 0x00A5, "MV", "MDV", "\u004D\u0061\u006C\u0064\u0069\u0076\u0065\u0073", "\u078B\u07A8\u0788\u07AC\u0780\u07A8\u0020\u0783\u07A7\u0787\u07B0\u0796\u07AC", "\u004D\u0056\u0052", "\u0052\u0075\u0066\u0069\u0079\u0061\u0061", "\u0783\u07AA\u078A\u07A8\u0794\u07A7", true, 2, 1, 2, 10, 3, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0783\u002E", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 6, [ 6, 1 ], "\u0780\u07A8\u0796\u07B0\u0783\u07A9\u0020\u0786\u07A6\u078D\u07A6\u0782\u07B0\u0791\u07A6\u0783\u07AA", 0, 0, "\u002F", "\u003A", "\u0789\u0786", "\u0789\u078A", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D", "\u0064\u0064\u002F\u004D\u004D\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074" ], [ "\u0064\u0064\u002F\u004D\u004D\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0627\u0644\u0627\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0627\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" ], [ "\u0627\u0644\u0627\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0627\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" ], [ "\u0645\u062D\u0631\u0645", "\u0635\u0641\u0631", "\u0631\u0628\u064A\u0639\u00A0\u0627\u0644\u0627\u0648\u0644", "\u0631\u0628\u064A\u0639\u00A0\u0627\u0644\u062B\u0627\u0646\u064A", "\u062C\u0645\u0627\u062F\u0649\u00A0\u0627\u0644\u0627\u0648\u0644\u0649", "\u062C\u0645\u0627\u062F\u0649\u00A0\u0627\u0644\u062B\u0627\u0646\u064A\u0629", "\u0631\u062C\u0628", "\u0634\u0639\u0628\u0627\u0646", "\u0631\u0645\u0636\u0627\u0646", "\u0634\u0648\u0627\u0644", "\u0630\u0648\u00A0\u0627\u0644\u0642\u0639\u062F\u0629", "\u0630\u0648\u00A0\u0627\u0644\u062D\u062C\u0629", "" ], [ "\u0645\u062D\u0631\u0645", "\u0635\u0641\u0631", "\u0631\u0628\u064A\u0639\u00A0\u0627\u0644\u0623\u0648\u0644", "\u0631\u0628\u064A\u0639\u00A0\u0627\u0644\u062B\u0627\u0646\u064A", "\u062C\u0645\u0627\u062F\u0649\u00A0\u0627\u0644\u0623\u0648\u0644\u0649", "\u062C\u0645\u0627\u062F\u0649\u00A0\u0627\u0644\u062B\u0627\u0646\u064A\u0629", "\u0631\u062C\u0628", "\u0634\u0639\u0628\u0627\u0646", "\u0631\u0645\u0636\u0627\u0646", "\u0634\u0648\u0627\u0644", "\u0630\u0648\u00A0\u0627\u0644\u0642\u0639\u062F\u0629", "\u0630\u0648\u00A0\u0627\u0644\u062D\u062C\u0629", "" ] }, +{ 0x0801, 0x0001, "ar-IQ", "ar", "ara", "ar-IQ", "\u0041\u0072\u0061\u0062\u0069\u0063\u0020\u0028\u0049\u0072\u0061\u0071\u0029", "\u0627\u0644\u0639\u0631\u0628\u064A\u0629\u0020\u0028\u0627\u0644\u0639\u0631\u0627\u0642\u0029", false, 0x0079, "IQ", "IRQ", "\u0049\u0072\u0061\u0071", "\u0627\u0644\u0639\u0631\u0627\u0642", "\u0049\u0051\u0044", "\u0049\u0072\u0061\u0071\u0069\u0020\u0044\u0069\u006E\u0061\u0072", "\u062F\u064A\u0646\u0627\u0631\u00A0\u0639\u0631\u0627\u0642\u064A", true, 2, 3, 2, 3, 2, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u062F\u002E\u0639\u002E\u200F", "\u002D", "\u002B", "\u0644\u064A\u0633\u0020\u0628\u0631\u0642\u0645", "\u002D\u0644\u0627\u0020\u0646\u0647\u0627\u064A\u0629", "\u002B\u0644\u0627\u0020\u0646\u0647\u0627\u064A\u0629", [ "\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669" ], 1, [ 1, 23, 6, 2, 9, 11, 12 ], "\u0627\u0644\u062A\u0642\u0648\u064A\u0645\u00A0\u0627\u0644\u0645\u064A\u0644\u0627\u062F\u064A\u00A0\u0028\u0639\u0631\u0628\u064A\u0029\u200F", 6, 0, "\u002F", "\u003A", "\u0635", "\u0645", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0627\u0644\u0627\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0627\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" ], [ "\u0627\u0644\u0627\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0627\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" ], [ "\u0643\u0627\u0646\u0648\u0646\u00A0\u0627\u0644\u062B\u0627\u0646\u064A", "\u0634\u0628\u0627\u0637", "\u0622\u0630\u0627\u0631", "\u0646\u064A\u0633\u0627\u0646", "\u0623\u064A\u0627\u0631", "\u062D\u0632\u064A\u0631\u0627\u0646", "\u062A\u0645\u0648\u0632", "\u0622\u0628", "\u0623\u064A\u0644\u0648\u0644", "\u062A\u0634\u0631\u064A\u0646\u00A0\u0627\u0644\u0623\u0648\u0644", "\u062A\u0634\u0631\u064A\u0646\u00A0\u0627\u0644\u062B\u0627\u0646\u064A", "\u0643\u0627\u0646\u0648\u0646\u00A0\u0627\u0644\u0623\u0648\u0644", "" ], [ "\u0643\u0627\u0646\u0648\u0646\u00A0\u0627\u0644\u062B\u0627\u0646\u064A", "\u0634\u0628\u0627\u0637", "\u0622\u0630\u0627\u0631", "\u0646\u064A\u0633\u0627\u0646", "\u0623\u064A\u0627\u0631", "\u062D\u0632\u064A\u0631\u0627\u0646", "\u062A\u0645\u0648\u0632", "\u0622\u0628", "\u0623\u064A\u0644\u0648\u0644", "\u062A\u0634\u0631\u064A\u0646\u00A0\u0627\u0644\u0623\u0648\u0644", "\u062A\u0634\u0631\u064A\u0646\u00A0\u0627\u0644\u062B\u0627\u0646\u064A", "\u0643\u0627\u0646\u0648\u0646\u00A0\u0627\u0644\u0623\u0648\u0644", "" ] }, +{ 0x0804, 0x0004, "zh-CN", "zh", "zho", "zh-CN", "\u0043\u0068\u0069\u006E\u0065\u0073\u0065\u0020\u0028\u0050\u0065\u006F\u0070\u006C\u0065\u0027\u0073\u0020\u0052\u0065\u0070\u0075\u0062\u006C\u0069\u0063\u0020\u006F\u0066\u0020\u0043\u0068\u0069\u006E\u0061\u0029", "\u4E2D\u6587\u0028\u4E2D\u534E\u4EBA\u6C11\u5171\u548C\u56FD\u0029", false, 0x002D, "CN", "CHN", "\u0050\u0065\u006F\u0070\u006C\u0065\u0027\u0073\u0020\u0052\u0065\u0070\u0075\u0062\u006C\u0069\u0063\u0020\u006F\u0066\u0020\u0043\u0068\u0069\u006E\u0061", "\u4E2D\u534E\u4EBA\u6C11\u5171\u548C\u56FD", "\u0043\u004E\u0059", "\u0050\u0052\u0043\u0020\u0059\u0075\u0061\u006E\u0020\u0052\u0065\u006E\u006D\u0069\u006E\u0062\u0069", "\u4EBA\u6C11\u5E01", true, 2, 1, 2, 2, 0, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\uFFE5", "\u002D", "\u002B", "\u975E\u6570\u5B57", "\u8D1F\u65E0\u7A77\u5927", "\u6B63\u65E0\u7A77\u5927", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u516C\u5386", 0, 0, "\u002F", "\u003A", "\u4E0A\u5348", "\u4E0B\u5348", "\u0079\u0079\u0079\u0079\u002F\u004D\u002F\u0064", "\u0048\u003A\u006D\u006D", "\u0079\u0079\u0079\u0079\'\u5E74\'\u004D\'\u6708\'\u0064\'\u65E5\'", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u004D\'\u6708\'\u0064\'\u65E5\'", "\u0079\u0079\u0079\u0079\'\u5E74\'\u004D\'\u6708\'", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D", "\u0074\u0074\u0020\u0068\u003A\u006D\u006D", "\u0074\u0074\u0020\u0068\u0068\u003A\u006D\u006D" ], [ "\u0079\u0079\u0079\u0079\u002F\u004D\u002F\u0064", "\u0079\u0079\u0079\u0079\u002D\u004D\u002D\u0064", "\u0079\u0079\u0079\u0079\u002E\u004D\u002E\u0064", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0079\u0079\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0079\u0079\u0079\u0079\u002E\u004D\u004D\u002E\u0064\u0064", "\u0079\u0079\u002D\u004D\u002D\u0064", "\u0079\u0079\u002F\u004D\u002F\u0064", "\u0079\u0079\u002E\u004D\u002E\u0064", "\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0074\u0074\u0020\u0068\u003A\u006D\u006D\u003A\u0073\u0073", "\u0074\u0074\u0020\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0079\u0079\u0079\u0079\'\u5E74\'\u004D\'\u6708\'\u0064\'\u65E5\'", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0064\u0064\u0064\u0064\u002C\u0020\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0064\u0064\u0064\u0064\u002C\u0020\u0079\u0079\u0079\u0079\'\u5E74\'\u004D\'\u6708\'\u0064\'\u65E5\'" ], [ "\u0079\u0079\u0079\u0079\'\u5E74\'\u004D\'\u6708\'", "\u0079\u0079\u0079\u0079\u002E\u004D" ], [ "\u65E5", "\u4E00", "\u4E8C", "\u4E09", "\u56DB", "\u4E94", "\u516D" ], [ "\u661F\u671F\u65E5", "\u661F\u671F\u4E00", "\u661F\u671F\u4E8C", "\u661F\u671F\u4E09", "\u661F\u671F\u56DB", "\u661F\u671F\u4E94", "\u661F\u671F\u516D" ], [ "\u4E00\u6708", "\u4E8C\u6708", "\u4E09\u6708", "\u56DB\u6708", "\u4E94\u6708", "\u516D\u6708", "\u4E03\u6708", "\u516B\u6708", "\u4E5D\u6708", "\u5341\u6708", "\u5341\u4E00\u6708", "\u5341\u4E8C\u6708", "" ], [ "\u4E00\u6708", "\u4E8C\u6708", "\u4E09\u6708", "\u56DB\u6708", "\u4E94\u6708", "\u516D\u6708", "\u4E03\u6708", "\u516B\u6708", "\u4E5D\u6708", "\u5341\u6708", "\u5341\u4E00\u6708", "\u5341\u4E8C\u6708", "" ] }, +{ 0x0807, 0x0007, "de-CH", "de", "deu", "de-CH", "\u0047\u0065\u0072\u006D\u0061\u006E\u0020\u0028\u0053\u0077\u0069\u0074\u007A\u0065\u0072\u006C\u0061\u006E\u0064\u0029", "\u0044\u0065\u0075\u0074\u0073\u0063\u0068\u0020\u0028\u0053\u0063\u0068\u0077\u0065\u0069\u007A\u0029", false, 0x00DF, "CH", "CHE", "\u0053\u0077\u0069\u0074\u007A\u0065\u0072\u006C\u0061\u006E\u0064", "\u0053\u0063\u0068\u0077\u0065\u0069\u007A", "\u0043\u0048\u0046", "\u0053\u0077\u0069\u0073\u0073\u0020\u0046\u0072\u0061\u006E\u0063", "\u0053\u0063\u0068\u0077\u0065\u0069\u007A\u0065\u0072\u0020\u0046\u0072\u0061\u006E\u006B\u0065\u006E", true, 2, 1, 2, 2, 2, [ 3 ], [ 3 ], "\u002E", "\u0027", "\u002E", "\u0027", "\u0053\u0046\u0072\u002E", "\u002D", "\u002B", "\u006E\u002E\u0020\u0064\u0065\u0066\u002E", "\u002D\u0075\u006E\u0065\u006E\u0064\u006C\u0069\u0063\u0068", "\u002B\u0075\u006E\u0065\u006E\u0064\u006C\u0069\u0063\u0068", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0047\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0069\u0073\u0063\u0068\u0065\u0072\u0020\u004B\u0061\u006C\u0065\u006E\u0064\u0065\u0072", 1, 2, "\u002E", "\u003A", "", "", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D", "\u0048\u002E\u006D\u006D\'\u0020\u0068\'", "\u0048\u0048\u002E\u006D\u006D\'\u0020\u0068\'", "\u0048\u002E\u006D\u006D\'\u0020\u0055\u0068\u0072\'" ], [ "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u0064\u002E\u0020\u004D\u002E\u0020\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u002E\u006D\u006D\'\u0020\u0068\'", "\u0048\u0048\u002E\u006D\u006D\'\u0020\u0068\'", "\u0048\u002E\u006D\u006D\'\u0020\u0055\u0068\u0072\'" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u002E\u0020\u004D\u004D\u004D\u0020\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0053\u006F", "\u004D\u006F", "\u0044\u0069", "\u004D\u0069", "\u0044\u006F", "\u0046\u0072", "\u0053\u0061" ], [ "\u0053\u006F\u006E\u006E\u0074\u0061\u0067", "\u004D\u006F\u006E\u0074\u0061\u0067", "\u0044\u0069\u0065\u006E\u0073\u0074\u0061\u0067", "\u004D\u0069\u0074\u0074\u0077\u006F\u0063\u0068", "\u0044\u006F\u006E\u006E\u0065\u0072\u0073\u0074\u0061\u0067", "\u0046\u0072\u0065\u0069\u0074\u0061\u0067", "\u0053\u0061\u006D\u0073\u0074\u0061\u0067" ], [ "\u004A\u0061\u006E", "\u0046\u0065\u0062", "\u004D\u0072\u007A", "\u0041\u0070\u0072", "\u004D\u0061\u0069", "\u004A\u0075\u006E", "\u004A\u0075\u006C", "\u0041\u0075\u0067", "\u0053\u0065\u0070", "\u004F\u006B\u0074", "\u004E\u006F\u0076", "\u0044\u0065\u007A", "" ], [ "\u004A\u0061\u006E\u0075\u0061\u0072", "\u0046\u0065\u0062\u0072\u0075\u0061\u0072", "\u004D\u00E4\u0072\u007A", "\u0041\u0070\u0072\u0069\u006C", "\u004D\u0061\u0069", "\u004A\u0075\u006E\u0069", "\u004A\u0075\u006C\u0069", "\u0041\u0075\u0067\u0075\u0073\u0074", "\u0053\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u004F\u006B\u0074\u006F\u0062\u0065\u0072", "\u004E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0044\u0065\u007A\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x0809, 0x0009, "en-GB", "en", "eng", "en-GB", "\u0045\u006E\u0067\u006C\u0069\u0073\u0068\u0020\u0028\u0055\u006E\u0069\u0074\u0065\u0064\u0020\u004B\u0069\u006E\u0067\u0064\u006F\u006D\u0029", "\u0045\u006E\u0067\u006C\u0069\u0073\u0068\u0020\u0028\u0055\u006E\u0069\u0074\u0065\u0064\u0020\u004B\u0069\u006E\u0067\u0064\u006F\u006D\u0029", false, 0x00F2, "GB", "GBR", "\u0055\u006E\u0069\u0074\u0065\u0064\u0020\u004B\u0069\u006E\u0067\u0064\u006F\u006D", "\u0055\u006E\u0069\u0074\u0065\u0064\u0020\u004B\u0069\u006E\u0067\u0064\u006F\u006D", "\u0047\u0042\u0050", "\u0055\u004B\u0020\u0050\u006F\u0075\u006E\u0064\u0020\u0053\u0074\u0065\u0072\u006C\u0069\u006E\u0067", "\u0050\u006F\u0075\u006E\u0064\u0020\u0053\u0074\u0065\u0072\u006C\u0069\u006E\u0067", true, 2, 1, 2, 1, 0, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u00A3", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1, 2 ], "\u0047\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0020\u0043\u0061\u006C\u0065\u006E\u0064\u0061\u0072", 1, 0, "\u002F", "\u003A", "\u0041\u004D", "\u0050\u004D", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u0020\u0074\u0074" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0053\u0075\u006E", "\u004D\u006F\u006E", "\u0054\u0075\u0065", "\u0057\u0065\u0064", "\u0054\u0068\u0075", "\u0046\u0072\u0069", "\u0053\u0061\u0074" ], [ "\u0053\u0075\u006E\u0064\u0061\u0079", "\u004D\u006F\u006E\u0064\u0061\u0079", "\u0054\u0075\u0065\u0073\u0064\u0061\u0079", "\u0057\u0065\u0064\u006E\u0065\u0073\u0064\u0061\u0079", "\u0054\u0068\u0075\u0072\u0073\u0064\u0061\u0079", "\u0046\u0072\u0069\u0064\u0061\u0079", "\u0053\u0061\u0074\u0075\u0072\u0064\u0061\u0079" ], [ "\u004A\u0061\u006E", "\u0046\u0065\u0062", "\u004D\u0061\u0072", "\u0041\u0070\u0072", "\u004D\u0061\u0079", "\u004A\u0075\u006E", "\u004A\u0075\u006C", "\u0041\u0075\u0067", "\u0053\u0065\u0070", "\u004F\u0063\u0074", "\u004E\u006F\u0076", "\u0044\u0065\u0063", "" ], [ "\u004A\u0061\u006E\u0075\u0061\u0072\u0079", "\u0046\u0065\u0062\u0072\u0075\u0061\u0072\u0079", "\u004D\u0061\u0072\u0063\u0068", "\u0041\u0070\u0072\u0069\u006C", "\u004D\u0061\u0079", "\u004A\u0075\u006E\u0065", "\u004A\u0075\u006C\u0079", "\u0041\u0075\u0067\u0075\u0073\u0074", "\u0053\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u004F\u0063\u0074\u006F\u0062\u0065\u0072", "\u004E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0044\u0065\u0063\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x080A, 0x000A, "es-MX", "es", "spa", "es-MX", "\u0053\u0070\u0061\u006E\u0069\u0073\u0068\u0020\u0028\u004D\u0065\u0078\u0069\u0063\u006F\u0029", "\u0045\u0073\u0070\u0061\u00F1\u006F\u006C\u0020\u0028\u004D\u00E9\u0078\u0069\u0063\u006F\u0029", false, 0x00A6, "MX", "MEX", "\u004D\u0065\u0078\u0069\u0063\u006F", "\u004D\u00E9\u0078\u0069\u0063\u006F", "\u004D\u0058\u004E", "\u004D\u0065\u0078\u0069\u0063\u0061\u006E\u0020\u0050\u0065\u0073\u006F", "\u0050\u0065\u0073\u006F", true, 2, 1, 2, 1, 0, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0024", "\u002D", "\u002B", "\u004E\u0065\u0075\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0063\u0061\u006C\u0065\u006E\u0064\u0061\u0072\u0069\u006F\u0020\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u006F", 0, 0, "\u002F", "\u003A", "\u0061\u002E\u006D\u002E", "\u0070\u002E\u006D\u002E", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u0020\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u0064\u006F\u006D", "\u006C\u0075\u006E", "\u006D\u0061\u0072", "\u006D\u0069\u00E9", "\u006A\u0075\u0065", "\u0076\u0069\u0065", "\u0073\u00E1\u0062" ], [ "\u0064\u006F\u006D\u0069\u006E\u0067\u006F", "\u006C\u0075\u006E\u0065\u0073", "\u006D\u0061\u0072\u0074\u0065\u0073", "\u006D\u0069\u00E9\u0072\u0063\u006F\u006C\u0065\u0073", "\u006A\u0075\u0065\u0076\u0065\u0073", "\u0076\u0069\u0065\u0072\u006E\u0065\u0073", "\u0073\u00E1\u0062\u0061\u0064\u006F" ], [ "\u0065\u006E\u0065", "\u0066\u0065\u0062", "\u006D\u0061\u0072", "\u0061\u0062\u0072", "\u006D\u0061\u0079", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0067\u006F", "\u0073\u0065\u0070", "\u006F\u0063\u0074", "\u006E\u006F\u0076", "\u0064\u0069\u0063", "" ], [ "\u0065\u006E\u0065\u0072\u006F", "\u0066\u0065\u0062\u0072\u0065\u0072\u006F", "\u006D\u0061\u0072\u007A\u006F", "\u0061\u0062\u0072\u0069\u006C", "\u006D\u0061\u0079\u006F", "\u006A\u0075\u006E\u0069\u006F", "\u006A\u0075\u006C\u0069\u006F", "\u0061\u0067\u006F\u0073\u0074\u006F", "\u0073\u0065\u0070\u0074\u0069\u0065\u006D\u0062\u0072\u0065", "\u006F\u0063\u0074\u0075\u0062\u0072\u0065", "\u006E\u006F\u0076\u0069\u0065\u006D\u0062\u0072\u0065", "\u0064\u0069\u0063\u0069\u0065\u006D\u0062\u0072\u0065", "" ] }, +{ 0x080C, 0x000C, "fr-BE", "fr", "fra", "fr-BE", "\u0046\u0072\u0065\u006E\u0063\u0068\u0020\u0028\u0042\u0065\u006C\u0067\u0069\u0075\u006D\u0029", "\u0066\u0072\u0061\u006E\u00E7\u0061\u0069\u0073\u0020\u0028\u0042\u0065\u006C\u0067\u0069\u0071\u0075\u0065\u0029", false, 0x0015, "BE", "BEL", "\u0042\u0065\u006C\u0067\u0069\u0075\u006D", "\u0042\u0065\u006C\u0067\u0069\u0071\u0075\u0065", "\u0045\u0055\u0052", "\u0045\u0075\u0072\u006F", "\u0065\u0075\u0072\u006F", true, 2, 1, 2, 12, 2, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u20AC", "\u002D", "\u002B", "\u004E\u006F\u006E\u0020\u004E\u0075\u006D\u00E9\u0072\u0069\u0071\u0075\u0065", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069", "\u002B\u0049\u006E\u0066\u0069\u006E\u0069", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0063\u0061\u006C\u0065\u006E\u0064\u0072\u0069\u0065\u0072\u0020\u0067\u0072\u00E9\u0067\u006F\u0072\u0069\u0065\u006E", 1, 0, "\u002F", "\u003A", "", "", "\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\u0064\u0064\u0064\u0020\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D", "\u0048\u002E\u006D\u006D", "\u0048\'\u0020\u0068\u0020\'\u006D\u006D", "\u0048\'\u0020\u0068\u0020\'\u006D\'\u0020\u006D\u0069\u006E\u0020\'" ], [ "\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u002E\u006D\u006D", "\u0048\'\u0020\u0068\u0020\'\u006D\u006D", "\u0048\'\u0020\u0068\u0020\'\u006D\'\u0020\u006D\u0069\u006E\u0020\'\u0073\'\u0020\u0073\u0020\'" ], [ "\u0064\u0064\u0064\u0064\u0020\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u004D\u002D\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0064\u0069\u006D\u002E", "\u006C\u0075\u006E\u002E", "\u006D\u0061\u0072\u002E", "\u006D\u0065\u0072\u002E", "\u006A\u0065\u0075\u002E", "\u0076\u0065\u006E\u002E", "\u0073\u0061\u006D\u002E" ], [ "\u0064\u0069\u006D\u0061\u006E\u0063\u0068\u0065", "\u006C\u0075\u006E\u0064\u0069", "\u006D\u0061\u0072\u0064\u0069", "\u006D\u0065\u0072\u0063\u0072\u0065\u0064\u0069", "\u006A\u0065\u0075\u0064\u0069", "\u0076\u0065\u006E\u0064\u0072\u0065\u0064\u0069", "\u0073\u0061\u006D\u0065\u0064\u0069" ], [ "\u006A\u0061\u006E\u0076\u002E", "\u0066\u00E9\u0076\u0072\u002E", "\u006D\u0061\u0072\u0073", "\u0061\u0076\u0072\u002E", "\u006D\u0061\u0069", "\u006A\u0075\u0069\u006E", "\u006A\u0075\u0069\u006C\u002E", "\u0061\u006F\u00FB\u0074", "\u0073\u0065\u0070\u0074\u002E", "\u006F\u0063\u0074\u002E", "\u006E\u006F\u0076\u002E", "\u0064\u00E9\u0063\u002E", "" ], [ "\u006A\u0061\u006E\u0076\u0069\u0065\u0072", "\u0066\u00E9\u0076\u0072\u0069\u0065\u0072", "\u006D\u0061\u0072\u0073", "\u0061\u0076\u0072\u0069\u006C", "\u006D\u0061\u0069", "\u006A\u0075\u0069\u006E", "\u006A\u0075\u0069\u006C\u006C\u0065\u0074", "\u0061\u006F\u00FB\u0074", "\u0073\u0065\u0070\u0074\u0065\u006D\u0062\u0072\u0065", "\u006F\u0063\u0074\u006F\u0062\u0072\u0065", "\u006E\u006F\u0076\u0065\u006D\u0062\u0072\u0065", "\u0064\u00E9\u0063\u0065\u006D\u0062\u0072\u0065", "" ] }, +{ 0x0810, 0x0010, "it-CH", "it", "ita", "it-CH", "\u0049\u0074\u0061\u006C\u0069\u0061\u006E\u0020\u0028\u0053\u0077\u0069\u0074\u007A\u0065\u0072\u006C\u0061\u006E\u0064\u0029", "\u0069\u0074\u0061\u006C\u0069\u0061\u006E\u006F\u0020\u0028\u0053\u0076\u0069\u007A\u007A\u0065\u0072\u0061\u0029", false, 0x00DF, "CH", "CHE", "\u0053\u0077\u0069\u0074\u007A\u0065\u0072\u006C\u0061\u006E\u0064", "\u0053\u0076\u0069\u007A\u007A\u0065\u0072\u0061", "\u0043\u0048\u0046", "\u0053\u0077\u0069\u0073\u0073\u0020\u0046\u0072\u0061\u006E\u0063", "\u0046\u0072\u0061\u006E\u0063\u006F\u0020\u0073\u0076\u0069\u007A\u007A\u0065\u0072\u006F", true, 2, 1, 2, 2, 2, [ 3 ], [ 3 ], "\u002E", "\u0027", "\u002E", "\u0027", "\u0053\u0046\u0072\u002E", "\u002D", "\u002B", "\u004E\u006F\u006E\u0020\u0075\u006E\u0020\u006E\u0075\u006D\u0065\u0072\u006F\u0020\u0072\u0065\u0061\u006C\u0065", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", "\u002B\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0063\u0061\u006C\u0065\u006E\u0064\u0061\u0072\u0069\u006F\u0020\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u006F", 1, 2, "\u002E", "\u003A", "", "", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D", "\u0048\u002E\u006D\u006D\'\u0020\u0068\'" ], [ "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u0064\u002E\u0020\u004D\u004D\u002E\u0020\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079", "\u0064\u0064\u002E\u004D\u002E\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u002E\u006D\u006D\'\u0020\u0068\'" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u002D\u004D\u004D\u004D\u002D\u0079\u0079", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0064\u006F\u006D", "\u006C\u0075\u006E", "\u006D\u0061\u0072", "\u006D\u0065\u0072", "\u0067\u0069\u006F", "\u0076\u0065\u006E", "\u0073\u0061\u0062" ], [ "\u0064\u006F\u006D\u0065\u006E\u0069\u0063\u0061", "\u006C\u0075\u006E\u0065\u0064\u00EC", "\u006D\u0061\u0072\u0074\u0065\u0064\u00EC", "\u006D\u0065\u0072\u0063\u006F\u006C\u0065\u0064\u00EC", "\u0067\u0069\u006F\u0076\u0065\u0064\u00EC", "\u0076\u0065\u006E\u0065\u0072\u0064\u00EC", "\u0073\u0061\u0062\u0061\u0074\u006F" ], [ "\u0067\u0065\u006E", "\u0066\u0065\u0062", "\u006D\u0061\u0072", "\u0061\u0070\u0072", "\u006D\u0061\u0067", "\u0067\u0069\u006F", "\u006C\u0075\u0067", "\u0061\u0067\u006F", "\u0073\u0065\u0074", "\u006F\u0074\u0074", "\u006E\u006F\u0076", "\u0064\u0069\u0063", "" ], [ "\u0067\u0065\u006E\u006E\u0061\u0069\u006F", "\u0066\u0065\u0062\u0062\u0072\u0061\u0069\u006F", "\u006D\u0061\u0072\u007A\u006F", "\u0061\u0070\u0072\u0069\u006C\u0065", "\u006D\u0061\u0067\u0067\u0069\u006F", "\u0067\u0069\u0075\u0067\u006E\u006F", "\u006C\u0075\u0067\u006C\u0069\u006F", "\u0061\u0067\u006F\u0073\u0074\u006F", "\u0073\u0065\u0074\u0074\u0065\u006D\u0062\u0072\u0065", "\u006F\u0074\u0074\u006F\u0062\u0072\u0065", "\u006E\u006F\u0076\u0065\u006D\u0062\u0072\u0065", "\u0064\u0069\u0063\u0065\u006D\u0062\u0072\u0065", "" ] }, +{ 0x0813, 0x0013, "nl-BE", "nl", "nld", "nl-BE", "\u0044\u0075\u0074\u0063\u0068\u0020\u0028\u0042\u0065\u006C\u0067\u0069\u0075\u006D\u0029", "\u004E\u0065\u0064\u0065\u0072\u006C\u0061\u006E\u0064\u0073\u0020\u0028\u0042\u0065\u006C\u0067\u0069\u00EB\u0029", false, 0x0015, "BE", "BEL", "\u0042\u0065\u006C\u0067\u0069\u0075\u006D", "\u0042\u0065\u006C\u0067\u0069\u00EB", "\u0045\u0055\u0052", "\u0045\u0075\u0072\u006F", "\u0065\u0075\u0072\u006F", true, 2, 1, 2, 12, 2, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u20AC", "\u002D", "\u002B", "\u004E\u0061\u004E\u0020\u0028\u004E\u0069\u0065\u0074\u002D\u0065\u0065\u006E\u002D\u0067\u0065\u0074\u0061\u006C\u0029", "\u002D\u006F\u006E\u0065\u0069\u006E\u0064\u0069\u0067", "\u006F\u006E\u0065\u0069\u006E\u0064\u0069\u0067", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0047\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u0061\u006E\u0073\u0065\u0020\u006B\u0061\u006C\u0065\u006E\u0064\u0065\u0072", 1, 0, "\u002F", "\u003A", "", "", "\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\u0064\u0064\u0064\u0020\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D", "\u0048\u002E\u006D\u006D\'\u0020\u0075\u002E\'" ], [ "\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u002E\u006D\u006D\'\u0020\u0075\u002E\'", "\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u0064\u0064\u0020\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u004D\u002D\u0079\u0079", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0020\u004D\u004D\u004D\u0020\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u007A\u006F", "\u006D\u0061", "\u0064\u0069", "\u0077\u006F", "\u0064\u006F", "\u0076\u0072", "\u007A\u0061" ], [ "\u007A\u006F\u006E\u0064\u0061\u0067", "\u006D\u0061\u0061\u006E\u0064\u0061\u0067", "\u0064\u0069\u006E\u0073\u0064\u0061\u0067", "\u0077\u006F\u0065\u006E\u0073\u0064\u0061\u0067", "\u0064\u006F\u006E\u0064\u0065\u0072\u0064\u0061\u0067", "\u0076\u0072\u0069\u006A\u0064\u0061\u0067", "\u007A\u0061\u0074\u0065\u0072\u0064\u0061\u0067" ], [ "\u006A\u0061\u006E", "\u0066\u0065\u0062", "\u006D\u0072\u0074", "\u0061\u0070\u0072", "\u006D\u0065\u0069", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0075\u0067", "\u0073\u0065\u0070", "\u006F\u006B\u0074", "\u006E\u006F\u0076", "\u0064\u0065\u0063", "" ], [ "\u006A\u0061\u006E\u0075\u0061\u0072\u0069", "\u0066\u0065\u0062\u0072\u0075\u0061\u0072\u0069", "\u006D\u0061\u0061\u0072\u0074", "\u0061\u0070\u0072\u0069\u006C", "\u006D\u0065\u0069", "\u006A\u0075\u006E\u0069", "\u006A\u0075\u006C\u0069", "\u0061\u0075\u0067\u0075\u0073\u0074\u0075\u0073", "\u0073\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u006F\u006B\u0074\u006F\u0062\u0065\u0072", "\u006E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0064\u0065\u0063\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x0814, 0x0014, "nn-NO", "nn", "nno", "nn-NO", "\u004E\u006F\u0072\u0077\u0065\u0067\u0069\u0061\u006E\u002C\u0020\u004E\u0079\u006E\u006F\u0072\u0073\u006B\u0020\u0028\u004E\u006F\u0072\u0077\u0061\u0079\u0029", "\u006E\u006F\u0072\u0073\u006B\u002C\u0020\u006E\u0079\u006E\u006F\u0072\u0073\u006B\u0020\u0028\u004E\u006F\u0072\u0065\u0067\u0029", false, 0x00B1, "NO", "NOR", "\u004E\u006F\u0072\u0077\u0061\u0079", "\u004E\u006F\u0072\u0065\u0067", "\u004E\u004F\u004B", "\u004E\u006F\u0072\u0077\u0065\u0067\u0069\u0061\u006E\u0020\u004B\u0072\u006F\u006E\u0065", "\u004E\u006F\u0072\u0073\u006B\u0020\u006B\u0072\u006F\u006E\u0065", true, 2, 1, 2, 12, 2, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002C", "\u00A0", "\u006B\u0072", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u004E\u0046", "\u0049\u004E\u0046", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0073\u006B\u0020\u006B\u0061\u006C\u0065\u006E\u0064\u0065\u0072", 1, 2, "\u002E", "\u003A", "", "", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D", "\'\u006B\u006C\u0020\'\u0048\u0048\u002E\u006D\u006D", "\u0048\u0048\u002E\u006D\u006D" ], [ "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\'\u006B\u006C\u0020\'\u0048\u0048\u002E\u006D\u006D", "\u0048\u0048\u002E\u006D\u006D\u002E\u0073\u0073" ], [ "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0073\u00F8", "\u006D\u00E5", "\u0074\u0079", "\u006F\u006E", "\u0074\u006F", "\u0066\u0072", "\u006C\u0061" ], [ "\u0073\u00F8\u006E\u0064\u0061\u0067", "\u006D\u00E5\u006E\u0064\u0061\u0067", "\u0074\u0079\u0073\u0064\u0061\u0067", "\u006F\u006E\u0073\u0064\u0061\u0067", "\u0074\u006F\u0072\u0073\u0064\u0061\u0067", "\u0066\u0072\u0065\u0064\u0061\u0067", "\u006C\u0061\u0075\u0072\u0064\u0061\u0067" ], [ "\u006A\u0061\u006E", "\u0066\u0065\u0062", "\u006D\u0061\u0072", "\u0061\u0070\u0072", "\u006D\u0061\u0069", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0075\u0067", "\u0073\u0065\u0070", "\u006F\u006B\u0074", "\u006E\u006F\u0076", "\u0064\u0065\u0073", "" ], [ "\u006A\u0061\u006E\u0075\u0061\u0072", "\u0066\u0065\u0062\u0072\u0075\u0061\u0072", "\u006D\u0061\u0072\u0073", "\u0061\u0070\u0072\u0069\u006C", "\u006D\u0061\u0069", "\u006A\u0075\u006E\u0069", "\u006A\u0075\u006C\u0069", "\u0061\u0075\u0067\u0075\u0073\u0074", "\u0073\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u006F\u006B\u0074\u006F\u0062\u0065\u0072", "\u006E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0064\u0065\u0073\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x0816, 0x0016, "pt-PT", "pt", "por", "pt-PT", "\u0050\u006F\u0072\u0074\u0075\u0067\u0075\u0065\u0073\u0065\u0020\u0028\u0050\u006F\u0072\u0074\u0075\u0067\u0061\u006C\u0029", "\u0070\u006F\u0072\u0074\u0075\u0067\u0075\u00EA\u0073\u0020\u0028\u0050\u006F\u0072\u0074\u0075\u0067\u0061\u006C\u0029", false, 0x00C1, "PT", "PRT", "\u0050\u006F\u0072\u0074\u0075\u0067\u0061\u006C", "\u0050\u006F\u0072\u0074\u0075\u0067\u0061\u006C", "\u0045\u0055\u0052", "\u0045\u0075\u0072\u006F", "\u0065\u0075\u0072\u006F", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u20AC", "\u002D", "\u002B", "\u004E\u0061\u004E\u0020\u0028\u004E\u00E3\u006F\u0020\u00E9\u0020\u0075\u006D\u0020\u006E\u00FA\u006D\u0065\u0072\u006F\u0029", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", "\u002B\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0043\u0061\u006C\u0065\u006E\u0064\u00E1\u0072\u0069\u006F\u0020\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u006F", 1, 0, "\u002D", "\u003A", "", "", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u002F\u004D", "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D", "\u0048\u0048\'\u0048\'\u006D\u006D\'\u006D\'" ], [ "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0079\u0079\u002E\u004D\u004D\u002E\u0064\u0064", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\'\u0048\'\u006D\u006D\'\u006D\'" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\u002F\u004D\u004D\u004D\u002F\u0079\u0079", "\u0064\u002E\u004D\u004D\u004D\u002E\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u0064\u006F\u006D", "\u0073\u0065\u0067", "\u0074\u0065\u0072", "\u0071\u0075\u0061", "\u0071\u0075\u0069", "\u0073\u0065\u0078", "\u0073\u00E1\u0062" ], [ "\u0064\u006F\u006D\u0069\u006E\u0067\u006F", "\u0073\u0065\u0067\u0075\u006E\u0064\u0061\u002D\u0066\u0065\u0069\u0072\u0061", "\u0074\u0065\u0072\u00E7\u0061\u002D\u0066\u0065\u0069\u0072\u0061", "\u0071\u0075\u0061\u0072\u0074\u0061\u002D\u0066\u0065\u0069\u0072\u0061", "\u0071\u0075\u0069\u006E\u0074\u0061\u002D\u0066\u0065\u0069\u0072\u0061", "\u0073\u0065\u0078\u0074\u0061\u002D\u0066\u0065\u0069\u0072\u0061", "\u0073\u00E1\u0062\u0061\u0064\u006F" ], [ "\u004A\u0061\u006E", "\u0046\u0065\u0076", "\u004D\u0061\u0072", "\u0041\u0062\u0072", "\u004D\u0061\u0069", "\u004A\u0075\u006E", "\u004A\u0075\u006C", "\u0041\u0067\u006F", "\u0053\u0065\u0074", "\u004F\u0075\u0074", "\u004E\u006F\u0076", "\u0044\u0065\u007A", "" ], [ "\u004A\u0061\u006E\u0065\u0069\u0072\u006F", "\u0046\u0065\u0076\u0065\u0072\u0065\u0069\u0072\u006F", "\u004D\u0061\u0072\u00E7\u006F", "\u0041\u0062\u0072\u0069\u006C", "\u004D\u0061\u0069\u006F", "\u004A\u0075\u006E\u0068\u006F", "\u004A\u0075\u006C\u0068\u006F", "\u0041\u0067\u006F\u0073\u0074\u006F", "\u0053\u0065\u0074\u0065\u006D\u0062\u0072\u006F", "\u004F\u0075\u0074\u0075\u0062\u0072\u006F", "\u004E\u006F\u0076\u0065\u006D\u0062\u0072\u006F", "\u0044\u0065\u007A\u0065\u006D\u0062\u0072\u006F", "" ] }, +{ 0x081A, 0x7C1A, "sr-SP-Latn", "sr", "srp", "sr-Latn-SP", "\u0053\u0065\u0072\u0062\u0069\u0061\u006E\u0020\u0028\u004C\u0061\u0074\u0069\u006E\u002C\u0020\u0053\u0065\u0072\u0062\u0069\u0061\u0020\u0061\u006E\u0064\u0020\u004D\u006F\u006E\u0074\u0065\u006E\u0065\u0067\u0072\u006F\u0029", "\u0073\u0072\u0070\u0073\u006B\u0069\u0020\u0028\u0053\u0072\u0062\u0069\u006A\u0061\u0020\u0069\u0020\u0043\u0072\u006E\u0061\u0020\u0047\u006F\u0072\u0061\u0029", false, 0x010D, "SP", "SPB", "\u0053\u0065\u0072\u0062\u0069\u0061\u0020\u0061\u006E\u0064\u0020\u004D\u006F\u006E\u0074\u0065\u006E\u0065\u0067\u0072\u006F", "\u0053\u0072\u0062\u0069\u006A\u0061\u0020\u0069\u0020\u0043\u0072\u006E\u0061\u0020\u0047\u006F\u0072\u0061", "\u0043\u0053\u0044", "\u0053\u0065\u0072\u0062\u0069\u0061\u006E\u0020\u0044\u0069\u006E\u0061\u0072", "\u0064\u0069\u006E\u0061\u0072", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u0044\u0069\u006E\u002E", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0062\u0065\u0073\u006B\u006F\u006E\u0061\u010D\u006E\u006F\u0073\u0074", "\u002B\u0062\u0065\u0073\u006B\u006F\u006E\u0061\u010D\u006E\u006F\u0073\u0074", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u006A\u0061\u006E\u0073\u006B\u0069\u0020\u006B\u0061\u006C\u0065\u006E\u0064\u0061\u0072", 1, 0, "\u002E", "\u003A", "", "", "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0064\u002E\u0020\u004D\u002E\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u002E\u0020\u004D\u002E\u0020\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u0064\u002E\u0020\u004D\u004D\u002E\u0020\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u006E\u0065\u0064", "\u0070\u006F\u006E", "\u0075\u0074\u006F", "\u0073\u0072\u0065", "\u010D\u0065\u0074", "\u0070\u0065\u0074", "\u0073\u0075\u0062" ], [ "\u006E\u0065\u0064\u0065\u006C\u006A\u0061", "\u0070\u006F\u006E\u0065\u0064\u0065\u006C\u006A\u0061\u006B", "\u0075\u0074\u006F\u0072\u0061\u006B", "\u0073\u0072\u0065\u0064\u0061", "\u010D\u0065\u0074\u0076\u0072\u0074\u0061\u006B", "\u0070\u0065\u0074\u0061\u006B", "\u0073\u0075\u0062\u006F\u0074\u0061" ], [ "\u006A\u0061\u006E", "\u0066\u0065\u0062", "\u006D\u0061\u0072", "\u0061\u0070\u0072", "\u006D\u0061\u006A", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0076\u0067", "\u0073\u0065\u0070", "\u006F\u006B\u0074", "\u006E\u006F\u0076", "\u0064\u0065\u0063", "" ], [ "\u006A\u0061\u006E\u0075\u0061\u0072", "\u0066\u0065\u0062\u0072\u0075\u0061\u0072", "\u006D\u0061\u0072\u0074", "\u0061\u0070\u0072\u0069\u006C", "\u006D\u0061\u006A", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0076\u0067\u0075\u0073\u0074", "\u0073\u0065\u0070\u0074\u0065\u006D\u0062\u0061\u0072", "\u006F\u006B\u0074\u006F\u0062\u0061\u0072", "\u006E\u006F\u0076\u0065\u006D\u0062\u0061\u0072", "\u0064\u0065\u0063\u0065\u006D\u0062\u0061\u0072", "" ] }, +{ 0x081D, 0x001D, "sv-FI", "sv", "swe", "sv-FI", "\u0053\u0077\u0065\u0064\u0069\u0073\u0068\u0020\u0028\u0046\u0069\u006E\u006C\u0061\u006E\u0064\u0029", "\u0073\u0076\u0065\u006E\u0073\u006B\u0061\u0020\u0028\u0046\u0069\u006E\u006C\u0061\u006E\u0064\u0029", false, 0x004D, "FI", "FIN", "\u0046\u0069\u006E\u006C\u0061\u006E\u0064", "\u0046\u0069\u006E\u006C\u0061\u006E\u0064", "\u0045\u0055\u0052", "\u0045\u0075\u0072\u006F", "\u0065\u0075\u0072\u006F", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002C", "\u00A0", "\u20AC", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u004E\u0046", "\u0049\u004E\u0046", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0073\u006B\u0020\u006B\u0061\u006C\u0065\u006E\u0064\u0065\u0072", 1, 2, "\u002E", "\u003A", "", "", "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D", "\'\u0064\u0065\u006E\u0020\'\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\'\u0064\u0065\u006E\u0020\'\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D", "\'\u006B\u006C\u0020\'\u0048\u003A\u006D\u006D" ], [ "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\'\u006B\u006C\u0020\'\u0048\u003A\u006D\u006D" ], [ "\'\u0064\u0065\u006E\u0020\'\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0073\u00F6", "\u006D\u00E5", "\u0074\u0069", "\u006F\u006E", "\u0074\u006F", "\u0066\u0072", "\u006C\u00F6" ], [ "\u0073\u00F6\u006E\u0064\u0061\u0067", "\u006D\u00E5\u006E\u0064\u0061\u0067", "\u0074\u0069\u0073\u0064\u0061\u0067", "\u006F\u006E\u0073\u0064\u0061\u0067", "\u0074\u006F\u0072\u0073\u0064\u0061\u0067", "\u0066\u0072\u0065\u0064\u0061\u0067", "\u006C\u00F6\u0072\u0064\u0061\u0067" ], [ "\u006A\u0061\u006E", "\u0066\u0065\u0062", "\u006D\u0061\u0072", "\u0061\u0070\u0072", "\u006D\u0061\u006A", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0075\u0067", "\u0073\u0065\u0070", "\u006F\u006B\u0074", "\u006E\u006F\u0076", "\u0064\u0065\u0063", "" ], [ "\u006A\u0061\u006E\u0075\u0061\u0072\u0069", "\u0066\u0065\u0062\u0072\u0075\u0061\u0072\u0069", "\u006D\u0061\u0072\u0073", "\u0061\u0070\u0072\u0069\u006C", "\u006D\u0061\u006A", "\u006A\u0075\u006E\u0069", "\u006A\u0075\u006C\u0069", "\u0061\u0075\u0067\u0075\u0073\u0074\u0069", "\u0073\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u006F\u006B\u0074\u006F\u0062\u0065\u0072", "\u006E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0064\u0065\u0063\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x082C, 0x002C, "az-AZ-Cyrl", "az", "aze", "az-Cyrl-AZ", "\u0041\u007A\u0065\u0072\u0069\u0020\u0028\u0043\u0079\u0072\u0069\u006C\u006C\u0069\u0063\u002C\u0020\u0041\u007A\u0065\u0072\u0062\u0061\u0069\u006A\u0061\u006E\u0029", "\u0410\u0437\u04D9\u0440\u0431\u0430\u0458\u04B9\u0430\u043D\u0020\u0028\u0410\u0437\u04D9\u0440\u0431\u0430\u0458\u04B9\u0430\u043D\u0029", false, 0x0005, "AZ", "AZE", "\u0041\u007A\u0065\u0072\u0062\u0061\u0069\u006A\u0061\u006E", "\u0410\u0437\u04D9\u0440\u0431\u0430\u0458\u04B9\u0430\u043D", "\u0041\u005A\u004D", "\u0041\u007A\u0065\u0072\u0062\u0061\u0069\u006A\u0061\u006E\u0069\u0061\u006E\u0020\u004D\u0061\u006E\u0061\u0074", "\u0440\u0443\u0431\u043B\u044C", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002C", "\u00A0", "\u043C\u0430\u043D\u002E", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0413\u0440\u0438\u0443\u043E\u0440\u0438\u0430\u043D", 1, 0, "\u002E", "\u003A", "", "", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0411", "\u0411\u0435", "\u0427\u0430", "\u0427", "\u04B8\u0430", "\u04B8", "\u0428" ], [ "\u0411\u0430\u0437\u0430\u0440", "\u0411\u0430\u0437\u0430\u0440\u00A0\u0435\u0440\u0442\u04D9\u0441\u0438", "\u0427\u04D9\u0440\u0448\u04D9\u043D\u0431\u04D9\u00A0\u0430\u0445\u0448\u0430\u043C\u044B", "\u0427\u04D9\u0440\u0448\u04D9\u043D\u0431\u04D9", "\u04B8\u04AF\u043C\u04D9\u00A0\u0430\u0445\u0448\u0430\u043C\u044B", "\u04B8\u04AF\u043C\u04D9", "\u0428\u04D9\u043D\u0431\u04D9" ], [ "\u0408\u0430\u043D", "\u0424\u0435\u0432", "\u041C\u0430\u0440", "\u0410\u043F\u0440", "\u041C\u0430\u0458", "\u0418\u0458\u0443\u043D", "\u0418\u0458\u0443\u043B", "\u0410\u0432\u0433", "\u0421\u0435\u043D", "\u041E\u043A\u0442", "\u041D\u043E\u044F", "\u0414\u0435\u043A", "" ], [ "\u0408\u0430\u043D\u0432\u0430\u0440", "\u0424\u0435\u0432\u0440\u0430\u043B", "\u041C\u0430\u0440\u0442", "\u0410\u043F\u0440\u0435\u043B", "\u041C\u0430\u0458", "\u0418\u0458\u0443\u043D", "\u0418\u0458\u0443\u043B", "\u0410\u0432\u0433\u0443\u0441\u0442", "\u0421\u0435\u043D\u0442\u0458\u0430\u0431\u0440", "\u041E\u043A\u0442\u0458\u0430\u0431\u0440", "\u041D\u043E\u0458\u0430\u0431\u0440", "\u0414\u0435\u043A\u0430\u0431\u0440", "" ] }, +{ 0x083E, 0x003E, "ms-BN", "ms", "msa", "ms-BN", "\u004D\u0061\u006C\u0061\u0079\u0020\u0028\u0042\u0072\u0075\u006E\u0065\u0069\u0020\u0044\u0061\u0072\u0075\u0073\u0073\u0061\u006C\u0061\u006D\u0029", "\u0042\u0061\u0068\u0061\u0073\u0061\u0020\u004D\u0061\u006C\u0061\u0079\u0073\u0069\u0061\u0020\u0028\u0042\u0072\u0075\u006E\u0065\u0069\u0020\u0044\u0061\u0072\u0075\u0073\u0073\u0061\u006C\u0061\u006D\u0029", false, 0x0025, "BN", "BRN", "\u0042\u0072\u0075\u006E\u0065\u0069\u0020\u0044\u0061\u0072\u0075\u0073\u0073\u0061\u006C\u0061\u006D", "\u0042\u0072\u0075\u006E\u0065\u0069\u0020\u0044\u0061\u0072\u0075\u0073\u0073\u0061\u006C\u0061\u006D", "\u0042\u004E\u0044", "\u0042\u0072\u0075\u006E\u0065\u0069\u0020\u0044\u006F\u006C\u006C\u0061\u0072", "\u0052\u0069\u006E\u0067\u0067\u0069\u0074\u0020\u0042\u0072\u0075\u006E\u0065\u0069", true, 2, 1, 0, 0, 0, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u0024", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u006B\u0061\u006C\u0065\u006E\u0064\u0061\u0072\u0020\u004D\u0061\u0073\u0065\u0068\u0069", 1, 0, "\u002F", "\u003A", "", "", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0041\u0068\u0061\u0064", "\u0049\u0073\u006E\u0069\u006E", "\u0053\u0065\u006C", "\u0052\u0061\u0062\u0075", "\u004B\u0068\u0061\u006D\u0069\u0073", "\u004A\u0075\u006D\u0061\u0061\u0074", "\u0053\u0061\u0062\u0074\u0075" ], [ "\u0041\u0068\u0061\u0064", "\u0049\u0073\u006E\u0069\u006E", "\u0053\u0065\u006C\u0061\u0073\u0061", "\u0052\u0061\u0062\u0075", "\u004B\u0068\u0061\u006D\u0069\u0073", "\u004A\u0075\u006D\u0061\u0061\u0074", "\u0053\u0061\u0062\u0074\u0075" ], [ "\u004A\u0061\u006E", "\u0046\u0065\u0062", "\u004D\u0061\u0063", "\u0041\u0070\u0072", "\u004D\u0065\u0069", "\u004A\u0075\u006E", "\u004A\u0075\u006C", "\u004F\u0067\u006F\u0073", "\u0053\u0065\u0070\u0074", "\u004F\u006B\u0074", "\u004E\u006F\u0076", "\u0044\u0069\u0073", "" ], [ "\u004A\u0061\u006E\u0075\u0061\u0072\u0069", "\u0046\u0065\u0062\u0072\u0075\u0061\u0072\u0069", "\u004D\u0061\u0063", "\u0041\u0070\u0072\u0069\u006C", "\u004D\u0065\u0069", "\u004A\u0075\u006E", "\u004A\u0075\u006C\u0061\u0069", "\u004F\u0067\u006F\u0073", "\u0053\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u004F\u006B\u0074\u006F\u0062\u0065\u0072", "\u004E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0044\u0069\u0073\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x0843, 0x0043, "uz-UZ-Cyrl", "uz", "uzb", "uz-Cyrl-UZ", "\u0055\u007A\u0062\u0065\u006B\u0020\u0028\u0043\u0079\u0072\u0069\u006C\u006C\u0069\u0063\u002C\u0020\u0055\u007A\u0062\u0065\u006B\u0069\u0073\u0074\u0061\u006E\u0029", "\u040E\u0437\u0431\u0435\u043A\u0020\u0028\u040E\u0437\u0431\u0435\u043A\u0438\u0441\u0442\u043E\u043D\u0029", false, 0x00F7, "UZ", "UZB", "\u0055\u007A\u0062\u0065\u006B\u0069\u0073\u0074\u0061\u006E", "\u040E\u0437\u0431\u0435\u043A\u0438\u0441\u0442\u043E\u043D\u00A0\u0420\u0435\u0441\u043F\u0443\u0431\u043B\u0438\u043A\u0430\u0441\u0438", "\u0055\u005A\u0053", "\u0055\u007A\u0062\u0065\u006B\u0069\u0073\u0074\u0061\u006E\u0020\u0053\u0075\u006D", "\u0440\u0443\u0431\u043B\u044C", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002C", "\u00A0", "\u0441\u045E\u043C", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0433\u0440\u0438\u0433\u043E\u0440\u0438\u0430\u043D\u0441\u043A\u0438\u0439\u0020\u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u044C", 1, 0, "\u002E", "\u003A", "", "", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D", "\u0079\u0079\u0079\u0079\u0020\'\u0439\u0438\u043B\'\u0020\u0064\u002D\u004D\u004D\u004D\u004D", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u002D\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0079\u0079\u0079\u0079\u0020\'\u0439\u0438\u043B\'\u0020\u0064\u002D\u004D\u004D\u004D\u004D", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u044F\u043A\u0448", "\u0434\u0448", "\u0441\u0448", "\u0447\u0448", "\u043F\u0448", "\u0436", "\u0448" ], [ "\u044F\u043A\u0448\u0430\u043D\u0431\u0430", "\u0434\u0443\u0448\u0430\u043D\u0431\u0430", "\u0441\u0435\u0448\u0430\u043D\u0431\u0430", "\u0447\u043E\u0440\u0448\u0430\u043D\u0431\u0430", "\u043F\u0430\u0439\u0448\u0430\u043D\u0431\u0430", "\u0436\u0443\u043C\u0430", "\u0448\u0430\u043D\u0431\u0430" ], [ "\u042F\u043D\u0432", "\u0424\u0435\u0432", "\u041C\u0430\u0440", "\u0410\u043F\u0440", "\u041C\u0430\u0439", "\u0418\u044E\u043D", "\u0418\u044E\u043B", "\u0410\u0432\u0433", "\u0421\u0435\u043D", "\u041E\u043A\u0442", "\u041D\u043E\u044F", "\u0414\u0435\u043A", "" ], [ "\u042F\u043D\u0432\u0430\u0440", "\u0424\u0435\u0432\u0440\u0430\u043B", "\u041C\u0430\u0440\u0442", "\u0410\u043F\u0440\u0435\u043B", "\u041C\u0430\u0439", "\u0418\u044E\u043D", "\u0418\u044E\u043B", "\u0410\u0432\u0433\u0443\u0441\u0442", "\u0421\u0435\u043D\u0442\u044F\u0431\u0440", "\u041E\u043A\u0442\u044F\u0431\u0440", "\u041D\u043E\u044F\u0431\u0440", "\u0414\u0435\u043A\u0430\u0431\u0440", "" ] }, +{ 0x0C01, 0x0001, "ar-EG", "ar", "ara", "ar-EG", "\u0041\u0072\u0061\u0062\u0069\u0063\u0020\u0028\u0045\u0067\u0079\u0070\u0074\u0029", "\u0627\u0644\u0639\u0631\u0628\u064A\u0629\u0020\u0028\u0645\u0635\u0631\u0029", false, 0x0043, "EG", "EGY", "\u0045\u0067\u0079\u0070\u0074", "\u0645\u0635\u0631", "\u0045\u0047\u0050", "\u0045\u0067\u0079\u0070\u0074\u0069\u0061\u006E\u0020\u0050\u006F\u0075\u006E\u0064", "\u062C\u0646\u064A\u0647\u00A0\u0645\u0635\u0631\u064A", true, 3, 3, 3, 3, 2, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u062C\u002E\u0645\u002E\u200F", "\u002D", "\u002B", "\u0644\u064A\u0633\u0020\u0628\u0631\u0642\u0645", "\u002D\u0644\u0627\u0020\u0646\u0647\u0627\u064A\u0629", "\u002B\u0644\u0627\u0020\u0646\u0647\u0627\u064A\u0629", [ "\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669" ], 1, [ 1, 23, 6, 2, 9, 10, 12 ], "\u0627\u0644\u062A\u0642\u0648\u064A\u0645\u00A0\u0627\u0644\u0645\u064A\u0644\u0627\u062F\u064A\u00A0\u0028\u062A\u0633\u0645\u064A\u0629\u00A0\u0625\u0646\u062C\u0644\u064A\u0632\u064A\u0629\u0029\u200F", 6, 0, "\u002F", "\u003A", "\u0635", "\u0645", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0627\u0644\u0627\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0627\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" ], [ "\u0627\u0644\u0627\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0627\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" ], [ "\u064A\u0646\u0627\u064A\u0631", "\u0641\u0628\u0631\u0627\u064A\u0631", "\u0645\u0627\u0631\u0633", "\u0627\u0628\u0631\u064A\u0644", "\u0645\u0627\u064A\u0648", "\u064A\u0648\u0646\u064A\u0648", "\u064A\u0648\u0644\u064A\u0648", "\u0627\u063A\u0633\u0637\u0633", "\u0633\u0628\u062A\u0645\u0628\u0631", "\u0627\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0641\u0645\u0628\u0631", "\u062F\u064A\u0633\u0645\u0628\u0631", "" ], [ "\u064A\u0646\u0627\u064A\u0631", "\u0641\u0628\u0631\u0627\u064A\u0631", "\u0645\u0627\u0631\u0633", "\u0627\u0628\u0631\u064A\u0644", "\u0645\u0627\u064A\u0648", "\u064A\u0648\u0646\u064A\u0648", "\u064A\u0648\u0644\u064A\u0648", "\u0627\u063A\u0633\u0637\u0633", "\u0633\u0628\u062A\u0645\u0628\u0631", "\u0627\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0641\u0645\u0628\u0631", "\u062F\u064A\u0633\u0645\u0628\u0631", "" ] }, +{ 0x0C04, 0x7C04, "zh-HK", "zh", "zho", "zh-HK", "\u0043\u0068\u0069\u006E\u0065\u0073\u0065\u0020\u0028\u0048\u006F\u006E\u0067\u0020\u004B\u006F\u006E\u0067\u0020\u0053\u002E\u0041\u002E\u0052\u002E\u0029", "\u4E2D\u6587\u0028\u9999\u6E2F\u7279\u522B\u884C\u653F\u5340\u0029", false, 0x0068, "HK", "HKG", "\u0048\u006F\u006E\u0067\u0020\u004B\u006F\u006E\u0067\u0020\u0053\u002E\u0041\u002E\u0052\u002E", "\u9999\u6E2F\u7279\u522B\u884C\u653F\u5340", "\u0048\u004B\u0044", "\u0048\u006F\u006E\u0067\u0020\u004B\u006F\u006E\u0067\u0020\u0044\u006F\u006C\u006C\u0061\u0072", "\u6E2F\u5E63", true, 2, 1, 2, 0, 0, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0048\u004B\u0024", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u65E5\u66C6", 0, 0, "\u002F", "\u003A", "", "", "\u0064\u002F\u004D\u002F\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u002F\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0079\u0079\u002F\u004D\u002F\u0064", "\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0079\u0079\u0079\u0079\u002F\u004D\u002F\u0064", "\u0079\u0079\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u0020\u0079\u0079\u0079\u0079\u0020\u004D\u004D\u0020\u0064\u0064", "\u0079\u0079\u0079\u0079\u0020\u004D\u004D\u0020\u0064\u0064" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0053\u0075\u006E", "\u004D\u006F\u006E", "\u0054\u0075\u0065", "\u0057\u0065\u0064", "\u0054\u0068\u0075", "\u0046\u0072\u0069", "\u0053\u0061\u0074" ], [ "\u0053\u0075\u006E\u0064\u0061\u0079", "\u004D\u006F\u006E\u0064\u0061\u0079", "\u0054\u0075\u0065\u0073\u0064\u0061\u0079", "\u0057\u0065\u0064\u006E\u0065\u0073\u0064\u0061\u0079", "\u0054\u0068\u0075\u0072\u0073\u0064\u0061\u0079", "\u0046\u0072\u0069\u0064\u0061\u0079", "\u0053\u0061\u0074\u0075\u0072\u0064\u0061\u0079" ], [ "\u004A\u0061\u006E", "\u0046\u0065\u0062", "\u004D\u0061\u0072", "\u0041\u0070\u0072", "\u004D\u0061\u0079", "\u004A\u0075\u006E", "\u004A\u0075\u006C", "\u0041\u0075\u0067", "\u0053\u0065\u0070", "\u004F\u0063\u0074", "\u004E\u006F\u0076", "\u0044\u0065\u0063", "" ], [ "\u004A\u0061\u006E\u0075\u0061\u0072\u0079", "\u0046\u0065\u0062\u0072\u0075\u0061\u0072\u0079", "\u004D\u0061\u0072\u0063\u0068", "\u0041\u0070\u0072\u0069\u006C", "\u004D\u0061\u0079", "\u004A\u0075\u006E\u0065", "\u004A\u0075\u006C\u0079", "\u0041\u0075\u0067\u0075\u0073\u0074", "\u0053\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u004F\u0063\u0074\u006F\u0062\u0065\u0072", "\u004E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0044\u0065\u0063\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x0C07, 0x0007, "de-AT", "de", "deu", "de-AT", "\u0047\u0065\u0072\u006D\u0061\u006E\u0020\u0028\u0041\u0075\u0073\u0074\u0072\u0069\u0061\u0029", "\u0044\u0065\u0075\u0074\u0073\u0063\u0068\u0020\u0028\u00D6\u0073\u0074\u0065\u0072\u0072\u0065\u0069\u0063\u0068\u0029", false, 0x000E, "AT", "AUT", "\u0041\u0075\u0073\u0074\u0072\u0069\u0061", "\u00D6\u0073\u0074\u0065\u0072\u0072\u0065\u0069\u0063\u0068", "\u0045\u0055\u0052", "\u0045\u0075\u0072\u006F", "\u0045\u0075\u0072\u006F", true, 2, 1, 2, 9, 2, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u20AC", "\u002D", "\u002B", "\u006E\u002E\u0020\u0064\u0065\u0066\u002E", "\u002D\u0075\u006E\u0065\u006E\u0064\u006C\u0069\u0063\u0068", "\u002B\u0075\u006E\u0065\u006E\u0064\u006C\u0069\u0063\u0068", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0047\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0069\u0073\u0063\u0068\u0065\u0072\u0020\u004B\u0061\u006C\u0065\u006E\u0064\u0065\u0072", 1, 0, "\u002E", "\u003A", "", "", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D\'\u0020\u0055\u0068\u0072\'" ], [ "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D\'\u0020\u0055\u0068\u0072\'" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u002E\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u002E\u004D\u004D\u004D\u0079\u0079\u0079\u0079", "\u0064\u0020\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0053\u006F", "\u004D\u006F", "\u0044\u0069", "\u004D\u0069", "\u0044\u006F", "\u0046\u0072", "\u0053\u0061" ], [ "\u0053\u006F\u006E\u006E\u0074\u0061\u0067", "\u004D\u006F\u006E\u0074\u0061\u0067", "\u0044\u0069\u0065\u006E\u0073\u0074\u0061\u0067", "\u004D\u0069\u0074\u0074\u0077\u006F\u0063\u0068", "\u0044\u006F\u006E\u006E\u0065\u0072\u0073\u0074\u0061\u0067", "\u0046\u0072\u0065\u0069\u0074\u0061\u0067", "\u0053\u0061\u006D\u0073\u0074\u0061\u0067" ], [ "\u004A\u00E4\u006E", "\u0046\u0065\u0062", "\u004D\u00E4\u0072", "\u0041\u0070\u0072", "\u004D\u0061\u0069", "\u004A\u0075\u006E", "\u004A\u0075\u006C", "\u0041\u0075\u0067", "\u0053\u0065\u0070", "\u004F\u006B\u0074", "\u004E\u006F\u0076", "\u0044\u0065\u007A", "" ], [ "\u004A\u00E4\u006E\u006E\u0065\u0072", "\u0046\u0065\u0062\u0072\u0075\u0061\u0072", "\u004D\u00E4\u0072\u007A", "\u0041\u0070\u0072\u0069\u006C", "\u004D\u0061\u0069", "\u004A\u0075\u006E\u0069", "\u004A\u0075\u006C\u0069", "\u0041\u0075\u0067\u0075\u0073\u0074", "\u0053\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u004F\u006B\u0074\u006F\u0062\u0065\u0072", "\u004E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0044\u0065\u007A\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x0C09, 0x0009, "en-AU", "en", "eng", "en-AU", "\u0045\u006E\u0067\u006C\u0069\u0073\u0068\u0020\u0028\u0041\u0075\u0073\u0074\u0072\u0061\u006C\u0069\u0061\u0029", "\u0045\u006E\u0067\u006C\u0069\u0073\u0068\u0020\u0028\u0041\u0075\u0073\u0074\u0072\u0061\u006C\u0069\u0061\u0029", false, 0x000C, "AU", "AUS", "\u0041\u0075\u0073\u0074\u0072\u0061\u006C\u0069\u0061", "\u0041\u0075\u0073\u0074\u0072\u0061\u006C\u0069\u0061", "\u0041\u0055\u0044", "\u0041\u0075\u0073\u0074\u0072\u0061\u006C\u0069\u0061\u006E\u0020\u0044\u006F\u006C\u006C\u0061\u0072", "\u0041\u0075\u0073\u0074\u0072\u0061\u006C\u0069\u0061\u006E\u0020\u0044\u006F\u006C\u006C\u0061\u0072", true, 2, 1, 2, 1, 0, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0024", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1, 2 ], "\u0047\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0020\u0043\u0061\u006C\u0065\u006E\u0064\u0061\u0072", 1, 0, "\u002F", "\u003A", "\u0041\u004D", "\u0050\u004D", "\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u004D\u002D\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0079\u0079\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064" ], [ "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0053\u0075\u006E", "\u004D\u006F\u006E", "\u0054\u0075\u0065", "\u0057\u0065\u0064", "\u0054\u0068\u0075", "\u0046\u0072\u0069", "\u0053\u0061\u0074" ], [ "\u0053\u0075\u006E\u0064\u0061\u0079", "\u004D\u006F\u006E\u0064\u0061\u0079", "\u0054\u0075\u0065\u0073\u0064\u0061\u0079", "\u0057\u0065\u0064\u006E\u0065\u0073\u0064\u0061\u0079", "\u0054\u0068\u0075\u0072\u0073\u0064\u0061\u0079", "\u0046\u0072\u0069\u0064\u0061\u0079", "\u0053\u0061\u0074\u0075\u0072\u0064\u0061\u0079" ], [ "\u004A\u0061\u006E", "\u0046\u0065\u0062", "\u004D\u0061\u0072", "\u0041\u0070\u0072", "\u004D\u0061\u0079", "\u004A\u0075\u006E", "\u004A\u0075\u006C", "\u0041\u0075\u0067", "\u0053\u0065\u0070", "\u004F\u0063\u0074", "\u004E\u006F\u0076", "\u0044\u0065\u0063", "" ], [ "\u004A\u0061\u006E\u0075\u0061\u0072\u0079", "\u0046\u0065\u0062\u0072\u0075\u0061\u0072\u0079", "\u004D\u0061\u0072\u0063\u0068", "\u0041\u0070\u0072\u0069\u006C", "\u004D\u0061\u0079", "\u004A\u0075\u006E\u0065", "\u004A\u0075\u006C\u0079", "\u0041\u0075\u0067\u0075\u0073\u0074", "\u0053\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u004F\u0063\u0074\u006F\u0062\u0065\u0072", "\u004E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0044\u0065\u0063\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x0C0A, 0x000A, "es-ES", "es", "spa", "es-ES", "\u0053\u0070\u0061\u006E\u0069\u0073\u0068\u0020\u0028\u0053\u0070\u0061\u0069\u006E\u0029", "\u0065\u0073\u0070\u0061\u00F1\u006F\u006C\u0020\u0028\u0045\u0073\u0070\u0061\u00F1\u0061\u0029", false, 0x00D9, "ES", "ESP", "\u0053\u0070\u0061\u0069\u006E", "\u0045\u0073\u0070\u0061\u00F1\u0061", "\u0045\u0055\u0052", "\u0045\u0075\u0072\u006F", "\u0065\u0075\u0072\u006F", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u20AC", "\u002D", "\u002B", "\u004E\u0065\u0075\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0063\u0061\u006C\u0065\u006E\u0064\u0061\u0072\u0069\u006F\u0020\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u006F", 1, 0, "\u002F", "\u003A", "", "", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D", "\u0048\u0048\'\u0048\'\u006D\u006D\'\u005C\'\'" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D", "\u0048\u0048\'\u0048\'\u006D\u006D\'\u005C\'\'\u0073\u0073\'\u005C\'\u005C\'\'" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u0020\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u0064\u006F\u006D", "\u006C\u0075\u006E", "\u006D\u0061\u0072", "\u006D\u0069\u00E9", "\u006A\u0075\u0065", "\u0076\u0069\u0065", "\u0073\u00E1\u0062" ], [ "\u0064\u006F\u006D\u0069\u006E\u0067\u006F", "\u006C\u0075\u006E\u0065\u0073", "\u006D\u0061\u0072\u0074\u0065\u0073", "\u006D\u0069\u00E9\u0072\u0063\u006F\u006C\u0065\u0073", "\u006A\u0075\u0065\u0076\u0065\u0073", "\u0076\u0069\u0065\u0072\u006E\u0065\u0073", "\u0073\u00E1\u0062\u0061\u0064\u006F" ], [ "\u0065\u006E\u0065", "\u0066\u0065\u0062", "\u006D\u0061\u0072", "\u0061\u0062\u0072", "\u006D\u0061\u0079", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0067\u006F", "\u0073\u0065\u0070", "\u006F\u0063\u0074", "\u006E\u006F\u0076", "\u0064\u0069\u0063", "" ], [ "\u0065\u006E\u0065\u0072\u006F", "\u0066\u0065\u0062\u0072\u0065\u0072\u006F", "\u006D\u0061\u0072\u007A\u006F", "\u0061\u0062\u0072\u0069\u006C", "\u006D\u0061\u0079\u006F", "\u006A\u0075\u006E\u0069\u006F", "\u006A\u0075\u006C\u0069\u006F", "\u0061\u0067\u006F\u0073\u0074\u006F", "\u0073\u0065\u0070\u0074\u0069\u0065\u006D\u0062\u0072\u0065", "\u006F\u0063\u0074\u0075\u0062\u0072\u0065", "\u006E\u006F\u0076\u0069\u0065\u006D\u0062\u0072\u0065", "\u0064\u0069\u0063\u0069\u0065\u006D\u0062\u0072\u0065", "" ] }, +{ 0x0C0C, 0x000C, "fr-CA", "fr", "fra", "fr-CA", "\u0046\u0072\u0065\u006E\u0063\u0068\u0020\u0028\u0043\u0061\u006E\u0061\u0064\u0061\u0029", "\u0066\u0072\u0061\u006E\u00E7\u0061\u0069\u0073\u0020\u0028\u0043\u0061\u006E\u0061\u0064\u0061\u0029", false, 0x0027, "CA", "CAN", "\u0043\u0061\u006E\u0061\u0064\u0061", "\u0043\u0061\u006E\u0061\u0064\u0061", "\u0043\u0041\u0044", "\u0043\u0061\u006E\u0061\u0064\u0069\u0061\u006E\u0020\u0044\u006F\u006C\u006C\u0061\u0072", "\u0044\u006F\u006C\u006C\u0061\u0072\u0020\u0063\u0061\u006E\u0061\u0064\u0069\u0065\u006E", true, 2, 1, 2, 15, 3, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002C", "\u00A0", "\u0024", "\u002D", "\u002B", "\u004E\u006F\u006E\u0020\u004E\u0075\u006D\u00E9\u0072\u0069\u0071\u0075\u0065", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069", "\u002B\u0049\u006E\u0066\u0069\u006E\u0069", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0063\u0061\u006C\u0065\u006E\u0064\u0072\u0069\u0065\u0072\u0020\u0067\u0072\u00E9\u0067\u006F\u0072\u0069\u0065\u006E", 0, 0, "\u002D", "\u003A", "", "", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0048\u0048\u003A\u006D\u006D", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D", "\u0048\'\u0020\u0068\u0020\'\u006D\u006D" ], [ "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0079\u0079\u0020\u004D\u004D\u0020\u0064\u0064", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\'\u0020\u0068\u0020\'\u006D\u006D", "\u0048\u003A\u006D\u006D" ], [ "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0020\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0064\u0069\u006D\u002E", "\u006C\u0075\u006E\u002E", "\u006D\u0061\u0072\u002E", "\u006D\u0065\u0072\u002E", "\u006A\u0065\u0075\u002E", "\u0076\u0065\u006E\u002E", "\u0073\u0061\u006D\u002E" ], [ "\u0064\u0069\u006D\u0061\u006E\u0063\u0068\u0065", "\u006C\u0075\u006E\u0064\u0069", "\u006D\u0061\u0072\u0064\u0069", "\u006D\u0065\u0072\u0063\u0072\u0065\u0064\u0069", "\u006A\u0065\u0075\u0064\u0069", "\u0076\u0065\u006E\u0064\u0072\u0065\u0064\u0069", "\u0073\u0061\u006D\u0065\u0064\u0069" ], [ "\u006A\u0061\u006E\u0076\u002E", "\u0066\u00E9\u0076\u0072\u002E", "\u006D\u0061\u0072\u0073", "\u0061\u0076\u0072\u002E", "\u006D\u0061\u0069", "\u006A\u0075\u0069\u006E", "\u006A\u0075\u0069\u006C\u002E", "\u0061\u006F\u00FB\u0074", "\u0073\u0065\u0070\u0074\u002E", "\u006F\u0063\u0074\u002E", "\u006E\u006F\u0076\u002E", "\u0064\u00E9\u0063\u002E", "" ], [ "\u006A\u0061\u006E\u0076\u0069\u0065\u0072", "\u0066\u00E9\u0076\u0072\u0069\u0065\u0072", "\u006D\u0061\u0072\u0073", "\u0061\u0076\u0072\u0069\u006C", "\u006D\u0061\u0069", "\u006A\u0075\u0069\u006E", "\u006A\u0075\u0069\u006C\u006C\u0065\u0074", "\u0061\u006F\u00FB\u0074", "\u0073\u0065\u0070\u0074\u0065\u006D\u0062\u0072\u0065", "\u006F\u0063\u0074\u006F\u0062\u0072\u0065", "\u006E\u006F\u0076\u0065\u006D\u0062\u0072\u0065", "\u0064\u00E9\u0063\u0065\u006D\u0062\u0072\u0065", "" ] }, +{ 0x0C1A, 0x7C1A, "sr-SP-Cyrl", "sr", "srp", "sr-Cyrl-SP", "\u0053\u0065\u0072\u0062\u0069\u0061\u006E\u0020\u0028\u0043\u0079\u0072\u0069\u006C\u006C\u0069\u0063\u002C\u0020\u0053\u0065\u0072\u0062\u0069\u0061\u0020\u0061\u006E\u0064\u0020\u004D\u006F\u006E\u0074\u0065\u006E\u0065\u0067\u0072\u006F\u0029", "\u0441\u0440\u043F\u0441\u043A\u0438\u0020\u0028\u0421\u0440\u0431\u0438\u0458\u0430\u00A0\u0438\u00A0\u0426\u0440\u043D\u0430\u00A0\u0413\u043E\u0440\u0430\u0029", false, 0x010D, "SP", "SPB", "\u0053\u0065\u0072\u0062\u0069\u0061\u0020\u0061\u006E\u0064\u0020\u004D\u006F\u006E\u0074\u0065\u006E\u0065\u0067\u0072\u006F", "\u0421\u0440\u0431\u0438\u0458\u0430\u00A0\u0438\u00A0\u0426\u0440\u043D\u0430\u00A0\u0413\u043E\u0440\u0430", "\u0043\u0053\u0044", "\u0053\u0065\u0072\u0062\u0069\u0061\u006E\u0020\u0044\u0069\u006E\u0061\u0072", "\u0434\u0438\u043D\u0430\u0440", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u0414\u0438\u043D\u002E", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0431\u0435\u0441\u043A\u043E\u043D\u0430\u0447\u043D\u043E\u0441\u0442", "\u002B\u0431\u0435\u0441\u043A\u043E\u043D\u0430\u0447\u043D\u043E\u0441\u0442", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0433\u0440\u0435\u0433\u043E\u0440\u0438\u0458\u0430\u043D\u0441\u043A\u0438\u0020\u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440", 1, 0, "\u002E", "\u003A", "", "", "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0064\u002E\u0020\u004D\u002E\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u002E\u0020\u004D\u002E\u0020\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u0064\u002E\u0020\u004D\u004D\u002E\u0020\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u043D\u0435\u0434", "\u043F\u043E\u043D", "\u0443\u0442\u043E", "\u0441\u0440\u0435", "\u0447\u0435\u0442", "\u043F\u0435\u0442", "\u0441\u0443\u0431" ], [ "\u043D\u0435\u0434\u0435\u0459\u0430", "\u043F\u043E\u043D\u0435\u0434\u0435\u0459\u0430\u043A", "\u0443\u0442\u043E\u0440\u0430\u043A", "\u0441\u0440\u0435\u0434\u0430", "\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043A", "\u043F\u0435\u0442\u0430\u043A", "\u0441\u0443\u0431\u043E\u0442\u0430" ], [ "\u0458\u0430\u043D", "\u0444\u0435\u0431", "\u043C\u0430\u0440", "\u0430\u043F\u0440", "\u043C\u0430\u0458", "\u0458\u0443\u043D", "\u0458\u0443\u043B", "\u0430\u0432\u0433", "\u0441\u0435\u043F", "\u043E\u043A\u0442", "\u043D\u043E\u0432", "\u0434\u0435\u0446", "" ], [ "\u0458\u0430\u043D\u0443\u0430\u0440", "\u0444\u0435\u0431\u0440\u0443\u0430\u0440", "\u043C\u0430\u0440\u0442", "\u0430\u043F\u0440\u0438\u043B", "\u043C\u0430\u0458", "\u0458\u0443\u043D", "\u0458\u0443\u043B", "\u0430\u0432\u0433\u0443\u0441\u0442", "\u0441\u0435\u043F\u0442\u0435\u043C\u0431\u0430\u0440", "\u043E\u043A\u0442\u043E\u0431\u0430\u0440", "\u043D\u043E\u0432\u0435\u043C\u0431\u0430\u0440", "\u0434\u0435\u0446\u0435\u043C\u0431\u0430\u0440", "" ] }, +{ 0x1001, 0x0001, "ar-LY", "ar", "ara", "ar-LY", "\u0041\u0072\u0061\u0062\u0069\u0063\u0020\u0028\u004C\u0069\u0062\u0079\u0061\u0029", "\u0627\u0644\u0639\u0631\u0628\u064A\u0629\u0020\u0028\u0644\u064A\u0628\u064A\u0627\u0029", false, 0x0094, "LY", "LBY", "\u004C\u0069\u0062\u0079\u0061", "\u0644\u064A\u0628\u064A\u0627", "\u004C\u0059\u0044", "\u004C\u0069\u0062\u0079\u0061\u006E\u0020\u0044\u0069\u006E\u0061\u0072", "\u062F\u064A\u0646\u0627\u0631\u00A0\u0644\u064A\u0628\u064A", true, 2, 3, 2, 3, 2, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u062F\u002E\u0644\u002E\u200F", "\u002D", "\u002B", "\u0644\u064A\u0633\u0020\u0628\u0631\u0642\u0645", "\u002D\u0644\u0627\u0020\u0646\u0647\u0627\u064A\u0629", "\u002B\u0644\u0627\u0020\u0646\u0647\u0627\u064A\u0629", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1, 6, 23, 2, 9, 10, 12 ], "\u0627\u0644\u062A\u0642\u0648\u064A\u0645\u00A0\u0627\u0644\u0645\u064A\u0644\u0627\u062F\u064A\u00A0\u0028\u062A\u0633\u0645\u064A\u0629\u00A0\u0625\u0646\u062C\u0644\u064A\u0632\u064A\u0629\u0029\u200F", 6, 0, "\u002F", "\u003A", "\u0635", "\u0645", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0627\u0644\u0627\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0627\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" ], [ "\u0627\u0644\u0627\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0627\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" ], [ "\u064A\u0646\u0627\u064A\u0631", "\u0641\u0628\u0631\u0627\u064A\u0631", "\u0645\u0627\u0631\u0633", "\u0627\u0628\u0631\u064A\u0644", "\u0645\u0627\u064A\u0648", "\u064A\u0648\u0646\u064A\u0648", "\u064A\u0648\u0644\u064A\u0648", "\u0627\u063A\u0633\u0637\u0633", "\u0633\u0628\u062A\u0645\u0628\u0631", "\u0627\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0641\u0645\u0628\u0631", "\u062F\u064A\u0633\u0645\u0628\u0631", "" ], [ "\u064A\u0646\u0627\u064A\u0631", "\u0641\u0628\u0631\u0627\u064A\u0631", "\u0645\u0627\u0631\u0633", "\u0627\u0628\u0631\u064A\u0644", "\u0645\u0627\u064A\u0648", "\u064A\u0648\u0646\u064A\u0648", "\u064A\u0648\u0644\u064A\u0648", "\u0627\u063A\u0633\u0637\u0633", "\u0633\u0628\u062A\u0645\u0628\u0631", "\u0627\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0641\u0645\u0628\u0631", "\u062F\u064A\u0633\u0645\u0628\u0631", "" ] }, +{ 0x1004, 0x0004, "zh-SG", "zh", "zho", "zh-SG", "\u0043\u0068\u0069\u006E\u0065\u0073\u0065\u0020\u0028\u0053\u0069\u006E\u0067\u0061\u0070\u006F\u0072\u0065\u0029", "\u4E2D\u6587\u0028\u65B0\u52A0\u5761\u0029", false, 0x00D7, "SG", "SGP", "\u0053\u0069\u006E\u0067\u0061\u0070\u006F\u0072\u0065", "\u65B0\u52A0\u5761", "\u0053\u0047\u0044", "\u0053\u0069\u006E\u0067\u0061\u0070\u006F\u0072\u0065\u0020\u0044\u006F\u006C\u006C\u0061\u0072", "\u65B0\u5E01", false, 2, 1, 2, 0, 0, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0024", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u897F\u5386", 0, 0, "\u002F", "\u003A", "\u0041\u004D", "\u0050\u004D", "\u0064\u002F\u004D\u002F\u0079\u0079\u0079\u0079", "\u0074\u0074\u0020\u0068\u003A\u006D\u006D", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0074\u0074\u0020\u0068\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0074\u0074\u0020\u0068\u003A\u006D\u006D", "\u0074\u0074\u0020\u0068\u0068\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u002F\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0079\u0079\u002F\u004D\u002F\u0064", "\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0079\u0079\u0079\u0079\u002F\u004D\u002F\u0064", "\u0079\u0079\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0074\u0074\u0020\u0068\u003A\u006D\u006D\u003A\u0073\u0073", "\u0074\u0074\u0020\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u0020\u0079\u0079\u0079\u0079\u0020\u004D\u004D\u0020\u0064\u0064", "\u0079\u0079\u0079\u0079\u0020\u004D\u004D\u0020\u0064\u0064" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u661F\u671F\u65E5", "\u661F\u671F\u4E00", "\u661F\u671F\u4E8C", "\u661F\u671F\u4E09", "\u661F\u671F\u56DB", "\u661F\u671F\u4E94", "\u661F\u671F\u516D" ], [ "\u661F\u671F\u65E5", "\u661F\u671F\u4E00", "\u661F\u671F\u4E8C", "\u661F\u671F\u4E09", "\u661F\u671F\u56DB", "\u661F\u671F\u4E94", "\u661F\u671F\u516D" ], [ "\u4E00\u6708", "\u4E8C\u6708", "\u4E09\u6708", "\u56DB\u6708", "\u4E94\u6708", "\u516D\u6708", "\u4E03\u6708", "\u516B\u6708", "\u4E5D\u6708", "\u5341\u6708", "\u5341\u4E00\u6708", "\u5341\u4E8C\u6708", "" ], [ "\u4E00\u6708", "\u4E8C\u6708", "\u4E09\u6708", "\u56DB\u6708", "\u4E94\u6708", "\u516D\u6708", "\u4E03\u6708", "\u516B\u6708", "\u4E5D\u6708", "\u5341\u6708", "\u5341\u4E00\u6708", "\u5341\u4E8C\u6708", "" ] }, +{ 0x1007, 0x0007, "de-LU", "de", "deu", "de-LU", "\u0047\u0065\u0072\u006D\u0061\u006E\u0020\u0028\u004C\u0075\u0078\u0065\u006D\u0062\u006F\u0075\u0072\u0067\u0029", "\u0044\u0065\u0075\u0074\u0073\u0063\u0068\u0020\u0028\u004C\u0075\u0078\u0065\u006D\u0062\u0075\u0072\u0067\u0029", false, 0x0093, "LU", "LUX", "\u004C\u0075\u0078\u0065\u006D\u0062\u006F\u0075\u0072\u0067", "\u004C\u0075\u0078\u0065\u006D\u0062\u0075\u0072\u0067", "\u0045\u0055\u0052", "\u0045\u0075\u0072\u006F", "\u0045\u0075\u0072\u006F", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u20AC", "\u002D", "\u002B", "\u006E\u002E\u0020\u0064\u0065\u0066\u002E", "\u002D\u0075\u006E\u0065\u006E\u0064\u006C\u0069\u0063\u0068", "\u002B\u0075\u006E\u0065\u006E\u0064\u006C\u0069\u0063\u0068", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0047\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0069\u0073\u0063\u0068\u0065\u0072\u0020\u004B\u0061\u006C\u0065\u006E\u0064\u0065\u0072", 1, 2, "\u002E", "\u003A", "", "", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D", "\u0048\u002E\u006D\u006D", "\u0048\u002E\u006D\u006D\'\u0020\u0055\u0068\u0072\u0020\'" ], [ "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u002E\u006D\u006D", "\u0048\u002E\u006D\u006D\'\u0020\u0055\u0068\u0072\u0020\'" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u002E\u0020\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0053\u006F", "\u004D\u006F", "\u0044\u0069", "\u004D\u0069", "\u0044\u006F", "\u0046\u0072", "\u0053\u0061" ], [ "\u0053\u006F\u006E\u006E\u0074\u0061\u0067", "\u004D\u006F\u006E\u0074\u0061\u0067", "\u0044\u0069\u0065\u006E\u0073\u0074\u0061\u0067", "\u004D\u0069\u0074\u0074\u0077\u006F\u0063\u0068", "\u0044\u006F\u006E\u006E\u0065\u0072\u0073\u0074\u0061\u0067", "\u0046\u0072\u0065\u0069\u0074\u0061\u0067", "\u0053\u0061\u006D\u0073\u0074\u0061\u0067" ], [ "\u004A\u0061\u006E", "\u0046\u0065\u0062", "\u004D\u0072\u007A", "\u0041\u0070\u0072", "\u004D\u0061\u0069", "\u004A\u0075\u006E", "\u004A\u0075\u006C", "\u0041\u0075\u0067", "\u0053\u0065\u0070", "\u004F\u006B\u0074", "\u004E\u006F\u0076", "\u0044\u0065\u007A", "" ], [ "\u004A\u0061\u006E\u0075\u0061\u0072", "\u0046\u0065\u0062\u0072\u0075\u0061\u0072", "\u004D\u00E4\u0072\u007A", "\u0041\u0070\u0072\u0069\u006C", "\u004D\u0061\u0069", "\u004A\u0075\u006E\u0069", "\u004A\u0075\u006C\u0069", "\u0041\u0075\u0067\u0075\u0073\u0074", "\u0053\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u004F\u006B\u0074\u006F\u0062\u0065\u0072", "\u004E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0044\u0065\u007A\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x1009, 0x0009, "en-CA", "en", "eng", "en-CA", "\u0045\u006E\u0067\u006C\u0069\u0073\u0068\u0020\u0028\u0043\u0061\u006E\u0061\u0064\u0061\u0029", "\u0045\u006E\u0067\u006C\u0069\u0073\u0068\u0020\u0028\u0043\u0061\u006E\u0061\u0064\u0061\u0029", false, 0x0027, "CA", "CAN", "\u0043\u0061\u006E\u0061\u0064\u0061", "\u0043\u0061\u006E\u0061\u0064\u0061", "\u0043\u0041\u0044", "\u0043\u0061\u006E\u0061\u0064\u0069\u0061\u006E\u0020\u0044\u006F\u006C\u006C\u0061\u0072", "\u0043\u0061\u006E\u0061\u0064\u0069\u0061\u006E\u0020\u0044\u006F\u006C\u006C\u0061\u0072", true, 2, 1, 2, 1, 0, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0024", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1, 2 ], "\u0047\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0020\u0043\u0061\u006C\u0065\u006E\u0064\u0061\u0072", 0, 0, "\u002F", "\u003A", "\u0041\u004D", "\u0050\u004D", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u004D\u004D\u004D\u004D\u0020\u0064\u002C\u0020\u0079\u0079\u0079\u0079", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u004D\u002F\u0064\u0064\u002F\u0079\u0079" ], [ "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u004D\u004D\u004D\u004D\u0020\u0064\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u002D\u004D\u004D\u004D\u002D\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0053\u0075\u006E", "\u004D\u006F\u006E", "\u0054\u0075\u0065", "\u0057\u0065\u0064", "\u0054\u0068\u0075", "\u0046\u0072\u0069", "\u0053\u0061\u0074" ], [ "\u0053\u0075\u006E\u0064\u0061\u0079", "\u004D\u006F\u006E\u0064\u0061\u0079", "\u0054\u0075\u0065\u0073\u0064\u0061\u0079", "\u0057\u0065\u0064\u006E\u0065\u0073\u0064\u0061\u0079", "\u0054\u0068\u0075\u0072\u0073\u0064\u0061\u0079", "\u0046\u0072\u0069\u0064\u0061\u0079", "\u0053\u0061\u0074\u0075\u0072\u0064\u0061\u0079" ], [ "\u004A\u0061\u006E", "\u0046\u0065\u0062", "\u004D\u0061\u0072", "\u0041\u0070\u0072", "\u004D\u0061\u0079", "\u004A\u0075\u006E", "\u004A\u0075\u006C", "\u0041\u0075\u0067", "\u0053\u0065\u0070", "\u004F\u0063\u0074", "\u004E\u006F\u0076", "\u0044\u0065\u0063", "" ], [ "\u004A\u0061\u006E\u0075\u0061\u0072\u0079", "\u0046\u0065\u0062\u0072\u0075\u0061\u0072\u0079", "\u004D\u0061\u0072\u0063\u0068", "\u0041\u0070\u0072\u0069\u006C", "\u004D\u0061\u0079", "\u004A\u0075\u006E\u0065", "\u004A\u0075\u006C\u0079", "\u0041\u0075\u0067\u0075\u0073\u0074", "\u0053\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u004F\u0063\u0074\u006F\u0062\u0065\u0072", "\u004E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0044\u0065\u0063\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x100A, 0x000A, "es-GT", "es", "spa", "es-GT", "\u0053\u0070\u0061\u006E\u0069\u0073\u0068\u0020\u0028\u0047\u0075\u0061\u0074\u0065\u006D\u0061\u006C\u0061\u0029", "\u0045\u0073\u0070\u0061\u00F1\u006F\u006C\u0020\u0028\u0047\u0075\u0061\u0074\u0065\u006D\u0061\u006C\u0061\u0029", false, 0x0063, "GT", "GTM", "\u0047\u0075\u0061\u0074\u0065\u006D\u0061\u006C\u0061", "\u0047\u0075\u0061\u0074\u0065\u006D\u0061\u006C\u0061", "\u0047\u0054\u0051", "\u0047\u0075\u0061\u0074\u0065\u006D\u0061\u006C\u0061\u006E\u0020\u0051\u0075\u0065\u0074\u007A\u0061\u006C", "\u0051\u0075\u0065\u0074\u007A\u0061\u006C", true, 2, 1, 2, 0, 0, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0051", "\u002D", "\u002B", "\u004E\u0065\u0075\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0063\u0061\u006C\u0065\u006E\u0064\u0061\u0072\u0069\u006F\u0020\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u006F", 0, 0, "\u002F", "\u003A", "\u0061\u002E\u006D\u002E", "\u0070\u002E\u006D\u002E", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u0020\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u0064\u006F\u006D", "\u006C\u0075\u006E", "\u006D\u0061\u0072", "\u006D\u0069\u00E9", "\u006A\u0075\u0065", "\u0076\u0069\u0065", "\u0073\u00E1\u0062" ], [ "\u0064\u006F\u006D\u0069\u006E\u0067\u006F", "\u006C\u0075\u006E\u0065\u0073", "\u006D\u0061\u0072\u0074\u0065\u0073", "\u006D\u0069\u00E9\u0072\u0063\u006F\u006C\u0065\u0073", "\u006A\u0075\u0065\u0076\u0065\u0073", "\u0076\u0069\u0065\u0072\u006E\u0065\u0073", "\u0073\u00E1\u0062\u0061\u0064\u006F" ], [ "\u0065\u006E\u0065", "\u0066\u0065\u0062", "\u006D\u0061\u0072", "\u0061\u0062\u0072", "\u006D\u0061\u0079", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0067\u006F", "\u0073\u0065\u0070", "\u006F\u0063\u0074", "\u006E\u006F\u0076", "\u0064\u0069\u0063", "" ], [ "\u0065\u006E\u0065\u0072\u006F", "\u0066\u0065\u0062\u0072\u0065\u0072\u006F", "\u006D\u0061\u0072\u007A\u006F", "\u0061\u0062\u0072\u0069\u006C", "\u006D\u0061\u0079\u006F", "\u006A\u0075\u006E\u0069\u006F", "\u006A\u0075\u006C\u0069\u006F", "\u0061\u0067\u006F\u0073\u0074\u006F", "\u0073\u0065\u0070\u0074\u0069\u0065\u006D\u0062\u0072\u0065", "\u006F\u0063\u0074\u0075\u0062\u0072\u0065", "\u006E\u006F\u0076\u0069\u0065\u006D\u0062\u0072\u0065", "\u0064\u0069\u0063\u0069\u0065\u006D\u0062\u0072\u0065", "" ] }, +{ 0x100C, 0x000C, "fr-CH", "fr", "fra", "fr-CH", "\u0046\u0072\u0065\u006E\u0063\u0068\u0020\u0028\u0053\u0077\u0069\u0074\u007A\u0065\u0072\u006C\u0061\u006E\u0064\u0029", "\u0066\u0072\u0061\u006E\u00E7\u0061\u0069\u0073\u0020\u0028\u0053\u0075\u0069\u0073\u0073\u0065\u0029", false, 0x00DF, "CH", "CHE", "\u0053\u0077\u0069\u0074\u007A\u0065\u0072\u006C\u0061\u006E\u0064", "\u0053\u0075\u0069\u0073\u0073\u0065", "\u0043\u0048\u0046", "\u0053\u0077\u0069\u0073\u0073\u0020\u0046\u0072\u0061\u006E\u0063", "\u0046\u0072\u0061\u006E\u0063\u0020\u0073\u0075\u0069\u0073\u0073\u0065", true, 2, 1, 2, 2, 2, [ 3 ], [ 3 ], "\u002E", "\u0027", "\u002E", "\u0027", "\u0053\u0046\u0072\u002E", "\u002D", "\u002B", "\u004E\u006F\u006E\u0020\u004E\u0075\u006D\u00E9\u0072\u0069\u0071\u0075\u0065", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069", "\u002B\u0049\u006E\u0066\u0069\u006E\u0069", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0063\u0061\u006C\u0065\u006E\u0064\u0072\u0069\u0065\u0072\u0020\u0067\u0072\u00E9\u0067\u006F\u0072\u0069\u0065\u006E", 1, 2, "\u002E", "\u003A", "", "", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D", "\u0048\u0048\u002E\u006D\u006D\'\u0020\u0068\'" ], [ "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u0064\u002E\u0020\u004D\u002E\u0020\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u002E\u006D\u006D\'\u0020\u0068\'" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0020\u004D\u004D\u004D\u0020\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0064\u0069\u006D\u002E", "\u006C\u0075\u006E\u002E", "\u006D\u0061\u0072\u002E", "\u006D\u0065\u0072\u002E", "\u006A\u0065\u0075\u002E", "\u0076\u0065\u006E\u002E", "\u0073\u0061\u006D\u002E" ], [ "\u0064\u0069\u006D\u0061\u006E\u0063\u0068\u0065", "\u006C\u0075\u006E\u0064\u0069", "\u006D\u0061\u0072\u0064\u0069", "\u006D\u0065\u0072\u0063\u0072\u0065\u0064\u0069", "\u006A\u0065\u0075\u0064\u0069", "\u0076\u0065\u006E\u0064\u0072\u0065\u0064\u0069", "\u0073\u0061\u006D\u0065\u0064\u0069" ], [ "\u006A\u0061\u006E\u0076\u002E", "\u0066\u00E9\u0076\u0072\u002E", "\u006D\u0061\u0072\u0073", "\u0061\u0076\u0072\u002E", "\u006D\u0061\u0069", "\u006A\u0075\u0069\u006E", "\u006A\u0075\u0069\u006C\u002E", "\u0061\u006F\u00FB\u0074", "\u0073\u0065\u0070\u0074\u002E", "\u006F\u0063\u0074\u002E", "\u006E\u006F\u0076\u002E", "\u0064\u00E9\u0063\u002E", "" ], [ "\u006A\u0061\u006E\u0076\u0069\u0065\u0072", "\u0066\u00E9\u0076\u0072\u0069\u0065\u0072", "\u006D\u0061\u0072\u0073", "\u0061\u0076\u0072\u0069\u006C", "\u006D\u0061\u0069", "\u006A\u0075\u0069\u006E", "\u006A\u0075\u0069\u006C\u006C\u0065\u0074", "\u0061\u006F\u00FB\u0074", "\u0073\u0065\u0070\u0074\u0065\u006D\u0062\u0072\u0065", "\u006F\u0063\u0074\u006F\u0062\u0072\u0065", "\u006E\u006F\u0076\u0065\u006D\u0062\u0072\u0065", "\u0064\u00E9\u0063\u0065\u006D\u0062\u0072\u0065", "" ] }, +{ 0x1401, 0x0001, "ar-DZ", "ar", "ara", "ar-DZ", "\u0041\u0072\u0061\u0062\u0069\u0063\u0020\u0028\u0041\u006C\u0067\u0065\u0072\u0069\u0061\u0029", "\u0627\u0644\u0639\u0631\u0628\u064A\u0629\u0020\u0028\u0627\u0644\u062C\u0632\u0627\u0626\u0631\u0029", false, 0x0004, "DZ", "DZA", "\u0041\u006C\u0067\u0065\u0072\u0069\u0061", "\u0627\u0644\u062C\u0632\u0627\u0626\u0631", "\u0044\u005A\u0044", "\u0041\u006C\u0067\u0065\u0072\u0069\u0061\u006E\u0020\u0044\u0069\u006E\u0061\u0072", "\u062F\u064A\u0646\u0627\u0631\u00A0\u062C\u0632\u0627\u0626\u0631\u064A", true, 2, 3, 2, 3, 2, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u062F\u002E\u062C\u002E\u200F", "\u002D", "\u002B", "\u0644\u064A\u0633\u0020\u0628\u0631\u0642\u0645", "\u002D\u0644\u0627\u0020\u0646\u0647\u0627\u064A\u0629", "\u002B\u0644\u0627\u0020\u0646\u0647\u0627\u064A\u0629", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1, 6, 23, 2, 9, 10, 11 ], "\u0627\u0644\u062A\u0642\u0648\u064A\u0645\u00A0\u0627\u0644\u0645\u064A\u0644\u0627\u062F\u064A\u00A0\u0028\u062A\u0633\u0645\u064A\u0629\u00A0\u0641\u0631\u0646\u0633\u064A\u0629\u0029\u200F", 6, 0, "\u002D", "\u003A", "\u0635", "\u0645", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074" ], [ "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0627\u0644\u0627\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0627\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" ], [ "\u0627\u0644\u0627\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0627\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" ], [ "\u062C\u0627\u0646\u0641\u064A\u064A\u0647", "\u0641\u064A\u0641\u0631\u064A\u064A\u0647", "\u0645\u0627\u0631\u0633", "\u0623\u0641\u0631\u064A\u0644", "\u0645\u064A", "\u062C\u0648\u0627\u0646", "\u062C\u0648\u064A\u064A\u0647", "\u0623\u0648\u062A", "\u0633\u0628\u062A\u0645\u0628\u0631", "\u0627\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0641\u0645\u0628\u0631", "\u062F\u064A\u0633\u0645\u0628\u0631", "" ], [ "\u062C\u0627\u0646\u0641\u064A\u064A\u0647", "\u0641\u064A\u0641\u0631\u064A\u064A\u0647", "\u0645\u0627\u0631\u0633", "\u0623\u0641\u0631\u064A\u0644", "\u0645\u064A", "\u062C\u0648\u0627\u0646", "\u062C\u0648\u064A\u064A\u0647", "\u0623\u0648\u062A", "\u0633\u0628\u062A\u0645\u0628\u0631", "\u0627\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0641\u0645\u0628\u0631", "\u062F\u064A\u0633\u0645\u0628\u0631", "" ] }, +{ 0x1404, 0x7C04, "zh-MO", "zh", "zho", "zh-MO", "\u0043\u0068\u0069\u006E\u0065\u0073\u0065\u0020\u0028\u004D\u0061\u0063\u0061\u006F\u0020\u0053\u002E\u0041\u002E\u0052\u002E\u0029", "\u4E2D\u6587\u0028\u6FB3\u9580\u7279\u522B\u884C\u653F\u5340\u0029", false, 0x0097, "MO", "MAC", "\u004D\u0061\u0063\u0061\u006F\u0020\u0053\u002E\u0041\u002E\u0052\u002E", "\u6FB3\u9580\u7279\u522B\u884C\u653F\u5340", "\u004D\u004F\u0050", "\u004D\u0061\u0063\u0061\u006F\u0020\u0050\u0061\u0074\u0061\u0063\u0061", "\u0050\u0061\u0074\u0061\u0063\u0061", true, 2, 1, 2, 0, 0, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u004D\u004F\u0050", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u897F\u66C6", 0, 0, "\u002F", "\u003A", "", "", "\u0064\u002F\u004D\u002F\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u002F\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0079\u0079\u002F\u004D\u002F\u0064", "\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0079\u0079\u0079\u0079\u002F\u004D\u002F\u0064", "\u0079\u0079\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u0020\u0079\u0079\u0079\u0079\u0020\u004D\u004D\u0020\u0064\u0064", "\u0079\u0079\u0079\u0079\u0020\u004D\u004D\u0020\u0064\u0064" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u661F\u671F\u65E5", "\u661F\u671F\u4E00", "\u661F\u671F\u4E8C", "\u661F\u671F\u4E09", "\u661F\u671F\u56DB", "\u661F\u671F\u4E94", "\u661F\u671F\u516D" ], [ "\u661F\u671F\u65E5", "\u661F\u671F\u4E00", "\u661F\u671F\u4E8C", "\u661F\u671F\u4E09", "\u661F\u671F\u56DB", "\u661F\u671F\u4E94", "\u661F\u671F\u516D" ], [ "\u4E00\u6708", "\u4E8C\u6708", "\u4E09\u6708", "\u56DB\u6708", "\u4E94\u6708", "\u516D\u6708", "\u4E03\u6708", "\u516B\u6708", "\u4E5D\u6708", "\u5341\u6708", "\u5341\u4E00\u6708", "\u5341\u4E8C\u6708", "" ], [ "\u4E00\u6708", "\u4E8C\u6708", "\u4E09\u6708", "\u56DB\u6708", "\u4E94\u6708", "\u516D\u6708", "\u4E03\u6708", "\u516B\u6708", "\u4E5D\u6708", "\u5341\u6708", "\u5341\u4E00\u6708", "\u5341\u4E8C\u6708", "" ] }, +{ 0x1407, 0x0007, "de-LI", "de", "deu", "de-LI", "\u0047\u0065\u0072\u006D\u0061\u006E\u0020\u0028\u004C\u0069\u0065\u0063\u0068\u0074\u0065\u006E\u0073\u0074\u0065\u0069\u006E\u0029", "\u0044\u0065\u0075\u0074\u0073\u0063\u0068\u0020\u0028\u004C\u0069\u0065\u0063\u0068\u0074\u0065\u006E\u0073\u0074\u0065\u0069\u006E\u0029", false, 0x0091, "LI", "LIE", "\u004C\u0069\u0065\u0063\u0068\u0074\u0065\u006E\u0073\u0074\u0065\u0069\u006E", "\u004C\u0069\u0065\u0063\u0068\u0074\u0065\u006E\u0073\u0074\u0065\u0069\u006E", "\u0043\u0048\u0046", "\u0053\u0077\u0069\u0073\u0073\u0020\u0046\u0072\u0061\u006E\u0063", "\u0053\u0063\u0068\u0077\u0065\u0069\u007A\u0065\u0072\u0020\u0046\u0072\u0061\u006E\u006B\u0065\u006E", true, 2, 1, 2, 2, 2, [ 3 ], [ 3 ], "\u002E", "\u0027", "\u002E", "\u0027", "\u0043\u0048\u0046", "\u002D", "\u002B", "\u006E\u002E\u0020\u0064\u0065\u0066\u002E", "\u002D\u0075\u006E\u0065\u006E\u0064\u006C\u0069\u0063\u0068", "\u002B\u0075\u006E\u0065\u006E\u0064\u006C\u0069\u0063\u0068", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0047\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0069\u0073\u0063\u0068\u0065\u0072\u0020\u004B\u0061\u006C\u0065\u006E\u0064\u0065\u0072", 1, 2, "\u002E", "\u003A", "", "", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D", "\u0048\u002E\u006D\u006D\'\u0020\u0068\'", "\u0048\u0048\u002E\u006D\u006D\'\u0020\u0068\'", "\u0048\u002E\u006D\u006D\'\u0020\u0055\u0068\u0072\'" ], [ "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u0064\u002E\u0020\u004D\u002E\u0020\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u002E\u006D\u006D\'\u0020\u0068\'", "\u0048\u0048\u002E\u006D\u006D\'\u0020\u0068\'", "\u0048\u002E\u006D\u006D\'\u0020\u0055\u0068\u0072\'" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u002E\u0020\u004D\u004D\u004D\u0020\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0053\u006F", "\u004D\u006F", "\u0044\u0069", "\u004D\u0069", "\u0044\u006F", "\u0046\u0072", "\u0053\u0061" ], [ "\u0053\u006F\u006E\u006E\u0074\u0061\u0067", "\u004D\u006F\u006E\u0074\u0061\u0067", "\u0044\u0069\u0065\u006E\u0073\u0074\u0061\u0067", "\u004D\u0069\u0074\u0074\u0077\u006F\u0063\u0068", "\u0044\u006F\u006E\u006E\u0065\u0072\u0073\u0074\u0061\u0067", "\u0046\u0072\u0065\u0069\u0074\u0061\u0067", "\u0053\u0061\u006D\u0073\u0074\u0061\u0067" ], [ "\u004A\u0061\u006E", "\u0046\u0065\u0062", "\u004D\u0072\u007A", "\u0041\u0070\u0072", "\u004D\u0061\u0069", "\u004A\u0075\u006E", "\u004A\u0075\u006C", "\u0041\u0075\u0067", "\u0053\u0065\u0070", "\u004F\u006B\u0074", "\u004E\u006F\u0076", "\u0044\u0065\u007A", "" ], [ "\u004A\u0061\u006E\u0075\u0061\u0072", "\u0046\u0065\u0062\u0072\u0075\u0061\u0072", "\u004D\u00E4\u0072\u007A", "\u0041\u0070\u0072\u0069\u006C", "\u004D\u0061\u0069", "\u004A\u0075\u006E\u0069", "\u004A\u0075\u006C\u0069", "\u0041\u0075\u0067\u0075\u0073\u0074", "\u0053\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u004F\u006B\u0074\u006F\u0062\u0065\u0072", "\u004E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0044\u0065\u007A\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x1409, 0x0009, "en-NZ", "en", "eng", "en-NZ", "\u0045\u006E\u0067\u006C\u0069\u0073\u0068\u0020\u0028\u004E\u0065\u0077\u0020\u005A\u0065\u0061\u006C\u0061\u006E\u0064\u0029", "\u0045\u006E\u0067\u006C\u0069\u0073\u0068\u0020\u0028\u004E\u0065\u0077\u0020\u005A\u0065\u0061\u006C\u0061\u006E\u0064\u0029", false, 0x00B7, "NZ", "NZL", "\u004E\u0065\u0077\u0020\u005A\u0065\u0061\u006C\u0061\u006E\u0064", "\u004E\u0065\u0077\u0020\u005A\u0065\u0061\u006C\u0061\u006E\u0064", "\u004E\u005A\u0044", "\u004E\u0065\u0077\u0020\u005A\u0065\u0061\u006C\u0061\u006E\u0064\u0020\u0044\u006F\u006C\u006C\u0061\u0072", "\u004E\u0065\u0077\u0020\u005A\u0065\u0061\u006C\u0061\u006E\u0064\u0020\u0044\u006F\u006C\u006C\u0061\u0072", true, 2, 1, 2, 1, 0, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0024", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1, 2 ], "\u0047\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0020\u0043\u0061\u006C\u0065\u006E\u0064\u0061\u0072", 1, 0, "\u002F", "\u003A", "\u0061\u002E\u006D\u002E", "\u0070\u002E\u006D\u002E", "\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D" ], [ "\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0053\u0075\u006E", "\u004D\u006F\u006E", "\u0054\u0075\u0065", "\u0057\u0065\u0064", "\u0054\u0068\u0075", "\u0046\u0072\u0069", "\u0053\u0061\u0074" ], [ "\u0053\u0075\u006E\u0064\u0061\u0079", "\u004D\u006F\u006E\u0064\u0061\u0079", "\u0054\u0075\u0065\u0073\u0064\u0061\u0079", "\u0057\u0065\u0064\u006E\u0065\u0073\u0064\u0061\u0079", "\u0054\u0068\u0075\u0072\u0073\u0064\u0061\u0079", "\u0046\u0072\u0069\u0064\u0061\u0079", "\u0053\u0061\u0074\u0075\u0072\u0064\u0061\u0079" ], [ "\u004A\u0061\u006E", "\u0046\u0065\u0062", "\u004D\u0061\u0072", "\u0041\u0070\u0072", "\u004D\u0061\u0079", "\u004A\u0075\u006E", "\u004A\u0075\u006C", "\u0041\u0075\u0067", "\u0053\u0065\u0070", "\u004F\u0063\u0074", "\u004E\u006F\u0076", "\u0044\u0065\u0063", "" ], [ "\u004A\u0061\u006E\u0075\u0061\u0072\u0079", "\u0046\u0065\u0062\u0072\u0075\u0061\u0072\u0079", "\u004D\u0061\u0072\u0063\u0068", "\u0041\u0070\u0072\u0069\u006C", "\u004D\u0061\u0079", "\u004A\u0075\u006E\u0065", "\u004A\u0075\u006C\u0079", "\u0041\u0075\u0067\u0075\u0073\u0074", "\u0053\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u004F\u0063\u0074\u006F\u0062\u0065\u0072", "\u004E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0044\u0065\u0063\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x140A, 0x000A, "es-CR", "es", "spa", "es-CR", "\u0053\u0070\u0061\u006E\u0069\u0073\u0068\u0020\u0028\u0043\u006F\u0073\u0074\u0061\u0020\u0052\u0069\u0063\u0061\u0029", "\u0045\u0073\u0070\u0061\u00F1\u006F\u006C\u0020\u0028\u0043\u006F\u0073\u0074\u0061\u0020\u0052\u0069\u0063\u0061\u0029", false, 0x0036, "CR", "CRI", "\u0043\u006F\u0073\u0074\u0061\u0020\u0052\u0069\u0063\u0061", "\u0043\u006F\u0073\u0074\u0061\u0020\u0052\u0069\u0063\u0061", "\u0043\u0052\u0043", "\u0043\u006F\u0073\u0074\u0061\u0020\u0052\u0069\u0063\u0061\u006E\u0020\u0043\u006F\u006C\u006F\u006E", "\u0043\u006F\u006C\u00F3\u006E", true, 2, 1, 2, 0, 0, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u20A1", "\u002D", "\u002B", "\u004E\u0065\u0075\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0063\u0061\u006C\u0065\u006E\u0064\u0061\u0072\u0069\u006F\u0020\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u006F", 0, 0, "\u002F", "\u003A", "\u0061\u002E\u006D\u002E", "\u0070\u002E\u006D\u002E", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u0020\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u0064\u006F\u006D", "\u006C\u0075\u006E", "\u006D\u0061\u0072", "\u006D\u0069\u00E9", "\u006A\u0075\u0065", "\u0076\u0069\u0065", "\u0073\u00E1\u0062" ], [ "\u0064\u006F\u006D\u0069\u006E\u0067\u006F", "\u006C\u0075\u006E\u0065\u0073", "\u006D\u0061\u0072\u0074\u0065\u0073", "\u006D\u0069\u00E9\u0072\u0063\u006F\u006C\u0065\u0073", "\u006A\u0075\u0065\u0076\u0065\u0073", "\u0076\u0069\u0065\u0072\u006E\u0065\u0073", "\u0073\u00E1\u0062\u0061\u0064\u006F" ], [ "\u0065\u006E\u0065", "\u0066\u0065\u0062", "\u006D\u0061\u0072", "\u0061\u0062\u0072", "\u006D\u0061\u0079", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0067\u006F", "\u0073\u0065\u0070", "\u006F\u0063\u0074", "\u006E\u006F\u0076", "\u0064\u0069\u0063", "" ], [ "\u0065\u006E\u0065\u0072\u006F", "\u0066\u0065\u0062\u0072\u0065\u0072\u006F", "\u006D\u0061\u0072\u007A\u006F", "\u0061\u0062\u0072\u0069\u006C", "\u006D\u0061\u0079\u006F", "\u006A\u0075\u006E\u0069\u006F", "\u006A\u0075\u006C\u0069\u006F", "\u0061\u0067\u006F\u0073\u0074\u006F", "\u0073\u0065\u0070\u0074\u0069\u0065\u006D\u0062\u0072\u0065", "\u006F\u0063\u0074\u0075\u0062\u0072\u0065", "\u006E\u006F\u0076\u0069\u0065\u006D\u0062\u0072\u0065", "\u0064\u0069\u0063\u0069\u0065\u006D\u0062\u0072\u0065", "" ] }, +{ 0x140C, 0x000C, "fr-LU", "fr", "fra", "fr-LU", "\u0046\u0072\u0065\u006E\u0063\u0068\u0020\u0028\u004C\u0075\u0078\u0065\u006D\u0062\u006F\u0075\u0072\u0067\u0029", "\u0066\u0072\u0061\u006E\u00E7\u0061\u0069\u0073\u0020\u0028\u004C\u0075\u0078\u0065\u006D\u0062\u006F\u0075\u0072\u0067\u0029", false, 0x0093, "LU", "LUX", "\u004C\u0075\u0078\u0065\u006D\u0062\u006F\u0075\u0072\u0067", "\u004C\u0075\u0078\u0065\u006D\u0062\u006F\u0075\u0072\u0067", "\u0045\u0055\u0052", "\u0045\u0075\u0072\u006F", "\u0065\u0075\u0072\u006F", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002C", "\u00A0", "\u20AC", "\u002D", "\u002B", "\u004E\u006F\u006E\u0020\u004E\u0075\u006D\u00E9\u0072\u0069\u0071\u0075\u0065", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069", "\u002B\u0049\u006E\u0066\u0069\u006E\u0069", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0063\u0061\u006C\u0065\u006E\u0064\u0072\u0069\u0065\u0072\u0020\u0067\u0072\u00E9\u0067\u006F\u0072\u0069\u0065\u006E", 1, 0, "\u002F", "\u003A", "", "", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D", "\u0064\u0064\u0064\u0064\u0020\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D", "\u0048\u0048\u002E\u006D\u006D", "\u0048\u0048\'\u0020\u0068\u0020\'\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u002E\u006D\u006D", "\u0048\u0048\'\u0020\u0068\u0020\'\u006D\u006D" ], [ "\u0064\u0064\u0064\u0064\u0020\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0020\u004D\u004D\u004D\u0020\u0079\u0079", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0064\u0069\u006D\u002E", "\u006C\u0075\u006E\u002E", "\u006D\u0061\u0072\u002E", "\u006D\u0065\u0072\u002E", "\u006A\u0065\u0075\u002E", "\u0076\u0065\u006E\u002E", "\u0073\u0061\u006D\u002E" ], [ "\u0064\u0069\u006D\u0061\u006E\u0063\u0068\u0065", "\u006C\u0075\u006E\u0064\u0069", "\u006D\u0061\u0072\u0064\u0069", "\u006D\u0065\u0072\u0063\u0072\u0065\u0064\u0069", "\u006A\u0065\u0075\u0064\u0069", "\u0076\u0065\u006E\u0064\u0072\u0065\u0064\u0069", "\u0073\u0061\u006D\u0065\u0064\u0069" ], [ "\u006A\u0061\u006E\u0076\u002E", "\u0066\u00E9\u0076\u0072\u002E", "\u006D\u0061\u0072\u0073", "\u0061\u0076\u0072\u002E", "\u006D\u0061\u0069", "\u006A\u0075\u0069\u006E", "\u006A\u0075\u0069\u006C\u002E", "\u0061\u006F\u00FB\u0074", "\u0073\u0065\u0070\u0074\u002E", "\u006F\u0063\u0074\u002E", "\u006E\u006F\u0076\u002E", "\u0064\u00E9\u0063\u002E", "" ], [ "\u006A\u0061\u006E\u0076\u0069\u0065\u0072", "\u0066\u00E9\u0076\u0072\u0069\u0065\u0072", "\u006D\u0061\u0072\u0073", "\u0061\u0076\u0072\u0069\u006C", "\u006D\u0061\u0069", "\u006A\u0075\u0069\u006E", "\u006A\u0075\u0069\u006C\u006C\u0065\u0074", "\u0061\u006F\u00FB\u0074", "\u0073\u0065\u0070\u0074\u0065\u006D\u0062\u0072\u0065", "\u006F\u0063\u0074\u006F\u0062\u0072\u0065", "\u006E\u006F\u0076\u0065\u006D\u0062\u0072\u0065", "\u0064\u00E9\u0063\u0065\u006D\u0062\u0072\u0065", "" ] }, +{ 0x1801, 0x0001, "ar-MA", "ar", "ara", "ar-MA", "\u0041\u0072\u0061\u0062\u0069\u0063\u0020\u0028\u004D\u006F\u0072\u006F\u0063\u0063\u006F\u0029", "\u0627\u0644\u0639\u0631\u0628\u064A\u0629\u0020\u0028\u0627\u0644\u0645\u0645\u0644\u0643\u0629\u0020\u0627\u0644\u0645\u063A\u0631\u0628\u064A\u0629\u0029", false, 0x009F, "MA", "MAR", "\u004D\u006F\u0072\u006F\u0063\u0063\u006F", "\u0627\u0644\u0645\u0645\u0644\u0643\u0629\u0020\u0627\u0644\u0645\u063A\u0631\u0628\u064A\u0629", "\u004D\u0041\u0044", "\u004D\u006F\u0072\u006F\u0063\u0063\u0061\u006E\u0020\u0044\u0069\u0072\u0068\u0061\u006D", "\u062F\u0631\u0647\u0645\u00A0\u0645\u063A\u0631\u0628\u064A", true, 2, 3, 2, 3, 2, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u062F\u002E\u0645\u002E\u200F", "\u002D", "\u002B", "\u0644\u064A\u0633\u0020\u0628\u0631\u0642\u0645", "\u002D\u0644\u0627\u0020\u0646\u0647\u0627\u064A\u0629", "\u002B\u0644\u0627\u0020\u0646\u0647\u0627\u064A\u0629", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1, 6, 23, 2, 9, 10, 11 ], "\u0627\u0644\u062A\u0642\u0648\u064A\u0645\u00A0\u0627\u0644\u0645\u064A\u0644\u0627\u062F\u064A\u00A0\u0028\u062A\u0633\u0645\u064A\u0629\u00A0\u0641\u0631\u0646\u0633\u064A\u0629\u0029\u200F", 1, 0, "\u002D", "\u003A", "\u0635", "\u0645", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074" ], [ "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0627\u0644\u0627\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0627\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" ], [ "\u0627\u0644\u0627\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0627\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" ], [ "\u064A\u0646\u0627\u064A\u0631", "\u0641\u0628\u0631\u0627\u064A\u0631", "\u0645\u0627\u0631\u0633", "\u0627\u0628\u0631\u064A\u0644", "\u0645\u0627\u064A", "\u064A\u0648\u0646\u064A\u0648", "\u064A\u0648\u0644\u064A\u0648\u0632", "\u063A\u0634\u062A", "\u0634\u062A\u0646\u0628\u0631", "\u0627\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0646\u0628\u0631", "\u062F\u062C\u0646\u0628\u0631", "" ], [ "\u064A\u0646\u0627\u064A\u0631", "\u0641\u0628\u0631\u0627\u064A\u0631", "\u0645\u0627\u0631\u0633", "\u0627\u0628\u0631\u064A\u0644", "\u0645\u0627\u064A", "\u064A\u0648\u0646\u064A\u0648", "\u064A\u0648\u0644\u064A\u0648\u0632", "\u063A\u0634\u062A", "\u0634\u062A\u0646\u0628\u0631", "\u0627\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0646\u0628\u0631", "\u062F\u062C\u0646\u0628\u0631", "" ] }, +{ 0x1809, 0x0009, "en-IE", "en", "eng", "en-IE", "\u0045\u006E\u0067\u006C\u0069\u0073\u0068\u0020\u0028\u0049\u0072\u0065\u006C\u0061\u006E\u0064\u0029", "\u0045\u006E\u0067\u006C\u0069\u0073\u0068\u0020\u0028\u0045\u0069\u0072\u0065\u0029", false, 0x0044, "IE", "IRL", "\u0049\u0072\u0065\u006C\u0061\u006E\u0064", "\u0045\u0069\u0072\u0065", "\u0045\u0055\u0052", "\u0045\u0075\u0072\u006F", "\u0045\u0075\u0072\u006F", true, 2, 1, 2, 1, 0, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u20AC", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1, 2 ], "\u0047\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0020\u0043\u0061\u006C\u0065\u006E\u0064\u0061\u0072", 1, 0, "\u002F", "\u003A", "", "", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0053\u0075\u006E", "\u004D\u006F\u006E", "\u0054\u0075\u0065", "\u0057\u0065\u0064", "\u0054\u0068\u0075", "\u0046\u0072\u0069", "\u0053\u0061\u0074" ], [ "\u0053\u0075\u006E\u0064\u0061\u0079", "\u004D\u006F\u006E\u0064\u0061\u0079", "\u0054\u0075\u0065\u0073\u0064\u0061\u0079", "\u0057\u0065\u0064\u006E\u0065\u0073\u0064\u0061\u0079", "\u0054\u0068\u0075\u0072\u0073\u0064\u0061\u0079", "\u0046\u0072\u0069\u0064\u0061\u0079", "\u0053\u0061\u0074\u0075\u0072\u0064\u0061\u0079" ], [ "\u004A\u0061\u006E", "\u0046\u0065\u0062", "\u004D\u0061\u0072", "\u0041\u0070\u0072", "\u004D\u0061\u0079", "\u004A\u0075\u006E", "\u004A\u0075\u006C", "\u0041\u0075\u0067", "\u0053\u0065\u0070", "\u004F\u0063\u0074", "\u004E\u006F\u0076", "\u0044\u0065\u0063", "" ], [ "\u004A\u0061\u006E\u0075\u0061\u0072\u0079", "\u0046\u0065\u0062\u0072\u0075\u0061\u0072\u0079", "\u004D\u0061\u0072\u0063\u0068", "\u0041\u0070\u0072\u0069\u006C", "\u004D\u0061\u0079", "\u004A\u0075\u006E\u0065", "\u004A\u0075\u006C\u0079", "\u0041\u0075\u0067\u0075\u0073\u0074", "\u0053\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u004F\u0063\u0074\u006F\u0062\u0065\u0072", "\u004E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0044\u0065\u0063\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x180A, 0x000A, "es-PA", "es", "spa", "es-PA", "\u0053\u0070\u0061\u006E\u0069\u0073\u0068\u0020\u0028\u0050\u0061\u006E\u0061\u006D\u0061\u0029", "\u0045\u0073\u0070\u0061\u00F1\u006F\u006C\u0020\u0028\u0050\u0061\u006E\u0061\u006D\u00E1\u0029", false, 0x00C0, "PA", "PAN", "\u0050\u0061\u006E\u0061\u006D\u0061", "\u0050\u0061\u006E\u0061\u006D\u00E1", "\u0050\u0041\u0042", "\u0050\u0061\u006E\u0061\u006D\u0061\u006E\u0069\u0061\u006E\u0020\u0042\u0061\u006C\u0062\u006F\u0061", "\u0042\u0061\u006C\u0062\u006F\u0061", true, 2, 1, 2, 14, 2, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0042\u002F\u002E", "\u002D", "\u002B", "\u004E\u0065\u0075\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0063\u0061\u006C\u0065\u006E\u0064\u0061\u0072\u0069\u006F\u0020\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u006F", 0, 0, "\u002F", "\u003A", "\u0061\u002E\u006D\u002E", "\u0070\u002E\u006D\u002E", "\u004D\u004D\u002F\u0064\u0064\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u004D\u004D\u002F\u0064\u0064\u002F\u0079\u0079\u0079\u0079", "\u004D\u004D\u002F\u0064\u0064\u002F\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u0020\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u0064\u006F\u006D", "\u006C\u0075\u006E", "\u006D\u0061\u0072", "\u006D\u0069\u00E9", "\u006A\u0075\u0065", "\u0076\u0069\u0065", "\u0073\u00E1\u0062" ], [ "\u0064\u006F\u006D\u0069\u006E\u0067\u006F", "\u006C\u0075\u006E\u0065\u0073", "\u006D\u0061\u0072\u0074\u0065\u0073", "\u006D\u0069\u00E9\u0072\u0063\u006F\u006C\u0065\u0073", "\u006A\u0075\u0065\u0076\u0065\u0073", "\u0076\u0069\u0065\u0072\u006E\u0065\u0073", "\u0073\u00E1\u0062\u0061\u0064\u006F" ], [ "\u0065\u006E\u0065", "\u0066\u0065\u0062", "\u006D\u0061\u0072", "\u0061\u0062\u0072", "\u006D\u0061\u0079", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0067\u006F", "\u0073\u0065\u0070", "\u006F\u0063\u0074", "\u006E\u006F\u0076", "\u0064\u0069\u0063", "" ], [ "\u0065\u006E\u0065\u0072\u006F", "\u0066\u0065\u0062\u0072\u0065\u0072\u006F", "\u006D\u0061\u0072\u007A\u006F", "\u0061\u0062\u0072\u0069\u006C", "\u006D\u0061\u0079\u006F", "\u006A\u0075\u006E\u0069\u006F", "\u006A\u0075\u006C\u0069\u006F", "\u0061\u0067\u006F\u0073\u0074\u006F", "\u0073\u0065\u0070\u0074\u0069\u0065\u006D\u0062\u0072\u0065", "\u006F\u0063\u0074\u0075\u0062\u0072\u0065", "\u006E\u006F\u0076\u0069\u0065\u006D\u0062\u0072\u0065", "\u0064\u0069\u0063\u0069\u0065\u006D\u0062\u0072\u0065", "" ] }, +{ 0x180C, 0x000C, "fr-MC", "fr", "fra", "fr-MC", "\u0046\u0072\u0065\u006E\u0063\u0068\u0020\u0028\u0050\u0072\u0069\u006E\u0063\u0069\u0070\u0061\u006C\u0069\u0074\u0079\u0020\u006F\u0066\u0020\u004D\u006F\u006E\u0061\u0063\u006F\u0029", "\u0066\u0072\u0061\u006E\u00E7\u0061\u0069\u0073\u0020\u0028\u0050\u0072\u0069\u006E\u0063\u0069\u0070\u0061\u0075\u0074\u00E9\u0020\u0064\u0065\u0020\u004D\u006F\u006E\u0061\u0063\u006F\u0029", false, 0x009E, "MC", "MCO", "\u0050\u0072\u0069\u006E\u0063\u0069\u0070\u0061\u006C\u0069\u0074\u0079\u0020\u006F\u0066\u0020\u004D\u006F\u006E\u0061\u0063\u006F", "\u0050\u0072\u0069\u006E\u0063\u0069\u0070\u0061\u0075\u0074\u00E9\u0020\u0064\u0065\u0020\u004D\u006F\u006E\u0061\u0063\u006F", "\u0045\u0055\u0052", "\u0045\u0075\u0072\u006F", "\u0065\u0075\u0072\u006F", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002C", "\u00A0", "\u20AC", "\u002D", "\u002B", "\u004E\u006F\u006E\u0020\u004E\u0075\u006D\u00E9\u0072\u0069\u0071\u0075\u0065", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069", "\u002B\u0049\u006E\u0066\u0069\u006E\u0069", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0063\u0061\u006C\u0065\u006E\u0064\u0072\u0069\u0065\u0072\u0020\u0067\u0072\u00E9\u0067\u006F\u0072\u0069\u0065\u006E", 1, 0, "\u002F", "\u003A", "", "", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D", "\u0064\u0064\u0064\u0064\u0020\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D", "\u0048\u0048\u002E\u006D\u006D", "\u0048\u0048\'\u0020\u0068\u0020\'\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u002E\u006D\u006D", "\u0048\u0048\'\u0020\u0068\u0020\'\u006D\u006D" ], [ "\u0064\u0064\u0064\u0064\u0020\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0020\u004D\u004D\u004D\u0020\u0079\u0079", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0064\u0069\u006D\u002E", "\u006C\u0075\u006E\u002E", "\u006D\u0061\u0072\u002E", "\u006D\u0065\u0072\u002E", "\u006A\u0065\u0075\u002E", "\u0076\u0065\u006E\u002E", "\u0073\u0061\u006D\u002E" ], [ "\u0064\u0069\u006D\u0061\u006E\u0063\u0068\u0065", "\u006C\u0075\u006E\u0064\u0069", "\u006D\u0061\u0072\u0064\u0069", "\u006D\u0065\u0072\u0063\u0072\u0065\u0064\u0069", "\u006A\u0065\u0075\u0064\u0069", "\u0076\u0065\u006E\u0064\u0072\u0065\u0064\u0069", "\u0073\u0061\u006D\u0065\u0064\u0069" ], [ "\u006A\u0061\u006E\u0076\u002E", "\u0066\u00E9\u0076\u0072\u002E", "\u006D\u0061\u0072\u0073", "\u0061\u0076\u0072\u002E", "\u006D\u0061\u0069", "\u006A\u0075\u0069\u006E", "\u006A\u0075\u0069\u006C\u002E", "\u0061\u006F\u00FB\u0074", "\u0073\u0065\u0070\u0074\u002E", "\u006F\u0063\u0074\u002E", "\u006E\u006F\u0076\u002E", "\u0064\u00E9\u0063\u002E", "" ], [ "\u006A\u0061\u006E\u0076\u0069\u0065\u0072", "\u0066\u00E9\u0076\u0072\u0069\u0065\u0072", "\u006D\u0061\u0072\u0073", "\u0061\u0076\u0072\u0069\u006C", "\u006D\u0061\u0069", "\u006A\u0075\u0069\u006E", "\u006A\u0075\u0069\u006C\u006C\u0065\u0074", "\u0061\u006F\u00FB\u0074", "\u0073\u0065\u0070\u0074\u0065\u006D\u0062\u0072\u0065", "\u006F\u0063\u0074\u006F\u0062\u0072\u0065", "\u006E\u006F\u0076\u0065\u006D\u0062\u0072\u0065", "\u0064\u00E9\u0063\u0065\u006D\u0062\u0072\u0065", "" ] }, +{ 0x1C01, 0x0001, "ar-TN", "ar", "ara", "ar-TN", "\u0041\u0072\u0061\u0062\u0069\u0063\u0020\u0028\u0054\u0075\u006E\u0069\u0073\u0069\u0061\u0029", "\u0627\u0644\u0639\u0631\u0628\u064A\u0629\u0020\u0028\u062A\u0648\u0646\u0633\u0029", false, 0x00EA, "TN", "TUN", "\u0054\u0075\u006E\u0069\u0073\u0069\u0061", "\u062A\u0648\u0646\u0633", "\u0054\u004E\u0044", "\u0054\u0075\u006E\u0069\u0073\u0069\u0061\u006E\u0020\u0044\u0069\u006E\u0061\u0072", "\u062F\u064A\u0646\u0627\u0631\u00A0\u062A\u0648\u0646\u0633\u064A", true, 3, 3, 3, 3, 2, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u062F\u002E\u062A\u002E\u200F", "\u002D", "\u002B", "\u0644\u064A\u0633\u0020\u0628\u0631\u0642\u0645", "\u002D\u0644\u0627\u0020\u0646\u0647\u0627\u064A\u0629", "\u002B\u0644\u0627\u0020\u0646\u0647\u0627\u064A\u0629", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1, 6, 23, 2, 9, 10, 11 ], "\u0627\u0644\u062A\u0642\u0648\u064A\u0645\u00A0\u0627\u0644\u0645\u064A\u0644\u0627\u062F\u064A\u00A0\u0028\u062A\u0633\u0645\u064A\u0629\u00A0\u0641\u0631\u0646\u0633\u064A\u0629\u0029\u200F", 1, 0, "\u002D", "\u003A", "\u0635", "\u0645", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074" ], [ "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0627\u0644\u0627\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0627\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" ], [ "\u0627\u0644\u0627\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0627\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" ], [ "\u062C\u0627\u0646\u0641\u064A", "\u0641\u064A\u0641\u0631\u064A", "\u0645\u0627\u0631\u0633", "\u0627\u0641\u0631\u064A\u0644", "\u0645\u0627\u064A", "\u062C\u0648\u0627\u0646", "\u062C\u0648\u064A\u0644\u064A\u0629", "\u0627\u0648\u062A", "\u0633\u0628\u062A\u0645\u0628\u0631", "\u0627\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0641\u0645\u0628\u0631", "\u062F\u064A\u0633\u0645\u0628\u0631", "" ], [ "\u062C\u0627\u0646\u0641\u064A", "\u0641\u064A\u0641\u0631\u064A", "\u0645\u0627\u0631\u0633", "\u0627\u0641\u0631\u064A\u0644", "\u0645\u0627\u064A", "\u062C\u0648\u0627\u0646", "\u062C\u0648\u064A\u0644\u064A\u0629", "\u0627\u0648\u062A", "\u0633\u0628\u062A\u0645\u0628\u0631", "\u0627\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0641\u0645\u0628\u0631", "\u062F\u064A\u0633\u0645\u0628\u0631", "" ] }, +{ 0x1C09, 0x0009, "en-ZA", "en", "eng", "en-ZA", "\u0045\u006E\u0067\u006C\u0069\u0073\u0068\u0020\u0028\u0053\u006F\u0075\u0074\u0068\u0020\u0041\u0066\u0072\u0069\u0063\u0061\u0029", "\u0045\u006E\u0067\u006C\u0069\u0073\u0068\u0020\u0028\u0053\u006F\u0075\u0074\u0068\u0020\u0041\u0066\u0072\u0069\u0063\u0061\u0029", false, 0x00D1, "ZA", "ZAF", "\u0053\u006F\u0075\u0074\u0068\u0020\u0041\u0066\u0072\u0069\u0063\u0061", "\u0053\u006F\u0075\u0074\u0068\u0020\u0041\u0066\u0072\u0069\u0063\u0061", "\u005A\u0041\u0052", "\u0053\u006F\u0075\u0074\u0068\u0020\u0041\u0066\u0072\u0069\u0063\u0061\u006E\u0020\u0052\u0061\u006E\u0064", "\u0052\u0061\u006E\u0064", true, 2, 1, 2, 2, 2, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0052", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1, 2 ], "\u0047\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0020\u0043\u0061\u006C\u0065\u006E\u0064\u0061\u0072", 0, 0, "\u002F", "\u003A", "\u0041\u004D", "\u0050\u004D", "\u0079\u0079\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0079\u0079\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0053\u0075\u006E", "\u004D\u006F\u006E", "\u0054\u0075\u0065", "\u0057\u0065\u0064", "\u0054\u0068\u0075", "\u0046\u0072\u0069", "\u0053\u0061\u0074" ], [ "\u0053\u0075\u006E\u0064\u0061\u0079", "\u004D\u006F\u006E\u0064\u0061\u0079", "\u0054\u0075\u0065\u0073\u0064\u0061\u0079", "\u0057\u0065\u0064\u006E\u0065\u0073\u0064\u0061\u0079", "\u0054\u0068\u0075\u0072\u0073\u0064\u0061\u0079", "\u0046\u0072\u0069\u0064\u0061\u0079", "\u0053\u0061\u0074\u0075\u0072\u0064\u0061\u0079" ], [ "\u004A\u0061\u006E", "\u0046\u0065\u0062", "\u004D\u0061\u0072", "\u0041\u0070\u0072", "\u004D\u0061\u0079", "\u004A\u0075\u006E", "\u004A\u0075\u006C", "\u0041\u0075\u0067", "\u0053\u0065\u0070", "\u004F\u0063\u0074", "\u004E\u006F\u0076", "\u0044\u0065\u0063", "" ], [ "\u004A\u0061\u006E\u0075\u0061\u0072\u0079", "\u0046\u0065\u0062\u0072\u0075\u0061\u0072\u0079", "\u004D\u0061\u0072\u0063\u0068", "\u0041\u0070\u0072\u0069\u006C", "\u004D\u0061\u0079", "\u004A\u0075\u006E\u0065", "\u004A\u0075\u006C\u0079", "\u0041\u0075\u0067\u0075\u0073\u0074", "\u0053\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u004F\u0063\u0074\u006F\u0062\u0065\u0072", "\u004E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0044\u0065\u0063\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x1C0A, 0x000A, "es-DO", "es", "spa", "es-DO", "\u0053\u0070\u0061\u006E\u0069\u0073\u0068\u0020\u0028\u0044\u006F\u006D\u0069\u006E\u0069\u0063\u0061\u006E\u0020\u0052\u0065\u0070\u0075\u0062\u006C\u0069\u0063\u0029", "\u0045\u0073\u0070\u0061\u00F1\u006F\u006C\u0020\u0028\u0052\u0065\u0070\u00FA\u0062\u006C\u0069\u0063\u0061\u0020\u0044\u006F\u006D\u0069\u006E\u0069\u0063\u0061\u006E\u0061\u0029", false, 0x0041, "DO", "DOM", "\u0044\u006F\u006D\u0069\u006E\u0069\u0063\u0061\u006E\u0020\u0052\u0065\u0070\u0075\u0062\u006C\u0069\u0063", "\u0052\u0065\u0070\u00FA\u0062\u006C\u0069\u0063\u0061\u0020\u0044\u006F\u006D\u0069\u006E\u0069\u0063\u0061\u006E\u0061", "\u0044\u004F\u0050", "\u0044\u006F\u006D\u0069\u006E\u0069\u0063\u0061\u006E\u0020\u0050\u0065\u0073\u006F", "\u0050\u0065\u0073\u006F", true, 2, 1, 2, 0, 0, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0052\u0044\u0024", "\u002D", "\u002B", "\u004E\u0065\u0075\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0063\u0061\u006C\u0065\u006E\u0064\u0061\u0072\u0069\u006F\u0020\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u006F", 0, 0, "\u002F", "\u003A", "\u0061\u002E\u006D\u002E", "\u0070\u002E\u006D\u002E", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u004D\u004D\u002F\u0064\u0064\u002F\u0079\u0079\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u0020\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u0064\u006F\u006D", "\u006C\u0075\u006E", "\u006D\u0061\u0072", "\u006D\u0069\u00E9", "\u006A\u0075\u0065", "\u0076\u0069\u0065", "\u0073\u00E1\u0062" ], [ "\u0064\u006F\u006D\u0069\u006E\u0067\u006F", "\u006C\u0075\u006E\u0065\u0073", "\u006D\u0061\u0072\u0074\u0065\u0073", "\u006D\u0069\u00E9\u0072\u0063\u006F\u006C\u0065\u0073", "\u006A\u0075\u0065\u0076\u0065\u0073", "\u0076\u0069\u0065\u0072\u006E\u0065\u0073", "\u0073\u00E1\u0062\u0061\u0064\u006F" ], [ "\u0065\u006E\u0065", "\u0066\u0065\u0062", "\u006D\u0061\u0072", "\u0061\u0062\u0072", "\u006D\u0061\u0079", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0067\u006F", "\u0073\u0065\u0070", "\u006F\u0063\u0074", "\u006E\u006F\u0076", "\u0064\u0069\u0063", "" ], [ "\u0065\u006E\u0065\u0072\u006F", "\u0066\u0065\u0062\u0072\u0065\u0072\u006F", "\u006D\u0061\u0072\u007A\u006F", "\u0061\u0062\u0072\u0069\u006C", "\u006D\u0061\u0079\u006F", "\u006A\u0075\u006E\u0069\u006F", "\u006A\u0075\u006C\u0069\u006F", "\u0061\u0067\u006F\u0073\u0074\u006F", "\u0073\u0065\u0070\u0074\u0069\u0065\u006D\u0062\u0072\u0065", "\u006F\u0063\u0074\u0075\u0062\u0072\u0065", "\u006E\u006F\u0076\u0069\u0065\u006D\u0062\u0072\u0065", "\u0064\u0069\u0063\u0069\u0065\u006D\u0062\u0072\u0065", "" ] }, +{ 0x2001, 0x0001, "ar-OM", "ar", "ara", "ar-OM", "\u0041\u0072\u0061\u0062\u0069\u0063\u0020\u0028\u004F\u006D\u0061\u006E\u0029", "\u0627\u0644\u0639\u0631\u0628\u064A\u0629\u0020\u0028\u0639\u0645\u0627\u0646\u0029", false, 0x00A4, "OM", "OMN", "\u004F\u006D\u0061\u006E", "\u0639\u0645\u0627\u0646", "\u004F\u004D\u0052", "\u0052\u0069\u0061\u006C\u0020\u004F\u006D\u0061\u006E\u0069", "\u0631\u064A\u0627\u0644\u00A0\u0639\u0645\u0627\u0646\u064A", true, 2, 3, 2, 3, 2, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0631\u002E\u0639\u002E\u200F", "\u002D", "\u002B", "\u0644\u064A\u0633\u0020\u0628\u0631\u0642\u0645", "\u002D\u0644\u0627\u0020\u0646\u0647\u0627\u064A\u0629", "\u002B\u0644\u0627\u0020\u0646\u0647\u0627\u064A\u0629", [ "\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669" ], 1, [ 1, 6, 23, 2, 9, 10, 12 ], "\u0627\u0644\u062A\u0642\u0648\u064A\u0645\u00A0\u0627\u0644\u0645\u064A\u0644\u0627\u062F\u064A\u00A0\u0028\u062A\u0633\u0645\u064A\u0629\u00A0\u0625\u0646\u062C\u0644\u064A\u0632\u064A\u0629\u0029\u200F", 6, 0, "\u002F", "\u003A", "\u0635", "\u0645", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0627\u0644\u0627\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0627\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" ], [ "\u0627\u0644\u0627\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0627\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" ], [ "\u064A\u0646\u0627\u064A\u0631", "\u0641\u0628\u0631\u0627\u064A\u0631", "\u0645\u0627\u0631\u0633", "\u0627\u0628\u0631\u064A\u0644", "\u0645\u0627\u064A\u0648", "\u064A\u0648\u0646\u064A\u0648", "\u064A\u0648\u0644\u064A\u0648", "\u0627\u063A\u0633\u0637\u0633", "\u0633\u0628\u062A\u0645\u0628\u0631", "\u0627\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0641\u0645\u0628\u0631", "\u062F\u064A\u0633\u0645\u0628\u0631", "" ], [ "\u064A\u0646\u0627\u064A\u0631", "\u0641\u0628\u0631\u0627\u064A\u0631", "\u0645\u0627\u0631\u0633", "\u0627\u0628\u0631\u064A\u0644", "\u0645\u0627\u064A\u0648", "\u064A\u0648\u0646\u064A\u0648", "\u064A\u0648\u0644\u064A\u0648", "\u0627\u063A\u0633\u0637\u0633", "\u0633\u0628\u062A\u0645\u0628\u0631", "\u0627\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0641\u0645\u0628\u0631", "\u062F\u064A\u0633\u0645\u0628\u0631", "" ] }, +{ 0x2009, 0x0009, "en-JM", "en", "eng", "en-JM", "\u0045\u006E\u0067\u006C\u0069\u0073\u0068\u0020\u0028\u004A\u0061\u006D\u0061\u0069\u0063\u0061\u0029", "\u0045\u006E\u0067\u006C\u0069\u0073\u0068\u0020\u0028\u004A\u0061\u006D\u0061\u0069\u0063\u0061\u0029", false, 0x007C, "JM", "JAM", "\u004A\u0061\u006D\u0061\u0069\u0063\u0061", "\u004A\u0061\u006D\u0061\u0069\u0063\u0061", "\u004A\u004D\u0044", "\u004A\u0061\u006D\u0061\u0069\u0063\u0061\u006E\u0020\u0044\u006F\u006C\u006C\u0061\u0072", "\u004A\u0061\u006D\u0061\u0069\u0063\u0061\u006E\u0020\u0044\u006F\u006C\u006C\u0061\u0072", false, 2, 1, 2, 1, 0, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u004A\u0024", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1, 2 ], "\u0047\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0020\u0043\u0061\u006C\u0065\u006E\u0064\u0061\u0072", 0, 0, "\u002F", "\u003A", "\u0041\u004D", "\u0050\u004D", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0064\u0064\u002C\u0020\u004D\u004D\u004D\u004D\u0020\u0064\u0064\u002C\u0020\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u004D\u004D\u004D\u004D\u0020\u0064\u0064\u002C\u0020\u0079\u0079\u0079\u0079", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0053\u0075\u006E", "\u004D\u006F\u006E", "\u0054\u0075\u0065", "\u0057\u0065\u0064", "\u0054\u0068\u0075", "\u0046\u0072\u0069", "\u0053\u0061\u0074" ], [ "\u0053\u0075\u006E\u0064\u0061\u0079", "\u004D\u006F\u006E\u0064\u0061\u0079", "\u0054\u0075\u0065\u0073\u0064\u0061\u0079", "\u0057\u0065\u0064\u006E\u0065\u0073\u0064\u0061\u0079", "\u0054\u0068\u0075\u0072\u0073\u0064\u0061\u0079", "\u0046\u0072\u0069\u0064\u0061\u0079", "\u0053\u0061\u0074\u0075\u0072\u0064\u0061\u0079" ], [ "\u004A\u0061\u006E", "\u0046\u0065\u0062", "\u004D\u0061\u0072", "\u0041\u0070\u0072", "\u004D\u0061\u0079", "\u004A\u0075\u006E", "\u004A\u0075\u006C", "\u0041\u0075\u0067", "\u0053\u0065\u0070", "\u004F\u0063\u0074", "\u004E\u006F\u0076", "\u0044\u0065\u0063", "" ], [ "\u004A\u0061\u006E\u0075\u0061\u0072\u0079", "\u0046\u0065\u0062\u0072\u0075\u0061\u0072\u0079", "\u004D\u0061\u0072\u0063\u0068", "\u0041\u0070\u0072\u0069\u006C", "\u004D\u0061\u0079", "\u004A\u0075\u006E\u0065", "\u004A\u0075\u006C\u0079", "\u0041\u0075\u0067\u0075\u0073\u0074", "\u0053\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u004F\u0063\u0074\u006F\u0062\u0065\u0072", "\u004E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0044\u0065\u0063\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x200A, 0x000A, "es-VE", "es", "spa", "es-VE", "\u0053\u0070\u0061\u006E\u0069\u0073\u0068\u0020\u0028\u0056\u0065\u006E\u0065\u007A\u0075\u0065\u006C\u0061\u0029", "\u0045\u0073\u0070\u0061\u00F1\u006F\u006C\u0020\u0028\u0052\u0065\u0070\u0075\u0062\u006C\u0069\u0063\u0061\u0020\u0042\u006F\u006C\u0069\u0076\u0061\u0072\u0069\u0061\u006E\u0061\u0020\u0064\u0065\u0020\u0056\u0065\u006E\u0065\u007A\u0075\u0065\u006C\u0061\u0029", false, 0x00F9, "VE", "VEN", "\u0056\u0065\u006E\u0065\u007A\u0075\u0065\u006C\u0061", "\u0052\u0065\u0070\u0075\u0062\u006C\u0069\u0063\u0061\u0020\u0042\u006F\u006C\u0069\u0076\u0061\u0072\u0069\u0061\u006E\u0061\u0020\u0064\u0065\u0020\u0056\u0065\u006E\u0065\u007A\u0075\u0065\u006C\u0061", "\u0056\u0045\u0042", "\u0056\u0065\u006E\u0065\u007A\u0075\u0065\u006C\u0061\u006E\u0020\u0042\u006F\u006C\u0069\u0076\u0061\u0072", "\u0042\u006F\u006C\u00ED\u0076\u0061\u0072", true, 2, 1, 2, 12, 2, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u0042\u0073", "\u002D", "\u002B", "\u004E\u0065\u0075\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0063\u0061\u006C\u0065\u006E\u0064\u0061\u0072\u0069\u006F\u0020\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u006F", 0, 0, "\u002F", "\u003A", "\u0061\u002E\u006D\u002E", "\u0070\u002E\u006D\u002E", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u0020\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u0064\u006F\u006D", "\u006C\u0075\u006E", "\u006D\u0061\u0072", "\u006D\u0069\u00E9", "\u006A\u0075\u0065", "\u0076\u0069\u0065", "\u0073\u00E1\u0062" ], [ "\u0064\u006F\u006D\u0069\u006E\u0067\u006F", "\u006C\u0075\u006E\u0065\u0073", "\u006D\u0061\u0072\u0074\u0065\u0073", "\u006D\u0069\u00E9\u0072\u0063\u006F\u006C\u0065\u0073", "\u006A\u0075\u0065\u0076\u0065\u0073", "\u0076\u0069\u0065\u0072\u006E\u0065\u0073", "\u0073\u00E1\u0062\u0061\u0064\u006F" ], [ "\u0065\u006E\u0065", "\u0066\u0065\u0062", "\u006D\u0061\u0072", "\u0061\u0062\u0072", "\u006D\u0061\u0079", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0067\u006F", "\u0073\u0065\u0070", "\u006F\u0063\u0074", "\u006E\u006F\u0076", "\u0064\u0069\u0063", "" ], [ "\u0065\u006E\u0065\u0072\u006F", "\u0066\u0065\u0062\u0072\u0065\u0072\u006F", "\u006D\u0061\u0072\u007A\u006F", "\u0061\u0062\u0072\u0069\u006C", "\u006D\u0061\u0079\u006F", "\u006A\u0075\u006E\u0069\u006F", "\u006A\u0075\u006C\u0069\u006F", "\u0061\u0067\u006F\u0073\u0074\u006F", "\u0073\u0065\u0070\u0074\u0069\u0065\u006D\u0062\u0072\u0065", "\u006F\u0063\u0074\u0075\u0062\u0072\u0065", "\u006E\u006F\u0076\u0069\u0065\u006D\u0062\u0072\u0065", "\u0064\u0069\u0063\u0069\u0065\u006D\u0062\u0072\u0065", "" ] }, +{ 0x2401, 0x0001, "ar-YE", "ar", "ara", "ar-YE", "\u0041\u0072\u0061\u0062\u0069\u0063\u0020\u0028\u0059\u0065\u006D\u0065\u006E\u0029", "\u0627\u0644\u0639\u0631\u0628\u064A\u0629\u0020\u0028\u0627\u0644\u064A\u0645\u0646\u0029", false, 0x0105, "YE", "YEM", "\u0059\u0065\u006D\u0065\u006E", "\u0627\u0644\u064A\u0645\u0646", "\u0059\u0045\u0052", "\u0059\u0065\u006D\u0065\u006E\u0069\u0020\u0052\u0069\u0061\u006C", "\u0631\u064A\u0627\u0644\u00A0\u064A\u0645\u0646\u064A", true, 2, 3, 2, 3, 2, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0631\u002E\u064A\u002E\u200F", "\u002D", "\u002B", "\u0644\u064A\u0633\u0020\u0628\u0631\u0642\u0645", "\u002D\u0644\u0627\u0020\u0646\u0647\u0627\u064A\u0629", "\u002B\u0644\u0627\u0020\u0646\u0647\u0627\u064A\u0629", [ "\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669" ], 1, [ 1, 23, 6, 2, 9, 10, 12 ], "\u0627\u0644\u062A\u0642\u0648\u064A\u0645\u00A0\u0627\u0644\u0645\u064A\u0644\u0627\u062F\u064A\u00A0\u0028\u062A\u0633\u0645\u064A\u0629\u00A0\u0625\u0646\u062C\u0644\u064A\u0632\u064A\u0629\u0029\u200F", 6, 0, "\u002F", "\u003A", "\u0635", "\u0645", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0627\u0644\u0627\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0627\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" ], [ "\u0627\u0644\u0627\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0627\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" ], [ "\u064A\u0646\u0627\u064A\u0631", "\u0641\u0628\u0631\u0627\u064A\u0631", "\u0645\u0627\u0631\u0633", "\u0627\u0628\u0631\u064A\u0644", "\u0645\u0627\u064A\u0648", "\u064A\u0648\u0646\u064A\u0648", "\u064A\u0648\u0644\u064A\u0648", "\u0627\u063A\u0633\u0637\u0633", "\u0633\u0628\u062A\u0645\u0628\u0631", "\u0627\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0641\u0645\u0628\u0631", "\u062F\u064A\u0633\u0645\u0628\u0631", "" ], [ "\u064A\u0646\u0627\u064A\u0631", "\u0641\u0628\u0631\u0627\u064A\u0631", "\u0645\u0627\u0631\u0633", "\u0627\u0628\u0631\u064A\u0644", "\u0645\u0627\u064A\u0648", "\u064A\u0648\u0646\u064A\u0648", "\u064A\u0648\u0644\u064A\u0648", "\u0627\u063A\u0633\u0637\u0633", "\u0633\u0628\u062A\u0645\u0628\u0631", "\u0627\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0641\u0645\u0628\u0631", "\u062F\u064A\u0633\u0645\u0628\u0631", "" ] }, +{ 0x2409, 0x0009, "en-CB", "en", "eng", "en-029", "\u0045\u006E\u0067\u006C\u0069\u0073\u0068\u0020\u0028\u0043\u0061\u0072\u0069\u0062\u0062\u0065\u0061\u006E\u0029", "\u0045\u006E\u0067\u006C\u0069\u0073\u0068\u0020\u0028\u0043\u0061\u0072\u0069\u0062\u0062\u0065\u0061\u006E\u0029", false, 0x007C, "CB", "CAR", "\u0043\u0061\u0072\u0069\u0062\u0062\u0065\u0061\u006E", "\u0043\u0061\u0072\u0069\u0062\u0062\u0065\u0061\u006E", "\u0055\u0053\u0044", "\u0055\u0053\u0020\u0044\u006F\u006C\u006C\u0061\u0072", "\u0055\u0053\u0020\u0044\u006F\u006C\u006C\u0061\u0072", false, 2, 1, 2, 1, 0, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0024", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1, 2 ], "\u0047\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0020\u0043\u0061\u006C\u0065\u006E\u0064\u0061\u0072", 1, 0, "\u002F", "\u003A", "\u0041\u004D", "\u0050\u004D", "\u004D\u004D\u002F\u0064\u0064\u002F\u0079\u0079\u0079\u0079", "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0064\u0064\u002C\u0020\u004D\u004D\u004D\u004D\u0020\u0064\u0064\u002C\u0020\u0079\u0079\u0079\u0079", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u004D\u004D\u002F\u0064\u0064\u002F\u0079\u0079\u0079\u0079", "\u004D\u004D\u002F\u0064\u0064\u002F\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u004D\u004D\u004D\u004D\u0020\u0064\u0064\u002C\u0020\u0079\u0079\u0079\u0079", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0053\u0075\u006E", "\u004D\u006F\u006E", "\u0054\u0075\u0065", "\u0057\u0065\u0064", "\u0054\u0068\u0075", "\u0046\u0072\u0069", "\u0053\u0061\u0074" ], [ "\u0053\u0075\u006E\u0064\u0061\u0079", "\u004D\u006F\u006E\u0064\u0061\u0079", "\u0054\u0075\u0065\u0073\u0064\u0061\u0079", "\u0057\u0065\u0064\u006E\u0065\u0073\u0064\u0061\u0079", "\u0054\u0068\u0075\u0072\u0073\u0064\u0061\u0079", "\u0046\u0072\u0069\u0064\u0061\u0079", "\u0053\u0061\u0074\u0075\u0072\u0064\u0061\u0079" ], [ "\u004A\u0061\u006E", "\u0046\u0065\u0062", "\u004D\u0061\u0072", "\u0041\u0070\u0072", "\u004D\u0061\u0079", "\u004A\u0075\u006E", "\u004A\u0075\u006C", "\u0041\u0075\u0067", "\u0053\u0065\u0070", "\u004F\u0063\u0074", "\u004E\u006F\u0076", "\u0044\u0065\u0063", "" ], [ "\u004A\u0061\u006E\u0075\u0061\u0072\u0079", "\u0046\u0065\u0062\u0072\u0075\u0061\u0072\u0079", "\u004D\u0061\u0072\u0063\u0068", "\u0041\u0070\u0072\u0069\u006C", "\u004D\u0061\u0079", "\u004A\u0075\u006E\u0065", "\u004A\u0075\u006C\u0079", "\u0041\u0075\u0067\u0075\u0073\u0074", "\u0053\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u004F\u0063\u0074\u006F\u0062\u0065\u0072", "\u004E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0044\u0065\u0063\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x240A, 0x000A, "es-CO", "es", "spa", "es-CO", "\u0053\u0070\u0061\u006E\u0069\u0073\u0068\u0020\u0028\u0043\u006F\u006C\u006F\u006D\u0062\u0069\u0061\u0029", "\u0045\u0073\u0070\u0061\u00F1\u006F\u006C\u0020\u0028\u0043\u006F\u006C\u006F\u006D\u0062\u0069\u0061\u0029", false, 0x0033, "CO", "COL", "\u0043\u006F\u006C\u006F\u006D\u0062\u0069\u0061", "\u0043\u006F\u006C\u006F\u006D\u0062\u0069\u0061", "\u0043\u004F\u0050", "\u0043\u006F\u006C\u006F\u006D\u0062\u0069\u0061\u006E\u0020\u0050\u0065\u0073\u006F", "\u0050\u0065\u0073\u006F", true, 2, 1, 2, 14, 2, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u0024", "\u002D", "\u002B", "\u004E\u0065\u0075\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0063\u0061\u006C\u0065\u006E\u0064\u0061\u0072\u0069\u006F\u0020\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u006F", 0, 0, "\u002F", "\u003A", "\u0061\u002E\u006D\u002E", "\u0070\u002E\u006D\u002E", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u0020\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u0064\u006F\u006D", "\u006C\u0075\u006E", "\u006D\u0061\u0072", "\u006D\u0069\u00E9", "\u006A\u0075\u0065", "\u0076\u0069\u0065", "\u0073\u00E1\u0062" ], [ "\u0064\u006F\u006D\u0069\u006E\u0067\u006F", "\u006C\u0075\u006E\u0065\u0073", "\u006D\u0061\u0072\u0074\u0065\u0073", "\u006D\u0069\u00E9\u0072\u0063\u006F\u006C\u0065\u0073", "\u006A\u0075\u0065\u0076\u0065\u0073", "\u0076\u0069\u0065\u0072\u006E\u0065\u0073", "\u0073\u00E1\u0062\u0061\u0064\u006F" ], [ "\u0065\u006E\u0065", "\u0066\u0065\u0062", "\u006D\u0061\u0072", "\u0061\u0062\u0072", "\u006D\u0061\u0079", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0067\u006F", "\u0073\u0065\u0070", "\u006F\u0063\u0074", "\u006E\u006F\u0076", "\u0064\u0069\u0063", "" ], [ "\u0065\u006E\u0065\u0072\u006F", "\u0066\u0065\u0062\u0072\u0065\u0072\u006F", "\u006D\u0061\u0072\u007A\u006F", "\u0061\u0062\u0072\u0069\u006C", "\u006D\u0061\u0079\u006F", "\u006A\u0075\u006E\u0069\u006F", "\u006A\u0075\u006C\u0069\u006F", "\u0061\u0067\u006F\u0073\u0074\u006F", "\u0073\u0065\u0070\u0074\u0069\u0065\u006D\u0062\u0072\u0065", "\u006F\u0063\u0074\u0075\u0062\u0072\u0065", "\u006E\u006F\u0076\u0069\u0065\u006D\u0062\u0072\u0065", "\u0064\u0069\u0063\u0069\u0065\u006D\u0062\u0072\u0065", "" ] }, +{ 0x2801, 0x0001, "ar-SY", "ar", "ara", "ar-SY", "\u0041\u0072\u0061\u0062\u0069\u0063\u0020\u0028\u0053\u0079\u0072\u0069\u0061\u0029", "\u0627\u0644\u0639\u0631\u0628\u064A\u0629\u0020\u0028\u0633\u0648\u0631\u064A\u0627\u0029", false, 0x00DE, "SY", "SYR", "\u0053\u0079\u0072\u0069\u0061", "\u0633\u0648\u0631\u064A\u0627", "\u0053\u0059\u0050", "\u0053\u0079\u0072\u0069\u0061\u006E\u0020\u0050\u006F\u0075\u006E\u0064", "\u0644\u064A\u0631\u0629\u0020\u0633\u0648\u0631\u064A", true, 2, 3, 2, 3, 2, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0644\u002E\u0633\u002E\u200F", "\u002D", "\u002B", "\u0644\u064A\u0633\u0020\u0628\u0631\u0642\u0645", "\u002D\u0644\u0627\u0020\u0646\u0647\u0627\u064A\u0629", "\u002B\u0644\u0627\u0020\u0646\u0647\u0627\u064A\u0629", [ "\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669" ], 1, [ 1, 23, 6, 2, 9, 11, 12 ], "\u0627\u0644\u062A\u0642\u0648\u064A\u0645\u00A0\u0627\u0644\u0645\u064A\u0644\u0627\u062F\u064A\u00A0\u0028\u0639\u0631\u0628\u064A\u0029\u200F", 6, 0, "\u002F", "\u003A", "\u0635", "\u0645", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0627\u0644\u0627\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0627\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" ], [ "\u0627\u0644\u0627\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0627\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" ], [ "\u0643\u0627\u0646\u0648\u0646\u00A0\u0627\u0644\u062B\u0627\u0646\u064A", "\u0634\u0628\u0627\u0637", "\u0622\u0630\u0627\u0631", "\u0646\u064A\u0633\u0627\u0646", "\u0623\u064A\u0627\u0631", "\u062D\u0632\u064A\u0631\u0627\u0646", "\u062A\u0645\u0648\u0632", "\u0622\u0628", "\u0623\u064A\u0644\u0648\u0644", "\u062A\u0634\u0631\u064A\u0646\u00A0\u0627\u0644\u0623\u0648\u0644", "\u062A\u0634\u0631\u064A\u0646\u00A0\u0627\u0644\u062B\u0627\u0646\u064A", "\u0643\u0627\u0646\u0648\u0646\u00A0\u0627\u0644\u0623\u0648\u0644", "" ], [ "\u0643\u0627\u0646\u0648\u0646\u00A0\u0627\u0644\u062B\u0627\u0646\u064A", "\u0634\u0628\u0627\u0637", "\u0622\u0630\u0627\u0631", "\u0646\u064A\u0633\u0627\u0646", "\u0623\u064A\u0627\u0631", "\u062D\u0632\u064A\u0631\u0627\u0646", "\u062A\u0645\u0648\u0632", "\u0622\u0628", "\u0623\u064A\u0644\u0648\u0644", "\u062A\u0634\u0631\u064A\u0646\u00A0\u0627\u0644\u0623\u0648\u0644", "\u062A\u0634\u0631\u064A\u0646\u00A0\u0627\u0644\u062B\u0627\u0646\u064A", "\u0643\u0627\u0646\u0648\u0646\u00A0\u0627\u0644\u0623\u0648\u0644", "" ] }, +{ 0x2809, 0x0009, "en-BZ", "en", "eng", "en-BZ", "\u0045\u006E\u0067\u006C\u0069\u0073\u0068\u0020\u0028\u0042\u0065\u006C\u0069\u007A\u0065\u0029", "\u0045\u006E\u0067\u006C\u0069\u0073\u0068\u0020\u0028\u0042\u0065\u006C\u0069\u007A\u0065\u0029", false, 0x0018, "BZ", "BLZ", "\u0042\u0065\u006C\u0069\u007A\u0065", "\u0042\u0065\u006C\u0069\u007A\u0065", "\u0042\u005A\u0044", "\u0042\u0065\u006C\u0069\u007A\u0065\u0020\u0044\u006F\u006C\u006C\u0061\u0072", "\u0042\u0065\u006C\u0069\u007A\u0065\u0020\u0044\u006F\u006C\u006C\u0061\u0072", true, 2, 1, 2, 0, 0, [ 3 ], [ 3, 0 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0042\u005A\u0024", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1, 2 ], "\u0047\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0020\u0043\u0061\u006C\u0065\u006E\u0064\u0061\u0072", 0, 0, "\u002F", "\u003A", "\u0041\u004D", "\u0050\u004D", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0053\u0075\u006E", "\u004D\u006F\u006E", "\u0054\u0075\u0065", "\u0057\u0065\u0064", "\u0054\u0068\u0075", "\u0046\u0072\u0069", "\u0053\u0061\u0074" ], [ "\u0053\u0075\u006E\u0064\u0061\u0079", "\u004D\u006F\u006E\u0064\u0061\u0079", "\u0054\u0075\u0065\u0073\u0064\u0061\u0079", "\u0057\u0065\u0064\u006E\u0065\u0073\u0064\u0061\u0079", "\u0054\u0068\u0075\u0072\u0073\u0064\u0061\u0079", "\u0046\u0072\u0069\u0064\u0061\u0079", "\u0053\u0061\u0074\u0075\u0072\u0064\u0061\u0079" ], [ "\u004A\u0061\u006E", "\u0046\u0065\u0062", "\u004D\u0061\u0072", "\u0041\u0070\u0072", "\u004D\u0061\u0079", "\u004A\u0075\u006E", "\u004A\u0075\u006C", "\u0041\u0075\u0067", "\u0053\u0065\u0070", "\u004F\u0063\u0074", "\u004E\u006F\u0076", "\u0044\u0065\u0063", "" ], [ "\u004A\u0061\u006E\u0075\u0061\u0072\u0079", "\u0046\u0065\u0062\u0072\u0075\u0061\u0072\u0079", "\u004D\u0061\u0072\u0063\u0068", "\u0041\u0070\u0072\u0069\u006C", "\u004D\u0061\u0079", "\u004A\u0075\u006E\u0065", "\u004A\u0075\u006C\u0079", "\u0041\u0075\u0067\u0075\u0073\u0074", "\u0053\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u004F\u0063\u0074\u006F\u0062\u0065\u0072", "\u004E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0044\u0065\u0063\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x280A, 0x000A, "es-PE", "es", "spa", "es-PE", "\u0053\u0070\u0061\u006E\u0069\u0073\u0068\u0020\u0028\u0050\u0065\u0072\u0075\u0029", "\u0045\u0073\u0070\u0061\u00F1\u006F\u006C\u0020\u0028\u0050\u0065\u0072\u00FA\u0029", false, 0x00BB, "PE", "PER", "\u0050\u0065\u0072\u0075", "\u0050\u0065\u0072\u00FA", "\u0050\u0045\u004E", "\u0050\u0065\u0072\u0075\u0076\u0069\u0061\u006E\u0020\u004E\u0075\u0065\u0076\u006F\u0020\u0053\u006F\u006C", "\u004E\u0075\u0065\u0076\u006F\u0020\u0053\u006F\u006C", true, 2, 1, 2, 12, 2, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0053\u002F\u002E", "\u002D", "\u002B", "\u004E\u0065\u0075\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0063\u0061\u006C\u0065\u006E\u0064\u0061\u0072\u0069\u006F\u0020\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u006F", 0, 0, "\u002F", "\u003A", "\u0061\u002E\u006D\u002E", "\u0070\u002E\u006D\u002E", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u0020\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u0064\u006F\u006D", "\u006C\u0075\u006E", "\u006D\u0061\u0072", "\u006D\u0069\u00E9", "\u006A\u0075\u0065", "\u0076\u0069\u0065", "\u0073\u00E1\u0062" ], [ "\u0064\u006F\u006D\u0069\u006E\u0067\u006F", "\u006C\u0075\u006E\u0065\u0073", "\u006D\u0061\u0072\u0074\u0065\u0073", "\u006D\u0069\u00E9\u0072\u0063\u006F\u006C\u0065\u0073", "\u006A\u0075\u0065\u0076\u0065\u0073", "\u0076\u0069\u0065\u0072\u006E\u0065\u0073", "\u0073\u00E1\u0062\u0061\u0064\u006F" ], [ "\u0065\u006E\u0065", "\u0066\u0065\u0062", "\u006D\u0061\u0072", "\u0061\u0062\u0072", "\u006D\u0061\u0079", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0067\u006F", "\u0073\u0065\u0070", "\u006F\u0063\u0074", "\u006E\u006F\u0076", "\u0064\u0069\u0063", "" ], [ "\u0065\u006E\u0065\u0072\u006F", "\u0066\u0065\u0062\u0072\u0065\u0072\u006F", "\u006D\u0061\u0072\u007A\u006F", "\u0061\u0062\u0072\u0069\u006C", "\u006D\u0061\u0079\u006F", "\u006A\u0075\u006E\u0069\u006F", "\u006A\u0075\u006C\u0069\u006F", "\u0061\u0067\u006F\u0073\u0074\u006F", "\u0073\u0065\u0070\u0074\u0069\u0065\u006D\u0062\u0072\u0065", "\u006F\u0063\u0074\u0075\u0062\u0072\u0065", "\u006E\u006F\u0076\u0069\u0065\u006D\u0062\u0072\u0065", "\u0064\u0069\u0063\u0069\u0065\u006D\u0062\u0072\u0065", "" ] }, +{ 0x2C01, 0x0001, "ar-JO", "ar", "ara", "ar-JO", "\u0041\u0072\u0061\u0062\u0069\u0063\u0020\u0028\u004A\u006F\u0072\u0064\u0061\u006E\u0029", "\u0627\u0644\u0639\u0631\u0628\u064A\u0629\u0020\u0028\u0627\u0644\u0623\u0631\u062F\u0646\u0029", false, 0x007E, "JO", "JOR", "\u004A\u006F\u0072\u0064\u0061\u006E", "\u0627\u0644\u0623\u0631\u062F\u0646", "\u004A\u004F\u0044", "\u004A\u006F\u0072\u0064\u0061\u006E\u0069\u0061\u006E\u0020\u0044\u0069\u006E\u0061\u0072", "\u062F\u064A\u0646\u0627\u0631\u00A0\u0627\u0631\u062F\u0646\u064A", true, 3, 3, 3, 3, 2, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u062F\u002E\u0627\u002E\u200F", "\u002D", "\u002B", "\u0644\u064A\u0633\u0020\u0628\u0631\u0642\u0645", "\u002D\u0644\u0627\u0020\u0646\u0647\u0627\u064A\u0629", "\u002B\u0644\u0627\u0020\u0646\u0647\u0627\u064A\u0629", [ "\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669" ], 1, [ 1, 23, 6, 2, 9, 11, 12 ], "\u0627\u0644\u062A\u0642\u0648\u064A\u0645\u00A0\u0627\u0644\u0645\u064A\u0644\u0627\u062F\u064A\u00A0\u0028\u0639\u0631\u0628\u064A\u0029\u200F", 6, 0, "\u002F", "\u003A", "\u0635", "\u0645", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0627\u0644\u0627\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0627\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" ], [ "\u0627\u0644\u0627\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0627\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" ], [ "\u0643\u0627\u0646\u0648\u0646\u00A0\u0627\u0644\u062B\u0627\u0646\u064A", "\u0634\u0628\u0627\u0637", "\u0622\u0630\u0627\u0631", "\u0646\u064A\u0633\u0627\u0646", "\u0623\u064A\u0627\u0631", "\u062D\u0632\u064A\u0631\u0627\u0646", "\u062A\u0645\u0648\u0632", "\u0622\u0628", "\u0623\u064A\u0644\u0648\u0644", "\u062A\u0634\u0631\u064A\u0646\u00A0\u0627\u0644\u0623\u0648\u0644", "\u062A\u0634\u0631\u064A\u0646\u00A0\u0627\u0644\u062B\u0627\u0646\u064A", "\u0643\u0627\u0646\u0648\u0646\u00A0\u0627\u0644\u0623\u0648\u0644", "" ], [ "\u0643\u0627\u0646\u0648\u0646\u00A0\u0627\u0644\u062B\u0627\u0646\u064A", "\u0634\u0628\u0627\u0637", "\u0622\u0630\u0627\u0631", "\u0646\u064A\u0633\u0627\u0646", "\u0623\u064A\u0627\u0631", "\u062D\u0632\u064A\u0631\u0627\u0646", "\u062A\u0645\u0648\u0632", "\u0622\u0628", "\u0623\u064A\u0644\u0648\u0644", "\u062A\u0634\u0631\u064A\u0646\u00A0\u0627\u0644\u0623\u0648\u0644", "\u062A\u0634\u0631\u064A\u0646\u00A0\u0627\u0644\u062B\u0627\u0646\u064A", "\u0643\u0627\u0646\u0648\u0646\u00A0\u0627\u0644\u0623\u0648\u0644", "" ] }, +{ 0x2C09, 0x0009, "en-TT", "en", "eng", "en-TT", "\u0045\u006E\u0067\u006C\u0069\u0073\u0068\u0020\u0028\u0054\u0072\u0069\u006E\u0069\u0064\u0061\u0064\u0020\u0061\u006E\u0064\u0020\u0054\u006F\u0062\u0061\u0067\u006F\u0029", "\u0045\u006E\u0067\u006C\u0069\u0073\u0068\u0020\u0028\u0054\u0072\u0069\u006E\u0069\u0064\u0061\u0064\u0020\u0079\u0020\u0054\u006F\u0062\u0061\u0067\u006F\u0029", false, 0x00E1, "TT", "TTO", "\u0054\u0072\u0069\u006E\u0069\u0064\u0061\u0064\u0020\u0061\u006E\u0064\u0020\u0054\u006F\u0062\u0061\u0067\u006F", "\u0054\u0072\u0069\u006E\u0069\u0064\u0061\u0064\u0020\u0079\u0020\u0054\u006F\u0062\u0061\u0067\u006F", "\u0054\u0054\u0044", "\u0054\u0072\u0069\u006E\u0069\u0064\u0061\u0064\u0020\u0044\u006F\u006C\u006C\u0061\u0072", "\u0054\u0072\u0069\u006E\u0069\u0064\u0061\u0064\u0020\u0044\u006F\u006C\u006C\u0061\u0072", true, 2, 1, 2, 0, 0, [ 3 ], [ 3, 0 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0054\u0054\u0024", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1, 2 ], "\u0047\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0020\u0043\u0061\u006C\u0065\u006E\u0064\u0061\u0072", 0, 0, "\u002F", "\u003A", "\u0041\u004D", "\u0050\u004D", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0053\u0075\u006E", "\u004D\u006F\u006E", "\u0054\u0075\u0065", "\u0057\u0065\u0064", "\u0054\u0068\u0075", "\u0046\u0072\u0069", "\u0053\u0061\u0074" ], [ "\u0053\u0075\u006E\u0064\u0061\u0079", "\u004D\u006F\u006E\u0064\u0061\u0079", "\u0054\u0075\u0065\u0073\u0064\u0061\u0079", "\u0057\u0065\u0064\u006E\u0065\u0073\u0064\u0061\u0079", "\u0054\u0068\u0075\u0072\u0073\u0064\u0061\u0079", "\u0046\u0072\u0069\u0064\u0061\u0079", "\u0053\u0061\u0074\u0075\u0072\u0064\u0061\u0079" ], [ "\u004A\u0061\u006E", "\u0046\u0065\u0062", "\u004D\u0061\u0072", "\u0041\u0070\u0072", "\u004D\u0061\u0079", "\u004A\u0075\u006E", "\u004A\u0075\u006C", "\u0041\u0075\u0067", "\u0053\u0065\u0070", "\u004F\u0063\u0074", "\u004E\u006F\u0076", "\u0044\u0065\u0063", "" ], [ "\u004A\u0061\u006E\u0075\u0061\u0072\u0079", "\u0046\u0065\u0062\u0072\u0075\u0061\u0072\u0079", "\u004D\u0061\u0072\u0063\u0068", "\u0041\u0070\u0072\u0069\u006C", "\u004D\u0061\u0079", "\u004A\u0075\u006E\u0065", "\u004A\u0075\u006C\u0079", "\u0041\u0075\u0067\u0075\u0073\u0074", "\u0053\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u004F\u0063\u0074\u006F\u0062\u0065\u0072", "\u004E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0044\u0065\u0063\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x2C0A, 0x000A, "es-AR", "es", "spa", "es-AR", "\u0053\u0070\u0061\u006E\u0069\u0073\u0068\u0020\u0028\u0041\u0072\u0067\u0065\u006E\u0074\u0069\u006E\u0061\u0029", "\u0045\u0073\u0070\u0061\u00F1\u006F\u006C\u0020\u0028\u0041\u0072\u0067\u0065\u006E\u0074\u0069\u006E\u0061\u0029", false, 0x000B, "AR", "ARG", "\u0041\u0072\u0067\u0065\u006E\u0074\u0069\u006E\u0061", "\u0041\u0072\u0067\u0065\u006E\u0074\u0069\u006E\u0061", "\u0041\u0052\u0053", "\u0041\u0072\u0067\u0065\u006E\u0074\u0069\u006E\u0065\u0020\u0050\u0065\u0073\u006F", "\u0050\u0065\u0073\u006F", true, 2, 1, 2, 2, 2, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u0024", "\u002D", "\u002B", "\u004E\u0065\u0075\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0063\u0061\u006C\u0065\u006E\u0064\u0061\u0072\u0069\u006F\u0020\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u006F", 0, 0, "\u002F", "\u003A", "\u0061\u002E\u006D\u002E", "\u0070\u002E\u006D\u002E", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u0020\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u0064\u006F\u006D", "\u006C\u0075\u006E", "\u006D\u0061\u0072", "\u006D\u0069\u00E9", "\u006A\u0075\u0065", "\u0076\u0069\u0065", "\u0073\u00E1\u0062" ], [ "\u0064\u006F\u006D\u0069\u006E\u0067\u006F", "\u006C\u0075\u006E\u0065\u0073", "\u006D\u0061\u0072\u0074\u0065\u0073", "\u006D\u0069\u00E9\u0072\u0063\u006F\u006C\u0065\u0073", "\u006A\u0075\u0065\u0076\u0065\u0073", "\u0076\u0069\u0065\u0072\u006E\u0065\u0073", "\u0073\u00E1\u0062\u0061\u0064\u006F" ], [ "\u0065\u006E\u0065", "\u0066\u0065\u0062", "\u006D\u0061\u0072", "\u0061\u0062\u0072", "\u006D\u0061\u0079", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0067\u006F", "\u0073\u0065\u0070", "\u006F\u0063\u0074", "\u006E\u006F\u0076", "\u0064\u0069\u0063", "" ], [ "\u0065\u006E\u0065\u0072\u006F", "\u0066\u0065\u0062\u0072\u0065\u0072\u006F", "\u006D\u0061\u0072\u007A\u006F", "\u0061\u0062\u0072\u0069\u006C", "\u006D\u0061\u0079\u006F", "\u006A\u0075\u006E\u0069\u006F", "\u006A\u0075\u006C\u0069\u006F", "\u0061\u0067\u006F\u0073\u0074\u006F", "\u0073\u0065\u0070\u0074\u0069\u0065\u006D\u0062\u0072\u0065", "\u006F\u0063\u0074\u0075\u0062\u0072\u0065", "\u006E\u006F\u0076\u0069\u0065\u006D\u0062\u0072\u0065", "\u0064\u0069\u0063\u0069\u0065\u006D\u0062\u0072\u0065", "" ] }, +{ 0x3001, 0x0001, "ar-LB", "ar", "ara", "ar-LB", "\u0041\u0072\u0061\u0062\u0069\u0063\u0020\u0028\u004C\u0065\u0062\u0061\u006E\u006F\u006E\u0029", "\u0627\u0644\u0639\u0631\u0628\u064A\u0629\u0020\u0028\u0644\u0628\u0646\u0627\u0646\u0029", false, 0x008B, "LB", "LBN", "\u004C\u0065\u0062\u0061\u006E\u006F\u006E", "\u0644\u0628\u0646\u0627\u0646", "\u004C\u0042\u0050", "\u004C\u0065\u0062\u0061\u006E\u0065\u0073\u0065\u0020\u0050\u006F\u0075\u006E\u0064", "\u0644\u064A\u0631\u0629\u0020\u0644\u0628\u0646\u0627\u0646\u064A", true, 2, 3, 2, 3, 2, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0644\u002E\u0644\u002E\u200F", "\u002D", "\u002B", "\u0644\u064A\u0633\u0020\u0628\u0631\u0642\u0645", "\u002D\u0644\u0627\u0020\u0646\u0647\u0627\u064A\u0629", "\u002B\u0644\u0627\u0020\u0646\u0647\u0627\u064A\u0629", [ "\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669" ], 1, [ 1, 23, 6, 2, 9, 11, 12 ], "\u0627\u0644\u062A\u0642\u0648\u064A\u0645\u00A0\u0627\u0644\u0645\u064A\u0644\u0627\u062F\u064A\u00A0\u0028\u0639\u0631\u0628\u064A\u0029\u200F", 1, 0, "\u002F", "\u003A", "\u0635", "\u0645", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0627\u0644\u0627\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0627\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" ], [ "\u0627\u0644\u0627\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0627\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" ], [ "\u0643\u0627\u0646\u0648\u0646\u00A0\u0627\u0644\u062B\u0627\u0646\u064A", "\u0634\u0628\u0627\u0637", "\u0622\u0630\u0627\u0631", "\u0646\u064A\u0633\u0627\u0646", "\u0623\u064A\u0627\u0631", "\u062D\u0632\u064A\u0631\u0627\u0646", "\u062A\u0645\u0648\u0632", "\u0622\u0628", "\u0623\u064A\u0644\u0648\u0644", "\u062A\u0634\u0631\u064A\u0646\u00A0\u0627\u0644\u0623\u0648\u0644", "\u062A\u0634\u0631\u064A\u0646\u00A0\u0627\u0644\u062B\u0627\u0646\u064A", "\u0643\u0627\u0646\u0648\u0646\u00A0\u0627\u0644\u0623\u0648\u0644", "" ], [ "\u0643\u0627\u0646\u0648\u0646\u00A0\u0627\u0644\u062B\u0627\u0646\u064A", "\u0634\u0628\u0627\u0637", "\u0622\u0630\u0627\u0631", "\u0646\u064A\u0633\u0627\u0646", "\u0623\u064A\u0627\u0631", "\u062D\u0632\u064A\u0631\u0627\u0646", "\u062A\u0645\u0648\u0632", "\u0622\u0628", "\u0623\u064A\u0644\u0648\u0644", "\u062A\u0634\u0631\u064A\u0646\u00A0\u0627\u0644\u0623\u0648\u0644", "\u062A\u0634\u0631\u064A\u0646\u00A0\u0627\u0644\u062B\u0627\u0646\u064A", "\u0643\u0627\u0646\u0648\u0646\u00A0\u0627\u0644\u0623\u0648\u0644", "" ] }, +{ 0x3009, 0x0009, "en-ZW", "en", "eng", "en-ZW", "\u0045\u006E\u0067\u006C\u0069\u0073\u0068\u0020\u0028\u005A\u0069\u006D\u0062\u0061\u0062\u0077\u0065\u0029", "\u0045\u006E\u0067\u006C\u0069\u0073\u0068\u0020\u0028\u005A\u0069\u006D\u0062\u0061\u0062\u0077\u0065\u0029", false, 0x0108, "ZW", "ZWE", "\u005A\u0069\u006D\u0062\u0061\u0062\u0077\u0065", "\u005A\u0069\u006D\u0062\u0061\u0062\u0077\u0065", "\u005A\u0057\u0044", "\u005A\u0069\u006D\u0062\u0061\u0062\u0077\u0065\u0020\u0044\u006F\u006C\u006C\u0061\u0072", "\u005A\u0069\u006D\u0062\u0061\u0062\u0077\u0065\u0020\u0044\u006F\u006C\u006C\u0061\u0072", false, 2, 1, 2, 0, 0, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u005A\u0024", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1, 2 ], "\u0047\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0020\u0043\u0061\u006C\u0065\u006E\u0064\u0061\u0072", 0, 0, "\u002F", "\u003A", "\u0041\u004D", "\u0050\u004D", "\u004D\u002F\u0064\u002F\u0079\u0079\u0079\u0079", "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0064\u0064\u002C\u0020\u004D\u004D\u004D\u004D\u0020\u0064\u0064\u002C\u0020\u0079\u0079\u0079\u0079", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u004D\u002F\u0064\u002F\u0079\u0079\u0079\u0079", "\u004D\u002F\u0064\u002F\u0079\u0079", "\u004D\u004D\u002F\u0064\u0064\u002F\u0079\u0079", "\u004D\u004D\u002F\u0064\u0064\u002F\u0079\u0079\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0064\u0064\u002D\u004D\u004D\u004D\u002D\u0079\u0079" ], [ "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u004D\u004D\u004D\u004D\u0020\u0064\u0064\u002C\u0020\u0079\u0079\u0079\u0079", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0053\u0075\u006E", "\u004D\u006F\u006E", "\u0054\u0075\u0065", "\u0057\u0065\u0064", "\u0054\u0068\u0075", "\u0046\u0072\u0069", "\u0053\u0061\u0074" ], [ "\u0053\u0075\u006E\u0064\u0061\u0079", "\u004D\u006F\u006E\u0064\u0061\u0079", "\u0054\u0075\u0065\u0073\u0064\u0061\u0079", "\u0057\u0065\u0064\u006E\u0065\u0073\u0064\u0061\u0079", "\u0054\u0068\u0075\u0072\u0073\u0064\u0061\u0079", "\u0046\u0072\u0069\u0064\u0061\u0079", "\u0053\u0061\u0074\u0075\u0072\u0064\u0061\u0079" ], [ "\u004A\u0061\u006E", "\u0046\u0065\u0062", "\u004D\u0061\u0072", "\u0041\u0070\u0072", "\u004D\u0061\u0079", "\u004A\u0075\u006E", "\u004A\u0075\u006C", "\u0041\u0075\u0067", "\u0053\u0065\u0070", "\u004F\u0063\u0074", "\u004E\u006F\u0076", "\u0044\u0065\u0063", "" ], [ "\u004A\u0061\u006E\u0075\u0061\u0072\u0079", "\u0046\u0065\u0062\u0072\u0075\u0061\u0072\u0079", "\u004D\u0061\u0072\u0063\u0068", "\u0041\u0070\u0072\u0069\u006C", "\u004D\u0061\u0079", "\u004A\u0075\u006E\u0065", "\u004A\u0075\u006C\u0079", "\u0041\u0075\u0067\u0075\u0073\u0074", "\u0053\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u004F\u0063\u0074\u006F\u0062\u0065\u0072", "\u004E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0044\u0065\u0063\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x300A, 0x000A, "es-EC", "es", "spa", "es-EC", "\u0053\u0070\u0061\u006E\u0069\u0073\u0068\u0020\u0028\u0045\u0063\u0075\u0061\u0064\u006F\u0072\u0029", "\u0045\u0073\u0070\u0061\u00F1\u006F\u006C\u0020\u0028\u0045\u0063\u0075\u0061\u0064\u006F\u0072\u0029", false, 0x0042, "EC", "ECU", "\u0045\u0063\u0075\u0061\u0064\u006F\u0072", "\u0045\u0063\u0075\u0061\u0064\u006F\u0072", "\u0055\u0053\u0044", "\u0055\u0053\u0020\u0044\u006F\u006C\u006C\u0061\u0072", "\u0055\u0053\u0020\u0044\u006F\u006C\u0061\u0072", true, 2, 1, 2, 14, 2, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u0024", "\u002D", "\u002B", "\u004E\u0065\u0075\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0063\u0061\u006C\u0065\u006E\u0064\u0061\u0072\u0069\u006F\u0020\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u006F", 0, 0, "\u002F", "\u003A", "", "", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u0020\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u0064\u006F\u006D", "\u006C\u0075\u006E", "\u006D\u0061\u0072", "\u006D\u0069\u00E9", "\u006A\u0075\u0065", "\u0076\u0069\u0065", "\u0073\u00E1\u0062" ], [ "\u0064\u006F\u006D\u0069\u006E\u0067\u006F", "\u006C\u0075\u006E\u0065\u0073", "\u006D\u0061\u0072\u0074\u0065\u0073", "\u006D\u0069\u00E9\u0072\u0063\u006F\u006C\u0065\u0073", "\u006A\u0075\u0065\u0076\u0065\u0073", "\u0076\u0069\u0065\u0072\u006E\u0065\u0073", "\u0073\u00E1\u0062\u0061\u0064\u006F" ], [ "\u0065\u006E\u0065", "\u0066\u0065\u0062", "\u006D\u0061\u0072", "\u0061\u0062\u0072", "\u006D\u0061\u0079", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0067\u006F", "\u0073\u0065\u0070", "\u006F\u0063\u0074", "\u006E\u006F\u0076", "\u0064\u0069\u0063", "" ], [ "\u0065\u006E\u0065\u0072\u006F", "\u0066\u0065\u0062\u0072\u0065\u0072\u006F", "\u006D\u0061\u0072\u007A\u006F", "\u0061\u0062\u0072\u0069\u006C", "\u006D\u0061\u0079\u006F", "\u006A\u0075\u006E\u0069\u006F", "\u006A\u0075\u006C\u0069\u006F", "\u0061\u0067\u006F\u0073\u0074\u006F", "\u0073\u0065\u0070\u0074\u0069\u0065\u006D\u0062\u0072\u0065", "\u006F\u0063\u0074\u0075\u0062\u0072\u0065", "\u006E\u006F\u0076\u0069\u0065\u006D\u0062\u0072\u0065", "\u0064\u0069\u0063\u0069\u0065\u006D\u0062\u0072\u0065", "" ] }, +{ 0x3401, 0x0001, "ar-KW", "ar", "ara", "ar-KW", "\u0041\u0072\u0061\u0062\u0069\u0063\u0020\u0028\u004B\u0075\u0077\u0061\u0069\u0074\u0029", "\u0627\u0644\u0639\u0631\u0628\u064A\u0629\u0020\u0028\u0627\u0644\u0643\u0648\u064A\u062A\u0029", false, 0x0088, "KW", "KWT", "\u004B\u0075\u0077\u0061\u0069\u0074", "\u0627\u0644\u0643\u0648\u064A\u062A", "\u004B\u0057\u0044", "\u004B\u0075\u0077\u0061\u0069\u0074\u0069\u0020\u0044\u0069\u006E\u0061\u0072", "\u062F\u064A\u0646\u0627\u0631\u00A0\u0643\u0648\u064A\u062A\u064A", true, 3, 3, 3, 3, 2, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u062F\u002E\u0643\u002E\u200F", "\u002D", "\u002B", "\u0644\u064A\u0633\u0020\u0628\u0631\u0642\u0645", "\u002D\u0644\u0627\u0020\u0646\u0647\u0627\u064A\u0629", "\u002B\u0644\u0627\u0020\u0646\u0647\u0627\u064A\u0629", [ "\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669" ], 1, [ 1, 6, 23, 2, 9, 10, 12 ], "\u0627\u0644\u062A\u0642\u0648\u064A\u0645\u00A0\u0627\u0644\u0645\u064A\u0644\u0627\u062F\u064A\u00A0\u0028\u062A\u0633\u0645\u064A\u0629\u00A0\u0625\u0646\u062C\u0644\u064A\u0632\u064A\u0629\u0029\u200F", 6, 0, "\u002F", "\u003A", "\u0635", "\u0645", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0627\u0644\u0627\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0627\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" ], [ "\u0627\u0644\u0627\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0627\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" ], [ "\u064A\u0646\u0627\u064A\u0631", "\u0641\u0628\u0631\u0627\u064A\u0631", "\u0645\u0627\u0631\u0633", "\u0627\u0628\u0631\u064A\u0644", "\u0645\u0627\u064A\u0648", "\u064A\u0648\u0646\u064A\u0648", "\u064A\u0648\u0644\u064A\u0648", "\u0627\u063A\u0633\u0637\u0633", "\u0633\u0628\u062A\u0645\u0628\u0631", "\u0627\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0641\u0645\u0628\u0631", "\u062F\u064A\u0633\u0645\u0628\u0631", "" ], [ "\u064A\u0646\u0627\u064A\u0631", "\u0641\u0628\u0631\u0627\u064A\u0631", "\u0645\u0627\u0631\u0633", "\u0627\u0628\u0631\u064A\u0644", "\u0645\u0627\u064A\u0648", "\u064A\u0648\u0646\u064A\u0648", "\u064A\u0648\u0644\u064A\u0648", "\u0627\u063A\u0633\u0637\u0633", "\u0633\u0628\u062A\u0645\u0628\u0631", "\u0627\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0641\u0645\u0628\u0631", "\u062F\u064A\u0633\u0645\u0628\u0631", "" ] }, +{ 0x3409, 0x0009, "en-PH", "en", "eng", "en-PH", "\u0045\u006E\u0067\u006C\u0069\u0073\u0068\u0020\u0028\u0052\u0065\u0070\u0075\u0062\u006C\u0069\u0063\u0020\u006F\u0066\u0020\u0074\u0068\u0065\u0020\u0050\u0068\u0069\u006C\u0069\u0070\u0070\u0069\u006E\u0065\u0073\u0029", "\u0045\u006E\u0067\u006C\u0069\u0073\u0068\u0020\u0028\u0050\u0068\u0069\u006C\u0069\u0070\u0070\u0069\u006E\u0065\u0073\u0029", false, 0x00C9, "PH", "PHL", "\u0052\u0065\u0070\u0075\u0062\u006C\u0069\u0063\u0020\u006F\u0066\u0020\u0074\u0068\u0065\u0020\u0050\u0068\u0069\u006C\u0069\u0070\u0070\u0069\u006E\u0065\u0073", "\u0050\u0068\u0069\u006C\u0069\u0070\u0070\u0069\u006E\u0065\u0073", "\u0050\u0048\u0050", "\u0050\u0068\u0069\u006C\u0069\u0070\u0070\u0069\u006E\u0065\u0020\u0050\u0065\u0073\u006F", "\u0050\u0068\u0069\u006C\u0069\u0070\u0070\u0069\u006E\u0065\u0020\u0050\u0065\u0073\u006F", false, 2, 1, 2, 0, 0, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0050\u0068\u0070", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1, 2 ], "\u0047\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0020\u0043\u0061\u006C\u0065\u006E\u0064\u0061\u0072", 0, 0, "\u002F", "\u003A", "\u0041\u004D", "\u0050\u004D", "\u004D\u002F\u0064\u002F\u0079\u0079\u0079\u0079", "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0064\u0064\u002C\u0020\u004D\u004D\u004D\u004D\u0020\u0064\u0064\u002C\u0020\u0079\u0079\u0079\u0079", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u004D\u002F\u0064\u002F\u0079\u0079\u0079\u0079", "\u004D\u002F\u0064\u002F\u0079\u0079", "\u004D\u004D\u002F\u0064\u0064\u002F\u0079\u0079", "\u004D\u004D\u002F\u0064\u0064\u002F\u0079\u0079\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0064\u0064\u002D\u004D\u004D\u004D\u002D\u0079\u0079" ], [ "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u004D\u004D\u004D\u004D\u0020\u0064\u0064\u002C\u0020\u0079\u0079\u0079\u0079", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0053\u0075\u006E", "\u004D\u006F\u006E", "\u0054\u0075\u0065", "\u0057\u0065\u0064", "\u0054\u0068\u0075", "\u0046\u0072\u0069", "\u0053\u0061\u0074" ], [ "\u0053\u0075\u006E\u0064\u0061\u0079", "\u004D\u006F\u006E\u0064\u0061\u0079", "\u0054\u0075\u0065\u0073\u0064\u0061\u0079", "\u0057\u0065\u0064\u006E\u0065\u0073\u0064\u0061\u0079", "\u0054\u0068\u0075\u0072\u0073\u0064\u0061\u0079", "\u0046\u0072\u0069\u0064\u0061\u0079", "\u0053\u0061\u0074\u0075\u0072\u0064\u0061\u0079" ], [ "\u004A\u0061\u006E", "\u0046\u0065\u0062", "\u004D\u0061\u0072", "\u0041\u0070\u0072", "\u004D\u0061\u0079", "\u004A\u0075\u006E", "\u004A\u0075\u006C", "\u0041\u0075\u0067", "\u0053\u0065\u0070", "\u004F\u0063\u0074", "\u004E\u006F\u0076", "\u0044\u0065\u0063", "" ], [ "\u004A\u0061\u006E\u0075\u0061\u0072\u0079", "\u0046\u0065\u0062\u0072\u0075\u0061\u0072\u0079", "\u004D\u0061\u0072\u0063\u0068", "\u0041\u0070\u0072\u0069\u006C", "\u004D\u0061\u0079", "\u004A\u0075\u006E\u0065", "\u004A\u0075\u006C\u0079", "\u0041\u0075\u0067\u0075\u0073\u0074", "\u0053\u0065\u0070\u0074\u0065\u006D\u0062\u0065\u0072", "\u004F\u0063\u0074\u006F\u0062\u0065\u0072", "\u004E\u006F\u0076\u0065\u006D\u0062\u0065\u0072", "\u0044\u0065\u0063\u0065\u006D\u0062\u0065\u0072", "" ] }, +{ 0x340A, 0x000A, "es-CL", "es", "spa", "es-CL", "\u0053\u0070\u0061\u006E\u0069\u0073\u0068\u0020\u0028\u0043\u0068\u0069\u006C\u0065\u0029", "\u0045\u0073\u0070\u0061\u00F1\u006F\u006C\u0020\u0028\u0043\u0068\u0069\u006C\u0065\u0029", false, 0x002E, "CL", "CHL", "\u0043\u0068\u0069\u006C\u0065", "\u0043\u0068\u0069\u006C\u0065", "\u0043\u004C\u0050", "\u0043\u0068\u0069\u006C\u0065\u0061\u006E\u0020\u0050\u0065\u0073\u006F", "\u0050\u0065\u0073\u006F", true, 2, 1, 2, 9, 2, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u0024", "\u002D", "\u002B", "\u004E\u0065\u0075\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0063\u0061\u006C\u0065\u006E\u0064\u0061\u0072\u0069\u006F\u0020\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u006F", 0, 0, "\u002D", "\u003A", "", "", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u0020\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u0064\u006F\u006D", "\u006C\u0075\u006E", "\u006D\u0061\u0072", "\u006D\u0069\u00E9", "\u006A\u0075\u0065", "\u0076\u0069\u0065", "\u0073\u00E1\u0062" ], [ "\u0064\u006F\u006D\u0069\u006E\u0067\u006F", "\u006C\u0075\u006E\u0065\u0073", "\u006D\u0061\u0072\u0074\u0065\u0073", "\u006D\u0069\u00E9\u0072\u0063\u006F\u006C\u0065\u0073", "\u006A\u0075\u0065\u0076\u0065\u0073", "\u0076\u0069\u0065\u0072\u006E\u0065\u0073", "\u0073\u00E1\u0062\u0061\u0064\u006F" ], [ "\u0065\u006E\u0065", "\u0066\u0065\u0062", "\u006D\u0061\u0072", "\u0061\u0062\u0072", "\u006D\u0061\u0079", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0067\u006F", "\u0073\u0065\u0070", "\u006F\u0063\u0074", "\u006E\u006F\u0076", "\u0064\u0069\u0063", "" ], [ "\u0065\u006E\u0065\u0072\u006F", "\u0066\u0065\u0062\u0072\u0065\u0072\u006F", "\u006D\u0061\u0072\u007A\u006F", "\u0061\u0062\u0072\u0069\u006C", "\u006D\u0061\u0079\u006F", "\u006A\u0075\u006E\u0069\u006F", "\u006A\u0075\u006C\u0069\u006F", "\u0061\u0067\u006F\u0073\u0074\u006F", "\u0073\u0065\u0070\u0074\u0069\u0065\u006D\u0062\u0072\u0065", "\u006F\u0063\u0074\u0075\u0062\u0072\u0065", "\u006E\u006F\u0076\u0069\u0065\u006D\u0062\u0072\u0065", "\u0064\u0069\u0063\u0069\u0065\u006D\u0062\u0072\u0065", "" ] }, +{ 0x3801, 0x0001, "ar-AE", "ar", "ara", "ar-AE", "\u0041\u0072\u0061\u0062\u0069\u0063\u0020\u0028\u0055\u002E\u0041\u002E\u0045\u002E\u0029", "\u0627\u0644\u0639\u0631\u0628\u064A\u0629\u0020\u0028\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062A\u0020\u0627\u0644\u0639\u0631\u0628\u064A\u0629\u0020\u0627\u0644\u0645\u062A\u062D\u062F\u0629\u0029", false, 0x00E0, "AE", "ARE", "\u0055\u002E\u0041\u002E\u0045\u002E", "\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062A\u0020\u0627\u0644\u0639\u0631\u0628\u064A\u0629\u0020\u0627\u0644\u0645\u062A\u062D\u062F\u0629", "\u0041\u0045\u0044", "\u0055\u0041\u0045\u0020\u0044\u0069\u0072\u0068\u0061\u006D", "\u062F\u0631\u0647\u0645\u00A0\u0627\u0645\u0627\u0631\u0627\u062A\u064A", true, 2, 3, 2, 3, 2, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u062F\u002E\u0625\u002E\u200F", "\u002D", "\u002B", "\u0644\u064A\u0633\u0020\u0628\u0631\u0642\u0645", "\u002D\u0644\u0627\u0020\u0646\u0647\u0627\u064A\u0629", "\u002B\u0644\u0627\u0020\u0646\u0647\u0627\u064A\u0629", [ "\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669" ], 1, [ 1, 23, 6, 2, 9, 10, 12 ], "\u0627\u0644\u062A\u0642\u0648\u064A\u0645\u00A0\u0627\u0644\u0645\u064A\u0644\u0627\u062F\u064A\u00A0\u0028\u062A\u0633\u0645\u064A\u0629\u00A0\u0625\u0646\u062C\u0644\u064A\u0632\u064A\u0629\u0029\u200F", 6, 0, "\u002F", "\u003A", "\u0635", "\u0645", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0627\u0644\u0627\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0627\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" ], [ "\u0627\u0644\u0627\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0627\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" ], [ "\u064A\u0646\u0627\u064A\u0631", "\u0641\u0628\u0631\u0627\u064A\u0631", "\u0645\u0627\u0631\u0633", "\u0627\u0628\u0631\u064A\u0644", "\u0645\u0627\u064A\u0648", "\u064A\u0648\u0646\u064A\u0648", "\u064A\u0648\u0644\u064A\u0648", "\u0627\u063A\u0633\u0637\u0633", "\u0633\u0628\u062A\u0645\u0628\u0631", "\u0627\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0641\u0645\u0628\u0631", "\u062F\u064A\u0633\u0645\u0628\u0631", "" ], [ "\u064A\u0646\u0627\u064A\u0631", "\u0641\u0628\u0631\u0627\u064A\u0631", "\u0645\u0627\u0631\u0633", "\u0627\u0628\u0631\u064A\u0644", "\u0645\u0627\u064A\u0648", "\u064A\u0648\u0646\u064A\u0648", "\u064A\u0648\u0644\u064A\u0648", "\u0627\u063A\u0633\u0637\u0633", "\u0633\u0628\u062A\u0645\u0628\u0631", "\u0627\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0641\u0645\u0628\u0631", "\u062F\u064A\u0633\u0645\u0628\u0631", "" ] }, +{ 0x380A, 0x000A, "es-UY", "es", "spa", "es-UY", "\u0053\u0070\u0061\u006E\u0069\u0073\u0068\u0020\u0028\u0055\u0072\u0075\u0067\u0075\u0061\u0079\u0029", "\u0045\u0073\u0070\u0061\u00F1\u006F\u006C\u0020\u0028\u0055\u0072\u0075\u0067\u0075\u0061\u0079\u0029", false, 0x00F6, "UY", "URY", "\u0055\u0072\u0075\u0067\u0075\u0061\u0079", "\u0055\u0072\u0075\u0067\u0075\u0061\u0079", "\u0055\u0059\u0055", "\u0050\u0065\u0073\u006F\u0020\u0055\u0072\u0075\u0067\u0075\u0061\u0079\u006F", "\u0050\u0065\u0073\u006F", true, 2, 1, 2, 14, 2, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u0024\u0055", "\u002D", "\u002B", "\u004E\u0065\u0075\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0063\u0061\u006C\u0065\u006E\u0064\u0061\u0072\u0069\u006F\u0020\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u006F", 1, 0, "\u002F", "\u003A", "\u0061\u002E\u006D\u002E", "\u0070\u002E\u006D\u002E", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u0020\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u0064\u006F\u006D", "\u006C\u0075\u006E", "\u006D\u0061\u0072", "\u006D\u0069\u00E9", "\u006A\u0075\u0065", "\u0076\u0069\u0065", "\u0073\u00E1\u0062" ], [ "\u0064\u006F\u006D\u0069\u006E\u0067\u006F", "\u006C\u0075\u006E\u0065\u0073", "\u006D\u0061\u0072\u0074\u0065\u0073", "\u006D\u0069\u00E9\u0072\u0063\u006F\u006C\u0065\u0073", "\u006A\u0075\u0065\u0076\u0065\u0073", "\u0076\u0069\u0065\u0072\u006E\u0065\u0073", "\u0073\u00E1\u0062\u0061\u0064\u006F" ], [ "\u0065\u006E\u0065", "\u0066\u0065\u0062", "\u006D\u0061\u0072", "\u0061\u0062\u0072", "\u006D\u0061\u0079", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0067\u006F", "\u0073\u0065\u0070", "\u006F\u0063\u0074", "\u006E\u006F\u0076", "\u0064\u0069\u0063", "" ], [ "\u0065\u006E\u0065\u0072\u006F", "\u0066\u0065\u0062\u0072\u0065\u0072\u006F", "\u006D\u0061\u0072\u007A\u006F", "\u0061\u0062\u0072\u0069\u006C", "\u006D\u0061\u0079\u006F", "\u006A\u0075\u006E\u0069\u006F", "\u006A\u0075\u006C\u0069\u006F", "\u0061\u0067\u006F\u0073\u0074\u006F", "\u0073\u0065\u0070\u0074\u0069\u0065\u006D\u0062\u0072\u0065", "\u006F\u0063\u0074\u0075\u0062\u0072\u0065", "\u006E\u006F\u0076\u0069\u0065\u006D\u0062\u0072\u0065", "\u0064\u0069\u0063\u0069\u0065\u006D\u0062\u0072\u0065", "" ] }, +{ 0x3C01, 0x0001, "ar-BH", "ar", "ara", "ar-BH", "\u0041\u0072\u0061\u0062\u0069\u0063\u0020\u0028\u0042\u0061\u0068\u0072\u0061\u0069\u006E\u0029", "\u0627\u0644\u0639\u0631\u0628\u064A\u0629\u0020\u0028\u0627\u0644\u0628\u062D\u0631\u064A\u0646\u0029", false, 0x0011, "BH", "BHR", "\u0042\u0061\u0068\u0072\u0061\u0069\u006E", "\u0627\u0644\u0628\u062D\u0631\u064A\u0646", "\u0042\u0048\u0044", "\u0042\u0061\u0068\u0072\u0061\u0069\u006E\u0069\u0020\u0044\u0069\u006E\u0061\u0072", "\u062F\u064A\u0646\u0627\u0631\u00A0\u0628\u062D\u0631\u064A\u0646\u064A", true, 3, 3, 3, 3, 2, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u062F\u002E\u0628\u002E\u200F", "\u002D", "\u002B", "\u0644\u064A\u0633\u0020\u0628\u0631\u0642\u0645", "\u002D\u0644\u0627\u0020\u0646\u0647\u0627\u064A\u0629", "\u002B\u0644\u0627\u0020\u0646\u0647\u0627\u064A\u0629", [ "\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669" ], 1, [ 1, 23, 6, 2, 9, 10, 12 ], "\u0627\u0644\u062A\u0642\u0648\u064A\u0645\u00A0\u0627\u0644\u0645\u064A\u0644\u0627\u062F\u064A\u00A0\u0028\u062A\u0633\u0645\u064A\u0629\u00A0\u0625\u0646\u062C\u0644\u064A\u0632\u064A\u0629\u0029\u200F", 6, 0, "\u002F", "\u003A", "\u0635", "\u0645", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0627\u0644\u0627\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0627\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" ], [ "\u0627\u0644\u0627\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0627\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" ], [ "\u064A\u0646\u0627\u064A\u0631", "\u0641\u0628\u0631\u0627\u064A\u0631", "\u0645\u0627\u0631\u0633", "\u0627\u0628\u0631\u064A\u0644", "\u0645\u0627\u064A\u0648", "\u064A\u0648\u0646\u064A\u0648", "\u064A\u0648\u0644\u064A\u0648", "\u0627\u063A\u0633\u0637\u0633", "\u0633\u0628\u062A\u0645\u0628\u0631", "\u0627\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0641\u0645\u0628\u0631", "\u062F\u064A\u0633\u0645\u0628\u0631", "" ], [ "\u064A\u0646\u0627\u064A\u0631", "\u0641\u0628\u0631\u0627\u064A\u0631", "\u0645\u0627\u0631\u0633", "\u0627\u0628\u0631\u064A\u0644", "\u0645\u0627\u064A\u0648", "\u064A\u0648\u0646\u064A\u0648", "\u064A\u0648\u0644\u064A\u0648", "\u0627\u063A\u0633\u0637\u0633", "\u0633\u0628\u062A\u0645\u0628\u0631", "\u0627\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0641\u0645\u0628\u0631", "\u062F\u064A\u0633\u0645\u0628\u0631", "" ] }, +{ 0x3C0A, 0x000A, "es-PY", "es", "spa", "es-PY", "\u0053\u0070\u0061\u006E\u0069\u0073\u0068\u0020\u0028\u0050\u0061\u0072\u0061\u0067\u0075\u0061\u0079\u0029", "\u0045\u0073\u0070\u0061\u00F1\u006F\u006C\u0020\u0028\u0050\u0061\u0072\u0061\u0067\u0075\u0061\u0079\u0029", false, 0x00B9, "PY", "PRY", "\u0050\u0061\u0072\u0061\u0067\u0075\u0061\u0079", "\u0050\u0061\u0072\u0061\u0067\u0075\u0061\u0079", "\u0050\u0059\u0047", "\u0050\u0061\u0072\u0061\u0067\u0075\u0061\u0079\u0020\u0047\u0075\u0061\u0072\u0061\u006E\u0069", "\u0047\u0075\u0061\u0072\u0061\u006E\u00ED", true, 2, 1, 2, 14, 2, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u0047\u0073", "\u002D", "\u002B", "\u004E\u0065\u0075\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0063\u0061\u006C\u0065\u006E\u0064\u0061\u0072\u0069\u006F\u0020\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u006F", 1, 0, "\u002F", "\u003A", "\u0061\u002E\u006D\u002E", "\u0070\u002E\u006D\u002E", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u0020\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u0064\u006F\u006D", "\u006C\u0075\u006E", "\u006D\u0061\u0072", "\u006D\u0069\u00E9", "\u006A\u0075\u0065", "\u0076\u0069\u0065", "\u0073\u00E1\u0062" ], [ "\u0064\u006F\u006D\u0069\u006E\u0067\u006F", "\u006C\u0075\u006E\u0065\u0073", "\u006D\u0061\u0072\u0074\u0065\u0073", "\u006D\u0069\u00E9\u0072\u0063\u006F\u006C\u0065\u0073", "\u006A\u0075\u0065\u0076\u0065\u0073", "\u0076\u0069\u0065\u0072\u006E\u0065\u0073", "\u0073\u00E1\u0062\u0061\u0064\u006F" ], [ "\u0065\u006E\u0065", "\u0066\u0065\u0062", "\u006D\u0061\u0072", "\u0061\u0062\u0072", "\u006D\u0061\u0079", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0067\u006F", "\u0073\u0065\u0070", "\u006F\u0063\u0074", "\u006E\u006F\u0076", "\u0064\u0069\u0063", "" ], [ "\u0065\u006E\u0065\u0072\u006F", "\u0066\u0065\u0062\u0072\u0065\u0072\u006F", "\u006D\u0061\u0072\u007A\u006F", "\u0061\u0062\u0072\u0069\u006C", "\u006D\u0061\u0079\u006F", "\u006A\u0075\u006E\u0069\u006F", "\u006A\u0075\u006C\u0069\u006F", "\u0061\u0067\u006F\u0073\u0074\u006F", "\u0073\u0065\u0070\u0074\u0069\u0065\u006D\u0062\u0072\u0065", "\u006F\u0063\u0074\u0075\u0062\u0072\u0065", "\u006E\u006F\u0076\u0069\u0065\u006D\u0062\u0072\u0065", "\u0064\u0069\u0063\u0069\u0065\u006D\u0062\u0072\u0065", "" ] }, +{ 0x4001, 0x0001, "ar-QA", "ar", "ara", "ar-QA", "\u0041\u0072\u0061\u0062\u0069\u0063\u0020\u0028\u0051\u0061\u0074\u0061\u0072\u0029", "\u0627\u0644\u0639\u0631\u0628\u064A\u0629\u0020\u0028\u0642\u0637\u0631\u0029", false, 0x00C5, "QA", "QAT", "\u0051\u0061\u0074\u0061\u0072", "\u0642\u0637\u0631", "\u0051\u0041\u0052", "\u0051\u0061\u0074\u0061\u0072\u0069\u0020\u0052\u0069\u0061\u006C", "\u0631\u064A\u0627\u0644\u00A0\u0642\u0637\u0631\u064A", true, 2, 3, 2, 3, 2, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0631\u002E\u0642\u002E\u200F", "\u002D", "\u002B", "\u0644\u064A\u0633\u0020\u0628\u0631\u0642\u0645", "\u002D\u0644\u0627\u0020\u0646\u0647\u0627\u064A\u0629", "\u002B\u0644\u0627\u0020\u0646\u0647\u0627\u064A\u0629", [ "\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669" ], 1, [ 1, 23, 6, 2, 9, 10, 12 ], "\u0627\u0644\u062A\u0642\u0648\u064A\u0645\u00A0\u0627\u0644\u0645\u064A\u0644\u0627\u062F\u064A\u00A0\u0028\u062A\u0633\u0645\u064A\u0629\u00A0\u0625\u0646\u062C\u0644\u064A\u0632\u064A\u0629\u0029\u200F", 6, 0, "\u002F", "\u003A", "\u0635", "\u0645", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D", "\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u0627\u0644\u0627\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0627\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" ], [ "\u0627\u0644\u0627\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0627\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" ], [ "\u064A\u0646\u0627\u064A\u0631", "\u0641\u0628\u0631\u0627\u064A\u0631", "\u0645\u0627\u0631\u0633", "\u0627\u0628\u0631\u064A\u0644", "\u0645\u0627\u064A\u0648", "\u064A\u0648\u0646\u064A\u0648", "\u064A\u0648\u0644\u064A\u0648", "\u0627\u063A\u0633\u0637\u0633", "\u0633\u0628\u062A\u0645\u0628\u0631", "\u0627\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0641\u0645\u0628\u0631", "\u062F\u064A\u0633\u0645\u0628\u0631", "" ], [ "\u064A\u0646\u0627\u064A\u0631", "\u0641\u0628\u0631\u0627\u064A\u0631", "\u0645\u0627\u0631\u0633", "\u0627\u0628\u0631\u064A\u0644", "\u0645\u0627\u064A\u0648", "\u064A\u0648\u0646\u064A\u0648", "\u064A\u0648\u0644\u064A\u0648", "\u0627\u063A\u0633\u0637\u0633", "\u0633\u0628\u062A\u0645\u0628\u0631", "\u0627\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0641\u0645\u0628\u0631", "\u062F\u064A\u0633\u0645\u0628\u0631", "" ] }, +{ 0x400A, 0x000A, "es-BO", "es", "spa", "es-BO", "\u0053\u0070\u0061\u006E\u0069\u0073\u0068\u0020\u0028\u0042\u006F\u006C\u0069\u0076\u0069\u0061\u0029", "\u0045\u0073\u0070\u0061\u00F1\u006F\u006C\u0020\u0028\u0042\u006F\u006C\u0069\u0076\u0069\u0061\u0029", false, 0x001A, "BO", "BOL", "\u0042\u006F\u006C\u0069\u0076\u0069\u0061", "\u0042\u006F\u006C\u0069\u0076\u0069\u0061", "\u0042\u004F\u0042", "\u0042\u006F\u006C\u0069\u0076\u0069\u0061\u006E\u006F", "\u0042\u006F\u006C\u0069\u0076\u0069\u0061\u006E\u006F", true, 2, 1, 2, 14, 2, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u0024\u0062", "\u002D", "\u002B", "\u004E\u0065\u0075\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0063\u0061\u006C\u0065\u006E\u0064\u0061\u0072\u0069\u006F\u0020\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u006F", 0, 0, "\u002F", "\u003A", "\u0061\u002E\u006D\u002E", "\u0070\u002E\u006D\u002E", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u0020\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u0064\u006F\u006D", "\u006C\u0075\u006E", "\u006D\u0061\u0072", "\u006D\u0069\u00E9", "\u006A\u0075\u0065", "\u0076\u0069\u0065", "\u0073\u00E1\u0062" ], [ "\u0064\u006F\u006D\u0069\u006E\u0067\u006F", "\u006C\u0075\u006E\u0065\u0073", "\u006D\u0061\u0072\u0074\u0065\u0073", "\u006D\u0069\u00E9\u0072\u0063\u006F\u006C\u0065\u0073", "\u006A\u0075\u0065\u0076\u0065\u0073", "\u0076\u0069\u0065\u0072\u006E\u0065\u0073", "\u0073\u00E1\u0062\u0061\u0064\u006F" ], [ "\u0065\u006E\u0065", "\u0066\u0065\u0062", "\u006D\u0061\u0072", "\u0061\u0062\u0072", "\u006D\u0061\u0079", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0067\u006F", "\u0073\u0065\u0070", "\u006F\u0063\u0074", "\u006E\u006F\u0076", "\u0064\u0069\u0063", "" ], [ "\u0065\u006E\u0065\u0072\u006F", "\u0066\u0065\u0062\u0072\u0065\u0072\u006F", "\u006D\u0061\u0072\u007A\u006F", "\u0061\u0062\u0072\u0069\u006C", "\u006D\u0061\u0079\u006F", "\u006A\u0075\u006E\u0069\u006F", "\u006A\u0075\u006C\u0069\u006F", "\u0061\u0067\u006F\u0073\u0074\u006F", "\u0073\u0065\u0070\u0074\u0069\u0065\u006D\u0062\u0072\u0065", "\u006F\u0063\u0074\u0075\u0062\u0072\u0065", "\u006E\u006F\u0076\u0069\u0065\u006D\u0062\u0072\u0065", "\u0064\u0069\u0063\u0069\u0065\u006D\u0062\u0072\u0065", "" ] }, +{ 0x440A, 0x000A, "es-SV", "es", "spa", "es-SV", "\u0053\u0070\u0061\u006E\u0069\u0073\u0068\u0020\u0028\u0045\u006C\u0020\u0053\u0061\u006C\u0076\u0061\u0064\u006F\u0072\u0029", "\u0045\u0073\u0070\u0061\u00F1\u006F\u006C\u0020\u0028\u0045\u006C\u0020\u0053\u0061\u006C\u0076\u0061\u0064\u006F\u0072\u0029", false, 0x0048, "SV", "SLV", "\u0045\u006C\u0020\u0053\u0061\u006C\u0076\u0061\u0064\u006F\u0072", "\u0045\u006C\u0020\u0053\u0061\u006C\u0076\u0061\u0064\u006F\u0072", "\u0055\u0053\u0044", "\u0055\u0053\u0020\u0044\u006F\u006C\u006C\u0061\u0072", "\u0055\u0053\u0020\u0044\u006F\u006C\u0061\u0072", true, 2, 1, 2, 0, 0, [ 3 ], [ 3, 0 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0024", "\u002D", "\u002B", "\u004E\u0065\u0075\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0063\u0061\u006C\u0065\u006E\u0064\u0061\u0072\u0069\u006F\u0020\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u006F", 0, 0, "\u002F", "\u003A", "\u0061\u002E\u006D\u002E", "\u0070\u002E\u006D\u002E", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u004D\u004D\u002D\u0064\u0064\u002D\u0079\u0079\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u0064\u006F\u006D", "\u006C\u0075\u006E", "\u006D\u0061\u0072", "\u006D\u0069\u00E9", "\u006A\u0075\u0065", "\u0076\u0069\u0065", "\u0073\u00E1\u0062" ], [ "\u0064\u006F\u006D\u0069\u006E\u0067\u006F", "\u006C\u0075\u006E\u0065\u0073", "\u006D\u0061\u0072\u0074\u0065\u0073", "\u006D\u0069\u00E9\u0072\u0063\u006F\u006C\u0065\u0073", "\u006A\u0075\u0065\u0076\u0065\u0073", "\u0076\u0069\u0065\u0072\u006E\u0065\u0073", "\u0073\u00E1\u0062\u0061\u0064\u006F" ], [ "\u0065\u006E\u0065", "\u0066\u0065\u0062", "\u006D\u0061\u0072", "\u0061\u0062\u0072", "\u006D\u0061\u0079", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0067\u006F", "\u0073\u0065\u0070", "\u006F\u0063\u0074", "\u006E\u006F\u0076", "\u0064\u0069\u0063", "" ], [ "\u0065\u006E\u0065\u0072\u006F", "\u0066\u0065\u0062\u0072\u0065\u0072\u006F", "\u006D\u0061\u0072\u007A\u006F", "\u0061\u0062\u0072\u0069\u006C", "\u006D\u0061\u0079\u006F", "\u006A\u0075\u006E\u0069\u006F", "\u006A\u0075\u006C\u0069\u006F", "\u0061\u0067\u006F\u0073\u0074\u006F", "\u0073\u0065\u0070\u0074\u0069\u0065\u006D\u0062\u0072\u0065", "\u006F\u0063\u0074\u0075\u0062\u0072\u0065", "\u006E\u006F\u0076\u0069\u0065\u006D\u0062\u0072\u0065", "\u0064\u0069\u0063\u0069\u0065\u006D\u0062\u0072\u0065", "" ] }, +{ 0x480A, 0x000A, "es-HN", "es", "spa", "es-HN", "\u0053\u0070\u0061\u006E\u0069\u0073\u0068\u0020\u0028\u0048\u006F\u006E\u0064\u0075\u0072\u0061\u0073\u0029", "\u0045\u0073\u0070\u0061\u00F1\u006F\u006C\u0020\u0028\u0048\u006F\u006E\u0064\u0075\u0072\u0061\u0073\u0029", false, 0x006A, "HN", "HND", "\u0048\u006F\u006E\u0064\u0075\u0072\u0061\u0073", "\u0048\u006F\u006E\u0064\u0075\u0072\u0061\u0073", "\u0048\u004E\u004C", "\u0048\u006F\u006E\u0064\u0075\u0072\u0061\u006E\u0020\u004C\u0065\u006D\u0070\u0069\u0072\u0061", "\u004C\u0065\u006D\u0070\u0069\u0072\u0061", true, 2, 1, 2, 12, 2, [ 3 ], [ 3, 0 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u004C\u002E", "\u002D", "\u002B", "\u004E\u0065\u0075\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0063\u0061\u006C\u0065\u006E\u0064\u0061\u0072\u0069\u006F\u0020\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u006F", 0, 0, "\u002F", "\u003A", "\u0061\u002E\u006D\u002E", "\u0070\u002E\u006D\u002E", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u004D\u004D\u002D\u0064\u0064\u002D\u0079\u0079\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u0064\u006F\u006D", "\u006C\u0075\u006E", "\u006D\u0061\u0072", "\u006D\u0069\u00E9", "\u006A\u0075\u0065", "\u0076\u0069\u0065", "\u0073\u00E1\u0062" ], [ "\u0064\u006F\u006D\u0069\u006E\u0067\u006F", "\u006C\u0075\u006E\u0065\u0073", "\u006D\u0061\u0072\u0074\u0065\u0073", "\u006D\u0069\u00E9\u0072\u0063\u006F\u006C\u0065\u0073", "\u006A\u0075\u0065\u0076\u0065\u0073", "\u0076\u0069\u0065\u0072\u006E\u0065\u0073", "\u0073\u00E1\u0062\u0061\u0064\u006F" ], [ "\u0065\u006E\u0065", "\u0066\u0065\u0062", "\u006D\u0061\u0072", "\u0061\u0062\u0072", "\u006D\u0061\u0079", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0067\u006F", "\u0073\u0065\u0070", "\u006F\u0063\u0074", "\u006E\u006F\u0076", "\u0064\u0069\u0063", "" ], [ "\u0065\u006E\u0065\u0072\u006F", "\u0066\u0065\u0062\u0072\u0065\u0072\u006F", "\u006D\u0061\u0072\u007A\u006F", "\u0061\u0062\u0072\u0069\u006C", "\u006D\u0061\u0079\u006F", "\u006A\u0075\u006E\u0069\u006F", "\u006A\u0075\u006C\u0069\u006F", "\u0061\u0067\u006F\u0073\u0074\u006F", "\u0073\u0065\u0070\u0074\u0069\u0065\u006D\u0062\u0072\u0065", "\u006F\u0063\u0074\u0075\u0062\u0072\u0065", "\u006E\u006F\u0076\u0069\u0065\u006D\u0062\u0072\u0065", "\u0064\u0069\u0063\u0069\u0065\u006D\u0062\u0072\u0065", "" ] }, +{ 0x4C0A, 0x000A, "es-NI", "es", "spa", "es-NI", "\u0053\u0070\u0061\u006E\u0069\u0073\u0068\u0020\u0028\u004E\u0069\u0063\u0061\u0072\u0061\u0067\u0075\u0061\u0029", "\u0045\u0073\u0070\u0061\u00F1\u006F\u006C\u0020\u0028\u004E\u0069\u0063\u0061\u0072\u0061\u0067\u0075\u0061\u0029", false, 0x00B6, "NI", "NIC", "\u004E\u0069\u0063\u0061\u0072\u0061\u0067\u0075\u0061", "\u004E\u0069\u0063\u0061\u0072\u0061\u0067\u0075\u0061", "\u004E\u0049\u004F", "\u004E\u0069\u0063\u0061\u0072\u0061\u0067\u0075\u0061\u006E\u0020\u0043\u006F\u0072\u0064\u006F\u0062\u0061\u0020\u004F\u0072\u006F", "\u0043\u00F3\u0072\u0064\u006F\u0062\u0061", true, 2, 1, 2, 14, 2, [ 3 ], [ 3, 0 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0043\u0024", "\u002D", "\u002B", "\u004E\u0065\u0075\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0063\u0061\u006C\u0065\u006E\u0064\u0061\u0072\u0069\u006F\u0020\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u006F", 0, 0, "\u002F", "\u003A", "\u0061\u002E\u006D\u002E", "\u0070\u002E\u006D\u002E", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u004D\u004D\u002D\u0064\u0064\u002D\u0079\u0079\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u0064\u006F\u006D", "\u006C\u0075\u006E", "\u006D\u0061\u0072", "\u006D\u0069\u00E9", "\u006A\u0075\u0065", "\u0076\u0069\u0065", "\u0073\u00E1\u0062" ], [ "\u0064\u006F\u006D\u0069\u006E\u0067\u006F", "\u006C\u0075\u006E\u0065\u0073", "\u006D\u0061\u0072\u0074\u0065\u0073", "\u006D\u0069\u00E9\u0072\u0063\u006F\u006C\u0065\u0073", "\u006A\u0075\u0065\u0076\u0065\u0073", "\u0076\u0069\u0065\u0072\u006E\u0065\u0073", "\u0073\u00E1\u0062\u0061\u0064\u006F" ], [ "\u0065\u006E\u0065", "\u0066\u0065\u0062", "\u006D\u0061\u0072", "\u0061\u0062\u0072", "\u006D\u0061\u0079", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0067\u006F", "\u0073\u0065\u0070", "\u006F\u0063\u0074", "\u006E\u006F\u0076", "\u0064\u0069\u0063", "" ], [ "\u0065\u006E\u0065\u0072\u006F", "\u0066\u0065\u0062\u0072\u0065\u0072\u006F", "\u006D\u0061\u0072\u007A\u006F", "\u0061\u0062\u0072\u0069\u006C", "\u006D\u0061\u0079\u006F", "\u006A\u0075\u006E\u0069\u006F", "\u006A\u0075\u006C\u0069\u006F", "\u0061\u0067\u006F\u0073\u0074\u006F", "\u0073\u0065\u0070\u0074\u0069\u0065\u006D\u0062\u0072\u0065", "\u006F\u0063\u0074\u0075\u0062\u0072\u0065", "\u006E\u006F\u0076\u0069\u0065\u006D\u0062\u0072\u0065", "\u0064\u0069\u0063\u0069\u0065\u006D\u0062\u0072\u0065", "" ] }, +{ 0x500A, 0x000A, "es-PR", "es", "spa", "es-PR", "\u0053\u0070\u0061\u006E\u0069\u0073\u0068\u0020\u0028\u0050\u0075\u0065\u0072\u0074\u006F\u0020\u0052\u0069\u0063\u006F\u0029", "\u0045\u0073\u0070\u0061\u00F1\u006F\u006C\u0020\u0028\u0050\u0075\u0065\u0072\u0074\u006F\u0020\u0052\u0069\u0063\u006F\u0029", false, 0x00CA, "PR", "PRI", "\u0050\u0075\u0065\u0072\u0074\u006F\u0020\u0052\u0069\u0063\u006F", "\u0050\u0075\u0065\u0072\u0074\u006F\u0020\u0052\u0069\u0063\u006F", "\u0055\u0053\u0044", "\u0055\u0053\u0020\u0044\u006F\u006C\u006C\u0061\u0072", "\u0055\u0053\u0020\u0044\u006F\u006C\u006C\u0061\u0072", true, 2, 1, 2, 14, 2, [ 3 ], [ 3, 0 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0024", "\u002D", "\u002B", "\u004E\u0065\u0075\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u006F", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0063\u0061\u006C\u0065\u006E\u0064\u0061\u0072\u0069\u006F\u0020\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u006F", 0, 0, "\u002F", "\u003A", "\u0061\u002E\u006D\u002E", "\u0070\u002E\u006D\u002E", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D", "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u004D\u004D\u002D\u0064\u0064\u002D\u0079\u0079\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u0064\u006F\u006D", "\u006C\u0075\u006E", "\u006D\u0061\u0072", "\u006D\u0069\u00E9", "\u006A\u0075\u0065", "\u0076\u0069\u0065", "\u0073\u00E1\u0062" ], [ "\u0064\u006F\u006D\u0069\u006E\u0067\u006F", "\u006C\u0075\u006E\u0065\u0073", "\u006D\u0061\u0072\u0074\u0065\u0073", "\u006D\u0069\u00E9\u0072\u0063\u006F\u006C\u0065\u0073", "\u006A\u0075\u0065\u0076\u0065\u0073", "\u0076\u0069\u0065\u0072\u006E\u0065\u0073", "\u0073\u00E1\u0062\u0061\u0064\u006F" ], [ "\u0065\u006E\u0065", "\u0066\u0065\u0062", "\u006D\u0061\u0072", "\u0061\u0062\u0072", "\u006D\u0061\u0079", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0067\u006F", "\u0073\u0065\u0070", "\u006F\u0063\u0074", "\u006E\u006F\u0076", "\u0064\u0069\u0063", "" ], [ "\u0065\u006E\u0065\u0072\u006F", "\u0066\u0065\u0062\u0072\u0065\u0072\u006F", "\u006D\u0061\u0072\u007A\u006F", "\u0061\u0062\u0072\u0069\u006C", "\u006D\u0061\u0079\u006F", "\u006A\u0075\u006E\u0069\u006F", "\u006A\u0075\u006C\u0069\u006F", "\u0061\u0067\u006F\u0073\u0074\u006F", "\u0073\u0065\u0070\u0074\u0069\u0065\u006D\u0062\u0072\u0065", "\u006F\u0063\u0074\u0075\u0062\u0072\u0065", "\u006E\u006F\u0076\u0069\u0065\u006D\u0062\u0072\u0065", "\u0064\u0069\u0063\u0069\u0065\u006D\u0062\u0072\u0065", "" ] }, +{ 0x7C04, 0x007F, "zh-CHT", "zh", "zho", "zh-Hant", "\u0043\u0068\u0069\u006E\u0065\u0073\u0065\u0020\u0028\u0054\u0072\u0061\u0064\u0069\u0074\u0069\u006F\u006E\u0061\u006C\u0029", "\u4E2D\u6587\u0028\u7E41\u9AD4\u0029", true }, +{ 0x7C1A, 0x007F, "sr", "sr", "srp", "sr", "\u0053\u0065\u0072\u0062\u0069\u0061\u006E", "\u0073\u0072\u0070\u0073\u006B\u0069", true }, +{ 0x183B, 0x007F, "sma-NO", "sma", "sma", "sma-NO", "\u0053\u0061\u006D\u0069\u0020\u0028\u0053\u006F\u0075\u0074\u0068\u0065\u0072\u006E\u0029\u0020\u0028\u004E\u006F\u0072\u0077\u0061\u0079\u0029", "\u00E5\u0061\u0072\u006A\u0065\u006C\u0073\u0061\u0065\u006D\u0069\u0065\u006E\u0067\u0069\u0065\u006C\u0065\u0020\u0028\u004E\u00F6\u00F6\u0072\u006A\u0065\u0029", false, 0x00B1, "NO", "NO", "\u004E\u006F\u0072\u0077\u0061\u0079", "\u004E\u00F6\u00F6\u0072\u006A\u0065", "\u004E\u004F\u004B", "\u004E\u006F\u0072\u0077\u0065\u0067\u0069\u0061\u006E\u0020\u004B\u0072\u006F\u006E\u0065", "\u006B\u0072\u00E5\u0076\u006E\u006F\u0065", true, 2, 1, 2, 12, 2, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002C", "\u00A0", "\u006B\u0072", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0073\u006B\u0020\u006B\u0061\u006C\u0065\u006E\u0064\u0065\u0072", 0, 2, "\u002E", "\u003A", "", "", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u004D\u004D\u004D\u004D\u0020\u0064\'\u002E\u0020\u0062\u002E\u0020\'\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u002E\u006D\u006D", "\u0048\u0048\u002E\u006D\u006D\u002E\u0073\u0073" ], [ "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u002E\u006D\u006D", "\u0048\u0048\u002E\u006D\u006D\u002E\u0073\u0073" ], [ "\u004D\u004D\u004D\u004D\u0020\u0064\'\u002E\u0020\u0062\u002E\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0061\u0065\u006A", "\u006D\u00E5\u0061", "\u0064\u00E6\u006A", "\u0067\u0061\u0073\u006B", "\u0064\u0075\u0061\u0072", "\u0062\u0065\u0061\u0072\u006A", "\u006C\u0061\u0061\u0076" ], [ "\u0061\u0065\u006A\u006C\u0065\u0067\u0065", "\u006D\u00E5\u0061\u006E\u0074\u0061", "\u0064\u00E6\u006A\u0073\u0074\u0061", "\u0067\u0061\u0073\u006B\u0065\u0076\u00E5\u0068\u006B\u006F\u0065", "\u0064\u0075\u0061\u0072\u0073\u0074\u0061", "\u0062\u0065\u0061\u0072\u006A\u0061\u0064\u0061\u0068\u006B\u0065", "\u006C\u0061\u0061\u0076\u0076\u0061\u0072\u0064\u0061\u0068\u006B\u0065" ], [ "\u0074\u0073\u00EF\u0065\u006E", "\u0067\u006F\u0065\u0076\u0074", "\u006E\u006A\u006F\u006B", "\u0076\u006F\u0065\u0072", "\u0073\u0075\u0065\u0068", "\u0072\u0075\u0066\u0066", "\u0073\u006E\u006A\u0061", "\u006D\u00EF\u0065\u0074", "\u0073\u006B\u00EF\u0065\u0072", "\u0067\u006F\u006C\u006B", "\u0072\u0061\u0068\u006B", "\u0067\u006F\u0065\u0076", "" ], [ "\u0074\u0073\u00EF\u0065\u006E\u0067\u0065\u006C\u0065", "\u0067\u006F\u0065\u0076\u0074\u0065", "\u006E\u006A\u006F\u006B\u0074\u006A\u0065", "\u0076\u006F\u0065\u0072\u0068\u0074\u006A\u0065", "\u0073\u0075\u0065\u0068\u0070\u0065\u0064\u0065", "\u0072\u0075\u0066\u0066\u0069\u0065", "\u0073\u006E\u006A\u0061\u006C\u0074\u006A\u0065", "\u006D\u00EF\u0065\u0074\u0073\u006B\u0065", "\u0073\u006B\u00EF\u0065\u0072\u0065\u0064\u0065", "\u0067\u006F\u006C\u006B\u0065", "\u0072\u0061\u0068\u006B\u0061", "\u0067\u006F\u0065\u0076\u0065", "" ] }, +{ 0x1C1A, 0x007F, "sr-BA-Cyrl", "sr", "sr", "sr-Cyrl-BA", "\u0053\u0065\u0072\u0062\u0069\u0061\u006E\u0020\u0028\u0043\u0079\u0072\u0069\u006C\u006C\u0069\u0063\u0029\u0020\u0028\u0042\u006F\u0073\u006E\u0069\u0061\u0020\u0061\u006E\u0064\u0020\u0048\u0065\u0072\u007A\u0065\u0067\u006F\u0076\u0069\u006E\u0061\u0029", "\u0441\u0440\u043F\u0441\u043A\u0438\u0020\u0028\u0411\u043E\u0441\u043D\u0430\u0020\u0438\u0020\u0425\u0435\u0440\u0446\u0435\u0433\u043E\u0432\u0438\u043D\u0430\u0029", false, 0x0019, "BA", "BA", "\u0042\u006F\u0073\u006E\u0069\u0061\u0020\u0061\u006E\u0064\u0020\u0048\u0065\u0072\u007A\u0065\u0067\u006F\u0076\u0069\u006E\u0061", "\u0411\u043E\u0441\u043D\u0430\u0020\u0438\u0020\u0425\u0435\u0440\u0446\u0435\u0433\u043E\u0432\u0438\u043D\u0430", "\u0042\u0041\u004D", "\u0043\u006F\u006E\u0076\u0065\u0072\u0074\u0069\u0062\u006C\u0065\u0020\u004D\u0061\u0072\u006B\u0073", "\u043A\u043E\u043D\u0432\u0435\u0440\u0442\u0438\u0431\u0438\u043B\u043D\u0430\u0020\u043C\u0430\u0440\u043A\u0430", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u041A\u041C", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0433\u0440\u0435\u0433\u043E\u0440\u0438\u0458\u0430\u043D\u0441\u043A\u0438\u0020\u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440", 0, 0, "\u002E", "\u003A", "", "", "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0064\u002E\u0020\u004D\u002E\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u002E\u0020\u004D\u002E\u0020\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u0064\u002E\u0020\u004D\u004D\u002E\u0020\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u043D\u0435\u0434", "\u043F\u043E\u043D", "\u0443\u0442\u043E", "\u0441\u0440\u0435", "\u0447\u0435\u0442", "\u043F\u0435\u0442", "\u0441\u0443\u0431" ], [ "\u043D\u0435\u0434\u0435\u0459\u0430", "\u043F\u043E\u043D\u0435\u0434\u0435\u0459\u0430\u043A", "\u0443\u0442\u043E\u0440\u0430\u043A", "\u0441\u0440\u0435\u0434\u0430", "\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043A", "\u043F\u0435\u0442\u0430\u043A", "\u0441\u0443\u0431\u043E\u0442\u0430" ], [ "\u0458\u0430\u043D", "\u0444\u0435\u0431", "\u043C\u0430\u0440", "\u0430\u043F\u0440", "\u043C\u0430\u0458", "\u0458\u0443\u043D", "\u0458\u0443\u043B", "\u0430\u0432\u0433", "\u0441\u0435\u043F", "\u043E\u043A\u0442", "\u043D\u043E\u0432", "\u0434\u0435\u0446", "" ], [ "\u0458\u0430\u043D\u0443\u0430\u0440", "\u0444\u0435\u0431\u0440\u0443\u0430\u0440", "\u043C\u0430\u0440\u0442", "\u0430\u043F\u0440\u0438\u043B", "\u043C\u0430\u0458", "\u0458\u0443\u043D", "\u0458\u0443\u043B", "\u0430\u0432\u0433\u0443\u0441\u0442", "\u0441\u0435\u043F\u0442\u0435\u043C\u0431\u0430\u0440", "\u043E\u043A\u0442\u043E\u0431\u0430\u0440", "\u043D\u043E\u0432\u0435\u043C\u0431\u0430\u0440", "\u0434\u0435\u0446\u0435\u043C\u0431\u0430\u0440", "" ] }, +{ 0x0435, 0x007F, "zu-ZA", "zu", "zu", "zu-ZA", "\u005A\u0075\u006C\u0075\u0020\u0028\u0053\u006F\u0075\u0074\u0068\u0020\u0041\u0066\u0072\u0069\u0063\u0061\u0029", "\u0069\u0073\u0069\u005A\u0075\u006C\u0075\u0020\u0028\u0069\u004E\u0069\u006E\u0067\u0069\u007A\u0069\u006D\u0075\u0020\u0041\u0066\u0072\u0069\u006B\u0061\u0029", false, 0x00D1, "ZA", "ZA", "\u0053\u006F\u0075\u0074\u0068\u0020\u0041\u0066\u0072\u0069\u0063\u0061", "\u0069\u004E\u0069\u006E\u0067\u0069\u007A\u0069\u006D\u0075\u0020\u0041\u0066\u0072\u0069\u006B\u0061", "\u005A\u0041\u0052", "\u0053\u006F\u0075\u0074\u0068\u0020\u0041\u0066\u0072\u0069\u0063\u0061\u006E\u0020\u0052\u0061\u006E\u0064", "\u0052\u0061\u006E\u0064", true, 2, 1, 2, 2, 2, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0052", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0047\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0020\u0043\u0061\u006C\u0065\u006E\u0064\u0061\u0072", 6, 0, "\u002F", "\u003A", "\u0041\u004D", "\u0050\u004D", "\u0079\u0079\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0079\u0079\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0053\u0075\u006E", "\u004D\u006F\u006E", "\u0054\u0075\u0065", "\u0057\u0065\u0064", "\u0054\u0068\u0075", "\u0046\u0072\u0069", "\u0053\u0061\u0074" ], [ "\u0069\u0053\u006F\u006E\u0074\u006F", "\u0075\u004D\u0073\u006F\u006D\u0062\u0075\u006C\u0075\u006B\u006F", "\u0075\u004C\u0077\u0065\u0073\u0069\u0062\u0069\u006C\u0069", "\u0075\u004C\u0077\u0065\u0073\u0069\u0074\u0068\u0061\u0074\u0068\u0075", "\u0075\u004C\u0077\u0065\u0073\u0069\u006E\u0065", "\u0075\u004C\u0077\u0065\u0073\u0069\u0068\u006C\u0061\u006E\u0075", "\u0075\u004D\u0067\u0071\u0069\u0062\u0065\u006C\u006F" ], [ "\u004A\u0061\u006E", "\u0046\u0065\u0062", "\u004D\u0061\u0072", "\u0041\u0070\u0072", "\u004D\u0061\u0079", "\u004A\u0075\u006E", "\u004A\u0075\u006C", "\u0041\u0075\u0067", "\u0053\u0065\u0070", "\u004F\u0063\u0074", "\u004E\u006F\u0076", "\u0044\u0065\u0063", "" ], [ "\u0075\u004A\u0061\u006E\u0075\u0077\u0061\u0072\u0069", "\u0075\u0046\u0065\u0062\u0075\u0077\u0061\u0072\u0069", "\u0075\u004D\u0061\u0073\u0068\u0069", "\u0075\u0041\u0070\u0072\u0068\u0069\u006C\u0069", "\u0075\u004D\u0065\u0079\u0069", "\u0075\u004A\u0075\u006E\u0069", "\u0075\u004A\u0075\u006C\u0061\u0079\u0069", "\u0075\u0041\u0067\u0061\u0073\u0074\u0065", "\u0075\u0053\u0065\u0070\u0074\u0068\u0065\u006D\u0062\u0061", "\u0075\u004F\u006B\u0074\u0068\u006F\u0062\u0061", "\u0075\u004E\u006F\u0076\u0065\u006D\u0062\u0061", "\u0075\u0044\u0069\u0073\u0065\u006D\u0062\u0061", "" ] }, +{ 0x0434, 0x007F, "xh-ZA", "xh", "xh", "xh-ZA", "\u0058\u0068\u006F\u0073\u0061\u0020\u0028\u0053\u006F\u0075\u0074\u0068\u0020\u0041\u0066\u0072\u0069\u0063\u0061\u0029", "\u0069\u0073\u0069\u0058\u0068\u006F\u0073\u0061\u0020\u0028\u0075\u004D\u007A\u0061\u006E\u0074\u0073\u0069\u0020\u0041\u0066\u0072\u0069\u006B\u0061\u0029", false, 0x00D1, "ZA", "ZA", "\u0053\u006F\u0075\u0074\u0068\u0020\u0041\u0066\u0072\u0069\u0063\u0061", "\u0075\u004D\u007A\u0061\u006E\u0074\u0073\u0069\u0020\u0041\u0066\u0072\u0069\u006B\u0061", "\u005A\u0041\u0052", "\u0053\u006F\u0075\u0074\u0068\u0020\u0041\u0066\u0072\u0069\u0063\u0061\u006E\u0020\u0052\u0061\u006E\u0064", "\u0052\u0061\u006E\u0064", true, 2, 1, 2, 2, 2, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0052", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0047\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0020\u0043\u0061\u006C\u0065\u006E\u0064\u0061\u0072", 6, 0, "\u002F", "\u003A", "\u0041\u004D", "\u0050\u004D", "\u0079\u0079\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0079\u0079\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0053\u0075\u006E", "\u004D\u006F\u006E", "\u0054\u0075\u0065", "\u0057\u0065\u0064", "\u0054\u0068\u0075", "\u0046\u0072\u0069", "\u0053\u0061\u0074" ], [ "\u0069\u0043\u0061\u0077\u0061", "\u0075\u004D\u0076\u0075\u006C\u006F", "\u0075\u004C\u0077\u0065\u0073\u0069\u0062\u0069\u006E\u0069", "\u0075\u004C\u0077\u0065\u0073\u0069\u0074\u0068\u0061\u0074\u0068\u0075", "\u0075\u004C\u0077\u0065\u0073\u0069\u006E\u0065", "\u0075\u004C\u0077\u0065\u0073\u0069\u0068\u006C\u0061\u006E\u0075", "\u0075\u004D\u0067\u0071\u0069\u0062\u0065\u006C\u006F" ], [ "\u004A\u0061\u006E", "\u0046\u0065\u0062", "\u004D\u0061\u0072", "\u0041\u0070\u0072", "\u004D\u0061\u0079", "\u004A\u0075\u006E", "\u004A\u0075\u006C", "\u0041\u0075\u0067", "\u0053\u0065\u0070", "\u004F\u0063\u0074", "\u004E\u006F\u0076", "\u0044\u0065\u0063", "" ], [ "\u0065\u0079\u006F\u004D\u0071\u0075\u006E\u0067\u0075", "\u0065\u0079\u006F\u004D\u0064\u0075\u006D\u0062\u0061", "\u0065\u0079\u006F\u004B\u0077\u0069\u006E\u0064\u006C\u0061", "\u0054\u0073\u0068\u0061\u007A\u0069\u006D\u0070\u0075\u007A\u0069", "\u0043\u0061\u006E\u007A\u0069\u0062\u0065", "\u0065\u0079\u0065\u0053\u0069\u006C\u0069\u006D\u0065\u006C\u0061", "\u0065\u0079\u0065\u004B\u0068\u0061\u006C\u0061", "\u0065\u0079\u0065\u0054\u0068\u0075\u0070\u0068\u0061", "\u0065\u0079\u006F\u004D\u0073\u0069\u006E\u0074\u0073\u0069", "\u0065\u0079\u0065\u0044\u0077\u0061\u0072\u0061", "\u0065\u0079\u0065\u004E\u006B\u0061\u006E\u0067\u0061", "\u0065\u0079\u006F\u004D\u006E\u0067\u0061", "" ] }, +{ 0x0432, 0x007F, "tn-ZA", "tn", "tn", "tn-ZA", "\u0054\u0073\u0077\u0061\u006E\u0061\u0020\u0028\u0053\u006F\u0075\u0074\u0068\u0020\u0041\u0066\u0072\u0069\u0063\u0061\u0029", "\u0053\u0065\u0074\u0073\u0077\u0061\u006E\u0061\u0020\u0028\u0041\u0066\u006F\u0072\u0069\u006B\u0061\u0020\u0042\u006F\u0072\u0077\u0061\u0029", false, 0x00D1, "ZA", "ZA", "\u0053\u006F\u0075\u0074\u0068\u0020\u0041\u0066\u0072\u0069\u0063\u0061", "\u0041\u0066\u006F\u0072\u0069\u006B\u0061\u0020\u0042\u006F\u0072\u0077\u0061", "\u005A\u0041\u0052", "\u0053\u006F\u0075\u0074\u0068\u0020\u0041\u0066\u0072\u0069\u0063\u0061\u006E\u0020\u0052\u0061\u006E\u0064", "\u0052\u0061\u006E\u0064", true, 2, 1, 2, 2, 2, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0052", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0047\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0020\u0043\u0061\u006C\u0065\u006E\u0064\u0061\u0072", 6, 0, "\u002F", "\u003A", "\u0041\u004D", "\u0050\u004D", "\u0079\u0079\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0079\u0079\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0053\u0075\u006E", "\u004D\u006F\u006E", "\u0054\u0075\u0065", "\u0057\u0065\u0064", "\u0054\u0068\u0075", "\u0046\u0072\u0069", "\u0053\u0061\u0074" ], [ "\u004C\u0061\u0074\u0073\u0068\u0069\u0070\u0069", "\u004D\u006F\u0073\u0075\u0070\u006F\u006C\u006F\u0067\u006F", "\u004C\u0061\u0062\u006F\u0062\u0065\u0064\u0069", "\u004C\u0061\u0062\u006F\u0072\u0061\u0072\u006F", "\u004C\u0061\u0062\u006F\u006E\u0065", "\u004C\u0061\u0062\u006F\u0074\u006C\u0068\u0061\u006E\u006F", "\u004C\u0061\u006D\u0061\u0074\u006C\u0068\u0061\u0074\u0073\u006F" ], [ "\u004A\u0061\u006E", "\u0046\u0065\u0062", "\u004D\u0061\u0072", "\u0041\u0070\u0072", "\u004D\u0061\u0079", "\u004A\u0075\u006E", "\u004A\u0075\u006C", "\u0041\u0075\u0067", "\u0053\u0065\u0070", "\u004F\u0063\u0074", "\u004E\u006F\u0076", "\u0044\u0065\u0063", "" ], [ "\u0046\u0065\u0072\u0069\u006B\u0067\u006F\u006E\u0067", "\u0054\u006C\u0068\u0061\u006B\u006F\u006C\u0065", "\u004D\u006F\u0070\u0069\u0074\u006C\u006F\u0065", "\u004D\u006F\u0072\u0061\u006E\u0061\u006E\u0067", "\u004D\u006F\u0074\u0073\u0068\u0065\u0067\u0061\u006E\u006F\u006E\u0067", "\u0053\u0065\u0065\u0074\u0065\u0062\u006F\u0073\u0069\u0067\u006F", "\u0050\u0068\u0075\u006B\u0077\u0069", "\u0050\u0068\u0061\u0074\u0077\u0065", "\u004C\u0077\u0065\u0074\u0073\u0065", "\u0044\u0069\u0070\u0068\u0061\u006C\u0061\u006E\u0065", "\u004E\u0067\u0077\u0061\u006E\u0061\u0074\u0073\u0065\u006C\u0065", "\u0053\u0065\u0064\u0069\u006D\u006F\u0074\u0068\u006F\u006C\u0065", "" ] }, +{ 0x083B, 0x007F, "se-SE", "se", "se", "se-SE", "\u0053\u0061\u006D\u0069\u0020\u0028\u004E\u006F\u0072\u0074\u0068\u0065\u0072\u006E\u0029\u0020\u0028\u0053\u0077\u0065\u0064\u0065\u006E\u0029", "\u0064\u0061\u0076\u0076\u0069\u0073\u00E1\u006D\u0065\u0067\u0069\u0065\u006C\u006C\u0061\u0020\u0028\u0052\u0075\u006F\u0167\u0167\u0061\u0029", false, 0x00DD, "SE", "SE", "\u0053\u0077\u0065\u0064\u0065\u006E", "\u0052\u0075\u006F\u0167\u0167\u0061", "\u0053\u0045\u004B", "\u0053\u0077\u0065\u0064\u0069\u0073\u0068\u0020\u004B\u0072\u006F\u006E\u0061", "\u006B\u0072\u0075\u0076\u0064\u006E\u006F", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002C", "\u002E", "\u006B\u0072", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0073\u006B\u0020\u006B\u0061\u006C\u0065\u006E\u0064\u0065\u0072", 0, 2, "\u002D", "\u003A", "", "", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u004D\u004D\u004D\u004D\u0020\u0064\'\u002E\u0020\u0062\u002E\u0020\'\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D" ], [ "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D" ], [ "\u004D\u004D\u004D\u004D\u0020\u0064\'\u002E\u0020\u0062\u002E\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0073\u006F\u0074\u006E", "\u006D\u00E1\u006E", "\u0064\u0069\u0073", "\u0067\u0061\u0073\u006B", "\u0064\u0075\u006F\u0072", "\u0062\u0065\u0061\u0072", "\u006C\u00E1\u0076" ], [ "\u0073\u006F\u0074\u006E\u0061\u0062\u0065\u0061\u0069\u0076\u0069", "\u006D\u00E1\u006E\u006E\u006F\u0064\u0061\u0074", "\u0064\u0069\u0073\u0064\u0061\u0074", "\u0067\u0061\u0073\u006B\u0061\u0076\u0061\u0068\u006B\u006B\u0075", "\u0064\u0075\u006F\u0072\u0061\u0073\u0074\u0061\u0074", "\u0062\u0065\u0061\u0072\u006A\u0061\u0064\u0061\u0074", "\u006C\u00E1\u0076\u0076\u0061\u0072\u0064\u0061\u0074" ], [ "\u006F\u0111\u0111\u006A", "\u0067\u0075\u006F\u0076", "\u006E\u006A\u0075\u006B", "\u0063\u0075\u006F", "\u006D\u0069\u0065\u0073", "\u0067\u0065\u0061\u0073", "\u0073\u0075\u006F\u0069", "\u0062\u006F\u0072\u0067", "\u010D\u0061\u006B\u010D", "\u0067\u006F\u006C\u0067", "\u0073\u006B\u00E1\u0062", "\u006A\u0075\u006F\u0076", "" ], [ "\u006F\u0111\u0111\u0061\u006A\u0061\u0067\u0065\u006D\u00E1\u006E\u006E\u0075", "\u0067\u0075\u006F\u0076\u0076\u0061\u006D\u00E1\u006E\u006E\u0075", "\u006E\u006A\u0075\u006B\u010D\u0061\u006D\u00E1\u006E\u006E\u0075", "\u0063\u0075\u006F\u014B\u006F\u006D\u00E1\u006E\u006E\u0075", "\u006D\u0069\u0065\u0073\u0073\u0065\u006D\u00E1\u006E\u006E\u0075", "\u0067\u0065\u0061\u0073\u0073\u0065\u006D\u00E1\u006E\u006E\u0075", "\u0073\u0075\u006F\u0069\u0064\u006E\u0065\u006D\u00E1\u006E\u006E\u0075", "\u0062\u006F\u0072\u0067\u0065\u006D\u00E1\u006E\u006E\u0075", "\u010D\u0061\u006B\u010D\u0061\u006D\u00E1\u006E\u006E\u0075", "\u0067\u006F\u006C\u0067\u0067\u006F\u0074\u006D\u00E1\u006E\u006E\u0075", "\u0073\u006B\u00E1\u0062\u006D\u0061\u006D\u00E1\u006E\u006E\u0075", "\u006A\u0075\u006F\u0076\u006C\u0061\u006D\u00E1\u006E\u006E\u0075", "" ] }, +{ 0x1C3B, 0x007F, "sma-SE", "sma", "sma", "sma-SE", "\u0053\u0061\u006D\u0069\u0020\u0028\u0053\u006F\u0075\u0074\u0068\u0065\u0072\u006E\u0029\u0020\u0028\u0053\u0077\u0065\u0064\u0065\u006E\u0029", "\u00E5\u0061\u0072\u006A\u0065\u006C\u0073\u0061\u0065\u006D\u0069\u0065\u006E\u0067\u0069\u0065\u006C\u0065\u0020\u0028\u0053\u0076\u0065\u0065\u0072\u006A\u0065\u0029", false, 0x00DD, "SE", "SE", "\u0053\u0077\u0065\u0064\u0065\u006E", "\u0053\u0076\u0065\u0065\u0072\u006A\u0065", "\u0053\u0045\u004B", "\u0053\u0077\u0065\u0064\u0069\u0073\u0068\u0020\u004B\u0072\u006F\u006E\u0061", "\u006B\u0072\u00E5\u0076\u006E\u006F\u0065", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002C", "\u002E", "\u006B\u0072", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0073\u006B\u0020\u006B\u0061\u006C\u0065\u006E\u0064\u0065\u0072", 0, 2, "\u002D", "\u003A", "", "", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u004D\u004D\u004D\u004D\u0020\u0064\'\u002E\u0020\u0062\u002E\u0020\'\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D" ], [ "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D" ], [ "\u004D\u004D\u004D\u004D\u0020\u0064\'\u002E\u0020\u0062\u002E\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0061\u0065\u006A", "\u006D\u00E5\u0061", "\u0064\u00E6\u006A", "\u0067\u0061\u0073\u006B", "\u0064\u0075\u0061\u0072", "\u0062\u0065\u0061\u0072\u006A", "\u006C\u0061\u0061\u0076" ], [ "\u0061\u0065\u006A\u006C\u0065\u0067\u0065", "\u006D\u00E5\u0061\u006E\u0074\u0061", "\u0064\u00E6\u006A\u0073\u0074\u0061", "\u0067\u0061\u0073\u006B\u0065\u0076\u00E5\u0068\u006B\u006F\u0065", "\u0064\u0075\u0061\u0072\u0073\u0074\u0061", "\u0062\u0065\u0061\u0072\u006A\u0061\u0064\u0061\u0068\u006B\u0065", "\u006C\u0061\u0061\u0076\u0076\u0061\u0072\u0064\u0061\u0068\u006B\u0065" ], [ "\u0074\u0073\u00EF\u0065\u006E", "\u0067\u006F\u0065\u0076\u0074", "\u006E\u006A\u006F\u006B", "\u0076\u006F\u0065\u0072", "\u0073\u0075\u0065\u0068", "\u0072\u0075\u0066\u0066", "\u0073\u006E\u006A\u0061", "\u006D\u00EF\u0065\u0074", "\u0073\u006B\u00EF\u0065\u0072", "\u0067\u006F\u006C\u006B", "\u0072\u0061\u0068\u006B", "\u0067\u006F\u0065\u0076", "" ], [ "\u0074\u0073\u00EF\u0065\u006E\u0067\u0065\u006C\u0065", "\u0067\u006F\u0065\u0076\u0074\u0065", "\u006E\u006A\u006F\u006B\u0074\u006A\u0065", "\u0076\u006F\u0065\u0072\u0068\u0074\u006A\u0065", "\u0073\u0075\u0065\u0068\u0070\u0065\u0064\u0065", "\u0072\u0075\u0066\u0066\u0069\u0065", "\u0073\u006E\u006A\u0061\u006C\u0074\u006A\u0065", "\u006D\u00EF\u0065\u0074\u0073\u006B\u0065", "\u0073\u006B\u00EF\u0065\u0072\u0065\u0064\u0065", "\u0067\u006F\u006C\u006B\u0065", "\u0072\u0061\u0068\u006B\u0061", "\u0067\u006F\u0065\u0076\u0065", "" ] }, +{ 0x101A, 0x007F, "hr-BA", "hr", "hr", "hr-BA", "\u0043\u0072\u006F\u0061\u0074\u0069\u0061\u006E\u0020\u0028\u0042\u006F\u0073\u006E\u0069\u0061\u0020\u0061\u006E\u0064\u0020\u0048\u0065\u0072\u007A\u0065\u0067\u006F\u0076\u0069\u006E\u0061\u0029", "\u0068\u0072\u0076\u0061\u0074\u0073\u006B\u0069\u0020\u0028\u0042\u006F\u0073\u006E\u0061\u0020\u0069\u0020\u0048\u0065\u0072\u0063\u0065\u0067\u006F\u0076\u0069\u006E\u0061\u0029", false, 0x0019, "BA", "BA", "\u0042\u006F\u0073\u006E\u0069\u0061\u0020\u0061\u006E\u0064\u0020\u0048\u0065\u0072\u007A\u0065\u0067\u006F\u0076\u0069\u006E\u0061", "\u0042\u006F\u0073\u006E\u0061\u0020\u0069\u0020\u0048\u0065\u0072\u0063\u0065\u0067\u006F\u0076\u0069\u006E\u0061", "\u0042\u0041\u004D", "\u0043\u006F\u006E\u0076\u0065\u0072\u0074\u0069\u0062\u006C\u0065\u0020\u004D\u0061\u0072\u006B\u0073", "\u006B\u006F\u006E\u0076\u0065\u0072\u0074\u0069\u0062\u0069\u006C\u006E\u0061\u0020\u006D\u0061\u0072\u006B\u0061", true, 2, 2, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u004B\u004D", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u006A\u0061\u006E\u0073\u006B\u0069\u0020\u006B\u0061\u006C\u0065\u006E\u0064\u0061\u0072", 0, 0, "\u002E", "\u003A", "", "", "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064", "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0064\u002E\u0020\u004D\u002E\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u002E\u0020\u004D\u002E\u0020\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u0064\u002E\u0020\u004D\u004D\u002E\u0020\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u002C\u0020\u0079\u0079\u0079\u0079" ], [ "\u006E\u0065\u0064", "\u0070\u006F\u006E", "\u0075\u0074\u006F", "\u0073\u0072\u0069", "\u010D\u0065\u0074", "\u0070\u0065\u0074", "\u0073\u0075\u0062" ], [ "\u006E\u0065\u0064\u006A\u0065\u006C\u006A\u0061", "\u0070\u006F\u006E\u0065\u0064\u006A\u0065\u006C\u006A\u0061\u006B", "\u0075\u0074\u006F\u0072\u0061\u006B", "\u0073\u0072\u0069\u006A\u0065\u0064\u0061", "\u010D\u0065\u0074\u0076\u0072\u0074\u0061\u006B", "\u0070\u0065\u0074\u0061\u006B", "\u0073\u0075\u0062\u006F\u0074\u0061" ], [ "\u0073\u0069\u006A", "\u0076\u006C\u006A", "\u006F\u017E\u0075", "\u0074\u0072\u0061", "\u0073\u0076\u0069", "\u006C\u0069\u0070", "\u0073\u0072\u0070", "\u006B\u006F\u006C", "\u0072\u0075\u006A", "\u006C\u0069\u0073", "\u0073\u0074\u0075", "\u0070\u0072\u006F", "" ], [ "\u0073\u0069\u006A\u0065\u010D\u0061\u006E\u006A", "\u0076\u0065\u006C\u006A\u0061\u010D\u0061", "\u006F\u017E\u0075\u006A\u0061\u006B", "\u0074\u0072\u0061\u0076\u0061\u006E\u006A", "\u0073\u0076\u0069\u0062\u0061\u006E\u006A", "\u006C\u0069\u0070\u0061\u006E\u006A", "\u0073\u0072\u0070\u0061\u006E\u006A", "\u006B\u006F\u006C\u006F\u0076\u006F\u007A", "\u0072\u0075\u006A\u0061\u006E", "\u006C\u0069\u0073\u0074\u006F\u0070\u0061\u0064", "\u0073\u0074\u0075\u0064\u0065\u006E\u0069", "\u0070\u0072\u006F\u0073\u0069\u006E\u0061\u0063", "" ] }, +{ 0x243B, 0x007F, "smn-FI", "smn", "smn", "smn-FI", "\u0053\u0061\u006D\u0069\u0020\u0028\u0049\u006E\u0061\u0072\u0069\u0029\u0020\u0028\u0046\u0069\u006E\u006C\u0061\u006E\u0064\u0029", "\u0073\u00E4\u006D\u0069\u006B\u0069\u0065\u006C\u00E2\u0020\u0028\u0053\u0075\u006F\u006D\u00E2\u0029", false, 0x004D, "FI", "FI", "\u0046\u0069\u006E\u006C\u0061\u006E\u0064", "\u0053\u0075\u006F\u006D\u00E2", "\u0045\u0055\u0052", "\u0045\u0075\u0072\u006F", "\u0065\u0076\u0072\u006F", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002C", "\u00A0", "\u20AC", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u0061\u006E\u0069\u006E\u0065\u006E\u0020\u006B\u0061\u006C\u0065\u006E\u0074\u0065\u0072\u0069", 0, 2, "\u002E", "\u003A", "", "", "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u004D\u004D\u004D\u004D\u0020\u0064\'\u002E\u0020\u0070\u002E\u0020\'\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D" ], [ "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D" ], [ "\u004D\u004D\u004D\u004D\u0020\u0064\'\u002E\u0020\u0070\u002E\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0070\u0061", "\u0076\u0075", "\u006D\u0061", "\u006B\u006F", "\u0074\u0075", "\u0076\u00E1", "\u006C\u00E1" ], [ "\u0070\u0061\u0073\u0065\u0070\u0065\u0069\u0076\u0069", "\u0076\u0075\u006F\u0073\u0073\u0061\u0072\u0067\u00E2", "\u006D\u0061\u006A\u0065\u0062\u0061\u0072\u0067\u00E2", "\u006B\u006F\u0073\u006B\u006F\u006B\u006B\u006F", "\u0074\u0075\u006F\u0072\u00E2\u0073\u0074\u00E2\u0068", "\u0076\u00E1\u0073\u0074\u0075\u0070\u0070\u0065\u0069\u0076\u0069", "\u006C\u00E1\u0076\u00E1\u0072\u0064\u00E2\u0068" ], [ "\u0075\u0111\u0069\u0076", "\u006B\u0075\u006F\u0076", "\u006E\u006A\u0075\u0068", "\u0063\u0075\u006F\u014B", "\u0076\u0079\u0065\u0073", "\u006B\u0065\u0073\u0069", "\u0073\u0079\u0065\u0069", "\u0070\u006F\u0072\u0067", "\u010D\u006F\u0068", "\u0072\u006F\u006F\u0076", "\u0073\u006B\u0061", "\u006A\u0075\u006F\u0076", "" ], [ "\u0075\u0111\u0111\u00E2\u0069\u0076\u0065\u006D\u00E1\u00E1\u006E\u0075", "\u006B\u0075\u006F\u0076\u00E2\u006D\u00E1\u00E1\u006E\u0075", "\u006E\u006A\u0075\u0068\u010D\u00E2\u006D\u00E1\u00E1\u006E\u0075", "\u0063\u0075\u00E1\u014B\u0075\u0069\u006D\u00E1\u00E1\u006E\u0075", "\u0076\u0079\u0065\u0073\u0069\u006D\u00E1\u00E1\u006E\u0075", "\u006B\u0065\u0073\u0069\u006D\u00E1\u00E1\u006E\u0075", "\u0073\u0079\u0065\u0069\u006E\u0069\u006D\u00E1\u00E1\u006E\u0075", "\u0070\u006F\u0072\u0067\u0065\u006D\u00E1\u00E1\u006E\u0075", "\u010D\u006F\u0068\u010D\u00E2\u006D\u00E1\u00E1\u006E\u0075", "\u0072\u006F\u006F\u0076\u0076\u00E2\u0064\u006D\u00E1\u00E1\u006E\u0075", "\u0073\u006B\u0061\u006D\u006D\u00E2\u006D\u00E1\u00E1\u006E\u0075", "\u006A\u0075\u006F\u0076\u006C\u00E2\u006D\u00E1\u00E1\u006E\u0075", "" ] }, +{ 0x0C6B, 0x007F, "quz-PE", "quz", "quz", "quz-PE", "\u0051\u0075\u0065\u0063\u0068\u0075\u0061\u0020\u0028\u0050\u0065\u0072\u0075\u0029", "\u0072\u0075\u006E\u0061\u0073\u0069\u006D\u0069\u0020\u0028\u0050\u0065\u0072\u0075\u0020\u0053\u0075\u0079\u0075\u0029", false, 0x00BB, "PE", "PE", "\u0050\u0065\u0072\u0075", "\u0050\u0065\u0072\u0075\u0020\u0053\u0075\u0079\u0075", "\u0050\u0045\u004E", "\u0050\u0065\u0072\u0075\u0076\u0069\u0061\u006E\u0020\u004E\u0075\u0065\u0076\u006F\u0020\u0053\u006F\u006C", "\u004E\u0075\u0065\u0076\u006F\u0020\u0053\u006F\u006C", true, 2, 1, 2, 12, 2, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002E", "\u002C", "\u0053\u002F\u002E", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0063\u0061\u006C\u0065\u006E\u0064\u0061\u0072\u0069\u006F\u0020\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u006F", 6, 0, "\u002F", "\u003A", "\u0061\u002E\u006D\u002E", "\u0070\u002E\u006D\u002E", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064", "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u0020\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u0069\u006E\u0074", "\u006B\u0069\u006C", "\u0061\u0074\u0069", "\u0071\u0075\u0079", "\u0043\u0068\u0092", "\u0049\u006C\u006C", "\u006B\u0027\u0075" ], [ "\u0069\u006E\u0074\u0069\u0063\u0068\u0061\u0077", "\u006B\u0069\u006C\u006C\u0061\u0063\u0068\u0061\u0077", "\u0061\u0074\u0069\u0070\u0061\u0063\u0068\u0061\u0077", "\u0071\u0075\u0079\u006C\u006C\u0075\u0072\u0063\u0068\u0061\u0077", "\u0043\u0068\u0027\u0020\u0061\u0073\u006B\u0061\u0063\u0068\u0061\u0077", "\u0049\u006C\u006C\u0061\u0070\u0061\u0063\u0068\u0061\u0077", "\u006B\u0027\u0075\u0079\u0063\u0068\u0069\u0063\u0068\u0061\u0077" ], [ "\u0051\u0075\u006C", "\u0048\u0061\u0074", "\u0050\u0061\u0075", "\u0061\u0079\u0072", "\u0041\u0079\u006D", "\u0049\u006E\u0074", "\u0041\u006E\u0074", "\u0051\u0068\u0061", "\u0055\u006D\u0061", "\u004B\u0061\u006E", "\u0041\u0079\u0061", "\u004B\u0061\u0070", "" ], [ "\u0051\u0075\u006C\u006C\u0061\u0020\u0070\u0075\u0071\u0075\u0079", "\u0048\u0061\u0074\u0075\u006E\u0020\u0070\u0075\u0071\u0075\u0079", "\u0050\u0061\u0075\u0071\u0061\u0072\u0020\u0077\u0061\u0072\u0061\u0079", "\u0061\u0079\u0072\u0069\u0077\u0061", "\u0041\u0079\u006D\u0075\u0072\u0061\u0079", "\u0049\u006E\u0074\u0069\u0020\u0072\u0061\u0079\u006D\u0069", "\u0041\u006E\u0074\u0061\u0020\u0053\u0069\u0074\u0077\u0061", "\u0051\u0068\u0061\u0070\u0061\u0071\u0020\u0053\u0069\u0074\u0077\u0061", "\u0055\u006D\u0061\u0020\u0072\u0061\u0079\u006D\u0069", "\u004B\u0061\u006E\u0074\u0061\u0072\u0061\u0079", "\u0041\u0079\u0061\u006D\u0061\u0072\u0071\u0027\u0061", "\u004B\u0061\u0070\u0061\u0071\u0020\u0052\u0061\u0079\u006D\u0069", "" ] }, +{ 0x0C3B, 0x007F, "se-FI", "se", "se", "se-FI", "\u0053\u0061\u006D\u0069\u0020\u0028\u004E\u006F\u0072\u0074\u0068\u0065\u0072\u006E\u0029\u0020\u0028\u0046\u0069\u006E\u006C\u0061\u006E\u0064\u0029", "\u0064\u0061\u0076\u0076\u0069\u0073\u00E1\u006D\u0065\u0067\u0069\u0065\u006C\u006C\u0061\u0020\u0028\u0053\u0075\u006F\u0070\u006D\u0061\u0029", false, 0x004D, "FI", "FI", "\u0046\u0069\u006E\u006C\u0061\u006E\u0064", "\u0053\u0075\u006F\u0070\u006D\u0061", "\u0045\u0055\u0052", "\u0045\u0075\u0072\u006F", "\u0065\u0075\u0072\u006F", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002C", "\u00A0", "\u20AC", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u0061\u006E\u0069\u006E\u0065\u006E\u0020\u006B\u0061\u006C\u0065\u006E\u0074\u0065\u0072\u0069", 0, 2, "\u002E", "\u003A", "", "", "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u004D\u004D\u004D\u004D\u0020\u0064\'\u002E\u0020\u0062\u002E\u0020\'\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D" ], [ "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D" ], [ "\u004D\u004D\u004D\u004D\u0020\u0064\'\u002E\u0020\u0062\u002E\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0073\u006F\u0074\u006E", "\u0076\u0075\u006F\u0073", "\u006D\u0061\u014B", "\u0067\u0061\u0073\u006B", "\u0064\u0075\u006F\u0072", "\u0062\u0065\u0061\u0072", "\u006C\u00E1\u0076" ], [ "\u0073\u006F\u0074\u006E\u0061\u0062\u0065\u0061\u0069\u0076\u0069", "\u0076\u0075\u006F\u0073\u0073\u00E1\u0072\u0067\u0061", "\u006D\u0061\u014B\u014B\u0065\u0062\u00E1\u0072\u0067\u0061", "\u0067\u0061\u0073\u006B\u0061\u0076\u0061\u0068\u006B\u006B\u0075", "\u0064\u0075\u006F\u0072\u0061\u0073\u0074\u0061\u0074", "\u0062\u0065\u0061\u0072\u006A\u0061\u0064\u0061\u0074", "\u006C\u00E1\u0076\u0076\u0061\u0072\u0064\u0061\u0074" ], [ "\u006F\u0111\u0111\u006A", "\u0067\u0075\u006F\u0076", "\u006E\u006A\u0075\u006B", "\u0063\u0075\u006F", "\u006D\u0069\u0065\u0073", "\u0067\u0065\u0061\u0073", "\u0073\u0075\u006F\u0069", "\u0062\u006F\u0072\u0067", "\u010D\u0061\u006B\u010D", "\u0067\u006F\u006C\u0067", "\u0073\u006B\u00E1\u0062", "\u006A\u0075\u006F\u0076", "" ], [ "\u006F\u0111\u0111\u0061\u006A\u0061\u0067\u0065\u006D\u00E1\u006E\u006E\u0075", "\u0067\u0075\u006F\u0076\u0076\u0061\u006D\u00E1\u006E\u006E\u0075", "\u006E\u006A\u0075\u006B\u010D\u0061\u006D\u00E1\u006E\u006E\u0075", "\u0063\u0075\u006F\u014B\u006F\u006D\u00E1\u006E\u006E\u0075", "\u006D\u0069\u0065\u0073\u0073\u0065\u006D\u00E1\u006E\u006E\u0075", "\u0067\u0065\u0061\u0073\u0073\u0065\u006D\u00E1\u006E\u006E\u0075", "\u0073\u0075\u006F\u0069\u0064\u006E\u0065\u006D\u00E1\u006E\u006E\u0075", "\u0062\u006F\u0072\u0067\u0065\u006D\u00E1\u006E\u006E\u0075", "\u010D\u0061\u006B\u010D\u0061\u006D\u00E1\u006E\u006E\u0075", "\u0067\u006F\u006C\u0067\u0067\u006F\u0074\u006D\u00E1\u006E\u006E\u0075", "\u0073\u006B\u00E1\u0062\u006D\u0061\u006D\u00E1\u006E\u006E\u0075", "\u006A\u0075\u006F\u0076\u006C\u0061\u006D\u00E1\u006E\u006E\u0075", "" ] }, +{ 0x203B, 0x007F, "sms-FI", "sms", "sms", "sms-FI", "\u0053\u0061\u006D\u0069\u0020\u0028\u0053\u006B\u006F\u006C\u0074\u0029\u0020\u0028\u0046\u0069\u006E\u006C\u0061\u006E\u0064\u0029", "\u0073\u00E4\u00E4\u006D\u00B4\u01E9\u0069\u00F5\u006C\u006C\u0020\u0028\u004C\u00E4\u00E4\u00B4\u0064\u0064\u006A\u00E2\u006E\u006E\u0061\u006D\u0029", false, 0x004D, "FI", "FI", "\u0046\u0069\u006E\u006C\u0061\u006E\u0064", "\u004C\u00E4\u00E4\u00B4\u0064\u0064\u006A\u00E2\u006E\u006E\u0061\u006D", "\u0045\u0055\u0052", "\u0045\u0075\u0072\u006F", "\u0065\u0075\u0072\u006F", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002C", "\u00A0", "\u20AC", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u0061\u006E\u0069\u006E\u0065\u006E\u0020\u006B\u0061\u006C\u0065\u006E\u0074\u0065\u0072\u0069", 0, 2, "\u002E", "\u003A", "", "", "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u004D\u004D\u004D\u004D\u0020\u0064\'\u002E\u0020\u0070\u002E\u0020\'\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D" ], [ "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D" ], [ "\u004D\u004D\u004D\u004D\u0020\u0064\'\u002E\u0020\u0070\u002E\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0070\u00E2", "\u0076\u0075", "\u006D\u00E2", "\u0073\u0065", "\u006E\u0065", "\u0070\u0069", "\u0073\u0075" ], [ "\u0070\u00E2\u00B4\u0073\u0073\u0070\u0065\u0069\u00B4\u0076\u0076", "\u0076\u0075\u00F5\u0073\u0073\u0061\u0072\u0067\u0067", "\u006D\u00E2\u00E2\u0069\u0062\u0061\u0072\u0067\u0067", "\u0073\u0065\u00E4\u0072\u0061\u0064", "\u006E\u0065\u006C\u006C\u006A\u0064\u0070\u0065\u0069\u00B4\u0076\u0076", "\u0070\u0069\u00E2\u0074\u006E\u00E2\u0063", "\u0073\u0075\u0065\u00B4\u0076\u0065\u0074" ], [ "\u006F\u0111\u006A\u006D", "\u0074\u00E4\u00B4\u006C\u0076\u0076", "\u0070\u00E2\u007A\u006C", "\u006E\u006A\u0075\u0068", "\u0076\u0075\u0065", "\u01E9\u0069\u0065", "\u0073\u0075\u0065\u0069", "\u0070\u00E5\u00B4\u0072", "\u010D\u00F5\u0068", "\u006B\u00E5\u006C\u0067", "\u0073\u006B\u0061", "\u0072\u006F\u0073\u0074", "" ], [ "\u006F\u0111\u0111\u0065\u0065\u00B4\u006A\u006A\u006D\u00E4\u00E4\u006E", "\u0074\u00E4\u00B4\u006C\u0076\u0076\u006D\u00E4\u00E4\u006E", "\u0070\u00E2\u00B4\u007A\u007A\u006C\u00E2\u0161\u0074\u0074\u0061\u006D\u006D\u00E4\u00E4\u006E", "\u006E\u006A\u0075\u0068\u010D\u010D\u006D\u00E4\u00E4\u006E", "\u0076\u0075\u0065\u00B4\u0073\u0073\u006D\u00E4\u00E4\u006E", "\u01E9\u0069\u0065\u00B4\u0073\u0073\u006D\u00E4\u00E4\u006E", "\u0073\u0075\u0065\u0069\u00B4\u006E\u006E\u006D\u00E4\u00E4\u006E", "\u0070\u00E5\u00B4\u0072\u01E7\u01E7\u006D\u00E4\u00E4\u006E", "\u010D\u00F5\u0068\u010D\u010D\u006D\u00E4\u00E4\u006E", "\u006B\u00E5\u006C\u0067\u0067\u006D\u00E4\u00E4\u006E", "\u0073\u006B\u0061\u006D\u006D\u00B4\u006D\u00E4\u00E4\u006E", "\u0072\u006F\u0073\u0074\u0074\u006F\u0076\u006D\u00E4\u00E4\u006E", "" ] }, +{ 0x0452, 0x007F, "cy-GB", "cy", "cy", "cy-GB", "\u0057\u0065\u006C\u0073\u0068\u0020\u0028\u0055\u006E\u0069\u0074\u0065\u0064\u0020\u004B\u0069\u006E\u0067\u0064\u006F\u006D\u0029", "\u0043\u0079\u006D\u0072\u0061\u0065\u0067\u0020\u0028\u0079\u0020\u0044\u0065\u0079\u0072\u006E\u0061\u0073\u0020\u0055\u006E\u0065\u0064\u0069\u0067\u0029", false, 0x00F2, "GB", "GB", "\u0055\u006E\u0069\u0074\u0065\u0064\u0020\u004B\u0069\u006E\u0067\u0064\u006F\u006D", "\u0079\u0020\u0044\u0065\u0079\u0072\u006E\u0061\u0073\u0020\u0055\u006E\u0065\u0064\u0069\u0067", "\u0047\u0042\u0050", "\u0055\u004B\u0020\u0050\u006F\u0075\u006E\u0064\u0020\u0053\u0074\u0065\u0072\u006C\u0069\u006E\u0067", "\u0070\u0075\u006E\u0074", true, 2, 1, 2, 1, 0, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u00A3", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0063\u0061\u006C\u0065\u006E\u0064\u0072\u0020\u0047\u0072\u0065\u0067\u006F\u0072\u0069", 0, 0, "\u002F", "\u003A", "\u0061\u002E\u006D\u002E", "\u0070\u002E\u006D\u002E", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0053\u0075\u006C", "\u004C\u006C\u0075\u006E", "\u004D\u0061\u0077", "\u004D\u0065\u0072", "\u0049\u0061\u0075", "\u0047\u0077\u0065", "\u0053\u0061\u0064" ], [ "\u0044\u0079\u0064\u0064\u0020\u0053\u0075\u006C", "\u0044\u0079\u0064\u0064\u0020\u004C\u006C\u0075\u006E", "\u0044\u0079\u0064\u0064\u0020\u004D\u0061\u0077\u0072\u0074\u0068", "\u0044\u0079\u0064\u0064\u0020\u004D\u0065\u0072\u0063\u0068\u0065\u0072", "\u0044\u0079\u0064\u0064\u0020\u0049\u0061\u0075", "\u0044\u0079\u0064\u0064\u0020\u0047\u0077\u0065\u006E\u0065\u0072", "\u0044\u0079\u0064\u0064\u0020\u0053\u0061\u0064\u0077\u0072\u006E" ], [ "\u0049\u006F\u006E", "\u0043\u0068\u0077\u0065", "\u004D\u0061\u0077", "\u0045\u0062\u0072", "\u004D\u0061\u0069", "\u004D\u0065\u0068", "\u0047\u006F\u0072", "\u0041\u0077\u0073", "\u004D\u0065\u0064", "\u0048\u0079\u0064", "\u0054\u0061\u0063\u0068", "\u0052\u0068\u0061\u0067", "" ], [ "\u0049\u006F\u006E\u0061\u0077\u0072", "\u0043\u0068\u0077\u0065\u0066\u0072\u006F\u0072", "\u004D\u0061\u0077\u0072\u0074\u0068", "\u0045\u0062\u0072\u0069\u006C\u006C", "\u004D\u0061\u0069", "\u004D\u0065\u0068\u0065\u0066\u0069\u006E", "\u0047\u006F\u0072\u0066\u0066\u0065\u006E\u006E\u0061\u0066", "\u0041\u0077\u0073\u0074", "\u004D\u0065\u0064\u0069", "\u0048\u0079\u0064\u0072\u0065\u0066", "\u0054\u0061\u0063\u0068\u0077\u0065\u0064\u0064", "\u0052\u0068\u0061\u0067\u0066\u0079\u0072", "" ] }, +{ 0x141A, 0x007F, "bs-BA-Latn", "bs", "bs", "bs-Latn-BA", "\u0042\u006F\u0073\u006E\u0069\u0061\u006E\u0020\u0028\u0042\u006F\u0073\u006E\u0069\u0061\u0020\u0061\u006E\u0064\u0020\u0048\u0065\u0072\u007A\u0065\u0067\u006F\u0076\u0069\u006E\u0061\u0029", "\u0062\u006F\u0073\u0061\u006E\u0073\u006B\u0069\u0020\u0028\u0042\u006F\u0073\u006E\u0061\u0020\u0069\u0020\u0048\u0065\u0072\u0063\u0065\u0067\u006F\u0076\u0069\u006E\u0061\u0029", false, 0x0019, "BA", "BA", "\u0042\u006F\u0073\u006E\u0069\u0061\u0020\u0061\u006E\u0064\u0020\u0048\u0065\u0072\u007A\u0065\u0067\u006F\u0076\u0069\u006E\u0061", "\u0042\u006F\u0073\u006E\u0061\u0020\u0069\u0020\u0048\u0065\u0072\u0063\u0065\u0067\u006F\u0076\u0069\u006E\u0061", "\u0042\u0041\u004D", "\u0043\u006F\u006E\u0076\u0065\u0072\u0074\u0069\u0062\u006C\u0065\u0020\u004D\u0061\u0072\u006B\u0073", "\u006B\u006F\u006E\u0076\u0065\u0072\u0074\u0069\u0062\u0069\u006C\u006E\u0061\u0020\u006D\u0061\u0072\u006B\u0061", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u004B\u004D", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u006A\u0061\u006E\u0073\u006B\u0069\u0020\u006B\u0061\u006C\u0065\u006E\u0064\u0061\u0072", 0, 0, "\u002E", "\u003A", "", "", "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0064\u002E\u0020\u004D\u002E\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u002E\u0020\u004D\u002E\u0020\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u0064\u002E\u0020\u004D\u004D\u002E\u0020\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u006E\u0065\u0064", "\u0070\u006F\u006E", "\u0075\u0074\u006F", "\u0073\u0072\u0069", "\u010D\u0065\u0074", "\u0070\u0065\u0074", "\u0073\u0075\u0062" ], [ "\u006E\u0065\u0064\u006A\u0065\u006C\u006A\u0061", "\u0070\u006F\u006E\u0065\u0064\u006A\u0065\u006C\u006A\u0061\u006B", "\u0075\u0074\u006F\u0072\u0061\u006B", "\u0073\u0072\u0069\u006A\u0065\u0064\u0061", "\u010D\u0065\u0074\u0076\u0072\u0074\u0061\u006B", "\u0070\u0065\u0074\u0061\u006B", "\u0073\u0075\u0062\u006F\u0074\u0061" ], [ "\u006A\u0061\u006E", "\u0066\u0065\u0062", "\u006D\u0061\u0072", "\u0061\u0070\u0072", "\u006D\u0061\u006A", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0076\u0067", "\u0073\u0065\u0070", "\u006F\u006B\u0074", "\u006E\u006F\u0076", "\u0064\u0065\u0063", "" ], [ "\u006A\u0061\u006E\u0075\u0061\u0072", "\u0066\u0065\u0062\u0072\u0075\u0061\u0072", "\u006D\u0061\u0072\u0074", "\u0061\u0070\u0072\u0069\u006C", "\u006D\u0061\u006A", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0076\u0067\u0075\u0073\u0074", "\u0073\u0065\u0070\u0074\u0065\u006D\u0062\u0061\u0072", "\u006F\u006B\u0074\u006F\u0062\u0061\u0072", "\u006E\u006F\u0076\u0065\u006D\u0062\u0061\u0072", "\u0064\u0065\u0063\u0065\u006D\u0062\u0061\u0072", "" ] }, +{ 0x103B, 0x007F, "smj-NO", "smj", "smj", "smj-NO", "\u0053\u0061\u006D\u0069\u0020\u0028\u004C\u0075\u006C\u0065\u0029\u0020\u0028\u004E\u006F\u0072\u0077\u0061\u0079\u0029", "\u006A\u0075\u006C\u0065\u0076\u0075\u0073\u00E1\u006D\u0065\u0067\u0069\u0065\u006C\u006C\u0061\u0020\u0028\u0056\u0075\u006F\u0064\u006E\u0061\u0029", false, 0x00B1, "NO", "NO", "\u004E\u006F\u0072\u0077\u0061\u0079", "\u0056\u0075\u006F\u0064\u006E\u0061", "\u004E\u004F\u004B", "\u004E\u006F\u0072\u0077\u0065\u0067\u0069\u0061\u006E\u0020\u004B\u0072\u006F\u006E\u0065", "\u006B\u0072\u00E5\u0076\u006E\u006E\u00E5", true, 2, 1, 2, 12, 2, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002C", "\u00A0", "\u006B\u0072", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0073\u006B\u0020\u006B\u0061\u006C\u0065\u006E\u0064\u0065\u0072", 0, 2, "\u002E", "\u003A", "", "", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u004D\u004D\u004D\u004D\u0020\u0064\'\u002E\u0020\u0062\u002E\u0020\'\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u002E\u006D\u006D", "\u0048\u0048\u002E\u006D\u006D\u002E\u0073\u0073" ], [ "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u002E\u006D\u006D", "\u0048\u0048\u002E\u006D\u006D\u002E\u0073\u0073" ], [ "\u004D\u004D\u004D\u004D\u0020\u0064\'\u002E\u0020\u0062\u002E\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0073\u00E5\u0064", "\u006D\u00E1\u006E", "\u0064\u0069\u0073", "\u0067\u0061\u0073", "\u0064\u0075\u006F\u0072", "\u0062\u0069\u0065\u0072", "\u006C\u00E1\u0076" ], [ "\u0073\u00E5\u0064\u006E\u00E5\u0062\u0069\u0065\u006A\u0076\u0076\u0065", "\u006D\u00E1\u006E\u006E\u006F\u0064\u0061\u0068\u006B\u0061", "\u0064\u0069\u006A\u0073\u0074\u0061\u0068\u006B\u0061", "\u0067\u0061\u0073\u0073\u006B\u0061\u0076\u0061\u0068\u006B\u006B\u006F", "\u0064\u0075\u006F\u0072\u0061\u0073\u0074\u0061\u0068\u006B\u0061", "\u0062\u0069\u0065\u0072\u006A\u006A\u0065\u0064\u0061\u0068\u006B\u0061", "\u006C\u00E1\u0076\u0076\u006F\u0064\u0061\u0068\u006B\u0061" ], [ "\u00E5\u0064\u00E5\u006A", "\u0067\u0075\u006F\u0076", "\u0073\u006E\u006A\u0075", "\u0076\u0075\u006F\u0072", "\u006D\u006F\u0061\u0072", "\u0062\u0069\u0065\u0068", "\u0073\u006E\u006A\u0069", "\u0062\u00E5\u0072\u0067", "\u0072\u0061\u0067\u00E1", "\u0067\u00E5\u006C\u0067", "\u0062\u0061\u0073\u00E1", "\u006A\u0061\u0076\u006C", "" ], [ "\u00E5\u0064\u00E5\u006A\u0061\u006B\u006D\u00E1\u006E\u006E\u006F", "\u0067\u0075\u006F\u0076\u0076\u0061\u006D\u00E1\u006E\u006E\u006F", "\u0073\u006A\u006E\u006A\u0075\u006B\u0074\u006A\u0061\u006D\u00E1\u006E\u006E\u006F", "\u0076\u0075\u006F\u0072\u0061\u0074\u006A\u0069\u0073\u006D\u00E1\u006E\u006E\u006F", "\u006D\u006F\u0061\u0072\u006D\u0065\u0073\u006D\u00E1\u006E\u006E\u006F", "\u0062\u0069\u0065\u0068\u0074\u0073\u0065\u006D\u00E1\u006E\u006E\u006F", "\u0073\u006A\u006E\u006A\u0069\u006C\u006C\u0074\u006A\u0061\u006D\u00E1\u006E\u006E\u006F", "\u0062\u00E5\u0072\u0067\u0067\u0065\u006D\u00E1\u006E\u006E\u006F", "\u0072\u0061\u0067\u00E1\u0074\u006D\u00E1\u006E\u006E\u006F", "\u0067\u00E5\u006C\u0067\u00E5\u0064\u0069\u0073\u006D\u00E1\u006E\u006E\u006F", "\u0062\u0061\u0073\u00E1\u0064\u0069\u0073\u006D\u00E1\u006E\u006E\u006F", "\u006A\u0061\u0076\u006C\u006C\u0061\u006D\u00E1\u006E\u006E\u006F", "" ] }, +{ 0x0481, 0x007F, "mi-NZ", "mi", "mi", "mi-NZ", "\u004D\u0061\u006F\u0072\u0069\u0020\u0028\u004E\u0065\u0077\u0020\u005A\u0065\u0061\u006C\u0061\u006E\u0064\u0029", "\u0052\u0065\u006F\u0020\u004D\u0101\u006F\u0072\u0069\u0020\u0028\u0041\u006F\u0074\u0065\u0061\u0072\u006F\u0061\u0029", false, 0x00B7, "NZ", "NZ", "\u004E\u0065\u0077\u0020\u005A\u0065\u0061\u006C\u0061\u006E\u0064", "\u0041\u006F\u0074\u0065\u0061\u0072\u006F\u0061", "\u004E\u005A\u0044", "\u004E\u0065\u0077\u0020\u005A\u0065\u0061\u006C\u0061\u006E\u0064\u0020\u0044\u006F\u006C\u006C\u0061\u0072", "\u0074\u0101\u0072\u0061", true, 2, 1, 2, 1, 0, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0024", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0047\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0020\u0043\u0061\u006C\u0065\u006E\u0064\u0061\u0072", 0, 0, "\u002F", "\u003A", "\u0061\u002E\u006D\u002E", "\u0070\u002E\u006D\u002E", "\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0054\u0061", "\u004D\u0061", "\u0054\u016B", "\u0057\u0065", "\u0054\u0101\u0069", "\u0050\u0061", "\u0048\u0101" ], [ "\u0052\u0101\u0074\u0061\u0070\u0075", "\u004D\u0061\u006E\u0065", "\u0054\u016B\u0072\u0065\u0069", "\u0057\u0065\u006E\u0065\u0072\u0065\u0069", "\u0054\u0101\u0069\u0074\u0065", "\u0050\u0061\u0072\u0061\u0069\u0072\u0065", "\u0048\u0101\u0074\u0061\u0072\u0065\u0069" ], [ "\u004B\u006F\u0068\u0069", "\u0048\u0075\u0069", "\u0050\u006F\u0075", "\u0050\u0061\u0065", "\u0048\u0061\u0072\u0061", "\u0050\u0069\u0070\u0069", "\u0048\u014D\u006E\u0067\u006F\u0069", "\u0048\u0065\u0072\u0065", "\u004D\u0061\u0068\u0075", "\u0057\u0068\u0069\u002D\u006E\u0075", "\u0057\u0068\u0069\u002D\u0072\u0061", "\u0048\u0061\u006B\u0069", "" ], [ "\u004B\u006F\u0068\u0069\u002D\u0074\u0101\u0074\u0065\u0061", "\u0048\u0075\u0069\u002D\u0074\u0061\u006E\u0067\u0075\u0072\u0075", "\u0050\u006F\u0075\u0074\u016B\u002D\u0074\u0065\u002D\u0072\u0061\u006E\u0067\u0069", "\u0050\u0061\u0065\u006E\u0067\u0061\u002D\u0077\u0068\u0101\u0077\u0068\u0101", "\u0048\u0061\u0072\u0061\u0074\u0075\u0061", "\u0050\u0069\u0070\u0069\u0072\u0069", "\u0048\u014D\u006E\u0067\u006F\u0069\u006E\u0067\u006F\u0069", "\u0048\u0065\u0072\u0065\u002D\u0074\u0075\u0072\u0069\u002D\u006B\u014D\u006B\u0101", "\u004D\u0061\u0068\u0075\u0072\u0075", "\u0057\u0068\u0069\u0072\u0069\u006E\u0067\u0061\u002D\u0101\u002D\u006E\u0075\u006B\u0075", "\u0057\u0068\u0069\u0072\u0069\u006E\u0067\u0061\u002D\u0101\u002D\u0072\u0061\u006E\u0067\u0069", "\u0048\u0061\u006B\u0069\u0068\u0065\u0061", "" ] }, +{ 0x086B, 0x007F, "quz-EC", "quz", "quz", "quz-EC", "\u0051\u0075\u0065\u0063\u0068\u0075\u0061\u0020\u0028\u0045\u0063\u0075\u0061\u0064\u006F\u0072\u0029", "\u0072\u0075\u006E\u0061\u0073\u0069\u006D\u0069\u0020\u0028\u0045\u0063\u0075\u0061\u0064\u006F\u0072\u0020\u0053\u0075\u0079\u0075\u0029", false, 0x0042, "EC", "EC", "\u0045\u0063\u0075\u0061\u0064\u006F\u0072", "\u0045\u0063\u0075\u0061\u0064\u006F\u0072\u0020\u0053\u0075\u0079\u0075", "\u0055\u0053\u0044", "\u0055\u0053\u0020\u0044\u006F\u006C\u006C\u0061\u0072", "\u0055\u0053\u0020\u0044\u006F\u006C\u0061\u0072", true, 2, 1, 2, 14, 2, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u0024", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0063\u0061\u006C\u0065\u006E\u0064\u0061\u0072\u0069\u006F\u0020\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u006F", 6, 0, "\u002F", "\u003A", "", "", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064", "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u0020\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u0069\u006E\u0074", "\u006B\u0069\u006C", "\u0061\u0074\u0069", "\u0071\u0075\u0079", "\u0043\u0068\u0092", "\u0049\u006C\u006C", "\u006B\u0027\u0075" ], [ "\u0069\u006E\u0074\u0069\u0063\u0068\u0061\u0077", "\u006B\u0069\u006C\u006C\u0061\u0063\u0068\u0061\u0077", "\u0061\u0074\u0069\u0070\u0061\u0063\u0068\u0061\u0077", "\u0071\u0075\u0079\u006C\u006C\u0075\u0072\u0063\u0068\u0061\u0077", "\u0043\u0068\u0027\u0020\u0061\u0073\u006B\u0061\u0063\u0068\u0061\u0077", "\u0049\u006C\u006C\u0061\u0070\u0061\u0063\u0068\u0061\u0077", "\u006B\u0027\u0075\u0079\u0063\u0068\u0069\u0063\u0068\u0061\u0077" ], [ "\u0051\u0075\u006C", "\u0048\u0061\u0074", "\u0050\u0061\u0075", "\u0061\u0079\u0072", "\u0041\u0079\u006D", "\u0049\u006E\u0074", "\u0041\u006E\u0074", "\u0051\u0068\u0061", "\u0055\u006D\u0061", "\u004B\u0061\u006E", "\u0041\u0079\u0061", "\u004B\u0061\u0070", "" ], [ "\u0051\u0075\u006C\u006C\u0061\u0020\u0070\u0075\u0071\u0075\u0079", "\u0048\u0061\u0074\u0075\u006E\u0020\u0070\u0075\u0071\u0075\u0079", "\u0050\u0061\u0075\u0071\u0061\u0072\u0020\u0077\u0061\u0072\u0061\u0079", "\u0061\u0079\u0072\u0069\u0077\u0061", "\u0041\u0079\u006D\u0075\u0072\u0061\u0079", "\u0049\u006E\u0074\u0069\u0020\u0072\u0061\u0079\u006D\u0069", "\u0041\u006E\u0074\u0061\u0020\u0053\u0069\u0074\u0077\u0061", "\u0051\u0068\u0061\u0070\u0061\u0071\u0020\u0053\u0069\u0074\u0077\u0061", "\u0055\u006D\u0061\u0020\u0072\u0061\u0079\u006D\u0069", "\u004B\u0061\u006E\u0074\u0061\u0072\u0061\u0079", "\u0041\u0079\u0061\u006D\u0061\u0072\u0071\u0027\u0061", "\u004B\u0061\u0070\u0061\u0071\u0020\u0052\u0061\u0079\u006D\u0069", "" ] }, +{ 0x181A, 0x007F, "sr-BA-Latn", "sr", "sr", "sr-Latn-BA", "\u0053\u0065\u0072\u0062\u0069\u0061\u006E\u0020\u0028\u004C\u0061\u0074\u0069\u006E\u0029\u0020\u0028\u0042\u006F\u0073\u006E\u0069\u0061\u0020\u0061\u006E\u0064\u0020\u0048\u0065\u0072\u007A\u0065\u0067\u006F\u0076\u0069\u006E\u0061\u0029", "\u0073\u0072\u0070\u0073\u006B\u0069\u0020\u0028\u0042\u006F\u0073\u006E\u0061\u0020\u0069\u0020\u0048\u0065\u0072\u0063\u0065\u0067\u006F\u0076\u0069\u006E\u0061\u0029", false, 0x0019, "BA", "BA", "\u0042\u006F\u0073\u006E\u0069\u0061\u0020\u0061\u006E\u0064\u0020\u0048\u0065\u0072\u007A\u0065\u0067\u006F\u0076\u0069\u006E\u0061", "\u0042\u006F\u0073\u006E\u0061\u0020\u0069\u0020\u0048\u0065\u0072\u0063\u0065\u0067\u006F\u0076\u0069\u006E\u0061", "\u0042\u0041\u004D", "\u0043\u006F\u006E\u0076\u0065\u0072\u0074\u0069\u0062\u006C\u0065\u0020\u004D\u0061\u0072\u006B\u0073", "\u006B\u006F\u006E\u0076\u0065\u0072\u0074\u0069\u0062\u0069\u006C\u006E\u0061\u0020\u006D\u0061\u0072\u006B\u0061", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u004B\u004D", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u006A\u0061\u006E\u0073\u006B\u0069\u0020\u006B\u0061\u006C\u0065\u006E\u0064\u0061\u0072", 0, 0, "\u002E", "\u003A", "", "", "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u002E\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0064\u002E\u0020\u004D\u002E\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u002E\u0020\u004D\u002E\u0020\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u0064\u002E\u0020\u004D\u004D\u002E\u0020\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u002E\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u006E\u0065\u0064", "\u0070\u006F\u006E", "\u0075\u0074\u006F", "\u0073\u0072\u0065", "\u010D\u0065\u0074", "\u0070\u0065\u0074", "\u0073\u0075\u0062" ], [ "\u006E\u0065\u0064\u0065\u006C\u006A\u0061", "\u0070\u006F\u006E\u0065\u0064\u0065\u006C\u006A\u0061\u006B", "\u0075\u0074\u006F\u0072\u0061\u006B", "\u0073\u0072\u0065\u0064\u0061", "\u010D\u0065\u0074\u0076\u0072\u0074\u0061\u006B", "\u0070\u0065\u0074\u0061\u006B", "\u0073\u0075\u0062\u006F\u0074\u0061" ], [ "\u006A\u0061\u006E", "\u0066\u0065\u0062", "\u006D\u0061\u0072", "\u0061\u0070\u0072", "\u006D\u0061\u006A", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0076\u0067", "\u0073\u0065\u0070", "\u006F\u006B\u0074", "\u006E\u006F\u0076", "\u0064\u0065\u0063", "" ], [ "\u006A\u0061\u006E\u0075\u0061\u0072", "\u0066\u0065\u0062\u0072\u0075\u0061\u0072", "\u006D\u0061\u0072\u0074", "\u0061\u0070\u0072\u0069\u006C", "\u006D\u0061\u006A", "\u006A\u0075\u006E", "\u006A\u0075\u006C", "\u0061\u0076\u0067\u0075\u0073\u0074", "\u0073\u0065\u0070\u0074\u0065\u006D\u0062\u0061\u0072", "\u006F\u006B\u0074\u006F\u0062\u0061\u0072", "\u006E\u006F\u0076\u0065\u006D\u0062\u0061\u0072", "\u0064\u0065\u0063\u0065\u006D\u0062\u0061\u0072", "" ] }, +{ 0x143B, 0x007F, "smj-SE", "smj", "smj", "smj-SE", "\u0053\u0061\u006D\u0069\u0020\u0028\u004C\u0075\u006C\u0065\u0029\u0020\u0028\u0053\u0077\u0065\u0064\u0065\u006E\u0029", "\u006A\u0075\u006C\u0065\u0076\u0075\u0073\u00E1\u006D\u0065\u0067\u0069\u0065\u006C\u006C\u0061\u0020\u0028\u0053\u0076\u0069\u0065\u0072\u0069\u006B\u0029", false, 0x00DD, "SE", "SE", "\u0053\u0077\u0065\u0064\u0065\u006E", "\u0053\u0076\u0069\u0065\u0072\u0069\u006B", "\u0053\u0045\u004B", "\u0053\u0077\u0065\u0064\u0069\u0073\u0068\u0020\u004B\u0072\u006F\u006E\u0061", "\u006B\u0072\u00E5\u0076\u006E\u006E\u00E5", true, 2, 1, 2, 8, 3, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002C", "\u002E", "\u006B\u0072", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0073\u006B\u0020\u006B\u0061\u006C\u0065\u006E\u0064\u0065\u0072", 0, 2, "\u002D", "\u003A", "", "", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u004D\u004D\u004D\u004D\u0020\u0064\'\u002E\u0020\u0062\u002E\u0020\'\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D" ], [ "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D" ], [ "\u004D\u004D\u004D\u004D\u0020\u0064\'\u002E\u0020\u0062\u002E\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u00E1\u006A\u006C", "\u006D\u00E1\u006E", "\u0064\u0069\u0073", "\u0067\u0061\u0073", "\u0064\u0075\u006F\u0072", "\u0062\u0069\u0065\u0072", "\u006C\u00E1\u0076" ], [ "\u00E1\u006A\u006C\u006C\u0065\u006B", "\u006D\u00E1\u006E\u006E\u006F\u0064\u0061\u0068\u006B\u0061", "\u0064\u0069\u006A\u0073\u0074\u0061\u0068\u006B\u0061", "\u0067\u0061\u0073\u0073\u006B\u0061\u0076\u0061\u0068\u006B\u006B\u006F", "\u0064\u0075\u006F\u0072\u0061\u0073\u0074\u0061\u0068\u006B\u0061", "\u0062\u0069\u0065\u0072\u006A\u006A\u0065\u0064\u0061\u0068\u006B\u0061", "\u006C\u00E1\u0076\u0076\u006F\u0064\u0061\u0068\u006B\u0061" ], [ "\u00E5\u0064\u00E5\u006A", "\u0067\u0075\u006F\u0076", "\u0073\u006E\u006A\u0075", "\u0076\u0075\u006F\u0072", "\u006D\u006F\u0061\u0072", "\u0062\u0069\u0065\u0068", "\u0073\u006E\u006A\u0069", "\u0062\u00E5\u0072\u0067", "\u0072\u0061\u0067\u00E1", "\u0067\u00E5\u006C\u0067", "\u0062\u0061\u0073\u00E1", "\u006A\u0061\u0076\u006C", "" ], [ "\u00E5\u0064\u00E5\u006A\u0061\u006B\u006D\u00E1\u006E\u006E\u006F", "\u0067\u0075\u006F\u0076\u0076\u0061\u006D\u00E1\u006E\u006E\u006F", "\u0073\u006A\u006E\u006A\u0075\u006B\u0074\u006A\u0061\u006D\u00E1\u006E\u006E\u006F", "\u0076\u0075\u006F\u0072\u0061\u0074\u006A\u0069\u0073\u006D\u00E1\u006E\u006E\u006F", "\u006D\u006F\u0061\u0072\u006D\u0065\u0073\u006D\u00E1\u006E\u006E\u006F", "\u0062\u0069\u0065\u0068\u0074\u0073\u0065\u006D\u00E1\u006E\u006E\u006F", "\u0073\u006A\u006E\u006A\u0069\u006C\u006C\u0074\u006A\u0061\u006D\u00E1\u006E\u006E\u006F", "\u0062\u00E5\u0072\u0067\u0067\u0065\u006D\u00E1\u006E\u006E\u006F", "\u0072\u0061\u0067\u00E1\u0074\u006D\u00E1\u006E\u006E\u006F", "\u0067\u00E5\u006C\u0067\u00E5\u0064\u0069\u0073\u006D\u00E1\u006E\u006E\u006F", "\u0062\u0061\u0073\u00E1\u0064\u0069\u0073\u006D\u00E1\u006E\u006E\u006F", "\u006A\u0061\u0076\u006C\u006C\u0061\u006D\u00E1\u006E\u006E\u006F", "" ] }, +{ 0x046C, 0x007F, "ns-ZA", "ns", "ns", "ns-ZA", "\u004E\u006F\u0072\u0074\u0068\u0065\u0072\u006E\u0020\u0053\u006F\u0074\u0068\u006F\u0020\u0028\u0053\u006F\u0075\u0074\u0068\u0020\u0041\u0066\u0072\u0069\u0063\u0061\u0029", "\u0053\u0065\u0073\u006F\u0074\u0068\u006F\u0020\u0073\u0061\u0020\u004C\u0065\u0062\u006F\u0061\u0020\u0028\u0041\u0066\u0072\u0069\u006B\u0061\u0020\u0042\u006F\u0072\u0077\u0061\u0029", false, 0x00D1, "ZA", "ZA", "\u0053\u006F\u0075\u0074\u0068\u0020\u0041\u0066\u0072\u0069\u0063\u0061", "\u0041\u0066\u0072\u0069\u006B\u0061\u0020\u0042\u006F\u0072\u0077\u0061", "\u005A\u0041\u0052", "\u0053\u006F\u0075\u0074\u0068\u0020\u0041\u0066\u0072\u0069\u0063\u0061\u006E\u0020\u0052\u0061\u006E\u0064", "\u0052\u0061\u006E\u0064", true, 2, 1, 2, 2, 2, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u0052", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0047\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0020\u0043\u0061\u006C\u0065\u006E\u0064\u0061\u0072", 6, 0, "\u002F", "\u003A", "\u0041\u004D", "\u0050\u004D", "\u0079\u0079\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0079\u0079\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0079\u0079\u002F\u004D\u004D\u002F\u0064\u0064", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0020\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0053\u0075\u006E", "\u004D\u006F\u006E", "\u0054\u0075\u0065", "\u0057\u0065\u0064", "\u0054\u0068\u0075", "\u0046\u0072\u0069", "\u0053\u0061\u0074" ], [ "\u004C\u0061\u006D\u006F\u0072\u0065\u006E\u0061", "\u004D\u006F\u0161\u0075\u0070\u006F\u006C\u006F\u0067\u006F", "\u004C\u0061\u0062\u006F\u0062\u0065\u0064\u0069", "\u004C\u0061\u0062\u006F\u0072\u0061\u0072\u006F", "\u004C\u0061\u0062\u006F\u006E\u0065", "\u004C\u0061\u0062\u006F\u0068\u006C\u0061\u006E\u006F", "\u004D\u006F\u006B\u0069\u0062\u0065\u006C\u006F" ], [ "\u004A\u0061\u006E", "\u0046\u0065\u0062", "\u004D\u0061\u0072", "\u0041\u0070\u0072", "\u004D\u0061\u0079", "\u004A\u0075\u006E", "\u004A\u0075\u006C", "\u0041\u0075\u0067", "\u0053\u0065\u0070", "\u004F\u0063\u0074", "\u004E\u006F\u0076", "\u0044\u0065\u0063", "" ], [ "\u0050\u0068\u0065\u0072\u0065\u006B\u0067\u006F\u006E\u0067", "\u0048\u006C\u0061\u006B\u006F\u006C\u0061", "\u004D\u006F\u0070\u0069\u0074\u006C\u006F", "\u004D\u006F\u0072\u0061\u006E\u0061\u006E\u0067", "\u004D\u006F\u0073\u0065\u0067\u0061\u006D\u0061\u006E\u0079\u0065", "\u004E\u0067\u006F\u0061\u0074\u006F\u0062\u006F\u0161\u0065\u0067\u006F", "\u0050\u0068\u0075\u0070\u0068\u0075", "\u0050\u0068\u0061\u0074\u006F", "\u004C\u0065\u0077\u0065\u0064\u0069", "\u0044\u0069\u0070\u0068\u0061\u006C\u0061\u006E\u0061", "\u0044\u0069\u0062\u0061\u0074\u0073\u0065\u006C\u0061", "\u004D\u0061\u006E\u0074\u0068\u006F\u006C\u0065", "" ] }, +{ 0x046B, 0x007F, "quz-BO", "quz", "quz", "quz-BO", "\u0051\u0075\u0065\u0063\u0068\u0075\u0061\u0020\u0028\u0042\u006F\u006C\u0069\u0076\u0069\u0061\u0029", "\u0072\u0075\u006E\u0061\u0073\u0069\u006D\u0069\u0020\u0028\u0042\u006F\u006C\u0069\u0076\u0069\u0061\u0020\u0053\u0075\u0079\u0075\u0029", false, 0x001A, "BO", "BO", "\u0042\u006F\u006C\u0069\u0076\u0069\u0061", "\u0042\u006F\u006C\u0069\u0076\u0069\u0061\u0020\u0053\u0075\u0079\u0075", "\u0042\u004F\u0042", "\u0042\u006F\u006C\u0069\u0076\u0069\u0061\u006E\u006F", "\u0042\u006F\u006C\u0069\u0076\u0069\u0061\u006E\u006F", true, 2, 1, 2, 14, 2, [ 3 ], [ 3 ], "\u002C", "\u002E", "\u002C", "\u002E", "\u0024\u0062", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0063\u0061\u006C\u0065\u006E\u0064\u0061\u0072\u0069\u006F\u0020\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u006F", 6, 0, "\u002F", "\u003A", "\u0061\u002E\u006D\u002E", "\u0070\u002E\u006D\u002E", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064", "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079", "\u0064\u0064\u002D\u004D\u004D\u002D\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\u0064\u0064\u0064\u0020\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079", "\u0064\'\u0020\u0064\u0065\u0020\'\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\'\u0020\u0064\u0065\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u0069\u006E\u0074", "\u006B\u0069\u006C", "\u0061\u0074\u0069", "\u0071\u0075\u0079", "\u0043\u0068\u0092", "\u0049\u006C\u006C", "\u006B\u0027\u0075" ], [ "\u0069\u006E\u0074\u0069\u0063\u0068\u0061\u0077", "\u006B\u0069\u006C\u006C\u0061\u0063\u0068\u0061\u0077", "\u0061\u0074\u0069\u0070\u0061\u0063\u0068\u0061\u0077", "\u0071\u0075\u0079\u006C\u006C\u0075\u0072\u0063\u0068\u0061\u0077", "\u0043\u0068\u0027\u0020\u0061\u0073\u006B\u0061\u0063\u0068\u0061\u0077", "\u0049\u006C\u006C\u0061\u0070\u0061\u0063\u0068\u0061\u0077", "\u006B\u0027\u0075\u0079\u0063\u0068\u0069\u0063\u0068\u0061\u0077" ], [ "\u0051\u0075\u006C", "\u0048\u0061\u0074", "\u0050\u0061\u0075", "\u0061\u0079\u0072", "\u0041\u0079\u006D", "\u0049\u006E\u0074", "\u0041\u006E\u0074", "\u0051\u0068\u0061", "\u0055\u006D\u0061", "\u004B\u0061\u006E", "\u0041\u0079\u0061", "\u004B\u0061\u0070", "" ], [ "\u0051\u0075\u006C\u006C\u0061\u0020\u0070\u0075\u0071\u0075\u0079", "\u0048\u0061\u0074\u0075\u006E\u0020\u0070\u0075\u0071\u0075\u0079", "\u0050\u0061\u0075\u0071\u0061\u0072\u0020\u0077\u0061\u0072\u0061\u0079", "\u0061\u0079\u0072\u0069\u0077\u0061", "\u0041\u0079\u006D\u0075\u0072\u0061\u0079", "\u0049\u006E\u0074\u0069\u0020\u0072\u0061\u0079\u006D\u0069", "\u0041\u006E\u0074\u0061\u0020\u0053\u0069\u0074\u0077\u0061", "\u0051\u0068\u0061\u0070\u0061\u0071\u0020\u0053\u0069\u0074\u0077\u0061", "\u0055\u006D\u0061\u0020\u0072\u0061\u0079\u006D\u0069", "\u004B\u0061\u006E\u0074\u0061\u0072\u0061\u0079", "\u0041\u0079\u0061\u006D\u0061\u0072\u0071\u0027\u0061", "\u004B\u0061\u0070\u0061\u0071\u0020\u0052\u0061\u0079\u006D\u0069", "" ] }, +{ 0x043B, 0x007F, "se-NO", "se", "se", "se-NO", "\u0053\u0061\u006D\u0069\u0020\u0028\u004E\u006F\u0072\u0074\u0068\u0065\u0072\u006E\u0029\u0020\u0028\u004E\u006F\u0072\u0077\u0061\u0079\u0029", "\u0064\u0061\u0076\u0076\u0069\u0073\u00E1\u006D\u0065\u0067\u0069\u0065\u006C\u006C\u0061\u0020\u0028\u004E\u006F\u0072\u0067\u0061\u0029", false, 0x00B1, "NO", "NO", "\u004E\u006F\u0072\u0077\u0061\u0079", "\u004E\u006F\u0072\u0067\u0061", "\u004E\u004F\u004B", "\u004E\u006F\u0072\u0077\u0065\u0067\u0069\u0061\u006E\u0020\u004B\u0072\u006F\u006E\u0065", "\u006B\u0072\u0075\u0076\u0064\u006E\u006F", true, 2, 1, 2, 12, 2, [ 3 ], [ 3 ], "\u002C", "\u00A0", "\u002C", "\u00A0", "\u006B\u0072", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u0067\u0072\u0065\u0067\u006F\u0072\u0069\u0061\u006E\u0073\u006B\u0020\u006B\u0061\u006C\u0065\u006E\u0064\u0065\u0072", 0, 2, "\u002E", "\u003A", "", "", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u004D\u004D\u004D\u004D\u0020\u0064\'\u002E\u0020\u0062\u002E\u0020\'\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u002E\u006D\u006D", "\u0048\u0048\u002E\u006D\u006D\u002E\u0073\u0073" ], [ "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079\u0079\u0079", "\u0064\u0064\u002E\u004D\u004D\u002E\u0079\u0079", "\u0064\u002E\u004D\u002E\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0048\u0048\u002E\u006D\u006D", "\u0048\u0048\u002E\u006D\u006D\u002E\u0073\u0073" ], [ "\u004D\u004D\u004D\u004D\u0020\u0064\'\u002E\u0020\u0062\u002E\u0020\'\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0073\u006F\u0074\u006E", "\u0076\u0075\u006F\u0073", "\u006D\u0061\u014B", "\u0067\u0061\u0073\u006B", "\u0064\u0075\u006F\u0072", "\u0062\u0065\u0061\u0072", "\u006C\u00E1\u0076" ], [ "\u0073\u006F\u0074\u006E\u0061\u0062\u0065\u0061\u0069\u0076\u0069", "\u0076\u0075\u006F\u0073\u0073\u00E1\u0072\u0067\u0061", "\u006D\u0061\u014B\u014B\u0065\u0062\u00E1\u0072\u0067\u0061", "\u0067\u0061\u0073\u006B\u0061\u0076\u0061\u0068\u006B\u006B\u0075", "\u0064\u0075\u006F\u0072\u0061\u0073\u0074\u0061\u0074", "\u0062\u0065\u0061\u0072\u006A\u0061\u0064\u0061\u0074", "\u006C\u00E1\u0076\u0076\u0061\u0072\u0064\u0061\u0074" ], [ "\u006F\u0111\u0111\u006A", "\u0067\u0075\u006F\u0076", "\u006E\u006A\u0075\u006B", "\u0063\u0075\u006F", "\u006D\u0069\u0065\u0073", "\u0067\u0065\u0061\u0073", "\u0073\u0075\u006F\u0069", "\u0062\u006F\u0072\u0067", "\u010D\u0061\u006B\u010D", "\u0067\u006F\u006C\u0067", "\u0073\u006B\u00E1\u0062", "\u006A\u0075\u006F\u0076", "" ], [ "\u006F\u0111\u0111\u0061\u006A\u0061\u0067\u0065\u006D\u00E1\u006E\u006E\u0075", "\u0067\u0075\u006F\u0076\u0076\u0061\u006D\u00E1\u006E\u006E\u0075", "\u006E\u006A\u0075\u006B\u010D\u0061\u006D\u00E1\u006E\u006E\u0075", "\u0063\u0075\u006F\u014B\u006F\u006D\u00E1\u006E\u006E\u0075", "\u006D\u0069\u0065\u0073\u0073\u0065\u006D\u00E1\u006E\u006E\u0075", "\u0067\u0065\u0061\u0073\u0073\u0065\u006D\u00E1\u006E\u006E\u0075", "\u0073\u0075\u006F\u0069\u0064\u006E\u0065\u006D\u00E1\u006E\u006E\u0075", "\u0062\u006F\u0072\u0067\u0065\u006D\u00E1\u006E\u006E\u0075", "\u010D\u0061\u006B\u010D\u0061\u006D\u00E1\u006E\u006E\u0075", "\u0067\u006F\u006C\u0067\u0067\u006F\u0074\u006D\u00E1\u006E\u006E\u0075", "\u0073\u006B\u00E1\u0062\u006D\u0061\u006D\u00E1\u006E\u006E\u0075", "\u006A\u0075\u006F\u0076\u006C\u0061\u006D\u00E1\u006E\u006E\u0075", "" ] }, +{ 0x043A, 0x007F, "mt-MT", "mt", "mt", "mt-MT", "\u004D\u0061\u006C\u0074\u0065\u0073\u0065\u0020\u0028\u004D\u0061\u006C\u0074\u0061\u0029", "\u004D\u0061\u006C\u0074\u0069\u0020\u0028\u004D\u0061\u006C\u0074\u0061\u0029", false, 0x00A3, "MT", "MT", "\u004D\u0061\u006C\u0074\u0061", "\u004D\u0061\u006C\u0074\u0061", "\u004D\u0054\u004C", "\u004D\u0061\u006C\u0074\u0065\u0073\u0065\u0020\u004C\u0069\u0072\u0061", "\u004C\u0069\u0072\u0061\u0020\u004D\u0061\u006C\u0074\u0069\u006A\u0061", true, 2, 1, 2, 1, 0, [ 3 ], [ 3 ], "\u002E", "\u002C", "\u002E", "\u002C", "\u004C\u006D", "\u002D", "\u002B", "\u004E\u0061\u004E", "\u002D\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", "\u0049\u006E\u0066\u0069\u006E\u0069\u0074\u0079", [ "\u0030", "\u0031", "\u0032", "\u0033", "\u0034", "\u0035", "\u0036", "\u0037", "\u0038", "\u0039" ], 1, [ 1 ], "\u004B\u0061\u006C\u0065\u006E\u0064\u0061\u0072\u006A\u0075", 0, 0, "\u002F", "\u003A", "\u0041\u004D", "\u0050\u004D", "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\'\u0020\u0074\u0061\u005C\'\u0020\'\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u004D\u004D\u004D\u004D\u0020\u0064\u0064", "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074" ], [ "\u0064\u0064\u002F\u004D\u004D\u002F\u0079\u0079\u0079\u0079", "\u0079\u0079\u0079\u0079\u002D\u004D\u004D\u002D\u0064\u0064", "\u0064\u0064\u004D\u004D\u0079\u0079\u0079\u0079", "\u0064\u002D\u004D\u002D\u0079\u0079\u0079\u0079", "\u0064\u002F\u004D\u002F\u0079\u0079\u0079\u0079" ], [ "\u0048\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074", "\u0048\u003A\u006D\u006D\u003A\u0073\u0073", "\u0068\u0068\u003A\u006D\u006D\u003A\u0073\u0073\u0020\u0074\u0074" ], [ "\u0064\u0064\u0064\u0064\u002C\u0020\u0064\'\u0020\u0074\u0061\u005C\'\u0020\'\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\'\u0020\u0074\u0061\u005C\'\u0020\'\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079", "\u0064\u0064\u0020\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u004D\u004D\u004D\u004D\u0020\u0079\u0079\u0079\u0079" ], [ "\u0126\u0061\u0064", "\u0054\u006E\u0065", "\u0054\u006C\u0069", "\u0045\u0072\u0062", "\u0126\u0061\u006D", "\u0120\u0069\u006D", "\u0053\u0069\u0062" ], [ "\u0049\u006C\u002D\u0126\u0061\u0064\u0064", "\u0049\u0074\u002D\u0054\u006E\u0065\u006A\u006E", "\u0049\u0074\u002D\u0054\u006C\u0069\u0065\u0074\u0061", "\u004C\u002D\u0045\u0072\u0062\u0067\u0127\u0061", "\u0049\u006C\u002D\u0126\u0061\u006D\u0069\u0073", "\u0049\u006C\u002D\u0120\u0069\u006D\u0067\u0127\u0061", "\u0049\u0073\u002D\u0053\u0069\u0062\u0074" ], [ "\u004A\u0061\u006E", "\u0046\u0072\u0061", "\u004D\u0061\u0072", "\u0041\u0070\u0072", "\u004D\u0065\u006A", "\u0120\u0075\u006E", "\u004C\u0075\u006C", "\u0041\u0077\u0069", "\u0053\u0065\u0074", "\u004F\u0074\u0074", "\u004E\u006F\u0076", "\u0044\u0069\u010B", "" ], [ "\u004A\u0061\u006E\u006E\u0061\u0072", "\u0046\u0072\u0061\u0072", "\u004D\u0061\u0072\u007A\u0075", "\u0041\u0070\u0072\u0069\u006C", "\u004D\u0065\u006A\u006A\u0075", "\u0120\u0075\u006E\u006A\u0075", "\u004C\u0075\u006C\u006A\u0075", "\u0041\u0077\u0069\u0073\u0073\u0075", "\u0053\u0065\u0074\u0074\u0065\u006D\u0062\u0072\u0075", "\u004F\u0074\u0074\u0075\u0062\u0072\u0075", "\u004E\u006F\u0076\u0065\u006D\u0062\u0072\u0075", "\u0044\u0069\u010B\u0065\u006D\u0062\u0072\u0075", "" ] }, + ]; + + private static CultureData*[char[]] nameTable; + private static CultureData*[int] idTable; + private static CultureData*[char[]] regionNameTable; + + static ~this() { + nameTable = null; + idTable = null; + regionNameTable = null; + } + + package static CultureData* getDataFromCultureName(char[] name) { + if (CultureData** data = name in nameTable) + return *data; + + char[] actualName; + for (int i = 0; i < cultureDataTable.length; i++) { + if (compareString(name, cultureDataTable[i].name) == 0) { + nameTable[actualName = cultureDataTable[i].name] = &cultureDataTable[i]; + return nameTable[actualName]; + } + } + + error ("Culture name '" ~ name ~ "' is not supported."); + return null; + } + + package static CultureData* getDataFromCultureID(int lcid) { + if (CultureData** data = lcid in idTable) + return *data; + + for (int i = 0; i < cultureDataTable.length; i++) { + if (cultureDataTable[i].lcid == lcid) { + idTable[lcid] = &cultureDataTable[i]; + return idTable[lcid]; + } + } + + error ("Culture is not supported."); + return null; + } + + package static CultureData* getDataFromRegionName(inout char[] name) { + CultureData** data; + if ((data = name in regionNameTable) !is null) + return *data; + + for (int i = 0; i < cultureDataTable.length; i++) { + if (compareString(name, cultureDataTable[i].regionName) == 0) { + regionNameTable[name = cultureDataTable[i].regionName] = &cultureDataTable[i]; + return regionNameTable[name]; + } + } + + // We also accept a culture name. + if ((data = name in nameTable) !is null) + return *data; + + for (int i = 0; i < cultureDataTable.length; i++) { + if (compareString(name, cultureDataTable[i].name) == 0) { + nameTable[name = cultureDataTable[i].name] = &cultureDataTable[i]; + return nameTable[name]; + } + } + + error ("Region name '" ~ name ~ "' is not supported."); + return null; + } + + package static char[] getCultureNameFromIetfName(char[] name) { + for (int i = 0; i < cultureDataTable.length; i++) { + if (compareString(name, cultureDataTable[i].ietfTag) == 0) + return cultureDataTable[i].name; + } + return null; + } + +} \ No newline at end of file diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/text/locale/Locale.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/text/locale/Locale.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,127 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris. All rights reserved + + license: BSD style: $(LICENSE) + + version: Feb 2007: Initial release + + author: Kris + + This is the Tango I18N gateway, which extends the basic Layout + module with support for cuture- and region-specific formatting + of numerics, date, time, and currency. + + Use as a standalone formatter in the same manner as Layout, or + combine with other entities such as Stdout. To enable a French + Stdout, do the following: + --- + Stdout.layout = new Locale (Culture.getCulture ("fr-FR")); + --- + + Note that Stdout is a shared entity, so every usage of it will + be affected by the above example. For applications supporting + multiple regions create multiple Locale instances instead, and + cache them in an appropriate manner. + + In addition to region-specific currency, date and time, Locale + adds more sophisticated formatting option than Layout provides: + numeric digit placement using '#' formatting, for example, is + supported by Locale - along with placement of '$', '-', and '.' + regional-specifics. + + Locale is currently utf8 only. Support for both Utf16 and utf32 + may be enabled at a later time + +******************************************************************************/ + +module tango.text.locale.Locale; + +private import tango.text.locale.Core, + tango.text.locale.Convert; + +private import tango.time.Time; + +private import tango.text.convert.Layout; + +public import tango.text.locale.Core : Culture; + +/******************************************************************************* + + Locale-enabled wrapper around tango.text.convert.Layout + +*******************************************************************************/ + +public class Locale : Layout!(char) +{ + private DateTimeFormat dateFormat; + private NumberFormat numberFormat; + + /********************************************************************** + + **********************************************************************/ + + this (IFormatService formatService = null) + { + numberFormat = NumberFormat.getInstance (formatService); + dateFormat = DateTimeFormat.getInstance (formatService); + } + + /*********************************************************************** + + ***********************************************************************/ + + protected override char[] unknown (char[] output, char[] format, TypeInfo type, Arg p) + { + switch (type.classinfo.name[9]) + { + // Special case for Time. + case TypeCode.STRUCT: + if (type is typeid(Time)) + return formatDateTime (output, *cast(Time*) p, format, dateFormat); + + return type.toString; + + default: + break; + } + + return "{unhandled argument type: " ~ type.toString ~ '}'; + } + + /********************************************************************** + + **********************************************************************/ + + protected override char[] integer (char[] output, long v, char[] alt, char format='d') + { + return formatInteger (output, v, alt, numberFormat); + } + + /********************************************************************** + + **********************************************************************/ + + protected override char[] floater (char[] output, real v, char[] format) + { + return formatDouble (output, v, format, numberFormat); + } +} + + +/******************************************************************************* + +*******************************************************************************/ + +debug (Locale) +{ + import tango.io.Console; + import tango.time.WallClock; + + void main () + { + auto layout = new Locale (Culture.getCulture ("fr-FR")); + + Cout (layout ("{:D}", WallClock.now)) (); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/text/locale/Parse.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/text/locale/Parse.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,303 @@ +/******************************************************************************* + + copyright: Copyright (c) 2005 John Chapman. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: 2005 + + author: John Chapman + +******************************************************************************/ + +module tango.text.locale.Parse; + +private import tango.time.WallClock; + +private import tango.core.Exception; + +private import tango.text.locale.Core; + +private import tango.time.chrono.Calendar; + +private struct DateTimeParseResult { + + int year = -1; + int month = -1; + int day = -1; + int hour; + int minute; + int second; + double fraction; + int timeMark; + Calendar calendar; + TimeSpan timeZoneOffset; + Time parsedDate; + +} + +package Time parseTime(char[] s, DateTimeFormat dtf) { + DateTimeParseResult result; + if (!tryParseExactMultiple(s, dtf.getAllDateTimePatterns(), dtf, result)) + throw new IllegalArgumentException("String was not a valid Time."); + return result.parsedDate; +} + +package Time parseTimeExact(char[] s, char[] format, DateTimeFormat dtf) { + DateTimeParseResult result; + if (!tryParseExact(s, format, dtf, result)) + throw new IllegalArgumentException("String was not a valid Time."); + return result.parsedDate; +} + +package bool tryParseTime(char[] s, DateTimeFormat dtf, out Time result) { + result = Time.min; + DateTimeParseResult resultRecord; + if (!tryParseExactMultiple(s, dtf.getAllDateTimePatterns(), dtf, resultRecord)) + return false; + result = resultRecord.parsedDate; + return true; +} + +package bool tryParseTimeExact(char[] s, char[] format, DateTimeFormat dtf, out Time result) { + result = Time.min; + DateTimeParseResult resultRecord; + if (!tryParseExact(s, format, dtf, resultRecord)) + return false; + result = resultRecord.parsedDate; + return true; +} + +private bool tryParseExactMultiple(char[] s, char[][] formats, DateTimeFormat dtf, inout DateTimeParseResult result) { + foreach (char[] format; formats) { + if (tryParseExact(s, format, dtf, result)) + return true; + } + return false; +} + +private bool tryParseExact(char[] s, char[] pattern, DateTimeFormat dtf, inout DateTimeParseResult result) { + + bool doParse() { + + int parseDigits(char[] s, inout int pos, int max) { + int result = s[pos++] - '0'; + while (max > 1 && pos < s.length && s[pos] >= '0' && s[pos] <= '9') { + result = result * 10 + s[pos++] - '0'; + --max; + } + return result; + } + + bool parseOne(char[] s, inout int pos, char[] value) { + if (s[pos .. pos + value.length] != value) + return false; + pos += value.length; + return true; + } + + int parseMultiple(char[] s, inout int pos, char[][] values ...) { + int result = -1, max; + foreach (int i, char[] value; values) { + if (value.length == 0 || s.length - pos < value.length) + continue; + + if (s[pos .. pos + value.length] == value) { + if (result == 0 || value.length > max) { + result = i + 1; + max = value.length; + } + } + } + pos += max; + return result; + } + + TimeSpan parseTimeZoneOffset(char[] s, inout int pos) { + bool sign; + if (pos < s.length) { + if (s[pos] == '-') { + sign = true; + pos++; + } + else if (s[pos] == '+') + pos++; + } + int hour = parseDigits(s, pos, 2); + int minute; + if (pos < s.length && s[pos] == ':') { + pos++; + minute = parseDigits(s, pos, 2); + } + //Due to dmd bug, this doesn't compile + //TimeSpan result = TimeSpan.hours(hour) + TimeSpan.minutes(minute); + TimeSpan result = TimeSpan(TimeSpan.TicksPerHour * hour + TimeSpan.TicksPerMinute * minute); + if (sign) + result = -result; + return result; + } + + char[] stringOf(char c, int count = 1) { + char[] s = new char[count]; + s[0 .. count] = c; + return s; + } + + result.calendar = dtf.calendar; + result.year = result.month = result.day = -1; + result.hour = result.minute = result.second = 0; + result.fraction = 0.0; + + int pos, i, count; + char c; + + while (pos < pattern.length && i < s.length) { + c = pattern[pos++]; + + if (c == ' ') { + i++; + while (i < s.length && s[i] == ' ') + i++; + if (i >= s.length) + break; + continue; + } + + count = 1; + + switch (c) { + case 'd': case 'm': case 'M': case 'y': + case 'h': case 'H': case 's': + case 't': case 'z': + while (pos < pattern.length && pattern[pos] == c) { + pos++; + count++; + } + break; + case ':': + if (!parseOne(s, i, dtf.timeSeparator)) + return false; + continue; + case '/': + if (!parseOne(s, i, dtf.dateSeparator)) + return false; + continue; + case '\\': + if (pos < pattern.length) { + c = pattern[pos++]; + if (s[i++] != c) + return false; + } + else + return false; + continue; + case '\'': + while (pos < pattern.length) { + c = pattern[pos++]; + if (c == '\'') + break; + if (s[i++] != c) + return false; + } + continue; + default: + if (s[i++] != c) + return false; + continue; + } + + switch (c) { + case 'd': // day + if (count == 1 || count == 2) + result.day = parseDigits(s, i, 2); + else if (count == 3) + result.day = parseMultiple(s, i, dtf.abbreviatedDayNames); + else + result.day = parseMultiple(s, i, dtf.dayNames); + if (result.day == -1) + return false; + break; + case 'M': // month + if (count == 1 || count == 2) + result.month = parseDigits(s, i, 2); + else if (count == 3) + result.month = parseMultiple(s, i, dtf.abbreviatedMonthNames); + else + result.month = parseMultiple(s, i, dtf.monthNames); + if (result.month == -1) + return false; + break; + case 'y': // year + if (count == 1 || count == 2) + result.year = parseDigits(s, i, 2); + else + result.year = parseDigits(s, i, 4); + if (result.year == -1) + return false; + break; + case 'h': // 12-hour clock + case 'H': // 24-hour clock + result.hour = parseDigits(s, i, 2); + break; + case 'm': // minute + result.minute = parseDigits(s, i, 2); + break; + case 's': // second + result.second = parseDigits(s, i, 2); + break; + case 't': // time mark + if (count == 1) + result.timeMark = parseMultiple(s, i, stringOf(dtf.amDesignator[0]), stringOf(dtf.pmDesignator[0])); + else + result.timeMark = parseMultiple(s, i, dtf.amDesignator, dtf.pmDesignator); + break; + case 'z': + result.timeZoneOffset = parseTimeZoneOffset(s, i); + break; + default: + break; + } + } + + if (pos < pattern.length || i < s.length) + return false; + + if (result.timeMark == 1) { // am + if (result.hour == 12) + result.hour = 0; + } + else if (result.timeMark == 2) { // pm + if (result.hour < 12) + result.hour += 12; + } + + // If the input string didn't specify a date part, try to return something meaningful. + if (result.year == -1 || result.month == -1 || result.day == -1) { + Time now = WallClock.now; + if (result.month == -1 && result.day == -1) { + if (result.year == -1) { + result.year = result.calendar.getYear(now); + result.month = result.calendar.getMonth(now); + result.day = result.calendar.getDayOfMonth(now); + } + else + result.month = result.day = 1; + } + else { + if (result.year == -1) + result.year = result.calendar.getYear(now); + if (result.month == -1) + result.month = 1; + if (result.day == -1) + result.day = 1; + } + } + return true; + } + + if (doParse()) { + result.parsedDate = result.calendar.toTime(result.year, result.month, result.day, result.hour, result.minute, result.second, 0); + return true; + } + return false; +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/text/locale/Posix.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/text/locale/Posix.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,154 @@ +/******************************************************************************* + + copyright: Copyright (c) 2005 John Chapman. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: 2005 + + author: John Chapman + +******************************************************************************/ + +module tango.text.locale.Posix; + +version (Posix) +{ +alias tango.text.locale.Posix nativeMethods; + +private import tango.core.Exception; +private import tango.text.locale.Data; +private import tango.stdc.ctype; +private import tango.stdc.posix.stdlib; +private import tango.stdc.string; +private import tango.stdc.time; +private import tango.stdc.locale; +private import tango.stdc.posix.time; + +/*private extern(C) char* setlocale(int type, char* locale); +private extern(C) void putenv(char*); + +private enum {LC_CTYPE, LC_NUMERIC, LC_TIME, LC_COLLATE, LC_MONETARY, LC_MESSAGES, LC_ALL, LC_PAPER, LC_NAME, LC_ADDRESS, LC_TELEPHONE, LC_MEASUREMENT, LC_IDENTIFICATION};*/ + +int getUserCulture() { + char* env = getenv("LC_ALL"); + if (!env || *env == '\0') { + env = getenv("LANG"); + if (!env || *env == '\0') + throw new LocaleException("Neither LANG nor LC_ALL were found to be set. Please set for locale formatting to function."); + } + + // getenv returns a string of the form _. + // Therefore we need to replace underscores with hyphens. + char* p = env; + int len; + while (*p) { + if (*p == '.'){ + break; + } + if (*p == '_'){ + *p = '-'; + } + p++; + len++; + } + + char[] s = env[0 .. len]; + foreach (entry; CultureData.cultureDataTable) { + // todo: there is also a local compareString defined. Is it correct that here + // we use tango.text.locale.Data, which matches the signature? + if (tango.text.locale.Data.compareString(entry.name, s) == 0) + // todo: here was entry.id returned, which does not exist. Is lcid correct? + return entry.lcid; + } + return 0; +} + +void setUserCulture(int lcid) { + char[] name; + try { + name = CultureData.getDataFromCultureID(lcid).name ~ ".utf-8"; + } + catch(Exception e) { + return; + } + + for(int i = 0; i < name.length; i++) { + if(name[i] == '.') break; + if(name[i] == '-') name[i] = '_'; + } + + putenv(("LANG=" ~ name).ptr); + setlocale(LC_CTYPE, name.ptr); + setlocale(LC_NUMERIC, name.ptr); + setlocale(LC_TIME, name.ptr); + setlocale(LC_COLLATE, name.ptr); + setlocale(LC_MONETARY, name.ptr); + + version (GNU) {} else { +/* setlocale(LC_MESSAGES, name.ptr); */ + } + + setlocale(LC_PAPER, name.ptr); + setlocale(LC_NAME, name.ptr); + setlocale(LC_ADDRESS, name.ptr); + setlocale(LC_TELEPHONE, name.ptr); + setlocale(LC_MEASUREMENT, name.ptr); + setlocale(LC_IDENTIFICATION, name.ptr); +} + +ulong getUtcTime() { + int t; + time(&t); + gmtime(&t); + return cast(ulong)((cast(long)t * 10000000L) + 116444736000000000L); +} + +int compareString(int lcid, char[] stringA, uint offsetA, uint lengthA, char[] stringB, uint offsetB, uint lengthB, bool ignoreCase) { + + void strToLower(char[] string) { + for(int i = 0; i < string.length; i++) { + string[i] = cast(char)(tolower(cast(int)string[i])); + } + } + + char* tempCol = setlocale(LC_COLLATE, null), tempCType = setlocale(LC_CTYPE, null); + char[] locale; + try { + locale = CultureData.getDataFromCultureID(lcid).name ~ ".utf-8"; + } + catch(Exception e) { + return 0; + } + + setlocale(LC_COLLATE, locale.ptr); + setlocale(LC_CTYPE, locale.ptr); + + char[] s1 = stringA[offsetA..offsetA+lengthA].dup, + s2 = stringB[offsetB..offsetB+lengthB].dup; + if(ignoreCase) { + strToLower(s1); + strToLower(s2); + } + + int ret = strcoll(s1[offsetA..offsetA+lengthA].ptr, s2[offsetB..offsetB+lengthB].ptr); + + setlocale(LC_COLLATE, tempCol); + setlocale(LC_CTYPE, tempCType); + + return ret; +} + +debug(UnitTest) +{ + unittest + { + int c = getUserCulture(); + assert(compareString(c, "Alphabet", 0, 8, "Alphabet", 0, 8, false) == 0); + assert(compareString(c, "Alphabet", 0, 8, "alphabet", 0, 8, true) == 0); + assert(compareString(c, "Alphabet", 0, 8, "alphabet", 0, 8, false) != 0); + assert(compareString(c, "lphabet", 0, 7, "alphabet", 0, 8, true) != 0); + assert(compareString(c, "Alphabet", 0, 8, "lphabet", 0, 7, true) != 0); + } +} +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/text/locale/Win32.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/text/locale/Win32.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,60 @@ +/******************************************************************************* + + copyright: Copyright (c) 2005 John Chapman. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: 2005 + + author: John Chapman + +******************************************************************************/ + +module tango.text.locale.Win32; + +alias tango.text.locale.Win32 nativeMethods; + +extern (Windows) +private { + void GetSystemTimeAsFileTime(out ulong lpSystemTimeAsFileTime); + uint GetUserDefaultLCID(); + uint GetThreadLocale(); + bool SetThreadLocale(uint Locale); + int MultiByteToWideChar(uint CodePage, uint dwFlags, char* lpMultiByteStr, int cbMultiByte, wchar* lpWideCharStr, int cchWideChar); + int CompareStringW(uint Locale, uint dwCmpFlags, wchar* lpString1, int cchCount1, wchar* lpString2, int cchCount2); + +} + +int getUserCulture() { + return GetUserDefaultLCID(); +} + +void setUserCulture(int lcid) { + SetThreadLocale(lcid); +} + +ulong getUtcTime() { + ulong ticks; + GetSystemTimeAsFileTime(ticks); + return ticks; +} + +int compareString(int lcid, char[] stringA, uint offsetA, uint lengthA, char[] stringB, uint offsetB, uint lengthB, bool ignoreCase) { + + wchar[] toUnicode(char[] string, uint offset, uint length, out int translated) { + char* chars = string.ptr + offset; + int required = MultiByteToWideChar(0, 0, chars, length, null, 0); + wchar[] result = new wchar[required]; + translated = MultiByteToWideChar(0, 0, chars, length, result.ptr, required); + return result; + } + + int sortId = (lcid >> 16) & 0xF; + sortId = (sortId == 0) ? lcid : (lcid | (sortId << 16)); + + int len1, len2; + wchar[] string1 = toUnicode(stringA, offsetA, lengthA, len1); + wchar[] string2 = toUnicode(stringB, offsetB, lengthB, len2); + + return CompareStringW(sortId, ignoreCase ? 0x1 : 0x0, string1.ptr, len1, string2.ptr, len2) - 2; +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/text/stream/LineIterator.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/text/stream/LineIterator.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,116 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: January 2006 + + author: Kris + +*******************************************************************************/ + +module tango.text.stream.LineIterator; + +private import tango.text.stream.StreamIterator; + +/******************************************************************************* + + Iterate across a set of text patterns. + + Each pattern is exposed to the client as a slice of the original + content, where the slice is transient. If you need to retain the + exposed content, then you should .dup it appropriately. + + These iterators are based upon the IBuffer construct, and can + thus be used in conjunction with other Iterators and/or Reader + instances upon a common buffer ~ each will stay in lockstep via + state maintained within the IBuffer. + + The content exposed via an iterator is supposed to be entirely + read-only. All current iterators abide by this rule, but it is + possible a user could mutate the content through a get() slice. + To enforce the desired read-only aspect, the code would have to + introduce redundant copying or the compiler would have to support + read-only arrays. + + See LineIterator, SimpleIterator, RegexIterator, QuotedIterator. + + +*******************************************************************************/ + +class LineIterator(T) : StreamIterator!(T) +{ + /*********************************************************************** + + Construct an uninitialized iterator. For example: + --- + auto lines = new LineIterator!(char); + + void somefunc (IBuffer buffer) + { + foreach (line; lines.set(buffer)) + Cout (line).newline; + } + --- + + Construct a streaming iterator upon a buffer: + --- + void somefunc (IBuffer buffer) + { + foreach (line; new LineIterator!(char) (buffer)) + Cout (line).newline; + } + --- + + Construct a streaming iterator upon a conduit: + --- + foreach (line; new LineIterator!(char) (new FileConduit ("myfile"))) + Cout (line).newline; + --- + + ***********************************************************************/ + + this (InputStream stream = null) + { + super (stream); + } + + /*********************************************************************** + + Read a line of text, and return false when there's no + further content available. + + ***********************************************************************/ + + final bool readln (inout T[] content) + { + content = super.next; + return content.ptr !is null; + } + + /*********************************************************************** + + Scanner implementation for this iterator. Find a '\n', + and eat any immediately preceeding '\r' + + ***********************************************************************/ + + protected uint scan (void[] data) + { + auto content = (cast(T*) data.ptr) [0 .. data.length / T.sizeof]; + + foreach (int i, T c; content) + if (c is '\n') + { + int slice = i; + if (i && content[i-1] is '\r') + --slice; + set (content.ptr, 0, slice); + return found (i); + } + + return notFound; + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/text/stream/QuoteIterator.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/text/stream/QuoteIterator.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,115 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: January 2006 + + author: Kris + +*******************************************************************************/ + +module tango.text.stream.QuoteIterator; + +private import tango.text.stream.StreamIterator; + +/******************************************************************************* + + Iterate across a set of text patterns. + + Each pattern is exposed to the client as a slice of the original + content, where the slice is transient. If you need to retain the + exposed content, then you should .dup it appropriately. + + These iterators are based upon the IBuffer construct, and can + thus be used in conjunction with other Iterators and/or Reader + instances upon a common buffer ~ each will stay in lockstep via + state maintained within the IBuffer. + + The content exposed via an iterator is supposed to be entirely + read-only. All current iterators abide by this rule, but it is + possible a user could mutate the content through a get() slice. + To enforce the desired read-only aspect, the code would have to + introduce redundant copying or the compiler would have to support + read-only arrays. + + See LineIterator, SimpleIterator, RegexIterator, QuotedIterator. + + +*******************************************************************************/ + +class QuoteIterator(T) : StreamIterator!(T) +{ + private T[] delim; + + /*********************************************************************** + + Construct an uninitialized iterator. For example: + --- + auto lines = new LineIterator!(char); + + void somefunc (IBuffer buffer) + { + foreach (line; lines.set(buffer)) + Cout (line).newline; + } + --- + + Construct a streaming iterator upon a buffer: + --- + void somefunc (IBuffer buffer) + { + foreach (line; new LineIterator!(char) (buffer)) + Cout (line).newline; + } + --- + + Construct a streaming iterator upon a conduit: + --- + foreach (line; new LineIterator!(char) (new FileConduit ("myfile"))) + Cout (line).newline; + --- + + ***********************************************************************/ + + this (T[] delim, InputStream stream = null) + { + super (stream); + this.delim = delim; + } + + /*********************************************************************** + + ***********************************************************************/ + + private uint pair (T[] content, T quote) + { + foreach (int i, T c; content) + if (c is quote) + return found (set (content.ptr, 0, i) + 1); + + return notFound; + } + + /*********************************************************************** + + ***********************************************************************/ + + protected uint scan (void[] data) + { + auto content = (cast(T*) data.ptr) [0 .. data.length / T.sizeof]; + + foreach (int i, T c; content) + if (has (delim, c)) + return found (set (content.ptr, 0, i)); + else + if (c is '"' || c is '\'') + if (i) + return found (set (content.ptr, 0, i)); + else + return pair (content[1 .. content.length], c); + + return notFound; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/text/stream/RegexIterator.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/text/stream/RegexIterator.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,103 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: January 2006 + + author: Kris + +*******************************************************************************/ + +module tango.text.stream.RegexIterator; + +private import tango.text.Regex; + +private import tango.text.stream.StreamIterator; + +/******************************************************************************* + + Iterate across a set of text patterns. + + Each pattern is exposed to the client as a slice of the original + content, where the slice is transient. If you need to retain the + exposed content, then you should .dup it appropriately. + + These iterators are based upon the IBuffer construct, and can + thus be used in conjunction with other Iterators and/or Reader + instances upon a common buffer ~ each will stay in lockstep via + state maintained within the IBuffer. + + The content exposed via an iterator is supposed to be entirely + read-only. All current iterators abide by this rule, but it is + possible a user could mutate the content through a get() slice. + To enforce the desired read-only aspect, the code would have to + introduce redundant copying or the compiler would have to support + read-only arrays. + + See LineIterator, SimpleIterator, RegexIterator, QuotedIterator. + + +*******************************************************************************/ + +class RegexIterator : StreamIterator!(char) +{ + private Regex regex; + private alias char T; + + /*********************************************************************** + + Construct an uninitialized iterator. For example: + --- + auto lines = new LineIterator!(char); + + void somefunc (IBuffer buffer) + { + foreach (line; lines.set(buffer)) + Cout (line).newline; + } + --- + + Construct a streaming iterator upon a buffer: + --- + void somefunc (IBuffer buffer) + { + foreach (line; new LineIterator!(char) (buffer)) + Cout (line).newline; + } + --- + + Construct a streaming iterator upon a conduit: + --- + foreach (line; new LineIterator!(char) (new FileConduit ("myfile"))) + Cout (line).newline; + --- + + ***********************************************************************/ + + this (T[] pattern, InputStream stream = null) + { + regex = new Regex (pattern, ""); + super (stream); + } + + /*********************************************************************** + + ***********************************************************************/ + + protected uint scan (void[] data) + { + auto content = (cast(T*) data.ptr) [0 .. data.length / T.sizeof]; + + if (regex.test (content)) + { + int start = regex.pmatch[0].rm_so; + int finish = regex.pmatch[0].rm_eo; + set (content.ptr, 0, start); + return found (finish-1); + } + + return notFound; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/text/stream/SimpleIterator.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/text/stream/SimpleIterator.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,103 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: January 2006 + + author: Kris + +*******************************************************************************/ + +module tango.text.stream.SimpleIterator; + +private import tango.text.stream.StreamIterator; + +/******************************************************************************* + + Iterate across a set of text patterns. + + Each pattern is exposed to the client as a slice of the original + content, where the slice is transient. If you need to retain the + exposed content, then you should .dup it appropriately. + + These iterators are based upon the IBuffer construct, and can + thus be used in conjunction with other Iterators and/or Reader + instances upon a common buffer ~ each will stay in lockstep via + state maintained within the IBuffer. + + The content exposed via an iterator is supposed to be entirely + read-only. All current iterators abide by this rule, but it is + possible a user could mutate the content through a get() slice. + To enforce the desired read-only aspect, the code would have to + introduce redundant copying or the compiler would have to support + read-only arrays. + + See LineIterator, SimpleIterator, RegexIterator, QuotedIterator. + +*******************************************************************************/ + +class SimpleIterator(T) : StreamIterator!(T) +{ + private T[] delim; + + /*********************************************************************** + + Construct an uninitialized iterator. For example: + --- + auto lines = new LineIterator!(char); + + void somefunc (IBuffer buffer) + { + foreach (line; lines.set(buffer)) + Cout (line).newline; + } + --- + + Construct a streaming iterator upon a buffer: + --- + void somefunc (IBuffer buffer) + { + foreach (line; new LineIterator!(char) (buffer)) + Cout (line).newline; + } + --- + + Construct a streaming iterator upon a conduit: + --- + foreach (line; new LineIterator!(char) (new FileConduit ("myfile"))) + Cout (line).newline; + --- + + ***********************************************************************/ + + this (T[] delim, InputStream stream = null) + { + this.delim = delim; + super (stream); + } + + /*********************************************************************** + + ***********************************************************************/ + + protected uint scan (void[] data) + { + auto content = (cast(T*) data.ptr) [0 .. data.length / T.sizeof]; + + if (delim.length is 1) + { + foreach (int i, T c; content) + if (c is delim[0]) + return found (set (content.ptr, 0, i)); + } + else + foreach (int i, T c; content) + if (has (delim, c)) + return found (set (content.ptr, 0, i)); + + return notFound; + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/text/stream/StreamIterator.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/text/stream/StreamIterator.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,341 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: December 2005 + + author: Kris + +*******************************************************************************/ + +module tango.text.stream.StreamIterator; + +public import tango.io.Buffer; + +private import Text = tango.text.Util; + +private import tango.io.model.IConduit; + +/******************************************************************************* + + The base class for a set of stream iterators. These operate + upon a buffered input stream, and are designed to deal with + partial content. That is, stream iterators go to work the + moment any data becomes available in the buffer. Contrast + this behaviour with the tango.text.Util iterators, which + operate upon the extent of an array. + + There are two types of iterators supported; exclusive and + inclusive. The former are the more common kind, where a token + is delimited by elements that are considered foreign. Examples + include space, comma, and end-of-line delineation. Inclusive + tokens are just the opposite: they look for patterns in the + text that should be part of the token itself - everything else + is considered foreign. Currently tango.text.stream includes the + exclusive variety only. + + Each pattern is exposed to the client as a slice of the original + content, where the slice is transient. If you need to retain the + exposed content, then you should .dup it appropriately. + + The content provided to these iterators is intended to be fully + read-only. All current tokenizers abide by this rule, but it is + possible a user could mutate the content through a token slice. + To enforce the desired read-only aspect, the code would have to + introduce redundant copying or the compiler would have to support + read-only arrays. + + See LineIterator, CharIterator, RegexIterator, QuotedIterator, + and SimpleIterator + +*******************************************************************************/ + +class StreamIterator(T) : InputStream, Buffered +{ + protected T[] slice, + pushed; + private IBuffer input; + + /*********************************************************************** + + The pattern scanner, implemented via subclasses + + ***********************************************************************/ + + abstract protected uint scan (void[] data); + + /*********************************************************************** + + Instantiate with a buffer + + ***********************************************************************/ + + this (InputStream stream = null) + { + if (stream) + set (stream); + } + + /*********************************************************************** + + Set the provided stream as the scanning source + + ***********************************************************************/ + + final StreamIterator set (InputStream stream) + { + assert (stream); + input = Buffer.share (stream); + return this; + } + + /*********************************************************************** + + Return the current token as a slice of the content + + ***********************************************************************/ + + final T[] get () + { + return slice; + } + + /*********************************************************************** + + Push one token back into the stream, to be returned by a + subsequent call to next() + + Push null to cancel a prior assignment + + ***********************************************************************/ + + final StreamIterator push (T[] token) + { + pushed = token; + return this; + } + + /********************************************************************** + + Iterate over the set of tokens. This should really + provide read-only access to the tokens, but D does + not support that at this time + + **********************************************************************/ + + int opApply (int delegate(inout T[]) dg) + { + bool more; + int result; + + do { + more = consume; + result = dg (slice); + } while (more && !result); + return result; + } + + /********************************************************************** + + Iterate over a set of tokens, exposing a token count + starting at zero + + **********************************************************************/ + + int opApply (int delegate(inout int, inout T[]) dg) + { + bool more; + int result, + tokens; + + do { + more = consume; + result = dg (tokens, slice); + ++tokens; + } while (more && !result); + return result; + } + + /*********************************************************************** + + Locate the next token. Returns the token if found, null + otherwise. Null indicates an end of stream condition. To + sweep a conduit for lines using method next(): + --- + auto lines = new LineIterator!(char) (new FileConduit("myfile")); + while (lines.next) + Cout (lines.get).newline; + --- + + Alternatively, we can extract one line from a conduit: + --- + auto line = (new LineIterator!(char) (new FileConduit("myfile"))).next; + --- + + The difference between next() and foreach() is that the + latter processes all tokens in one go, whereas the former + processes in a piecemeal fashion. To wit: + --- + foreach (line; new LineIterator!(char) (new FileConduit("myfile")) + Cout(line).newline; + --- + + Note that tokens exposed via push() are returned immediately + when available, taking priority over the input stream itself + + ***********************************************************************/ + + final T[] next () + { + if (pushed.ptr) + return pushed; + else + if (consume() || slice.length) + return slice; + return null; + } + + /*********************************************************************** + + Set the content of the current slice + + ***********************************************************************/ + + protected final uint set (T* content, uint start, uint end) + { + slice = content [start .. end]; + return end; + } + + /*********************************************************************** + + Called when a scanner fails to find a matching pattern. + This may cause more content to be loaded, and a rescan + initiated + + ***********************************************************************/ + + protected final uint notFound () + { + return IConduit.Eof; + } + + /*********************************************************************** + + Invoked when a scanner matches a pattern. The provided + value should be the index of the last element of the + matching pattern, which is converted back to a void[] + index. + + ***********************************************************************/ + + protected final uint found (uint i) + { + return (i + 1) * T.sizeof; + } + + /*********************************************************************** + + See if set of characters holds a particular instance + + ***********************************************************************/ + + protected final bool has (T[] set, T match) + { + foreach (T c; set) + if (match is c) + return true; + return false; + } + + /*********************************************************************** + + Consume the next token and place it in 'slice'. Returns + true when there are potentially more tokens + + ***********************************************************************/ + + private bool consume () + { + if (input.next (&scan)) + return true; + + auto tmp = input.slice (buffer.readable); + slice = (cast(T*) tmp.ptr) [0 .. tmp.length/T.sizeof]; + return false; + } + + + /**********************************************************************/ + /************************ Buffered Interface **************************/ + /**********************************************************************/ + + + /*********************************************************************** + + Return the associated buffer + + ***********************************************************************/ + + final IBuffer buffer () + { + return input; + } + + /**********************************************************************/ + /********************** InputStream Interface *************************/ + /**********************************************************************/ + + + /*********************************************************************** + + Return the host conduit + + ***********************************************************************/ + + final IConduit conduit () + { + return input.conduit; + } + + /*********************************************************************** + + Read from conduit into a target array. The provided dst + will be populated with content from the conduit. + + Returns the number of bytes read, which may be less than + requested in dst + + ***********************************************************************/ + + uint read (void[] dst) + { + return input.read (dst); + } + + /*********************************************************************** + + Clear any buffered content + + ***********************************************************************/ + + final InputStream clear () + { + return input.clear; + } + + /*********************************************************************** + + Close the input + + ***********************************************************************/ + + final void close () + { + input.close; + } +} + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/time/Clock.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/time/Clock.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,302 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Feb 2007: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.time.Clock; + +public import tango.time.Time; + +private import tango.sys.Common; + +private import tango.core.Exception; + +/****************************************************************************** + + Exposes UTC time relative to Jan 1st, 1 AD. These values are + based upon a clock-tick of 100ns, giving them a span of greater + than 10,000 years. These units of time are the foundation of most + time and date functionality in Tango. + + Interval is another type of time period, used for measuring a + much shorter duration; typically used for timeout periods and + for high-resolution timers. These intervals are measured in + units of 1 second, and support fractional units (0.001 = 1ms). + +*******************************************************************************/ + +struct Clock +{ + version (Win32) + { + /*************************************************************** + + Return the current time as UTC since the epoch + + ***************************************************************/ + + static Time now () + { + FILETIME fTime = void; + GetSystemTimeAsFileTime (&fTime); + return convert (fTime); + } + + /*************************************************************** + + Set Date fields to represent the current time. + + ***************************************************************/ + + static DateTime toDate () + { + return toDate (now); + } + + /*************************************************************** + + Set fields to represent the provided UTC time. Note + that the conversion is limited by the underlying OS, + and will fail to operate correctly with Time + values beyond the domain. On Win32 the earliest + representable date is 1601. On linux it is 1970. Both + systems have limitations upon future dates also. Date + is limited to millisecond accuracy at best. + + ***************************************************************/ + + static DateTime toDate (Time time) + { + DateTime dt = void; + SYSTEMTIME sTime = void; + + auto fTime = convert (time); + FileTimeToSystemTime (&fTime, &sTime); + + dt.date.year = sTime.wYear; + dt.date.month = sTime.wMonth; + dt.date.day = sTime.wDay; + dt.date.dow = sTime.wDayOfWeek; + dt.date.doy = 0; + dt.date.era = 0; + dt.time.hours = sTime.wHour; + dt.time.minutes = sTime.wMinute; + dt.time.seconds = sTime.wSecond; + dt.time.millis = sTime.wMilliseconds; + return dt; + } + + /*************************************************************** + + Convert Date fields to Time + + Note that the conversion is limited by the underlying + OS, and will not operate correctly with Time + values beyond the domain. On Win32 the earliest + representable date is 1601. On linux it is 1970. Both + systems have limitations upon future dates also. Date + is limited to millisecond accuracy at best. + + ***************************************************************/ + + static Time fromDate (inout DateTime dt) + { + SYSTEMTIME sTime = void; + FILETIME fTime = void; + + sTime.wYear = cast(ushort) dt.date.year; + sTime.wMonth = cast(ushort) dt.date.month; + sTime.wDayOfWeek = 0; + sTime.wDay = cast(ushort) dt.date.day; + sTime.wHour = cast(ushort) dt.time.hours; + sTime.wMinute = cast(ushort) dt.time.minutes; + sTime.wSecond = cast(ushort) dt.time.seconds; + sTime.wMilliseconds = cast(ushort) dt.time.millis; + + SystemTimeToFileTime (&sTime, &fTime); + return convert (fTime); + } + + /*************************************************************** + + Convert FILETIME to a Time + + ***************************************************************/ + + package static Time convert (FILETIME time) + { + auto t = *cast(long*) &time; + t *= 100 / TimeSpan.NanosecondsPerTick; + return Time.epoch1601 + TimeSpan(t); + } + + /*************************************************************** + + Convert Time to a FILETIME + + ***************************************************************/ + + package static FILETIME convert (Time dt) + { + FILETIME time = void; + + TimeSpan span = dt - Time.epoch1601; + assert (span >= TimeSpan.zero); + *cast(long*) &time.dwLowDateTime = span.ticks; + return time; + } + } + + version (Posix) + { + /*************************************************************** + + Return the current time as UTC since the epoch + + ***************************************************************/ + + static Time now () + { + timeval tv = void; + if (gettimeofday (&tv, null)) + throw new PlatformException ("Clock.now :: Posix timer is not available"); + + return convert (tv); + } + + /*************************************************************** + + Set Date fields to represent the current time. + + ***************************************************************/ + + static DateTime toDate () + { + return toDate (now); + } + + /*************************************************************** + + Set fields to represent the provided UTC time. Note + that the conversion is limited by the underlying OS, + and will fail to operate correctly with Time + values beyond the domain. On Win32 the earliest + representable date is 1601. On linux it is 1970. Both + systems have limitations upon future dates also. Date + is limited to millisecond accuracy at best. + + **************************************************************/ + + static DateTime toDate (Time time) + { + DateTime dt = void; + auto timeval = convert (time); + dt.time.millis = timeval.tv_usec / 1000; + + tm t = void; + gmtime_r (&timeval.tv_sec, &t); + + dt.date.year = t.tm_year + 1900; + dt.date.month = t.tm_mon + 1; + dt.date.day = t.tm_mday; + dt.date.dow = t.tm_wday; + dt.date.doy = 0; + dt.date.era = 0; + dt.time.hours = t.tm_hour; + dt.time.minutes = t.tm_min; + dt.time.seconds = t.tm_sec; + return dt; + } + + /*************************************************************** + + Convert Date fields to Time + + Note that the conversion is limited by the underlying + OS, and will not operate correctly with Time + values beyond the domain. On Win32 the earliest + representable date is 1601. On linux it is 1970. Both + systems have limitations upon future dates also. Date + is limited to millisecond accuracy at best. + + ***************************************************************/ + + static Time fromDate (inout DateTime dt) + { + tm t = void; + + t.tm_year = dt.date.year - 1900; + t.tm_mon = dt.date.month - 1; + t.tm_mday = dt.date.day; + t.tm_hour = dt.time.hours; + t.tm_min = dt.time.minutes; + t.tm_sec = dt.time.seconds; + + auto seconds = timegm (&t); + return Time.epoch1970 + + TimeSpan.seconds(seconds) + + TimeSpan.millis(dt.time.millis); + } + + /*************************************************************** + + Convert timeval to a Time + + ***************************************************************/ + + package static Time convert (inout timeval tv) + { + return Time.epoch1970 + + TimeSpan.seconds(tv.tv_sec) + + TimeSpan.micros(tv.tv_usec); + } + + /*************************************************************** + + Convert Time to a timeval + + ***************************************************************/ + + package static timeval convert (Time time) + { + timeval tv = void; + + TimeSpan span = time - time.epoch1970; + assert (span >= TimeSpan.zero); + tv.tv_sec = span.seconds; + tv.tv_usec = span.micros % 1_000_000L; + return tv; + } + } +} + + + +debug (UnitTest) +{ + unittest + { + auto time = Clock.now; + assert (Clock.convert(Clock.convert(time)) is time); + + time -= TimeSpan(time.ticks % TimeSpan.TicksPerSecond); + auto date = Clock.toDate(time); + + assert (time is Clock.fromDate(date)); + } +} + +debug (Clock) +{ + void main() + { + auto time = Clock.now; + } +} \ No newline at end of file diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/time/ISO8601.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/time/ISO8601.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,1282 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Deewiant. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: Aug 2007 + + author: Deewiant + + Based on the ISO 8601:2004 standard (described in a PDF Wikipedia + http://isotc.iso.org/livelink/livelink/4021199/ISO_8601_2004_E.zip? + func=doc.Fetch&nodeid=4021199), which has functions for parsing almost + every date/time format specified. + + The ones they don't parse are intervals, durations, and recurring + intervals, because I got too lazy to implement them. The functions + (iso8601Time, iso8601Date, and iso8601) update a Date passed instead + of a Time, as does the current iso8601, because that's too limited + a format. One can always convert to a Time if necessary, keeping + in mind that information loss might occur if the Date is outside the + interval Time can represent. + + In addition, because its dayOfWeek function only works for 1900-3-1 to + 2100-2-28, it would fail by a day or two on ISO week dates outside that + interval. (Currently it asserts outside 1901-2099.) If somebody knows a + good algorithm which would fix that, by all means submit it. + + Another thing it doesn't do is conversions from local time to UTC if the + time parsed starts with a 'T'. A comment in doIso8601Time() explains why. + + Because the Date struct has no support for time zones, the module just + converts times with specified time zones into UTC. This leads to + behaviour which may or may not be a bug, as explained in a comment in + getTimeZone(). + +*******************************************************************************/ + +module tango.time.ISO8601; + +public import tango.time.Time; + +public import tango.time.chrono.Calendar; + +private import tango.time.chrono.Gregorian; + +/// Returns the number of chars used to compose a valid date: 0 if no date can be composed. +/// Fields in date will either be correct (e.g. months will be >= 1 and <= 12) or zero. + +size_t iso8601Date(T)(T[] src, ref Date date, size_t expanded = 0) { + ubyte dummy = void; + T* p = src.ptr; + return doIso8601Date(p, src, date, expanded, dummy); +} + +private size_t doIso8601Date(T)(ref T* p, T[] src, ref Date date, size_t expanded, out ubyte separators) +out { + assert (!date.month || (date.month >= 1 && date.month <= 12)); + assert (!date.day || (date.month && date.day >= 1 && date.day <= daysPerMonth(date.month, date.year))); +} body { + + // always set era to AD + date.era = Gregorian.AD_ERA; + + size_t eaten() { return p - src.ptr; } + bool done(T[] s) { return .done(eaten(), src.length, *p, s); } + + if (!parseYear(p, expanded, date.year)) + return (date.year = 0); + + auto onlyYear = eaten(); + + // /([+-]Y{expanded})?(YYYY|YY)/ + if (done("-0123W")) + return onlyYear; + + if (accept(p, '-')) + separators = true; + + if (accept(p, 'W')) { + // (year)-Www-D + + T* p2 = p; + + int i = parseIntMax(p, 3u); + + if (i) if (p - p2 == 2) { + + // (year)-Www + if (done("-")) { + if (getMonthAndDayFromWeek(date, i)) + return eaten(); + + // (year)-Www-D + } else if (demand(p, '-')) + if (getMonthAndDayFromWeek(date, i, *p++ - '0')) + return eaten(); + + } else if (p - p2 == 3) + // (year)WwwD + if (getMonthAndDayFromWeek(date, i / 10, i % 10)) + return eaten(); + + return onlyYear; + } + + // next up, MM or MM[-]DD or DDD + + T* p2 = p; + + int i = parseIntMax(p); + if (!i) + return onlyYear; + + switch (p - p2) { + case 2: + date.month = i; + + if (!(date.month >= 1 && date.month <= 12)) { + date.month = 0; + return onlyYear; + } + + auto onlyMonth = eaten(); + + // (year)-MM + if (done("-")) + return onlyMonth; + + // (year)-MM-DD + if (!( + demand(p, '-') && + (date.day = parseIntMax(p, 2u)) != 0 && date.day <= daysPerMonth(date.month, date.year) + )) { + date.day = 0; + return onlyMonth; + } + + break; + + case 4: + // e.g. 20010203, i = 203 now + + date.month = i / 100; + date.day = i % 100; + + // (year)MMDD + if (!( + date.month >= 1 && date.month <= 12 && + date.day >= 0 && date.day <= daysPerMonth(date.month, date.year) + )) { + date.month = date.day = 0; + return onlyYear; + } + + break; + + case 3: + // (year)-DDD + // i is the ordinal of the day within the year + + bool leap = isLeapYear(date.year); + + if (i > 365 + leap) + return onlyYear; + + if (i <= 31) { + date.month = 1; + date.day = i; + + } else if (i <= 59 + leap) { + date.month = 2; + date.day = i - 31 - leap; + + } else if (i <= 90 + leap) { + date.month = 3; + date.day = i - 59 - leap; + + } else if (i <= 120 + leap) { + date.month = 4; + date.day = i - 90 - leap; + + } else if (i <= 151 + leap) { + date.month = 5; + date.day = i - 120 - leap; + + } else if (i <= 181 + leap) { + date.month = 6; + date.day = i - 151 - leap; + + } else if (i <= 212 + leap) { + date.month = 7; + date.day = i - 181 - leap; + + } else if (i <= 243 + leap) { + date.month = 8; + date.day = i - 212 - leap; + + } else if (i <= 273 + leap) { + date.month = 9; + date.day = i - 243 - leap; + + } else if (i <= 304 + leap) { + date.month = 10; + date.day = i - 273 - leap; + + } else if (i <= 334 + leap) { + date.month = 11; + date.day = i - 304 - leap; + + } else { + if (i > 365 + leap) + assert (false); + + date.month = 12; + date.day = i - 334 - leap; + } + + default: break; + } + + return eaten(); +} + +/// Returns the number of chars used to compose a valid date: 0 if no date can be composed. +/// Fields in date will be zero if incorrect: since 00:00:00,000 is a valid time, the return value must be checked to be sure of the result. +/// time.seconds may be 60 if the hours and minutes are 23 and 59, as leap seconds are occasionally added to UTC time. +/// time.hours may be 0 or 24: the latter marks the end of a day, the former the beginning. + +size_t iso8601Time(T)(T[] src, ref Date date, ref TimeOfDay time) { + bool dummy = void; + T* p = src.ptr; + return doIso8601Time(p, src, date, time, WHATEVER, dummy); +} + +private enum : ubyte { NO = 0, YES = 1, WHATEVER } + +// bothValid is used only to get iso8601() to catch errors correctly +private size_t doIso8601Time(T)(ref T* p, T[] src, ref Date date, ref TimeOfDay time, ubyte separators, out bool bothValid) +out { + // yes, I could just write >= 0, but this emphasizes the difference between == 0 and != 0 + assert (!time.hours || (time.hours > 0 && time.hours <= 24)); + assert (!time.minutes || (time.minutes > 0 && time.minutes <= 59)); + assert (!time.seconds || (time.seconds > 0 && time.seconds <= 60)); + assert (!time.millis || (time.millis > 0 && time.millis <= 999)); +} body { + size_t eaten() { return p - src.ptr; } + bool done(T[] s) { return .done(eaten(), src.length, *p, s); } + + bool checkColon() { + if (separators == WHATEVER) + accept(p, ':'); + + else if (accept(p, ':') != separators) + return false; + + return true; + } + + byte getTimeZone() { return .getTimeZone(p, date, time, separators, &done); } + + // TODO/BUG: need to convert from local time if got T + // however, Tango provides nothing like Phobos's std.date.getLocalTZA + // (which doesn't look like it should work on Windows, it should use tzi.bias only, and GetTimeZoneInformationForYear) + // (and which uses too complicated code for Posix, tzset should be enough) + // and I'm not interested in delving into system-specific code right now + // remember also that -1 BC is the year zero in ISO 8601... -2 BC is -1, etc + if (separators == WHATEVER) + accept(p, 'T'); + + if (parseInt(p, 2u, time.hours) != 2 || time.hours > 24) + return (time.hours = 0); + + auto onlyHour = eaten(); + + // hh + if (done("+,-.012345:")) + return onlyHour; + + switch (getDecimal(p, time, HOUR)) { + case NOTFOUND: break; + case FOUND: + auto onlyDecimal = eaten(); + if (getTimeZone() == BAD) + return onlyDecimal; + + // /hh,h+/ + return eaten(); + + case BAD: return onlyHour; + default: assert (false); + } + + switch (getTimeZone()) { + case NOTFOUND: break; + case FOUND: return eaten(); + case BAD: return onlyHour; + default: assert (false); + } + + if ( + !checkColon() || + + parseInt(p, 2u, time.minutes) != 2 || time.minutes > 59 || + + // hour 24 is only for 24:00:00 + (time.hours == 24 && time.minutes != 0) + ) { + time.minutes = 0; + return onlyHour; + } + + auto onlyMinute = eaten(); + + // hh:mm + if (done("+,-.0123456:")) { + bothValid = true; + return onlyMinute; + } + + switch (getDecimal(p, time, MINUTE)) { + case NOTFOUND: break; + case FOUND: + auto onlyDecimal = eaten(); + if (getTimeZone() == BAD) + return onlyDecimal; + + // /hh:mm,m+/ + bothValid = true; + return eaten(); + + case BAD: return onlyMinute; + default: assert (false); + } + + switch (getTimeZone()) { + case NOTFOUND: break; + case FOUND: bothValid = true; return eaten(); + case BAD: return onlyMinute; + default: assert (false); + } + + if ( + !checkColon() || + parseInt(p, 2u, time.seconds) != 2 || time.seconds > 60 || + (time.hours == 24 && time.seconds != 0) || + (time.seconds == 60 && time.hours != 23 && time.minutes != 59) + ) { + time.seconds = 0; + return onlyMinute; + } + + auto onlySecond = eaten(); + + // hh:mm:ss + if (done("+,-.Z")) { + bothValid = true; + return onlySecond; + } + + switch (getDecimal(p, time, SECOND)) { + case NOTFOUND: break; + case FOUND: + auto onlyDecimal = eaten(); + if (getTimeZone() == BAD) + return onlyDecimal; + + // /hh:mm:ss,s+/ + bothValid = true; + return eaten(); + + case BAD: return onlySecond; + default: assert (false); + } + + if (getTimeZone() == BAD) + return onlySecond; + else { + bothValid = true; + return eaten(); // hh:mm:ss with timezone + } +} + +// combination of date and time +// stricter than just date followed by time: +// can't have an expanded or reduced date +// either use separators everywhere or not at all + +/// This function is very strict: either a complete date and time can be extracted, or nothing can. +/// If this function returns zero, the fields of date are undefined. + +size_t iso8601(T)(T[] src, ref Date date, ref TimeOfDay time) { + T* p = src.ptr; + ubyte sep; + bool bothValid = false; + + if ( + doIso8601Date(p, src, date, 0u, sep) && + date.year && date.month && date.day && + + // by mutual agreement this T may be omitted + // but this is just a convenience method for date+time anyway + demand(p, 'T') && + + doIso8601Time(p, src, date, time, sep, bothValid) && + bothValid + ) + return p - src.ptr; + else + return 0; +} + +/+ +++++++++++++++++++++++++++++++++++++++ +\ + + Privates used by date + +\+ +++++++++++++++++++++++++++++++++++++++ +/ + +// /([+-]Y{expanded})?(YYYY|YY)/ +private bool parseYear(T)(ref T* p, size_t expanded, out uint year) { + + bool doParse() { + T* p2 = p; + + if (!parseInt(p, expanded + 4u, year)) + return false; + + // it's Y{expanded}YY, Y{expanded}YYYY, or unacceptable + if (p - p2 - expanded == 2u) + year *= 100; + else if (p - p2 - expanded != 4u) + return false; + + return true; + } + + if (accept(p, '-')) { + if (!doParse()) + return false; + year = -year; + } else { + accept(p, '+'); + if (!doParse()) + return false; + } + + return true; +} + +// find the month and day based on the calendar week +// uses date.year for leap year calculations +// returns false if week and date.year are incompatible +// based on the VBA function at http://www.probabilityof.com/ISO8601.shtml +private bool getMonthAndDayFromWeek(ref Date date, int week, int day = 1) { + if (week < 1 || week > 53 || day < 1 || day > 7) + return false; + + bool leap = isLeapYear(date.year); + + // only years starting with Thursday and + // leap years starting with Wednesday have 53 weeks + + if (week == 53) { + int startingDay = dayOfWeek(date.year, 1, 1, leap); + + if (!(startingDay == 4 || (leap && startingDay == 3))) + return false; + } + + // days since year-01-04 + int delta = 7*(week - 1) - dayOfWeek(date.year, 1, 4, leap) + day; + + if (delta <= -4) { + if (delta < -7) + assert (false); + + --date.year; + date.month = 12; + date.day = delta + 4 + 31; + + } else if (delta <= 27) { + date.month = 1; + date.day = delta + 4; + + } else if (delta <= 56 + leap) { + date.month = 2; + date.day = delta - 27; + + } else if (delta <= 87 + leap) { + date.month = 3; + date.day = delta - 55 - leap; + + } else if (delta <= 117 + leap) { + date.month = 4; + date.day = delta - 86 - leap; + + } else if (delta <= 148 + leap) { + date.month = 5; + date.day = delta - 116 - leap; + + } else if (delta <= 178 + leap) { + date.month = 6; + date.day = delta - 147 - leap; + + } else if (delta <= 209 + leap) { + date.month = 7; + date.day = delta - 177 - leap; + + } else if (delta <= 240 + leap) { + date.month = 8; + date.day = delta - 208 - leap; + + } else if (delta <= 270 + leap) { + date.month = 9; + date.day = delta - 239 - leap; + + } else if (delta <= 301 + leap) { + date.month = 10; + date.day = delta - 269 - leap; + + } else if (delta <= 331 + leap) { + date.month = 11; + date.day = delta - 300 - leap; + + } else if (delta <= 361 + leap) { + date.month = 12; + date.day = delta - 330 - leap; + + } else { + if (delta > 365 + leap) + assert (false); + + ++date.year; + date.month = 1; + date.day = delta - 365 - leap + 4; + } + + return true; +} + +private bool isLeapYear(int year) { + return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0); +} + +// Babwani's Congruence +private int dayOfWeek(int year, int month, int day, bool leap) +in { + assert (month >= 1 && month <= 12); + assert (day >= 1 && day <= 31); + + // BUG: only works for 1900-3-1 to 2100-2-28 + assert (year >= 1901 && year <= 2099, "iso8601 :: Can't calculate day of week outside the years 1900-2099"); + +} out(result) { + assert (result >= 1 && result <= 7); + +} body { + int f() { + if (leap && month <= 2) + return [6,2][month-1]; + + return [0,3,3,6,1,4,6,2,5,0,3,5][month-1]; + } + + int d = ((5*(year % 100) / 4) - 2*((year / 100) % 4) + f() + day) % 7; + + // defaults to Saturday=0, Friday=6: convert to Monday=1, Sunday=7 + return (d <= 1 ? d+6 : d-1); +} + +/+ +++++++++++++++++++++++++++++++++++++++ +\ + + Privates used by time + +\+ +++++++++++++++++++++++++++++++++++++++ +/ + +private enum : ubyte { HOUR, MINUTE, SECOND } +private enum : byte { BAD, FOUND, NOTFOUND } + +private byte getDecimal(T)(ref T* p, ref TimeOfDay time, ubyte which) { + if (accept(p, ',') || accept(p, '.')) { + + T* p2 = p; + + int i; + size_t iLen = parseInt(p, i); + + if ( + iLen == 0 || + + // if i is 0, must have at least 3 digits + // ... or at least that's what I think the standard means + // when it says "[i]f the magnitude of the number is less + // than unity, the decimal sign shall be preceded by two + // zeros"... + // surely that should read "followed" and not "preceded" + + (i == 0 && iLen < 3) + ) + return BAD; + + // 10 to the power of (iLen - 1) + int pow = 1; + while (--iLen) + pow *= 10; + + switch (which) { + case HOUR: + time.minutes = 6 * i / pow; + time.seconds = 6 * i % pow; + break; + case MINUTE: + time.seconds = 6 * i / pow; + time.millis = 6000 * i / pow % 1000; + break; + case SECOND: + time.millis = 100 * i / pow; + break; + + default: assert (false); + } + + return FOUND; + } + + return NOTFOUND; +} + +// the Date is always UTC, so this just adds the offset to the date fields +// another option would be to add time zone fields to Date and have this fill them + +private byte getTimeZone(T)(ref T* p, ref Date date, ref TimeOfDay time, ubyte separators, bool delegate(T[]) done) { + if (accept(p, 'Z')) + return FOUND; + + int factor = -1; + + if (accept(p, '-')) + factor = 1; + + else if (!accept(p, '+')) + return NOTFOUND; + + int hour, realhour = time.hours, realminute = time.minutes; + scope(exit) time.hours = cast(uint)realhour; + scope(exit) time.minutes = cast(uint)realminute; + if (parseInt(p, 2u, hour) != 2 || hour > 12 || (hour == 0 && factor == 1)) + return BAD; + + realhour += factor * hour; + + void hourCheck() { + if (realhour > 24 || (realhour == 24 && (realminute || time.seconds))) { + realhour -= 24; + + // BUG? what should be done? + // if we get a time like 20:00-05:00 + // which needs to be converted to UTC by adding 05:00 to 20:00 + // we just set the time to 01:00 and the day to 1 + // even though this is time, which really has nothing to do with the day, which is part of the date + // if this isn't a bug, it needs to be documented: it's not necessarily obvious + if (date.day++ && date.day > daysPerMonth(date.month, date.year)) { + date.day = 1; + if (++date.month > 12) { + date.month = 1; + ++date.year; + } + } + } else if (realhour < 0) { + realhour += 24; + + // ditto above BUG? + if (date.day-- && date.day < 1) { + if (--date.month < 1) { + date.month = 12; + --date.year; + } + + date.day = daysPerMonth(date.month, date.year); + } + } + } + + if (done("012345:")) { + hourCheck(); + return FOUND; + } + + if (separators == WHATEVER) + accept(p, ':'); + + else if (accept(p, ':') != separators) + return BAD; + + int minute; + if (parseInt(p, 2u, minute) != 2) + return BAD; + + assert (minute <= 59); + + realminute += factor * minute; + + if (realminute > 59) { + realminute -= 60; + ++realhour; + + } else if (realminute < 0) { + realminute += 60; + --realhour; + } + + hourCheck(); + return FOUND; +} + +/+ +++++++++++++++++++++++++++++++++++++++ +\ + + Privates used by both date and time + +\+ +++++++++++++++++++++++++++++++++++++++ +/ + +private bool accept(T)(ref T* p, char c) { + if (*p == c) { + ++p; + return true; + } + return false; +} + +private bool demand(T)(ref T* p, char c) { + return (*p++ == c); +} + +private bool done(T)(size_t eaten, size_t srcLen, T p, T[] s) { + if (eaten == srcLen) + return true; + + // s is the array of characters which may come next + // (i.e. which p may be) + // sorted in ascending order + foreach (c; s) { + if (p < c) + return true; + else if (p == c) + break; + } + + return false; +} + +private int daysPerMonth(int month, int year) { + if (month == 2 && isLeapYear(year)) + return 29; + else + return [31,28,31,30,31,30,31,31,30,31,30,31][month-1]; +} + +/****************************************************************************** + + Extract an integer from the input + +******************************************************************************/ + +// note: ISO 8601 code relies on these values always being positive, failing if *p == '-' + +private uint parseIntMax(T) (ref T* p) { + uint value = 0; + while (*p >= '0' && *p <= '9') + value = value * 10 + *p++ - '0'; + return value; +} + +// ... but accept no more than max digits + +private uint parseIntMax(T)(ref T* p, uint max) { + size_t i = 0; + uint value = 0; + while (p[i] >= '0' && p[i] <= '9' && i < max) + value = value * 10 + p[i++] - '0'; + p += i; + return value; +} + +// ... and return the amount of digits processed + +private size_t parseInt(T, U)(ref T* p, out U i) { + T* p2 = p; + i = cast(U)parseIntMax(p); + return p - p2; +} + +private size_t parseInt(T, U)(ref T* p, uint max, out U i) { + T* p2 = p; + i = cast(U)parseIntMax(p, max); + return p - p2; +} + +//////////////////// + +debug (UnitTest) { + import tango.io.Stdout; + + debug(ISO8601) + { + void main() { } + } + + unittest { + Date date; + TimeOfDay time; + + // date + + size_t d(char[] s, size_t e = 0) { + date = date.init; + return iso8601Date(s, date, e); + } + + assert (d("20abc") == 2); + assert (date.year == 2000); + + assert (d("2004") == 4); + assert (date.year == 2004); + + assert (d("+0019", 2) == 5); + assert (date.year == 1900); + + assert (d("+111985", 2) == 7); + assert (date.year == 111985); + + assert (d("+111985", 1) == 6); + assert (date.year == 11198); + + assert (d("+111985", 3) == 0); + assert (!date.year); + + assert (d("+111985", 4) == 7); + assert (date.year == 11198500); + + assert (d("-111985", 5) == 0); + assert (!date.year); + + assert (d("abc") == 0); + assert (!date.year); + + assert (d("abc123") == 0); + assert (!date.year); + + assert (d("2007-08") == 7); + assert (date.year == 2007); + assert (date.month == 8); + + assert (d("+001985-04", 2) == 10); + assert (date.year == 1985); + assert (date.month == 4); + + assert (d("2007-08-07") == 10); + assert (date.year == 2007); + assert (date.month == 8); + assert (date.day == 7); + + assert (d("2008-20-30") == 4); + assert (date.year == 2008); + assert (!date.month); + + assert (d("2007-02-30") == 7); + assert (date.year == 2007); + assert (date.month == 2); + + assert (d("20060708") == 8); + assert (date.year == 2006); + assert (date.month == 7); + assert (date.day == 8); + + assert (d("19953080") == 4); + assert (date.year == 1995); + assert (!date.month); + + assert (d("+001985-04-12", 2) == 13); + assert (date.year == 1985); + assert (date.month == 4); + assert (date.day == 12); + + assert (d("-0123450607", 2) == 11); + assert (date.year == -12345); + assert (date.month == 6); + assert (date.day == 7); + + assert (d("1985W15") == 7); + assert (date.year == 1985); + assert (date.month == 4); + assert (date.day == 8); + + assert (d("2008-W01") == 8); + assert (date.year == 2007); + assert (date.month == 12); + assert (date.day == 31); + + assert (d("2008-W01-2") == 10); + assert (date.year == 2008); + assert (date.month == 1); + assert (date.day == 1); + + assert (d("2009-W53-4") == 10); + assert (date.year == 2009); + assert (date.month == 12); + assert (date.day == 31); + + assert (d("2009-W01-1") == 10); + assert (date.year == 2008); + assert (date.month == 12); + assert (date.day == 29); + + assert (d("2009W537") == 8); + assert (date.year == 2010); + assert (date.month == 1); + assert (date.day == 3); + + assert (d("2010W537") == 4); + assert (date.year == 2010); + assert (!date.month); + + assert (d("2009-W01-3") == 10); + assert (date.year == 2008); + assert (date.month == 12); + assert (date.day == 31); + + assert (d("2009-W01-4") == 10); + assert (date.year == 2009); + assert (date.month == 1); + assert (date.day == 1); + + /+ BUG: these don't work due to dayOfWeek being crap + + assert (d("1000-W07-7") == 10); + assert (date.year == 1000); + assert (date.month == 2); + assert (date.day == 16); + + assert (d("1500-W11-1") == 10); + assert (date.year == 1500); + assert (date.month == 3); + assert (date.day == 12); + + assert (d("1700-W14-2") == 10); + assert (date.year == 1700); + assert (date.month == 4); + assert (date.day == 6); + + assert (d("1800-W19-3") == 10); + assert (date.year == 1800); + assert (date.month == 5); + assert (date.day == 7); + + assert (d("1900-W25-4") == 10); + assert (date.year == 1900); + assert (date.month == 6); + assert (date.day == 21); + + assert (d("0900-W27-5") == 10); + assert (date.year == 900); + assert (date.month == 7); + assert (date.day == 9); + + assert (d("0800-W33-6") == 10); + assert (date.year == 800); + assert (date.month == 8); + assert (date.day == 19); + + assert (d("0700-W37-7") == 10); + assert (date.year == 700); + assert (date.month == 9); + assert (date.day == 16); + + assert (d("0600-W41-4") == 10); + assert (date.year == 600); + assert (date.month == 10); + assert (date.day == 9); + + assert (d("0500-W45-7") == 10); + assert (date.year == 500); + assert (date.month == 11); + assert (date.day == 14);+/ + + assert (d("2000-W55") == 4); + assert (date.year == 2000); + + assert (d("1980-002") == 8); + assert (date.year == 1980); + assert (date.month == 1); + assert (date.day == 2); + + assert (d("1981-034") == 8); + assert (date.year == 1981); + assert (date.month == 2); + assert (date.day == 3); + + assert (d("1982-063") == 8); + assert (date.year == 1982); + assert (date.month == 3); + assert (date.day == 4); + + assert (d("1983-095") == 8); + assert (date.year == 1983); + assert (date.month == 4); + assert (date.day == 5); + + assert (d("1984-127") == 8); + assert (date.year == 1984); + assert (date.month == 5); + assert (date.day == 6); + + assert (d("1985-158") == 8); + assert (date.year == 1985); + assert (date.month == 6); + assert (date.day == 7); + + assert (d("1986-189") == 8); + assert (date.year == 1986); + assert (date.month == 7); + assert (date.day == 8); + + assert (d("1987-221") == 8); + assert (date.year == 1987); + assert (date.month == 8); + assert (date.day == 9); + + assert (d("1988-254") == 8); + assert (date.year == 1988); + assert (date.month == 9); + assert (date.day == 10); + + assert (d("1989-284") == 8); + assert (date.year == 1989); + assert (date.month == 10); + assert (date.day == 11); + + assert (d("1990316") == 7); + assert (date.year == 1990); + assert (date.month == 11); + assert (date.day == 12); + + assert (d("1991-347") == 8); + assert (date.year == 1991); + assert (date.month == 12); + assert (date.day == 13); + + assert (d("1992-000") == 4); + assert (date.year == 1992); + + assert (d("1993-370") == 4); + assert (date.year == 1993); + + // time + + size_t t(char[] s) { + time = time.init; + date = date.init; + + return iso8601Time(s, date, time); + } + + assert (t("20") == 2); + assert (time.hours == 20); + assert (time.minutes == 0); + assert (time.seconds == 0); + + assert (t("30") == 0); + + assert (t("2004") == 4); + assert (time.hours == 20); + assert (time.minutes == 4); + assert (time.seconds == 0); + + assert (t("200406") == 6); + assert (time.hours == 20); + assert (time.minutes == 4); + assert (time.seconds == 6); + + assert (t("24:00") == 5); + assert (time.hours == 24); // should compare equal with 0... can't just set to 0, loss of information + assert (time.minutes == 0); + assert (time.seconds == 0); + + assert (t("00:00") == 5); + assert (time.hours == 0); + assert (time.minutes == 0); + assert (time.seconds == 0); + + assert (t("23:59:60") == 8); + assert (time.hours == 23); + assert (time.minutes == 59); + assert (time.seconds == 60); // leap second + + assert (t("16:49:30,001") == 12); + assert (time.hours == 16); + assert (time.minutes == 49); + assert (time.seconds == 30); + assert (time.millis == 1); + + assert (t("15:48:29,1") == 10); + assert (time.hours == 15); + assert (time.minutes == 48); + assert (time.seconds == 29); + assert (time.millis == 100); + + assert (t("02:10:34,a") == 8); + assert (time.hours == 2); + assert (time.minutes == 10); + assert (time.seconds == 34); + + assert (t("14:50,5") == 7); + assert (time.hours == 14); + assert (time.minutes == 50); + assert (time.seconds == 30); + + assert (t("1540,4") == 6); + assert (time.hours == 15); + assert (time.minutes == 40); + assert (time.seconds == 24); + + assert (t("1250,") == 4); + assert (time.hours == 12); + assert (time.minutes == 50); + + assert (t("14,5") == 4); + assert (time.hours == 14); + assert (time.minutes == 30); + + assert (t("12,") == 2); + assert (time.hours == 12); + assert (time.minutes == 0); + + assert (t("24:00:01") == 5); + assert (time.hours == 24); + assert (time.minutes == 0); + assert (time.seconds == 0); + + assert (t("12:34+:56") == 5); + assert (time.hours == 12); + assert (time.minutes == 34); + assert (time.seconds == 0); + + // just convert to UTC time for time zones? + + assert (t("14:45:15Z") == 9); + assert (time.hours == 14); + assert (time.minutes == 45); + assert (time.seconds == 15); + + assert (t("23Z") == 3); + assert (time.hours == 23); + assert (time.minutes == 0); + assert (time.seconds == 0); + + assert (t("21:32:43-12:34") == 14); + assert (time.hours == 10); + assert (time.minutes == 6); + assert (time.seconds == 43); + + assert (t("12:34,5+0000") == 12); + assert (time.hours == 12); + assert (time.minutes == 34); + assert (time.seconds == 30); + + assert (t("03:04+07") == 8); + assert (time.hours == 20); + assert (time.minutes == 4); + assert (time.seconds == 0); + + assert (t("11,5+") == 4); + assert (time.hours == 11); + assert (time.minutes == 30); + + assert (t("07-") == 2); + assert (time.hours == 7); + + assert (t("06:12,7-") == 7); + assert (time.hours == 6); + assert (time.minutes == 12); + assert (time.seconds == 42); + + assert (t("050403,2+") == 8); + assert (time.hours == 5); + assert (time.minutes == 4); + assert (time.seconds == 3); + assert (time.millis == 200); + + assert (t("061656-") == 6); + assert (time.hours == 6); + assert (time.minutes == 16); + assert (time.seconds == 56); + + // date and time together + + size_t b(char[] s) { + date = date.init; + time = time.init; + return iso8601(s, date, time); + } + + assert (b("2007-08-09T12:34:56") == 19); + assert (date.year == 2007); + assert (date.month == 8); + assert (date.day == 9); + assert (time.hours == 12); + assert (time.minutes == 34); + assert (time.seconds == 56); + + assert (b("1985W155T235030,768") == 19); + assert (date.year == 1985); + assert (date.month == 4); + assert (date.day == 12); + assert (time.hours == 23); + assert (time.minutes == 50); + assert (time.seconds == 30); + assert (time.millis == 768); + + // just convert to UTC time for time zones? + + assert (b("2009-08-07T01:02:03Z") == 20); + assert (date.year == 2009); + assert (date.month == 8); + assert (date.day == 7); + assert (time.hours == 1); + assert (time.minutes == 2); + assert (time.seconds == 3); + + assert (b("2007-08-09T03:02,5+04:56") == 24); + assert (date.year == 2007); + assert (date.month == 8); + assert (date.day == 8); + assert (time.hours == 22); + assert (time.minutes == 6); + assert (time.seconds == 30); + + assert (b("20000228T2330-01") == 16); + assert (date.year == 2000); + assert (date.month == 2); + assert (date.day == 29); + assert (time.hours == 0); + assert (time.minutes == 30); + assert (time.seconds == 0); + + assert (b("2007-01-01T00:00+01") == 19); + assert (date.year == 2006); + assert (date.month == 12); + assert (date.day == 31); + assert (time.hours == 23); + assert (time.minutes == 0); + assert (time.seconds == 0); + + assert (b("2007-12-31T23:00-01") == 19); + assert (date.year == 2007); + assert (date.month == 12); + assert (date.day == 31); + assert (time.hours == 24); + assert (time.minutes == 0); + assert (time.seconds == 0); + + assert (b("2007-12-31T23:01-01") == 19); + assert (date.year == 2008); + assert (date.month == 1); + assert (date.day == 1); + assert (time.hours == 0); + assert (time.minutes == 1); + assert (time.seconds == 0); + + assert (b("1902-03-04T1a") == 0); + assert (b("1902-03-04T10:aa") == 0); + assert (b("1902-03-04T10:1aa") == 0); + assert (b("1985-04-12T10:15:30+0400") == 0); + assert (b("1985-04-12T10:15:30-05:4") == 0); + assert (b("1985-04-12T10:15:30-06:4b") == 0); + assert (b("19020304T05:06:07") == 0); + assert (b("1902-03-04T050607") == 0); + assert (b("19020304T05:06:07abcd") == 0); + assert (b("1902-03-04T050607abcd") == 0); + + // unimplemented: intervals, durations, recurring intervals + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/time/StopWatch.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/time/StopWatch.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,175 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Feb 2007: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.time.StopWatch; + +private import tango.core.Exception; + +/******************************************************************************* + +*******************************************************************************/ + +version (Win32) +{ + private extern (Windows) + { + int QueryPerformanceCounter (ulong *count); + int QueryPerformanceFrequency (ulong *frequency); + } +} + +version (Posix) +{ + private import tango.stdc.posix.sys.time; +} + +/******************************************************************************* + + Timer for measuring small intervals, such as the duration of a + subroutine or other reasonably small period. + --- + StopWatch elapsed; + + elapsed.start; + + // do something + // ... + + double i = elapsed.stop; + --- + + The measured interval is in units of seconds, using floating- + point to represent fractions. This approach is more flexible + than integer arithmetic since it migrates trivially to more + capable timer hardware (there no implicit granularity to the + measurable intervals, except the limits of fp representation) + + StopWatch is accurate to the extent of what the underlying OS + supports. On linux systems, this accuracy is typically 1 us at + best. Win32 is generally more precise. + + There is some minor overhead in using StopWatch, so take that into + account + +*******************************************************************************/ + +public struct StopWatch +{ + private ulong started; + private static double multiplier = 1.0 / 1_000_000.0; + + version (Win32) + private static double microsecond; + + /*********************************************************************** + + Start the timer + + ***********************************************************************/ + + void start () + { + started = timer; + } + + /*********************************************************************** + + Stop the timer and return elapsed duration since start() + + ***********************************************************************/ + + double stop () + { + return multiplier * (timer - started); + } + + /*********************************************************************** + + Return elapsed time since the last start() as microseconds + + ***********************************************************************/ + + ulong microsec () + { + version (Posix) + return (timer - started); + + version (Win32) + return cast(ulong) ((timer - started) * microsecond); + } + + /*********************************************************************** + + Setup timing information for later use + + ***********************************************************************/ + + static this() + { + version (Win32) + { + ulong freq; + + QueryPerformanceFrequency (&freq); + microsecond = 1_000_000.0 / freq; + multiplier = 1.0 / freq; + } + } + + /*********************************************************************** + + Return the current time as an Interval + + ***********************************************************************/ + + private static ulong timer () + { + version (Posix) + { + timeval tv; + if (gettimeofday (&tv, null)) + throw new PlatformException ("Timer :: linux timer is not available"); + + return (cast(ulong) tv.tv_sec * 1_000_000) + tv.tv_usec; + } + + version (Win32) + { + ulong now; + + if (! QueryPerformanceCounter (&now)) + throw new PlatformException ("high-resolution timer is not available"); + + return now; + } + } +} + + +/******************************************************************************* + +*******************************************************************************/ + +debug (StopWatch) +{ + import tango.io.Stdout; + + void main() + { + StopWatch t; + t.start; + + for (int i=0; i < 100_000_000; ++i) + {} + Stdout.format ("{:f9}", t.stop).newline; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/time/Time.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/time/Time.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,861 @@ +/****************************************************************************** + + copyright: Copyright (c) 2007 Tango. All rights reserved + + license: BSD style: $(LICENSE) + + version: mid 2005: Initial release + Apr 2007: heavily reshaped + Dec 2007: moved to tango.time + + author: John Chapman, Kris, scheivguy + +******************************************************************************/ + +module tango.time.Time; + +/****************************************************************************** + + This struct represents a length of time. The underlying representation is + in units of 100ns. This allows the length of time to span to roughly + +/- 10000 years. + + Notably missing from this is a representation of weeks, months and years. + This is because weeks, months, and years vary according to local calendars. + Use tango.time.chrono.* to deal with these concepts. + + Note: nobody should change this struct without really good reason as it is + required to be a part of some interfaces. It should be treated as a builtin + type. Also note that there is deliberately no opCall constructor here, since + it tends to produce too much overhead. + + Example: + ------------------- + Time start = Clock.now; + Thread.sleep(0.150); + Stdout.formatln("slept for {} ms", (Clock.now-start).millis); + ------------------- + + See_Also: tango.core.Thread, tango.time.Clock + +******************************************************************************/ + +struct TimeSpan +{ + // this is the only member of the struct. + package long ticks_; + + // useful constants. Shouldn't be used in normal code, use the + // static TimeSpan members below instead. i.e. instead of + // TimeSpan.TicksPerSecond, use TimeSpan.second.ticks + // + enum : long + { + /// basic tick values + NanosecondsPerTick = 100, + TicksPerMicrosecond = 1000 / NanosecondsPerTick, + TicksPerMillisecond = 1000 * TicksPerMicrosecond, + TicksPerSecond = 1000 * TicksPerMillisecond, + TicksPerMinute = 60 * TicksPerSecond, + TicksPerHour = 60 * TicksPerMinute, + TicksPerDay = 24 * TicksPerHour, + + // millisecond counts + MillisPerSecond = 1000, + MillisPerMinute = MillisPerSecond * 60, + MillisPerHour = MillisPerMinute * 60, + MillisPerDay = MillisPerHour * 24, + + /// day counts + DaysPerYear = 365, + DaysPer4Years = DaysPerYear * 4 + 1, + DaysPer100Years = DaysPer4Years * 25 - 1, + DaysPer400Years = DaysPer100Years * 4 + 1, + + // epoch counts + Epoch1601 = DaysPer400Years * 4 * TicksPerDay, + Epoch1970 = Epoch1601 + TicksPerSecond * 11644473600L, + } + + /** + * Minimum TimeSpan + */ + static const TimeSpan min = {long.min}; + + /** + * Maximum TimeSpan + */ + static const TimeSpan max = {long.max}; + + /** + * Zero TimeSpan. Useful for comparisons. + */ + static const TimeSpan zero = {0}; + + /** + * Get the number of ticks that this timespan represents. + */ + long ticks() + { + return ticks_; + } + + /** + * Determines whether two TimeSpan values are equal + */ + bool opEquals(TimeSpan t) + { + return ticks_ is t.ticks_; + } + + /** + * Compares this object against another TimeSpan value. + */ + int opCmp(TimeSpan t) + { + if (ticks_ < t.ticks_) + return -1; + + if (ticks_ > t.ticks_) + return 1; + + return 0; + } + + /** + * Add the TimeSpan given to this TimeSpan returning a new TimeSpan. + * + * Params: t = A TimeSpan value to add + * Returns: A TimeSpan value that is the sum of this instance and t. + */ + TimeSpan opAdd(TimeSpan t) + { + return TimeSpan(ticks_ + t.ticks_); + } + + /** + * Add the specified TimeSpan to this TimeSpan, assigning the result + * to this instance. + * + * Params: t = A TimeSpan value to add + * Returns: a copy of this instance after adding t. + */ + TimeSpan opAddAssign(TimeSpan t) + { + ticks_ += t.ticks_; + return *this; + } + + /** + * Subtract the specified TimeSpan from this TimeSpan. + * + * Params: t = A TimeSpan to subtract + * Returns: A new timespan which is the difference between this + * instance and t + */ + TimeSpan opSub(TimeSpan t) + { + return TimeSpan(ticks_ - t.ticks_); + } + + /** + * + * Subtract the specified TimeSpan from this TimeSpan and assign the + * value to this TimeSpan. + * + * Params: t = A TimeSpan to subtract + * Returns: A copy of this instance after subtracting t. + */ + TimeSpan opSubAssign(TimeSpan t) + { + ticks_ -= t.ticks_; + return *this; + } + + /** + * Scale the TimeSpan by the specified amount. This should not be + * used to convert to a different unit. Use the unit accessors + * instead. This should only be used as a scaling mechanism. For + * example, if you have a timeout and you want to sleep for twice the + * timeout, you would use timeout * 2. + * + * Params: v = A multiplier to use for scaling this time span. + * Returns: A new TimeSpan that is scaled by v + */ + TimeSpan opMul(long v) + { + return TimeSpan(ticks_ * v); + } + + /** + * Scales this TimeSpan and assigns the result to this instance. + * + * Params: v = A multipler to use for scaling + * Returns: A copy of this instance after scaling + */ + TimeSpan opMulAssign(long v) + { + ticks_ *= v; + return *this; + } + + /** + * Divide the TimeSpan by the specified amount. This should not be + * used to convert to a different unit. Use the unit accessors + * instead. This should only be used as a scaling mechanism. For + * example, if you have a timeout and you want to sleep for half the + * timeout, you would use timeout / 2. + * + * + * Params: v = A divisor to use for scaling this time span. + * Returns: A new TimeSpan that is divided by v + */ + TimeSpan opDiv(long v) + { + return TimeSpan(ticks_ / v); + } + + /** + * Divides this TimeSpan and assigns the result to this instance. + * + * Params: v = A multipler to use for dividing + * Returns: A copy of this instance after dividing + */ + TimeSpan opDivAssign(long v) + { + ticks_ /= v; + return *this; + } + + /** + * Perform integer division with the given time span. + * + * Params: t = A divisor used for dividing + * Returns: The result of integer division between this instance and + * t. + */ + long opDiv(TimeSpan t) + { + return ticks_ / t.ticks; + } + + /** + * Negate a time span + * + * Returns: The negative equivalent to this time span + */ + TimeSpan opNeg() + { + return TimeSpan(-ticks_); + } + + /** + * Convert to nanoseconds + * + * Note: this may incur loss of data because nanoseconds cannot + * represent the range of data a TimeSpan can represent. + * + * Returns: The number of nanoseconds that this TimeSpan represents. + */ + long nanos() + { + return ticks_ * NanosecondsPerTick; + } + + /** + * Convert to microseconds + * + * Returns: The number of microseconds that this TimeSpan represents. + */ + long micros() + { + return ticks_ / TicksPerMicrosecond; + } + + /** + * Convert to milliseconds + * + * Returns: The number of milliseconds that this TimeSpan represents. + */ + long millis() + { + return ticks_ / TicksPerMillisecond; + } + + /** + * Convert to seconds + * + * Returns: The number of seconds that this TimeSpan represents. + */ + long seconds() + { + return ticks_ / TicksPerSecond; + } + + /** + * Convert to minutes + * + * Returns: The number of minutes that this TimeSpan represents. + */ + long minutes() + { + return ticks_ / TicksPerMinute; + } + + /** + * Convert to hours + * + * Returns: The number of hours that this TimeSpan represents. + */ + long hours() + { + return ticks_ / TicksPerHour; + } + + /** + * Convert to days + * + * Returns: The number of days that this TimeSpan represents. + */ + long days() + { + return ticks_ / TicksPerDay; + } + + /** + * Convert to a floating point interval representing seconds. + * + * Note: This may cause a loss of precision as a double cannot exactly + * represent some fractional values. + * + * Returns: An interval representing the seconds and fractional + * seconds that this TimeSpan represents. + */ + double interval() + { + return (cast(double) ticks_) / TicksPerSecond; + } + + /** + * Convert to TimeOfDay + * + * Returns: the TimeOfDay this TimeSpan represents. + */ + TimeOfDay time() + { + return TimeOfDay(ticks_); + } + + /** + * Construct a TimeSpan from the given number of nanoseconds + * + * Note: This may cause a loss of data since a TimeSpan's resolution + * is in 100ns increments. + * + * Params: value = The number of nanoseconds. + * Returns: A TimeSpan representing the given number of nanoseconds. + */ + static TimeSpan nanos(long value) + { + return TimeSpan(value / NanosecondsPerTick); + } + + /** + * Construct a TimeSpan from the given number of microseconds + * + * Params: value = The number of microseconds. + * Returns: A TimeSpan representing the given number of microseconds. + */ + static TimeSpan micros(long value) + { + return TimeSpan(TicksPerMicrosecond * value); + } + + /** + * Construct a TimeSpan from the given number of milliseconds + * + * Params: value = The number of milliseconds. + * Returns: A TimeSpan representing the given number of milliseconds. + */ + static TimeSpan millis(long value) + { + return TimeSpan(TicksPerMillisecond * value); + } + + /** + * Construct a TimeSpan from the given number of seconds + * + * Params: value = The number of seconds. + * Returns: A TimeSpan representing the given number of seconds. + */ + static TimeSpan seconds(long value) + { + return TimeSpan(TicksPerSecond * value); + } + + /** + * Construct a TimeSpan from the given number of minutes + * + * Params: value = The number of minutes. + * Returns: A TimeSpan representing the given number of minutes. + */ + static TimeSpan minutes(long value) + { + return TimeSpan(TicksPerMinute * value); + } + + /** + * Construct a TimeSpan from the given number of hours + * + * Params: value = The number of hours. + * Returns: A TimeSpan representing the given number of hours. + */ + static TimeSpan hours(long value) + { + return TimeSpan(TicksPerHour * value); + } + + /** + * Construct a TimeSpan from the given number of days + * + * Params: value = The number of days. + * Returns: A TimeSpan representing the given number of days. + */ + static TimeSpan days(long value) + { + return TimeSpan(TicksPerDay * value); + } + + /** + * Construct a TimeSpan from the given interval. The interval + * represents seconds as a double. This allows both whole and + * fractional seconds to be passed in. + * + * Params: value = The interval to convert in seconds. + * Returns: A TimeSpan representing the given interval. + */ + static TimeSpan interval(double sec) + { + return TimeSpan(cast(long)(sec * TicksPerSecond + .1)); + } +} + + +/****************************************************************************** + + Represents a point in time. + + Remarks: Time represents dates and times between 12:00:00 + midnight on January 1, 10000 BC and 11:59:59 PM on December 31, + 9999 AD. + + Time values are measured in 100-nanosecond intervals, or ticks. + A date value is the number of ticks that have elapsed since + 12:00:00 midnight on January 1, 0001 AD in the Gregorian + calendar. + + Negative Time values are offsets from that same reference point, + but backwards in history. Time values are not specific to any + calendar, but for an example, the beginning of December 31, 1 BC + in the Gregorian calendar is Time.epoch - TimeSpan.days(1). + +******************************************************************************/ + +struct Time +{ + private long ticks_; + + private enum : long + { + maximum = (TimeSpan.DaysPer400Years * 25 - 366) * TimeSpan.TicksPerDay - 1, + minimum = -((TimeSpan.DaysPer400Years * 25 - 366) * TimeSpan.TicksPerDay - 1), + } + + /// Represents the smallest and largest Time value. + static const Time min = {minimum}, + max = {maximum}, + epoch = {0}, + epoch1601 = {TimeSpan.Epoch1601}, + epoch1970 = {TimeSpan.Epoch1970}; + + /********************************************************************** + + $(I Property.) Retrieves the number of ticks for this Time + + Returns: A long represented by the time of this + instance. + + **********************************************************************/ + + long ticks () + { + return ticks_; + } + + /********************************************************************** + + Determines whether two Time values are equal. + + Params: value = A Time _value. + Returns: true if both instances are equal; otherwise, false + + **********************************************************************/ + + int opEquals (Time t) + { + return ticks_ is t.ticks_; + } + + /********************************************************************** + + Compares two Time values. + + **********************************************************************/ + + int opCmp (Time t) + { + if (ticks_ < t.ticks_) + return -1; + + if (ticks_ > t.ticks_) + return 1; + + return 0; + } + + /********************************************************************** + + Adds the specified time span to the time, returning a new + time. + + Params: t = A TimeSpan value. + Returns: A Time that is the sum of this instance and t. + + **********************************************************************/ + + Time opAdd (TimeSpan t) + { + return Time (ticks_ + t.ticks_); + } + + /********************************************************************** + + Adds the specified time span to the time, assigning + the result to this instance. + + Params: t = A TimeSpan value. + Returns: The current Time instance, with t added to the + time. + + **********************************************************************/ + + Time opAddAssign (TimeSpan t) + { + ticks_ += t.ticks_; + return *this; + } + + /********************************************************************** + + Subtracts the specified time span from the time, + returning a new time. + + Params: t = A TimeSpan value. + Returns: A Time whose value is the value of this instance + minus the value of t. + + **********************************************************************/ + + Time opSub (TimeSpan t) + { + return Time (ticks_ - t.ticks_); + } + + /********************************************************************** + + Returns a time span which represents the difference in time + between this and the given Time. + + Params: t = A Time value. + Returns: A TimeSpan which represents the difference between + this and t. + + **********************************************************************/ + + TimeSpan opSub (Time t) + { + return TimeSpan(ticks_ - t.ticks_); + } + + /********************************************************************** + + Subtracts the specified time span from the time, + assigning the result to this instance. + + Params: t = A TimeSpan value. + Returns: The current Time instance, with t subtracted + from the time. + + **********************************************************************/ + + Time opSubAssign (TimeSpan t) + { + ticks_ -= t.ticks_; + return *this; + } + + /********************************************************************** + + $(I Property.) Retrieves the date component. + + Returns: A new Time instance with the same date as + this instance, but with the time trucated. + + **********************************************************************/ + + Time date () + { + return *this - TimeOfDay.modulo24(ticks_); + } + + /********************************************************************** + + $(I Property.) Retrieves the time of day. + + Returns: A TimeOfDay representing the fraction of the day + elapsed since midnight. + + **********************************************************************/ + + TimeOfDay time () + { + return TimeOfDay (ticks_); + } + + /********************************************************************** + + $(I Property.) Retrieves the equivalent TimeSpan. + + Returns: A TimeSpan representing this Time. + + **********************************************************************/ + + TimeSpan span () + { + return TimeSpan (ticks_); + } +} + + +/****************************************************************************** + + Represents a time of day. This is different from TimeSpan in that + each component is represented within the limits of everyday time, + rather than from the start of the Epoch. Effectively, the TimeOfDay + epoch is the first second of each day. + + This is handy for dealing strictly with a 24-hour clock instead of + potentially thousands of years. For example: + --- + auto time = Clock.now.time; + assert (time.millis < 1000); + assert (time.seconds < 60); + assert (time.minutes < 60); + assert (time.hours < 24); + --- + + You can create a TimeOfDay from an existing Time or TimeSpan instance + via the respective time() method. To convert back to a TimeSpan, use + the span() method + +******************************************************************************/ + +struct TimeOfDay +{ + public uint hours, + minutes, + seconds, + millis; + + /** + * constructor. + * Params: hours = number of hours since midnight + * minutes = number of minutes into the hour + * seconds = number of seconds into the minute + * millis = number of milliseconds into the second + * + * Returns: a TimeOfDay representing the given time fields. + */ + static TimeOfDay opCall (uint hours, uint minutes, uint seconds, uint millis=0) + { + TimeOfDay t = void; + t.hours = hours; + t.minutes = minutes; + t.seconds = seconds; + t.millis = millis; + return t; + } + + /** + * constructor. + * Params: ticks = ticks representing a Time value. This is normalized + * so that it represent a time of day (modulo-24 etc) + * + * Returns: a TimeOfDay value that corresponds to the time of day of + * the given number of ticks. + */ + static TimeOfDay opCall (long ticks) + { + TimeOfDay t = void; + ticks = modulo24(ticks).ticks_; + t.millis = cast(uint) (ticks / TimeSpan.TicksPerMillisecond); + t.seconds = (t.millis / 1_000) % 60; + t.minutes = (t.millis / 60_000) % 60; + t.hours = (t.millis / 3_600_000) % 24; + t.millis %= 1000; + return t; + } + + /** + * construct a TimeSpan from the current fields + * + * Returns: a TimeOfDay representing the field values. + * + * Note: that fields are not checked against a valid range, so + * setting 60 for minutes is allowed, and will just add 1 to the hour + * component, and set the minute component to 0. The result is + * normalized, so the hours wrap. If you pass in 25 hours, the + * resulting TimeOfDay will have a hour component of 1. + */ + TimeSpan span () + { + return TimeSpan.hours(hours) + + TimeSpan.minutes(minutes) + + TimeSpan.seconds(seconds) + + TimeSpan.millis(millis); + } + + /** + * internal routine to adjust ticks by one day. Also adjusts for + * offsets in the BC era + */ + package static TimeSpan modulo24 (long ticks) + { + ticks %= TimeSpan.TicksPerDay; + if (ticks < 0) + ticks += TimeSpan.TicksPerDay; + return TimeSpan (ticks); + } +} + +/****************************************************************************** + + Generic Date representation + +******************************************************************************/ + +struct Date +{ + public uint era, /// AD, BC + day, /// 1 .. 31 + year, /// 0 to 9999 + month, /// 1 .. 12 + dow, /// 0 .. 6 + doy; /// 1 .. 366 +} + + +/****************************************************************************** + + Combination of a Date and a TimeOfDay + +******************************************************************************/ + +struct DateTime +{ + public Date date; /// date representation + public TimeOfDay time; /// time representation +} + + + + +/****************************************************************************** + +******************************************************************************/ + +debug (UnitTest) +{ + unittest + { + assert(TimeSpan.zero > TimeSpan.min); + assert(TimeSpan.max > TimeSpan.zero); + assert(TimeSpan.max > TimeSpan.min); + assert(TimeSpan.zero >= TimeSpan.zero); + assert(TimeSpan.zero <= TimeSpan.zero); + assert(TimeSpan.max >= TimeSpan.max); + assert(TimeSpan.max <= TimeSpan.max); + assert(TimeSpan.min >= TimeSpan.min); + assert(TimeSpan.min <= TimeSpan.min); + + assert (TimeSpan.seconds(50).seconds is 50); + assert (TimeSpan.seconds(5000).seconds is 5000); + assert (TimeSpan.minutes(50).minutes is 50); + assert (TimeSpan.minutes(5000).minutes is 5000); + assert (TimeSpan.hours(23).hours is 23); + assert (TimeSpan.hours(5000).hours is 5000); + assert (TimeSpan.days(6).days is 6); + assert (TimeSpan.days(5000).days is 5000); + + assert (TimeSpan.seconds(50).time.seconds is 50); + assert (TimeSpan.seconds(5000).time.seconds is 5000 % 60); + assert (TimeSpan.minutes(50).time.minutes is 50); + assert (TimeSpan.minutes(5000).time.minutes is 5000 % 60); + assert (TimeSpan.hours(23).time.hours is 23); + assert (TimeSpan.hours(5000).time.hours is 5000 % 24); + + auto tod = TimeOfDay (25, 2, 3, 4); + tod = tod.span.time; + assert (tod.hours is 1); + assert (tod.minutes is 2); + assert (tod.seconds is 3); + assert (tod.millis is 4); + } +} + + +/******************************************************************************* + +*******************************************************************************/ + +debug (Time) +{ + import tango.io.Stdout; + import tango.time.Clock; + import tango.time.chrono.Gregorian; + + Time foo() + { + auto d = Time(10); + auto e = TimeSpan(20); + + return d + e; + } + + void main() + { + auto c = foo(); + Stdout (c.ticks).newline; + + + auto t = TimeSpan(1); + auto h = t.hours; + auto m = t.time.minutes; + + auto now = Clock.now; + auto time = now.time; + auto date = Gregorian.generic.toDate (now); + now = Gregorian.generic.toTime (date, time); + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/time/WallClock.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/time/WallClock.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,270 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Apr 2007: split away from utc + + author: Kris + +*******************************************************************************/ + +module tango.time.WallClock; + +public import tango.time.Time; + +private import tango.time.Clock; + +private import tango.sys.Common; + +/****************************************************************************** + + Exposes wall-time relative to Jan 1st, 1 AD. These values are + based upon a clock-tick of 100ns, giving them a span of greater + than 10,000 years. These Units of time are the foundation of most + time and date functionality in Tango. + + Please note that conversion between UTC and Wall time is performed + in accordance with the OS facilities. In particular, Win32 systems + behave differently to Posix when calculating daylight-savings time + (Win32 calculates with respect to the time of the call, whereas a + Posix system calculates based on a provided point in time). Posix + systems should typically have the TZ environment variable set to + a valid descriptor. + +*******************************************************************************/ + +struct WallClock +{ + version (Win32) + { + /*************************************************************** + + Return the current local time + + ***************************************************************/ + + static Time now () + { + return Clock.now - localBias; + } + + /*************************************************************** + + Return the timezone relative to GMT. The value is + negative when west of GMT + + ***************************************************************/ + + static TimeSpan zone () + { + TIME_ZONE_INFORMATION tz = void; + + auto tmp = GetTimeZoneInformation (&tz); + return TimeSpan.minutes(-tz.Bias); + } + + /*************************************************************** + + Set fields to represent a local version of the + current UTC time. All values must fall within + the domain supported by the OS + + ***************************************************************/ + + static DateTime toDate () + { + return toDate (Clock.now); + } + + /*************************************************************** + + Set fields to represent a local version of the + provided UTC time. All values must fall within + the domain supported by the OS + + ***************************************************************/ + + static DateTime toDate (Time utc) + { + return Clock.toDate (utc - localBias); + } + + /*************************************************************** + + Convert Date fields to local time + + ***************************************************************/ + + static Time fromDate (inout DateTime date) + { + return (Clock.fromDate(date) + localBias); + } + + /*************************************************************** + + Retrieve the local bias, including DST adjustment. + Note that Win32 calculates DST at the time of call + rather than based upon a point in time represented + by an argument. + + ***************************************************************/ + + private static TimeSpan localBias () + { + int bias; + TIME_ZONE_INFORMATION tz = void; + + switch (GetTimeZoneInformation (&tz)) + { + default: + bias = tz.Bias; + break; + case 1: + bias = tz.Bias + tz.StandardBias; + break; + case 2: + bias = tz.Bias + tz.DaylightBias; + break; + } + + return TimeSpan.minutes(bias); + } + } + + version (Posix) + { + /*************************************************************** + + Return the current local time + + ***************************************************************/ + + static Time now () + { + tm t = void; + timeval tv = void; + gettimeofday (&tv, null); + localtime_r (&tv.tv_sec, &t); + tv.tv_sec = timegm (&t); + return Clock.convert (tv); + } + + /*************************************************************** + + Return the timezone relative to GMT. The value is + negative when west of GMT + + ***************************************************************/ + + static TimeSpan zone () + { + version (darwin) + { + timezone_t tz = void; + gettimeofday (null, &tz); + return TimeSpan.minutes(-tz.tz_minuteswest); + } + else + return TimeSpan.seconds(-timezone); + } + + /*************************************************************** + + Set fields to represent a local version of the + current UTC time. All values must fall within + the domain supported by the OS + + ***************************************************************/ + + static DateTime toDate () + { + return toDate (Clock.now); + } + + /*************************************************************** + + Set fields to represent a local version of the + provided UTC time. All values must fall within + the domain supported by the OS + + ***************************************************************/ + + static DateTime toDate (Time utc) + { + DateTime dt = void; + auto timeval = Clock.convert (utc); + dt.time.millis = timeval.tv_usec / 1000; + + tm t = void; + localtime_r (&timeval.tv_sec, &t); + + dt.date.year = t.tm_year + 1900; + dt.date.month = t.tm_mon + 1; + dt.date.day = t.tm_mday; + dt.date.dow = t.tm_wday; + dt.date.doy = 0; + dt.date.era = 0; + dt.time.hours = t.tm_hour; + dt.time.minutes = t.tm_min; + dt.time.seconds = t.tm_sec; + return dt; + } + + /*************************************************************** + + Convert Date fields to local time + + ***************************************************************/ + + static Time fromDate (inout DateTime dt) + { + tm t = void; + + t.tm_year = dt.date.year - 1900; + t.tm_mon = dt.date.month - 1; + t.tm_mday = dt.date.day; + t.tm_hour = dt.time.hours; + t.tm_min = dt.time.minutes; + t.tm_sec = dt.time.seconds; + + auto seconds = mktime (&t); + return Time.epoch1970 + TimeSpan.seconds(seconds) + + TimeSpan.millis(dt.time.millis); + } + } + + /*********************************************************************** + + ***********************************************************************/ + + static Time toLocal (Time utc) + { + auto mod = utc.ticks % TimeSpan.TicksPerMillisecond; + return Clock.fromDate(toDate(utc)) + TimeSpan(mod); + } + + /*********************************************************************** + + ***********************************************************************/ + + static Time toUtc (Time wall) + { + auto mod = wall.ticks % TimeSpan.TicksPerMillisecond; + return fromDate(Clock.toDate(wall)) + TimeSpan(mod); + } +} + + +version (Posix) +{ + version (darwin) {} + else + { + static this() + { + tzset(); + } + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/time/chrono/Calendar.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/time/chrono/Calendar.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,352 @@ +/******************************************************************************* + + copyright: Copyright (c) 2005 John Chapman. All rights reserved + + license: BSD style: $(LICENSE) + + version: Mid 2005: Initial release + Apr 2007: reshaped + + author: John Chapman, Kris + +******************************************************************************/ + +module tango.time.chrono.Calendar; + +public import tango.time.Time; + +private import tango.core.Exception; + + + +/** + * $(ANCHOR _Calendar) + * Represents time in week, month and year divisions. + * Remarks: Calendar is the abstract base class for the following Calendar implementations: + * $(LINK2 #Gregorian, Gregorian), $(LINK2 #Hebrew, Hebrew), $(LINK2 #Hijri, Hijri), + * $(LINK2 #Japanese, Japanese), $(LINK2 #Korean, Korean), $(LINK2 #Taiwan, Taiwan) and + * $(LINK2 #ThaiBuddhist, ThaiBuddhist). + */ +public abstract class Calendar +{ + /** + * Indicates the current era of the calendar. + */ + package enum {CURRENT_ERA = 0}; + + // Corresponds to Win32 calendar IDs + package enum + { + GREGORIAN = 1, + GREGORIAN_US = 2, + JAPAN = 3, + TAIWAN = 4, + KOREA = 5, + HIJRI = 6, + THAI = 7, + HEBREW = 8, + GREGORIAN_ME_FRENCH = 9, + GREGORIAN_ARABIC = 10, + GREGORIAN_XLIT_ENGLISH = 11, + GREGORIAN_XLIT_FRENCH = 12 + } + + package enum WeekRule + { + FirstDay, /// Indicates that the first week of the year is the first week containing the first day of the year. + FirstFullWeek, /// Indicates that the first week of the year is the first full week following the first day of the year. + FirstFourDayWeek /// Indicates that the first week of the year is the first week containing at least four days. + } + + package enum DatePart + { + Year, + Month, + Day, + DayOfYear + } + + public enum DayOfWeek + { + Sunday, /// Indicates _Sunday. + Monday, /// Indicates _Monday. + Tuesday, /// Indicates _Tuesday. + Wednesday, /// Indicates _Wednesday. + Thursday, /// Indicates _Thursday. + Friday, /// Indicates _Friday. + Saturday /// Indicates _Saturday. + } + + + /** + * Get the components of a Time structure using the rules of the + * calendar. This is useful if you want more than one of the given + * components. Note that this doesn't handle the time of day, as that + * is calculated directly from the Time struct. + * + * The default implemenation is to call all the other accessors + * directly, a derived class may override if it has a more efficient + * method. + */ + Date toDate (Time time) + { + Date d; + split (time, d.year, d.month, d.day, d.doy, d.dow, d.era); + return d; + } + + /** + * Get the components of a Time structure using the rules of the + * calendar. This is useful if you want more than one of the given + * components. Note that this doesn't handle the time of day, as that + * is calculated directly from the Time struct. + * + * The default implemenation is to call all the other accessors + * directly, a derived class may override if it has a more efficient + * method. + */ + void split (Time time, ref uint year, ref uint month, ref uint day, ref uint doy, ref uint dow, ref uint era) + { + year = getYear(time); + month = getMonth(time); + day = getDayOfMonth(time); + doy = getDayOfYear(time); + dow = getDayOfWeek(time); + era = getEra(time); + } + + /** + * Returns a Time value set to the specified date and time in the current era. + * Params: + * year = An integer representing the _year. + * month = An integer representing the _month. + * day = An integer representing the _day. + * hour = An integer representing the _hour. + * minute = An integer representing the _minute. + * second = An integer representing the _second. + * millisecond = An integer representing the _millisecond. + * Returns: The Time set to the specified date and time. + */ + Time toTime (uint year, uint month, uint day, uint hour, uint minute, uint second, uint millisecond=0) + { + return toTime (year, month, day, hour, minute, second, millisecond, CURRENT_ERA); + } + + Time toTime (Date d) + { + return toTime (d.year, d.month, d.day, 0, 0, 0, 0, d.era); + } + + Time toTime (DateTime dt) + { + return toTime (dt.date, dt.time); + } + + Time toTime (Date d, TimeOfDay t) + { + return toTime (d.year, d.month, d.day, t.hours, t.minutes, t.seconds, t.millis, d.era); + } + + /** + * When overridden, returns a Time value set to the specified date and time in the specified _era. + * Params: + * year = An integer representing the _year. + * month = An integer representing the _month. + * day = An integer representing the _day. + * hour = An integer representing the _hour. + * minute = An integer representing the _minute. + * second = An integer representing the _second. + * millisecond = An integer representing the _millisecond. + * era = An integer representing the _era. + * Returns: A Time set to the specified date and time. + */ + abstract Time toTime (uint year, uint month, uint day, uint hour, uint minute, uint second, uint millisecond, uint era); + + /** + * When overridden, returns the day of the week in the specified Time. + * Params: time = A Time value. + * Returns: A DayOfWeek value representing the day of the week of time. + */ + abstract DayOfWeek getDayOfWeek (Time time); + + /** + * When overridden, returns the day of the month in the specified Time. + * Params: time = A Time value. + * Returns: An integer representing the day of the month of time. + */ + abstract uint getDayOfMonth (Time time); + + /** + * When overridden, returns the day of the year in the specified Time. + * Params: time = A Time value. + * Returns: An integer representing the day of the year of time. + */ + abstract uint getDayOfYear (Time time); + + /** + * When overridden, returns the month in the specified Time. + * Params: time = A Time value. + * Returns: An integer representing the month in time. + */ + abstract uint getMonth (Time time); + + /** + * When overridden, returns the year in the specified Time. + * Params: time = A Time value. + * Returns: An integer representing the year in time. + */ + abstract uint getYear (Time time); + + /** + * When overridden, returns the era in the specified Time. + * Params: time = A Time value. + * Returns: An integer representing the ear in time. + */ + abstract uint getEra (Time time); + + /** + * Returns the number of days in the specified _year and _month of the current era. + * Params: + * year = An integer representing the _year. + * month = An integer representing the _month. + * Returns: The number of days in the specified _year and _month of the current era. + */ + uint getDaysInMonth (uint year, uint month) + { + return getDaysInMonth (year, month, CURRENT_ERA); + } + + /** + * When overridden, returns the number of days in the specified _year and _month of the specified _era. + * Params: + * year = An integer representing the _year. + * month = An integer representing the _month. + * era = An integer representing the _era. + * Returns: The number of days in the specified _year and _month of the specified _era. + */ + abstract uint getDaysInMonth (uint year, uint month, uint era); + + /** + * Returns the number of days in the specified _year of the current era. + * Params: year = An integer representing the _year. + * Returns: The number of days in the specified _year in the current era. + */ + uint getDaysInYear (uint year) + { + return getDaysInYear (year, CURRENT_ERA); + } + + /** + * When overridden, returns the number of days in the specified _year of the specified _era. + * Params: + * year = An integer representing the _year. + * era = An integer representing the _era. + * Returns: The number of days in the specified _year in the specified _era. + */ + abstract uint getDaysInYear (uint year, uint era); + + /** + * Returns the number of months in the specified _year of the current era. + * Params: year = An integer representing the _year. + * Returns: The number of months in the specified _year in the current era. + */ + uint getMonthsInYear (uint year) + { + return getMonthsInYear (year, CURRENT_ERA); + } + + /** + * When overridden, returns the number of months in the specified _year of the specified _era. + * Params: + * year = An integer representing the _year. + * era = An integer representing the _era. + * Returns: The number of months in the specified _year in the specified _era. + */ + abstract uint getMonthsInYear (uint year, uint era); + + /** + * Returns the week of the year that includes the specified Time. + * Params: + * time = A Time value. + * rule = A WeekRule value defining a calendar week. + * firstDayOfWeek = A DayOfWeek value representing the first day of the week. + * Returns: An integer representing the week of the year that includes the date in time. + */ + uint getWeekOfYear (Time time, WeekRule rule, DayOfWeek firstDayOfWeek) + { + auto year = getYear (time); + auto jan1 = cast(int) getDayOfWeek (toTime (year, 1, 1, 0, 0, 0, 0)); + + switch (rule) + { + case WeekRule.FirstDay: + int n = jan1 - cast(int) firstDayOfWeek; + if (n < 0) + n += 7; + return (getDayOfYear (time) + n - 1) / 7 + 1; + + case WeekRule.FirstFullWeek: + case WeekRule.FirstFourDayWeek: + int fullDays = (rule is WeekRule.FirstFullWeek) ? 7 : 4; + int n = cast(int) firstDayOfWeek - jan1; + if (n != 0) + { + if (n < 0) + n += 7; + else + if (n >= fullDays) + n -= 7; + } + + int day = getDayOfYear (time) - n; + if (day > 0) + return (day - 1) / 7 + 1; + year = getYear(time) - 1; + int month = getMonthsInYear (year); + day = getDaysInMonth (year, month); + return getWeekOfYear(toTime(year, month, day, 0, 0, 0, 0), rule, firstDayOfWeek); + + default: + break; + } + throw new IllegalArgumentException("Value was out of range."); + } + + /** + * Indicates whether the specified _year in the current era is a leap _year. + * Params: year = An integer representing the _year. + * Returns: true is the specified _year is a leap _year; otherwise, false. + */ + bool isLeapYear(uint year) + { + return isLeapYear(year, CURRENT_ERA); + } + + /** + * When overridden, indicates whether the specified _year in the specified _era is a leap _year. + * Params: year = An integer representing the _year. + * Params: era = An integer representing the _era. + * Returns: true is the specified _year is a leap _year; otherwise, false. + */ + abstract bool isLeapYear(uint year, uint era); + + /** + * $(I Property.) When overridden, retrieves the list of eras in the current calendar. + * Returns: An integer array representing the eras in the current calendar. + */ + abstract uint[] eras(); + + /** + * $(I Property.) Retrieves the identifier associated with the current calendar. + * Returns: An integer representing the identifier of the current calendar. + */ + uint id() + { + return -1; + } + + package static long getTimeTicks (uint hour, uint minute, uint second) + { + return (TimeSpan.hours(hour) + TimeSpan.minutes(minute) + TimeSpan.seconds(second)).ticks; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/time/chrono/Gregorian.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/time/chrono/Gregorian.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,414 @@ +/******************************************************************************* + + copyright: Copyright (c) 2005 John Chapman. All rights reserved + + license: BSD style: $(LICENSE) + + version: Mid 2005: Initial release + Apr 2007: reshaped + + author: John Chapman, Kris, schveiguy + +******************************************************************************/ + +module tango.time.chrono.Gregorian; + +private import tango.time.chrono.Calendar; + +/** + * $(ANCHOR _Gregorian) + * Represents the Gregorian calendar. + * + * Note that this is the Proleptic Gregorian calendar. Most calendars assume + * that dates before 9/14/1752 were Julian Dates. Julian differs from + * Gregorian in that leap years occur every 4 years, even on 100 year + * increments. The Proleptic Gregorian calendar applies the Gregorian leap + * year rules to dates before 9/14/1752, making the calculation of dates much + * easier. + */ +class Gregorian : Calendar +{ + // import baseclass toTime() + alias Calendar.toTime toTime; + + /// static shared instance + public static Gregorian generic; + + enum Type + { + Localized = 1, /// Refers to the localized version of the Gregorian calendar. + USEnglish = 2, /// Refers to the US English version of the Gregorian calendar. + MiddleEastFrench = 9, /// Refers to the Middle East French version of the Gregorian calendar. + Arabic = 10, /// Refers to the _Arabic version of the Gregorian calendar. + TransliteratedEnglish = 11, /// Refers to the transliterated English version of the Gregorian calendar. + TransliteratedFrench = 12 /// Refers to the transliterated French version of the Gregorian calendar. + } + + private Type type_; + + /** + * Represents the current era. + */ + enum {AD_ERA = 1, BC_ERA = 2, MAX_YEAR = 9999}; + + private static final uint[] DaysToMonthCommon = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365]; + + private static final uint[] DaysToMonthLeap = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366]; + + /** + * create a generic instance of this calendar + */ + static this() + { + generic = new Gregorian; + } + + /** + * Initializes an instance of the Gregorian class using the specified GregorianTypes value. If no value is + * specified, the default is Gregorian.Types.Localized. + */ + this (Type type = Type.Localized) + { + type_ = type; + } + + /** + * Overridden. Returns a Time value set to the specified date and time in the specified _era. + * Params: + * year = An integer representing the _year. + * month = An integer representing the _month. + * day = An integer representing the _day. + * hour = An integer representing the _hour. + * minute = An integer representing the _minute. + * second = An integer representing the _second. + * millisecond = An integer representing the _millisecond. + * era = An integer representing the _era. + * Returns: A Time set to the specified date and time. + */ + override Time toTime (uint year, uint month, uint day, uint hour, uint minute, uint second, uint millisecond, uint era) + { + return Time (getDateTicks(year, month, day, era) + getTimeTicks(hour, minute, second)) + TimeSpan.millis(millisecond); + } + + /** + * Overridden. Returns the day of the week in the specified Time. + * Params: time = A Time value. + * Returns: A DayOfWeek value representing the day of the week of time. + */ + override DayOfWeek getDayOfWeek(Time time) + { + int dow; + if(time.ticks < 0) + { + dow = ((time.ticks + 1) / TimeSpan.TicksPerDay) % 7; + if(dow < 0) + dow += 7; + } + else + dow = (time.ticks / TimeSpan.TicksPerDay + 1) % 7; + return cast(DayOfWeek)dow; + } + + /** + * Overridden. Returns the day of the month in the specified Time. + * Params: time = A Time value. + * Returns: An integer representing the day of the month of time. + */ + override uint getDayOfMonth(Time time) + { + return extractPart(time.ticks, DatePart.Day); + } + + /** + * Overridden. Returns the day of the year in the specified Time. + * Params: time = A Time value. + * Returns: An integer representing the day of the year of time. + */ + override uint getDayOfYear(Time time) + { + return extractPart(time.ticks, DatePart.DayOfYear); + } + + /** + * Overridden. Returns the month in the specified Time. + * Params: time = A Time value. + * Returns: An integer representing the month in time. + */ + override uint getMonth(Time time) + { + return extractPart(time.ticks, DatePart.Month); + } + + /** + * Overridden. Returns the year in the specified Time. + * Params: time = A Time value. + * Returns: An integer representing the year in time. + */ + override uint getYear(Time time) + { + return extractPart(time.ticks, DatePart.Year); + } + + /** + * Overridden. Returns the era in the specified Time. + * Params: time = A Time value. + * Returns: An integer representing the era in time. + */ + override uint getEra(Time time) + { + if(time < time.epoch) + return BC_ERA; + else + return AD_ERA; + } + + /** + * Overridden. Returns the number of days in the specified _year and _month of the specified _era. + * Params: + * year = An integer representing the _year. + * month = An integer representing the _month. + * era = An integer representing the _era. + * Returns: The number of days in the specified _year and _month of the specified _era. + */ + override uint getDaysInMonth(uint year, uint month, uint era) + { + auto monthDays = isLeapYear(year, era) ? DaysToMonthLeap : DaysToMonthCommon; + return monthDays[month] - monthDays[month - 1]; + } + + /** + * Overridden. Returns the number of days in the specified _year of the specified _era. + * Params: + * year = An integer representing the _year. + * era = An integer representing the _era. + * Returns: The number of days in the specified _year in the specified _era. + */ + override uint getDaysInYear(uint year, uint era) + { + return isLeapYear(year, era) ? 366 : 365; + } + + /** + * Overridden. Returns the number of months in the specified _year of the specified _era. + * Params: + * year = An integer representing the _year. + * era = An integer representing the _era. + * Returns: The number of months in the specified _year in the specified _era. + */ + override uint getMonthsInYear(uint year, uint era) + { + return 12; + } + + /** + * Overridden. Indicates whether the specified _year in the specified _era is a leap _year. + * Params: year = An integer representing the _year. + * Params: era = An integer representing the _era. + * Returns: true is the specified _year is a leap _year; otherwise, false. + */ + override bool isLeapYear(uint year, uint era) + { + return staticIsLeapYear(year, era); + } + + /** + * $(I Property.) Retrieves the GregorianTypes value indicating the language version of the Gregorian. + * Returns: The Gregorian.Type value indicating the language version of the Gregorian. + */ + Type calendarType() + { + return type_; + } + + /** + * $(I Property.) Overridden. Retrieves the list of eras in the current calendar. + * Returns: An integer array representing the eras in the current calendar. + */ + override uint[] eras() + { + uint[] tmp = [AD_ERA, BC_ERA]; + return tmp.dup; + } + + /** + * $(I Property.) Overridden. Retrieves the identifier associated with the current calendar. + * Returns: An integer representing the identifier of the current calendar. + */ + override uint id() + { + return cast(int) type_; + } + + override void split(Time time, ref uint year, ref uint month, ref uint day, ref uint doy, ref uint dow, ref uint era) + { + splitDate(time.ticks, year, month, day, doy, era); + dow = getDayOfWeek(time); + } + + package static void splitDate (long ticks, ref uint year, ref uint month, ref uint day, ref uint dayOfYear, ref uint era) + { + int numDays; + + void calculateYear() + { + auto whole400Years = numDays / cast(int) TimeSpan.DaysPer400Years; + numDays -= whole400Years * cast(int) TimeSpan.DaysPer400Years; + auto whole100Years = numDays / cast(int) TimeSpan.DaysPer100Years; + if (whole100Years == 4) + whole100Years = 3; + + numDays -= whole100Years * cast(int) TimeSpan.DaysPer100Years; + auto whole4Years = numDays / cast(int) TimeSpan.DaysPer4Years; + numDays -= whole4Years * cast(int) TimeSpan.DaysPer4Years; + auto wholeYears = numDays / cast(int) TimeSpan.DaysPerYear; + if (wholeYears == 4) + wholeYears = 3; + + year = whole400Years * 400 + whole100Years * 100 + whole4Years * 4 + wholeYears + era; + numDays -= wholeYears * TimeSpan.DaysPerYear; + } + + if(ticks < 0) + { + // in the BC era + era = BC_ERA; + // + // set up numDays to be like AD. AD days start at + // year 1. However, in BC, year 1 is like AD year 0, + // so we must subtract one year. + // + numDays = cast(int)((-ticks - 1) / TimeSpan.TicksPerDay); + if(numDays < 366) + { + // in the year 1 B.C. This is a special case + // leap year + year = 1; + } + else + { + numDays -= 366; + calculateYear; + } + // + // numDays is the number of days back from the end of + // the year, because the original ticks were negative + // + numDays = (staticIsLeapYear(year, era) ? 366 : 365) - numDays - 1; + } + else + { + era = AD_ERA; + numDays = cast(int)(ticks / TimeSpan.TicksPerDay); + calculateYear; + } + dayOfYear = numDays + 1; + + auto monthDays = staticIsLeapYear(year, era) ? DaysToMonthLeap : DaysToMonthCommon; + month = numDays >> 5 + 1; + while (numDays >= monthDays[month]) + month++; + + day = numDays - monthDays[month - 1] + 1; + } + + package static uint extractPart (long ticks, DatePart part) + { + uint year, month, day, dayOfYear, era; + + splitDate(ticks, year, month, day, dayOfYear, era); + + if (part is DatePart.Year) + return year; + + if (part is DatePart.Month) + return month; + + if (part is DatePart.DayOfYear) + return dayOfYear; + + return day; + } + + package static long getDateTicks (uint year, uint month, uint day, uint era) + { + auto monthDays = staticIsLeapYear(year, era) ? DaysToMonthLeap : DaysToMonthCommon; + if(era == BC_ERA) + { + year += 2; + return -cast(long)( (year - 3) * 365 + year / 4 - year / 100 + year / 400 + monthDays[12] - (monthDays[month - 1] + day - 1)) * TimeSpan.TicksPerDay; + } + else + { + year--; + return (year * 365 + year / 4 - year / 100 + year / 400 + monthDays[month - 1] + day - 1) * TimeSpan.TicksPerDay; + } + } + + package static bool staticIsLeapYear(uint year, uint era) + { + if(era == BC_ERA) + return staticIsLeapYear(year - 1, AD_ERA); + if(era == AD_ERA) + return (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)); + return false; + } +} + +debug(Gregorian) +{ + import tango.io.Stdout; + + void output(Time t) + { + Date d = Gregorian.generic.toDate(t); + TimeOfDay tod = t.time; + Stdout.format("{}/{}/{:d4} {} {}:{:d2}:{:d2}.{:d3} dow:{}", + d.month, d.day, d.year, d.era == Gregorian.AD_ERA ? "AD" : "BC", + tod.hours, tod.minutes, tod.seconds, tod.millis, d.dow).newline; + } + + void main() + { + Time t = Time(365 * TimeSpan.TicksPerDay); + output(t); + for(int i = 0; i < 366 + 365; i++) + { + t -= TimeSpan.days(1); + output(t); + } + } +} + +debug(UnitTest) +{ + unittest + { + // + // check Gregorian date handles positive time. + // + Time t = Time.epoch + TimeSpan.days(365); + Date d = Gregorian.generic.toDate(t); + assert(d.year == 2); + assert(d.month == 1); + assert(d.day == 1); + assert(d.era == Gregorian.AD_ERA); + assert(d.doy == 1); + // + // note that this is in disagreement with the Julian Calendar + // + assert(d.dow == Gregorian.DayOfWeek.Tuesday); + + // + // check that it handles negative time + // + t = Time.epoch - TimeSpan.days(366); + d = Gregorian.generic.toDate(t); + assert(d.year == 1); + assert(d.month == 1); + assert(d.day == 1); + assert(d.era == Gregorian.BC_ERA); + assert(d.doy == 1); + assert(d.dow == Gregorian.DayOfWeek.Saturday); + + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/time/chrono/GregorianBased.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/time/chrono/GregorianBased.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,145 @@ +/******************************************************************************* + + copyright: Copyright (c) 2005 John Chapman. All rights reserved + + license: BSD style: $(LICENSE) + + version: Mid 2005: Initial release + Apr 2007: reshaped + + author: John Chapman, Kris + +******************************************************************************/ + +module tango.time.chrono.GregorianBased; + +private import tango.core.Exception; + +private import tango.time.Time; + +private import tango.time.chrono.Gregorian; + + + +private class GregorianBased : Gregorian { + + private EraRange[] eraRanges_; + private int maxYear_, minYear_; + private int currentEra_ = -1; + + this() + { + eraRanges_ = EraRange.getEraRanges(id); + maxYear_ = eraRanges_[0].maxEraYear; + minYear_ = eraRanges_[0].minEraYear; + } + + public override Time toTime(uint year, uint month, uint day, uint hour, uint minute, uint second, uint millisecond, uint era) { + year = getGregorianYear(year, era); + return super.toTime(year, month, day, hour, minute, second, millisecond, era); + } + public override uint getYear(Time time) { + auto ticks = time.ticks; + auto year = extractPart(time.ticks, DatePart.Year); + foreach (EraRange eraRange; eraRanges_) { + if (ticks >= eraRange.ticks) + return year - eraRange.yearOffset; + } + throw new IllegalArgumentException("Value was out of range."); + } + + public override uint getEra(Time time) { + auto ticks = time.ticks; + foreach (EraRange eraRange; eraRanges_) { + if (ticks >= eraRange.ticks) + return eraRange.era; + } + throw new IllegalArgumentException("Value was out of range."); + } + + public override uint[] eras() { + uint[] result; + foreach (EraRange eraRange; eraRanges_) + result ~= eraRange.era; + return result; + } + + private uint getGregorianYear(uint year, uint era) { + if (era == 0) + era = currentEra; + foreach (EraRange eraRange; eraRanges_) { + if (era == eraRange.era) { + if (year >= eraRange.minEraYear && year <= eraRange.maxEraYear) + return eraRange.yearOffset + year; + throw new IllegalArgumentException("Value was out of range."); + } + } + throw new IllegalArgumentException("Era value was not valid."); + } + + protected uint currentEra() { + if (currentEra_ == -1) + currentEra_ = EraRange.getCurrentEra(id); + return currentEra_; + } +} + + + +package struct EraRange { + + private static EraRange[][uint] eraRanges; + private static uint[uint] currentEras; + private static bool initialized_; + + package uint era; + package long ticks; + package uint yearOffset; + package uint minEraYear; + package uint maxEraYear; + + private static void initialize() { + if (!initialized_) { + long getTicks(uint year, uint month, uint day) + { + return Gregorian.generic.getDateTicks(year, month, day, Gregorian.AD_ERA); + } + eraRanges[Gregorian.JAPAN] ~= EraRange(4, getTicks(1989, 1, 8), 1988, 1, Gregorian.MAX_YEAR); + eraRanges[Gregorian.JAPAN] ~= EraRange(3, getTicks(1926, 12, 25), 1925, 1, 1989); + eraRanges[Gregorian.JAPAN] ~= EraRange(2, getTicks(1912, 7, 30), 1911, 1, 1926); + eraRanges[Gregorian.JAPAN] ~= EraRange(1, getTicks(1868, 9, 8), 1867, 1, 1912); + eraRanges[Gregorian.TAIWAN] ~= EraRange(1, getTicks(1912, 1, 1), 1911, 1, Gregorian.MAX_YEAR); + eraRanges[Gregorian.KOREA] ~= EraRange(1, getTicks(1, 1, 1), -2333, 2334, Gregorian.MAX_YEAR); + eraRanges[Gregorian.THAI] ~= EraRange(1, getTicks(1, 1, 1), -543, 544, Gregorian.MAX_YEAR); + currentEras[Gregorian.JAPAN] = 4; + currentEras[Gregorian.TAIWAN] = 1; + currentEras[Gregorian.KOREA] = 1; + currentEras[Gregorian.THAI] = 1; + initialized_ = true; + } + } + + package static EraRange[] getEraRanges(uint calID) { + if (!initialized_) + initialize(); + return eraRanges[calID]; + } + + package static uint getCurrentEra(uint calID) { + if (!initialized_) + initialize(); + return currentEras[calID]; + } + + private static EraRange opCall(uint era, long ticks, uint yearOffset, uint minEraYear, uint prevEraYear) { + EraRange eraRange; + eraRange.era = era; + eraRange.ticks = ticks; + eraRange.yearOffset = yearOffset; + eraRange.minEraYear = minEraYear; + eraRange.maxEraYear = prevEraYear - yearOffset; + return eraRange; + } + +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/time/chrono/Hebrew.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/time/chrono/Hebrew.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,288 @@ +/******************************************************************************* + + copyright: Copyright (c) 2005 John Chapman. All rights reserved + + license: BSD style: $(LICENSE) + + version: Mid 2005: Initial release + Apr 2007: reshaped + + author: John Chapman, Kris, snoyberg + +******************************************************************************/ + +module tango.time.chrono.Hebrew; + +private import tango.core.Exception; + +private import tango.time.chrono.Calendar; + + + +/** + * $(ANCHOR _Hebrew) + * Represents the Hebrew calendar. + */ +public class Hebrew : Calendar { + + private const uint[14][7] MonthDays = [ + // month // year type + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], + [ 0, 30, 29, 29, 29, 30, 29, 0, 30, 29, 30, 29, 30, 29 ], // 1 + [ 0, 30, 29, 30, 29, 30, 29, 0, 30, 29, 30, 29, 30, 29 ], // 2 + [ 0, 30, 30, 30, 29, 30, 29, 0, 30, 29, 30, 29, 30, 29 ], // 3 + [ 0, 30, 29, 29, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29 ], // 4 + [ 0, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29 ], // 5 + [ 0, 30, 30, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29 ] // 6 + ]; + + private const uint YearOfOneAD = 3760; + private const uint DaysToOneAD = cast(int)(YearOfOneAD * 365.2735); + + private const uint PartsPerHour = 1080; + private const uint PartsPerDay = 24 * PartsPerHour; + private const uint DaysPerMonth = 29; + private const uint DaysPerMonthFraction = 12 * PartsPerHour + 793; + private const uint PartsPerMonth = DaysPerMonth * PartsPerDay + DaysPerMonthFraction; + private const uint FirstNewMoon = 11 * PartsPerHour + 204; + + private uint minYear_ = YearOfOneAD + 1583; + private uint maxYear_ = YearOfOneAD + 2240; + + /** + * Represents the current era. + */ + public const uint HEBREW_ERA = 1; + + /** + * Overridden. Returns a Time value set to the specified date and time in the specified _era. + * Params: + * year = An integer representing the _year. + * month = An integer representing the _month. + * day = An integer representing the _day. + * hour = An integer representing the _hour. + * minute = An integer representing the _minute. + * second = An integer representing the _second. + * millisecond = An integer representing the _millisecond. + * era = An integer representing the _era. + * Returns: A Time set to the specified date and time. + */ + public override Time toTime(uint year, uint month, uint day, uint hour, uint minute, uint second, uint millisecond, uint era) { + checkYear(year, era); + return getGregorianTime(year, month, day, hour, minute, second, millisecond); + } + + /** + * Overridden. Returns the day of the week in the specified Time. + * Params: time = A Time value. + * Returns: A DayOfWeek value representing the day of the week of time. + */ + public override DayOfWeek getDayOfWeek(Time time) { + return cast(DayOfWeek) cast(uint) ((time.ticks / TimeSpan.TicksPerDay + 1) % 7); + } + + /** + * Overridden. Returns the day of the month in the specified Time. + * Params: time = A Time value. + * Returns: An integer representing the day of the month of time. + */ + public override uint getDayOfMonth(Time time) { + auto year = getYear(time); + auto yearType = getYearType(year); + auto days = getStartOfYear(year) - DaysToOneAD; + auto day = cast(int)(time.ticks / TimeSpan.TicksPerDay) - days; + uint n; + while (n < 12 && day >= MonthDays[yearType][n + 1]) { + day -= MonthDays[yearType][n + 1]; + n++; + } + return day + 1; + } + + /** + * Overridden. Returns the day of the year in the specified Time. + * Params: time = A Time value. + * Returns: An integer representing the day of the year of time. + */ + public override uint getDayOfYear(Time time) { + auto year = getYear(time); + auto days = getStartOfYear(year) - DaysToOneAD; + return (cast(uint)(time.ticks / TimeSpan.TicksPerDay) - days) + 1; + } + + /** + * Overridden. Returns the month in the specified Time. + * Params: time = A Time value. + * Returns: An integer representing the month in time. + */ + public override uint getMonth(Time time) { + auto year = getYear(time); + auto yearType = getYearType(year); + auto days = getStartOfYear(year) - DaysToOneAD; + auto day = cast(int)(time.ticks / TimeSpan.TicksPerDay) - days; + uint n; + while (n < 12 && day >= MonthDays[yearType][n + 1]) { + day -= MonthDays[yearType][n + 1]; + n++; + } + return n + 1; + } + + /** + * Overridden. Returns the year in the specified Time. + * Params: time = A Time value. + * Returns: An integer representing the year in time. + */ + public override uint getYear(Time time) { + auto day = cast(uint)(time.ticks / TimeSpan.TicksPerDay) + DaysToOneAD; + auto low = minYear_, high = maxYear_; + // Perform a binary search. + while (low <= high) { + auto mid = low + (high - low) / 2; + auto startDay = getStartOfYear(mid); + if (day < startDay) + high = mid - 1; + else if (day >= startDay && day < getStartOfYear(mid + 1)) + return mid; + else + low = mid + 1; + } + return low; + } + + /** + * Overridden. Returns the era in the specified Time. + * Params: time = A Time value. + * Returns: An integer representing the ear in time. + */ + public override uint getEra(Time time) { + return HEBREW_ERA; + } + + /** + * Overridden. Returns the number of days in the specified _year and _month of the specified _era. + * Params: + * year = An integer representing the _year. + * month = An integer representing the _month. + * era = An integer representing the _era. + * Returns: The number of days in the specified _year and _month of the specified _era. + */ + public override uint getDaysInMonth(uint year, uint month, uint era) { + checkYear(year, era); + return MonthDays[getYearType(year)][month]; + } + + /** + * Overridden. Returns the number of days in the specified _year of the specified _era. + * Params: + * year = An integer representing the _year. + * era = An integer representing the _era. + * Returns: The number of days in the specified _year in the specified _era. + */ + public override uint getDaysInYear(uint year, uint era) { + return getStartOfYear(year + 1) - getStartOfYear(year); + } + + /** + * Overridden. Returns the number of months in the specified _year of the specified _era. + * Params: + * year = An integer representing the _year. + * era = An integer representing the _era. + * Returns: The number of months in the specified _year in the specified _era. + */ + public override uint getMonthsInYear(uint year, uint era) { + return isLeapYear(year, era) ? 13 : 12; + } + + /** + * Overridden. Indicates whether the specified _year in the specified _era is a leap _year. + * Params: year = An integer representing the _year. + * Params: era = An integer representing the _era. + * Returns: true is the specified _year is a leap _year; otherwise, false. + */ + public override bool isLeapYear(uint year, uint era) { + checkYear(year, era); + // true if year % 19 == 0, 3, 6, 8, 11, 14, 17 + return ((7 * year + 1) % 19) < 7; + } + + /** + * $(I Property.) Overridden. Retrieves the list of eras in the current calendar. + * Returns: An integer array representing the eras in the current calendar. + */ + public override uint[] eras() { + auto tmp = [HEBREW_ERA]; + return tmp.dup; + } + + /** + * $(I Property.) Overridden. Retrieves the identifier associated with the current calendar. + * Returns: An integer representing the identifier of the current calendar. + */ + public override uint id() { + return HEBREW; + } + + private void checkYear(uint year, uint era) { + if ((era != CURRENT_ERA && era != HEBREW_ERA) || (year > maxYear_ || year < minYear_)) + throw new IllegalArgumentException("Value was out of range."); + } + + private uint getYearType(uint year) { + int yearLength = getStartOfYear(year + 1) - getStartOfYear(year); + if (yearLength > 380) + yearLength -= 30; + switch (yearLength) { + case 353: + // "deficient" + return 1; + case 383: + // "deficient" leap + return 4; + case 354: + // "normal" + return 2; + case 384: + // "normal" leap + return 5; + case 355: + // "complete" + return 3; + case 385: + // "complete" leap + return 6; + default: + break; + } + // Satisfies -w + throw new IllegalArgumentException("Value was not valid."); + } + + private uint getStartOfYear(uint year) { + auto months = (235 * year - 234) / 19; + auto fraction = months * DaysPerMonthFraction + FirstNewMoon; + auto day = months * 29 + (fraction / PartsPerDay); + fraction %= PartsPerDay; + + auto dayOfWeek = day % 7; + if (dayOfWeek == 2 || dayOfWeek == 4 || dayOfWeek == 6) { + day++; + dayOfWeek = day % 7; + } + if (dayOfWeek == 1 && fraction > 15 * PartsPerHour + 204 && !isLeapYear(year, CURRENT_ERA)) + day += 2; + else if (dayOfWeek == 0 && fraction > 21 * PartsPerHour + 589 && isLeapYear(year, CURRENT_ERA)) + day++; + return day; + } + + private Time getGregorianTime(uint year, uint month, uint day, uint hour, uint minute, uint second, uint millisecond) { + auto yearType = getYearType(year); + auto days = getStartOfYear(year) - DaysToOneAD + day - 1; + for (int i = 1; i <= month; i++) + days += MonthDays[yearType][i - 1]; + return Time((days * TimeSpan.TicksPerDay) + getTimeTicks(hour, minute, second)) + TimeSpan.millis(millisecond); + } + +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/time/chrono/Hijri.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/time/chrono/Hijri.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,217 @@ +/******************************************************************************* + + copyright: Copyright (c) 2005 John Chapman. All rights reserved + + license: BSD style: $(LICENSE) + + version: Mid 2005: Initial release + Apr 2007: reshaped + + author: John Chapman, Kris + +******************************************************************************/ + +module tango.time.chrono.Hijri; + +private import tango.time.chrono.Calendar; + + +/** + * $(ANCHOR _Hijri) + * Represents the Hijri calendar. + */ +public class Hijri : Calendar { + + private static const uint[] DAYS_TO_MONTH = [ 0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355 ]; + + /** + * Represents the current era. + */ + public const uint HIJRI_ERA = 1; + + /** + * Overridden. Returns a Time value set to the specified date and time in the specified _era. + * Params: + * year = An integer representing the _year. + * month = An integer representing the _month. + * day = An integer representing the _day. + * hour = An integer representing the _hour. + * minute = An integer representing the _minute. + * second = An integer representing the _second. + * millisecond = An integer representing the _millisecond. + * era = An integer representing the _era. + * Returns: A Time set to the specified date and time. + */ + public override Time toTime(uint year, uint month, uint day, uint hour, uint minute, uint second, uint millisecond, uint era) { + return Time((daysSinceJan1(year, month, day) - 1) * TimeSpan.TicksPerDay + getTimeTicks(hour, minute, second)) + TimeSpan.millis(millisecond); + } + + /** + * Overridden. Returns the day of the week in the specified Time. + * Params: time = A Time value. + * Returns: A DayOfWeek value representing the day of the week of time. + */ + public override DayOfWeek getDayOfWeek(Time time) { + return cast(DayOfWeek) (cast(uint) (time.ticks / TimeSpan.TicksPerDay + 1) % 7); + } + + /** + * Overridden. Returns the day of the month in the specified Time. + * Params: time = A Time value. + * Returns: An integer representing the day of the month of time. + */ + public override uint getDayOfMonth(Time time) { + return extractPart(time.ticks, DatePart.Day); + } + + /** + * Overridden. Returns the day of the year in the specified Time. + * Params: time = A Time value. + * Returns: An integer representing the day of the year of time. + */ + public override uint getDayOfYear(Time time) { + return extractPart(time.ticks, DatePart.DayOfYear); + } + + /** + * Overridden. Returns the day of the year in the specified Time. + * Params: time = A Time value. + * Returns: An integer representing the day of the year of time. + */ + public override uint getMonth(Time time) { + return extractPart(time.ticks, DatePart.Month); + } + + /** + * Overridden. Returns the year in the specified Time. + * Params: time = A Time value. + * Returns: An integer representing the year in time. + */ + public override uint getYear(Time time) { + return extractPart(time.ticks, DatePart.Year); + } + + /** + * Overridden. Returns the era in the specified Time. + * Params: time = A Time value. + * Returns: An integer representing the ear in time. + */ + public override uint getEra(Time time) { + return HIJRI_ERA; + } + + /** + * Overridden. Returns the number of days in the specified _year and _month of the specified _era. + * Params: + * year = An integer representing the _year. + * month = An integer representing the _month. + * era = An integer representing the _era. + * Returns: The number of days in the specified _year and _month of the specified _era. + */ + public override uint getDaysInMonth(uint year, uint month, uint era) { + if (month == 12) + return isLeapYear(year, CURRENT_ERA) ? 30 : 29; + return (month % 2 == 1) ? 30 : 29; + } + + /** + * Overridden. Returns the number of days in the specified _year of the specified _era. + * Params: + * year = An integer representing the _year. + * era = An integer representing the _era. + * Returns: The number of days in the specified _year in the specified _era. + */ + public override uint getDaysInYear(uint year, uint era) { + return isLeapYear(year, era) ? 355 : 354; + } + + /** + * Overridden. Returns the number of months in the specified _year of the specified _era. + * Params: + * year = An integer representing the _year. + * era = An integer representing the _era. + * Returns: The number of months in the specified _year in the specified _era. + */ + public override uint getMonthsInYear(uint year, uint era) { + return 12; + } + + /** + * Overridden. Indicates whether the specified _year in the specified _era is a leap _year. + * Params: year = An integer representing the _year. + * Params: era = An integer representing the _era. + * Returns: true is the specified _year is a leap _year; otherwise, false. + */ + public override bool isLeapYear(uint year, uint era) { + return (14 + 11 * year) % 30 < 11; + } + + /** + * $(I Property.) Overridden. Retrieves the list of eras in the current calendar. + * Returns: An integer array representing the eras in the current calendar. + */ + public override uint[] eras() { + auto tmp = [HIJRI_ERA]; + return tmp.dup; + } + + /** + * $(I Property.) Overridden. Retrieves the identifier associated with the current calendar. + * Returns: An integer representing the identifier of the current calendar. + */ + public override uint id() { + return HIJRI; + } + + private long daysToYear(uint year) { + int cycle = ((year - 1) / 30) * 30; + int remaining = year - cycle - 1; + long days = ((cycle * 10631L) / 30L) + 227013L; + while (remaining > 0) { + days += 354 + (isLeapYear(remaining, CURRENT_ERA) ? 1 : 0); + remaining--; + } + return days; + } + + private long daysSinceJan1(uint year, uint month, uint day) { + return cast(long)(daysToYear(year) + DAYS_TO_MONTH[month - 1] + day); + } + + private int extractPart(long ticks, DatePart part) { + long days = TimeSpan(ticks).days + 1; + int year = cast(int)(((days - 227013) * 30) / 10631) + 1; + long daysUpToYear = daysToYear(year); + long daysInYear = getDaysInYear(year, CURRENT_ERA); + if (days < daysUpToYear) { + daysUpToYear -= daysInYear; + year--; + } + else if (days == daysUpToYear) { + year--; + daysUpToYear -= getDaysInYear(year, CURRENT_ERA); + } + else if (days > daysUpToYear + daysInYear) { + daysUpToYear += daysInYear; + year++; + } + + if (part == DatePart.Year) + return year; + + days -= daysUpToYear; + if (part == DatePart.DayOfYear) + return cast(int)days; + + int month = 1; + while (month <= 12 && days > DAYS_TO_MONTH[month - 1]) + month++; + month--; + if (part == DatePart.Month) + return month; + + return cast(int)(days - DAYS_TO_MONTH[month - 1]); + } + +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/time/chrono/Japanese.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/time/chrono/Japanese.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,33 @@ +/******************************************************************************* + + copyright: Copyright (c) 2005 John Chapman. All rights reserved + + license: BSD style: $(LICENSE) + + version: Mid 2005: Initial release + Apr 2007: reshaped + + author: John Chapman, Kris + +******************************************************************************/ + +module tango.time.chrono.Japanese; + +private import tango.time.chrono.GregorianBased; + + +/** + * $(ANCHOR _Japanese) + * Represents the Japanese calendar. + */ +public class Japanese : GregorianBased +{ + /** + * $(I Property.) Overridden. Retrieves the identifier associated with the current calendar. + * Returns: An integer representing the identifier of the current calendar. + */ + public override uint id() { + return JAPAN; + } + +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/time/chrono/Korean.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/time/chrono/Korean.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,34 @@ +/******************************************************************************* + + copyright: Copyright (c) 2005 John Chapman. All rights reserved + + license: BSD style: $(LICENSE) + + version: Mid 2005: Initial release + Apr 2007: reshaped + + author: John Chapman, Kris + +******************************************************************************/ + +module tango.time.chrono.Korean; + +private import tango.time.chrono.GregorianBased; + + +/** + * $(ANCHOR _Korean) + * Represents the Korean calendar. + */ +public class Korean : GregorianBased { + /** + * $(I Property.) Overridden. Retrieves the identifier associated with the current calendar. + * Returns: An integer representing the identifier of the current calendar. + */ + public override uint id() { + return KOREA; + } + +} + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/time/chrono/Taiwan.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/time/chrono/Taiwan.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,33 @@ +/******************************************************************************* + + copyright: Copyright (c) 2005 John Chapman. All rights reserved + + license: BSD style: $(LICENSE) + + version: Mid 2005: Initial release + Apr 2007: reshaped + + author: John Chapman, Kris + +******************************************************************************/ + +module tango.time.chrono.Taiwan; + +private import tango.time.chrono.GregorianBased; + +/** + * $(ANCHOR _Taiwan) + * Represents the Taiwan calendar. + */ +public class Taiwan : GregorianBased +{ + /** + * $(I Property.) Overridden. Retrieves the identifier associated with the current calendar. + * Returns: An integer representing the identifier of the current calendar. + */ + public override uint id() { + return TAIWAN; + } + +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/time/chrono/ThaiBuddhist.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/time/chrono/ThaiBuddhist.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,32 @@ +/******************************************************************************* + + copyright: Copyright (c) 2005 John Chapman. All rights reserved + + license: BSD style: $(LICENSE) + + version: Mid 2005: Initial release + Apr 2007: reshaped + + author: John Chapman, Kris + +******************************************************************************/ + +module tango.time.chrono.ThaiBuddhist; + +private import tango.time.chrono.GregorianBased; + + +/** + * $(ANCHOR _ThaiBuddhist) + * Represents the Thai Buddhist calendar. + */ +public class ThaiBuddhist : GregorianBased { + /** + * $(I Property.) Overridden. Retrieves the identifier associated with the current calendar. + * Returns: An integer representing the identifier of the current calendar. + */ + public override uint id() { + return THAI; + } + +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/ArgParser.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/ArgParser.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,434 @@ +/******************************************************************************* + + copyright: Copyright (c) 2005-2006 Lars Ivar Igesund, + Eric Anderton. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: December 2005 + + author: Lars Ivar Igesund, Eric Anderton + +*******************************************************************************/ + +module tango.util.ArgParser; + +private import tango.core.Exception; + +/** + An alias to a delegate taking a char[] as a parameter. The value + parameter will hold any chars immediately + following the argument. +*/ +alias void delegate (char[] value) ArgParserCallback; + +/** + An alias to a delegate taking a char[] as a parameter. The value + parameter will hold any chars immediately + following the argument. + + The ordinal argument represents which default argument this is for + the given stream of arguments. The first default argument will + be ordinal=0 with each successive call to this callback having + ordinal values of 1, 2, 3 and so forth. This can be reset to zero + in new calls to parse. +*/ +alias void delegate (char[] value,uint ordinal) DefaultArgParserCallback; + +/** + An alias to a delegate taking no parameters +*/ +alias void delegate () ArgParserSimpleCallback; + + +/** + A struct that represents a "{Prefix}{Identifier}" string. +*/ +struct Argument { + char[] prefix; + char[] identifier; + + /** + Creates a new Argument instance with given prefix and identifier. + */ + static Argument opCall ( char[] prefix, char[] identifier ) { + Argument result; + + result.prefix = prefix; + result.identifier = identifier; + + return result; + } +} + +/** + Alias for for the lazy people. +*/ +alias Argument Arg; + + +/** + A utility class to parse and handle your command line arguments. +*/ +class ArgParser{ + + /** + A helper struct containing a callback and an id, corresponding to + the argId passed to one of the bind methods. + */ + protected struct PrefixCallback { + char[] id; + ArgParserCallback cb; + } + + protected PrefixCallback[][char[]] bindings; + protected DefaultArgParserCallback[char[]] defaultBindings; + protected uint[char[]] prefixOrdinals; + protected char[][] prefixSearchOrder; + protected DefaultArgParserCallback defaultbinding; + private uint defaultOrdinal = 0; + + protected void addBinding(PrefixCallback pcb, char[] argPrefix){ + if (!(argPrefix in bindings)) { + prefixSearchOrder ~= argPrefix; + } + bindings[argPrefix] ~= pcb; + } + + /** + Binds a delegate callback to argument with a prefix and + a argId. + + Params: + argPrefix = the prefix of the argument, e.g. a dash '-'. + argId = the name of the argument, what follows the prefix + cb = the delegate that should be called when this argument is found + */ + public void bind(char[] argPrefix, char[] argId, ArgParserCallback cb){ + PrefixCallback pcb; + pcb.id = argId; + pcb.cb = cb; + addBinding(pcb, argPrefix); + } + + /** + The constructor, creates an empty ArgParser instance. + */ + public this(){ + defaultbinding = null; + } + + /** + The constructor, creates an ArgParser instance with a defined default callback. + */ + public this(DefaultArgParserCallback callback){ + defaultbinding = callback; + } + + protected class SimpleCallbackAdapter{ + ArgParserSimpleCallback callback; + public this(ArgParserSimpleCallback callback){ + this.callback = callback; + } + + public void adapterCallback(char[] value){ + callback(); + } + } + + /** + Binds a delegate callback to argument with a prefix and + a argId. + + Params: + argPrefix = the prefix of the argument, e.g. a dash '-'. + argId = the name of the argument, what follows the prefix + cb = the delegate that should be called when this argument is found + */ + public void bind(char[] argPrefix, char[] argId, ArgParserSimpleCallback cb){ + SimpleCallbackAdapter adapter = new SimpleCallbackAdapter(cb); + PrefixCallback pcb; + pcb.id = argId; + pcb.cb = &adapter.adapterCallback; + addBinding(pcb, argPrefix); + } + + /** + Binds a delegate callback to all arguments with prefix argPrefix, but that + do not conform to an argument bound in a call to bind(). + + Params: + argPrefix = the prefix for the callback + callback = the default callback + */ + public void bindDefault(char[] argPrefix, DefaultArgParserCallback callback){ + defaultBindings[argPrefix] = callback; + prefixOrdinals[argPrefix] = 0; + if (!(argPrefix in bindings)) { + prefixSearchOrder ~= argPrefix; + } + } + + /** + Binds a delegate callback to all arguments not conforming to an + argument bound in a call to bind(). These arguments will be passed to the + delegate without having any matching prefixes removed. + + Params: + callback = the default callback + */ + public void bindDefault(DefaultArgParserCallback callback){ + defaultbinding = callback; + } + + /** + Binds a delegate callback to an argument. + + Params: + argument = argument to respond to + callback = the delegate that should be called when the argument is found + */ + public void bind (Argument argument, ArgParserCallback callback) { + bind(argument.prefix, argument.identifier, callback); + } + + /** + Binds a delegate callback to any number of arguments. + + Params: + arguments = an array of Argument struct instances + callback = the delegate that should be called when one of the arguments is found + */ + public void bind ( Argument[] arguments, void delegate(char[]) callback ) { + foreach (argument; arguments) { bind(argument, callback); } + } + + /** + Binds a delegate callback to an identifier with Posix-like prefixes. This means, + it binds for both prefixes "-" and "--", as well as identifier with, and + without a delimiting "=" between identifier and value. + + Params: + identifier = argument identifier + callback = the delegate that should be called when one of the arguments is found + */ + public void bindPosix ( char[] identifier, ArgParserCallback callback ) { + bind([ Argument("-", identifier ~ "="), Argument("-", identifier), + Argument("--", identifier ~ "="), Argument("--", identifier) ], callback); + } + + /** + Binds a delegate callback to any number of identifiers with Posix-like prefixes. + See bindPosix(identifier, callback). + + Params: + arguments = an array of argument identifiers + callback = the delegate that should be called when one of the arguments is found + */ + public void bindPosix ( char[][] identifiers, ArgParserCallback callback ) { + foreach (identifier; identifiers) { bindPosix(identifier, callback); } + } + + /** + Parses the arguments provided by the parameter. The bound callbacks are called as + arguments are recognized. If two arguments have the same prefix, and start with + the same characters (e.g.: --open, --opened), the longest matching bound callback + is called. + + Params: + arguments = the command line arguments from the application + resetOrdinals = if true, all ordinal counts will be set to zero + */ + public void parse(char[][] arguments, bool resetOrdinals = false){ + if (bindings.length == 0) return; + + if (resetOrdinals) { + defaultOrdinal = 0; + foreach (key; prefixOrdinals.keys) { + prefixOrdinals[key] = 0; + } + } + + foreach (char[] arg; arguments) { + char[] argData = arg; + char[] argOrig = argData; + bool found = false; + + foreach (char[] prefix; prefixSearchOrder) { + if(argData.length < prefix.length) continue; + + if(argData[0..prefix.length] != prefix) continue; + else argData = argData[prefix.length..$]; + + if (prefix in bindings) { + PrefixCallback[] candidates; + + foreach (PrefixCallback cb; bindings[prefix]) { + if (argData.length < cb.id.length) continue; + + uint cbil = cb.id.length; + + if (cb.id == argData[0..cbil]) { + found = true; + candidates ~= cb; + } + } + + if (found) { + // Find the longest matching callback identifier from the candidates. + uint indexLongestMatch = 0; + + if (candidates.length > 1) { + foreach (i, candidate; candidates) { + if (candidate.id.length > candidates[indexLongestMatch].id.length) { + indexLongestMatch = i; + } + } + } + + // Call the best matching callback. + with(candidates[indexLongestMatch]) { cb(argData[id.length..$]); } + } + } + if (found) { + break; + } + else if (prefix in defaultBindings){ + defaultBindings[prefix](argData,prefixOrdinals[prefix]); + prefixOrdinals[prefix]++; + found = true; + break; + } + argData = argOrig; + } + if (!found) { + if (defaultbinding !is null) { + defaultbinding(argData,defaultOrdinal); + defaultOrdinal++; + } + else { + throw new IllegalArgumentException("Illegal argument "~ argData); + } + } + } + } +} + +debug (UnitTest) { + import Integer = tango.text.convert.Integer; + + //void main() {} + +unittest { + + ArgParser parser = new ArgParser(); + bool h = false; + bool h2 = false; + bool b = false; + bool bb = false; + bool boolean = false; + int n = -1; + int dashOrdinalCount = -1; + int ordinalCount = -1; + + parser.bind("--", "h2", delegate void(){ + h2 = true; + }); + + parser.bind("-", "h", delegate void(){ + h = true; + }); + + parser.bind("-", "bb", delegate void(){ + bb = true; + }); + + parser.bind("-", "bool", delegate void(char[] value){ + assert(value.length == 5); + assert(value[0] == '='); + if (value[1..5] == "true") { + boolean = true; + } + else { + assert(false); + } + }); + + parser.bind("-", "b", delegate void(){ + b = true; + }); + + parser.bind("-", "n", delegate void(char[] value){ + assert(value[0] == '='); + n = cast(int) Integer.parse(value[1..5]); + assert(n == 4349); + }); + + parser.bindDefault(delegate void(char[] value, uint ordinal){ + ordinalCount = ordinal; + if (ordinal == 0) { + assert(value == "ordinalTest1"); + } + else if (ordinal == 1) { + assert(value == "ordinalTest2"); + } + }); + + parser.bindDefault("-", delegate void(char[] value, uint ordinal){ + dashOrdinalCount = ordinal; + if (ordinal == 0) { + assert(value == "dashTest1"); + } + else if (ordinal == 1) { + assert(value == "dashTest2"); + } + }); + + parser.bindDefault("@", delegate void(char[] value, uint ordinal){ + assert (value == "atTest"); + }); + + static char[][] test1 = ["--h2", "-h", "-bb", "-b", "-n=4349", "-bool=true", "ordinalTest1", "ordinalTest2", "-dashTest1", "-dashTest2", "@atTest"]; + + parser.parse(test1); + assert(h2); + assert(h); + assert(b); + assert(bb); + assert(n == 4349); + assert(ordinalCount == 1); + assert(dashOrdinalCount == 1); + + h = h2 = b = bb = false; + boolean = false; + n = ordinalCount = dashOrdinalCount = -1; + + static char[][] test2 = ["-n=4349", "ordinalTest1", "@atTest", "--h2", "-b", "-bb", "-h", "-dashTest1", "-dashTest2", "ordinalTest2", "-bool=true"]; + + parser.parse(test2, true); + assert(h2 && h && b && bb && boolean && (n ==4349)); + assert(ordinalCount == 1); + assert(dashOrdinalCount == 1); + + h = h2 = b = bb = false; + boolean = false; + n = ordinalCount = dashOrdinalCount = -1; + + static char[][] test3 = ["-n=4349", "ordinalTest1", "@atTest", "--h2", "-b", "-bb", "-h", "-dashTest1", "-dashTest2", "ordinalTest2", "-bool=true"]; + + parser.parse(test3, true); + assert(h2 && h && b && bb && boolean && (n ==4349)); + assert((ordinalCount == 1) && (dashOrdinalCount == 1)); + + ordinalCount = dashOrdinalCount = -1; + + static char[][] test4 = ["ordinalTest1", "ordinalTest2", "ordinalTest3", "ordinalTest4"]; + static char[][] test5 = ["-dashTest1", "-dashTest2", "-dashTest3"]; + + parser.parse(test4, true); + assert(ordinalCount == 3); + + parser.parse(test5, true); + assert(dashOrdinalCount == 2); +} +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/Arguments.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/Arguments.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,834 @@ +/******************************************************************************* + copyright: Copyright (c) 2007 Darryl Bleau. All rights reserved. + + license: BSD style: $(LICENSE) + + version: Oct2007 + author: Darryl B, Jeff D + + History: + --- + Date Who What + Sep2006 Darryl Bleau Original C module + Sep2007 Jeff Davey Ported to D, added comments. + Oct2007 Darryl Bleau Added validation delegates/functions, more comments. + --- +*******************************************************************************/ + +/******************************************************************************* + + This module is used to parse arguments, and give easy access to them. + +*******************************************************************************/ + +module tango.util.Arguments; + +private import tango.core.Exception : TracedException; + +/*********************************************************************** + + This exception is thrown during argument validation. + +***********************************************************************/ + +public class ArgumentException : TracedException +{ + /*********************************************************************** + + The reason the exception was thrown + + ***********************************************************************/ + + enum ExceptionReason + { + /*********************************************************************** + An invalid parameter was passed + ***********************************************************************/ + + INVALID_PARAMETER, + /*********************************************************************** + A parameter wasn't passed to an argument when it was expected + ***********************************************************************/ + + MISSING_PARAMETER, + /*********************************************************************** + An argument was missing + ***********************************************************************/ + + MISSING_ARGUMENT + } + + private char[] _name; + private char[] _parameter; + private ExceptionReason _reason; + + /*********************************************************************** + + The name of the specific argument + + ***********************************************************************/ + + char[] name() { return _name; } + + /*********************************************************************** + + The parameter to the argument + + ***********************************************************************/ + + char[] parameter() { return _parameter; } + + /*********************************************************************** + + The enum to the reason it failed + + ***********************************************************************/ + + ExceptionReason reason() { return _reason; } + + this(char[] msg, char[] name, char[] parameter, ExceptionReason reason) + { + _name = name; + _parameter = parameter; + _reason = reason; + super(msg); + } +} + +/*********************************************************************** + + The Arguments class is used to parse arguments and encapsulate the + parameters passed by an application user. + + The command line arguments into an array of found arguments and their + respective parameters (if any). + + Arguments can be short (-), long (--), or implicit. Arguments can + optionally be passed parameters. For example, this module + parses command lines such as: "-a -b -c --long --argument=parameter" + + Example: + --- + char[][] arguments = [ "programname", "-a:on", "-abc:on", "--this=good", "-x:on" ]; + Arguments args = new Arguments(arguments); + if (args) + { + args.addValidation("b", true, false); + args.addValidation("c", true, true); + args.addValidation("x", false, true); + args.addValidation("this", false, true); + args.addValidation("this", (char[] a) { (return a.length < 5); }); + try + { + args.validate(); + return Test.Status.Success; + } + catch (ArgumentException ex) + { + messages ~= Stdout.layout.convert("{}: {} - {}", ex.name, ex.msg, ex.reason == ArgumentException.ExceptionReason.INVALID_PARAMETER ? "invalid parameter" : ex.reason == ArgumentException.ExceptionReason.MISSING_PARAMETER ? "missing parameter" : "missing argument"); + } + } + --- + + Syntax: + --- + Short Argument - -[x][:=]?[ parameter]... + Long Argument - --[long][:=]?[ parameter]... + Implicit Arguments - [implicitName]... Multiple implicit arguments are allowed. + --- + + Usage: + + Short options can be grouped in a single dash. The following are equivalent. + --- + - "myprogram -a -b -c" + - "myprogram -abc" + --- + + Arguments can be passed with space, '=', or ':'. The following are equivalent. + --- + - "myprogram -c arg" + - "myprogram -c=arg" + - "myprogram -c:arg" + --- + + As are these. + --- + - "myprogram --long arg" + - "myprogram --long=arg" + - "myprogram --long:arg" + --- + + Arguments can contain either '=' or ':', but not both. For example. + the following results in the argument 'long' being set to 'arg=other' + and 'arg:other', respectively. + --- + - "myprogram --long:arg=other" + - "myprogram --long=arg:other" + --- + + Blank dashes are ignored. The following are all equivalent. + --- + - "myprogram -c -- -a" + - "myprogram -c - -a" + - "myprogram - - - -a -- -c" + --- + + In the absence of implicit arguments, short options can be infered when + they come first. Given no implicit arguments, the following are equivalent. + --- + - "myprogram abc" + - "myprogram -abc" + - "myprogram -a -b -c" + --- + + Short options are case sensitive, while long options are not. The following + are equivalent. + --- + - "myprogram -a -A -LONG" + - "myprogram -a -A -Long" + - "myprogram -a -A -long" + --- + + In the event of multiple definitions of an argument, any parameters given + will be concatenated. The following are equivalent. + --- + - "myprogram -a one two three" + - "myprogram -a one -a two -a three" + - "myprogram -a:one two -a=three" + --- + + Multiple parameters can be iterated through using via the opIndex operator. + For example, given: + --- + - "myprogram -collect one two three '4 5 6'" + --- + args["collect"] will return a char[][] array ["one", "two", "three", "4 5 6"]. + + Implicit arguments can be defined by passing in an implicit arguments array, + which may look something like: ["first", "second"]. + Given implicit arguments, any non-argument command line parameters will be + automatically assigned to the implicit arguments, + in the order they were given. + For example, given the implicit arguments ["first", "second"] and command line: + --- + - "myprogram hello there bob" + --- + The argument 'first' will be assigned 'hello', and the argument 'second' will + be assigned both 'there' and 'bob'. + + Any intervening arguments will end the assignment. For example, given: + --- + - "myprogram hello there bob -a how are you" + --- + 'first' is assigned 'hello', 'second' is assigned 'there' and 'bob', and 'a' + is assigned 'how', 'are', and 'you'. + + Implicit arguments also allows programs to support non-option arguments, + given implicit arguments ["actions"], and a command line such as: + --- + - "myprogram mop sweep get_coffee -time:now" + --- + args["actions"] will contain ["mop", "sweep", "get_coffee"], and + args["time"] will contain "now". + +***********************************************************************/ + +public class Arguments +{ + /// Function used to validate multiple parameters at once. + alias bool function(char[][] params, inout char[] invalidParam) validationFunctionMulti; + /// Delegate used to validate multiple parameters at once. + alias bool delegate(char[][] params, inout char[] invalidParam) validationDelegateMulti; + /// Function used to validate single parameters at a time. + alias bool function(char[] param) validationFunction; + /// Delegate used to validate single parameters at a time. + alias bool delegate(char[] param) validationDelegate; + + private char[][][char[]] _args; + private char[] _program; + private struct validation + { + validationFunction[] validF; + validationDelegate[] validD; + validationFunctionMulti[] validFM; + validationDelegateMulti[] validDM; + bool required; + bool paramRequired; + } + private validation[char[]] _validations; + + private char[] parseLongArgument(char[] arg) + { + char[] rtn; + + int locate(char[] arg, char c) { + foreach (i, a; arg) + if (a is c) + return i; + return arg.length; + } + + + if (arg) + { + int equalDelim = locate(arg, '='); + int colonDelim = locate(arg, ':'); + int paramPos = ((equalDelim != arg.length) && (colonDelim != arg.length)) ? (equalDelim < colonDelim ? equalDelim : colonDelim) : (equalDelim != arg.length) ? equalDelim : colonDelim; + if (paramPos != arg.length) + { + char[] argName = arg[0 .. paramPos]; + char[] value = arg[(paramPos + 1) .. arg.length]; + setArg(argName, value); + rtn = argName; + } + else + { + setArg(arg, null); + rtn = arg; + } + } + return rtn; + } + + private void setArg(char[] arg, char[] value) + { + if (arg) + { + if ((arg in _args) || (value !is null)) + _args[arg] ~= value; + else + _args[arg] = null; + } + } + + private char[] parseShortArgument(char[] arg) + { + char[] rtn; + + if (arg) + { + char[] argName; + uint i; + for (i = 0; i < arg.length; i++) + { + if (arg[i] != '=' && arg[i] != ':') + { + argName = arg[i .. i + 1]; + setArg(argName, null); + } + else if (((arg.length) - i) > 1) + { + setArg(argName, arg[i+1 .. arg.length]); + break; + } + } + rtn = argName; + } + return rtn; + } + + /*********************************************************************** + + Allows external argument assignment, works the same as command line + in that it appends to any values already assigned to the given key. + + Params: + value = assigned value + key = key to assign to + + ***********************************************************************/ + + void opIndexAssign(char[] value, char[] key) + { + setArg(key, value); + } + + /*********************************************************************** + + Allows removal of keys from the arguments. Useful if you want to replace + values for a given key rather than to append to them. + + Params: + key = key to remove values from. + + ***********************************************************************/ + + void remove(char[] key) + { + _args[key] = null; + } + + /*********************************************************************** + + Directly access an argument's parameters via opIndex operator as an + array. + This is to cover something like: param1 "parm with space" param2 + + ***********************************************************************/ + + char[][] opIndex(char[] key) + { + char[][] rtn = null; + if (key && (key in _args)) + rtn = _args[key]; + return rtn; + } + + /*********************************************************************** + + Operator is used to check if the argument exists + + ***********************************************************************/ + + bool opIn_r(char[] key) + { + bool rtn = false; + if (key) + rtn = (key in _args) != null; + return rtn; + } + + /*********************************************************************** + + Adds a validation to the arguments + + Params: + argument = the argument name + required = specifies if this argument is required + paramRequired = specifies if this argument requires a parameter + + ***********************************************************************/ + + void addValidation(char[] argument, bool required, bool paramRequired) + { + if (argument) + { + validation* val = getValidation(argument); + if (val !is null) + { + val.required = required; + val.paramRequired = paramRequired; + } + } + } + + /*********************************************************************** + + Adds a validation to the arguments + + Params: + argument = the argument name + validF = a validation function for single parameters + + ***********************************************************************/ + + void addValidation(char[] argument, validationFunction validF) + { + if (argument && validF) + { + validation* val = getValidation(argument); + if (val !is null) + val.validF ~= validF; + } + } + + /*********************************************************************** + + Adds a validation to the arguments + + Params: + argument = the argument name + validD = a validation delegate for single parameters + + ***********************************************************************/ + + void addValidation(char[] argument, validationDelegate validD) + { + if (argument && validD) + { + validation* val = getValidation(argument); + if (val !is null) + val.validD ~= validD; + } + } + + /*********************************************************************** + + Adds a validation to the arguments + + Params: + argument = the argument name + validF = a validation function for multiple parameters + + ***********************************************************************/ + + void addValidation(char[] argument, validationFunctionMulti validFM) + { + if (argument && validFM) + { + validation* val = getValidation(argument); + if (val !is null) + val.validFM ~= validFM; + } + } + + /*********************************************************************** + + Adds a validation to the arguments + + Params: + argument = the argument name + validD = a validation delegate for multiple parameters + + ***********************************************************************/ + + void addValidation(char[] argument, validationDelegateMulti validDM) + { + if (argument && validDM) + { + validation* val = getValidation(argument); + if (val !is null) + val.validDM ~= validDM; + } + } + + private validation* getValidation(char[] argument) + { + validation* rtn = null; + if (!(argument in _validations)) + { + validation newValidation; + _validations[argument] = newValidation; + } + if (argument in _validations) + rtn = &(_validations[argument]); + return rtn; + } + + /*********************************************************************** + + Validates the parsed arguments. + + Throws ArgumentException if it finds something wrong. + + ***********************************************************************/ + + void validate() + { + foreach(char[] argument, validation val; _validations) + { + if (val.required && !(argument in _args)) + throw new ArgumentException("Argument required.", argument, null, ArgumentException.ExceptionReason.MISSING_ARGUMENT); + if (val.paramRequired && (argument in _args) && (_args[argument].length == 0)) + throw new ArgumentException("Parameter required.", argument, null, ArgumentException.ExceptionReason.MISSING_PARAMETER); + if ((argument in _args) && (_args[argument].length > 0)) + { + char[] invalidParameter = null; + foreach(validationFunctionMulti validFM; val.validFM) + if (!validFM(_args[argument], invalidParameter)) + break; + if (invalidParameter is null) + { + foreach(validationDelegateMulti validDM; val.validDM) + if (!validDM(_args[argument], invalidParameter)) + break; + if (invalidParameter is null) + { + foreach(char[] arg; _args[argument]) + { + foreach(validationFunction validF; val.validF) + { + if (!validF(arg)) + { + invalidParameter = arg; + break; + } + } + if (invalidParameter is null) + { + foreach(validationDelegate validD; val.validD) + { + if (!validD(arg)) + { + invalidParameter = arg; + break; + } + } + } + } + } + } + if (invalidParameter !is null) + throw new ArgumentException("Invalid parameter.", argument, invalidParameter, ArgumentException.ExceptionReason.INVALID_PARAMETER); + } + } + } + + /*********************************************************************** + + Parse the arguments according to the passed implicitArg list + and aliases. + + ***********************************************************************/ + + + void parse(char[][] arguments, char[][] implicitArgs, char[][][] aliases) + { + char[] lastArgumentSet; + uint currentImplicitArg = 0; + for (uint i = 1; i < arguments.length; i++) + { + char[] currentArgument = arguments[i]; + if (currentArgument) + { + if (currentArgument[0] == '-') + { + if (currentArgument.length > 1) + { + if (currentArgument[1] == '-') + { + if (currentArgument.length > 2) + lastArgumentSet = parseLongArgument(currentArgument[2 .. currentArgument.length]); // long argument + } + else + lastArgumentSet = parseShortArgument(currentArgument[1 .. currentArgument.length]); // short argument + } + } + else + { + char[] argName; + // implicit argument / previously set argument + if (implicitArgs && (currentImplicitArg < implicitArgs.length)) + lastArgumentSet = argName = implicitArgs[currentImplicitArg++]; + else + argName = lastArgumentSet; + + if (argName) + setArg(argName, currentArgument); + else + lastArgumentSet = parseShortArgument(currentArgument); + } + } + } + + if (aliases) + { + for (uint i = 0; i < aliases.length; i++) + { + bool foundOne = false; + char[][] currentValues; + for (uint j = 0; j < aliases[i].length; j++) + { + if (aliases[i][j] in _args) + { + foundOne = true; + currentValues ~= _args[aliases[i][j]]; + } + } + + if (foundOne) + { + for (uint j = 0; j < aliases[i].length; j++) + _args[aliases[i][j]] = currentValues; + } + } + } + } + + /*********************************************************************** + + Constructor that supports all features + + Params: + arguments = the list of arguments (usually from main) + implicitArgs = assigns values using these keys in order from the arguments array. + aliases = aliases specific arguments to each other to concat parameters. looks like aliases[0] = [ "alias1", "alias2", "alias3" ]; (which groups all these arguments together) + + ***********************************************************************/ + + this(char[][] arguments, char[][] implicitArgs, char[][][] aliases) + { + _program = arguments[0]; + this.parse(arguments, implicitArgs, aliases); + } + + /*********************************************************************** + + Basic constructor which only deals with arguments + + Params: + arguments = array usually from main() + + ***********************************************************************/ + + this(char[][] arguments) + { + this(arguments, null, null); + } + + + /*********************************************************************** + + This constructor allows implicitArgs to be set as well + + Params: + arguments = array usually from main() + implicitArgs = the implicit arguments + + ***********************************************************************/ + + this(char[][] arguments, char[][] implicitArgs) + { + this(arguments, implicitArgs, null); + } + + /*********************************************************************** + + This constructor allows aliases + + Params: + arguments = array usually from main + aliases = the array of arguments to alias + + ***********************************************************************/ + + this(char[][] arguments, char[][][] aliases) + { + this(arguments, null, aliases); + } +} + +/+ + +TODO: Either rewrite this test to not use the Test class, or resolve ticket +749 to include Test in Tango. + +version(UnitTest) +{ + import tango.util.Test; + import tango.text.Util; + import tango.io.Stdout; + + unittest + { + Test.Status parseTest(inout char[][] messages) + { + char[][] arguments = [ "ignoreprogramname", "--accumulate", "one", "-x", "on", "--accumulate:two", "-y", "off", "--accumulate=three", "-abc" ]; + Arguments args = new Arguments(arguments); + if (args) + { + if (!("ignoreprogramname" in args)) + { + if (join(args["accumulate"], " ") == "one two three") + { + if (args["x"][0] == "on") + { + if (("a" in args) && ("b" in args) && ("c" in args)) + return Test.Status.Success; + } + } + } + } + return Test.Status.Failure; + } + + Test.Status implicitParseTest(inout char[][] messages) + { + char[][] arguments = ["ignoreprogramname", "-r", "zero", "one two three", "four five", "-s", "six"]; + char[][] implicitArgs = [ "first", "second" ]; + Arguments args = new Arguments(arguments, implicitArgs); + if (args) + { + if (!("ignoreprogramname" in args)) + { + if (("r" in args) && !args["r"]) + { + if (args["first"][0] == "zero") + { + if (join(args["second"], " ") == "one two three four five") + { + if (args["second"] == ["one two three", "four five"]) + { + if (args["s"][0] == "six") + return Test.Status.Success; + } + } + } + } + } + } + return Test.Status.Failure; + } + + Test.Status aliasParseTest(inout char[][] messages) + { + char[][] arguments = [ "ignoreprogramname", "abc", "-d", "-e=eee", "--eff=f" ]; + char[][][4] aliases; + aliases[0] = [ "lettera", "a" ]; + aliases[1] = [ "letterbc", "c", "b" ]; + aliases[2] = [ "letterd", "d" ]; + aliases[3] = [ "lettere", "eff", "e" ]; + Arguments args = new Arguments(arguments, aliases); + if (args) + { + if (!("ignoreprogramname" in args) && ("letterbc" in args) && ("a" in args) && ("b" in args) && + ("c" in args) && ("d" in args) && ("eff" in args)) + { + if (("lettera" in args) && ("letterbc" in args) && ("letterd" in args)) + { + if (join(args["eff"], " ") == "f eee") + { + if (args["eff"] == ["f", "eee"]) + return Test.Status.Success; + } + } + } + } + return Test.Status.Failure; + } + + bool testRan = false; + bool testValidation(char[] arg) + { + bool rtn = true; + if (arg.length > 5) + rtn = false; + testRan = true; + return rtn; + } + + Test.Status validationTest(inout char[][] messages) + { + char[][] arguments = [ "programname", "-a:on", "-abc:on", "--this=good", "-x:on" ]; + Arguments args = new Arguments(arguments); + if (args) + { + args.addValidation("b", true, false); + args.addValidation("c", true, true); + args.addValidation("x", false, true); + args.addValidation("this", false, true); + args.addValidation("this", &testValidation); + try + { + args.validate(); + if (testRan) + return Test.Status.Success; + } + catch (ArgumentException ex) + { + messages ~= Stdout.layout.convert("{}: {} - {} ({})", ex.name, ex.msg, ex.reason == ArgumentException.ExceptionReason.INVALID_PARAMETER ? "invalid parameter" : ex.reason == ArgumentException.ExceptionReason.MISSING_PARAMETER ? "missing parameter" : "missing argument", ex.parameter); + } + } + return Test.Status.Failure; + } + + Test argTest = new Test("tetra.util.Arguments"); + argTest["Normal"] = &parseTest; + argTest["Implicit"] = &implicitParseTest; + argTest["Alias"] = &aliasParseTest; + argTest["Validation"] = &validationTest; + argTest.run; + } +} ++/ diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/Convert.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/Convert.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,1340 @@ +/** + * This module provides a templated function that performs value-preserving + * conversions between arbitrary types. This function's behaviour can be + * extended for user-defined types as needed. + * + * Copyright: Copyright © 2007 Daniel Keep. + * License: BSD style: $(LICENSE) + * Authors: Daniel Keep + * Credits: Inspired in part by Andrei Alexandrescu's work on std.conv. + */ + +module tango.util.Convert; + +private import tango.core.Traits; +private import tango.core.Tuple : Tuple; +private import tango.core.Exception : TracedException; + +private import tango.math.Math; +private import tango.text.convert.Utf; +private import tango.text.convert.Float; +private import tango.text.convert.Integer; + +private import Ascii = tango.text.Ascii; + +version( DDoc ) +{ + /** + * Attempts to perform a value-preserving conversion of the given value + * from type S to type D. If the conversion cannot be performed in any + * context, a compile-time error will be issued describing the types + * involved. If the conversion fails at run-time because the destination + * type could not represent the value being converted, a + * ConversionException will be thrown. + * + * For example, to convert the string "123" into an equivalent integer + * value, you would use: + * + * ----- + * auto v = to!(int)("123"); + * ----- + * + * You may also specify a default value which should be returned in the + * event that the conversion cannot take place: + * + * ----- + * auto v = to!(int)("abc", 456); + * ----- + * + * The function will attempt to preserve the input value as exactly as + * possible, given the limitations of the destination format. For + * instance, converting a floating-point value to an integer will cause it + * to round the value to the nearest integer value. + * + * Below is a complete list of conversions between built-in types and + * strings. Capitalised names indicate classes of types. Conversions + * between types in the same class are also possible. + * + * ----- + * bool <-- Integer (0/!0), Char ('t'/'f'), String ("true"/"false") + * Integer <-- bool, Real, Char ('0'-'9'), String + * Real <-- Integer, String + * Imaginary <-- Complex + * Complex <-- Integer, Real, Imaginary + * Char <-- bool, Integer (0-9) + * String <-- bool, Integer, Real + * ----- + * + * Conversions between arrays and associative arrays are also supported, + * and are done element-by-element. + * + * You can add support for value conversions to your types by defining + * appropriate static and instance member functions. Given a type + * the_type, any of the following members of a type T may be used: + * + * ----- + * the_type to_the_type(); + * static T from_the_type(the_type); + * ----- + * + * You may also use "camel case" names: + * + * ----- + * the_type toTheType(); + * static T fromTheType(the_type); + * ----- + * + * Arrays and associative arrays can also be explicitly supported: + * + * ----- + * the_type[] to_the_type_array(); + * the_type[] toTheTypeArray(); + * + * static T from_the_type_array(the_type[]); + * static T fromTheTypeArray(the_type[]); + * + * the_type[int] to_int_to_the_type_map(); + * the_type[int] toIntToTheTypeMap(); + * + * static T from_int_to_the_type_map(the_type[int]); + * static T fromIntToTheTypeMap(the_type[int]); + * ----- + * + * If you have more complex requirements, you can also use the generic to + * and from templated members: + * + * ----- + * the_type to(the_type)(); + * static T from(the_type)(the_type); + * ----- + * + * These templates will have the_type explicitly passed to them in the + * template instantiation. + * + * Finally, strings are given special support. The following members will + * be checked for: + * + * ----- + * char[] toString(); + * wchar[] toString16(); + * dchar[] toString32(); + * char[] toString(); + * ----- + * + * The "toString_" method corresponding to the destination string type will be + * tried first. If this method does not exist, then the function will + * look for another "toString_" method from which it will convert the result. + * Failing this, it will try "toString" and convert the result to the + * appropriate encoding. + * + * The rules for converting to a user-defined type are much the same, + * except it makes use of the "fromUtf8", "fromUtf16", "fromUtf32" and + * "fromString" static methods. + */ + D to(D,S)(S value); + D to(D,S)(S value, D default_); /// ditto +} +else +{ + template to(D) + { + D to(S, Def=Missing)(S value, Def def=Def.init) + { + static if( is( Def == Missing ) ) + return toImpl!(D,S)(value); + + else + { + try + { + return toImpl!(D,S)(value); + } + catch( ConversionException e ) + {} + + return def; + + //D result = def; + /+ + try + { + return toImpl!(D,S)(value); + } + catch( ConversionException e ) + { + return def; + } + // +/ + //return result; + } + } + } +} + +/** + * This exception is thrown when the to template is unable to perform a + * conversion at run-time. This typically occurs when the source value cannot + * be represented in the destination type. This exception is also thrown when + * the conversion would cause an over- or underflow. + */ +class ConversionException : TracedException +{ + this( char[] msg ) + { + super( msg ); + } +} + +private: + +typedef int Missing; + +/* + * So, how is this module structured? + * + * Firstly, we need a bunch of support code. The first block of this contains + * some CTFE functions for string manipulation (to cut down on the number of + * template symbols we generate.) + * + * The next contains a boat-load of templates. Most of these are trait + * templates (things like isPOD, isObject, etc.) There are also a number of + * mixins, and some switching templates (like toString_(n).) + * + * Another thing to mention is intCmp, which performs a safe comparison + * between two integers of arbitrary size and signage. + * + * Following all this are the templated to* implementations. + * + * The actual toImpl template is the second last thing in the module, with the + * module unit tests coming last. + */ + +char ctfe_upper(char c) +{ + if( 'a' <= c && c <= 'z' ) + return (c - 'a') + 'A'; + else + return c; +} + +char[] ctfe_camelCase(char[] s) +{ + char[] result; + + bool nextIsCapital = true; + + foreach( c ; s ) + { + if( nextIsCapital ) + { + if( c == '_' ) + result ~= c; + else + { + result ~= ctfe_upper(c); + nextIsCapital = false; + } + } + else + { + if( c == '_' ) + nextIsCapital = true; + else + result ~= c; + } + } + + return result; +} + +bool ctfe_isSpace(T)(T c) +{ + static if (T.sizeof is 1) + return (c <= 32 && (c is ' ' | c is '\t' | c is '\r' + | c is '\n' | c is '\v' | c is '\f')); + else + return (c <= 32 && (c is ' ' | c is '\t' | c is '\r' + | c is '\n' | c is '\v' | c is '\f')) + || (c is '\u2028' | c is '\u2029'); +} + +T[] ctfe_triml(T)(T[] source) +{ + if( source.length == 0 ) + return null; + + foreach( i,c ; source ) + if( !ctfe_isSpace(c) ) + return source[i..$]; + + return null; +} + +T[] ctfe_trimr(T)(T[] source) +{ + if( source.length == 0 ) + return null; + + foreach_reverse( i,c ; source ) + if( !ctfe_isSpace(c) ) + return source[0..i+1]; + + return null; +} + +T[] ctfe_trim(T)(T[] source) +{ + return ctfe_trimr(ctfe_triml(source)); +} + +template isPOD(T) +{ + static if( is( T == struct ) || is( T == union ) ) + const isPOD = true; + else + const isPOD = false; +} + +template isObject(T) +{ + static if( is( T == class ) || is( T == interface ) ) + const isObject = true; + else + const isObject = false; +} + +template isUDT(T) +{ + const isUDT = isPOD!(T) || isObject!(T); +} + +template isString(T) +{ + static if( is( typeof(T[]) == char[] ) + || is( typeof(T[]) == wchar[] ) + || is( typeof(T[]) == dchar[] ) ) + const isString = true; + else + const isString = false; +} + +template isArrayType(T) +{ + const isArrayType = isDynamicArrayType!(T) || isStaticArrayType!(T); +} + +template isPointerType(T) +{ + /* + * You might think these first two tests are redundant. You'd be wrong. + * The linux compilers, for whatever reason, seem to think that objects + * and arrays are implicitly castable to void*, whilst the Windows one + * doesn't. Don't ask me; just nod and smile... + */ + static if( is( T : Object ) ) + const isPointerType = false; + else static if( is( T : void[] ) ) + const isPointerType = false; + else static if( is( T : void* ) ) + const isPointerType = true; + else + const isPointerType = false; +} + +static assert( isPointerType!(char*) ); +static assert( isPointerType!(void*) ); +static assert( !isPointerType!(char[]) ); +static assert( !isPointerType!(void[]) ); +static assert( !isPointerType!(typeof("abc")) ); +static assert( !isPointerType!(Object) ); + +/* + * Determines which signed integer type of T and U is larger. + */ +template sintSuperType(T,U) +{ + static if( is( T == long ) || is( U == long ) ) + alias long sintSuperType; + else static if( is( T == int ) || is( U == int ) ) + alias int sintSuperType; + else static if( is( T == short ) || is( U == short ) ) + alias short sintSuperType; + else static if( is( T == byte ) || is( U == byte ) ) + alias byte sintSuperType; +} + +/* + * Determines which unsigned integer type of T and U is larger. + */ +template uintSuperType(T,U) +{ + static if( is( T == ulong ) || is( U == ulong ) ) + alias ulong sintSuperType; + else static if( is( T == uint ) || is( U == uint ) ) + alias uint sintSuperType; + else static if( is( T == ushort ) || is( U == ushort ) ) + alias ushort sintSuperType; + else static if( is( T == ubyte ) || is( U == ubyte ) ) + alias ubyte sintSuperType; +} + +template uintOfSize(uint bytes) +{ + static if( bytes == 1 ) + alias ubyte uintOfSize; + else static if( bytes == 2 ) + alias ushort uintOfSize; + else static if( bytes == 4 ) + alias uint uintOfSize; +} + +/* + * Safely performs a comparison between two integer values, taking into + * account different sizes and signages. + */ +int intCmp(T,U)(T lhs, U rhs) +{ + static if( isSignedIntegerType!(T) && isSignedIntegerType!(U) ) + { + alias sintSuperType!(T,U) S; + auto l = cast(S) lhs; + auto r = cast(S) rhs; + if( l < r ) return -1; + else if( l > r ) return 1; + else return 0; + } + else static if( isUnsignedIntegerType!(T) && isUnsignedIntegerType!(U) ) + { + alias uintSuperType!(T,U) S; + auto l = cast(S) lhs; + auto r = cast(S) rhs; + if( l < r ) return -1; + else if( l > r ) return 1; + else return 0; + } + else + { + static if( isSignedIntegerType!(T) ) + { + if( lhs < 0 ) + return -1; + else + { + static if( U.sizeof >= T.sizeof ) + { + auto l = cast(U) lhs; + if( l < rhs ) return -1; + else if( l > rhs ) return 1; + else return 0; + } + else + { + auto l = cast(ulong) lhs; + auto r = cast(ulong) rhs; + if( l < r ) return -1; + else if( l > r ) return 1; + else return 0; + } + } + } + else static if( isSignedIntegerType!(U) ) + { + if( rhs < 0 ) + return 1; + else + { + static if( T.sizeof >= U.sizeof ) + { + auto r = cast(T) rhs; + if( lhs < r ) return -1; + else if( lhs > r ) return 1; + else return 0; + } + else + { + auto l = cast(ulong) lhs; + auto r = cast(ulong) rhs; + if( l < r ) return -1; + else if( l > r ) return 1; + else return 0; + } + } + } + } +} + +template unsupported(char[] desc="") +{ + static assert(false, "Unsupported conversion: cannot convert to " + ~ctfe_trim(D.stringof)~" from " + ~(desc!="" ? desc~" " : "")~ctfe_trim(S.stringof)~"."); +} + +template unsupported_backwards(char[] desc="") +{ + static assert(false, "Unsupported conversion: cannot convert to " + ~(desc!="" ? desc~" " : "")~ctfe_trim(D.stringof) + ~" from "~ctfe_trim(S.stringof)~"."); +} + +// TN works out the c_case name of the given type. +template TN(T:T[]) +{ + static if( is( T == char ) ) + const TN = "string"; + else static if( is( T == wchar ) ) + const TN = "wstring"; + else static if( is( T == dchar ) ) + const TN = "dstring"; + else + const TN = TN!(T)~"_array"; +} + +// ditto +template TN(T:T*) +{ + const TN = TN!(T)~"_pointer"; +} + +// ditto +template TN(T) +{ + static if( isAssocArrayType!(T) ) + const TN = TN!(typeof(T.keys[0]))~"_to_" + ~TN!(typeof(T.values[0]))~"_map"; + else + const TN = ctfe_trim(T.stringof); +} + +// Picks an appropriate toUtf* method from t.text.convert.Utf. +template toString_(T) +{ + static if( is( T == char[] ) ) + alias tango.text.convert.Utf.toString toString_; + + else static if( is( T == wchar[] ) ) + alias tango.text.convert.Utf.toString16 toString_; + + else + alias tango.text.convert.Utf.toString32 toString_; +} + +template UtfNum(T) +{ + const UtfNum = is(typeof(T[0])==char) ? "8" : ( + is(typeof(T[0])==wchar) ? "16" : "32"); +} + +template StringNum(T) +{ + const StringNum = is(typeof(T[0])==char) ? "" : ( + is(typeof(T[0])==wchar) ? "16" : "32"); +} + +// This mixin defines a general function for converting to a UDT. +template toUDT() +{ + D toDfromS() + { + static if( isString!(S) ) + { + static if( is( typeof(mixin("D.fromUtf" + ~UtfNum!(S)~"(value)")) : D ) ) + return mixin("D.fromUtf"~UtfNum!(S)~"(value)"); + + else static if( is( typeof(D.fromUtf8(""c)) : D ) ) + return D.fromUtf8(toString_!(char[])(value)); + + else static if( is( typeof(D.fromUtf16(""w)) : D ) ) + return D.fromUtf16(toString_!(wchar[])(value)); + + else static if( is( typeof(D.fromUtf32(""d)) : D ) ) + return D.fromUtf32(toString_!(dchar[])(value)); + + else static if( is( typeof(D.fromString(""c)) : D ) ) + { + static if( is( S == char[] ) ) + return D.fromString(value); + + else + return D.fromString(toString_!(char[])(value)); + } + + // Default fallbacks + + else static if( is( typeof(D.from!(S)(value)) : D ) ) + return D.from!(S)(value); + + else + mixin unsupported!("user-defined type"); + } + else + { + // TODO: Check for templates. Dunno what to do about them. + + static if( is( typeof(mixin("D.from_"~TN!(S)~"()")) : D ) ) + return mixin("D.from_"~TN!(S)~"()"); + + else static if( is( typeof(mixin("D.from" + ~ctfe_camelCase(TN!(S))~"()")) : D ) ) + return mixin("D.from"~ctfe_camelCase(TN!(S))~"()"); + + else static if( is( typeof(D.from!(S)(value)) : D ) ) + return D.from!(S)(value); + + else + mixin unsupported!("user-defined type"); + } + } +} + +// This mixin defines a general function for converting from a UDT. +template fromUDT(char[] fallthrough="") +{ + D toDfromS() + { + static if( isString!(D) ) + { + static if( is( typeof(mixin("value.toString" + ~StringNum!(D)~"()")) == D ) ) + return mixin("value.toString"~StringNum!(D)~"()"); + + else static if( is( typeof(value.toString()) == char[] ) ) + return toString_!(D)(value.toString); + + else static if( is( typeof(value.toString16()) == wchar[] ) ) + return toString_!(D)(value.toString16); + + else static if( is( typeof(value.toString32()) == dchar[] ) ) + return toString_!(D)(value.toString32); + + else static if( is( typeof(value.toString()) == char[] ) ) + { + static if( is( D == char[] ) ) + return value.toString; + + else + { + return toString_!(D)(value.toString); + } + } + + // Default fallbacks + + else static if( is( typeof(value.to!(D)()) : D ) ) + return value.to!(D)(); + + else static if( fallthrough != "" ) + mixin(fallthrough); + + else + mixin unsupported!("user-defined type"); + } + else + { + // TODO: Check for templates. Dunno what to do about them. + + static if( is( typeof(mixin("value.to_"~TN!(D)~"()")) : D ) ) + return mixin("value.to_"~TN!(D)~"()"); + + else static if( is( typeof(mixin("value.to" + ~ctfe_camelCase(TN!(D))~"()")) : D ) ) + return mixin("value.to"~ctfe_camelCase(TN!(D))~"()"); + + else static if( is( typeof(value.to!(D)()) : D ) ) + return value.to!(D)(); + + else static if( fallthrough != "" ) + mixin(fallthrough); + + else + mixin unsupported!("user-defined type"); + } + } +} + +template convError() +{ + void throwConvError() + { + // Since we're going to use to!(T) to convert the value to a string, + // we need to make sure we don't end up in a loop... + static if( isString!(D) || !is( typeof(to!(char[])(value)) == char[] ) ) + { + throw new ConversionException("Could not convert a value of type " + ~S.stringof~" to type "~D.stringof~"."); + } + else + { + throw new ConversionException("Could not convert `" + ~to!(char[])(value)~"` of type " + ~S.stringof~" to type "~D.stringof~"."); + } + } +} + +D toBool(D,S)(S value) +{ + static assert(is(D==bool)); + + static if( isIntegerType!(S) /+|| isRealType!(S) || isImaginaryType!(S) + || isComplexType!(S)+/ ) + // The weird comparison is to support NaN as true + return !(value == 0); + + else static if( isCharType!(S) ) + { + switch( value ) + { + case 'F': case 'f': + return false; + + case 'T': case 't': + return true; + + default: + mixin convError; + throwConvError; + } + } + + else static if( isString!(S) ) + { + switch( Ascii.toLower(value) ) + { + case "false": + return false; + + case "true": + return true; + + default: + mixin convError; + throwConvError; + } + } + /+ + else static if( isDynamicArrayType!(S) || isStaticArrayType!(S) ) + { + mixin unsupported!("array type"); + } + else static if( isAssocArrayType!(S) ) + { + mixin unsupported!("associative array type"); + } + else static if( isPointerType!(S) ) + { + mixin unsupported!("pointer type"); + } + else static if( is( S == typedef ) ) + { + mixin unsupported!("typedef'ed type"); + } + // +/ + else static if( isPOD!(S) || isObject!(S) ) + { + mixin fromUDT; + return toDfromS; + } + else + { + mixin unsupported; + } +} + +D toIntegerFromInteger(D,S)(S value) +{ + static if( (cast(ulong) D.max) >= (cast(ulong) S.max) + && (cast(long) D.min) <= (cast(long) S.min) ) + { + return cast(D) value; + } + else + { + mixin convError; // TODO: Overflow error + + if( intCmp(value,D.min)<0 || intCmp(value,D.max)>0 ) + { + throwConvError; + } + else + return cast(D) value; + } +} + +D toIntegerFromReal(D,S)(S value) +{ + auto v = tango.math.Math.round(value); + if( (cast(real) D.min) <= v && v <= (cast(real) D.max) ) + { + return cast(D) v; + } + else + { + mixin convError; // TODO: Overflow error + throwConvError; + } +} + +D toIntegerFromString(D,S)(S value) +{ + static if( is( S charT : charT[] ) ) + { + mixin convError; + + static if( is( D == ulong ) ) + { + uint len; + auto result = tango.text.convert.Integer.convert(value, 10, &len); + + if( len < value.length ) + throwConvError; + + return result; + } + else + { + uint len; + auto result = tango.text.convert.Integer.parse(value, 10, &len); + + if( len < value.length ) + throwConvError; + + return toIntegerFromInteger!(D,long)(result); + } + } +} + +D toInteger(D,S)(S value) +{ + static if( is( S == bool ) ) + return (value ? 1 : 0); + + else static if( isIntegerType!(S) ) + { + return toIntegerFromInteger!(D,S)(value); + } + else static if( isCharType!(S) ) + { + if( value >= '0' && value <= '9' ) + { + return cast(D)(value - '0'); + } + else + { + mixin convError; + throwConvError; + } + } + else static if( isRealType!(S) ) + { + return toIntegerFromReal!(D,S)(value); + } + else static if( isString!(S) ) + { + return toIntegerFromString!(D,S)(value); + } + else static if( isPOD!(S) || isObject!(S) ) + { + mixin fromUDT; + return toDfromS; + } + else + mixin unsupported; +} + +D toReal(D,S)(S value) +{ + /+static if( is( S == bool ) ) + return (value ? 1.0 : 0.0); + + else+/ static if( isIntegerType!(S) ) + return cast(D) value; + + /+else static if( isCharType!(S) ) + return cast(D) to!(uint)(value);+/ + + else static if( isString!(S) ) + return tango.text.convert.Float.parse(value); + + else static if( isPOD!(S) || isObject!(S) ) + { + mixin fromUDT; + return toDfromS; + } + else + mixin unsupported; +} + +D toImaginary(D,S)(S value) +{ + /+static if( is( S == bool ) ) + return (value ? 1.0i : 0.0i); + + else+/ static if( isComplexType!(S) ) + { + if( value.re == 0.0 ) + return value.im * cast(D)1.0i; + + else + { + mixin convError; + throwConvError; + } + } + else static if( isPOD!(S) || isObject!(S) ) + { + mixin fromUDT; + return toDfromS; + } + else + mixin unsupported; +} + +D toComplex(D,S)(S value) +{ + static if( isIntegerType!(S) || isRealType!(S) || isImaginaryType!(S) + || isComplexType!(S) ) + return cast(D) value; + + /+else static if( isCharType!(S) ) + return cast(D) to!(uint)(value);+/ + + else static if( isPOD!(S) || isObject!(S) ) + { + mixin fromUDT; + return toDfromS; + } + else + mixin unsupported; +} + +D toChar(D,S)(S value) +{ + static if( is( S == bool ) ) + return (value ? 't' : 'f'); + + else static if( isIntegerType!(S) ) + { + if( value >= 0 && value <= 9 ) + return cast(D) value+'0'; + + else + { + mixin convError; // TODO: Overflow error + throwConvError; + } + } + else static if( isPOD!(S) || isObject!(S) ) + { + mixin fromUDT; + return toDfromS; + } + else + mixin unsupported; +} + +D toStringFromString(D,S)(S value) +{ + static if( is( typeof(D[0]) == char ) ) + return tango.text.convert.Utf.toString(value); + + else static if( is( typeof(D[0]) == wchar ) ) + return tango.text.convert.Utf.toString16(value); + + else + { + static assert( is( typeof(D[0]) == dchar ) ); + return tango.text.convert.Utf.toString32(value); + } +} + +D toString(D,S)(S value) +{ + static if( is( S == bool ) ) + return (value ? "true" : "false"); + + else static if( isIntegerType!(S) ) + // TODO: Make sure this works with ulongs. + return mixin("tango.text.convert.Integer.toString"~StringNum!(D)~"(value)"); + + else static if( isRealType!(S) ) + return mixin("tango.text.convert.Float.toString"~StringNum!(D)~"(value)"); + + else static if( isDynamicArrayType!(S) || isStaticArrayType!(S) ) + mixin unsupported!("array type"); + + else static if( isAssocArrayType!(S) ) + mixin unsupported!("associative array type"); + + else static if( isPOD!(S) || isObject!(S) ) + { + mixin fromUDT; + return toDfromS; + } + else + mixin unsupported; +} + +D fromString(D,S)(D value) +{ + static if( isDynamicArrayType!(S) || isStaticArrayType!(S) ) + mixin unsupported_backwards!("array type"); + + else static if( isAssocArrayType!(S) ) + mixin unsupported_backwards!("associative array type"); + + else static if( isPOD!(S) || isObject!(S) ) + { + mixin toUDT; + return toDfromS; + } + else + mixin unsupported_backwards; +} + +D toArrayFromArray(D,S)(S value) +{ + alias typeof(D[0]) De; + + D result; result.length = value.length; + scope(failure) delete result; + + foreach( i,e ; value ) + result[i] = to!(De)(e); + + return result; +} + +D toMapFromMap(D,S)(S value) +{ + alias typeof(D.keys[0]) Dk; + alias typeof(D.values[0]) Dv; + + D result; + + foreach( k,v ; value ) + result[ to!(Dk)(k) ] = to!(Dv)(v); + + return result; +} + +D toFromUDT(D,S)(S value) +{ + // Try value.to* first + static if( is( typeof(mixin("value.to_"~TN!(D)~"()")) : D ) ) + return mixin("value.to_"~TN!(D)~"()"); + + else static if( is( typeof(mixin("value.to" + ~ctfe_camelCase(TN!(D))~"()")) : D ) ) + return mixin("value.to"~ctfe_camelCase(TN!(D))~"()"); + + else static if( is( typeof(value.to!(D)()) : D ) ) + return value.to!(D)(); + + // Ok, try D.from* now + else static if( is( typeof(mixin("D.from_"~TN!(S)~"(value)")) : D ) ) + return mixin("D.from_"~TN!(S)~"(value)"); + + else static if( is( typeof(mixin("D.from" + ~ctfe_camelCase(TN!(S))~"(value)")) : D ) ) + return mixin("D.from"~ctfe_camelCase(TN!(S))~"(value)"); + + else static if( is( typeof(D.from!(S)(value)) : D ) ) + return D.from!(S)(value); + + // Give up + else + mixin unsupported; +} + +D toImpl(D,S)(S value) +{ + static if( is( D == S ) ) + return value; + + else static if( isArrayType!(D) && isArrayType!(S) + && is( typeof(D[0]) == typeof(S[0]) ) ) + // Special-case which catches to!(T[])!(T[n]). + return value; + + else static if( is( D == bool ) ) + return toBool!(D,S)(value); + + else static if( isIntegerType!(D) ) + return toInteger!(D,S)(value); + + else static if( isRealType!(D) ) + return toReal!(D,S)(value); + + else static if( isImaginaryType!(D) ) + return toImaginary!(D,S)(value); + + else static if( isComplexType!(D) ) + return toComplex!(D,S)(value); + + else static if( isCharType!(D) ) + return toChar!(D,S)(value); + + else static if( isString!(D) && isString!(S) ) + return toStringFromString!(D,S)(value); + + else static if( isString!(D) ) + return toString!(D,S)(value); + + else static if( isString!(S) ) + return fromString!(D,S)(value); + + else static if( isArrayType!(D) && isArrayType!(S) ) + return toArrayFromArray!(D,S)(value); + + else static if( isAssocArrayType!(D) && isAssocArrayType!(S) ) + return toMapFromMap!(D,S)(value); + + else static if( isUDT!(D) || isUDT!(S) ) + return toFromUDT!(D,S)(value); + + else + mixin unsupported; +} + +debug ( ConvertTest ): + void main() {} + +debug( UnitTest ): + + +bool ex(T)(lazy T v) +{ + bool result = false; + try + { + v(); + } + catch( Exception _ ) + { + result = true; + } + return result; +} + +bool nx(T)(lazy T v) +{ + bool result = true; + try + { + v(); + } + catch( Exception _ ) + { + result = false; + } + return result; +} + +struct Foo +{ + int toInt() { return 42; } + + char[] toString() { return "string foo"; } + + int[] toIntArray() { return [1,2,3]; } + + Bar toBar() + { + Bar result; return result; + } + + T to(T)() + { + static if( is( T == bool ) ) + return true; + else + static assert( false ); + } +} + +struct Bar +{ + real toReal() + { + return 3.14159; + } + + ireal toIreal() + { + return 42.0i; + } +} + +struct Baz +{ + static Baz fromFoo(Foo foo) + { + Baz result; return result; + } + + Bar toBar() + { + Bar result; return result; + } +} + +unittest +{ + /* + * bool + */ + static assert( !is( typeof(to!(bool)(1.0)) ) ); + static assert( !is( typeof(to!(bool)(1.0i)) ) ); + static assert( !is( typeof(to!(bool)(1.0+1.0i)) ) ); + + assert( to!(bool)(0) == false ); + assert( to!(bool)(1) == true ); + assert( to!(bool)(-1) == true ); + + assert( to!(bool)('t') == true ); + assert( to!(bool)('T') == true ); + assert( to!(bool)('f') == false ); + assert( to!(bool)('F') == false ); + assert(ex( to!(bool)('x') )); + + assert( to!(bool)("true") == true ); + assert( to!(bool)("false") == false ); + assert( to!(bool)("TrUe") == true ); + assert( to!(bool)("fAlSe") == false ); + + /* + * Integer + */ + assert( to!(int)(42L) == 42 ); + assert( to!(byte)(42) == cast(byte)42 ); + assert( to!(short)(-1701) == cast(short)-1701 ); + assert( to!(long)(cast(ubyte)72) == 72L ); + + assert(nx( to!(byte)(127) )); + assert(ex( to!(byte)(128) )); + assert(nx( to!(byte)(-128) )); + assert(ex( to!(byte)(-129) )); + + assert(nx( to!(ubyte)(255) )); + assert(ex( to!(ubyte)(256) )); + assert(nx( to!(ubyte)(0) )); + assert(ex( to!(ubyte)(-1) )); + + assert(nx( to!(long)(9_223_372_036_854_775_807UL) )); + assert(ex( to!(long)(9_223_372_036_854_775_808UL) )); + assert(nx( to!(ulong)(0L) )); + assert(ex( to!(ulong)(-1L) )); + + assert( to!(int)(3.14159) == 3 ); + assert( to!(int)(2.71828) == 3 ); + + assert( to!(int)("1234") == 1234 ); + + assert( to!(int)(true) == 1 ); + assert( to!(int)(false) == 0 ); + + assert( to!(int)('0') == 0 ); + assert( to!(int)('9') == 9 ); + + /* + * Real + */ + assert( to!(real)(3) == 3.0 ); + assert( to!(real)("1.125") == 1.125 ); + + /* + * Imaginary + */ + static assert( !is( typeof(to!(ireal)(3.0)) ) ); + + assert( to!(ireal)(0.0+1.0i) == 1.0i ); + assert(nx( to!(ireal)(0.0+1.0i) )); + assert(ex( to!(ireal)(1.0+0.0i) )); + + /* + * Complex + */ + assert( to!(creal)(1) == (1.0+0.0i) ); + assert( to!(creal)(2.0) == (2.0+0.0i) ); + assert( to!(creal)(3.0i) == (0.0+3.0i) ); + + /* + * Char + */ + assert( to!(char)(true) == 't' ); + assert( to!(char)(false) == 'f' ); + + assert( to!(char)(0) == '0' ); + assert( to!(char)(9) == '9' ); + + assert(ex( to!(char)(-1) )); + assert(ex( to!(char)(10) )); + + /* + * String-string + */ + assert( to!(char[])("Í love to æt "w) == "Í love to æt "c ); + assert( to!(char[])("them smûrƒies™,"d) == "them smûrƒies™,"c ); + assert( to!(wchar[])("Smûrfies™ I love"c) == "Smûrfies™ I love"w ); + assert( to!(wchar[])("2 食い散らす"d) == "2 食い散らす"w ); + assert( to!(dchar[])("bite đey µgly"c) == "bite đey µgly"d ); + assert( to!(dchar[])("headž ㍳ff"w) == "headž ㍳ff"d ); + // ... nibble on they bluish feet. + + /* + * String + */ + assert( to!(char[])(true) == "true" ); + assert( to!(char[])(false) == "false" ); + + assert( to!(char[])(12345678) == "12345678" ); + assert( to!(char[])(1234.567800) == "1234.57"); + + /* + * Array-array + */ + assert( to!(ubyte[])([1,2,3]) == [cast(ubyte)1, 2, 3] ); + assert( to!(bool[])(["true"[], "false"]) == [true, false] ); + + /* + * Map-map + */ + { + char[][int] src = [1:"true"[], 2:"false"]; + bool[ubyte] dst = to!(bool[ubyte])(src); + assert( dst.keys.length == 2 ); + assert( dst[1] == true ); + assert( dst[2] == false ); + } + + /* + * UDT + */ + { + Foo foo; + + assert( to!(bool)(foo) == true ); + assert( to!(int)(foo) == 42 ); + assert( to!(char[])(foo) == "string foo" ); + assert( to!(wchar[])(foo) == "string foo"w ); + assert( to!(dchar[])(foo) == "string foo"d ); + assert( to!(int[])(foo) == [1,2,3] ); + assert( to!(ireal)(to!(Bar)(foo)) == 42.0i ); + assert( to!(real)(to!(Bar)(to!(Baz)(foo))) == 3.14159 ); + } + + /* + * Default values + */ + { + assert( to!(int)("123", 456) == 123, + `to!(int)("123", 456) == "` ~ to!(char[])( + to!(int)("123", 456)) ~ `"` ); + assert( to!(int)("abc", 456) == 456, + `to!(int)("abc", 456) == "` ~ to!(char[])( + to!(int)("abc", 456)) ~ `"` ); + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/PathUtil.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/PathUtil.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,471 @@ +/******************************************************************************* + + copyright: Copyright (c) 2006 Lars Ivar Igesund, Thomas Kühne, + Grzegorz Adam Hankiewicz + + license: BSD style: $(LICENSE) + + version: Dec 2006: Initial release + + author: Lars Ivar Igesund, Thomas Kühne, + Grzegorz Adam Hankiewicz + +*******************************************************************************/ + +module tango.util.PathUtil; + +private import tango.core.Exception; + +/******************************************************************************* + + Normalizes a path component as specified in section 5.2 of RFC 2396. + + ./ in path is removed + /. at the end is removed + /.. at the end is removed + /../ in path is removed + + Unless normSlash is set to false, all slashes will be converted + to the systems path separator character. + + Note that any number of ../ segments at the front is ignored, + unless it is an absolute path, in which case an exception will + be thrown. A relative path with ../ segments at the front is only + considered valid if it can be joined with a path such that it can + be fully normalized. + + Throws: Exception if the root separator is followed by .. + + Examples: + ----- + normalize("/home/foo/./bar/../../john/doe"); // => "/home/john/doe" + ----- + +*******************************************************************************/ + +char[] normalize(char[] path, bool normSlash = true) +{ + /* + Internal helper to patch slashes + */ + char[] normalizeSlashes(char[] path) + { + char to = '/', from = '\\'; + + foreach (inout c; path) + if (c is from) + c = to; + return path; + } + + /* + Internal helper that finds a slash followed by a dot + */ + int findSlashDot(char[] path, int start) { + assert(start < path.length); + foreach(i, c; path[start..$-1]) + if (c == '/') + if (path[start+i+1] == '.') + return i + start + 1; + + return -1; + } + + /* + Internal helper that finds a slash starting at the back + */ + int findSlash(char[] path, int start) { + assert(start < path.length); + + if (start < 0) + return -1; + + for (int i = start; i >= 0; i--) { + if (path[i] == '/') { + return i; + } + } + return -1; + } + + /* + Internal helper that recursively shortens all segments with dots. + */ + char[] removeDots(char[] path, int start) { + assert (start < path.length); + assert (path[start] == '.'); + if (start + 1 == path.length) { + // path ends with /., remove + return path[0..start - 1]; + } + else if (path[start+1] == '/') { + // remove all subsequent './' + do { + path = path[0..start] ~ path[start+2..$]; + } while (start + 2 < path.length && path[start..start+2] == "./"); + int idx = findSlashDot(path, start - 1); + if (idx < 0) { + // no more /., return path + return path; + } + return removeDots(path, idx); + } + else if (path[start..start+2] == "..") { + // found /.. sequence +version (Win32) { + if (start == 3 && path[1] == '/') { // absolute, X:/.. + throw new IllegalArgumentException("PathUtil :: Invalid absolute path, root can not be followed by .."); + } + +} +else { + if (start == 1) { // absolute + throw new IllegalArgumentException("PathUtil :: Invalid absolute path, root separator can not be followed by .."); + } +} + int idx = findSlash(path, start - 2); + if (start + 2 == path.length) { + // path ends with /.. + if (idx < 0) { + // no more slashes in front of /.., resolves to empty path + return ""; + } + // remove /.. and preceding segment and return + return path[0..idx]; + } + else if (path[start+2] == '/') { + // found /../ sequence + // if no slashes before /../, set path to everything after + // if /../ is ../../, keep + // otherwise, remove /../ + if (path[idx+1..start-1] == "..") { + idx = findSlashDot(path, start+4); + if (idx < 0) { + // no more /., path fully shortened + return path; + } + return removeDots(path, idx); + } + path = path[0..idx < 0 ? 0 : idx + 1] ~ path[start+3..$]; + idx = findSlashDot(path, idx < 0 ? 0 : idx); + if (idx < 0) { + // no more /., path fully shortened + return path; + } + // examine next /. + return removeDots(path, idx); + } + } + else { + if (findSlash(path, path.length - 1) < start) + // segment is filename that starts with ., and at the end + return path; + else { + // not at end + int idx = findSlashDot(path, start); + if (idx > -1) + return removeDots(path, idx); + else + return path; + } + } + assert(false, "PathUtil :: invalid code path"); + } + + char[] normpath = path.dup; + if (normSlash) { + normpath = normalizeSlashes(normpath); + } + + // if path starts with ./, remove all subsequent instances + while (normpath.length > 1 && normpath[0] == '.' && + normpath[1] == '/') { + normpath = normpath[2..$]; + } + int idx = findSlashDot(normpath, 0); + if (idx > -1) { + normpath = removeDots(normpath, idx); + } + + return normpath; +} + + +debug (UnitTest) +{ + + unittest + { + assert (normalize ("/home/../john/../.tango/.htaccess") == "/.tango/.htaccess", + normalize ("/home/../john/../.tango/.htaccess")); + assert (normalize ("/home/../john/../.tango/foo.conf") == "/.tango/foo.conf", + normalize ("/home/../john/../.tango/foo.conf")); + assert (normalize ("/home/john/.tango/foo.conf") == "/home/john/.tango/foo.conf", + normalize ("/home/john/.tango/foo.conf")); + assert (normalize ("/foo/bar/.htaccess") == "/foo/bar/.htaccess", + normalize ("/foo/bar/.htaccess")); + assert (normalize ("foo/bar/././.") == "foo/bar", + normalize ("foo/bar/././.")); + assert (normalize ("././foo/././././bar") == "foo/bar", + normalize ("././foo/././././bar")); + assert (normalize ("/foo/../john") == "/john", + normalize("/foo/../john")); + assert (normalize ("foo/../john") == "john"); + assert (normalize ("foo/bar/..") == "foo"); + assert (normalize ("foo/bar/../john") == "foo/john"); + assert (normalize ("foo/bar/doe/../../john") == "foo/john"); + assert (normalize ("foo/bar/doe/../../john/../bar") == "foo/bar"); + assert (normalize ("./foo/bar/doe") == "foo/bar/doe"); + assert (normalize ("./foo/bar/doe/../../john/../bar") == "foo/bar"); + assert (normalize ("./foo/bar/../../john/../bar") == "bar"); + assert (normalize ("foo/bar/./doe/../../john") == "foo/john"); + assert (normalize ("../../foo/bar") == "../../foo/bar"); + assert (normalize ("../../../foo/bar") == "../../../foo/bar"); + assert (normalize ("d/") == "d/"); + + assert (normalize ("\\foo\\..\\john") == "/john"); + assert (normalize ("foo\\..\\john") == "john"); + assert (normalize ("foo\\bar\\..") == "foo"); + assert (normalize ("foo\\bar\\..\\john") == "foo/john"); + assert (normalize ("foo\\bar\\doe\\..\\..\\john") == "foo/john"); + assert (normalize ("foo\\bar\\doe\\..\\..\\john\\..\\bar") == "foo/bar"); + assert (normalize (".\\foo\\bar\\doe") == "foo/bar/doe"); + assert (normalize (".\\foo\\bar\\doe\\..\\..\\john\\..\\bar") == "foo/bar"); + assert (normalize (".\\foo\\bar\\..\\..\\john\\..\\bar") == "bar"); + assert (normalize ("foo\\bar\\.\\doe\\..\\..\\john") == "foo/john"); + assert (normalize ("..\\..\\foo\\bar") == "../../foo/bar"); + assert (normalize ("..\\..\\..\\foo\\bar") == "../../../foo/bar"); + } +} + + +/****************************************************************************** + + Matches a pattern against a filename. + + Some characters of pattern have special a meaning (they are + meta-characters) and can't be escaped. These are: +

+ + + + + + + + +
*Matches 0 or more instances of any character.
?Matches exactly one instances of any character.
[chars]Matches one instance of any character that appears + between the brackets.
[!chars]Matches one instance of any character that does not appear + between the brackets after the exclamation mark.

+ Internally individual character comparisons are done calling + charMatch(), so its rules apply here too. Note that path + separators and dots don't stop a meta-character from matching + further portions of the filename. + + Returns: true if pattern matches filename, false otherwise. + + See_Also: charMatch(). + + Throws: Nothing. + + Examples: + ----- + version(Win32) + { + patternMatch("foo.bar", "*") // => true + patternMatch(r"foo/foo\bar", "f*b*r") // => true + patternMatch("foo.bar", "f?bar") // => false + patternMatch("Goo.bar", "[fg]???bar") // => true + patternMatch(r"d:\foo\bar", "d*foo?bar") // => true + } + version(Posix) + { + patternMatch("Go*.bar", "[fg]???bar") // => false + patternMatch("/foo*home/bar", "?foo*bar") // => true + patternMatch("foobar", "foo?bar") // => true + } + ----- + +******************************************************************************/ + +bool patternMatch(char[] filename, char[] pattern) +in +{ + // Verify that pattern[] is valid + int i; + int inbracket = false; + + for (i = 0; i < pattern.length; i++) + { + switch (pattern[i]) + { + case '[': + assert(!inbracket); + inbracket = true; + break; + + case ']': + assert(inbracket); + inbracket = false; + break; + + default: + break; + } + } +} +body +{ + int pi; + int ni; + char pc; + char nc; + int j; + int not; + int anymatch; + + ni = 0; + for (pi = 0; pi < pattern.length; pi++) + { + pc = pattern[pi]; + switch (pc) + { + case '*': + if (pi + 1 == pattern.length) + goto match; + for (j = ni; j < filename.length; j++) + { + if (patternMatch(filename[j .. filename.length], + pattern[pi + 1 .. pattern.length])) + goto match; + } + goto nomatch; + + case '?': + if (ni == filename.length) + goto nomatch; + ni++; + break; + + case '[': + if (ni == filename.length) + goto nomatch; + nc = filename[ni]; + ni++; + not = 0; + pi++; + if (pattern[pi] == '!') + { + not = 1; + pi++; + } + anymatch = 0; + while (1) + { + pc = pattern[pi]; + if (pc == ']') + break; + if (!anymatch && charMatch(nc, pc)) + anymatch = 1; + pi++; + } + if (!(anymatch ^ not)) + goto nomatch; + break; + + default: + if (ni == filename.length) + goto nomatch; + nc = filename[ni]; + if (!charMatch(pc, nc)) + goto nomatch; + ni++; + break; + } + } + if (ni < filename.length) + goto nomatch; + + match: + return true; + + nomatch: + return false; +} + + +debug (UnitTest) +{ + unittest + { + version (Win32) + assert(patternMatch("foo", "Foo")); + version (Posix) + assert(!patternMatch("foo", "Foo")); + + assert(patternMatch("foo", "*")); + assert(patternMatch("foo.bar", "*")); + assert(patternMatch("foo.bar", "*.*")); + assert(patternMatch("foo.bar", "foo*")); + assert(patternMatch("foo.bar", "f*bar")); + assert(patternMatch("foo.bar", "f*b*r")); + assert(patternMatch("foo.bar", "f???bar")); + assert(patternMatch("foo.bar", "[fg]???bar")); + assert(patternMatch("foo.bar", "[!gh]*bar")); + + assert(!patternMatch("foo", "bar")); + assert(!patternMatch("foo", "*.*")); + assert(!patternMatch("foo.bar", "f*baz")); + assert(!patternMatch("foo.bar", "f*b*x")); + assert(!patternMatch("foo.bar", "[gh]???bar")); + assert(!patternMatch("foo.bar", "[!fg]*bar")); + assert(!patternMatch("foo.bar", "[fg]???baz")); + + } +} + + +/****************************************************************************** + + Matches filename characters. + + Under Windows, the comparison is done ignoring case. Under Linux + an exact match is performed. + + Returns: true if c1 matches c2, false otherwise. + + Throws: Nothing. + + Examples: + ----- + version(Win32) + { + charMatch('a', 'b') // => false + charMatch('A', 'a') // => true + } + version(Posix) + { + charMatch('a', 'b') // => false + charMatch('A', 'a') // => false + } + ----- +******************************************************************************/ + +private bool charMatch(char c1, char c2) +{ + version (Win32) + { + + if (c1 != c2) + { + return ((c1 >= 'a' && c1 <= 'z') ? c1 - ('a' - 'A') : c1) == + ((c2 >= 'a' && c2 <= 'z') ? c2 - ('a' - 'A') : c2); + } + return true; + } + version (Posix) + { + return c1 == c2; + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/ArrayBag.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/ArrayBag.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,617 @@ +/* + File: ArrayBag.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 24Sep95 dl@cs.oswego.edu Create from store.d working file + 13Oct95 dl Changed protection statuses + +*/ + + +module tango.util.collection.ArrayBag; + +private import tango.core.Exception; + +private import tango.util.collection.model.GuardIterator; + +private import tango.util.collection.impl.CLCell, + tango.util.collection.impl.BagCollection, + tango.util.collection.impl.AbstractIterator; + + + +/** + * + * Linked Buffer implementation of Bags. The Bag consists of + * any number of buffers holding elements, arranged in a list. + * Each buffer holds an array of elements. The size of each + * buffer is the value of chunkSize that was current during the + * operation that caused the Bag to grow. The chunkSize() may + * be adjusted at any time. (It is not considered a version change.) + * + *

+ * All but the final buffer is always kept full. + * When a buffer has no elements, it is released (so is + * available for garbage collection). + *

+ * ArrayBags are good choices for collections in which + * you merely put a lot of things in, and then look at + * them via enumerations, but don't often look for + * particular elements. + * + * + author: Doug Lea + * @version 0.93 + * + *

For an introduction to this package see Overview . +**/ + +public class ArrayBag(T) : BagCollection!(T) +{ + alias CLCell!(T[]) CLCellT; + + alias BagCollection!(T).remove remove; + alias BagCollection!(T).removeAll removeAll; + + /** + * The default chunk size to use for buffers + **/ + + public static int defaultChunkSize = 32; + + // instance variables + + /** + * The last node of the circular list of chunks. Null if empty. + **/ + + package CLCellT tail; + + /** + * The number of elements of the tail node actually used. (all others + * are kept full). + **/ + protected int lastCount; + + /** + * The chunk size to use for making next buffer + **/ + + protected int chunkSize_; + + // constructors + + /** + * Make an empty buffer. + **/ + public this () + { + this (null, 0, null, 0, defaultChunkSize); + } + + /** + * Make an empty buffer, using the supplied element screener. + **/ + + public this (Predicate s) + { + this (s, 0, null, 0, defaultChunkSize); + } + + /** + * Special version of constructor needed by clone() + **/ + protected this (Predicate s, int n, CLCellT t, int lc, int cs) + { + super (s); + count = n; + tail = t; + lastCount = lc; + chunkSize_ = cs; + } + + /** + * Make an independent copy. Does not clone elements. + **/ + + public final ArrayBag duplicate () + { + if (count is 0) + return new ArrayBag (screener); + else + { + CLCellT h = tail.copyList(); + CLCellT p = h; + + do { + T[] obuff = p.element(); + T[] nbuff = new T[obuff.length]; + + for (int i = 0; i < obuff.length; ++i) + nbuff[i] = obuff[i]; + + p.element(nbuff); + p = p.next(); + } while (p !is h); + + return new ArrayBag (screener, count, h, lastCount, chunkSize_); + } + } + + + /** + * Report the chunk size used when adding new buffers to the list + **/ + + public final int chunkSize() + { + return chunkSize_; + } + + /** + * Set the chunk size to be used when adding new buffers to the + * list during future add() operations. + * Any value greater than 0 is OK. (A value of 1 makes this a + * into very slow simulation of a linked list!) + **/ + + public final void chunkSize (int newChunkSize) + { + if (newChunkSize > 0) + chunkSize_ = newChunkSize; + else + throw new IllegalArgumentException("Attempt to set negative chunk size value"); + } + + // Collection methods + + /* + This code is pretty repetitive, but I don't know a nice way to + separate traversal logic from actions + */ + + /** + * Implements tango.util.collection.impl.Collection.Collection.contains + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.Collection.Collection.contains + **/ + public final bool contains(T element) + { + if (!isValidArg(element) || count is 0) + return false; + + CLCellT p = tail.next(); + + for (;;) + { + T[] buff = p.element(); + bool isLast = p is tail; + + int n; + if (isLast) + n = lastCount; + else + n = buff.length; + + for (int i = 0; i < n; ++i) + { + if (buff[i] == (element)) + return true; + } + + if (isLast) + break; + else + p = p.next(); + } + return false; + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.instances + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.Collection.instances + **/ + public final uint instances(T element) + { + if (!isValidArg(element) || count is 0) + return 0; + + uint c = 0; + CLCellT p = tail.next(); + + for (;;) + { + T[] buff = p.element(); + bool isLast = p is tail; + + int n; + if (isLast) + n = lastCount; + else + n = buff.length; + + for (int i = 0; i < n; ++i) + { + if (buff[i] == (element)) + ++c; + } + + if (isLast) + break; + else + p = p.next(); + } + return c; + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.elements + * Time complexity: O(1). + * See_Also: tango.util.collection.impl.Collection.Collection.elements + **/ + public final GuardIterator!(T) elements() + { + return new ArrayIterator!(T)(this); + } + + /** + * Implements tango.util.collection.model.View.View.opApply + * Time complexity: O(n). + * See_Also: tango.util.collection.model.View.View.opApply + **/ + int opApply (int delegate (inout T value) dg) + { + auto scope iterator = new ArrayIterator!(T)(this); + return iterator.opApply (dg); + } + + // MutableCollection methods + + /** + * Implements tango.util.collection.impl.Collection.Collection.clear. + * Time complexity: O(1). + * See_Also: tango.util.collection.impl.Collection.Collection.clear + **/ + public final void clear() + { + setCount(0); + tail = null; + lastCount = 0; + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.removeAll. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.Collection.Collection.removeAll + **/ + public final void removeAll (T element) + { + remove_(element, true); + } + + + /** + * Implements tango.util.collection.impl.Collection.Collection.removeOneOf. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.Collection.Collection.removeOneOf + **/ + public final void remove(T element) + { + remove_(element, false); + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.replaceOneOf + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.Collection.Collection.replaceOneOf + **/ + public final void replace(T oldElement, T newElement) + { + replace_(oldElement, newElement, false); + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.replaceAllOf. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.Collection.Collection.replaceAllOf + **/ + public final void replaceAll(T oldElement, T newElement) + { + replace_(oldElement, newElement, true); + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.take. + * Time complexity: O(1). + * Takes the least element. + * See_Also: tango.util.collection.impl.Collection.Collection.take + **/ + public final T take() + { + if (count !is 0) + { + T[] buff = tail.element(); + T v = buff[lastCount -1]; + buff[lastCount -1] = T.init; + shrink_(); + return v; + } + checkIndex(0); + return T.init; // not reached + } + + + + // MutableBag methods + + /** + * Implements tango.util.collection.MutableBag.addIfAbsent. + * Time complexity: O(n). + * See_Also: tango.util.collection.MutableBag.addIfAbsent + **/ + public final void addIf(T element) + { + if (!contains(element)) + add (element); + } + + + /** + * Implements tango.util.collection.MutableBag.add. + * Time complexity: O(1). + * See_Also: tango.util.collection.MutableBag.add + **/ + public final void add (T element) + { + checkElement(element); + + incCount(); + if (tail is null) + { + tail = new CLCellT(new T[chunkSize_]); + lastCount = 0; + } + + T[] buff = tail.element(); + if (lastCount is buff.length) + { + buff = new T[chunkSize_]; + tail.addNext(buff); + tail = tail.next(); + lastCount = 0; + } + + buff[lastCount++] = element; + } + + /** + * helper for remove/exclude + **/ + + private final void remove_(T element, bool allOccurrences) + { + if (!isValidArg(element) || count is 0) + return ; + + CLCellT p = tail; + + for (;;) + { + T[] buff = p.element(); + int i = (p is tail) ? lastCount - 1 : buff.length - 1; + + while (i >= 0) + { + if (buff[i] == (element)) + { + T[] lastBuff = tail.element(); + buff[i] = lastBuff[lastCount -1]; + lastBuff[lastCount -1] = T.init; + shrink_(); + + if (!allOccurrences || count is 0) + return ; + + if (p is tail && i >= lastCount) + i = lastCount -1; + } + else + --i; + } + + if (p is tail.next()) + break; + else + p = p.prev(); + } + } + + private final void replace_(T oldElement, T newElement, bool allOccurrences) + { + if (!isValidArg(oldElement) || count is 0 || oldElement == (newElement)) + return ; + + CLCellT p = tail.next(); + + for (;;) + { + T[] buff = p.element(); + bool isLast = p is tail; + + int n; + if (isLast) + n = lastCount; + else + n = buff.length; + + for (int i = 0; i < n; ++i) + { + if (buff[i] == (oldElement)) + { + checkElement(newElement); + incVersion(); + buff[i] = newElement; + if (!allOccurrences) + return ; + } + } + + if (isLast) + break; + else + p = p.next(); + } + } + + private final void shrink_() + { + decCount(); + lastCount--; + if (lastCount is 0) + { + if (count is 0) + clear(); + else + { + CLCellT tmp = tail; + tail = tail.prev(); + tmp.unlink(); + T[] buff = tail.element(); + lastCount = buff.length; + } + } + } + + // ImplementationCheckable methods + + /** + * Implements tango.util.collection.model.View.View.checkImplementation. + * See_Also: tango.util.collection.model.View.View.checkImplementation + **/ + public override void checkImplementation() + { + + super.checkImplementation(); + assert(chunkSize_ >= 0); + assert(lastCount >= 0); + assert(((count is 0) is (tail is null))); + + if (tail is null) + return ; + + int c = 0; + CLCellT p = tail.next(); + + for (;;) + { + T[] buff = p.element(); + bool isLast = p is tail; + + int n; + if (isLast) + n = lastCount; + else + n = buff.length; + + c += n; + for (int i = 0; i < n; ++i) + { + auto v = buff[i]; + assert(allows(v) && contains(v)); + } + + if (isLast) + break; + else + p = p.next(); + } + + assert(c is count); + + } + + + + /*********************************************************************** + + opApply() has migrated here to mitigate the virtual call + on method get() + + ************************************************************************/ + + static class ArrayIterator(T) : AbstractIterator!(T) + { + private CLCellT cell; + private T[] buff; + private int index; + + public this (ArrayBag bag) + { + super(bag); + cell = bag.tail; + + if (cell) + buff = cell.element(); + } + + public final T get() + { + decRemaining(); + if (index >= buff.length) + { + cell = cell.next(); + buff = cell.element(); + index = 0; + } + return buff[index++]; + } + + int opApply (int delegate (inout T value) dg) + { + int result; + + for (auto i=remaining(); i--;) + { + auto value = get(); + if ((result = dg(value)) != 0) + break; + } + return result; + } + } +} + + + + +debug (Test) +{ + import tango.io.Console; + + void main() + { + auto bag = new ArrayBag!(char[]); + bag.add ("foo"); + bag.add ("bar"); + bag.add ("wumpus"); + + foreach (value; bag.elements) {} + + auto elements = bag.elements(); + while (elements.more) + auto v = elements.get(); + + foreach (value; bag) + Cout (value).newline; + + bag.checkImplementation(); + + Cout (bag).newline; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/ArraySeq.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/ArraySeq.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,924 @@ +/* + File: ArraySeq.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 2Oct95 dl@cs.oswego.edu refactored from DASeq.d + 13Oct95 dl Changed protection statuses + +*/ + + +module tango.util.collection.ArraySeq; + +private import tango.util.collection.model.Iterator, + tango.util.collection.model.Sortable, + tango.util.collection.model.Comparator, + tango.util.collection.model.GuardIterator; + +private import tango.util.collection.impl.SeqCollection, + tango.util.collection.impl.AbstractIterator; + + +/** + * + * Dynamically allocated and resized Arrays. + * + * Beyond implementing its interfaces, adds methods + * to adjust capacities. The default heuristics for resizing + * usually work fine, but you can adjust them manually when + * you need to. + * + * ArraySeqs are generally like java.util.Vectors. But unlike them, + * ArraySeqs do not actually allocate arrays when they are constructed. + * Among other consequences, you can adjust the capacity `for free' + * after construction but before adding elements. You can adjust + * it at other times as well, but this may lead to more expensive + * resizing. Also, unlike Vectors, they release their internal arrays + * whenever they are empty. + * + * + author: Doug Lea + * @version 0.93 + * + *

For an introduction to this package see Overview . + * +**/ + +public class ArraySeq(T) : SeqCollection!(T), Sortable!(T) +{ + alias SeqCollection!(T).remove remove; + alias SeqCollection!(T).removeAll removeAll; + + /** + * The minimum capacity of any non-empty buffer + **/ + + public static int minCapacity = 16; + + + // instance variables + + /** + * The elements, or null if no buffer yet allocated. + **/ + + package T array[]; + + + // constructors + + /** + * Make a new empty ArraySeq. + **/ + + public this () + { + this (null, null, 0); + } + + /** + * Make an empty ArraySeq with given element screener + **/ + + public this (Predicate screener) + { + this (screener, null, 0); + } + + /** + * Special version of constructor needed by clone() + **/ + package this (Predicate s, T[] b, int c) + { + super(s); + array = b; + count = c; + } + + /** + * Make an independent copy. The elements themselves are not cloned + **/ + + public final ArraySeq duplicate() + { + int cap = count; + if (cap is 0) + return new ArraySeq (screener, null, 0); + else + { + if (cap < minCapacity) + cap = minCapacity; + + T newArray[] = new T[cap]; + //System.copy (array[0].sizeof, array, 0, newArray, 0, count); + + newArray[0..count] = array[0..count]; + return new ArraySeq!(T)(screener, newArray, count); + } + } + + // methods introduced _in ArraySeq + + /** + * return the current internal buffer capacity (zero if no buffer allocated). + * Returns: capacity (always greater than or equal to size()) + **/ + + public final int capacity() + { + return (array is null) ? 0 : array.length; + } + + /** + * Set the internal buffer capacity to max(size(), newCap). + * That is, if given an argument less than the current + * number of elements, the capacity is just set to the + * current number of elements. Thus, elements are never lost + * by setting the capacity. + * + * @param newCap the desired capacity. + * Returns: condition: + *

+         * capacity() >= size() &&
+         * version() != PREV(this).version() == (capacity() != PREV(this).capacity())
+         * 
+ **/ + + public final void capacity(int newCap) + { + if (newCap < count) + newCap = count; + + if (newCap is 0) + { + clear(); + } + else + if (array is null) + { + array = new T[newCap]; + incVersion(); + } + else + if (newCap !is array.length) + { + //T newArray[] = new T[newCap]; + //newArray[0..count] = array[0..count]; + //array = newArray; + array ~= new T[newCap - array.length]; + incVersion(); + } + } + + + // Collection methods + + /** + * Implements tango.util.collection.impl.Collection.Collection.contains + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.Collection.Collection.contains + **/ + public final bool contains(T element) + { + if (! isValidArg (element)) + return false; + + for (int i = 0; i < count; ++i) + if (array[i] == (element)) + return true; + return false; + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.instances + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.Collection.Collection.instances + **/ + public final uint instances(T element) + { + if (! isValidArg(element)) + return 0; + + uint c = 0; + for (uint i = 0; i < count; ++i) + if (array[i] == (element)) + ++c; + return c; + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.elements + * Time complexity: O(1). + * See_Also: tango.util.collection.impl.Collection.Collection.elements + **/ + public final GuardIterator!(T) elements() + { + return new ArrayIterator!(T)(this); + } + + /** + * Implements tango.util.collection.model.View.View.opApply + * Time complexity: O(n). + * See_Also: tango.util.collection.model.View.View.opApply + **/ + int opApply (int delegate (inout T value) dg) + { + auto scope iterator = new ArrayIterator!(T)(this); + return iterator.opApply (dg); + } + + + // Seq methods: + + /** + * Implements tango.util.collection.model.Seq.Seq.head. + * Time complexity: O(1). + * See_Also: tango.util.collection.model.Seq.Seq.head + **/ + public final T head() + { + checkIndex(0); + return array[0]; + } + + /** + * Implements tango.util.collection.model.Seq.Seq.tail. + * Time complexity: O(1). + * See_Also: tango.util.collection.model.Seq.Seq.tail + **/ + public final T tail() + { + checkIndex(count -1); + return array[count -1]; + } + + /** + * Implements tango.util.collection.model.Seq.Seq.get. + * Time complexity: O(1). + * See_Also: tango.util.collection.model.Seq.Seq.get + **/ + public final T get(int index) + in { + checkIndex(index); + } + body + { + return array[index]; + } + + /** + * Implements tango.util.collection.model.Seq.Seq.first. + * Time complexity: O(n). + * See_Also: tango.util.collection.model.Seq.Seq.first + **/ + public final int first(T element, int startingIndex = 0) + { + if (startingIndex < 0) + startingIndex = 0; + + for (int i = startingIndex; i < count; ++i) + if (array[i] == (element)) + return i; + return -1; + } + + /** + * Implements tango.util.collection.model.Seq.Seq.last. + * Time complexity: O(n). + * See_Also: tango.util.collection.model.Seq.Seq.last + **/ + public final int last(T element, int startingIndex = 0) + { + if (startingIndex >= count) + startingIndex = count -1; + + for (int i = startingIndex; i >= 0; --i) + if (array[i] == (element)) + return i; + return -1; + } + + + /** + * Implements tango.util.collection.model.Seq.Seq.subseq. + * Time complexity: O(length). + * See_Also: tango.util.collection.model.Seq.Seq.subseq + **/ + public final ArraySeq subset (int from, int _length) + { + if (_length > 0) + { + checkIndex(from); + checkIndex(from + _length - 1); + + T newArray[] = new T[_length]; + //System.copy (array[0].sizeof, array, from, newArray, 0, _length); + + newArray[0.._length] = array[from..from+_length]; + return new ArraySeq!(T)(screener, newArray, _length); + } + else + return new ArraySeq!(T)(screener); + } + + + // MutableCollection methods + + /** + * Implements tango.util.collection.impl.Collection.Collection.clear. + * Time complexity: O(1). + * See_Also: tango.util.collection.impl.Collection.Collection.clear + **/ + public final void clear() + { + array = null; + setCount(0); + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.removeOneOf. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.Collection.Collection.removeOneOf + **/ + public final void remove(T element) + { + remove_(element, false); + } + + + /** + * Implements tango.util.collection.impl.Collection.Collection.replaceOneOf + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.Collection.Collection.replaceOneOf + **/ + public final void replace(T oldElement, T newElement) + { + replace_(oldElement, newElement, false); + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.replaceAllOf. + * Time complexity: O(n * number of replacements). + * See_Also: tango.util.collection.impl.Collection.Collection.replaceAllOf + **/ + public final void replaceAll(T oldElement, T newElement) + { + replace_(oldElement, newElement, true); + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.exclude. + * Time complexity: O(n * instances(element)). + * See_Also: tango.util.collection.impl.Collection.Collection.exclude + **/ + public final void removeAll(T element) + { + remove_(element, true); + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.take. + * Time complexity: O(1). + * Takes the rightmost element of the array. + * See_Also: tango.util.collection.impl.Collection.Collection.take + **/ + public final T take() + { + T v = tail(); + removeTail(); + return v; + } + + + // SortableCollection methods: + + + /** + * Implements tango.util.collection.SortableCollection.sort. + * Time complexity: O(n log n). + * Uses a quicksort-based algorithm. + * See_Also: tango.util.collection.SortableCollection.sort + **/ + public void sort(Comparator!(T) cmp) + { + if (count > 0) + { + quickSort(array, 0, count - 1, cmp); + incVersion(); + } + } + + + // MutableSeq methods + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.prepend. + * Time complexity: O(n) + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.prepend + **/ + public final void prepend(T element) + { + checkElement(element); + growBy_(1); + for (int i = count -1; i > 0; --i) + array[i] = array[i - 1]; + array[0] = element; + } + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.replaceHead. + * Time complexity: O(1). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.replaceHead + **/ + public final void replaceHead(T element) + { + checkElement(element); + array[0] = element; + incVersion(); + } + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.removeHead. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.removeHead + **/ + public final void removeHead() + { + removeAt(0); + } + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.append. + * Time complexity: normally O(1), but O(n) if size() == capacity(). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.append + **/ + public final void append(T element) + in { + checkElement (element); + } + body + { + int last = count; + growBy_(1); + array[last] = element; + } + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.replaceTail. + * Time complexity: O(1). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.replaceTail + **/ + public final void replaceTail(T element) + { + checkElement(element); + array[count -1] = element; + incVersion(); + } + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.removeTail. + * Time complexity: O(1). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.removeTail + **/ + public final void removeTail() + { + checkIndex(0); + array[count -1] = T.init; + growBy_( -1); + } + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.addAt. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.addAt + **/ + public final void addAt(int index, T element) + { + if (index !is count) + checkIndex(index); + + checkElement(element); + growBy_(1); + for (int i = count -1; i > index; --i) + array[i] = array[i - 1]; + array[index] = element; + } + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.remove. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.removeAt + **/ + public final void removeAt(int index) + { + checkIndex(index); + for (int i = index + 1; i < count; ++i) + array[i - 1] = array[i]; + array[count -1] = T.init; + growBy_( -1); + } + + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.replaceAt. + * Time complexity: O(1). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.replaceAt + **/ + public final void replaceAt(int index, T element) + { + checkIndex(index); + checkElement(element); + array[index] = element; + incVersion(); + } + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.prepend. + * Time complexity: O(n + number of elements in e) if (e + * instanceof CollectionIterator) else O(n * number of elements in e) + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.prepend + **/ + public final void prepend(Iterator!(T) e) + { + insert_(0, e); + } + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.append. + * Time complexity: O(number of elements in e) + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.append + **/ + public final void append(Iterator!(T) e) + { + insert_(count, e); + } + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.addAt. + * Time complexity: O(n + number of elements in e) if (e + * instanceof CollectionIterator) else O(n * number of elements in e) + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.addAt + **/ + public final void addAt(int index, Iterator!(T) e) + { + if (index !is count) + checkIndex(index); + insert_(index, e); + } + + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.removeFromTo. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.removeFromTo + **/ + public final void removeRange (int fromIndex, int toIndex) + { + checkIndex(fromIndex); + checkIndex(toIndex); + if (fromIndex <= toIndex) + { + int gap = toIndex - fromIndex + 1; + int j = fromIndex; + for (int i = toIndex + 1; i < count; ++i) + array[j++] = array[i]; + + for (int i = 1; i <= gap; ++i) + array[count -i] = T.init; + addToCount( -gap); + } + } + + /** + * An implementation of Quicksort using medians of 3 for partitions. + * Used internally by sort. + * It is public and static so it can be used to sort plain + * arrays as well. + * @param s, the array to sort + * @param lo, the least index to sort from + * @param hi, the greatest index + * @param cmp, the comparator to use for comparing elements + **/ + + public final static void quickSort(T s[], int lo, int hi, Comparator!(T) cmp) + { + if (lo >= hi) + return; + + /* + Use median-of-three(lo, mid, hi) to pick a partition. + Also swap them into relative order while we are at it. + */ + + int mid = (lo + hi) / 2; + + if (cmp.compare(s[lo], s[mid]) > 0) + { + T tmp = s[lo]; + s[lo] = s[mid]; + s[mid] = tmp; // swap + } + + if (cmp.compare(s[mid], s[hi]) > 0) + { + T tmp = s[mid]; + s[mid] = s[hi]; + s[hi] = tmp; // swap + + if (cmp.compare(s[lo], s[mid]) > 0) + { + T tmp2 = s[lo]; + s[lo] = s[mid]; + s[mid] = tmp2; // swap + } + } + + int left = lo + 1; // start one past lo since already handled lo + int right = hi - 1; // similarly + if (left >= right) + return; // if three or fewer we are done + + T partition = s[mid]; + + for (;;) + { + while (cmp.compare(s[right], partition) > 0) + --right; + + while (left < right && cmp.compare(s[left], partition) <= 0) + ++left; + + if (left < right) + { + T tmp = s[left]; + s[left] = s[right]; + s[right] = tmp; // swap + --right; + } + else + break; + } + + quickSort(s, lo, left, cmp); + quickSort(s, left + 1, hi, cmp); + } + + /*********************************************************************** + + expose collection content as an array + + ************************************************************************/ + + override public T[] toArray () + { + return array[0..count].dup; + } + + // helper methods + + /** + * Main method to control buffer sizing. + * The heuristic used for growth is: + *
+         * if out of space:
+         *   if need less than minCapacity, grow to minCapacity
+         *   else grow by average of requested size and minCapacity.
+         * 
+ *

+ * For small buffers, this causes them to be about 1/2 full. + * while for large buffers, it causes them to be about 2/3 full. + *

+ * For shrinkage, the only thing we do is unlink the buffer if it is empty. + * @param inc, the amount of space to grow by. Negative values mean shrink. + * Returns: condition: adjust record of count, and if any of + * the above conditions apply, allocate and copy into a new + * buffer of the appropriate size. + **/ + + private final void growBy_(int inc) + { + int needed = count + inc; + if (inc > 0) + { + /* heuristic: */ + int current = capacity(); + if (needed > current) + { + incVersion(); + int newCap = needed + (needed + minCapacity) / 2; + + if (newCap < minCapacity) + newCap = minCapacity; + + if (array is null) + { + array = new T[newCap]; + } + else + { + //T newArray[] = new T[newCap]; + //newArray[0..count] = array[0..count]; + //array = newArray; + array ~= new T[newCap - array.length]; + } + } + } + else + if (needed is 0) + array = null; + + setCount(needed); + } + + + /** + * Utility to splice in enumerations + **/ + + private final void insert_(int index, Iterator!(T) e) + { + if (cast(GuardIterator!(T)) e) + { + // we know size! + int inc = (cast(GuardIterator!(T)) (e)).remaining(); + int oldcount = count; + int oldversion = vershion; + growBy_(inc); + + for (int i = oldcount - 1; i >= index; --i) + array[i + inc] = array[i]; + + int j = index; + while (e.more()) + { + T element = e.get(); + if (!allows (element)) + { // Ugh. Can only do full rollback + for (int i = index; i < oldcount; ++i) + array[i] = array[i + inc]; + + vershion = oldversion; + count = oldcount; + checkElement(element); // force throw + } + array[j++] = element; + } + } + else + if (index is count) + { // next best; we can append + while (e.more()) + { + T element = e.get(); + checkElement(element); + growBy_(1); + array[count -1] = element; + } + } + else + { // do it the slow way + int j = index; + while (e.more()) + { + T element = e.get(); + checkElement(element); + growBy_(1); + + for (int i = count -1; i > j; --i) + array[i] = array[i - 1]; + array[j++] = element; + } + } + } + + private final void remove_(T element, bool allOccurrences) + { + if (! isValidArg(element)) + return; + + for (int i = 0; i < count; ++i) + { + while (i < count && array[i] == (element)) + { + for (int j = i + 1; j < count; ++j) + array[j - 1] = array[j]; + + array[count -1] = T.init; + growBy_( -1); + + if (!allOccurrences || count is 0) + return ; + } + } + } + + private final void replace_(T oldElement, T newElement, bool allOccurrences) + { + if (isValidArg(oldElement) is false || count is 0) + return; + + for (int i = 0; i < count; ++i) + { + if (array[i] == (oldElement)) + { + checkElement(newElement); + array[i] = newElement; + incVersion(); + + if (! allOccurrences) + return; + } + } + } + + /** + * Implements tango.util.collection.model.View.View.checkImplementation. + * See_Also: tango.util.collection.model.View.View.checkImplementation + **/ + public override void checkImplementation() + { + super.checkImplementation(); + assert(!(array is null && count !is 0)); + assert((array is null || count <= array.length)); + + for (int i = 0; i < count; ++i) + { + assert(allows(array[i])); + assert(instances(array[i]) > 0); + assert(contains(array[i])); + } + } + + /*********************************************************************** + + opApply() has migrated here to mitigate the virtual call + on method get() + + ************************************************************************/ + + static class ArrayIterator(T) : AbstractIterator!(T) + { + private int row; + private T[] array; + + public this (ArraySeq seq) + { + super (seq); + array = seq.array; + } + + public final T get() + { + decRemaining(); + return array[row++]; + } + + int opApply (int delegate (inout T value) dg) + { + int result; + + for (auto i=remaining(); i--;) + { + auto value = get(); + if ((result = dg(value)) != 0) + break; + } + return result; + } + } +} + + + +debug (Test) +{ + import tango.io.Console; + + void main() + { + auto array = new ArraySeq!(char[]); + array.append ("foo"); + array.append ("bar"); + array.append ("wumpus"); + + foreach (value; array.elements) {} + + auto elements = array.elements(); + while (elements.more) + auto v = elements.get(); + + foreach (value; array) + Cout (value).newline; + + auto a = array.toArray; + foreach (value; a) + Cout (value).newline; + + array.checkImplementation(); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/CircularSeq.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/CircularSeq.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,773 @@ +/* + File: CircularSeq.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 24Sep95 dl@cs.oswego.edu Create from store.d working file + 13Oct95 dl Changed protection statuses +*/ + +module tango.util.collection.CircularSeq; + +private import tango.util.collection.model.Iterator, + tango.util.collection.model.GuardIterator; + +private import tango.util.collection.impl.CLCell, + tango.util.collection.impl.SeqCollection, + tango.util.collection.impl.AbstractIterator; + + +/** + * Circular linked lists. Publically Implement only those + * methods defined in interfaces. + * author: Doug Lea +**/ +public class CircularSeq(T) : SeqCollection!(T) +{ + alias CLCell!(T) CLCellT; + + alias SeqCollection!(T).remove remove; + alias SeqCollection!(T).removeAll removeAll; + + // instance variables + + /** + * The head of the list. Null if empty + **/ + package CLCellT list; + + // constructors + + /** + * Make an empty list with no element screener + **/ + public this () + { + this(null, null, 0); + } + + /** + * Make an empty list with supplied element screener + **/ + public this (Predicate screener) + { + this(screener, null, 0); + } + + /** + * Special version of constructor needed by clone() + **/ + protected this (Predicate s, CLCellT h, int c) + { + super(s); + list = h; + count = c; + } + + /** + * Make an independent copy of the list. Elements themselves are not cloned + **/ + public final CircularSeq duplicate() + { + if (list is null) + return new CircularSeq (screener, null, 0); + else + return new CircularSeq (screener, list.copyList(), count); + } + + + // Collection methods + + /** + * Implements tango.util.collection.impl.Collection.Collection.contains + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.Collection.Collection.contains + **/ + public final bool contains(T element) + { + if (!isValidArg(element) || list is null) + return false; + return list.find(element) !is null; + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.instances + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.Collection.Collection.instances + **/ + public final uint instances(T element) + { + if (!isValidArg(element) || list is null) + return 0; + return list.count(element); + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.elements + * Time complexity: O(1). + * See_Also: tango.util.collection.impl.Collection.Collection.elements + **/ + public final GuardIterator!(T) elements() + { + return new CellIterator!(T)(this); + } + + /** + * Implements tango.util.collection.model.View.View.opApply + * Time complexity: O(n). + * See_Also: tango.util.collection.model.View.View.opApply + **/ + int opApply (int delegate (inout T value) dg) + { + auto scope iterator = new CellIterator!(T)(this); + return iterator.opApply (dg); + } + + + // Seq methods + + /** + * Implements tango.util.collection.model.Seq.Seq.head. + * Time complexity: O(1). + * See_Also: tango.util.collection.model.Seq.Seq.head + **/ + public final T head() + { + return firstCell().element(); + } + + /** + * Implements tango.util.collection.model.Seq.Seq.tail. + * Time complexity: O(1). + * See_Also: tango.util.collection.model.Seq.Seq.tail + **/ + public final T tail() + { + return lastCell().element(); + } + + /** + * Implements tango.util.collection.model.Seq.Seq.get. + * Time complexity: O(n). + * See_Also: tango.util.collection.model.Seq.Seq.get + **/ + public final T get(int index) + { + return cellAt(index).element(); + } + + /** + * Implements tango.util.collection.model.Seq.Seq.first. + * Time complexity: O(n). + * See_Also: tango.util.collection.model.Seq.Seq.first + **/ + public final int first(T element, int startingIndex = 0) + { + if (startingIndex < 0) + startingIndex = 0; + + CLCellT p = list; + if (p is null || !isValidArg(element)) + return -1; + + for (int i = 0; true; ++i) + { + if (i >= startingIndex && p.element() == (element)) + return i; + + p = p.next(); + if (p is list) + break; + } + return -1; + } + + + /** + * Implements tango.util.collection.model.Seq.Seq.last. + * Time complexity: O(n). + * See_Also: tango.util.collection.model.Seq.Seq.last + **/ + public final int last(T element, int startingIndex = 0) + { + if (!isValidArg(element) || count is 0) + return -1; + + if (startingIndex >= size()) + startingIndex = size() - 1; + + if (startingIndex < 0) + startingIndex = 0; + + CLCellT p = cellAt(startingIndex); + int i = startingIndex; + for (;;) + { + if (p.element() == (element)) + return i; + else + if (p is list) + break; + else + { + p = p.prev(); + --i; + } + } + return -1; + } + + /** + * Implements tango.util.collection.model.Seq.Seq.subseq. + * Time complexity: O(length). + * See_Also: tango.util.collection.model.Seq.Seq.subseq + **/ + public final CircularSeq subset (int from, int _length) + { + if (_length > 0) + { + checkIndex(from); + CLCellT p = cellAt(from); + CLCellT newlist = new CLCellT(p.element()); + CLCellT current = newlist; + + for (int i = 1; i < _length; ++i) + { + p = p.next(); + if (p is null) + checkIndex(from + i); // force exception + + current.addNext(p.element()); + current = current.next(); + } + return new CircularSeq (screener, newlist, _length); + } + else + return new CircularSeq (); + } + + // MutableCollection methods + + /** + * Implements tango.util.collection.impl.Collection.Collection.clear. + * Time complexity: O(1). + * See_Also: tango.util.collection.impl.Collection.Collection.clear + **/ + public final void clear() + { + list = null; + setCount(0); + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.exclude. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.Collection.Collection.exclude + **/ + public final void removeAll (T element) + { + remove_(element, true); + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.removeOneOf. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.Collection.Collection.removeOneOf + **/ + public final void remove (T element) + { + remove_(element, false); + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.replaceOneOf + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.Collection.Collection.replaceOneOf + **/ + public final void replace (T oldElement, T newElement) + { + replace_(oldElement, newElement, false); + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.replaceAllOf. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.Collection.Collection.replaceAllOf + **/ + public final void replaceAll (T oldElement, T newElement) + { + replace_(oldElement, newElement, true); + } + + + /** + * Implements tango.util.collection.impl.Collection.Collection.take. + * Time complexity: O(1). + * takes the last element on the list. + * See_Also: tango.util.collection.impl.Collection.Collection.take + **/ + public final T take() + { + auto v = tail(); + removeTail(); + return v; + } + + + + // MutableSeq methods + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.prepend. + * Time complexity: O(1). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.prepend + **/ + public final void prepend(T element) + { + checkElement(element); + if (list is null) + list = new CLCellT(element); + else + list = list.addPrev(element); + incCount(); + } + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.replaceHead. + * Time complexity: O(1). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.replaceHead + **/ + public final void replaceHead(T element) + { + checkElement(element); + firstCell().element(element); + incVersion(); + } + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.removeHead. + * Time complexity: O(1). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.removeHead + **/ + public final void removeHead() + { + if (firstCell().isSingleton()) + list = null; + else + { + auto n = list.next(); + list.unlink(); + list = n; + } + decCount(); + } + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.append. + * Time complexity: O(1). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.append + **/ + public final void append(T element) + { + if (list is null) + prepend(element); + else + { + checkElement(element); + list.prev().addNext(element); + incCount(); + } + } + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.replaceTail. + * Time complexity: O(1). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.replaceTail + **/ + public final void replaceTail(T element) + { + checkElement(element); + lastCell().element(element); + incVersion(); + } + + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.removeTail. + * Time complexity: O(1). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.removeTail + **/ + public final void removeTail() + { + auto l = lastCell(); + if (l is list) + list = null; + else + l.unlink(); + decCount(); + } + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.addAt. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.addAt + **/ + public final void addAt(int index, T element) + { + if (index is 0) + prepend(element); + else + { + checkElement(element); + cellAt(index - 1).addNext(element); + incCount(); + } + } + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.replaceAt. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.replaceAt + **/ + public final void replaceAt(int index, T element) + { + checkElement(element); + cellAt(index).element(element); + incVersion(); + } + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.removeAt. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.removeAt + **/ + public final void removeAt(int index) + { + if (index is 0) + removeHead(); + else + { + cellAt(index - 1).unlinkNext(); + decCount(); + } + } + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.prepend. + * Time complexity: O(number of elements in e). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.prepend + **/ + public final void prepend(Iterator!(T) e) + { + CLCellT hd = null; + CLCellT current = null; + + while (e.more()) + { + auto element = e.get(); + checkElement(element); + incCount(); + + if (hd is null) + { + hd = new CLCellT(element); + current = hd; + } + else + { + current.addNext(element); + current = current.next(); + } + } + + if (list is null) + list = hd; + else + if (hd !is null) + { + auto tl = list.prev(); + current.next(list); + list.prev(current); + tl.next(hd); + hd.prev(tl); + list = hd; + } + } + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.append. + * Time complexity: O(number of elements in e). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.append + **/ + public final void append(Iterator!(T) e) + { + if (list is null) + prepend(e); + else + { + CLCellT current = list.prev(); + while (e.more()) + { + T element = e.get(); + checkElement(element); + incCount(); + current.addNext(element); + current = current.next(); + } + } + } + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.addAt. + * Time complexity: O(size() + number of elements in e). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.addAt + **/ + public final void addAt(int index, Iterator!(T) e) + { + if (list is null || index is 0) + prepend(e); + else + { + CLCellT current = cellAt(index - 1); + while (e.more()) + { + T element = e.get(); + checkElement(element); + incCount(); + current.addNext(element); + current = current.next(); + } + } + } + + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.removeFromTo. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.removeFromTo + **/ + public final void removeRange (int fromIndex, int toIndex) + { + checkIndex(toIndex); + CLCellT p = cellAt(fromIndex); + CLCellT last = list.prev(); + for (int i = fromIndex; i <= toIndex; ++i) + { + decCount(); + CLCellT n = p.next(); + p.unlink(); + if (p is list) + { + if (p is last) + { + list = null; + return ; + } + else + list = n; + } + p = n; + } + } + + + // helper methods + + /** + * return the first cell, or throw exception if empty + **/ + private final CLCellT firstCell() + { + if (list !is null) + return list; + + checkIndex(0); + return null; // not reached! + } + + /** + * return the last cell, or throw exception if empty + **/ + private final CLCellT lastCell() + { + if (list !is null) + return list.prev(); + + checkIndex(0); + return null; // not reached! + } + + /** + * return the index'th cell, or throw exception if bad index + **/ + private final CLCellT cellAt(int index) + { + checkIndex(index); + return list.nth(index); + } + + /** + * helper for remove/exclude + **/ + private final void remove_(T element, bool allOccurrences) + { + if (!isValidArg(element) || list is null) + return; + + CLCellT p = list; + for (;;) + { + CLCellT n = p.next(); + if (p.element() == (element)) + { + decCount(); + p.unlink(); + if (p is list) + { + if (p is n) + { + list = null; + break; + } + else + list = n; + } + + if (! allOccurrences) + break; + else + p = n; + } + else + if (n is list) + break; + else + p = n; + } + } + + + /** + * helper for replace * + **/ + private final void replace_(T oldElement, T newElement, bool allOccurrences) + { + if (!isValidArg(oldElement) || list is null) + return; + + CLCellT p = list; + do { + if (p.element() == (oldElement)) + { + checkElement(newElement); + incVersion(); + p.element(newElement); + if (! allOccurrences) + return; + } + p = p.next(); + } while (p !is list); + } + + // ImplementationCheckable methods + + /** + * Implements tango.util.collection.model.View.View.checkImplementation. + * See_Also: tango.util.collection.model.View.View.checkImplementation + **/ + + public override void checkImplementation() + { + super.checkImplementation(); + + assert(((count is 0) is (list is null))); + assert((list is null || list._length() is count)); + + if (list is null) + return; + + int c = 0; + CLCellT p = list; + do { + assert(p.prev().next() is p); + assert(p.next().prev() is p); + assert(allows(p.element())); + assert(instances(p.element()) > 0); + assert(contains(p.element())); + p = p.next(); + ++c; + } while (p !is list); + + assert(c is count); + } + + + /*********************************************************************** + + opApply() has migrated here to mitigate the virtual call + on method get() + + ************************************************************************/ + + static class CellIterator(T) : AbstractIterator!(T) + { + private CLCellT cell; + + public this (CircularSeq seq) + { + super (seq); + cell = seq.list; + } + + public final T get() + { + decRemaining(); + auto v = cell.element(); + cell = cell.next(); + return v; + } + + int opApply (int delegate (inout T value) dg) + { + int result; + + for (auto i=remaining(); i--;) + { + auto value = get(); + if ((result = dg(value)) != 0) + break; + } + return result; + } + } +} + + + +debug (Test) +{ + import tango.io.Console; + + void main() + { + auto array = new CircularSeq!(char[]); + array.append ("foo"); + array.append ("bar"); + array.append ("wumpus"); + + foreach (value; array.elements) {} + + auto elements = array.elements(); + while (elements.more) + auto v = elements.get(); + + foreach (value; array) + Cout (value).newline; + + array.checkImplementation(); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/HashMap.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/HashMap.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,980 @@ +/******************************************************************************* + + File: HashMap.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 24Sep95 dl@cs.oswego.edu Create from collection.d working file + 13Oct95 dl Changed protection statuses + 21Oct95 dl fixed error in removeAt + 9Apr97 dl made Serializable + 14Dec06 kb Converted, templated & reshaped for Tango + +********************************************************************************/ + +module tango.util.collection.HashMap; + +private import tango.core.Exception; + +/+ +private import tango.io.protocol.model.IReader, + tango.io.protocol.model.IWriter; ++/ +private import tango.util.collection.model.HashParams, + tango.util.collection.model.GuardIterator; + +private import tango.util.collection.impl.LLCell, + tango.util.collection.impl.LLPair, + tango.util.collection.impl.MapCollection, + tango.util.collection.impl.AbstractIterator; + +/******************************************************************************* + + Hash table implementation of Map + + author: Doug Lea + @version 0.94 + +

For an introduction to this package see Overview . + +********************************************************************************/ + + +public class HashMap(K, V) : MapCollection!(K, V), HashParams +{ + alias LLCell!(V) LLCellT; + alias LLPair!(K, V) LLPairT; + + alias MapCollection!(K, V).remove remove; + alias MapCollection!(K, V).removeAll removeAll; + + // instance variables + + /*********************************************************************** + + The table. Each entry is a list. Null if no table allocated + + ************************************************************************/ + + private LLPairT table[]; + + /*********************************************************************** + + The threshold load factor + + ************************************************************************/ + + private float loadFactor; + + + // constructors + + /*********************************************************************** + + Make a new empty map to use given element screener. + + ************************************************************************/ + + public this (Predicate screener = null) + { + this(screener, defaultLoadFactor); + } + + /*********************************************************************** + + Special version of constructor needed by clone() + + ************************************************************************/ + + protected this (Predicate s, float f) + { + super(s); + table = null; + loadFactor = f; + } + + /*********************************************************************** + + Make an independent copy of the table. Elements themselves + are not cloned. + + ************************************************************************/ + + public final HashMap!(K, V) duplicate() + { + auto c = new HashMap (screener, loadFactor); + + if (count !is 0) + { + int cap = 2 * cast(int)((count / loadFactor)) + 1; + if (cap < defaultInitialBuckets) + cap = defaultInitialBuckets; + + c.buckets(cap); + + for (int i = 0; i < table.length; ++i) + for (LLPairT p = table[i]; p !is null; p = cast(LLPairT)(p.next())) + c.add (p.key(), p.element()); + } + return c; + } + + + // HashParams methods + + /*********************************************************************** + + Implements tango.util.collection.HashParams.buckets. + Time complexity: O(1). + + See_Also: tango.util.collection.HashParams.buckets. + + ************************************************************************/ + + public final int buckets() + { + return (table is null) ? 0 : table.length; + } + + /*********************************************************************** + + Implements tango.util.collection.HashParams.buckets. + Time complexity: O(n). + + See_Also: tango.util.collection.HashParams.buckets. + + ************************************************************************/ + + public final void buckets(int newCap) + { + if (newCap is buckets()) + return ; + else + if (newCap >= 1) + resize(newCap); + else + throw new IllegalArgumentException("Invalid Hash table size"); + } + + /*********************************************************************** + + Implements tango.util.collection.HashParams.thresholdLoadfactor + Time complexity: O(1). + + See_Also: tango.util.collection.HashParams.thresholdLoadfactor + + ************************************************************************/ + + public final float thresholdLoadFactor() + { + return loadFactor; + } + + /*********************************************************************** + + Implements tango.util.collection.HashParams.thresholdLoadfactor + Time complexity: O(n). + + See_Also: tango.util.collection.HashParams.thresholdLoadfactor + + ************************************************************************/ + + public final void thresholdLoadFactor(float desired) + { + if (desired > 0.0) + { + loadFactor = desired; + checkLoadFactor(); + } + else + throw new IllegalArgumentException("Invalid Hash table load factor"); + } + + + + // View methods + + /*********************************************************************** + + Implements tango.util.collection.model.View.View.contains. + Time complexity: O(1) average; O(n) worst. + + See_Also: tango.util.collection.model.View.View.contains + + ************************************************************************/ + + public final bool contains(V element) + { + if (!isValidArg(element) || count is 0) + return false; + + for (int i = 0; i < table.length; ++i) + { + LLPairT hd = table[i]; + if (hd !is null && hd.find(element) !is null) + return true; + } + return false; + } + + /*********************************************************************** + + Implements tango.util.collection.model.View.View.instances. + Time complexity: O(n). + + See_Also: tango.util.collection.model.View.View.instances + + ************************************************************************/ + + public final uint instances(V element) + { + if (!isValidArg(element) || count is 0) + return 0; + + uint c = 0; + for (uint i = 0; i < table.length; ++i) + { + LLPairT hd = table[i]; + if (hd !is null) + c += hd.count(element); + } + return c; + } + + /*********************************************************************** + + Implements tango.util.collection.model.View.View.elements. + Time complexity: O(1). + + See_Also: tango.util.collection.model.View.View.elements + + ************************************************************************/ + + public final GuardIterator!(V) elements() + { + return keys(); + } + + /*********************************************************************** + + Implements tango.util.collection.model.View.View.opApply + Time complexity: O(n) + + See_Also: tango.util.collection.model.View.View.opApply + + ************************************************************************/ + + int opApply (int delegate (inout V value) dg) + { + auto scope iterator = new MapIterator!(K, V)(this); + return iterator.opApply (dg); + } + + + /*********************************************************************** + + Implements tango.util.collection.MapView.opApply + Time complexity: O(n) + + See_Also: tango.util.collection.MapView.opApply + + ************************************************************************/ + + int opApply (int delegate (inout K key, inout V value) dg) + { + auto scope iterator = new MapIterator!(K, V)(this); + return iterator.opApply (dg); + } + + + // Map methods + + /*********************************************************************** + + Implements tango.util.collection.Map.containsKey. + Time complexity: O(1) average; O(n) worst. + + See_Also: tango.util.collection.Map.containsKey + + ************************************************************************/ + + public final bool containsKey(K key) + { + if (!isValidKey(key) || count is 0) + return false; + + LLPairT p = table[hashOf(key)]; + if (p !is null) + return p.findKey(key) !is null; + else + return false; + } + + /*********************************************************************** + + Implements tango.util.collection.Map.containsPair + Time complexity: O(1) average; O(n) worst. + + See_Also: tango.util.collection.Map.containsPair + + ************************************************************************/ + + public final bool containsPair(K key, V element) + { + if (!isValidKey(key) || !isValidArg(element) || count is 0) + return false; + + LLPairT p = table[hashOf(key)]; + if (p !is null) + return p.find(key, element) !is null; + else + return false; + } + + /*********************************************************************** + + Implements tango.util.collection.Map.keys. + Time complexity: O(1). + + See_Also: tango.util.collection.Map.keys + + ************************************************************************/ + + public final PairIterator!(K, V) keys() + { + return new MapIterator!(K, V)(this); + } + + /*********************************************************************** + + Implements tango.util.collection.Map.get. + Time complexity: O(1) average; O(n) worst. + + See_Also: tango.util.collection.Map.at + + ************************************************************************/ + + public final V get(K key) + { + checkKey(key); + if (count !is 0) + { + LLPairT p = table[hashOf(key)]; + if (p !is null) + { + LLPairT c = p.findKey(key); + if (c !is null) + return c.element(); + } + } + throw new NoSuchElementException("no matching key"); + } + + + /*********************************************************************** + + Return the element associated with Key key. + @param key a key + Returns: whether the key is contained or not + + ************************************************************************/ + + public bool get(K key, inout V element) + { + checkKey(key); + if (count !is 0) + { + LLPairT p = table[hashOf(key)]; + if (p !is null) + { + LLPairT c = p.findKey(key); + if (c !is null) + { + element = c.element(); + return true; + } + } + } + return false; + } + + + + /*********************************************************************** + + Implements tango.util.collection.Map.keyOf. + Time complexity: O(n). + + See_Also: tango.util.collection.Map.akyOf + + ************************************************************************/ + + public final bool keyOf(inout K key, V value) + { + if (!isValidArg(value) || count is 0) + return false; + + for (int i = 0; i < table.length; ++i) + { + LLPairT hd = table[i]; + if (hd !is null) + { + auto p = (cast(LLPairT)(hd.find(value))); + if (p !is null) + { + key = p.key(); + return true; + } + } + } + return false; + } + + + // Collection methods + + /*********************************************************************** + + Implements tango.util.collection.impl.Collection.Collection.clear. + Time complexity: O(1). + + See_Also: tango.util.collection.impl.Collection.Collection.clear + + ************************************************************************/ + + public final void clear() + { + setCount(0); + table = null; + } + + /*********************************************************************** + + Implements tango.util.collection.impl.Collection.Collection.removeAll. + Time complexity: O(n). + + See_Also: tango.util.collection.impl.Collection.Collection.removeAll + + ************************************************************************/ + + public final void removeAll (V element) + { + remove_(element, true); + } + + + /*********************************************************************** + + Implements tango.util.collection.impl.Collection.Collection.removeOneOf. + Time complexity: O(n). + + See_Also: tango.util.collection.impl.Collection.Collection.removeOneOf + + ************************************************************************/ + + public final void remove (V element) + { + remove_(element, false); + } + + + /*********************************************************************** + + Implements tango.util.collection.impl.Collection.Collection.replaceOneOf. + Time complexity: O(n). + + See_Also: tango.util.collection.impl.Collection.Collection.replaceOneOf + + ************************************************************************/ + + public final void replace (V oldElement, V newElement) + { + replace_(oldElement, newElement, false); + } + + /*********************************************************************** + + Implements tango.util.collection.impl.Collection.Collection.replaceOneOf. + Time complexity: O(n). + + See_Also: tango.util.collection.impl.Collection.Collection.replaceOneOf + + ************************************************************************/ + + public final void replaceAll (V oldElement, V newElement) + { + replace_(oldElement, newElement, true); + } + + /*********************************************************************** + + Implements tango.util.collection.impl.Collection.Collection.take. + Time complexity: O(number of buckets). + + See_Also: tango.util.collection.impl.Collection.Collection.take + + ************************************************************************/ + + public final V take() + { + if (count !is 0) + { + for (int i = 0; i < table.length; ++i) + { + if (table[i] !is null) + { + decCount(); + auto v = table[i].element(); + table[i] = cast(LLPairT)(table[i].next()); + return v; + } + } + } + checkIndex(0); + return V.init; // not reached + } + + // Map methods + + /*********************************************************************** + + Implements tango.util.collection.Map.add. + Time complexity: O(1) average; O(n) worst. + + See_Also: tango.util.collection.Map.add + + ************************************************************************/ + + public final void add (K key, V element) + { + checkKey(key); + checkElement(element); + + if (table is null) + resize (defaultInitialBuckets); + + int h = hashOf(key); + LLPairT hd = table[h]; + if (hd is null) + { + table[h] = new LLPairT(key, element, hd); + incCount(); + return; + } + else + { + LLPairT p = hd.findKey(key); + if (p !is null) + { + if (p.element() != (element)) + { + p.element(element); + incVersion(); + } + } + else + { + table[h] = new LLPairT(key, element, hd); + incCount(); + checkLoadFactor(); // we only check load factor on add to nonempty bin + } + } + } + + + /*********************************************************************** + + Implements tango.util.collection.Map.remove. + Time complexity: O(1) average; O(n) worst. + + See_Also: tango.util.collection.Map.remove + + ************************************************************************/ + + public final void removeKey (K key) + { + if (!isValidKey(key) || count is 0) + return; + + int h = hashOf(key); + LLPairT hd = table[h]; + LLPairT p = hd; + LLPairT trail = p; + + while (p !is null) + { + LLPairT n = cast(LLPairT)(p.next()); + if (p.key() == (key)) + { + decCount(); + if (p is hd) + table[h] = n; + else + trail.unlinkNext(); + return; + } + else + { + trail = p; + p = n; + } + } + } + + /*********************************************************************** + + Implements tango.util.collection.Map.replaceElement. + Time complexity: O(1) average; O(n) worst. + + See_Also: tango.util.collection.Map.replaceElement + + ************************************************************************/ + + public final void replacePair (K key, V oldElement, V newElement) + { + if (!isValidKey(key) || !isValidArg(oldElement) || count is 0) + return; + + LLPairT p = table[hashOf(key)]; + if (p !is null) + { + LLPairT c = p.find(key, oldElement); + if (c !is null) + { + checkElement(newElement); + c.element(newElement); + incVersion(); + } + } + } + + // Helper methods + + /*********************************************************************** + + Check to see if we are past load factor threshold. If so, + resize so that we are at half of the desired threshold. + Also while at it, check to see if we are empty so can just + unlink table. + + ************************************************************************/ + + protected final void checkLoadFactor() + { + if (table is null) + { + if (count !is 0) + resize(defaultInitialBuckets); + } + else + { + float fc = cast(float) (count); + float ft = table.length; + + if (fc / ft > loadFactor) + { + int newCap = 2 * cast(int)(fc / loadFactor) + 1; + resize(newCap); + } + } + } + + /*********************************************************************** + + Mask off and remainder the hashCode for element + so it can be used as table index + + ************************************************************************/ + + protected final int hashOf(K key) + { + return (typeid(K).getHash(&key) & 0x7FFFFFFF) % table.length; + } + + + /*********************************************************************** + + ************************************************************************/ + + protected final void resize(int newCap) + { + LLPairT newtab[] = new LLPairT[newCap]; + + if (table !is null) + { + for (int i = 0; i < table.length; ++i) + { + LLPairT p = table[i]; + while (p !is null) + { + LLPairT n = cast(LLPairT)(p.next()); + int h = (p.keyHash() & 0x7FFFFFFF) % newCap; + p.next(newtab[h]); + newtab[h] = p; + p = n; + } + } + } + table = newtab; + incVersion(); + } + + // helpers + + /*********************************************************************** + + ************************************************************************/ + + private final void remove_(V element, bool allOccurrences) + { + if (!isValidArg(element) || count is 0) + return; + + for (int h = 0; h < table.length; ++h) + { + LLCellT hd = table[h]; + LLCellT p = hd; + LLCellT trail = p; + while (p !is null) + { + LLPairT n = cast(LLPairT)(p.next()); + if (p.element() == (element)) + { + decCount(); + if (p is table[h]) + { + table[h] = n; + trail = n; + } + else + trail.next(n); + if (! allOccurrences) + return; + else + p = n; + } + else + { + trail = p; + p = n; + } + } + } + } + + /*********************************************************************** + + ************************************************************************/ + + private final void replace_(V oldElement, V newElement, bool allOccurrences) + { + if (count is 0 || !isValidArg(oldElement) || oldElement == (newElement)) + return; + + for (int h = 0; h < table.length; ++h) + { + LLCellT hd = table[h]; + LLCellT p = hd; + LLCellT trail = p; + while (p !is null) + { + LLPairT n = cast(LLPairT)(p.next()); + if (p.element() == (oldElement)) + { + checkElement(newElement); + incVersion(); + p.element(newElement); + if (! allOccurrences) + return ; + } + trail = p; + p = n; + } + } + } + +/+ + // IReader & IWriter methods + + /*********************************************************************** + + ************************************************************************/ + + public override void read (IReader input) + { + int len; + K key; + V element; + + input (len) (loadFactor) (count); + table = (len > 0) ? new LLPairT[len] : null; + + for (len=count; len-- > 0;) + { + input (key) (element); + + int h = hashOf (key); + table[h] = new LLPairT (key, element, table[h]); + } + } + + /*********************************************************************** + + ************************************************************************/ + + public override void write (IWriter output) + { + output (table.length) (loadFactor) (count); + + if (table.length > 0) + foreach (key, value; keys) + output (key) (value); + } + ++/ + // ImplementationCheckable methods + + /*********************************************************************** + + Implements tango.util.collection.model.View.View.checkImplementation. + + See_Also: tango.util.collection.model.View.View.checkImplementation + + ************************************************************************/ + + public override void checkImplementation() + { + super.checkImplementation(); + + assert(!(table is null && count !is 0)); + assert((table is null || table.length > 0)); + assert(loadFactor > 0.0f); + + if (table is null) + return; + + int c = 0; + for (int i = 0; i < table.length; ++i) + { + for (LLPairT p = table[i]; p !is null; p = cast(LLPairT)(p.next())) + { + ++c; + assert(allows(p.element())); + assert(allowsKey(p.key())); + assert(containsKey(p.key())); + assert(contains(p.element())); + assert(instances(p.element()) >= 1); + assert(containsPair(p.key(), p.element())); + assert(hashOf(p.key()) is i); + } + } + assert(c is count); + + + } + + + /*********************************************************************** + + opApply() has migrated here to mitigate the virtual call + on method get() + + ************************************************************************/ + + private static class MapIterator(K, V) : AbstractMapIterator!(K, V) + { + private int row; + private LLPairT pair; + private LLPairT[] table; + + public this (HashMap map) + { + super (map); + table = map.table; + } + + public final V get(inout K key) + { + auto v = get(); + key = pair.key; + return v; + } + + public final V get() + { + decRemaining(); + + if (pair) + pair = cast(LLPairT) pair.next(); + + while (pair is null) + pair = table [row++]; + + return pair.element(); + } + + int opApply (int delegate (inout V value) dg) + { + int result; + + for (auto i=remaining(); i--;) + { + auto value = get(); + if ((result = dg(value)) != 0) + break; + } + return result; + } + + int opApply (int delegate (inout K key, inout V value) dg) + { + K key; + int result; + + for (auto i=remaining(); i--;) + { + auto value = get(key); + if ((result = dg(key, value)) != 0) + break; + } + return result; + } + } +} + + +debug(Test) +{ + import tango.io.Console; + + void main() + { + auto map = new HashMap!(char[], double); + map.add ("foo", 3.14); + map.add ("bar", 6.28); + + foreach (key, value; map.keys) {typeof(key) x; x = key;} + + foreach (value; map.keys) {} + + foreach (value; map.elements) {} + + auto keys = map.keys(); + while (keys.more) + auto v = keys.get(); + + foreach (value; map) {} + + foreach (key, value; map) + Cout (key).newline; + + map.checkImplementation(); + + Cout (map).newline; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/HashSet.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/HashSet.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,577 @@ +/* + File: HashSet.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 24Sep95 dl@cs.oswego.edu Create from tango.util.collection.d working file + 13Oct95 dl Changed protection statuses + +*/ + + +module tango.util.collection.HashSet; + +private import tango.core.Exception; + +private import tango.util.collection.model.Iterator, + tango.util.collection.model.HashParams, + tango.util.collection.model.GuardIterator; + +private import tango.util.collection.impl.LLCell, + tango.util.collection.impl.SetCollection, + tango.util.collection.impl.AbstractIterator; + + +/** + * + * Hash table implementation of set + * + author: Doug Lea + * @version 0.93 + * + *

For an introduction to this package see Overview . +**/ + +public class HashSet(T) : SetCollection!(T), HashParams +{ + private alias LLCell!(T) LLCellT; + + alias SetCollection!(T).remove remove; + alias SetCollection!(T).removeAll removeAll; + + + // instance variables + + /** + * The table. Each entry is a list. Null if no table allocated + **/ + private LLCellT table[]; + /** + * The threshold load factor + **/ + private float loadFactor; + + + // constructors + + /** + * Make an empty HashedSet. + **/ + + public this () + { + this(null, defaultLoadFactor); + } + + /** + * Make an empty HashedSet using given element screener + **/ + + public this (Predicate screener) + { + this(screener, defaultLoadFactor); + } + + /** + * Special version of constructor needed by clone() + **/ + + protected this (Predicate s, float f) + { + super(s); + table = null; + loadFactor = f; + } + + /** + * Make an independent copy of the table. Does not clone elements. + **/ + + public final HashSet duplicate() + { + auto c = new HashSet (screener, loadFactor); + + if (count !is 0) + { + int cap = 2 * cast(int)(count / loadFactor) + 1; + if (cap < defaultInitialBuckets) + cap = defaultInitialBuckets; + + c.buckets(cap); + for (int i = 0; i < table.length; ++i) + for (LLCellT p = table[i]; p !is null; p = p.next()) + c.add(p.element()); + } + return c; + } + + + // HashTableParams methods + + /** + * Implements tango.util.collection.HashTableParams.buckets. + * Time complexity: O(1). + * See_Also: tango.util.collection.HashTableParams.buckets. + **/ + + public final int buckets() + { + return (table is null) ? 0 : table.length; + } + + /** + * Implements tango.util.collection.HashTableParams.buckets. + * Time complexity: O(n). + * See_Also: tango.util.collection.HashTableParams.buckets. + **/ + + public final void buckets(int newCap) + { + if (newCap is buckets()) + return ; + else + if (newCap >= 1) + resize(newCap); + else + { + char[16] tmp; + throw new IllegalArgumentException("Impossible Hash table size:" ~ itoa(tmp, newCap)); + } + } + + /** + * Implements tango.util.collection.HashTableParams.thresholdLoadfactor + * Time complexity: O(1). + * See_Also: tango.util.collection.HashTableParams.thresholdLoadfactor + **/ + + public final float thresholdLoadFactor() + { + return loadFactor; + } + + /** + * Implements tango.util.collection.HashTableParams.thresholdLoadfactor + * Time complexity: O(n). + * See_Also: tango.util.collection.HashTableParams.thresholdLoadfactor + **/ + + public final void thresholdLoadFactor(float desired) + { + if (desired > 0.0) + { + loadFactor = desired; + checkLoadFactor(); + } + else + throw new IllegalArgumentException("Invalid Hash table load factor"); + } + + + + + + // Collection methods + + /** + * Implements tango.util.collection.impl.Collection.Collection.contains + * Time complexity: O(1) average; O(n) worst. + * See_Also: tango.util.collection.impl.Collection.Collection.contains + **/ + public final bool contains(T element) + { + if (!isValidArg(element) || count is 0) + return false; + + LLCellT p = table[hashOf(element)]; + if (p !is null) + return p.find(element) !is null; + else + return false; + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.instances + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.Collection.Collection.instances + **/ + public final uint instances(T element) + { + if (contains(element)) + return 1; + else + return 0; + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.elements + * Time complexity: O(1). + * See_Also: tango.util.collection.impl.Collection.Collection.elements + **/ + public final GuardIterator!(T) elements() + { + return new CellIterator!(T)(this); + } + + /** + * Implements tango.util.collection.model.View.View.opApply + * Time complexity: O(n). + * See_Also: tango.util.collection.model.View.View.opApply + **/ + int opApply (int delegate (inout T value) dg) + { + auto scope iterator = new CellIterator!(T)(this); + return iterator.opApply (dg); + } + + // MutableCollection methods + + /** + * Implements tango.util.collection.impl.Collection.Collection.clear. + * Time complexity: O(1). + * See_Also: tango.util.collection.impl.Collection.Collection.clear + **/ + public final void clear() + { + setCount(0); + table = null; + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.exclude. + * Time complexity: O(1) average; O(n) worst. + * See_Also: tango.util.collection.impl.Collection.Collection.exclude + **/ + public final void removeAll(T element) + { + remove(element); + } + + public final void remove(T element) + { + if (!isValidArg(element) || count is 0) + return ; + + int h = hashOf(element); + LLCellT hd = table[h]; + LLCellT p = hd; + LLCellT trail = p; + + while (p !is null) + { + LLCellT n = p.next(); + if (p.element() == (element)) + { + decCount(); + if (p is table[h]) + { + table[h] = n; + trail = n; + } + else + trail.next(n); + return ; + } + else + { + trail = p; + p = n; + } + } + } + + public final void replace(T oldElement, T newElement) + { + + if (count is 0 || !isValidArg(oldElement) || oldElement == (newElement)) + return ; + + if (contains(oldElement)) + { + checkElement(newElement); + remove(oldElement); + add(newElement); + } + } + + public final void replaceAll(T oldElement, T newElement) + { + replace(oldElement, newElement); + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.take. + * Time complexity: O(number of buckets). + * See_Also: tango.util.collection.impl.Collection.Collection.take + **/ + public final T take() + { + if (count !is 0) + { + for (int i = 0; i < table.length; ++i) + { + if (table[i] !is null) + { + decCount(); + auto v = table[i].element(); + table[i] = table[i].next(); + return v; + } + } + } + + checkIndex(0); + return T.init; // not reached + } + + + // MutableSet methods + + /** + * Implements tango.util.collection.impl.SetCollection.SetCollection.add. + * Time complexity: O(1) average; O(n) worst. + * See_Also: tango.util.collection.impl.SetCollection.SetCollection.add + **/ + public final void add(T element) + { + checkElement(element); + + if (table is null) + resize(defaultInitialBuckets); + + int h = hashOf(element); + LLCellT hd = table[h]; + if (hd !is null && hd.find(element) !is null) + return ; + + LLCellT n = new LLCellT(element, hd); + table[h] = n; + incCount(); + + if (hd !is null) + checkLoadFactor(); // only check if bin was nonempty + } + + + + // Helper methods + + /** + * Check to see if we are past load factor threshold. If so, resize + * so that we are at half of the desired threshold. + * Also while at it, check to see if we are empty so can just + * unlink table. + **/ + protected final void checkLoadFactor() + { + if (table is null) + { + if (count !is 0) + resize(defaultInitialBuckets); + } + else + { + float fc = cast(float) (count); + float ft = table.length; + if (fc / ft > loadFactor) + { + int newCap = 2 * cast(int)(fc / loadFactor) + 1; + resize(newCap); + } + } + } + + /** + * Mask off and remainder the hashCode for element + * so it can be used as table index + **/ + + protected final int hashOf(T element) + { + return (typeid(T).getHash(&element) & 0x7FFFFFFF) % table.length; + } + + + /** + * resize table to new capacity, rehashing all elements + **/ + protected final void resize(int newCap) + { + LLCellT newtab[] = new LLCellT[newCap]; + + if (table !is null) + { + for (int i = 0; i < table.length; ++i) + { + LLCellT p = table[i]; + while (p !is null) + { + LLCellT n = p.next(); + int h = (p.elementHash() & 0x7FFFFFFF) % newCap; + p.next(newtab[h]); + newtab[h] = p; + p = n; + } + } + } + + table = newtab; + incVersion(); + } + + /+ + private final void readObject(java.io.ObjectInputStream stream) + + { + int len = stream.readInt(); + + if (len > 0) + table = new LLCellT[len]; + else + table = null; + + loadFactor = stream.readFloat(); + int count = stream.readInt(); + + while (count-- > 0) + { + T element = stream.readObject(); + int h = hashOf(element); + LLCellT hd = table[h]; + LLCellT n = new LLCellT(element, hd); + table[h] = n; + } + } + + private final void writeObject(java.io.ObjectOutputStream stream) + { + int len; + + if (table !is null) + len = table.length; + else + len = 0; + + stream.writeInt(len); + stream.writeFloat(loadFactor); + stream.writeInt(count); + + if (len > 0) + { + Iterator e = elements(); + while (e.more()) + stream.writeObject(e.value()); + } + } + + +/ + + // ImplementationCheckable methods + + /** + * Implements tango.util.collection.model.View.View.checkImplementation. + * See_Also: tango.util.collection.model.View.View.checkImplementation + **/ + public override void checkImplementation() + { + super.checkImplementation(); + + assert(!(table is null && count !is 0)); + assert((table is null || table.length > 0)); + assert(loadFactor > 0.0f); + + if (table !is null) + { + int c = 0; + for (int i = 0; i < table.length; ++i) + { + for (LLCellT p = table[i]; p !is null; p = p.next()) + { + ++c; + assert(allows(p.element())); + assert(contains(p.element())); + assert(instances(p.element()) is 1); + assert(hashOf(p.element()) is i); + } + } + assert(c is count); + } + } + + + + /*********************************************************************** + + opApply() has migrated here to mitigate the virtual call + on method get() + + ************************************************************************/ + + private static class CellIterator(T) : AbstractIterator!(T) + { + private int row; + private LLCellT cell; + private LLCellT[] table; + + public this (HashSet set) + { + super (set); + table = set.table; + } + + public final T get() + { + decRemaining(); + + while (cell is null) + cell = table [row++]; + + auto v = cell.element(); + cell = cell.next(); + return v; + } + + int opApply (int delegate (inout T value) dg) + { + int result; + + for (auto i=remaining(); i--;) + { + auto value = get(); + if ((result = dg(value)) != 0) + break; + } + return result; + } + } +} + + + +debug (Test) +{ + import tango.io.Console; + + void main() + { + auto set = new HashSet!(char[]); + set.add ("foo"); + set.add ("bar"); + set.add ("wumpus"); + + foreach (value; set.elements) {} + + auto elements = set.elements(); + while (elements.more) + auto v = elements.get(); + + set.checkImplementation(); + + foreach (value; set) + Cout (value).newline; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/LinkMap.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/LinkMap.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,583 @@ +/* + File: LinkMap.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 24Sep95 dl@cs.oswego.edu Create from tango.util.collection.d working file + 13Oct95 dl Changed protection statuses + 21Oct95 dl Fixed error in remove + +*/ + + +module tango.util.collection.LinkMap; + +private import tango.core.Exception; + +private import tango.io.protocol.model.IReader, + tango.io.protocol.model.IWriter; + +private import tango.util.collection.model.View, + tango.util.collection.model.GuardIterator; + +private import tango.util.collection.impl.LLCell, + tango.util.collection.impl.LLPair, + tango.util.collection.impl.MapCollection, + tango.util.collection.impl.AbstractIterator; + +/** + * Linked lists of (key, element) pairs + * author: Doug Lea +**/ +public class LinkMap(K, T) : MapCollection!(K, T) // , IReadable, IWritable +{ + alias LLCell!(T) LLCellT; + alias LLPair!(K, T) LLPairT; + + alias MapCollection!(K, T).remove remove; + alias MapCollection!(K, T) .removeAll removeAll; + + // instance variables + + /** + * The head of the list. Null if empty + **/ + + package LLPairT list; + + // constructors + + /** + * Make an empty list + **/ + + public this () + { + this(null, null, 0); + } + + /** + * Make an empty list with the supplied element screener + **/ + + public this (Predicate screener) + { + this(screener, null, 0); + } + + /** + * Special version of constructor needed by clone() + **/ + protected this (Predicate s, LLPairT l, int c) + { + super(s); + list = l; + count = c; + } + + /** + * Make an independent copy of the list. Does not clone elements + **/ + + public LinkMap duplicate() + { + if (list is null) + return new LinkMap (screener, null, 0); + else + return new LinkMap (screener, cast(LLPairT)(list.copyList()), count); + } + + + // Collection methods + + /** + * Implements tango.util.collection.impl.Collection.Collection.contains. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.Collection.Collection.contains + **/ + public final bool contains(T element) + { + if (!isValidArg(element) || list is null) + return false; + + return list.find(element) !is null; + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.instances. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.Collection.Collection.instances + **/ + public final uint instances(T element) + { + if (!isValidArg(element) || list is null) + return 0; + + return list.count(element); + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.elements. + * Time complexity: O(1). + * See_Also: tango.util.collection.impl.Collection.Collection.elements + **/ + public final GuardIterator!(T) elements() + { + return keys(); + } + + /*********************************************************************** + + Implements tango.util.collection.model.View.View.opApply + Time complexity: O(n) + + See_Also: tango.util.collection.model.View.View.opApply + + ************************************************************************/ + + int opApply (int delegate (inout T value) dg) + { + auto scope iterator = new MapIterator!(K, T)(this); + return iterator.opApply (dg); + } + + + /*********************************************************************** + + Implements tango.util.collection.MapView.opApply + Time complexity: O(n) + + See_Also: tango.util.collection.MapView.opApply + + ************************************************************************/ + + int opApply (int delegate (inout K key, inout T value) dg) + { + auto scope iterator = new MapIterator!(K, T)(this); + return iterator.opApply (dg); + } + + + // Map methods + + + /** + * Implements tango.util.collection.Map.containsKey. + * Time complexity: O(n). + * See_Also: tango.util.collection.Map.containsKey + **/ + public final bool containsKey(K key) + { + if (!isValidKey(key) || list is null) + return false; + + return list.findKey(key) !is null; + } + + /** + * Implements tango.util.collection.Map.containsPair + * Time complexity: O(n). + * See_Also: tango.util.collection.Map.containsPair + **/ + public final bool containsPair(K key, T element) + { + if (!isValidKey(key) || !isValidArg(element) || list is null) + return false; + return list.find(key, element) !is null; + } + + /** + * Implements tango.util.collection.Map.keys. + * Time complexity: O(1). + * See_Also: tango.util.collection.Map.keys + **/ + public final PairIterator!(K, T) keys() + { + return new MapIterator!(K, T)(this); + } + + /** + * Implements tango.util.collection.Map.get. + * Time complexity: O(n). + * See_Also: tango.util.collection.Map.get + **/ + public final T get(K key) + { + checkKey(key); + if (list !is null) + { + auto p = list.findKey(key); + if (p !is null) + return p.element(); + } + throw new NoSuchElementException("no matching Key"); + } + + /** + * Return the element associated with Key key. + * Params: + * key = a key + * Returns: whether the key is contained or not + **/ + + public final bool get(K key, inout T element) + { + checkKey(key); + if (list !is null) + { + auto p = list.findKey(key); + if (p !is null) + { + element = p.element(); + return true; + } + } + return false; + } + + + + /** + * Implements tango.util.collection.Map.keyOf. + * Time complexity: O(n). + * See_Also: tango.util.collection.Map.keyOf + **/ + public final bool keyOf(inout K key, T value) + { + if (!isValidArg(value) || count is 0) + return false; + + auto p = (cast(LLPairT)(list.find(value))); + if (p is null) + return false; + + key = p.key(); + return true; + } + + + // MutableCollection methods + + /** + * Implements tango.util.collection.impl.Collection.Collection.clear. + * Time complexity: O(1). + * See_Also: tango.util.collection.impl.Collection.Collection.clear + **/ + public final void clear() + { + list = null; + setCount(0); + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.replaceOneOf + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.Collection.Collection.replaceOneOf + **/ + public final void replace (T oldElement, T newElement) + { + replace_(oldElement, newElement, false); + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.replaceAllOf. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.Collection.Collection.replaceAllOf + **/ + public final void replaceAll(T oldElement, T newElement) + { + replace_(oldElement, newElement, true); + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.removeAll. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.Collection.Collection.removeAll + **/ + public final void removeAll(T element) + { + remove_(element, true); + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.removeOneOf. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.Collection.Collection.removeOneOf + **/ + public final void remove(T element) + { + remove_(element, false); + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.take. + * Time complexity: O(1). + * takes the first element on the list + * See_Also: tango.util.collection.impl.Collection.Collection.take + **/ + public final T take() + { + if (list !is null) + { + auto v = list.element(); + list = cast(LLPairT)(list.next()); + decCount(); + return v; + } + checkIndex(0); + return T.init; // not reached + } + + + // MutableMap methods + + /** + * Implements tango.util.collection.impl.MapCollection.MapCollection.add. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.MapCollection.MapCollection.add + **/ + public final void add (K key, T element) + { + checkKey(key); + checkElement(element); + + if (list !is null) + { + auto p = list.findKey(key); + if (p !is null) + { + if (p.element() != (element)) + { + p.element(element); + incVersion(); + } + return ; + } + } + list = new LLPairT(key, element, list); + incCount(); + } + + + /** + * Implements tango.util.collection.impl.MapCollection.MapCollection.remove. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.MapCollection.MapCollection.remove + **/ + public final void removeKey (K key) + { + if (!isValidKey(key) || list is null) + return ; + + auto p = list; + auto trail = p; + + while (p !is null) + { + auto n = cast(LLPairT)(p.next()); + if (p.key() == (key)) + { + decCount(); + if (p is list) + list = n; + else + trail.unlinkNext(); + return ; + } + else + { + trail = p; + p = n; + } + } + } + + /** + * Implements tango.util.collection.impl.MapCollection.MapCollection.replaceElement. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.MapCollection.MapCollection.replaceElement + **/ + public final void replacePair (K key, T oldElement, T newElement) + { + if (!isValidKey(key) || !isValidArg(oldElement) || list is null) + return ; + + auto p = list.find(key, oldElement); + if (p !is null) + { + checkElement(newElement); + p.element(newElement); + incVersion(); + } + } + + private final void remove_(T element, bool allOccurrences) + { + if (!isValidArg(element) || count is 0) + return ; + + auto p = list; + auto trail = p; + + while (p !is null) + { + auto n = cast(LLPairT)(p.next()); + if (p.element() == (element)) + { + decCount(); + if (p is list) + { + list = n; + trail = n; + } + else + trail.next(n); + + if (!allOccurrences || count is 0) + return ; + else + p = n; + } + else + { + trail = p; + p = n; + } + } + } + + /** + * Helper for replace + **/ + + private final void replace_(T oldElement, T newElement, bool allOccurrences) + { + if (list is null || !isValidArg(oldElement) || oldElement == (newElement)) + return ; + + auto p = list.find(oldElement); + while (p !is null) + { + checkElement(newElement); + p.element(newElement); + incVersion(); + if (!allOccurrences) + return ; + p = p.find(oldElement); + } + } + + // ImplementationCheckable methods + + /** + * Implements tango.util.collection.model.View.View.checkImplementation. + * See_Also: tango.util.collection.model.View.View.checkImplementation + **/ + public override void checkImplementation() + { + super.checkImplementation(); + + assert(((count is 0) is (list is null))); + assert((list is null || list._length() is count)); + + for (auto p = list; p !is null; p = cast(LLPairT)(p.next())) + { + assert(allows(p.element())); + assert(allowsKey(p.key())); + assert(containsKey(p.key())); + assert(contains(p.element())); + assert(instances(p.element()) >= 1); + assert(containsPair(p.key(), p.element())); + } + } + + + /*********************************************************************** + + opApply() has migrated here to mitigate the virtual call + on method get() + + ************************************************************************/ + + private static class MapIterator(K, V) : AbstractMapIterator!(K, V) + { + private LLPairT pair; + + public this (LinkMap map) + { + super (map); + pair = map.list; + } + + public final V get(inout K key) + { + if (pair) + key = pair.key; + return get(); + } + + public final V get() + { + decRemaining(); + auto v = pair.element(); + pair = cast(LLPairT) pair.next(); + return v; + } + + int opApply (int delegate (inout V value) dg) + { + int result; + + for (auto i=remaining(); i--;) + { + auto value = get(); + if ((result = dg(value)) != 0) + break; + } + return result; + } + + int opApply (int delegate (inout K key, inout V value) dg) + { + K key; + int result; + + for (auto i=remaining(); i--;) + { + auto value = get(key); + if ((result = dg(key, value)) != 0) + break; + } + return result; + } + } +} + + + +debug(Test) +{ + void main() + { + auto map = new LinkMap!(Object, double); + + foreach (key, value; map.keys) {typeof(key) x; x = key;} + + foreach (value; map.keys) {} + + foreach (value; map.elements) {} + + auto keys = map.keys(); + while (keys.more) + auto v = keys.get(); + + foreach (value; map) {} + foreach (key, value; map) {} + + map.checkImplementation(); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/LinkSeq.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/LinkSeq.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,769 @@ +/* + File: LinkSeq.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 2Oct95 dl@cs.oswego.edu repack from LLSeq.d + 9apr97 dl insert bounds check in first +*/ + + +module tango.util.collection.LinkSeq; + +private import tango.util.collection.model.Iterator, + tango.util.collection.model.Sortable, + tango.util.collection.model.Comparator, + tango.util.collection.model.GuardIterator; + +private import tango.util.collection.impl.LLCell, + tango.util.collection.impl.SeqCollection, + tango.util.collection.impl.AbstractIterator; + +/** + * + * LinkedList implementation. + * Publically implements only those methods defined in its interfaces. + * + * + author: Doug Lea + * @version 0.93 + * + *

For an introduction to this package see Overview . +**/ + +public class LinkSeq(T) : SeqCollection!(T), Sortable!(T) +{ + alias LLCell!(T) LLCellT; + + alias SeqCollection!(T).remove remove; + alias SeqCollection!(T).removeAll removeAll; + + // instance variables + + /** + * The head of the list. Null iff count == 0 + **/ + + package LLCellT list; + + // constructors + + /** + * Create a new empty list + **/ + + public this () + { + this(null, null, 0); + } + + /** + * Create a list with a given element screener + **/ + + public this (Predicate screener) + { + this(screener, null, 0); + } + + /** + * Special version of constructor needed by clone() + **/ + + protected this (Predicate s, LLCellT l, int c) + { + super(s); + list = l; + count = c; + } + + /** + * Build an independent copy of the list. + * The elements themselves are not cloned + **/ + + // protected Object clone() { + public LinkSeq duplicate() + { + if (list is null) + return new LinkSeq(screener, null, 0); + else + return new LinkSeq(screener, list.copyList(), count); + } + + + // Collection methods + + /** + * Implements tango.util.collection.impl.Collection.Collection.contains + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.Collection.Collection.contains + **/ + public final bool contains(T element) + { + if (!isValidArg(element) || count is 0) + return false; + + return list.find(element) !is null; + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.instances + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.Collection.Collection.instances + **/ + public final uint instances(T element) + { + if (!isValidArg(element) || count is 0) + return 0; + + return list.count(element); + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.elements + * Time complexity: O(1). + * See_Also: tango.util.collection.impl.Collection.Collection.elements + **/ + public final GuardIterator!(T) elements() + { + return new CellIterator!(T)(this); + } + + /** + * Implements tango.util.collection.model.View.View.opApply + * Time complexity: O(n). + * See_Also: tango.util.collection.model.View.View.opApply + **/ + int opApply (int delegate (inout T value) dg) + { + auto scope iterator = new CellIterator!(T)(this); + return iterator.opApply (dg); + } + + + // Seq Methods + + /** + * Implements tango.util.collection.model.Seq.Seq.head. + * Time complexity: O(1). + * See_Also: tango.util.collection.model.Seq.Seq.head + **/ + public final T head() + { + return firstCell().element(); + } + + /** + * Implements tango.util.collection.model.Seq.Seq.tail. + * Time complexity: O(n). + * See_Also: tango.util.collection.model.Seq.Seq.tail + **/ + public final T tail() + { + return lastCell().element(); + } + + /** + * Implements tango.util.collection.model.Seq.Seq.get. + * Time complexity: O(n). + * See_Also: tango.util.collection.model.Seq.Seq.get + **/ + public final T get(int index) + { + return cellAt(index).element(); + } + + /** + * Implements tango.util.collection.model.Seq.Seq.first. + * Time complexity: O(n). + * See_Also: tango.util.collection.model.Seq.Seq.first + **/ + public final int first(T element, int startingIndex = 0) + { + if (!isValidArg(element) || list is null || startingIndex >= count) + return -1; + + if (startingIndex < 0) + startingIndex = 0; + + LLCellT p = list.nth(startingIndex); + if (p !is null) + { + int i = p.index(element); + if (i >= 0) + return i + startingIndex; + } + return -1; + } + + /** + * Implements tango.util.collection.model.Seq.Seq.last. + * Time complexity: O(n). + * See_Also: tango.util.collection.model.Seq.Seq.last + **/ + public final int last(T element, int startingIndex = 0) + { + if (!isValidArg(element) || list is null) + return -1; + + int i = 0; + if (startingIndex >= size()) + startingIndex = size() - 1; + + int index = -1; + LLCellT p = list; + while (i <= startingIndex && p !is null) + { + if (p.element() == (element)) + index = i; + ++i; + p = p.next(); + } + return index; + } + + + + /** + * Implements tango.util.collection.model.Seq.Seq.subseq. + * Time complexity: O(length). + * See_Also: tango.util.collection.model.Seq.Seq.subseq + **/ + public final LinkSeq subset(int from, int _length) + { + if (_length > 0) + { + LLCellT p = cellAt(from); + LLCellT newlist = new LLCellT(p.element(), null); + LLCellT current = newlist; + + for (int i = 1; i < _length; ++i) + { + p = p.next(); + if (p is null) + checkIndex(from + i); // force exception + + current.linkNext(new LLCellT(p.element(), null)); + current = current.next(); + } + return new LinkSeq!(T)(screener, newlist, _length); + } + else + return new LinkSeq!(T)(screener, null, 0); + } + + + // MutableCollection methods + + /** + * Implements tango.util.collection.impl.Collection.Collection.clear. + * Time complexity: O(1). + * See_Also: tango.util.collection.impl.Collection.Collection.clear + **/ + public final void clear() + { + if (list !is null) + { + list = null; + setCount(0); + } + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.exclude. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.Collection.Collection.exclude + **/ + public final void removeAll (T element) + { + remove_(element, true); + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.removeOneOf. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.Collection.Collection.removeOneOf + **/ + public final void remove (T element) + { + remove_(element, false); + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.replaceOneOf + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.Collection.Collection.replaceOneOf + **/ + public final void replace (T oldElement, T newElement) + { + replace_(oldElement, newElement, false); + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.replaceAllOf. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.Collection.Collection.replaceAllOf + **/ + public final void replaceAll(T oldElement, T newElement) + { + replace_(oldElement, newElement, true); + } + + + /** + * Implements tango.util.collection.impl.Collection.Collection.take. + * Time complexity: O(1). + * takes the first element on the list + * See_Also: tango.util.collection.impl.Collection.Collection.take + **/ + public final T take() + { + T v = head(); + removeHead(); + return v; + } + + // Sortable methods + + /** + * Implements tango.util.collection.Sortable.sort. + * Time complexity: O(n log n). + * Uses a merge-sort-based algorithm. + * See_Also: tango.util.collection.SortableCollection.sort + **/ + public final void sort(Comparator!(T) cmp) + { + if (list !is null) + { + list = LLCellT.mergeSort(list, cmp); + incVersion(); + } + } + + + // MutableSeq methods + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.prepend. + * Time complexity: O(1). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.prepend + **/ + public final void prepend(T element) + { + checkElement(element); + list = new LLCellT(element, list); + incCount(); + } + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.replaceHead. + * Time complexity: O(1). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.replaceHead + **/ + public final void replaceHead(T element) + { + checkElement(element); + firstCell().element(element); + incVersion(); + } + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.removeHead. + * Time complexity: O(1). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.removeHead + **/ + public final void removeHead() + { + list = firstCell().next(); + decCount(); + } + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.append. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.append + **/ + public final void append(T element) + { + checkElement(element); + if (list is null) + prepend(element); + else + { + list.tail().next(new LLCellT(element)); + incCount(); + } + } + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.replaceTail. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.replaceTail + **/ + public final void replaceTail(T element) + { + checkElement(element); + lastCell().element(element); + incVersion(); + } + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.removeTail. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.removeTail + **/ + public final void removeTail() + { + if (firstCell().next() is null) + removeHead(); + else + { + LLCellT trail = list; + LLCellT p = trail.next(); + + while (p.next() !is null) + { + trail = p; + p = p.next(); + } + trail.next(null); + decCount(); + } + } + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.addAt. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.addAt + **/ + public final void addAt(int index, T element) + { + if (index is 0) + prepend(element); + else + { + checkElement(element); + cellAt(index - 1).linkNext(new LLCellT(element)); + incCount(); + } + } + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.removeAt. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.removeAt + **/ + public final void removeAt(int index) + { + if (index is 0) + removeHead(); + else + { + cellAt(index - 1).unlinkNext(); + decCount(); + } + } + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.replaceAt. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.replaceAt + **/ + public final void replaceAt(int index, T element) + { + cellAt(index).element(element); + incVersion(); + } + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.prepend. + * Time complexity: O(number of elements in e). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.prepend + **/ + public final void prepend(Iterator!(T) e) + { + splice_(e, null, list); + } + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.append. + * Time complexity: O(n + number of elements in e). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.append + **/ + public final void append(Iterator!(T) e) + { + if (list is null) + splice_(e, null, null); + else + splice_(e, list.tail(), null); + } + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.addAt. + * Time complexity: O(n + number of elements in e). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.addAt + **/ + public final void addAt(int index, Iterator!(T) e) + { + if (index is 0) + splice_(e, null, list); + else + { + LLCellT p = cellAt(index - 1); + splice_(e, p, p.next()); + } + } + + /** + * Implements tango.util.collection.impl.SeqCollection.SeqCollection.removeFromTo. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.SeqCollection.SeqCollection.removeFromTo + **/ + public final void removeRange (int fromIndex, int toIndex) + { + checkIndex(toIndex); + + if (fromIndex <= toIndex) + { + if (fromIndex is 0) + { + LLCellT p = firstCell(); + for (int i = fromIndex; i <= toIndex; ++i) + p = p.next(); + list = p; + } + else + { + LLCellT f = cellAt(fromIndex - 1); + LLCellT p = f; + for (int i = fromIndex; i <= toIndex; ++i) + p = p.next(); + f.next(p.next()); + } + addToCount( -(toIndex - fromIndex + 1)); + } + } + + + + // helper methods + + private final LLCellT firstCell() + { + if (list !is null) + return list; + + checkIndex(0); + return null; // not reached! + } + + private final LLCellT lastCell() + { + if (list !is null) + return list.tail(); + + checkIndex(0); + return null; // not reached! + } + + private final LLCellT cellAt(int index) + { + checkIndex(index); + return list.nth(index); + } + + /** + * Helper method for removeOneOf() + **/ + + private final void remove_(T element, bool allOccurrences) + { + if (!isValidArg(element) || count is 0) + return ; + + LLCellT p = list; + LLCellT trail = p; + + while (p !is null) + { + LLCellT n = p.next(); + if (p.element() == (element)) + { + decCount(); + if (p is list) + { + list = n; + trail = n; + } + else + trail.next(n); + + if (!allOccurrences || count is 0) + return ; + else + p = n; + } + else + { + trail = p; + p = n; + } + } + } + + + /** + * Helper for replace + **/ + + private final void replace_(T oldElement, T newElement, bool allOccurrences) + { + if (count is 0 || !isValidArg(oldElement) || oldElement == (newElement)) + return ; + + LLCellT p = list.find(oldElement); + while (p !is null) + { + checkElement(newElement); + p.element(newElement); + incVersion(); + if (!allOccurrences) + return ; + p = p.find(oldElement); + } + } + + /** + * Splice elements of e between hd and tl. if hd is null return new hd + **/ + + private final void splice_(Iterator!(T) e, LLCellT hd, LLCellT tl) + { + if (e.more()) + { + LLCellT newlist = null; + LLCellT current = null; + + while (e.more()) + { + T v = e.get(); + checkElement(v); + incCount(); + + LLCellT p = new LLCellT(v, null); + if (newlist is null) + newlist = p; + else + current.next(p); + current = p; + } + + if (current !is null) + current.next(tl); + + if (hd is null) + list = newlist; + else + hd.next(newlist); + } + } + + // ImplementationCheckable methods + + /** + * Implements tango.util.collection.model.View.View.checkImplementation. + * See_Also: tango.util.collection.model.View.View.checkImplementation + **/ + public override void checkImplementation() + { + + super.checkImplementation(); + + assert(((count is 0) is (list is null))); + assert((list is null || list._length() is count)); + + int c = 0; + for (LLCellT p = list; p !is null; p = p.next()) + { + assert(allows(p.element())); + assert(instances(p.element()) > 0); + assert(contains(p.element())); + ++c; + } + assert(c is count); + + } + + + /*********************************************************************** + + opApply() has migrated here to mitigate the virtual call + on method get() + + ************************************************************************/ + + private static class CellIterator(T) : AbstractIterator!(T) + { + private LLCellT cell; + + public this (LinkSeq seq) + { + super (seq); + cell = seq.list; + } + + public final T get() + { + decRemaining(); + auto v = cell.element(); + cell = cell.next(); + return v; + } + + int opApply (int delegate (inout T value) dg) + { + int result; + + for (auto i=remaining(); i--;) + { + auto value = get(); + if ((result = dg(value)) != 0) + break; + } + return result; + } + } +} + + + + +debug (Test) +{ + import tango.io.Console; + + void main() + { + auto seq = new LinkSeq!(char[]); + seq.append ("foo"); + seq.append ("wumpus"); + seq.append ("bar"); + + foreach (value; seq.elements) {} + + auto elements = seq.elements(); + while (elements.more) + auto v = elements.get(); + + foreach (value; seq) + Cout (value).newline; + + seq.checkImplementation(); + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/TreeBag.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/TreeBag.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,493 @@ +/* + File: TreeBag.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 24Sep95 dl@cs.oswego.edu Create from tango.util.collection.d working file + 13Oct95 dl Changed protection statuses + +*/ + + +module tango.util.collection.TreeBag; + +private import tango.util.collection.model.Iterator, + tango.util.collection.model.Comparator, + tango.util.collection.model.SortedValues, + tango.util.collection.model.GuardIterator; + +private import tango.util.collection.impl.RBCell, + tango.util.collection.impl.BagCollection, + tango.util.collection.impl.AbstractIterator, + tango.util.collection.impl.DefaultComparator; + +/** + * RedBlack trees. + * author: Doug Lea +**/ + +public class TreeBag(T) : BagCollection!(T), SortedValues!(T) +{ + alias RBCell!(T) RBCellT; + alias Comparator!(T) ComparatorT; + + alias BagCollection!(T).remove remove; + alias BagCollection!(T).removeAll removeAll; + + + // instance variables + + /** + * The root of the tree. Null if empty. + **/ + + package RBCellT tree; + + /** + * The comparator to use for ordering. + **/ + protected ComparatorT cmp_; + + // constructors + + /** + * Make an empty tree. + * Initialize to use DefaultComparator for ordering + **/ + public this () + { + this(null, null, null, 0); + } + + /** + * Make an empty tree, using the supplied element screener. + * Initialize to use DefaultComparator for ordering + **/ + + public this (Predicate s) + { + this(s, null, null, 0); + } + + /** + * Make an empty tree, using the supplied element comparator for ordering. + **/ + public this (ComparatorT c) + { + this(null, c, null, 0); + } + + /** + * Make an empty tree, using the supplied element screener and comparator + **/ + public this (Predicate s, ComparatorT c) + { + this(s, c, null, 0); + } + + /** + * Special version of constructor needed by clone() + **/ + + protected this (Predicate s, ComparatorT cmp, RBCellT t, int n) + { + super(s); + count = n; + tree = t; + if (cmp !is null) + cmp_ = cmp; + else + cmp_ = new DefaultComparator!(T); + } + + /** + * Make an independent copy of the tree. Does not clone elements. + **/ + + public TreeBag duplicate() + { + if (count is 0) + return new TreeBag!(T)(screener, cmp_); + else + return new TreeBag!(T)(screener, cmp_, tree.copyTree(), count); + } + + + + // Collection methods + + /** + * Implements tango.util.collection.impl.Collection.Collection.contains + * Time complexity: O(log n). + * See_Also: tango.util.collection.impl.Collection.Collection.contains + **/ + public final bool contains(T element) + { + if (!isValidArg(element) || count is 0) + return false; + + return tree.find(element, cmp_) !is null; + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.instances + * Time complexity: O(log n). + * See_Also: tango.util.collection.impl.Collection.Collection.instances + **/ + public final uint instances(T element) + { + if (!isValidArg(element) || count is 0) + return 0; + + return tree.count(element, cmp_); + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.elements + * Time complexity: O(1). + * See_Also: tango.util.collection.impl.Collection.Collection.elements + **/ + public final GuardIterator!(T) elements() + { + return new CellIterator!(T)(this); + } + + /** + * Implements tango.util.collection.model.View.View.opApply + * Time complexity: O(n). + * See_Also: tango.util.collection.model.View.View.opApply + **/ + int opApply (int delegate (inout T value) dg) + { + auto scope iterator = new CellIterator!(T)(this); + return iterator.opApply (dg); + } + + + // ElementSortedCollection methods + + + /** + * Implements tango.util.collection.ElementSortedCollection.comparator + * Time complexity: O(1). + * See_Also: tango.util.collection.ElementSortedCollection.comparator + **/ + public final ComparatorT comparator() + { + return cmp_; + } + + /** + * Reset the comparator. Will cause a reorganization of the tree. + * Time complexity: O(n log n). + **/ + public final void comparator(ComparatorT cmp) + { + if (cmp !is cmp_) + { + if (cmp !is null) + cmp_ = cmp; + else + cmp_ = new DefaultComparator!(T); + + if (count !is 0) + { // must rebuild tree! + incVersion(); + RBCellT t = tree.leftmost(); + tree = null; + count = 0; + while (t !is null) + { + add_(t.element(), false); + t = t.successor(); + } + } + } + } + + + // MutableCollection methods + + /** + * Implements tango.util.collection.impl.Collection.Collection.clear. + * Time complexity: O(1). + * See_Also: tango.util.collection.impl.Collection.Collection.clear + **/ + public final void clear() + { + setCount(0); + tree = null; + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.removeAll. + * Time complexity: O(log n * instances(element)). + * See_Also: tango.util.collection.impl.Collection.Collection.removeAll + **/ + public final void removeAll(T element) + { + remove_(element, true); + } + + + /** + * Implements tango.util.collection.impl.Collection.Collection.removeOneOf. + * Time complexity: O(log n). + * See_Also: tango.util.collection.impl.Collection.Collection.removeOneOf + **/ + public final void remove(T element) + { + remove_(element, false); + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.replaceOneOf + * Time complexity: O(log n). + * See_Also: tango.util.collection.impl.Collection.Collection.replaceOneOf + **/ + public final void replace(T oldElement, T newElement) + { + replace_(oldElement, newElement, false); + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.replaceAllOf. + * Time complexity: O(log n * instances(oldElement)). + * See_Also: tango.util.collection.impl.Collection.Collection.replaceAllOf + **/ + public final void replaceAll(T oldElement, T newElement) + { + replace_(oldElement, newElement, true); + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.take. + * Time complexity: O(log n). + * Takes the least element. + * See_Also: tango.util.collection.impl.Collection.Collection.take + **/ + public final T take() + { + if (count !is 0) + { + RBCellT p = tree.leftmost(); + T v = p.element(); + tree = p.remove(tree); + decCount(); + return v; + } + + checkIndex(0); + return T.init; // not reached + } + + + // MutableBag methods + + /** + * Implements tango.util.collection.MutableBag.addIfAbsent + * Time complexity: O(log n). + * See_Also: tango.util.collection.MutableBag.addIfAbsent + **/ + public final void addIf (T element) + { + add_(element, true); + } + + + /** + * Implements tango.util.collection.MutableBag.add. + * Time complexity: O(log n). + * See_Also: tango.util.collection.MutableBag.add + **/ + public final void add (T element) + { + add_(element, false); + } + + + // helper methods + + private final void add_(T element, bool checkOccurrence) + { + checkElement(element); + + if (tree is null) + { + tree = new RBCellT(element); + incCount(); + } + else + { + RBCellT t = tree; + + for (;;) + { + int diff = cmp_.compare(element, t.element()); + if (diff is 0 && checkOccurrence) + return ; + else + if (diff <= 0) + { + if (t.left() !is null) + t = t.left(); + else + { + tree = t.insertLeft(new RBCellT(element), tree); + incCount(); + return ; + } + } + else + { + if (t.right() !is null) + t = t.right(); + else + { + tree = t.insertRight(new RBCellT(element), tree); + incCount(); + return ; + } + } + } + } + } + + + private final void remove_(T element, bool allOccurrences) + { + if (!isValidArg(element)) + return ; + + while (count > 0) + { + RBCellT p = tree.find(element, cmp_); + + if (p !is null) + { + tree = p.remove(tree); + decCount(); + if (!allOccurrences) + return ; + } + else + break; + } + } + + private final void replace_(T oldElement, T newElement, bool allOccurrences) + { + if (!isValidArg(oldElement) || count is 0 || oldElement == newElement) + return ; + + while (contains(oldElement)) + { + remove(oldElement); + add (newElement); + if (!allOccurrences) + return ; + } + } + + // ImplementationCheckable methods + + /** + * Implements tango.util.collection.model.View.View.checkImplementation. + * See_Also: tango.util.collection.model.View.View.checkImplementation + **/ + public override void checkImplementation() + { + + super.checkImplementation(); + assert(cmp_ !is null); + assert(((count is 0) is (tree is null))); + assert((tree is null || tree.size() is count)); + + if (tree !is null) + { + tree.checkImplementation(); + T last = T.init; + RBCellT t = tree.leftmost(); + while (t !is null) + { + T v = t.element(); + if (last !is T.init) + assert(cmp_.compare(last, v) <= 0); + last = v; + t = t.successor(); + } + } + } + + + /*********************************************************************** + + opApply() has migrated here to mitigate the virtual call + on method get() + + ************************************************************************/ + + private static class CellIterator(T) : AbstractIterator!(T) + { + private RBCellT cell; + + public this (TreeBag bag) + { + super(bag); + + if (bag.tree) + cell = bag.tree.leftmost; + } + + public final T get() + { + decRemaining(); + auto v = cell.element(); + cell = cell.successor(); + return v; + } + + int opApply (int delegate (inout T value) dg) + { + int result; + + for (auto i=remaining(); i--;) + { + auto value = get(); + if ((result = dg(value)) != 0) + break; + } + return result; + } + } +} + + + +debug (Test) +{ + import tango.io.Console; + + void main() + { + auto bag = new TreeBag!(char[]); + bag.add ("bar"); + bag.add ("barrel"); + bag.add ("foo"); + + foreach (value; bag.elements) {} + + auto elements = bag.elements(); + while (elements.more) + auto v = elements.get(); + + foreach (value; bag.elements) + Cout (value).newline; + + bag.checkImplementation(); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/TreeMap.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/TreeMap.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,672 @@ +/* + File: TreeMap.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 24Sep95 dl@cs.oswego.edu Create from tango.util.collection.d working file + 13Oct95 dl Changed protection statuses + +*/ + + +module tango.util.collection.TreeMap; + +private import tango.core.Exception; + +private import tango.util.collection.model.Comparator, + tango.util.collection.model.SortedKeys, + tango.util.collection.model.GuardIterator; + +private import tango.util.collection.impl.RBPair, + tango.util.collection.impl.RBCell, + tango.util.collection.impl.MapCollection, + tango.util.collection.impl.AbstractIterator, + tango.util.collection.impl.DefaultComparator; + + +/** + * + * + * RedBlack Trees of (key, element) pairs + * + author: Doug Lea + * @version 0.93 + * + *

For an introduction to this package see Overview . +**/ + + +public class TreeMap(K, T) : MapCollection!(K, T), SortedKeys!(K, T) +{ + alias RBCell!(T) RBCellT; + alias RBPair!(K, T) RBPairT; + alias Comparator!(K) ComparatorT; + alias GuardIterator!(T) GuardIteratorT; + + alias MapCollection!(K, T).remove remove; + alias MapCollection!(K, T).removeAll removeAll; + + + // instance variables + + /** + * The root of the tree. Null if empty. + **/ + + package RBPairT tree; + + /** + * The Comparator to use for ordering + **/ + + protected ComparatorT cmp; + protected Comparator!(T) cmpElem; + + /** + * Make an empty tree, using DefaultComparator for ordering + **/ + + public this () + { + this (null, null, null, 0); + } + + + /** + * Make an empty tree, using given screener for screening elements (not keys) + **/ + public this (Predicate screener) + { + this(screener, null, null, 0); + } + + /** + * Make an empty tree, using given Comparator for ordering + **/ + public this (ComparatorT c) + { + this(null, c, null, 0); + } + + /** + * Make an empty tree, using given screener and Comparator. + **/ + public this (Predicate s, ComparatorT c) + { + this(s, c, null, 0); + } + + /** + * Special version of constructor needed by clone() + **/ + + protected this (Predicate s, ComparatorT c, RBPairT t, int n) + { + super(s); + count = n; + tree = t; + cmp = (c is null) ? new DefaultComparator!(K) : c; + cmpElem = new DefaultComparator!(T); + } + + /** + * Create an independent copy. Does not clone elements. + **/ + + public TreeMap duplicate() + { + if (count is 0) + return new TreeMap!(K, T)(screener, cmp); + else + return new TreeMap!(K, T)(screener, cmp, cast(RBPairT)(tree.copyTree()), count); + } + + + // Collection methods + + /** + * Implements tango.util.collection.impl.Collection.Collection.contains + * Time complexity: O(log n). + * See_Also: tango.util.collection.impl.Collection.Collection.contains + **/ + public final bool contains(T element) + { + if (!isValidArg(element) || count is 0) + return false; + return tree.find(element, cmpElem) !is null; + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.instances + * Time complexity: O(log n). + * See_Also: tango.util.collection.impl.Collection.Collection.instances + **/ + public final uint instances(T element) + { + if (!isValidArg(element) || count is 0) + return 0; + return tree.count(element, cmpElem); + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.elements + * Time complexity: O(1). + * See_Also: tango.util.collection.impl.Collection.Collection.elements + **/ + public final GuardIterator!(T) elements() + { + return keys(); + } + + /*********************************************************************** + + Implements tango.util.collection.model.View.View.opApply + Time complexity: O(n) + + See_Also: tango.util.collection.model.View.View.opApply + + ************************************************************************/ + + int opApply (int delegate (inout T value) dg) + { + auto scope iterator = new MapIterator!(K, T)(this); + return iterator.opApply (dg); + } + + + /*********************************************************************** + + Implements tango.util.collection.MapView.opApply + Time complexity: O(n) + + See_Also: tango.util.collection.MapView.opApply + + ************************************************************************/ + + int opApply (int delegate (inout K key, inout T value) dg) + { + auto scope iterator = new MapIterator!(K, T)(this); + return iterator.opApply (dg); + } + + // KeySortedCollection methods + + /** + * Implements tango.util.collection.KeySortedCollection.comparator + * Time complexity: O(1). + * See_Also: tango.util.collection.KeySortedCollection.comparator + **/ + public final ComparatorT comparator() + { + return cmp; + } + + /** + * Use a new Comparator. Causes a reorganization + **/ + + public final void comparator (ComparatorT c) + { + if (cmp !is c) + { + cmp = (c is null) ? new DefaultComparator!(K) : c; + + if (count !is 0) + { + // must rebuild tree! + incVersion(); + auto t = cast(RBPairT) (tree.leftmost()); + tree = null; + count = 0; + + while (t !is null) + { + add_(t.key(), t.element(), false); + t = cast(RBPairT)(t.successor()); + } + } + } + } + + // Map methods + + /** + * Implements tango.util.collection.Map.containsKey. + * Time complexity: O(log n). + * See_Also: tango.util.collection.Map.containsKey + **/ + public final bool containsKey(K key) + { + if (!isValidKey(key) || count is 0) + return false; + return tree.findKey(key, cmp) !is null; + } + + /** + * Implements tango.util.collection.Map.containsPair. + * Time complexity: O(n). + * See_Also: tango.util.collection.Map.containsPair + **/ + public final bool containsPair(K key, T element) + { + if (count is 0 || !isValidKey(key) || !isValidArg(element)) + return false; + return tree.find(key, element, cmp) !is null; + } + + /** + * Implements tango.util.collection.Map.keys. + * Time complexity: O(1). + * See_Also: tango.util.collection.Map.keys + **/ + public final PairIterator!(K, T) keys() + { + return new MapIterator!(K, T)(this); + } + + /** + * Implements tango.util.collection.Map.get. + * Time complexity: O(log n). + * See_Also: tango.util.collection.Map.get + **/ + public final T get(K key) + { + if (count !is 0) + { + RBPairT p = tree.findKey(key, cmp); + if (p !is null) + return p.element(); + } + throw new NoSuchElementException("no matching Key "); + } + + /** + * Return the element associated with Key key. + * @param key a key + * Returns: whether the key is contained or not + **/ + + public final bool get(K key, inout T value) + { + if (count !is 0) + { + RBPairT p = tree.findKey(key, cmp); + if (p !is null) + { + value = p.element(); + return true; + } + } + return false; + } + + + + /** + * Implements tango.util.collection.Map.keyOf. + * Time complexity: O(n). + * See_Also: tango.util.collection.Map.keyOf + **/ + public final bool keyOf(inout K key, T value) + { + if (!isValidArg(value) || count is 0) + return false; + + auto p = (cast(RBPairT)( tree.find(value, cmpElem))); + if (p is null) + return false; + + key = p.key(); + return true; + } + + + // MutableCollection methods + + /** + * Implements tango.util.collection.impl.Collection.Collection.clear. + * Time complexity: O(1). + * See_Also: tango.util.collection.impl.Collection.Collection.clear + **/ + public final void clear() + { + setCount(0); + tree = null; + } + + + /** + * Implements tango.util.collection.impl.Collection.Collection.removeAll. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.Collection.Collection.removeAll + **/ + public final void removeAll(T element) + { + if (!isValidArg(element) || count is 0) + return ; + + RBPairT p = cast(RBPairT)(tree.find(element, cmpElem)); + while (p !is null) + { + tree = cast(RBPairT)(p.remove(tree)); + decCount(); + if (count is 0) + return ; + p = cast(RBPairT)(tree.find(element, cmpElem)); + } + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.removeOneOf. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.Collection.Collection.removeOneOf + **/ + public final void remove (T element) + { + if (!isValidArg(element) || count is 0) + return ; + + RBPairT p = cast(RBPairT)(tree.find(element, cmpElem)); + if (p !is null) + { + tree = cast(RBPairT)(p.remove(tree)); + decCount(); + } + } + + + /** + * Implements tango.util.collection.impl.Collection.Collection.replaceOneOf. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.Collection.Collection.replaceOneOf + **/ + public final void replace(T oldElement, T newElement) + { + if (count is 0 || !isValidArg(oldElement) || !isValidArg(oldElement)) + return ; + + RBPairT p = cast(RBPairT)(tree.find(oldElement, cmpElem)); + if (p !is null) + { + checkElement(newElement); + incVersion(); + p.element(newElement); + } + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.replaceAllOf. + * Time complexity: O(n). + * See_Also: tango.util.collection.impl.Collection.Collection.replaceAllOf + **/ + public final void replaceAll(T oldElement, T newElement) + { + RBPairT p = cast(RBPairT)(tree.find(oldElement, cmpElem)); + while (p !is null) + { + checkElement(newElement); + incVersion(); + p.element(newElement); + p = cast(RBPairT)(tree.find(oldElement, cmpElem)); + } + } + + /** + * Implements tango.util.collection.impl.Collection.Collection.take. + * Time complexity: O(log n). + * Takes the element associated with the least key. + * See_Also: tango.util.collection.impl.Collection.Collection.take + **/ + public final T take() + { + if (count !is 0) + { + RBPairT p = cast(RBPairT)(tree.leftmost()); + T v = p.element(); + tree = cast(RBPairT)(p.remove(tree)); + decCount(); + return v; + } + + checkIndex(0); + return T.init; // not reached + } + + + // MutableMap methods + + /** + * Implements tango.util.collection.impl.MapCollection.MapCollection.add. + * Time complexity: O(log n). + * See_Also: tango.util.collection.impl.MapCollection.MapCollection.add + **/ + public final void add(K key, T element) + { + add_(key, element, true); + } + + + /** + * Implements tango.util.collection.impl.MapCollection.MapCollection.remove. + * Time complexity: O(log n). + * See_Also: tango.util.collection.impl.MapCollection.MapCollection.remove + **/ + public final void removeKey (K key) + { + if (!isValidKey(key) || count is 0) + return ; + + RBCellT p = tree.findKey(key, cmp); + if (p !is null) + { + tree = cast(RBPairT)(p.remove(tree)); + decCount(); + } + } + + + /** + * Implements tango.util.collection.impl.MapCollection.MapCollection.replaceElement. + * Time complexity: O(log n). + * See_Also: tango.util.collection.impl.MapCollection.MapCollection.replaceElement + **/ + public final void replacePair (K key, T oldElement, + T newElement) + { + if (!isValidKey(key) || !isValidArg(oldElement) || count is 0) + return ; + + RBPairT p = tree.find(key, oldElement, cmp); + if (p !is null) + { + checkElement(newElement); + p.element(newElement); + incVersion(); + } + } + + + // helper methods + + + private final void add_(K key, T element, bool checkOccurrence) + { + checkKey(key); + checkElement(element); + + if (tree is null) + { + tree = new RBPairT(key, element); + incCount(); + } + else + { + RBPairT t = tree; + for (;;) + { + int diff = cmp.compare(key, t.key()); + if (diff is 0 && checkOccurrence) + { + if (t.element() != element) + { + t.element(element); + incVersion(); + } + return ; + } + else + if (diff <= 0) + { + if (t.left() !is null) + t = cast(RBPairT)(t.left()); + else + { + tree = cast(RBPairT)(t.insertLeft(new RBPairT(key, element), tree)); + incCount(); + return ; + } + } + else + { + if (t.right() !is null) + t = cast(RBPairT)(t.right()); + else + { + tree = cast(RBPairT)(t.insertRight(new RBPairT(key, element), tree)); + incCount(); + return ; + } + } + } + } + } + + // ImplementationCheckable methods + + /** + * Implements tango.util.collection.model.View.View.checkImplementation. + * See_Also: tango.util.collection.model.View.View.checkImplementation + **/ + public override void checkImplementation() + { + super.checkImplementation(); + assert(cmp !is null); + assert(((count is 0) is (tree is null))); + assert((tree is null || tree.size() is count)); + + if (tree !is null) + { + tree.checkImplementation(); + K last = K.init; + RBPairT t = cast(RBPairT)(tree.leftmost()); + + while (t !is null) + { + K v = t.key(); + assert((last is K.init || cmp.compare(last, v) <= 0)); + last = v; + t = cast(RBPairT)(t.successor()); + } + } + } + + + /*********************************************************************** + + opApply() has migrated here to mitigate the virtual call + on method get() + + ************************************************************************/ + + private static class MapIterator(K, V) : AbstractMapIterator!(K, V) + { + private RBPairT pair; + + public this (TreeMap map) + { + super (map); + + if (map.tree) + pair = cast(RBPairT) map.tree.leftmost; + } + + public final V get(inout K key) + { + if (pair) + key = pair.key; + return get(); + } + + public final V get() + { + decRemaining(); + auto v = pair.element(); + pair = cast(RBPairT) pair.successor(); + return v; + } + + int opApply (int delegate (inout V value) dg) + { + int result; + + for (auto i=remaining(); i--;) + { + auto value = get(); + if ((result = dg(value)) != 0) + break; + } + return result; + } + + int opApply (int delegate (inout K key, inout V value) dg) + { + K key; + int result; + + for (auto i=remaining(); i--;) + { + auto value = get(key); + if ((result = dg(key, value)) != 0) + break; + } + return result; + } + } +} + + + +debug (Test) +{ + import tango.io.Console; + + void main() + { + auto map = new TreeMap!(char[], double); + map.add ("foo", 1); + map.add ("baz", 1); + map.add ("bar", 2); + map.add ("wumpus", 3); + + foreach (key, value; map.keys) {typeof(key) x; x = key;} + + foreach (value; map.keys) {} + + foreach (value; map.elements) {} + + auto keys = map.keys(); + while (keys.more) + auto v = keys.get(); + + foreach (value; map) {} + + foreach (key, value; map) + Cout (key).newline; + + map.checkImplementation(); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/impl/AbstractIterator.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/impl/AbstractIterator.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,121 @@ +/* + File: AbstractIterator.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 24Sep95 dl@cs.oswego.edu Create from tango.util.collection.d working file + 13Oct95 dl Changed protection statuses + 9Apr97 dl made class public +*/ + + +module tango.util.collection.impl.AbstractIterator; + +private import tango.core.Exception; + +private import tango.util.collection.model.View, + tango.util.collection.model.GuardIterator; + + + +/** + * + * A convenient base class for implementations of GuardIterator + * + author: Doug Lea + * @version 0.93 + * + *

For an introduction to this package see Overview . +**/ + +public abstract class AbstractIterator(T) : GuardIterator!(T) +{ + /** + * The collection being enumerated + **/ + + private View!(T) view; + + /** + * The version number of the collection we got upon construction + **/ + + private uint mutation; + + /** + * The number of elements we think we have left. + * Initialized to view.size() upon construction + **/ + + private uint togo; + + + protected this (View!(T) v) + { + view = v; + togo = v.size(); + mutation = v.mutation(); + } + + /** + * Implements tango.util.collection.impl.Collection.CollectionIterator.corrupted. + * Claim corruption if version numbers differ + * See_Also: tango.util.collection.impl.Collection.CollectionIterator.corrupted + **/ + + public final bool corrupted() + { + return mutation != view.mutation; + } + + /** + * Implements tango.util.collection.impl.Collection.CollectionIterator.numberOfRemaingingElements. + * See_Also: tango.util.collection.impl.Collection.CollectionIterator.remaining + **/ + public final uint remaining() + { + return togo; + } + + /** + * Implements tango.util.collection.model.Iterator.more. + * Return true if remaining > 0 and not corrupted + * See_Also: tango.util.collection.model.Iterator.more + **/ + public final bool more() + { + return togo > 0 && mutation is view.mutation; + } + + /** + * Subclass utility. + * Tries to decrement togo, raising exceptions + * if it is already zero or if corrupted() + * Always call as the first line of get. + **/ + protected final void decRemaining() + { + if (mutation != view.mutation) + throw new CorruptedIteratorException ("Collection modified during iteration"); + + if (togo is 0) + throw new NoSuchElementException ("exhausted enumeration"); + + --togo; + } +} + + +public abstract class AbstractMapIterator(K, V) : AbstractIterator!(V), PairIterator!(K, V) +{ + abstract V get (inout K key); + + protected this (View!(V) c) + { + super (c); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/impl/BagCollection.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/impl/BagCollection.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,133 @@ +/* + File: BagCollection.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 13Oct95 dl Create + 22Oct95 dl add addElements + 28jan97 dl make class public +*/ + + +module tango.util.collection.impl.BagCollection; + +private import tango.util.collection.model.Bag, + tango.util.collection.model.Iterator; + +private import tango.util.collection.impl.Collection; + +/** + * + * MutableBagImpl extends MutableImpl to provide + * default implementations of some Bag operations. + * + author: Doug Lea + * @version 0.93 + * + *

For an introduction to this package see Overview . + * +**/ + +public abstract class BagCollection(V) : Collection!(V), Bag!(V) +{ + alias Bag!(V).add add; + alias Collection!(V).remove remove; + alias Collection!(V).removeAll removeAll; + + + /** + * Initialize at version 0, an empty count, and null screener + **/ + + protected this () + { + super(); + } + + /** + * Initialize at version 0, an empty count, and supplied screener + **/ + protected this (Predicate screener) + { + super(screener); + } + + /** + * Implements tango.util.collection.MutableBag.addElements + * See_Also: tango.util.collection.MutableBag.addElements + **/ + + public final void add(Iterator!(V) e) + { + foreach (value; e) + add (value); + } + + + // Default implementations of Bag methods + +version (VERBOSE) +{ + /** + * Implements tango.util.collection.Bag.addingIfAbsent + * See_Also: tango.util.collection.Bag.addingIfAbsent + **/ + public final Bag addingIf(V element) + { + Bag c = duplicate(); + c.addIf(element); + return c; + } + + + /** + * Implements tango.util.collection.Bag.adding + * See_Also: tango.util.collection.Bag.adding + **/ + + public final Bag adding(V element) + { + Bag c = duplicate(); + c.add(element); + return c; + } +} // version + + + /*********************************************************************** + + Implements tango.util.collection.impl.Collection.Collection.removeAll + See_Also: tango.util.collection.impl.Collection.Collection.removeAll + + Has to be here rather than in the superclass to satisfy + D interface idioms + + ************************************************************************/ + + public void removeAll (Iterator!(V) e) + { + while (e.more) + removeAll (e.get); + } + + /*********************************************************************** + + Implements tango.util.collection.impl.Collection.Collection.removeElements + See_Also: tango.util.collection.impl.Collection.Collection.removeElements + + Has to be here rather than in the superclass to satisfy + D interface idioms + + ************************************************************************/ + + public void remove (Iterator!(V) e) + { + while (e.more) + remove (e.get); + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/impl/CLCell.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/impl/CLCell.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,292 @@ +/* + File: CLCell.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 24Sep95 dl@cs.oswego.edu Create from tango.util.collection.d working file + 13Oct95 dl Changed protection statuses + +*/ + + +module tango.util.collection.impl.CLCell; + +private import tango.util.collection.impl.Cell; + + +/** + * + * + * CLCells are cells that are always arranged in circular lists + * They are pure implementation tools + * + author: Doug Lea + * @version 0.93 + * + *

For an introduction to this package see Overview . +**/ + +public class CLCell(T) : Cell!(T) +{ + // instance variables + + private CLCell next_; + private CLCell prev_; + + // constructors + + /** + * Make a cell with contents v, previous cell p, next cell n + **/ + + public this (T v, CLCell p, CLCell n) + { + super(v); + prev_ = p; + next_ = n; + } + + /** + * Make a singular cell + **/ + + public this (T v) + { + super(v); + prev_ = this; + next_ = this; + } + + /** + * Make a singular cell with null contents + **/ + + public this () + { + super(T.init); + prev_ = this; + next_ = this; + } + + /** + * return next cell + **/ + + public final CLCell next() + { + return next_; + } + + /** + * Set next cell. You probably don't want to call this + **/ + + public final void next(CLCell n) + { + next_ = n; + } + + + /** + * return previous cell + **/ + public final CLCell prev() + { + return prev_; + } + + /** + * Set previous cell. You probably don't want to call this + **/ + public final void prev(CLCell n) + { + prev_ = n; + } + + + /** + * Return true if current cell is the only one on the list + **/ + + public final bool isSingleton() + { + return next_ is this; + } + + public final void linkNext(CLCell p) + { + if (p !is null) + { + next_.prev_ = p; + p.next_ = next_; + p.prev_ = this; + next_ = p; + } + } + + /** + * Make a cell holding v and link it immediately after current cell + **/ + + public final void addNext(T v) + { + CLCell p = new CLCell(v, this, next_); + next_.prev_ = p; + next_ = p; + } + + /** + * make a node holding v, link it before the current cell, and return it + **/ + + public final CLCell addPrev(T v) + { + CLCell p = prev_; + CLCell c = new CLCell(v, p, this); + p.next_ = c; + prev_ = c; + return c; + } + + /** + * link p before current cell + **/ + + public final void linkPrev(CLCell p) + { + if (p !is null) + { + prev_.next_ = p; + p.prev_ = prev_; + p.next_ = this; + prev_ = p; + } + } + + /** + * return the number of cells in the list + **/ + + public final int _length() + { + int c = 0; + CLCell p = this; + do { + ++c; + p = p.next(); + } while (p !is this); + return c; + } + + /** + * return the first cell holding element found in a circular traversal starting + * at current cell, or null if no such + **/ + + public final CLCell find(T element) + { + CLCell p = this; + do { + if (p.element() == (element)) + return p; + p = p.next(); + } while (p !is this); + return null; + } + + /** + * return the number of cells holding element found in a circular + * traversal + **/ + + public final int count(T element) + { + int c = 0; + CLCell p = this; + do { + if (p.element() == (element)) + ++c; + p = p.next(); + } while (p !is this); + return c; + } + + /** + * return the nth cell traversed from here. It may wrap around. + **/ + + public final CLCell nth(int n) + { + CLCell p = this; + for (int i = 0; i < n; ++i) + p = p.next_; + return p; + } + + + /** + * Unlink the next cell. + * This has no effect on the list if isSingleton() + **/ + + public final void unlinkNext() + { + CLCell nn = next_.next_; + nn.prev_ = this; + next_ = nn; + } + + /** + * Unlink the previous cell. + * This has no effect on the list if isSingleton() + **/ + + public final void unlinkPrev() + { + CLCell pp = prev_.prev_; + pp.next_ = this; + prev_ = pp; + } + + + /** + * Unlink self from list it is in. + * Causes it to be a singleton + **/ + + public final void unlink() + { + CLCell p = prev_; + CLCell n = next_; + p.next_ = n; + n.prev_ = p; + prev_ = this; + next_ = this; + } + + /** + * Make a copy of the list and return new head. + **/ + + public final CLCell copyList() + { + CLCell hd = this; + + CLCell newlist = new CLCell(hd.element(), null, null); + CLCell current = newlist; + + for (CLCell p = next_; p !is hd; p = p.next_) + { + current.next_ = new CLCell(p.element(), current, null); + current = current.next_; + } + newlist.prev_ = current; + current.next_ = newlist; + return newlist; + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/impl/Cell.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/impl/Cell.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,81 @@ +/* +File: Cell.d + +Originally written by Doug Lea and released into the public domain. +Thanks for the assistance and support of Sun Microsystems Labs, Agorics +Inc, Loral, and everyone contributing, testing, and using this code. + +History: +Date Who What +24Sep95 dl@cs.oswego.edu Create from tango.util.collection.d working file +9Apr97 dl made Serializable + +*/ + + +module tango.util.collection.impl.Cell; + +/** + * + * + * Cell is the base of a bunch of implementation classes + * for lists and the like. + * The base version just holds an Object as its element value + * + author: Doug Lea + * @version 0.93 + * + *

For an introduction to this package see Overview . +**/ + +public class Cell (T) +{ + // instance variables + private T element_; + + /** + * Make a cell with element value v + **/ + + public this (T v) + { + element_ = v; + } + + /** + * Make A cell with null element value + **/ + + public this () + { +// element_ = null; + } + + /** + * return the element value + **/ + + public final T element() + { + return element_; + } + + /** + * set the element value + **/ + + public final void element (T v) + { + element_ = v; + } + + public final int elementHash () + { + return typeid(T).getHash(&element_); + } + + protected Cell duplicate() + { + return new Cell (element_); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/impl/Collection.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/impl/Collection.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,631 @@ +/******************************************************************************* + + File: Collection.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 24Sep95 dl@cs.oswego.edu Create from tango.util.collection.d working file + 13Oct95 dl Add assert + 22Oct95 dl Add excludeElements, removeElements + 28jan97 dl make class public; isolate version changes + 14Dec06 kb Adapted for Tango usage + +********************************************************************************/ + +module tango.util.collection.impl.Collection; + +private import tango.core.Exception; + +private import tango.util.collection.model.View, + tango.util.collection.model.Iterator, + tango.util.collection.model.Dispenser; + +/******************************************************************************* + + Collection serves as a convenient base class for most implementations + of mutable containers. It maintains a version number and element count. + It also provides default implementations of many collection operations. + + Authors: Doug Lea + +********************************************************************************/ + +public abstract class Collection(T) : Dispenser!(T) +{ + alias View!(T) ViewT; + + alias bool delegate(T) Predicate; + + + // instance variables + + /*********************************************************************** + + version represents the current version number + + ************************************************************************/ + + protected uint vershion; + + /*********************************************************************** + + screener hold the supplied element screener + + ************************************************************************/ + + protected Predicate screener; + + /*********************************************************************** + + count holds the number of elements. + + ************************************************************************/ + + protected uint count; + + // constructors + + /*********************************************************************** + + Initialize at version 0, an empty count, and supplied screener + + ************************************************************************/ + + protected this (Predicate screener = null) + { + this.screener = screener; + } + + + /*********************************************************************** + + ************************************************************************/ + + protected final static bool isValidArg (T element) + { + static if (is (T : Object)) + { + if (element is null) + return false; + } + return true; + } + + // Default implementations of Collection methods + + /*********************************************************************** + + expose collection content as an array + + ************************************************************************/ + + public T[] toArray () + { + auto result = new T[this.size]; + + int i = 0; + foreach (e; this) + result[i++] = e; + + return result; + } + + /*********************************************************************** + + Time complexity: O(1). + See_Also: tango.util.collection.impl.Collection.Collection.drained + + ************************************************************************/ + + public final bool drained() + { + return count is 0; + } + + /*********************************************************************** + + Time complexity: O(1). + Returns: the count of elements currently in the collection + See_Also: tango.util.collection.impl.Collection.Collection.size + + ************************************************************************/ + + public final uint size() + { + return count; + } + + /*********************************************************************** + + Checks if element is an allowed element for this collection. + This will not throw an exception, but any other attemp to add an + invalid element will do. + + Time complexity: O(1) + time of screener, if present + + See_Also: tango.util.collection.impl.Collection.Collection.allows + + ************************************************************************/ + + public final bool allows (T element) + { + return isValidArg(element) && + (screener is null || screener(element)); + } + + + /*********************************************************************** + + Time complexity: O(n). + Default implementation. Fairly sleazy approach. + (Defensible only when you remember that it is just a default impl.) + It tries to cast to one of the known collection interface types + and then applies the corresponding comparison rules. + This suffices for all currently supported collection types, + but must be overridden if you define new Collection subinterfaces + and/or implementations. + + See_Also: tango.util.collection.impl.Collection.Collection.matches + + ************************************************************************/ + + public bool matches(ViewT other) + { +/+ + if (other is null) + return false; + else + if (other is this) + return true; + else + if (cast(SortedKeys) this) + { + if (!(cast(Map) other)) + return false; + else + return sameOrderedPairs(cast(Map)this, cast(Map)other); + } + else + if (cast(Map) this) + { + if (!(cast(Map) other)) + return false; + else + return samePairs(cast(Map)(this), cast(Map)(other)); + } + else + if ((cast(Seq) this) || (cast(SortedValues) this)) + return sameOrderedElements(this, other); + else + if (cast(Bag) this) + return sameOccurrences(this, other); + else + if (cast(Set) this) + return sameInclusions(this, cast(View)(other)); + else + return false; ++/ + return false; + } + + // Default implementations of MutableCollection methods + + /*********************************************************************** + + Time complexity: O(1). + See_Also: tango.util.collection.impl.Collection.Collection.version + + ************************************************************************/ + + public final uint mutation() + { + return vershion; + } + + // Object methods + + /*********************************************************************** + + Default implementation of toString for Collections. Not + very pretty, but parenthesizing each element means that + for most kinds of elements, it's conceivable that the + strings could be parsed and used to build other tango.util.collection. + + Not a very pretty implementation either. Casts are used + to get at elements/keys + + ************************************************************************/ + + public override char[] toString() + { + char[16] tmp; + + return "<" ~ this.classinfo.name ~ ", size:" ~ itoa(tmp, size()) ~ ">"; + } + + + /*********************************************************************** + + ************************************************************************/ + + protected final char[] itoa(char[] buf, uint i) + { + auto j = buf.length; + + do { + buf[--j] = i % 10 + '0'; + } while (i /= 10); + return buf [j..$]; + } + + // protected operations on version and count + + /*********************************************************************** + + change the version number + + ************************************************************************/ + + protected final void incVersion() + { + ++vershion; + } + + + /*********************************************************************** + + Increment the element count and update version + + ************************************************************************/ + + protected final void incCount() + { + count++; + incVersion(); + } + + /*********************************************************************** + + Decrement the element count and update version + + ************************************************************************/ + + protected final void decCount() + { + count--; + incVersion(); + } + + + /*********************************************************************** + + add to the element count and update version if changed + + ************************************************************************/ + + protected final void addToCount(uint c) + { + if (c !is 0) + { + count += c; + incVersion(); + } + } + + + /*********************************************************************** + + set the element count and update version if changed + + ************************************************************************/ + + protected final void setCount(uint c) + { + if (c !is count) + { + count = c; + incVersion(); + } + } + + + /*********************************************************************** + + Helper method left public since it might be useful + + ************************************************************************/ + + public final static bool sameInclusions(ViewT s, ViewT t) + { + if (s.size !is t.size) + return false; + + try { // set up to return false on collection exceptions + auto ts = t.elements(); + while (ts.more) + { + if (!s.contains(ts.get)) + return false; + } + return true; + } catch (NoSuchElementException ex) + { + return false; + } + } + + /*********************************************************************** + + Helper method left public since it might be useful + + ************************************************************************/ + + public final static bool sameOccurrences(ViewT s, ViewT t) + { + if (s.size !is t.size) + return false; + + auto ts = t.elements(); + T last = T.init; // minor optimization -- skip two successive if same + + try { // set up to return false on collection exceptions + while (ts.more) + { + T m = ts.get; + if (m !is last) + { + if (s.instances(m) !is t.instances(m)) + return false; + } + last = m; + } + return true; + } catch (NoSuchElementException ex) + { + return false; + } + } + + + /*********************************************************************** + + Helper method left public since it might be useful + + ************************************************************************/ + + public final static bool sameOrderedElements(ViewT s, ViewT t) + { + if (s.size !is t.size) + return false; + + auto ts = t.elements(); + auto ss = s.elements(); + + try { // set up to return false on collection exceptions + while (ts.more) + { + T m = ts.get; + T o = ss.get; + if (m != o) + return false; + } + return true; + } catch (NoSuchElementException ex) + { + return false; + } + } + + // misc common helper methods + + /*********************************************************************** + + Principal method to throw a NoSuchElementException. + Besides index checks in Seqs, you can use it to check for + operations on empty collections via checkIndex(0) + + ************************************************************************/ + + protected final void checkIndex(int index) + { + if (index < 0 || index >= count) + { + char[] msg; + + if (count is 0) + msg = "Element access on empty collection"; + else + { + char[16] idx, cnt; + msg = "Index " ~ itoa (idx, index) ~ " out of range for collection of size " ~ itoa (cnt, count); + } + throw new NoSuchElementException(msg); + } + } + + + /*********************************************************************** + + Principal method to throw a IllegalElementException + + ************************************************************************/ + + protected final void checkElement(T element) + { + if (! allows(element)) + { + throw new IllegalElementException("Attempt to include invalid element _in Collection"); + } + } + + /*********************************************************************** + + See_Also: tango.util.collection.model.View.View.checkImplementation + + ************************************************************************/ + + public void checkImplementation() + { + assert(count >= 0); + } + //public override void checkImplementation() //Doesn't compile with the override attribute + + /*********************************************************************** + + Cause the collection to become empty. + + ************************************************************************/ + + abstract void clear(); + + /*********************************************************************** + + Exclude all occurrences of the indicated element from the collection. + No effect if element not present. + Params: + element = the element to exclude. + --- + !has(element) && + size() == PREV(this).size() - PREV(this).instances(element) && + no other element changes && + Version change iff PREV(this).has(element) + --- + + ************************************************************************/ + + abstract void removeAll(T element); + + /*********************************************************************** + + Remove an instance of the indicated element from the collection. + No effect if !has(element) + Params: + element = the element to remove + --- + let occ = max(1, instances(element)) in + size() == PREV(this).size() - occ && + instances(element) == PREV(this).instances(element) - occ && + no other element changes && + version change iff occ == 1 + --- + + ************************************************************************/ + + abstract void remove (T element); + + /*********************************************************************** + + Replace an occurrence of oldElement with newElement. + No effect if does not hold oldElement or if oldElement.equals(newElement). + The operation has a consistent, but slightly special interpretation + when applied to Sets. For Sets, because elements occur at + most once, if newElement is already included, replacing oldElement with + with newElement has the same effect as just removing oldElement. + --- + let int delta = oldElement.equals(newElement)? 0 : + max(1, PREV(this).instances(oldElement) in + instances(oldElement) == PREV(this).instances(oldElement) - delta && + instances(newElement) == (this instanceof Set) ? + max(1, PREV(this).instances(oldElement) + delta): + PREV(this).instances(oldElement) + delta) && + no other element changes && + Version change iff delta != 0 + --- + Throws: IllegalElementException if has(oldElement) and !allows(newElement) + + ************************************************************************/ + + abstract void replace (T oldElement, T newElement); + + /*********************************************************************** + + Replace all occurrences of oldElement with newElement. + No effect if does not hold oldElement or if oldElement.equals(newElement). + The operation has a consistent, but slightly special interpretation + when applied to Sets. For Sets, because elements occur at + most once, if newElement is already included, replacing oldElement with + with newElement has the same effect as just removing oldElement. + --- + let int delta = oldElement.equals(newElement)? 0 : + PREV(this).instances(oldElement) in + instances(oldElement) == PREV(this).instances(oldElement) - delta && + instances(newElement) == (this instanceof Set) ? + max(1, PREV(this).instances(oldElement) + delta): + PREV(this).instances(oldElement) + delta) && + no other element changes && + Version change iff delta != 0 + --- + Throws: IllegalElementException if has(oldElement) and !allows(newElement) + + ************************************************************************/ + + abstract void replaceAll(T oldElement, T newElement); + + /*********************************************************************** + + Exclude all occurrences of each element of the Iterator. + Behaviorally equivalent to + --- + while (e.more()) + removeAll(e.get()); + --- + Param : + e = the enumeration of elements to exclude. + + Throws: CorruptedIteratorException is propagated if thrown + + See_Also: tango.util.collection.impl.Collection.Collection.removeAll + + ************************************************************************/ + + abstract void removeAll (Iterator!(T) e); + + /*********************************************************************** + + Remove an occurrence of each element of the Iterator. + Behaviorally equivalent to + + --- + while (e.more()) + remove (e.get()); + --- + + Param: + e = the enumeration of elements to remove. + + Throws: CorruptedIteratorException is propagated if thrown + + ************************************************************************/ + + abstract void remove (Iterator!(T) e); + + /*********************************************************************** + + Remove and return an element. Implementations + may strengthen the guarantee about the nature of this element. + but in general it is the most convenient or efficient element to remove. + + Examples: + One way to transfer all elements from + MutableCollection a to MutableBag b is: + --- + while (!a.empty()) + b.add(a.take()); + --- + + Returns: + an element v such that PREV(this).has(v) + and the postconditions of removeOneOf(v) hold. + + Throws: NoSuchElementException iff drained. + + ************************************************************************/ + + abstract T take(); +} + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/impl/DefaultComparator.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/impl/DefaultComparator.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,55 @@ +/* + File: DefaultComparator.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 24Sep95 dl@cs.oswego.edu Create from tango.util.collection.d working file + +*/ + + +module tango.util.collection.impl.DefaultComparator; + +private import tango.util.collection.model.Comparator; + + +/** + * + * + * DefaultComparator provides a general-purpose but slow compare + * operation. + * + author: Doug Lea + * @version 0.93 + * + *

For an introduction to this package see Overview . +**/ + +public class DefaultComparator(T) : Comparator!(T) +{ + + /** + * Try various downcasts to find a basis for + * comparing two elements. If all else fails, just compare + * hashCodes(). This can be effective when you are + * using an ordered implementation data structure like trees, + * but don't really care about ordering. + * + * @param fst first argument + * @param snd second argument + * Returns: a negative number if fst is less than snd; a + * positive number if fst is greater than snd; else 0 + **/ + + public final int compare(T fst, T snd) + { + if (fst is snd) + return 0; + + return typeid(T).compare (&fst, &snd); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/impl/LLCell.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/impl/LLCell.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,330 @@ +/* + File: LLCell.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 24Sep95 dl@cs.oswego.edu Create from tango.util.collection.d working file + +*/ + + +module tango.util.collection.impl.LLCell; + +private import tango.util.collection.impl.Cell; + +private import tango.util.collection.model.Comparator; + +/** + * + * + * LLCells extend Cells with standard linkedlist next-fields, + * and provide a standard operations on them. + *

+ * LLCells are pure implementation tools. They perform + * no argument checking, no result screening, and no synchronization. + * They rely on user-level classes (see for example LinkedList) to do such things. + * Still, the class is made `public' so that you can use them to + * build other kinds of collections or whatever, not just the ones + * currently supported. + * + author: Doug Lea + * @version 0.93 + * + *

For an introduction to this package see Overview . +**/ + +public class LLCell(T) : Cell!(T) +{ + alias Comparator!(T) ComparatorT; + + + protected LLCell next_; + + /** + * Return the next cell (or null if none) + **/ + + public LLCell next() + { + return next_; + } + + /** + * set to point to n as next cell + * @param n, the new next cell + **/ + + public void next(LLCell n) + { + next_ = n; + } + + public this (T v, LLCell n) + { + super(v); + next_ = n; + } + + public this (T v) + { + this(v, null); + } + + public this () + { + this(T.init, null); + } + + + /** + * Splice in p between current cell and whatever it was previously + * pointing to + * @param p, the cell to splice + **/ + + public final void linkNext(LLCell p) + { + if (p !is null) + p.next_ = next_; + next_ = p; + } + + /** + * Cause current cell to skip over the current next() one, + * effectively removing the next element from the list + **/ + + public final void unlinkNext() + { + if (next_ !is null) + next_ = next_.next_; + } + + /** + * Linear search down the list looking for element (using T.equals) + * @param element to look for + * Returns: the cell containing element, or null if no such + **/ + + public final LLCell find(T element) + { + for (LLCell p = this; p !is null; p = p.next_) + if (p.element() == element) + return p; + return null; + } + + /** + * return the number of cells traversed to find first occurrence + * of a cell with element() element, or -1 if not present + **/ + + public final int index(T element) + { + int i = 0; + for (LLCell p = this; p !is null; p = p.next_) + { + if (p.element() == element) + return i; + else + ++i; + } + return -1; + } + + /** + * Count the number of occurrences of element in list + **/ + + public final int count(T element) + { + int c = 0; + for (LLCell p = this; p !is null; p = p.next_) + if (p.element() == element) + ++c; + return c; + } + + /** + * return the number of cells in the list + **/ + + public final int _length() + { + int c = 0; + for (LLCell p = this; p !is null; p = p.next_) + ++c; + return c; + } + + /** + * return the cell representing the last element of the list + * (i.e., the one whose next() is null + **/ + + public final LLCell tail() + { + LLCell p = this; + for ( ; p.next_ !is null; p = p.next_) + {} + return p; + } + + /** + * return the nth cell of the list, or null if no such + **/ + + public final LLCell nth(int n) + { + LLCell p = this; + for (int i = 0; i < n; ++i) + p = p.next_; + return p; + } + + + /** + * make a copy of the list; i.e., a new list containing new cells + * but including the same elements in the same order + **/ + + public final LLCell copyList() + { + LLCell newlist = null; + newlist = duplicate(); + LLCell current = newlist; + + for (LLCell p = next_; p !is null; p = p.next_) + { + current.next_ = p.duplicate(); + current = current.next_; + } + current.next_ = null; + return newlist; + } + + /** + * Clone is SHALLOW; i.e., just makes a copy of the current cell + **/ + + private final LLCell duplicate() + { + return new LLCell(element(), next_); + } + + /** + * Basic linkedlist merge algorithm. + * Merges the lists head by fst and snd with respect to cmp + * @param fst head of the first list + * @param snd head of the second list + * @param cmp a Comparator used to compare elements + * Returns: the merged ordered list + **/ + + public final static LLCell merge(LLCell fst, LLCell snd, ComparatorT cmp) + { + LLCell a = fst; + LLCell b = snd; + LLCell hd = null; + LLCell current = null; + for (;;) + { + if (a is null) + { + if (hd is null) + hd = b; + else + current.next(b); + return hd; + } + else + if (b is null) + { + if (hd is null) + hd = a; + else + current.next(a); + return hd; + } + + int diff = cmp.compare(a.element(), b.element()); + if (diff <= 0) + { + if (hd is null) + hd = a; + else + current.next(a); + current = a; + a = a.next(); + } + else + { + if (hd is null) + hd = b; + else + current.next(b); + current = b; + b = b.next(); + } + } + return null; + } + + /** + * Standard list splitter, used by sort. + * Splits the list in half. Returns the head of the second half + * @param s the head of the list + * Returns: the head of the second half + **/ + + public final static LLCell split(LLCell s) + { + LLCell fast = s; + LLCell slow = s; + + if (fast is null || fast.next() is null) + return null; + + while (fast !is null) + { + fast = fast.next(); + if (fast !is null && fast.next() !is null) + { + fast = fast.next(); + slow = slow.next(); + } + } + + LLCell r = slow.next(); + slow.next(null); + return r; + + } + + /** + * Standard merge sort algorithm + * @param s the list to sort + * @param cmp, the comparator to use for ordering + * Returns: the head of the sorted list + **/ + + public final static LLCell mergeSort(LLCell s, ComparatorT cmp) + { + if (s is null || s.next() is null) + return s; + else + { + LLCell right = split(s); + LLCell left = s; + left = mergeSort(left, cmp); + right = mergeSort(right, cmp); + return merge(left, right, cmp); + } + } + +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/impl/LLPair.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/impl/LLPair.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,191 @@ +/* + File: LLPair.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 24Sep95 dl@cs.oswego.edu Create from tango.util.collection.d working file + +*/ + + +module tango.util.collection.impl.LLPair; + +private import tango.util.collection.impl.LLCell; + +private import tango.util.collection.model.Iterator; + + +/** + * + * + * LLPairs are LLCells with keys, and operations that deal with them. + * As with LLCells, the are pure implementation tools. + * + author: Doug Lea + * @version 0.93 + * + *

For an introduction to this package see Overview . +**/ + +public class LLPair(K, T) : LLCell!(T) +{ + alias LLCell!(T).find find; + alias LLCell!(T).count count; + alias LLCell!(T).element element; + + + // instance variables + + private K key_; + + /** + * Make a cell with given key, elment, and next link + **/ + + public this (K k, T v, LLPair n) + { + super(v, n); + key_ = k; + } + + /** + * Make a pair with given key and element, and null next link + **/ + + public this (K k, T v) + { + super(v, null); + key_ = k; + } + + /** + * Make a pair with null key, elment, and next link + **/ + + public this () + { + super(T.init, null); + key_ = K.init; + } + + /** + * return the key + **/ + + public final K key() + { + return key_; + } + + /** + * set the key + **/ + + public final void key(K k) + { + key_ = k; + } + + + /** + * set the key + **/ + + public final int keyHash() + { + return typeid(K).getHash(&key_); + } + + + /** + * return a cell with key() key or null if no such + **/ + + public final LLPair findKey(K key) + { + for (auto p=this; p; p = cast(LLPair)cast(void*) p.next_) + if (p.key() == key) + return p; + return null; + } + + /** + * return a cell holding the indicated pair or null if no such + **/ + + public final LLPair find(K key, T element) + { + for (auto p=this; p; p = cast(LLPair)cast(void*) p.next_) + if (p.key() == key && p.element() == element) + return p; + return null; + } + + /** + * Return the number of cells traversed to find a cell with key() key, + * or -1 if not present + **/ + + public final int indexKey(K key) + { + int i = 0; + for (auto p=this; p; p = cast(LLPair)cast(void*) p.next_) + { + if (p.key() == key) + return i; + else + ++i; + } + return -1; + } + + /** + * Return the number of cells traversed to find a cell with indicated pair + * or -1 if not present + **/ + public final int index(K key, T element) + { + int i = 0; + for (auto p=this; p; p = cast(LLPair)cast(void*) p.next_) + { + if (p.key() == key && p.element() == element) + return i; + else + ++i; + } + return -1; + } + + /** + * Return the number of cells with key() key. + **/ + public final int countKey(K key) + { + int c = 0; + for (auto p=this; p; p = cast(LLPair)cast(void*) p.next_) + if (p.key() == key) + ++c; + return c; + } + + /** + * Return the number of cells with indicated pair + **/ + public final int count(K key, T element) + { + int c = 0; + for (auto p=this; p; p = cast(LLPair)cast(void*) p.next_) + if (p.key() == key && p.element() == element) + ++c; + return c; + } + + protected final LLPair duplicate() + { + return new LLPair(key(), element(), cast(LLPair)cast(void*)(next())); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/impl/MapCollection.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/impl/MapCollection.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,232 @@ +/******************************************************************************* + + File: MapCollection.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 13Oct95 dl Create + 28jan97 dl make class public + 14Dec06 kb adapted for Tango usage + +********************************************************************************/ + +module tango.util.collection.impl.MapCollection; + +private import tango.core.Exception; + +private import tango.util.collection.impl.Collection; + +private import tango.util.collection.model.Map, + tango.util.collection.model.View, + tango.util.collection.model.MapView, + tango.util.collection.model.Iterator, + tango.util.collection.model.SortedKeys; + + +/******************************************************************************* + + MapCollection extends Collection to provide default implementations of + some Map operations. + + author: Doug Lea + @version 0.93 + +

For an introduction to this package see Overview . + + ********************************************************************************/ + +public abstract class MapCollection(K, T) : Collection!(T), Map!(K, T) +{ + alias MapView!(K, T) MapViewT; + alias Collection!(T).remove remove; + alias Collection!(T).removeAll removeAll; + + + /*********************************************************************** + + Initialize at version 0, an empty count, and null screener + + ************************************************************************/ + + protected this () + { + super(); + } + + /*********************************************************************** + + Initialize at version 0, an empty count, and supplied screener + + ************************************************************************/ + + protected this (Predicate screener) + { + super(screener); + } + + /*********************************************************************** + + Implements tango.util.collection.Map.allowsKey. + Default key-screen. Just checks for null. + + See_Also: tango.util.collection.Map.allowsKey + + ************************************************************************/ + + public final bool allowsKey(K key) + { + return (key !is K.init); + } + + protected final bool isValidKey(K key) + { + static if (is (K : Object)) + { + if (key is null) + return false; + } + return true; + } + + /*********************************************************************** + + Principal method to throw a IllegalElementException for keys + + ************************************************************************/ + + protected final void checkKey(K key) + { + if (!isValidKey(key)) + { + throw new IllegalElementException("Attempt to include invalid key _in Collection"); + } + } + + /*********************************************************************** + + Implements tango.util.collection.impl.MapCollection.MapCollection.opIndexAssign + Just calls add(key, element). + + See_Also: tango.util.collection.impl.MapCollection.MapCollection.add + + ************************************************************************/ + + public final void opIndexAssign (T element, K key) + { + add (key, element); + } + + /*********************************************************************** + + Implements tango.util.collection.impl.Collection.Collection.matches + Time complexity: O(n). + Default implementation. Fairly sleazy approach. + (Defensible only when you remember that it is just a default impl.) + It tries to cast to one of the known collection interface types + and then applies the corresponding comparison rules. + This suffices for all currently supported collection types, + but must be overridden if you define new Collection subinterfaces + and/or implementations. + + See_Also: tango.util.collection.impl.Collection.Collection.matches + + ************************************************************************/ + + public override bool matches(View!(T) other) + { + if (other is null) + {} + else + if (other is this) + return true; + else + { + auto tmp = cast (MapViewT) other; + if (tmp) + if (cast(SortedKeys!(K, T)) this) + return sameOrderedPairs(this, tmp); + else + return samePairs(this, tmp); + } + return false; + } + + + public final static bool samePairs(MapViewT s, MapViewT t) + { + if (s.size !is t.size) + return false; + + try { // set up to return false on collection exceptions + foreach (key, value; t.keys) + if (! s.containsPair (key, value)) + return false; + } catch (NoSuchElementException ex) + { + return false; + } + return true; + } + + public final static bool sameOrderedPairs(MapViewT s, MapViewT t) + { + if (s.size !is t.size) + return false; + + auto ss = s.keys(); + try { // set up to return false on collection exceptions + foreach (key, value; t.keys) + { + K sk; + auto sv = ss.get (sk); + if (sk != key || sv != value) + return false; + } + } catch (NoSuchElementException ex) + { + return false; + } + return true; + } + + + // Object methods + + /*********************************************************************** + + Implements tango.util.collection.impl.Collection.Collection.removeAll + See_Also: tango.util.collection.impl.Collection.Collection.removeAll + + Has to be here rather than in the superclass to satisfy + D interface idioms + + ************************************************************************/ + + public void removeAll (Iterator!(T) e) + { + while (e.more) + removeAll (e.get); + } + + /*********************************************************************** + + Implements tango.util.collection.impl.Collection.Collection.removeElements + See_Also: tango.util.collection.impl.Collection.Collection.removeElements + + Has to be here rather than in the superclass to satisfy + D interface idioms + + ************************************************************************/ + + public void remove (Iterator!(T) e) + { + while (e.more) + remove (e.get); + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/impl/RBCell.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/impl/RBCell.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,811 @@ +/* + File: RBCell.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 24Sep95 dl@cs.oswego.edu Create from tango.util.collection.d working file + +*/ + + +module tango.util.collection.impl.RBCell; + +private import tango.util.collection.impl.Cell; + +private import tango.util.collection.model.Iterator, + tango.util.collection.model.Comparator; + +/** + * RBCell implements basic capabilities of Red-Black trees, + * an efficient kind of balanced binary tree. The particular + * algorithms used are adaptations of those in Corman, + * Lieserson, and Rivest's Introduction to Algorithms. + * This class was inspired by (and code cross-checked with) a + * similar class by Chuck McManis. The implementations of + * rebalancings during insertion and deletion are + * a little trickier than those versions since they + * don't swap Cell contents or use special dummy nilnodes. + *

+ * It is a pure implementation class. For harnesses, see: + * See_Also: RBTree + * Authors: Doug Lea +**/ + + + + +public class RBCell(T) : Cell!(T) +{ + static bool RED = false; + static bool BLACK = true; + + /** + * The node color (RED, BLACK) + **/ + + package bool color_; + + /** + * Pointer to left child + **/ + + package RBCell left_; + + /** + * Pointer to right child + **/ + + package RBCell right_; + + /** + * Pointer to parent (null if root) + **/ + + private RBCell parent_; + + /** + * Make a new Cell with given element, null links, and BLACK color. + * Normally only called to establish a new root. + **/ + + public this (T element) + { + super(element); + left_ = null; + right_ = null; + parent_ = null; + color_ = BLACK; + } + + /** + * Return a new RBCell with same element and color as self, + * but with null links. (Since it is never OK to have + * multiple identical links in a RB tree.) + **/ + + protected RBCell duplicate() + { + RBCell t = new RBCell(element()); + t.color_ = color_; + return t; + } + + + /** + * Return left child (or null) + **/ + + public final RBCell left() + { + return left_; + } + + /** + * Return right child (or null) + **/ + + public final RBCell right() + { + return right_; + } + + /** + * Return parent (or null) + **/ + public final RBCell parent() + { + return parent_; + } + + + /** + * See_Also: tango.util.collection.model.View.View.checkImplementation. + **/ + public void checkImplementation() + { + + // It's too hard to check the property that every simple + // path from node to leaf has same number of black nodes. + // So restrict to the following + + assert(parent_ is null || + this is parent_.left_ || + this is parent_.right_); + + assert(left_ is null || + this is left_.parent_); + + assert(right_ is null || + this is right_.parent_); + + assert(color_ is BLACK || + (colorOf(left_) is BLACK) && (colorOf(right_) is BLACK)); + + if (left_ !is null) + left_.checkImplementation(); + if (right_ !is null) + right_.checkImplementation(); + } + + /+ + public final void assert(bool pred) + { + ImplementationError.assert(this, pred); + } + +/ + + /** + * Return the minimum element of the current (sub)tree + **/ + + public final RBCell leftmost() + { + auto p = this; + for ( ; p.left_ !is null; p = p.left_) + {} + return p; + } + + /** + * Return the maximum element of the current (sub)tree + **/ + public final RBCell rightmost() + { + auto p = this; + for ( ; p.right_ !is null; p = p.right_) + {} + return p; + } + + /** + * Return the root (parentless node) of the tree + **/ + public final RBCell root() + { + auto p = this; + for ( ; p.parent_ !is null; p = p.parent_) + {} + return p; + } + + /** + * Return true if node is a root (i.e., has a null parent) + **/ + + public final bool isRoot() + { + return parent_ is null; + } + + + /** + * Return the inorder successor, or null if no such + **/ + + public final RBCell successor() + { + if (right_ !is null) + return right_.leftmost(); + else + { + auto p = parent_; + auto ch = this; + while (p !is null && ch is p.right_) + { + ch = p; + p = p.parent_; + } + return p; + } + } + + /** + * Return the inorder predecessor, or null if no such + **/ + + public final RBCell predecessor() + { + if (left_ !is null) + return left_.rightmost(); + else + { + auto p = parent_; + auto ch = this; + while (p !is null && ch is p.left_) + { + ch = p; + p = p.parent_; + } + return p; + } + } + + /** + * Return the number of nodes in the subtree + **/ + public final int size() + { + int c = 1; + if (left_ !is null) + c += left_.size(); + if (right_ !is null) + c += right_.size(); + return c; + } + + + /** + * Return node of current subtree containing element as element(), + * if it exists, else null. + * Uses Comparator cmp to find and to check equality. + **/ + + public RBCell find(T element, Comparator!(T) cmp) + { + auto t = this; + for (;;) + { + int diff = cmp.compare(element, t.element()); + if (diff is 0) + return t; + else + if (diff < 0) + t = t.left_; + else + t = t.right_; + if (t is null) + break; + } + return null; + } + + + /** + * Return number of nodes of current subtree containing element. + * Uses Comparator cmp to find and to check equality. + **/ + public int count(T element, Comparator!(T) cmp) + { + int c = 0; + auto t = this; + while (t !is null) + { + int diff = cmp.compare(element, t.element()); + if (diff is 0) + { + ++c; + if (t.left_ is null) + t = t.right_; + else + if (t.right_ is null) + t = t.left_; + else + { + c += t.right_.count(element, cmp); + t = t.left_; + } + } + else + if (diff < 0) + t = t.left_; + else + t = t.right_; + } + return c; + } + + + + + /** + * Return a new subtree containing each element of current subtree + **/ + + public final RBCell copyTree() + { + auto t = cast(RBCell)(duplicate()); + + if (left_ !is null) + { + t.left_ = left_.copyTree(); + t.left_.parent_ = t; + } + if (right_ !is null) + { + t.right_ = right_.copyTree(); + t.right_.parent_ = t; + } + return t; + } + + + /** + * There's no generic element insertion. Instead find the + * place you want to add a node and then invoke insertLeft + * or insertRight. + *

+ * Insert Cell as the left child of current node, and then + * rebalance the tree it is in. + * @param Cell the Cell to add + * @param root, the root of the current tree + * Returns: the new root of the current tree. (Rebalancing + * can change the root!) + **/ + + + public final RBCell insertLeft(RBCell Cell, RBCell root) + { + left_ = Cell; + Cell.parent_ = this; + return Cell.fixAfterInsertion(root); + } + + /** + * Insert Cell as the right child of current node, and then + * rebalance the tree it is in. + * @param Cell the Cell to add + * @param root, the root of the current tree + * Returns: the new root of the current tree. (Rebalancing + * can change the root!) + **/ + + public final RBCell insertRight(RBCell Cell, RBCell root) + { + right_ = Cell; + Cell.parent_ = this; + return Cell.fixAfterInsertion(root); + } + + + /** + * Delete the current node, and then rebalance the tree it is in + * @param root the root of the current tree + * Returns: the new root of the current tree. (Rebalancing + * can change the root!) + **/ + + + public final RBCell remove (RBCell root) + { + + // handle case where we are only node + if (left_ is null && right_ is null && parent_ is null) + return null; + + // if strictly internal, swap places with a successor + if (left_ !is null && right_ !is null) + { + auto s = successor(); + // To work nicely with arbitrary subclasses of RBCell, we don't want to + // just copy successor's fields. since we don't know what + // they are. Instead we swap positions _in the tree. + root = swapPosition(this, s, root); + } + + // Start fixup at replacement node (normally a child). + // But if no children, fake it by using self + + if (left_ is null && right_ is null) + { + + if (color_ is BLACK) + root = this.fixAfterDeletion(root); + + // Unlink (Couldn't before since fixAfterDeletion needs parent ptr) + + if (parent_ !is null) + { + if (this is parent_.left_) + parent_.left_ = null; + else + if (this is parent_.right_) + parent_.right_ = null; + parent_ = null; + } + + } + else + { + auto replacement = left_; + if (replacement is null) + replacement = right_; + + // link replacement to parent + replacement.parent_ = parent_; + + if (parent_ is null) + root = replacement; + else + if (this is parent_.left_) + parent_.left_ = replacement; + else + parent_.right_ = replacement; + + left_ = null; + right_ = null; + parent_ = null; + + // fix replacement + if (color_ is BLACK) + root = replacement.fixAfterDeletion(root); + + } + + return root; + } + + /** + * Swap the linkages of two nodes in a tree. + * Return new root, in case it changed. + **/ + + static final RBCell swapPosition(RBCell x, RBCell y, RBCell root) + { + + /* Too messy. TODO: find sequence of assigments that are always OK */ + + auto px = x.parent_; + bool xpl = px !is null && x is px.left_; + auto lx = x.left_; + auto rx = x.right_; + + auto py = y.parent_; + bool ypl = py !is null && y is py.left_; + auto ly = y.left_; + auto ry = y.right_; + + if (x is py) + { + y.parent_ = px; + if (px !is null) + if (xpl) + px.left_ = y; + else + px.right_ = y; + x.parent_ = y; + if (ypl) + { + y.left_ = x; + y.right_ = rx; + if (rx !is null) + rx.parent_ = y; + } + else + { + y.right_ = x; + y.left_ = lx; + if (lx !is null) + lx.parent_ = y; + } + x.left_ = ly; + if (ly !is null) + ly.parent_ = x; + x.right_ = ry; + if (ry !is null) + ry.parent_ = x; + } + else + if (y is px) + { + x.parent_ = py; + if (py !is null) + if (ypl) + py.left_ = x; + else + py.right_ = x; + y.parent_ = x; + if (xpl) + { + x.left_ = y; + x.right_ = ry; + if (ry !is null) + ry.parent_ = x; + } + else + { + x.right_ = y; + x.left_ = ly; + if (ly !is null) + ly.parent_ = x; + } + y.left_ = lx; + if (lx !is null) + lx.parent_ = y; + y.right_ = rx; + if (rx !is null) + rx.parent_ = y; + } + else + { + x.parent_ = py; + if (py !is null) + if (ypl) + py.left_ = x; + else + py.right_ = x; + x.left_ = ly; + if (ly !is null) + ly.parent_ = x; + x.right_ = ry; + if (ry !is null) + ry.parent_ = x; + + y.parent_ = px; + if (px !is null) + if (xpl) + px.left_ = y; + else + px.right_ = y; + y.left_ = lx; + if (lx !is null) + lx.parent_ = y; + y.right_ = rx; + if (rx !is null) + rx.parent_ = y; + } + + bool c = x.color_; + x.color_ = y.color_; + y.color_ = c; + + if (root is x) + root = y; + else + if (root is y) + root = x; + return root; + } + + + + /** + * Return color of node p, or BLACK if p is null + * (In the CLR version, they use + * a special dummy `nil' node for such purposes, but that doesn't + * work well here, since it could lead to creating one such special + * node per real node.) + * + **/ + + static final bool colorOf(RBCell p) + { + return (p is null) ? BLACK : p.color_; + } + + /** + * return parent of node p, or null if p is null + **/ + static final RBCell parentOf(RBCell p) + { + return (p is null) ? null : p.parent_; + } + + /** + * Set the color of node p, or do nothing if p is null + **/ + + static final void setColor(RBCell p, bool c) + { + if (p !is null) + p.color_ = c; + } + + /** + * return left child of node p, or null if p is null + **/ + + static final RBCell leftOf(RBCell p) + { + return (p is null) ? null : p.left_; + } + + /** + * return right child of node p, or null if p is null + **/ + + static final RBCell rightOf(RBCell p) + { + return (p is null) ? null : p.right_; + } + + + /** From CLR **/ + protected final RBCell rotateLeft(RBCell root) + { + auto r = right_; + right_ = r.left_; + if (r.left_ !is null) + r.left_.parent_ = this; + r.parent_ = parent_; + if (parent_ is null) + root = r; + else + if (parent_.left_ is this) + parent_.left_ = r; + else + parent_.right_ = r; + r.left_ = this; + parent_ = r; + return root; + } + + /** From CLR **/ + protected final RBCell rotateRight(RBCell root) + { + auto l = left_; + left_ = l.right_; + if (l.right_ !is null) + l.right_.parent_ = this; + l.parent_ = parent_; + if (parent_ is null) + root = l; + else + if (parent_.right_ is this) + parent_.right_ = l; + else + parent_.left_ = l; + l.right_ = this; + parent_ = l; + return root; + } + + + /** From CLR **/ + protected final RBCell fixAfterInsertion(RBCell root) + { + color_ = RED; + auto x = this; + + while (x !is null && x !is root && x.parent_.color_ is RED) + { + if (parentOf(x) is leftOf(parentOf(parentOf(x)))) + { + auto y = rightOf(parentOf(parentOf(x))); + if (colorOf(y) is RED) + { + setColor(parentOf(x), BLACK); + setColor(y, BLACK); + setColor(parentOf(parentOf(x)), RED); + x = parentOf(parentOf(x)); + } + else + { + if (x is rightOf(parentOf(x))) + { + x = parentOf(x); + root = x.rotateLeft(root); + } + setColor(parentOf(x), BLACK); + setColor(parentOf(parentOf(x)), RED); + if (parentOf(parentOf(x)) !is null) + root = parentOf(parentOf(x)).rotateRight(root); + } + } + else + { + auto y = leftOf(parentOf(parentOf(x))); + if (colorOf(y) is RED) + { + setColor(parentOf(x), BLACK); + setColor(y, BLACK); + setColor(parentOf(parentOf(x)), RED); + x = parentOf(parentOf(x)); + } + else + { + if (x is leftOf(parentOf(x))) + { + x = parentOf(x); + root = x.rotateRight(root); + } + setColor(parentOf(x), BLACK); + setColor(parentOf(parentOf(x)), RED); + if (parentOf(parentOf(x)) !is null) + root = parentOf(parentOf(x)).rotateLeft(root); + } + } + } + root.color_ = BLACK; + return root; + } + + + + /** From CLR **/ + protected final RBCell fixAfterDeletion(RBCell root) + { + auto x = this; + while (x !is root && colorOf(x) is BLACK) + { + if (x is leftOf(parentOf(x))) + { + auto sib = rightOf(parentOf(x)); + if (colorOf(sib) is RED) + { + setColor(sib, BLACK); + setColor(parentOf(x), RED); + root = parentOf(x).rotateLeft(root); + sib = rightOf(parentOf(x)); + } + if (colorOf(leftOf(sib)) is BLACK && colorOf(rightOf(sib)) is BLACK) + { + setColor(sib, RED); + x = parentOf(x); + } + else + { + if (colorOf(rightOf(sib)) is BLACK) + { + setColor(leftOf(sib), BLACK); + setColor(sib, RED); + root = sib.rotateRight(root); + sib = rightOf(parentOf(x)); + } + setColor(sib, colorOf(parentOf(x))); + setColor(parentOf(x), BLACK); + setColor(rightOf(sib), BLACK); + root = parentOf(x).rotateLeft(root); + x = root; + } + } + else + { + auto sib = leftOf(parentOf(x)); + if (colorOf(sib) is RED) + { + setColor(sib, BLACK); + setColor(parentOf(x), RED); + root = parentOf(x).rotateRight(root); + sib = leftOf(parentOf(x)); + } + if (colorOf(rightOf(sib)) is BLACK && colorOf(leftOf(sib)) is BLACK) + { + setColor(sib, RED); + x = parentOf(x); + } + else + { + if (colorOf(leftOf(sib)) is BLACK) + { + setColor(rightOf(sib), BLACK); + setColor(sib, RED); + root = sib.rotateLeft(root); + sib = leftOf(parentOf(x)); + } + setColor(sib, colorOf(parentOf(x))); + setColor(parentOf(x), BLACK); + setColor(leftOf(sib), BLACK); + root = parentOf(x).rotateRight(root); + x = root; + } + } + } + setColor(x, BLACK); + return root; + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/impl/RBPair.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/impl/RBPair.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,253 @@ +/* + File: RBPair.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 24Sep95 dl@cs.oswego.edu Create from tango.util.collection.d working file + 13Oct95 dl Changed protection statuses + +*/ + + +module tango.util.collection.impl.RBPair; + +private import tango.util.collection.impl.RBCell; + +private import tango.util.collection.model.Comparator; + + +/** + * + * RBPairs are RBCells with keys. + * + * + author: Doug Lea + * @version 0.93 + * + *

For an introduction to this package see Overview . +**/ + +public class RBPair(K, T) : RBCell!(T) +{ + alias RBCell!(T).element element; + + // instance variable + + private K key_; + + /** + * Make a cell with given key and element values, and null links + **/ + + public this (K k, T v) + { + super(v); + key_ = k; + } + + /** + * Make a new node with same key and element values, but null links + **/ + + protected final RBPair duplicate() + { + auto t = new RBPair(key_, element()); + t.color_ = color_; + return t; + } + + /** + * return the key + **/ + + public final K key() + { + return key_; + } + + + /** + * set the key + **/ + + public final void key(K k) + { + key_ = k; + } + + /** + * Implements RBCell.find. + * Override RBCell version since we are ordered on keys, not elements, so + * element find has to search whole tree. + * comparator argument not actually used. + * See_Also: RBCell.find + **/ + + public final override RBCell!(T) find(T element, Comparator!(T) cmp) + { + RBCell!(T) t = this; + + while (t !is null) + { + if (t.element() == (element)) + return t; + else + if (t.right_ is null) + t = t.left_; + else + if (t.left_ is null) + t = t.right_; + else + { + auto p = t.left_.find(element, cmp); + + if (p !is null) + return p; + else + t = t.right_; + } + } + return null; // not reached + } + + /** + * Implements RBCell.count. + * See_Also: RBCell.count + **/ + public final override int count(T element, Comparator!(T) cmp) + { + int c = 0; + RBCell!(T) t = this; + + while (t !is null) + { + if (t.element() == (element)) + ++c; + + if (t.right_ is null) + t = t.left_; + else + if (t.left_ is null) + t = t.right_; + else + { + c += t.left_.count(element, cmp); + t = t.right_; + } + } + return c; + } + + /** + * find and return a cell holding key, or null if no such + **/ + + public final RBPair findKey(K key, Comparator!(K) cmp) + { + auto t = this; + + for (;;) + { + int diff = cmp.compare(key, t.key_); + if (diff is 0) + return t; + else + if (diff < 0) + t = cast(RBPair)(t.left_); + else + t = cast(RBPair)(t.right_); + + if (t is null) + break; + } + return null; + } + + /** + * find and return a cell holding (key, element), or null if no such + **/ + public final RBPair find(K key, T element, Comparator!(K) cmp) + { + auto t = this; + + for (;;) + { + int diff = cmp.compare(key, t.key_); + if (diff is 0 && t.element() == (element)) + return t; + else + if (diff <= 0) + t = cast(RBPair)(t.left_); + else + t = cast(RBPair)(t.right_); + + if (t is null) + break; + } + return null; + } + + /** + * return number of nodes of subtree holding key + **/ + public final int countKey(K key, Comparator!(K) cmp) + { + int c = 0; + auto t = this; + + while (t !is null) + { + int diff = cmp.compare(key, t.key_); + // rely on insert to always go left on <= + if (diff is 0) + ++c; + + if (diff <= 0) + t = cast(RBPair)(t.left_); + else + t = cast(RBPair)(t.right_); + } + return c; + } + + /** + * return number of nodes of subtree holding (key, element) + **/ + public final int count(K key, T element, Comparator!(K) cmp) + { + int c = 0; + auto t = this; + + while (t !is null) + { + int diff = cmp.compare(key, t.key_); + if (diff is 0) + { + if (t.element() == (element)) + ++c; + + if (t.left_ is null) + t = cast(RBPair)(t.right_); + else + if (t.right_ is null) + t = cast(RBPair)(t.left_); + else + { + c += (cast(RBPair)(t.right_)).count(key, element, cmp); + t = cast(RBPair)(t.left_); + } + } + else + if (diff < 0) + t = cast(RBPair)(t.left()); + else + t = cast(RBPair)(t.right()); + } + return c; + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/impl/SeqCollection.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/impl/SeqCollection.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,165 @@ +/* + File: SeqCollection.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 13Oct95 dl Create + 28jab97 dl make class public +*/ + + +module tango.util.collection.impl.SeqCollection; + +private import tango.util.collection.model.Seq, + tango.util.collection.model.Iterator; + +private import tango.util.collection.impl.Collection; + + + +/** + * + * SeqCollection extends MutableImpl to provide + * default implementations of some Seq operations. + * + author: Doug Lea + * @version 0.93 + * + *

For an introduction to this package see Overview . + * +**/ + +public abstract class SeqCollection(T) : Collection!(T), Seq!(T) +{ + alias Collection!(T).remove remove; + alias Collection!(T).removeAll removeAll; + + + /** + * Initialize at version 0, an empty count, and null screener + **/ + + protected this () + { + super(); + } + + /** + * Initialize at version 0, an empty count, and supplied screener + **/ + protected this (Predicate screener) + { + super(screener); + } + + + // Default implementations of Seq methods + +version (VERBOSE) +{ + /** + * Implements tango.util.collection.model.Seq.Seq.insertingAt. + * See_Also: tango.util.collection.model.Seq.Seq.insertingAt + **/ + public final Seq insertingAt(int index, T element) + { + MutableSeq c = null; + // c = (cast(MutableSeq)clone()); + c = (cast(MutableSeq)duplicate()); + c.insert(index, element); + return c; + } + + /** + * Implements tango.util.collection.model.Seq.Seq.removingAt. + * See_Also: tango.util.collection.model.Seq.Seq.removingAt + **/ + public final Seq removingAt(int index) + { + MutableSeq c = null; + // c = (cast(MutableSeq)clone()); + c = (cast(MutableSeq)duplicate()); + c.remove(index); + return c; + } + + + /** + * Implements tango.util.collection.model.Seq.Seq.replacingAt + * See_Also: tango.util.collection.model.Seq.Seq.replacingAt + **/ + public final Seq replacingAt(int index, T element) + { + MutableSeq c = null; + // c = (cast(MutableSeq)clone()); + c = (cast(MutableSeq)duplicate()); + c.replace(index, element); + return c; + } +} // version + + + /*********************************************************************** + + Implements tango.util.collection.impl.Collection.Collection.removeAll + See_Also: tango.util.collection.impl.Collection.Collection.removeAll + + Has to be here rather than in the superclass to satisfy + D interface idioms + + ************************************************************************/ + + public void removeAll (Iterator!(T) e) + { + while (e.more) + removeAll (e.get); + } + + /*********************************************************************** + + Implements tango.util.collection.impl.Collection.Collection.removeElements + See_Also: tango.util.collection.impl.Collection.Collection.removeElements + + Has to be here rather than in the superclass to satisfy + D interface idioms + + ************************************************************************/ + + public void remove (Iterator!(T) e) + { + while (e.more) + remove (e.get); + } + + /*********************************************************************** + + Implements tango.util.collection.model.Seq.opIndexAssign + See_Also: tango.util.collection.model.Seq.replaceAt + + Calls replaceAt(index, element); + + ************************************************************************/ + public final void opIndexAssign (T element, int index) + { + replaceAt(index, element); + } + + /*********************************************************************** + + Implements tango.util.collection.model.SeqView.opSlice + See_Also: tango.util.collection.model.SeqView.subset + + Calls subset(begin, (end - begin)); + + ************************************************************************/ + public SeqCollection opSlice(int begin, int end) + { + return subset(begin, (end - begin)); + } + +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/impl/SetCollection.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/impl/SetCollection.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,120 @@ +/* + File: SetCollection.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 13Oct95 dl Create + 22Oct95 dl add includeElements + 28jan97 dl make class public +*/ + + +module tango.util.collection.impl.SetCollection; + +private import tango.util.collection.model.Set, + tango.util.collection.model.Iterator; + +private import tango.util.collection.impl.Collection; + +/** + * + * SetCollection extends MutableImpl to provide + * default implementations of some Set operations. + * + author: Doug Lea + * @version 0.93 + * + *

For an introduction to this package see Overview . + * +**/ + +public abstract class SetCollection(T) : Collection!(T), Set!(T) +{ + alias Set!(T).add add; + alias Collection!(T).remove remove; + alias Collection!(T).removeAll removeAll; + + + /** + * Initialize at version 0, an empty count, and null screener + **/ + + protected this () + { + super(); + } + + /** + * Initialize at version 0, an empty count, and supplied screener + **/ + protected this (Predicate screener) + { + super(screener); + } + + /** + * Implements tango.util.collection.impl.SetCollection.SetCollection.includeElements + * See_Also: tango.util.collection.impl.SetCollection.SetCollection.includeElements + **/ + + public void add (Iterator!(T) e) + { + foreach (value; e) + add (value); + } + + + version (VERBOSE) + { + // Default implementations of Set methods + + /** + * Implements tango.util.collection.Set.including + * See_Also: tango.util.collection.Set.including + **/ + public final Set including (T element) + { + auto c = cast(MutableSet) duplicate(); + c.include(element); + return c; + } + } // version + + /*********************************************************************** + + Implements tango.util.collection.impl.Collection.Collection.removeAll + See_Also: tango.util.collection.impl.Collection.Collection.removeAll + + Has to be here rather than in the superclass to satisfy + D interface idioms + + ************************************************************************/ + + public void removeAll (Iterator!(T) e) + { + while (e.more) + removeAll (e.get); + } + + /*********************************************************************** + + Implements tango.util.collection.impl.Collection.Collection.removeElements + See_Also: tango.util.collection.impl.Collection.Collection.removeElements + + Has to be here rather than in the superclass to satisfy + D interface idioms + + ************************************************************************/ + + public void remove (Iterator!(T) e) + { + while (e.more) + remove (e.get); + } +} + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/iterator/ArrayIterator.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/iterator/ArrayIterator.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,108 @@ +/* + File: ArrayIterator.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 24Sep95 dl@cs.oswego.edu Create from tango.util.collection.d working file + 13Oct95 dl Changed protection statuses + +*/ + + +module tango.util.collection.iterator.ArrayIterator; + +private import tango.core.Exception; + +private import tango.util.collection.model.GuardIterator; + + +/** + * + * ArrayIterator allows you to use arrays as Iterators + * + author: Doug Lea + * @version 0.93 + * + *

For an introduction to this package see Overview . +**/ + +public class ArrayIterator(T) : GuardIterator!(T) +{ + private T [] arr_; + private int cur_; + private int size_; + + /** + * Build an enumeration that returns successive elements of the array + **/ + public this (T arr[]) + { + // arr_ = arr; cur_ = 0; size_ = arr._length; + arr_ = arr; + cur_ = -1; + size_ = arr.length; + } + + /** + * Implements tango.util.collection.impl.Collection.CollectionIterator.remaining + * See_Also: tango.util.collection.impl.Collection.CollectionIterator.remaining + **/ + public uint remaining() + { + return size_; + } + + /** + * Implements java.util.Iterator.more. + * See_Also: java.util.Iterator.more + **/ + public bool more() + { + return size_ > 0; + } + + /** + * Implements tango.util.collection.impl.Collection.CollectionIterator.corrupted. + * Always false. Inconsistency cannot be reliably detected for arrays + * Returns: false + * See_Also: tango.util.collection.impl.Collection.CollectionIterator.corrupted + **/ + + public bool corrupted() + { + return false; + } + + /** + * Implements java.util.Iterator.get(). + * See_Also: java.util.Iterator.get() + **/ + public T get() + { + if (size_ > 0) + { + --size_; + ++cur_; + return arr_[cur_]; + } + throw new NoSuchElementException ("Exhausted Iterator"); + } + + + int opApply (int delegate (inout T value) dg) + { + int result; + + for (auto i=size_; i--;) + { + auto value = get(); + if ((result = dg(value)) != 0) + break; + } + return result; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/iterator/FilteringIterator.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/iterator/FilteringIterator.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,179 @@ +/* + File: FilteringIterator.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 22Oct95 dl@cs.oswego.edu Created. + +*/ + + +module tango.util.collection.iterator.FilteringIterator; + +private import tango.core.Exception; + +private import tango.util.collection.model.Iterator; + +/** + * + * FilteringIterators allow you to filter out elements from + * other enumerations before they are seen by their `consumers' + * (i.e., the callers of `get'). + * + * FilteringIterators work as wrappers around other Iterators. + * To build one, you need an existing Iterator (perhaps one + * from coll.elements(), for some Collection coll), and a Predicate + * object (i.e., implementing interface Predicate). + * For example, if you want to screen out everything but Panel + * objects from a collection coll that might hold things other than Panels, + * write something of the form: + * --- + * Iterator e = coll.elements(); + * Iterator panels = FilteringIterator(e, IsPanel); + * while (panels.more()) + * doSomethingWith(cast(Panel)(panels.get())); + * --- + * To use this, you will also need to write a little class of the form: + * --- + * class IsPanel : Predicate { + * bool predicate(Object v) { return ( 0 !is cast(Panel)v; } + * } + * --- + * See_Also: tango.util.collection.Predicate.predicate + * author: Doug Lea + * +**/ + +public class FilteringIterator(T) : Iterator!(T) +{ + alias bool delegate(T) Predicate; + + // instance variables + + /** + * The enumeration we are wrapping + **/ + + private Iterator!(T) src_; + + /** + * The screening predicate + **/ + + private Predicate pred_; + + /** + * The sense of the predicate. False means to invert + **/ + + private bool sign_; + + /** + * The next element to hand out + **/ + + private T get_; + + /** + * True if we have a next element + **/ + + private bool haveNext_; + + /** + * Make a Filter using src for the elements, and p as the screener, + * selecting only those elements of src for which p is true + **/ + + public this (Iterator!(T) src, Predicate p) + { + this(src, p, true); + } + + /** + * Make a Filter using src for the elements, and p as the screener, + * selecting only those elements of src for which p.predicate(v) == sense. + * A value of true for sense selects only values for which p.predicate + * is true. A value of false selects only those for which it is false. + **/ + public this (Iterator!(T) src, Predicate p, bool sense) + { + src_ = src; + pred_ = p; + sign_ = sense; + findNext(); + } + + /** + * Implements java.util.Iterator.more + **/ + + public final bool more() + { + return haveNext_; + } + + /** + * Implements java.util.Iterator.get. + **/ + public final T get() + { + if (! haveNext_) + throw new NoSuchElementException("exhausted enumeration"); + else + { + auto result = get_; + findNext(); + return result; + } + } + + + int opApply (int delegate (inout T value) dg) + { + int result; + + while (haveNext_) + { + auto value = get(); + if ((result = dg(value)) != 0) + break; + } + return result; + } + + + /** + * Traverse through src_ elements finding one passing predicate + **/ + private final void findNext() + { + haveNext_ = false; + + for (;;) + { + if (! src_.more()) + return ; + else + { + try { + auto v = src_.get(); + if (pred_(v) is sign_) + { + haveNext_ = true; + get_ = v; + return; + } + } catch (NoSuchElementException ex) + { + return; + } + } + } + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/iterator/InterleavingIterator.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/iterator/InterleavingIterator.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,164 @@ +/* + File: InterleavingIterator.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 22Oct95 dl@cs.oswego.edu Created. + +*/ + + +module tango.util.collection.iterator.InterleavingIterator; + +private import tango.core.Exception; + +private import tango.util.collection.model.Iterator; + +/** + * + * InterleavingIterators allow you to combine the elements + * of two different enumerations as if they were one enumeration + * before they are seen by their `consumers'. + * This sometimes allows you to avoid having to use a + * Collection object to temporarily combine two sets of Collection elements() + * that need to be collected together for common processing. + *

+ * The elements are revealed (via get()) in a purely + * interleaved fashion, alternating between the first and second + * enumerations unless one of them has been exhausted, in which case + * all remaining elements of the other are revealed until it too is + * exhausted. + *

+ * InterleavingIterators work as wrappers around other Iterators. + * To build one, you need two existing Iterators. + * For example, if you want to process together the elements of + * two Collections a and b, you could write something of the form: + *

+ * Iterator items = InterleavingIterator(a.elements(), b.elements());
+ * while (items.more()) 
+ *  doSomethingWith(items.get());
+ * 
+ * + author: Doug Lea + * @version 0.93 + * + *

For an introduction to this package see Overview . + * +**/ + + +public class InterleavingIterator(T) : Iterator!(T) +{ + + /** + * The first source; nulled out once it is exhausted + **/ + + private Iterator!(T) fst_; + + /** + * The second source; nulled out once it is exhausted + **/ + + private Iterator!(T) snd_; + + /** + * The source currently being used + **/ + + private Iterator!(T) current_; + + + + /** + * Make an enumeration interleaving elements from fst and snd + **/ + + public this (Iterator!(T) fst, Iterator!(T) snd) + { + fst_ = fst; + snd_ = snd; + current_ = snd_; // flip will reset to fst (if it can) + flip(); + } + + /** + * Implements java.util.Iterator.more + **/ + public final bool more() + { + return current_ !is null; + } + + /** + * Implements java.util.Iterator.get. + **/ + public final T get() + { + if (current_ is null) + throw new NoSuchElementException("exhausted iterator"); + else + { + // following line may also throw ex, but there's nothing + // reasonable to do except propagate + auto result = current_.get(); + flip(); + return result; + } + } + + + int opApply (int delegate (inout T value) dg) + { + int result; + + while (current_) + { + auto value = get(); + if ((result = dg(value)) != 0) + break; + } + return result; + } + + /** + * Alternate sources + **/ + + private final void flip() + { + if (current_ is fst_) + { + if (snd_ !is null && !snd_.more()) + snd_ = null; + if (snd_ !is null) + current_ = snd_; + else + { + if (fst_ !is null && !fst_.more()) + fst_ = null; + current_ = fst_; + } + } + else + { + if (fst_ !is null && !fst_.more()) + fst_ = null; + if (fst_ !is null) + current_ = fst_; + else + { + if (snd_ !is null && !snd_.more()) + snd_ = null; + current_ = snd_; + } + } + } + + +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/model/Bag.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/model/Bag.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,37 @@ +/* + File: Bag.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 24Sep95 dl@cs.oswego.edu Create from collections.d working file + +*/ + + +module tango.util.collection.model.Bag; + +private import tango.util.collection.model.BagView, + tango.util.collection.model.Iterator, + tango.util.collection.model.Dispenser; + +/** + * Bags are collections supporting multiple occurrences of elements. + * author: Doug Lea +**/ + +public interface Bag(V) : BagView!(V), Dispenser!(V) +{ + public alias add opCatAssign; + + void add (V); + + void addIf (V); + + void add (Iterator!(V)); +} + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/model/BagView.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/model/BagView.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,66 @@ +/* + File: BagView.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 24Sep95 dl@cs.oswego.edu Create from collections.d working file + +*/ + + +module tango.util.collection.model.BagView; + +private import tango.util.collection.model.View; + + +/** + * + * Bags are collections supporting multiple occurrences of elements. + * + author: Doug Lea + * @version 0.93 + * + *

For an introduction to this package see Overview . + * +**/ + +public interface BagView(V) : View!(V) +{ +version (VERBOSE) +{ + public alias adding opCat; + + /** + * Construct a new Bag that is a clone of self except + * that it includes indicated element. This can be used + * to create a series of Bag, each differing from the + * other only in that they contain additional elements. + * + * @param the element to add to the new Bag + * Returns: the new Bag c, with the matches as this except that + * c.occurrencesOf(element) == occurrencesOf(element)+1 + * Throws: IllegalElementException if !canInclude(element) + **/ + + public Bag adding(V element); + + /** + * Construct a new Collection that is a clone of self except + * that it adds the indicated element if not already present. This can be used + * to create a series of collections, each differing from the + * other only in that they contain additional elements. + * + * @param element the element to include in the new collection + * Returns: a new collection c, with the matches as this, except that + * c.occurrencesOf(element) = min(1, occurrencesOfElement) + * Throws: IllegalElementException if !canInclude(element) + **/ + + public Bag addingIfAbsent(V element); +} // version + +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/model/Comparator.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/model/Comparator.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,40 @@ +/* + File: Comparator.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 24Sep95 dl@cs.oswego.edu Create from collections.d working file + +*/ + + +module tango.util.collection.model.Comparator; + + +/** + * + * Comparator is an interface for any class possessing an element + * comparison method. + * + author: Doug Lea + * @version 0.93 + * + *

For an introduction to this package see Overview . + * +**/ + +public interface Comparator(T) +{ + /** + * @param fst first argument + * @param snd second argument + * Returns: a negative number if fst is less than snd; a + * positive number if fst is greater than snd; else 0 + **/ + public int compare(T fst, T snd); +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/model/Dispenser.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/model/Dispenser.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,163 @@ +/* + File: Dispenser.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 24Sep95 dl@cs.oswego.edu Create from collections.d working file + +*/ + + +module tango.util.collection.model.Dispenser; + +private import tango.util.collection.model.View, + tango.util.collection.model.Iterator; + +/** + * + * Dispenser is the root interface of all mutable collections; i.e., + * collections that may have elements dynamically added, removed, + * and/or replaced in accord with their collection semantics. + * + * author: Doug Lea + * + *

For an introduction to this package see Overview . +**/ + +public interface Dispenser(T) : View!(T) +{ + /** + * Cause the collection to become empty. + * Returns: condition: + *

+         * isEmpty() &&
+         * Version change iff !PREV(this).isEmpty();
+         * 
+ **/ + + public void clear (); + + /** + * Replace an occurrence of oldElement with newElement. + * No effect if does not hold oldElement or if oldElement.equals(newElement). + * The operation has a consistent, but slightly special interpretation + * when applied to Sets. For Sets, because elements occur at + * most once, if newElement is already included, replacing oldElement with + * with newElement has the same effect as just removing oldElement. + * Returns: condition: + *
+         * let int delta = oldElement.equals(newElement)? 0 : 
+         *               max(1, PREV(this).instances(oldElement) in
+         *  instances(oldElement) == PREV(this).instances(oldElement) - delta &&
+         *  instances(newElement) ==  (this instanceof Set) ? 
+         *         max(1, PREV(this).instances(oldElement) + delta):
+         *                PREV(this).instances(oldElement) + delta) &&
+         *  no other element changes &&
+         *  Version change iff delta != 0
+         * 
+ * Throws: IllegalElementException if has(oldElement) and !allows(newElement) + **/ + + public void replace (T oldElement, T newElement); + + /** + * Replace all occurrences of oldElement with newElement. + * No effect if does not hold oldElement or if oldElement.equals(newElement). + * The operation has a consistent, but slightly special interpretation + * when applied to Sets. For Sets, because elements occur at + * most once, if newElement is already included, replacing oldElement with + * with newElement has the same effect as just removing oldElement. + * Returns: condition: + *
+         * let int delta = oldElement.equals(newElement)? 0 : 
+                           PREV(this).instances(oldElement) in
+         *  instances(oldElement) == PREV(this).instances(oldElement) - delta &&
+         *  instances(newElement) ==  (this instanceof Set) ? 
+         *         max(1, PREV(this).instances(oldElement) + delta):
+         *                PREV(this).instances(oldElement) + delta) &&
+         *  no other element changes &&
+         *  Version change iff delta != 0
+         * 
+ * Throws: IllegalElementException if has(oldElement) and !allows(newElement) + **/ + + public void replaceAll(T oldElement, T newElement); + + /** + * Remove and return an element. Implementations + * may strengthen the guarantee about the nature of this element. + * but in general it is the most convenient or efficient element to remove. + *

+ * Example usage. One way to transfer all elements from + * Dispenser a to MutableBag b is: + *

+         * while (!a.empty()) b.add(a.take());
+         * 
+ * Returns: an element v such that PREV(this).has(v) + * and the postconditions of removeOneOf(v) hold. + * Throws: NoSuchElementException iff isEmpty. + **/ + + public T take (); + + + /** + * Exclude all occurrences of each element of the Iterator. + * Behaviorally equivalent to + *
+         * while (e.more()) removeAll(e.value());
+         * @param e the enumeration of elements to exclude.
+         * Throws: CorruptedIteratorException is propagated if thrown
+        **/
+
+        public void removeAll (Iterator!(T) e);
+
+        /**
+         * Remove an occurrence of each element of the Iterator.
+         * Behaviorally equivalent to
+         * 
+         * while (e.more()) remove (e.value());
+         * @param e the enumeration of elements to remove.
+         * Throws: CorruptedIteratorException is propagated if thrown
+        **/
+
+        public void remove (Iterator!(T) e);
+
+        /**
+         * Exclude all occurrences of the indicated element from the collection. 
+         * No effect if element not present.
+         * @param element the element to exclude.
+         * Returns: condition: 
+         * 
+         * !has(element) &&
+         * size() == PREV(this).size() - PREV(this).instances(element) &&
+         * no other element changes &&
+         * Version change iff PREV(this).has(element)
+         * 
+ **/ + + public void removeAll (T element); + + + /** + * Remove an instance of the indicated element from the collection. + * No effect if !has(element) + * @param element the element to remove + * Returns: condition: + *
+         * let occ = max(1, instances(element)) in
+         *  size() == PREV(this).size() - occ &&
+         *  instances(element) == PREV(this).instances(element) - occ &&
+         *  no other element changes &&
+         *  version change iff occ == 1
+         * 
+ **/ + + public void remove (T element); +} + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/model/GuardIterator.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/model/GuardIterator.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,78 @@ +/* + File: GuardIterator.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 24Sep95 dl@cs.oswego.edu Create from collections.d working file + +*/ + + +module tango.util.collection.model.GuardIterator; + +private import tango.util.collection.model.Iterator; + +/** + * + * CollectionIterator extends the standard java.util.Iterator + * interface with two additional methods. + * + author: Doug Lea + * @version 0.93 + * + *

For an introduction to this package see Overview . + * +**/ + +public interface GuardIterator(V) : Iterator!(V) +{ + /** + * Return true if the collection that constructed this enumeration + * has been detectably modified since construction of this enumeration. + * Ability and precision of detection of this condition can vary + * across collection class implementations. + * more() is false whenever corrupted is true. + * + * Returns: true if detectably corrupted. + **/ + + public bool corrupted(); + + /** + * Return the number of elements in the enumeration that have + * not yet been traversed. When corrupted() is true, this + * number may (or may not) be greater than zero even if more() + * is false. Exception recovery mechanics may be able to + * use this as an indication that recovery of some sort is + * warranted. However, it is not necessarily a foolproof indication. + *

+ * You can also use it to pack enumerations into arrays. For example: + *

+         * Object arr[] = new Object[e.numberOfRemainingElement()]
+         * int i = 0;
+         * while (e.more()) arr[i++] = e.value();
+         * 
+ *

+ * For the converse case, + * See_Also: tango.util.collection.iterator.ArrayIterator.ArrayIterator + * Returns: the number of untraversed elements + **/ + + public uint remaining(); +} + + +public interface PairIterator(K, V) : GuardIterator!(V) +{ + alias GuardIterator!(V).get get; + alias GuardIterator!(V).opApply opApply; + + public V get (inout K key); + + int opApply (int delegate (inout K key, inout V value) dg); +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/model/HashParams.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/model/HashParams.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,80 @@ +/* + File: HashParams.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 24Sep95 dl@cs.oswego.edu Create from collections.d working file + +*/ + + +module tango.util.collection.model.HashParams; + + +/** + * + * Base interface for hash table based collections. + * Provides common ways of dealing with buckets and threshholds. + * (It would be nice to share some of the code too, but this + * would require multiple inheritance here.) + * + author: Doug Lea + * @version 0.93 + * + *

For an introduction to this package see Overview . + * +**/ + + +public interface HashParams +{ + + /** + * The default initial number of buckets of a non-empty HT + **/ + + public static int defaultInitialBuckets = 31; + + /** + * The default load factor for a non-empty HT. When the proportion + * of elements per buckets exceeds this, the table is resized. + **/ + + public static float defaultLoadFactor = 0.75f; + + /** + * return the current number of hash table buckets + **/ + + public int buckets(); + + /** + * Set the desired number of buckets in the hash table. + * Any value greater than or equal to one is OK. + * if different than current buckets, causes a version change + * Throws: IllegalArgumentException if newCap less than 1 + **/ + + public void buckets(int newCap); + + + /** + * Return the current load factor threshold + * The Hash table occasionally checka against the load factor + * resizes itself if it has gone past it. + **/ + + public float thresholdLoadFactor(); + + /** + * Set the current desired load factor. Any value greater than 0 is OK. + * The current load is checked against it, possibly causing resize. + * Throws: IllegalArgumentException if desired is 0 or less + **/ + + public void thresholdLoadFactor(float desired); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/model/Iterator.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/model/Iterator.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,29 @@ +/* + File: Iterator.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 24Sep95 dl@cs.oswego.edu Create from collections.d working file + +*/ + + +module tango.util.collection.model.Iterator; + + +/** + * + **/ + +public interface Iterator(V) +{ + public bool more(); + + public V get(); + + int opApply (int delegate (inout V value) dg); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/model/Map.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/model/Map.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,106 @@ +/* + File: Map.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 24Sep95 dl@cs.oswego.edu Create from collections.d working file + +*/ + + +module tango.util.collection.model.Map; + +private import tango.util.collection.model.MapView, + tango.util.collection.model.Dispenser; + + +/** + * + * + * MutableMap supports standard update operations on maps. + * + * + author: Doug Lea + * @version 0.93 + * + *

For an introduction to this package see Overview . +**/ + + +public interface Map(K, T) : MapView!(K, T), Dispenser!(T) +{ + /** + * Include the indicated pair in the Map + * If a different pair + * with the same key was previously held, it is replaced by the + * new pair. + * + * @param key the key for element to include + * @param element the element to include + * Returns: condition: + *

+         * has(key, element) &&
+         * no spurious effects &&
+         * Version change iff !PREV(this).contains(key, element))
+         * 
+ **/ + + public void add (K key, T element); + + /** + * Include the indicated pair in the Map + * If a different pair + * with the same key was previously held, it is replaced by the + * new pair. + * + * @param element the element to include + * @param key the key for element to include + * Returns: condition: + *
+         * has(key, element) &&
+         * no spurious effects &&
+         * Version change iff !PREV(this).contains(key, element))
+         * 
+ **/ + + public void opIndexAssign (T element, K key); + + + /** + * Remove the pair with the given key + * @param key the key + * Returns: condition: + *
+         * !containsKey(key)
+         * foreach (k in keys()) at(k).equals(PREV(this).at(k)) &&
+         * foreach (k in PREV(this).keys()) (!k.equals(key)) --> at(k).equals(PREV(this).at(k)) 
+         * (version() != PREV(this).version()) == 
+         * containsKey(key) !=  PREV(this).containsKey(key))
+         * 
+ **/ + + public void removeKey (K key); + + + /** + * Replace old pair with new pair with same key. + * No effect if pair not held. (This has the case of + * having no effect if the key exists but is bound to a different value.) + * @param key the key for the pair to remove + * @param oldElement the existing element + * @param newElement the value to replace it with + * Returns: condition: + *
+         * !contains(key, oldElement) || contains(key, newElement);
+         * no spurious effects &&
+         * Version change iff PREV(this).contains(key, oldElement))
+         * 
+ **/ + + public void replacePair (K key, T oldElement, T newElement); +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/model/MapView.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/model/MapView.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,112 @@ +/* + File: MapView.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 24Sep95 dl@cs.oswego.edu Create from collections.d working file + +*/ + + +module tango.util.collection.model.MapView; + +private import tango.util.collection.model.View, + tango.util.collection.model.GuardIterator; + + +/** + * + * Maps maintain keyed elements. Any kind of Object + * may serve as a key for an element. + * + * + author: Doug Lea + * @version 0.93 + * + *

For an introduction to this package see Overview . +**/ + + +public interface MapView(K, V) : View!(V) +{ + /** + * Report whether the MapT COULD include k as a key + * Always returns false if k is null + **/ + + public bool allowsKey(K key); + + /** + * Report whether there exists any element with Key key. + * Returns: true if there is such an element + **/ + + public bool containsKey(K key); + + /** + * Report whether there exists a (key, value) pair + * Returns: true if there is such an element + **/ + + public bool containsPair(K key, V value); + + + /** + * Return an enumeration that may be used to traverse through + * the keys (not elements) of the collection. The corresponding + * elements can be looked at by using at(k) for each key k. For example: + *

+         * Iterator keys = amap.keys();
+         * while (keys.more()) {
+         *   K key = keys.get();
+         *   T value = amap.get(key)
+         * // ...
+         * }
+         * 
+ * Returns: the enumeration + **/ + + public PairIterator!(K, V) keys(); + + /** + traverse the collection content. This is cheaper than using an + iterator since there is no creation cost involved. + **/ + + int opApply (int delegate (inout K key, inout V value) dg); + + /** + * Return the element associated with Key key. + * @param key a key + * Returns: element such that contains(key, element) + * Throws: NoSuchElementException if !containsKey(key) + **/ + + public V get(K key); + public alias get opIndex; + + /** + * Return the element associated with Key key. + * @param key a key + * Returns: whether the key is contained or not + **/ + + public bool get(K key, inout V element); + + + /** + * Return a key associated with element. There may be any + * number of keys associated with any element, but this returns only + * one of them (any arbitrary one), or false if no such key exists. + * @param key, a place to return a located key + * @param element, a value to try to find a key for. + * Returns: true where value is found; false otherwise + **/ + + public bool keyOf(inout K key, V value); +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/model/Seq.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/model/Seq.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,228 @@ +/* + File: Seq.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 24Sep95 dl@cs.oswego.edu Create from collections.d working file + +*/ + + +module tango.util.collection.model.Seq; + +private import tango.util.collection.model.SeqView, + tango.util.collection.model.Iterator, + tango.util.collection.model.Dispenser; + +/** + * + * Seqs are Seqs possessing standard modification methods + * + * + author: Doug Lea + * @version 0.93 + * + *

For an introduction to this package see Overview . +**/ + + +public interface Seq(T) : SeqView!(T), Dispenser!(T) +{ + /** + * Insert all elements of enumeration e at a given index, preserving + * their order. The index can range from + * 0..size() (i.e., one past the current last index). If the index is + * equal to size(), the elements are appended. + * + * @param index the index to start adding at + * @param e the elements to add + * Returns: condition: + *

+         * foreach (int i in 0 .. index-1) at(i).equals(PREV(this)at(i)); &&
+         * All existing elements at indices at or greater than index have their
+         *  indices incremented by the number of elements 
+         *  traversable via e.get() &&
+         * The new elements are at indices index + their order in
+         *   the enumeration's get traversal.
+         * !(e.more()) &&
+         * (version() != PREV(this).version()) == PREV(e).more() 
+         * 
+ * Throws: IllegalElementException if !canInclude some element of e; + * this may or may not nullify the effect of insertions of other elements. + * Throws: NoSuchElementException if index is not in range 0..size() + * Throws: CorruptedIteratorException is propagated if raised; this + * may or may not nullify the effects of insertions of other elements. + **/ + + public void addAt (int index, Iterator!(T) e); + + + /** + * Insert element at indicated index. The index can range from + * 0..size() (i.e., one past the current last index). If the index is + * equal to size(), the element is appended as the new last element. + * @param index the index to add at + * @param element the element to add + * Returns: condition: + *
+         * size() == PREV(this).size()+1 &&
+         * at(index).equals(element) &&
+         * foreach (int i in 0 .. index-1)      get(i).equals(PREV(this).get(i))
+         * foreach (int i in index+1..size()-1) get(i).equals(PREV(this).get(i-1))
+         * Version change: always
+         * 
+ * Throws: NoSuchElementException if index is not in range 0..size() + * Throws: IllegalElementException if !canInclude(element) + **/ + + public void addAt (int index, T element); + + /** + * replace element at indicated index with new value + * @param index the index at which to replace value + * @param element the new value + * Returns: condition: + *
+         * size() == PREV(this).size() &&
+         * at(index).equals(element) &&
+         * no spurious effects
+         * Version change <-- !element.equals(PREV(this).get(index)
+         *                    (but MAY change even if equal).
+         * 
+ * Throws: NoSuchElementException if index is not in range 0..size()-1 + * Throws: IllegalElementException if !canInclude(element) + **/ + + public void replaceAt (int index, T element); + + /** + * replace element at indicated index with new value + * @param element the new value + * @param index the index at which to replace value + * Returns: condition: + *
+         * size() == PREV(this).size() &&
+         * at(index).equals(element) &&
+         * no spurious effects
+         * Version change <-- !element.equals(PREV(this).get(index)
+         *                    (but MAY change even if equal).
+         * 
+ * Throws: NoSuchElementException if index is not in range 0..size()-1 + * Throws: IllegalElementException if !canInclude(element) + **/ + public void opIndexAssign (T element, int index); + + + /** + * Remove element at indicated index. All elements to the right + * have their indices decremented by one. + * @param index the index of the element to remove + * Returns: condition: + *
+         * size() = PREV(this).size()-1 &&
+         * foreach (int i in 0..index-1)      get(i).equals(PREV(this).get(i)); &&
+         * foreach (int i in index..size()-1) get(i).equals(PREV(this).get(i+1));
+         * Version change: always
+         * 
+ * Throws: NoSuchElementException if index is not in range 0..size()-1 + **/ + public void removeAt (int index); + + + /** + * Insert element at front of the sequence. + * Behaviorally equivalent to insert(0, element) + * @param element the element to add + * Throws: IllegalElementException if !canInclude(element) + **/ + + public void prepend(T element); + + + /** + * replace element at front of the sequence with new value. + * Behaviorally equivalent to replace(0, element); + **/ + public void replaceHead(T element); + + /** + * Remove the leftmost element. + * Behaviorally equivalent to remove(0); + **/ + + public void removeHead(); + + + /** + * insert element at end of the sequence + * Behaviorally equivalent to insert(size(), element) + * @param element the element to add + * Throws: IllegalElementException if !canInclude(element) + **/ + + public void append(T element); + public alias append opCatAssign; + + /** + * replace element at end of the sequence with new value + * Behaviorally equivalent to replace(size()-1, element); + **/ + + public void replaceTail(T element); + + + + /** + * Remove the rightmost element. + * Behaviorally equivalent to remove(size()-1); + * Throws: NoSuchElementException if isEmpty + **/ + public void removeTail(); + + + /** + * Remove the elements from fromIndex to toIndex, inclusive. + * No effect if fromIndex > toIndex. + * Behaviorally equivalent to + *
+         * for (int i = fromIndex; i <= toIndex; ++i) remove(fromIndex);
+         * 
+ * @param index the index of the first element to remove + * @param index the index of the last element to remove + * Returns: condition: + *
+         * let n = max(0, toIndex - fromIndex + 1 in
+         *  size() == PREV(this).size() - 1 &&
+         *  for (int i in 0 .. fromIndex - 1)     get(i).equals(PREV(this).get(i)) && 
+         *  for (int i in fromIndex .. size()- 1) get(i).equals(PREV(this).get(i+n) 
+         *  Version change iff n > 0 
+         * 
+ * Throws: NoSuchElementException if fromIndex or toIndex is not in + * range 0..size()-1 + **/ + + public void removeRange(int fromIndex, int toIndex); + + + /** + * Prepend all elements of enumeration e, preserving their order. + * Behaviorally equivalent to addElementsAt(0, e) + * @param e the elements to add + **/ + + public void prepend(Iterator!(T) e); + + + /** + * Append all elements of enumeration e, preserving their order. + * Behaviorally equivalent to addElementsAt(size(), e) + * @param e the elements to add + **/ + public void append(Iterator!(T) e); +} + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/model/SeqView.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/model/SeqView.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,194 @@ +/* + File: SeqView.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 24Sep95 dl@cs.oswego.edu Create from collections.d working file + +*/ + + +module tango.util.collection.model.SeqView; + +private import tango.util.collection.model.View; + + +/** + * + * + * Seqs are indexed, sequentially ordered collections. + * Indices are always in the range 0 .. size() -1. All accesses by index + * are checked, raising exceptions if the index falls out of range. + *

+ * The elements() enumeration for all seqs is guaranteed to be + * traversed (via nextElement) in sequential order. + * + author: Doug Lea + * @version 0.93 + * + *

For an introduction to this package see Overview . +**/ + +public interface SeqView(T) : View!(T) +{ + /** + * Return the element at the indicated index + * @param index + * Returns: the element at the index + * Throws: NoSuchElementException if index is not in range 0..size()-1 + **/ + + public T get(int index); + public alias get opIndex; + + + /** + * Return the first element, if it exists. + * Behaviorally equivalent to at(0) + * Throws: NoSuchElementException if isEmpty + **/ + + public T head(); + + + /** + * Return the last element, if it exists. + * Behaviorally equivalent to at(size()-1) + * Throws: NoSuchElementException if isEmpty + **/ + + public T tail(); + + + /** + * Report the index of leftmost occurrence of an element from a + * given starting point, or -1 if there is no such index. + * @param element the element to look for + * @param startingIndex the index to start looking from. The startingIndex + * need not be a valid index. If less than zero it is treated as 0. + * If greater than or equal to size(), the result will always be -1. + * Returns: index such that + *

 
+         * let int si = max(0, startingIndex) in
+         *  index == -1 &&
+         *   foreach (int i in si .. size()-1) !at(index).equals(element)
+         *  ||
+         *  at(index).equals(element) &&
+         *   foreach (int i in si .. index-1) !at(index).equals(element)
+         * 
+ **/ + + public int first(T element, int startingIndex = 0); + + /** + * Report the index of righttmost occurrence of an element from a + * given starting point, or -1 if there is no such index. + * @param element the element to look for + * @param startingIndex the index to start looking from. The startingIndex + * need not be a valid index. If less than zero the result + * will always be -1. + * If greater than or equal to size(), it is treated as size()-1. + * Returns: index such that + *
 
+         * let int si = min(size()-1, startingIndex) in
+         *  index == -1 &&
+         *   foreach (int i in 0 .. si) !at(index).equals(element)
+         *  ||
+         *  at(index).equals(element) &&
+         *   foreach (int i in index+1 .. si) !at(index).equals(element)
+         * 
+ * + **/ + public int last(T element, int startingIndex = 0); + + + /** + * Construct a new SeqView that is a clone of self except + * that it does not contain the elements before index or + * after index+length. If length is less than or equal to zero, + * return an empty SeqView. + * @param index of the element that will be the 0th index in new SeqView + * @param length the number of elements in the new SeqView + * Returns: new seq such that + *
+         * s.size() == max(0, length) &&
+         * foreach (int i in 0 .. s.size()-1) s.at(i).equals(at(i+index)); 
+         * 
+ * Throws: NoSuchElementException if index is not in range 0..size()-1 + **/ + public SeqView subset(int index, int length); + + /** + * Construct a new SeqView that is a clone of self except + * that it does not contain the elements before begin or + * after end-1. If length is less than or equal to zero, + * return an empty SeqView. + * @param index of the element that will be the 0th index in new SeqView + * @param index of the last element in the SeqView plus 1 + * Returns: new seq such that + *
+         * s.size() == max(0, length) &&
+         * foreach (int i in 0 .. s.size()-1) s.at(i).equals(at(i+index)); 
+         * 
+ * Throws: NoSuchElementException if index is not in range 0..size()-1 + **/ + public SeqView opSlice(int begin, int end); + + +version (VERBOSE) +{ + /** + * Construct a new SeqView that is a clone of self except + * that it adds (inserts) the indicated element at the + * indicated index. + * @param index the index at which the new element will be placed + * @param element The element to insert in the new collection + * Returns: new seq s, such that + *
+         *  s.at(index) == element &&
+         *  foreach (int i in 1 .. s.size()-1) s.at(i).equals(at(i-1));
+         * 
+ * Throws: NoSuchElementException if index is not in range 0..size()-1 + **/ + + public SeqView insertingAt(int index, T element); + + + /** + * Construct a new SeqView that is a clone of self except + * that the indicated element is placed at the indicated index. + * @param index the index at which to replace the element + * @param element The new value of at(index) + * Returns: new seq, s, such that + *
+         *  s.at(index) == element &&
+         *  foreach (int i in 0 .. s.size()-1) 
+         *     (i != index) --> s.at(i).equals(at(i));
+         * 
+ * Throws: NoSuchElementException if index is not in range 0..size()-1 + **/ + + public SeqView replacingAt(int index, T element); + + + /** + * Construct a new SeqView that is a clone of self except + * that it does not contain the element at the indeicated index; all + * elements to its right are slided left by one. + * + * @param index the index at which to remove an element + * Returns: new seq such that + *
+         *  foreach (int i in 0.. index-1) s.at(i).equals(at(i)); &&
+         *  foreach (int i in index .. s.size()-1) s.at(i).equals(at(i+1));
+         * 
+ * Throws: NoSuchElementException if index is not in range 0..size()-1 + **/ + public SeqView removingAt(int index); +} // version +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/model/Set.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/model/Set.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,67 @@ +/* + File: Set.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 24Sep95 dl@cs.oswego.edu Create from collections.d working file + 22Oct95 dl add addElements + +*/ + + +module tango.util.collection.model.Set; + +private import tango.util.collection.model.SetView, + tango.util.collection.model.Iterator, + tango.util.collection.model.Dispenser; + + +/** + * + * MutableSets support an include operations to add + * an element only if it not present. + * + author: Doug Lea + * @version 0.93 + * + *

For an introduction to this package see Overview . + * +**/ + +public interface Set(T) : SetView!(T), Dispenser!(T) +{ + /** + * Include the indicated element in the collection. + * No effect if the element is already present. + * @param element the element to add + * Returns: condition: + *

+         * has(element) &&
+         * no spurious effects &&
+         * Version change iff !PREV(this).has(element)
+         * 
+ * Throws: IllegalElementException if !canInclude(element) + **/ + + public void add (T element); + + + /** + * Include all elements of the enumeration in the collection. + * Behaviorally equivalent to + *
+         * while (e.more()) include(e.get());
+         * 
+ * @param e the elements to include + * Throws: IllegalElementException if !canInclude(element) + * Throws: CorruptedIteratorException propagated if thrown + **/ + + public void add (Iterator!(T) e); + public alias add opCatAssign; +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/model/SetView.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/model/SetView.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,55 @@ +/* + File: SetView.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 24Sep95 dl@cs.oswego.edu Create from collections.d working file + +*/ + + +module tango.util.collection.model.SetView; + +private import tango.util.collection.model.View; + +/** + * Sets provide an include operations for adding + * an element only if it is not already present. + * They also add a guarantee: + * With sets, + * you can be sure that the number of occurrences of any + * element is either zero or one. + * + * + author: Doug Lea + * @version 0.93 + * + *

For an introduction to this package see Overview . + * +**/ + +public interface SetView(T) : View!(T) +{ +version (VERBOSE) +{ + /** + * Construct a new Collection that is a clone of self except + * that it has indicated element. This can be used + * to create a series of collections, each differing from the + * other only in that they contain additional elements. + * + * @param element the element to include in the new collection + * Returns: a new collection c, with the matches as this, except that + * c.has(element) + * Throws: IllegalElementException if !canInclude(element) + **/ + + public Set including (T element); + public alias including opCat; +} // version +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/model/Sortable.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/model/Sortable.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,54 @@ +/* + File: Sortable.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 24Sep95 dl@cs.oswego.edu Create from collections.d working file + +*/ + + +module tango.util.collection.model.Sortable; + +private import tango.util.collection.model.Dispenser, + tango.util.collection.model.Comparator; + + +/** + * + * + * Sortable is a mixin interface for MutableCollections + * supporting a sort method that accepts + * a user-supplied Comparator with a compare method that + * accepts any two Objects and returns -1/0/+1 depending on whether + * the first is less than, equal to, or greater than the second. + *

+ * After sorting, but in the absence of other mutative operations, + * Sortable Collections guarantee that enumerations + * appear in sorted order; that is if a and b are two elements + * obtained in succession from nextElement(), that + *

+ * comparator().compare(a, b) <= 0.
+ * 
+ * + author: Doug Lea + * @version 0.93 + * + *

For an introduction to this package see Overview . +**/ + +public interface Sortable(T) : Dispenser!(T) +{ + + /** + * Sort the current elements with respect to cmp.compare. + **/ + + public void sort(Comparator!(T) cmp); +} + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/model/SortedKeys.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/model/SortedKeys.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,49 @@ +/* + File: SortedKeys.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 24Sep95 dl@cs.oswego.edu Create from collections.d working file + +*/ + + +module tango.util.collection.model.SortedKeys; + +private import tango.util.collection.model.View, + tango.util.collection.model.Comparator; + + +/** + * + * + * KeySorted is a mixin interface for Collections that + * are always in sorted order with respect to a Comparator + * held by the Collection. + *

+ * KeySorted Collections guarantee that enumerations + * appear in sorted order; that is if a and b are two Keys + * obtained in succession from keys().nextElement(), that + *

+ * comparator().compare(a, b) <= 0.
+ * 
+ * + author: Doug Lea + * @version 0.93 + * + *

For an introduction to this package see Overview . +**/ + +public interface SortedKeys(K, V) : View!(V) +{ + + /** + * Report the Comparator used for ordering + **/ + + public Comparator!(K) comparator(); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/model/SortedValues.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/model/SortedValues.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,51 @@ +/* + File: SortedValues.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 24Sep95 dl@cs.oswego.edu Create from collections.d working file + 13Oct95 dl Changed protection statuses + +*/ + + +module tango.util.collection.model.SortedValues; + +private import tango.util.collection.model.View, + tango.util.collection.model.Comparator; + + +/** + * + * + * ElementSorted is a mixin interface for Collections that + * are always in sorted order with respect to a Comparator + * held by the Collection. + *

+ * ElementSorted Collections guarantee that enumerations + * appear in sorted order; that is if a and b are two Elements + * obtained in succession from elements().nextElement(), that + *

+ * comparator().compare(a, b) <= 0.
+ * 
+ * + author: Doug Lea + * @version 0.93 + * + *

For an introduction to this package see Overview . +**/ + +public interface SortedValues(T) : View!(T) +{ + + /** + * Report the Comparator used for ordering + **/ + + public Comparator!(T) comparator(); +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/collection/model/View.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/collection/model/View.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,221 @@ +/* + File: View.d + + Originally written by Doug Lea and released into the public domain. + Thanks for the assistance and support of Sun Microsystems Labs, Agorics + Inc, Loral, and everyone contributing, testing, and using this code. + + History: + Date Who What + 24Sep95 dl@cs.oswego.edu Create from collections.d working file + 14dec95 dl Declare as a subinterface of Cloneable + 9Apr97 dl made Serializable + +*/ + + +module tango.util.collection.model.View; + +private import tango.util.collection.model.Dispenser; +private import tango.util.collection.model.GuardIterator; + + +/** + * this is the base interface for most classes in this package. + * + * + author: Doug Lea + * @version 0.93 + * + *

For an introduction to this package see Overview . + * +**/ +public interface View(T) +{ + /** + * All Views implement duplicate + **/ + + public Dispenser!(T) duplicate (); + public alias duplicate dup; + + /** + * Report whether the View contains element. + * Behaviorally equivalent to instances(element) >= 0. + * @param element the element to look for + * Returns: true iff contains at least one member that is equal to element. + **/ + public bool contains (T element); + public alias contains opIn; + + /** + * Report the number of elements in the View. + * No other spurious effects. + * Returns: number of elements + **/ + public uint size (); + public alias size length; + + /** + * Report whether this View has no elements. + * Behaviorally equivalent to size() == 0. + * Returns: true if size() == 0 + **/ + + public bool drained (); + + + /** + * All collections maintain a `version number'. The numbering + * scheme is arbitrary, but is guaranteed to change upon every + * modification that could possibly affect an elements() enumeration traversal. + * (This is true at least within the precision of the `int' representation; + * performing more than 2^32 operations will lead to reuse of version numbers). + * Versioning + * may be conservative with respect to `replacement' operations. + * For the sake of versioning replacements may be considered as + * removals followed by additions. Thus version numbers may change + * even if the old and new elements are identical. + *

+ * All element() enumerations for Mutable Collections track version + * numbers, and raise inconsistency exceptions if the enumeration is + * used (via get()) on a version other than the one generated + * by the elements() method. + *

+ * You can use versions to check if update operations actually have any effect + * on observable state. + * For example, clear() will cause cause a version change only + * if the collection was previously non-empty. + * Returns: the version number + **/ + + public uint mutation (); + + /** + * Report whether the View COULD contain element, + * i.e., that it is valid with respect to the View's + * element screener if it has one. + * Always returns false if element == null. + * A constant function: if allows(v) is ever true it is always true. + * (This property is not in any way enforced however.) + * No other spurious effects. + * Returns: true if non-null and passes element screener check + **/ + public bool allows (T element); + + + /** + * Report the number of occurrences of element in View. + * Always returns 0 if element == null. + * Otherwise T.equals is used to test for equality. + * @param element the element to look for + * Returns: the number of occurrences (always nonnegative) + **/ + public uint instances (T element); + + /** + * Return an enumeration that may be used to traverse through + * the elements in the View. Standard usage, for some + * ViewT c, and some operation `use(T obj)': + *

+         * for (Iterator e = c.elements(); e.more(); )
+         *   use(e.value());
+         * 
+ * (The values of get very often need to + * be coerced to types that you know they are.) + *

+ * All Views return instances + * of ViewIterator, that can report the number of remaining + * elements, and also perform consistency checks so that + * for MutableViews, element enumerations may become + * invalidated if the View is modified during such a traversal + * (which could in turn cause random effects on the ViewT. + * TO prevent this, ViewIterators + * raise CorruptedIteratorException on attempts to access + * gets of altered Views.) + * Note: Since all View implementations are synchronizable, + * you may be able to guarantee that element traversals will not be + * corrupted by using the java synchronized construct + * around code blocks that do traversals. (Use with care though, + * since such constructs can cause deadlock.) + *

+ * Guarantees about the nature of the elements returned by get of the + * returned Iterator may vary accross sub-interfaces. + * In all cases, the enumerations provided by elements() are guaranteed to + * step through (via get) ALL elements in the View. + * Unless guaranteed otherwise (for example in Seq), elements() enumerations + * need not have any particular get() ordering so long as they + * allow traversal of all of the elements. So, for example, two successive + * calls to element() may produce enumerations with the same + * elements but different get() orderings. + * Again, sub-interfaces may provide stronger guarantees. In + * particular, Seqs produce enumerations with gets in + * index order, ElementSortedViews enumerations are in ascending + * sorted order, and KeySortedViews are in ascending order of keys. + * Returns: an enumeration e such that + *

+         *   e.remaining() == size() &&
+         *   foreach (v in e) has(e) 
+         * 
+ **/ + + public GuardIterator!(T) elements (); + + /** + traverse the collection content. This is cheaper than using an + iterator since there is no creation cost involved. + **/ + + public int opApply (int delegate (inout T value) dg); + + /** + expose collection content as an array + **/ + + public T[] toArray (); + + /** + * Report whether other has the same element structure as this. + * That is, whether other is of the same size, and has the same + * elements() properties. + * This is a useful version of equality testing. But is not named + * `equals' in part because it may not be the version you need. + *

+ * The easiest way to decribe this operation is just to + * explain how it is interpreted in standard sub-interfaces: + *

    + *
  • Seq and ElementSortedView: other.elements() has the + * same order as this.elements(). + *
  • Bag: other.elements has the same instances each element as this. + *
  • Set: other.elements has all elements of this + *
  • Map: other has all (key, element) pairs of this. + *
  • KeySortedView: other has all (key, element) + * pairs as this, and with keys enumerated in the same order as + * this.keys(). + *
+ * @param other, a View + * Returns: true if considered to have the same size and elements. + **/ + + public bool matches (View other); + public alias matches opEquals; + + + /** + * Check the consistency of internal state, and raise exception if + * not OK. + * These should be `best-effort' checks. You cannot always locally + * determine full consistency, but can usually approximate it, + * and validate the most important representation invariants. + * The most common kinds of checks are cache checks. For example, + * A linked list that also maintains a separate record of the + * number of items on the list should verify that the recorded + * count matches the number of elements in the list. + *

+ * This method should either return normally or throw: + * Throws: ImplementationError if check fails + **/ + + public void checkImplementation(); +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/log/Appender.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/log/Appender.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,159 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: May 2004 + + author: Kris + +*******************************************************************************/ + +module tango.util.log.Appender; + +public import tango.core.Exception; + +public import tango.util.log.Event, + tango.util.log.EventLayout; + +/******************************************************************************* + + Base class for all Appenders. These objects are responsible for + emitting messages sent to a particular logger. There may be more + than one appender attached to any logger. The actual message is + constructed by another class known as an EventLayout. + +*******************************************************************************/ + +public class Appender +{ + typedef int Mask; + + private Appender next; + private EventLayout layout; + + /*********************************************************************** + + Return the mask used to identify this Appender. The mask + is used to figure out whether an appender has already been + invoked for a particular logger. + + ***********************************************************************/ + + abstract Mask getMask (); + + /*********************************************************************** + + Return the name of this Appender. + + ***********************************************************************/ + + abstract char[] getName (); + + /*********************************************************************** + + Append a message to the output. + + ***********************************************************************/ + + abstract void append (Event event); + + /*********************************************************************** + + Create an Appender and default its layout to SimpleLayout. + + ***********************************************************************/ + + this () + { + layout = new SimpleLayout; + } + + /*********************************************************************** + + Static method to return a mask for identifying the Appender. + Each Appender class should have a unique fingerprint so that + we can figure out which ones have been invoked for a given + event. A bitmask is a simple an efficient way to do that. + + ***********************************************************************/ + + protected Mask register (char[] tag) + { + static Mask mask = 1; + static Mask[char[]] registry; + + Mask* p = tag in registry; + if (p) + return *p; + else + { + auto ret = mask; + registry [tag] = mask; + + if (mask < 0) + throw new IllegalArgumentException ("too many unique registrations"); + + mask <<= 1; + return ret; + } + } + + /*********************************************************************** + + Set the current layout to be that of the argument. + + ***********************************************************************/ + + void setLayout (EventLayout layout) + { + if (layout) + this.layout = layout; + } + + /*********************************************************************** + + Return the current Layout + + ***********************************************************************/ + + EventLayout getLayout () + { + return layout; + } + + /*********************************************************************** + + Attach another appender to this one + + ***********************************************************************/ + + void setNext (Appender next) + { + this.next = next; + } + + /*********************************************************************** + + Return the next appender in the list + + ***********************************************************************/ + + Appender getNext () + { + return next; + } + + /*********************************************************************** + + Close this appender. This would be used for file, sockets, + and such like. + + ***********************************************************************/ + + void close () + { + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/log/Configurator.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/log/Configurator.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,53 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: May 2004 + + author: Kris + +*******************************************************************************/ + +module tango.util.log.Configurator; + +private import tango.util.log.Log, + tango.util.log.EventLayout, + tango.util.log.ConsoleAppender; + +/******************************************************************************* + + Basic utility for initializing the basic behaviour of the + default logging hierarchy. + + Adds a default StdioAppender, with a SimpleTimerLayout, to + the root node, and set the activity level to be everything + enabled. + +*******************************************************************************/ + +static this() +{ + Log.getRootLogger.addAppender(new ConsoleAppender(new SimpleTimerLayout)); +} + + + +/******************************************************************************* + +*******************************************************************************/ + +public class Configurator +{ + /*********************************************************************** + + No longer required. Just import this module instead + + ***********************************************************************/ + + deprecated static void opCall () + { + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/log/ConsoleAppender.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/log/ConsoleAppender.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,83 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: May 2004 + + author: Kris + +*******************************************************************************/ + +module tango.util.log.ConsoleAppender; + +private import tango.util.log.Appender; + +private import tango.io.Console; + +/******************************************************************************* + + Append to the console. This will use either streams or tango.io + depending upon configuration + +*******************************************************************************/ + +public class ConsoleAppender : Appender +{ + private Mask mask; + + /*********************************************************************** + + Create with the given Layout + + ***********************************************************************/ + + this (EventLayout layout = null) + { + // Get a unique fingerprint for this class + mask = register (getName); + + setLayout (layout); + } + + /*********************************************************************** + + Return the fingerprint for this class + + ***********************************************************************/ + + Mask getMask () + { + return mask; + } + + /*********************************************************************** + + Return the name of this class + + ***********************************************************************/ + + char[] getName () + { + return this.classinfo.name; + } + + /*********************************************************************** + + Append an event to the output. + + ***********************************************************************/ + + void append (Event event) + { + synchronized (Cerr) + { + auto layout = getLayout; + Cerr (layout.header (event)); + Cerr (layout.content (event)); + Cerr (layout.footer (event)); + Cerr.newline; + } + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/log/DateLayout.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/log/DateLayout.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,90 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: May 2004 + + author: Kris + +*******************************************************************************/ + +module tango.util.log.DateLayout; + +private import tango.text.Util; + +private import tango.time.Clock, + tango.time.WallClock; + +private import tango.text.convert.Integer; + +private import tango.util.log.Event, + tango.util.log.EventLayout; + +/******************************************************************************* + + A layout with ISO-8601 date information prefixed to each message + +*******************************************************************************/ + +public class DateLayout : EventLayout +{ + private bool localTime; + + private static char[6] spaces = ' '; + + /*********************************************************************** + + Ctor with indicator for local vs UTC time. Default is + local time. + + ***********************************************************************/ + + this (bool localTime = true) + { + this.localTime = localTime; + } + + /*********************************************************************** + + Format message attributes into an output buffer and return + the populated portion. + + ***********************************************************************/ + + char[] header (Event event) + { + char[] level = event.getLevelName; + + // convert time to field values + auto tm = event.getTime; + auto dt = (localTime) ? WallClock.toDate(tm) : Clock.toDate(tm); + + // format date according to ISO-8601 (lightweight formatter) + char[20] tmp = void; + return layout (event.scratch.content, "%0-%1-%2 %3:%4:%5,%6 %7%8 %9 - ", + convert (tmp[0..4], dt.date.year), + convert (tmp[4..6], dt.date.month), + convert (tmp[6..8], dt.date.day), + convert (tmp[8..10], dt.time.hours), + convert (tmp[10..12], dt.time.minutes), + convert (tmp[12..14], dt.time.seconds), + convert (tmp[14..17], dt.time.millis), + spaces [0 .. $-level.length], + level, + event.getName + ); + } + + /********************************************************************** + + Convert an integer to a zero prefixed text representation + + **********************************************************************/ + + private char[] convert (char[] tmp, int i) + { + return format (tmp, cast(long) i, Style.Unsigned, Flags.Zero); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/log/Event.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/log/Event.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,336 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: May 2004 + + author: Kris + Anders F Bjorklund (Darwin patches) + +*******************************************************************************/ + +module tango.util.log.Event; + +version = UseEventFreeList; + +private import tango.time.Clock; + +private import tango.sys.Common; + +private import tango.core.Exception; + +private import tango.util.log.model.ILevel, + tango.util.log.model.IHierarchy; + + +version (Win32) +{ + extern(Windows) int QueryPerformanceCounter(ulong *count); + extern(Windows) int QueryPerformanceFrequency(ulong *frequency); +} + + +/******************************************************************************* + + Contains all information about a logging event, and is passed around + between methods once it has been determined that the invoking logger + is enabled for output. + + Note that Event instances are maintained in a freelist rather than + being allocated each time, and they include a scratchpad area for + EventLayout formatters to use. + +*******************************************************************************/ + +public class Event : ILevel +{ + // primary event attributes + private char[] msg, + name; + private Time time; + private Level level; + private IHierarchy hierarchy; + + // timestamps + private static Time beginTime; + + // scratch buffer for constructing output strings + struct Scratch + { + uint length; + char[256] content; + } + package Scratch scratch; + + + // logging-level names + package static char[][] LevelNames = + [ + "Trace ", "Info ", "Warn ", "Error ", "Fatal ", "None " + ]; + + version (Win32) + { + private static double multiplier; + private static ulong timerStart; + } + + /*********************************************************************** + + Support for free-list + + ***********************************************************************/ + + version (UseEventFreeList) + { + /*************************************************************** + + Instance variables for free-list support + + ***************************************************************/ + + private Event next; + private static Event freelist; + + /*************************************************************** + + Allocate an Event from a list rather than + creating a new one + + ***************************************************************/ + + static final synchronized Event allocate () + { + Event e; + + if (freelist) + { + e = freelist; + freelist = e.next; + } + else + e = new Event (); + return e; + } + + /*************************************************************** + + Return this Event to the free-list + + ***************************************************************/ + + static final synchronized void deallocate (Event e) + { + e.next = freelist; + freelist = e; + + version (EventReset) + e.reset; + } + } + + /*********************************************************************** + + Setup timing information for later use + + ***********************************************************************/ + + package static void initialize () + { + version (Posix) + { + beginTime = Clock.now; + } + + version (Win32) + { + ulong freq; + + if (! QueryPerformanceFrequency (&freq)) + throw new PlatformException ("high-resolution timer is not available"); + + QueryPerformanceCounter (&timerStart); + multiplier = cast(double) TimeSpan.TicksPerSecond / freq; + beginTime = Clock.now; + + } + } + + /*********************************************************************** + + Return time when the executable started + + ***********************************************************************/ + + final static Time startedAt () + { + return beginTime; + } + + /*********************************************************************** + + Return the current time + + ***********************************************************************/ + + final static Time timer () + { + version (Posix) + { + return Clock.now; + } + + version (Win32) + { + ulong now; + + QueryPerformanceCounter (&now); + return beginTime + TimeSpan(cast(long)((now - timerStart) * multiplier)); + } + } + + /*********************************************************************** + + Set the various attributes of this event. + + ***********************************************************************/ + + final void set (IHierarchy hierarchy, Level level, char[] msg, char[] name) + { + this.hierarchy = hierarchy; + this.time = timer(); + this.level = level; + this.name = name; + this.msg = msg; + } + + version (EventReset) + { + /*************************************************************** + + Reset this event + + ***************************************************************/ + + final void reset () + { + time = 0; + msg = null; + name = null; + level = Level.None; + } + } + + /*********************************************************************** + + Return the message attached to this event. + + ***********************************************************************/ + + final override char[] toString () + { + return msg; + } + + /*********************************************************************** + + Return the name of the logger which produced this event + + ***********************************************************************/ + + final char[] getName () + { + return name; + } + + /*********************************************************************** + + Return the scratch buffer for formatting. This is a thread + safe place to format data within, without allocating any + memory. + + ***********************************************************************/ + + final char[] getContent () + { + return scratch.content [0..scratch.length]; + } + + /*********************************************************************** + + Return the logger level of this event. + + ***********************************************************************/ + + final Level getLevel () + { + return level; + } + + /*********************************************************************** + + Return the logger level name of this event. + + ***********************************************************************/ + + final char[] getLevelName () + { + return LevelNames[level]; + } + + /*********************************************************************** + + Return the hierarchy where the event was produced from + + ***********************************************************************/ + + final IHierarchy getHierarchy () + { + return hierarchy; + } + + /*********************************************************************** + + Return the time this event was produced, relative to the + start of this executable + + ***********************************************************************/ + + final TimeSpan getSpan () + { + return time - beginTime; + } + + /*********************************************************************** + + Return the time this event was produced relative to Epoch + + ***********************************************************************/ + + final Time getTime () + { + return time; + } + + /*********************************************************************** + + Append some content to the scratch buffer. This is limited + to the size of said buffer, and will not expand further. + + ***********************************************************************/ + + final Event append (char[] x) + { + uint addition = x.length; + uint newLength = scratch.length + x.length; + + if (newLength < scratch.content.length) + { + scratch.content [scratch.length..newLength] = x[0..addition]; + scratch.length = newLength; + } + return this; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/log/EventLayout.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/log/EventLayout.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,154 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: May 2004 + + author: Kris + +*******************************************************************************/ + +module tango.util.log.EventLayout; + +private import tango.time.Time; + +private import tango.util.log.Event; + +/******************************************************************************* + + Base class for all logging layout instances + +*******************************************************************************/ + +public class EventLayout +{ + /*********************************************************************** + + Subclasses should implement this method to perform the + formatting of each message header + + ***********************************************************************/ + + abstract char[] header (Event event); + + /*********************************************************************** + + Subclasses should implement this method to perform the + formatting of each message footer + + ***********************************************************************/ + + char[] footer (Event event) + { + return ""; + } + + /*********************************************************************** + + Subclasses should implement this method to perform the + formatting of the actual message content. + + ***********************************************************************/ + + char[] content (Event event) + { + return event.toString; + } + + /*********************************************************************** + + Convert a time value (in milliseconds) to ascii + + ***********************************************************************/ + + final char[] toMilli (char[] s, TimeSpan time) + { + assert (s.length > 0); + long ms = time.millis; + + int len = s.length; + do { + s[--len] = ms % 10 + '0'; + ms /= 10; + } while (ms && len); + return s[len..s.length]; + } +} + + +/******************************************************************************* + + A bare layout comprised of tag and message + +*******************************************************************************/ + +public class SpartanLayout : EventLayout +{ + /*********************************************************************** + + Format outgoing message + + ***********************************************************************/ + + char[] header (Event event) + { + event.append(event.getName).append(event.getHierarchy.context.label).append(" - "); + return event.getContent; + } +} + + +/******************************************************************************* + + A simple layout comprised only of level, name, and message + +*******************************************************************************/ + +public class SimpleLayout : EventLayout +{ + /*********************************************************************** + + Format outgoing message + + ***********************************************************************/ + + char[] header (Event event) + { + event.append (event.getLevelName) + .append (event.getName) + .append(event.getHierarchy.context.label) + .append (" - "); + return event.getContent; + } +} + + +/******************************************************************************* + + A simple layout comprised only of time(ms), level, name, and message + +*******************************************************************************/ + +public class SimpleTimerLayout : EventLayout +{ + /*********************************************************************** + + Format outgoing message + + ***********************************************************************/ + + char[] header (Event event) + { + char[20] tmp; + + event.append (toMilli (tmp, event.getSpan)) + .append (" ") + .append (event.getLevelName) + .append (event.getName) + .append(event.getHierarchy.context.label) + .append (" - "); + return event.getContent; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/log/FileAppender.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/log/FileAppender.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,155 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: May 2004 + + author: Kris + +*******************************************************************************/ + +module tango.util.log.FileAppender; + +private import tango.util.log.Appender; + +private import tango.io.Buffer, + tango.io.FileConst, + tango.io.FileConduit; + +private import tango.io.model.IConduit; + +/******************************************************************************* + + Append log messages to a file. This basic version has no rollover + support, so it just keeps on adding to the file. There's also a + RollingFileAppender that may suit your needs. + +*******************************************************************************/ + +public class FileAppender : Appender +{ + private Mask mask; + private Buffer buffer; + private IConduit conduit_; + + /*********************************************************************** + + ***********************************************************************/ + + protected this () + { + } + + /*********************************************************************** + + Create a basic FileAppender to a file with the specified + path. + + ***********************************************************************/ + + this (FilePath fp, EventLayout layout = null) + { + // Get a unique fingerprint for this instance + mask = register (fp.toString); + + // make it shareable for read + auto style = FileConduit.WriteAppending; + style.share = FileConduit.Share.Read; + setConduit (new FileConduit (fp, style)); + + setLayout (layout); + } + + /*********************************************************************** + + Create a basic FileAppender to a file with the specified + path, and with the given EventLayout + + ***********************************************************************/ + + this (char[] fp, EventLayout layout = null) + { + this (new FilePath (fp), layout); + } + + /*********************************************************************** + + Return the conduit + + ***********************************************************************/ + + IConduit conduit () + { + return conduit_; + } + + /*********************************************************************** + + Set the conduit + + ***********************************************************************/ + + protected Buffer setConduit (IConduit conduit) + { + // create a new buffer upon this conduit + conduit_ = conduit; + return (buffer = new Buffer(conduit)); + } + + /*********************************************************************** + + Return the fingerprint for this class + + ***********************************************************************/ + + Mask getMask () + { + return mask; + } + + /*********************************************************************** + + Return the name of this class + + ***********************************************************************/ + + char[] getName () + { + return this.classinfo.name; + } + + /*********************************************************************** + + Append an event to the output. + + ***********************************************************************/ + + synchronized void append (Event event) + { + auto layout = getLayout; + buffer.append (layout.header (event)); + buffer.append (layout.content (event)); + buffer.append (layout.footer (event)) + .append (FileConst.NewlineString) + .flush (); + } + + /*********************************************************************** + + Close the file associated with this Appender + + ***********************************************************************/ + + synchronized void close () + { + if (conduit_) + { + conduit_.detach; + conduit_ = null; + } + } +} + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/log/Hierarchy.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/log/Hierarchy.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,721 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Oct 2004: Initial release + version: Feb 2007: Switched to lazy expr + + author: Kris + +*******************************************************************************/ + +module tango.util.log.Hierarchy; + +private import tango.time.Clock; + +private import tango.core.Exception; + +private import tango.util.log.Logger, + tango.util.log.Appender; + +private import tango.text.convert.Layout; + +private import tango.util.log.model.IHierarchy; + +/******************************************************************************* + + Pull in additional functions from the C library + +*******************************************************************************/ + +extern (C) +{ + int memcmp (void *, void *, int); +} + +/******************************************************************************* + + Hack to sidestep linux linker errors (big thanks to Keinfarbton) + +*******************************************************************************/ + +private Layout!(char) format; + +static this() +{ + .format = new Layout!(char); +} + +/******************************************************************************* + + Loggers are named entities, sometimes shared, sometimes specific to + a particular portion of code. The names are generally hierarchical in + nature, using dot notation (with '.') to separate each named section. + For example, a typical name might be something like "mail.send.writer" + --- + import tango.util.log.Log; + + auto log = Log.getLogger ("mail.send.writer"); + + log.info ("an informational message"); + log.error ("an exception message: " ~ exception.toString); + + etc ... + --- + + It is considered good form to pass a logger instance as a function or + class-ctor argument, or to assign a new logger instance during static + class construction. For example: if it were considered appropriate to + have one logger instance per class, each might be constructed like so: + --- + private Logger log; + + static this() + { + log = Log.getLogger (nameOfThisClassOrStructOrModule); + } + --- + + Messages passed to a Logger are assumed to be pre-formatted. You + may find that the format() methos is handy for collating various + components of the message: + --- + char tmp[128] = void; + ... + log.warn (log.format (tmp, "temperature is {} degrees!", 101)); + --- + + Note that a provided workspace is used to format the message, which + should generally be located on the stack so as to support multiple + threads of execution. In the example above we indicate assignment as + "tmp = void", although this is an optional attribute (see the language + manual for more information). + + To avoid overhead when constructing formatted messages, the logging + system employs lazy expressions such that the message is not constructed + unless the logger is actually active. You can also explicitly check to + see whether a logger is active or not: + --- + if (log.isEnabled (log.Level.Warn)) + log.warn (log.format (tmp, "temperature is {} degrees!", 101)); + --- + + You might optionally configure various layout & appender implementations + to support specific rendering needs. + + tango.log closely follows both the API and the behaviour as documented + at the official Log4J site, where you'll find a good tutorial. Those + pages are hosted over + here. + +*******************************************************************************/ + +private class LoggerInstance : Logger +{ + private LoggerInstance next, + parent; + + private char[] name_; + private Level level_; + private Appender appender; + private Hierarchy hierarchy; + private bool additive, + breakpoint; + + + /*********************************************************************** + + Construct a LoggerInstance with the specified name for the + given hierarchy. By default, logger instances are additive + and are set to emit all events. + + ***********************************************************************/ + + protected this (Hierarchy hierarchy, char[] name) + { + this.hierarchy = hierarchy; + this.level_ = Level.Trace; + this.additive = true; + this.name_ = name; + } + + /*********************************************************************** + + No, you should not delete or 'scope' these entites + + ***********************************************************************/ + + private ~this() + { + } + + /*********************************************************************** + + Is this logger enabed for the specified Level? + + ***********************************************************************/ + + final bool isEnabled (Level level = Level.Fatal) + { + return hierarchy.context.isEnabled (level_, level); + } + + /*********************************************************************** + + Is this a breakpoint Logger? + + ***********************************************************************/ + + final bool isBreakpoint () + { + return breakpoint; + } + + /*********************************************************************** + + Is this logger additive? That is, should we walk ancestors + looking for more appenders? + + ***********************************************************************/ + + final bool isAdditive () + { + return additive; + } + + /*********************************************************************** + + Append a trace message + + ***********************************************************************/ + + final Logger trace (lazy char[] msg) + { + return append (Level.Trace, msg); + } + + /*********************************************************************** + + Append an info message + + ***********************************************************************/ + + final Logger info (lazy char[] msg) + { + return append (Level.Info, msg); + } + + /*********************************************************************** + + Append a warning message + + ***********************************************************************/ + + final Logger warn (lazy char[] msg) + { + return append (Level.Warn, msg); + } + + /*********************************************************************** + + Append an error message + + ***********************************************************************/ + + final Logger error (lazy char[] msg) + { + return append (Level.Error, msg); + } + + /*********************************************************************** + + Append a fatal message + + ***********************************************************************/ + + final Logger fatal (lazy char[] msg) + { + return append (Level.Fatal, msg); + } + + /*********************************************************************** + + Return the name of this Logger (sans the appended dot). + + ***********************************************************************/ + + final char[] name () + { + int i = name_.length; + if (i > 0) + --i; + return name_[0 .. i]; + } + + /*********************************************************************** + + Return the Level this logger is set to + + ***********************************************************************/ + + final Level level () + { + return level_; + } + + /*********************************************************************** + + Set the current level for this logger (and only this logger). + + ***********************************************************************/ + + final Logger setLevel (Level level = Level.Trace) + { + return setLevel (level, false); + } + + /*********************************************************************** + + Set the current level for this logger, and (optionally) all + of its descendents. + + ***********************************************************************/ + + final Logger setLevel (Level level, bool propagate) + { + this.level_ = level; + hierarchy.updateLoggers (this, propagate); + return this; + } + + /*********************************************************************** + + Set the breakpoint status of this logger. + + ***********************************************************************/ + + final Logger setBreakpoint (bool enabled) + { + breakpoint = enabled; + hierarchy.updateLoggers (this, false); + return this; + } + + /*********************************************************************** + + Set the additive status of this logger. See isAdditive(). + + ***********************************************************************/ + + final Logger setAdditive (bool enabled) + { + additive = enabled; + return this; + } + + /*********************************************************************** + + Add (another) appender to this logger. Appenders are each + invoked for log events as they are produced. At most, one + instance of each appender will be invoked. + + ***********************************************************************/ + + final Logger addAppender (Appender next) + { + if (appender) + next.setNext (appender); + appender = next; + return this; + } + + /*********************************************************************** + + Remove all appenders from this Logger + + ***********************************************************************/ + + final Logger clearAppenders () + { + appender = null; + return this; + } + + + /*********************************************************************** + + Get time since this application started + + ***********************************************************************/ + + final TimeSpan runtime () + { + return Clock.now - Event.startedAt; + } + + /*********************************************************************** + + Append a message to this logger via its appender list. + + ***********************************************************************/ + + final Logger append (Level level, lazy char[] exp) + { + if (hierarchy.context.isEnabled (level_, level)) + { + auto event = Event.allocate; + scope (exit) + Event.deallocate (event); + + // set the event attributes + event.set (hierarchy, level, exp, name.length ? name_[0..$-1] : "root"); + + // combine appenders from all ancestors + auto links = this; + Appender.Mask masks = 0; + do { + auto appender = links.appender; + + // this level have an appender? + while (appender) + { + auto mask = appender.getMask; + + // have we used this appender already? + if ((masks & mask) is 0) + { + // no - append message and update mask + event.scratch.length = 0; + appender.append (event); + masks |= mask; + } + // process all appenders for this node + appender = appender.getNext; + } + // process all ancestors + } while (links.additive && ((links = links.parent) !is null)); + } + return this; + } + + /*********************************************************************** + + Format text using the formatter configured in the associated + hierarchy (see Hierarchy.setFormat) + + ***********************************************************************/ + + final char[] format (char[] buffer, char[] formatStr, ...) + { + return .format.vprint (buffer, formatStr, _arguments, _argptr); + } + + /*********************************************************************** + + See if the provided Logger is a good match as a parent of + this one. Note that each Logger name has a '.' appended to + the end, such that name segments will not partially match. + + ***********************************************************************/ + + private final bool isCloserAncestor (LoggerInstance other) + { + auto length = other.name_.length; + + // possible parent if length is shorter + if (length < name_.length) + // does the prefix match? Note we append a "." to each + if (length is 0 || + memcmp (&other.name_[0], &name_[0], length) is 0) + // is this a better (longer) match than prior parent? + if ((parent is null) || (length >= parent.name_.length)) + return true; + return false; + } +} + + +/******************************************************************************* + + The Logger hierarchy implementation. We keep a reference to each + logger in a hash-table for convenient lookup purposes, plus keep + each logger linked to the others in an ordered chain. Ordering + places shortest names at the head and longest ones at the tail, + making the job of identifying ancestors easier in an orderly + fashion. For example, when propagating levels across descendents + it would be a mistake to propagate to a child before all of its + ancestors were taken care of. + +*******************************************************************************/ + +class Hierarchy : IHierarchy, IHierarchy.Context +{ + private char[] name, + address; + private LoggerInstance root; + private LoggerInstance[char[]] loggers; + private Context context_; + + /*********************************************************************** + + Construct a hierarchy with the given name. + + ***********************************************************************/ + + this (char[] name) + { + this.name = name; + this.address = "network"; + + // insert a root node; the root has an empty name + root = new LoggerInstance (this, ""); + context = this; + } + + /********************************************************************** + + **********************************************************************/ + + final char[] label () + { + return ""; + } + + /********************************************************************** + + + **********************************************************************/ + + final bool isEnabled (ILevel.Level level, ILevel.Level test) + { + return test >= level; + } + + /********************************************************************** + + Return the name of this Hierarchy + + **********************************************************************/ + + final char[] getName () + { + return name; + } + + /********************************************************************** + + Return the address of this Hierarchy. This is typically + attached when sending events to remote monitors. + + **********************************************************************/ + + final char[] getAddress () + { + return address; + } + + /********************************************************************** + + Set the name of this Hierarchy + + **********************************************************************/ + + final void setName (char[] name) + { + this.name = name; + } + + /********************************************************************** + + Set the address of this Hierarchy. The address is attached + used when sending events to remote monitors. + + **********************************************************************/ + + final void setAddress (char[] address) + { + this.address = address; + } + + /********************************************************************** + + Set the diagnostic context. Not usually necessary, as a + default was created. Useful when you need to provide a + different implementation, such as a ThreadLocal variant. + + **********************************************************************/ + + final void context (Context context) + { + this.context_ = context; + } + + /********************************************************************** + + Return the diagnostic context. Useful for setting an + override logging level. + + **********************************************************************/ + + final Context context () + { + return context_; + } + + /*********************************************************************** + + Return the root node. + + ***********************************************************************/ + + final LoggerInstance getRootLogger () + { + return root; + } + + /*********************************************************************** + + Return the instance of a Logger with the provided label. If + the instance does not exist, it is created at this time. + + ***********************************************************************/ + + final synchronized LoggerInstance getLogger (char[] label) + { + auto name = label ~ "."; + auto l = name in loggers; + + if (l is null) + { + // create a new logger + auto li = new LoggerInstance (this, name); + l = &li; + + // insert into linked list + insertLogger (li); + + // look for and adjust children + updateLoggers (li, true); + + // insert into map + loggers [name] = li; + } + + return *l; + } + + /********************************************************************** + + Iterate over all Loggers in list + + **********************************************************************/ + + final int opApply (int delegate(inout Logger) dg) + { + int result = 0; + LoggerInstance curr = root; + + while (curr) + { + // BUG: this uncovers a cast() issue in the 'inout' delegation + Logger logger = curr; + if ((result = dg (logger)) != 0) + break; + curr = curr.next; + } + return result; + } + + /*********************************************************************** + + Loggers are maintained in a sorted linked-list. The order + is maintained such that the shortest name is at the root, + and the longest at the tail. + + This is done so that updateLoggers() will always have a + known environment to manipulate, making it much faster. + + ***********************************************************************/ + + private void insertLogger (LoggerInstance l) + { + LoggerInstance prev, + curr = root; + + while (curr) + { + // insert here if the new name is shorter + if (l.name.length < curr.name.length) + if (prev is null) + throw new IllegalElementException ("invalid hierarchy"); + else + { + l.next = prev.next; + prev.next = l; + return; + } + else + // find best match for parent of new entry + propagate (l, curr, true); + + // remember where insertion point should be + prev = curr; + curr = curr.next; + } + + // add to tail + prev.next = l; + } + + /*********************************************************************** + + Propagate hierarchical changes across known loggers. + This includes changes in the hierarchy itself, and to + the various settings of child loggers with respect to + their parent(s). + + ***********************************************************************/ + + private void updateLoggers (LoggerInstance changed, bool force) + { + LoggerInstance logger = root; + + // scan all loggers + while (logger) + { + propagate (logger, changed, force); + + // try next entry + logger = logger.next; + } + } + + /*********************************************************************** + + Propagate changes in the hierarchy downward to child Loggers. + Note that while 'parent' and 'breakpoint' are always forced + to update, the update of 'level' is selectable. + + ***********************************************************************/ + + private void propagate (LoggerInstance logger, LoggerInstance changed, bool force) + { + // is the changed instance a better match for our parent? + if (logger.isCloserAncestor (changed)) + { + // update parent (might actually be current parent) + logger.parent = changed; + + // if we don't have an explicit level set, inherit it + if ((logger.level is Logger.Level.None) || force) + logger.setLevel (changed.level); + + // always force breakpoints to follow parent settings + logger.breakpoint = changed.breakpoint; + } + } +} + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/log/Log.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/log/Log.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,145 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: May 2004 + version: Hierarchy moved due to circular dependencies; Oct 2004 + + author: Kris + +*******************************************************************************/ + +module tango.util.log.Log; + +public import tango.util.log.Logger; + +private import tango.util.log.Event, + tango.util.log.Hierarchy; + +private import tango.util.log.model.ILevel; + +/******************************************************************************* + + Manager for routing Logger calls to the default hierarchy. Note + that you may have multiple hierarchies per application, but must + access the hierarchy directly for getRootLogger() and getLogger() + methods within each additional instance. + +*******************************************************************************/ + +class Log : ILevel +{ + static private Hierarchy base; + + private static ILevel.Level[char[]] map; + + private struct Pair {char[] name; ILevel.Level value;} + + private static Pair[] Pairs = + [ + {"TRACE", ILevel.Level.Trace}, + {"Trace", ILevel.Level.Trace}, + {"trace", ILevel.Level.Trace}, + {"INFO", ILevel.Level.Info}, + {"Info", ILevel.Level.Info}, + {"info", ILevel.Level.Info}, + {"WARN", ILevel.Level.Warn}, + {"Warn", ILevel.Level.Warn}, + {"warn", ILevel.Level.Warn}, + {"ERROR", ILevel.Level.Error}, + {"Error", ILevel.Level.Error}, + {"error", ILevel.Level.Error}, + {"Fatal", ILevel.Level.Fatal}, + {"FATAL", ILevel.Level.Fatal}, + {"fatal", ILevel.Level.Fatal}, + {"NONE", ILevel.Level.None}, + {"None", ILevel.Level.None}, + {"none", ILevel.Level.None}, + ]; + + /*********************************************************************** + + This is a singleton, so hide the constructor. + + ***********************************************************************/ + + private this () + { + } + + /*********************************************************************** + + Initialize the base hierarchy. + + ***********************************************************************/ + + static this () + { + base = new Hierarchy ("tango"); + Event.initialize (); + + // populate a map of acceptable level names + foreach (p; Pairs) + map[p.name] = p.value; + } + + /*********************************************************************** + + Return the root Logger instance. This is the ancestor of + all loggers and, as such, can be used to manipulate the + entire hierarchy. For instance, setting the root 'level' + attribute will affect all other loggers in the tree. + + ***********************************************************************/ + + static Logger getRootLogger () + { + return base.getRootLogger (); + } + + /*********************************************************************** + + Return an instance of the named logger. Names should be + hierarchical in nature, using dot notation (with '.') to + separate each name section. For example, a typical name + might be something like "tango.io.Buffer". + + If the logger does not currently exist, it is created and + inserted into the hierarchy. A parent will be attached to + it, which will be either the root logger or the closest + ancestor in terms of the hierarchical name space. + + ***********************************************************************/ + + static Logger getLogger (char[] name) + { + return base.getLogger (name); + } + + /*********************************************************************** + + Return the singleton hierarchy. + + ***********************************************************************/ + + static Hierarchy getHierarchy () + { + return base; + } + + /*********************************************************************** + + Return the level of a given name + + ***********************************************************************/ + + static ILevel.Level level (char[] name, ILevel.Level def=ILevel.Level.Trace) + { + auto p = name in map; + if (p) + return *p; + return def; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/log/Log4Layout.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/log/Log4Layout.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,76 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: May 2004 + + author: Kris + +*******************************************************************************/ + +module tango.util.log.Log4Layout; + +private import tango.core.Thread; + +private import tango.util.log.Event, + tango.util.log.EventLayout; + +/******************************************************************************* + + A layout with XML output conforming to Log4J specs. + +*******************************************************************************/ + +public class Log4Layout : EventLayout +{ + /*********************************************************************** + + Format message attributes into an output buffer and return + the populated portion. + + ***********************************************************************/ + + char[] header (Event event) + { + char[20] tmp; + char[] threadName; + + threadName = Thread.getThis.name; + if (threadName.length is 0) + threadName = "{unknown}"; + + event.append ("\r\n\r\n\r\n"); + + return event.getContent; + } +} + + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/log/Logger.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/log/Logger.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,254 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: May 2004: Initial release + version: Feb 2007: Switched to lazy expr + + author: Kris + +*******************************************************************************/ + +module tango.util.log.Logger; + +private import tango.time.Time; + +private import tango.util.log.Appender; + +private import tango.util.log.model.ILevel; + +/******************************************************************************* + + Loggers are named entities, sometimes shared, sometimes specific to + a particular portion of code. The names are generally hierarchical in + nature, using dot notation (with '.') to separate each named section. + For example, a typical name might be something like "mail.send.writer" + --- + import tango.util.log.Log; + + auto log = Log.getLogger ("mail.send.writer"); + + log.info ("an informational message"); + log.error ("an exception message: " ~ exception.toString); + + etc ... + --- + + It is considered good form to pass a logger instance as a function or + class-ctor argument, or to assign a new logger instance during static + class construction. For example: if it were considered appropriate to + have one logger instance per class, each might be constructed like so: + --- + private Logger log; + + static this() + { + log = Log.getLogger (nameOfThisClassOrStructOrModule); + } + --- + + Messages passed to a Logger are assumed to be pre-formatted. You + may find that the format() methos is handy for collating various + components of the message: + --- + char tmp[128] = void; + ... + log.warn (log.format (tmp, "temperature is {} degrees!", 101)); + --- + + Note that a provided workspace is used to format the message, which + should generally be located on the stack so as to support multiple + threads of execution. In the example above we indicate assignment as + "tmp = void", although this is an optional attribute (see the language + manual for more information). + + To avoid overhead when constructing formatted messages, the logging + system employs lazy expressions such that the message is not constructed + unless the logger is actually active. You can also explicitly check to + see whether a logger is active or not: + --- + if (log.isEnabled (log.Level.Warn)) + log.warn (log.format (tmp, "temperature is {} degrees!", 101)); + --- + + You might optionally configure various layout & appender implementations + to support specific exact rendering needs. + + tango.log closely follows both the API and the behaviour as documented + at the official Log4J site, where you'll find a good tutorial. Those + pages are hosted over + here. + +*******************************************************************************/ + +public class Logger : ILevel +{ + /*********************************************************************** + + Add a trace message. This is called 'debug' in Log4J but + that is a reserved word in the D language + + ***********************************************************************/ + + abstract Logger trace (lazy char[] exp); + + /*********************************************************************** + + Add an info message + + ***********************************************************************/ + + abstract Logger info (lazy char[] exp); + + /*********************************************************************** + + Add a warning message + + ***********************************************************************/ + + abstract Logger warn (lazy char[] exp); + + /*********************************************************************** + + Add an error message + + ***********************************************************************/ + + abstract Logger error (lazy char[] exp); + + /*********************************************************************** + + Add a fatal message + + ***********************************************************************/ + + abstract Logger fatal (lazy char[] exp); + + /*********************************************************************** + + Append a message to this logger via its appender list. + + ***********************************************************************/ + + abstract Logger append (Level level, lazy char[] exp); + + /*********************************************************************** + + Format text using the formatter configured in the associated + hierarchy (see Hierarchy.setFormat) + + ***********************************************************************/ + + abstract char[] format (char[] buffer, char[] formatStr, ...); + + /*********************************************************************** + + Return the name of this Logger + + ***********************************************************************/ + + abstract char[] name (); + + /*********************************************************************** + + Return the current level assigned to this logger + + ***********************************************************************/ + + abstract Level level (); + + /*********************************************************************** + + Set the activity level of this logger. Levels control how + much information is emitted during runtime, and relate to + each other as follows: + --- + Trace < Info < Warn < Error < Fatal < None + --- + That is, if the level is set to Error, only calls to the + error() and fatal() methods will actually produce output: + all others will be inhibited. + + Note that Log4J is a hierarchical environment, and each + logger defaults to inheriting a level from its parent. + + + ***********************************************************************/ + + abstract Logger setLevel (Level level = Level.Trace); + + /*********************************************************************** + + same as setLevel (Level), but with additional control over + whether the children are forced to accept the changed level + or not. If 'force' is false, then children adopt the parent + level only if they have their own level set to Level.None + + ***********************************************************************/ + + abstract Logger setLevel (Level level, bool force); + + /*********************************************************************** + + Is this logger enabled for the provided level? + + ***********************************************************************/ + + abstract bool isEnabled (Level level = Level.Fatal); + + /*********************************************************************** + + Return whether this logger uses additive appenders or not. + See setAdditive(). + + ***********************************************************************/ + + abstract bool isAdditive (); + + /*********************************************************************** + + Specify whether or not this logger has additive behaviour. + This is enabled by default, and causes a logger to invoke + all appenders within its ancestry (until an ancestor is + found with an additive attribute of false). + + ***********************************************************************/ + + abstract Logger setAdditive (bool enabled); + + /*********************************************************************** + + Add an appender to this logger. You may add multiple + appenders to appropriate loggers, and each of them + will be invoked for that given logger, and for each + of its child loggers (assuming isAdditive() is true + for those children). Note that multiple instances + of the same appender, regardless of where they may + reside within the tree, are not invoked at runtime. + That is, only one from a set of identical loggers + will execute. + + Use clearAppenders() to remove all from a given logger. + + ***********************************************************************/ + + abstract Logger addAppender (Appender appender); + + /*********************************************************************** + + Remove all appenders from this logger. + + ***********************************************************************/ + + abstract Logger clearAppenders (); + + /*********************************************************************** + + Get number of milliseconds since this application started + + ***********************************************************************/ + + abstract TimeSpan runtime (); +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/log/MailAppender.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/log/MailAppender.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,107 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: May 2004 + + author: Kris + +*******************************************************************************/ + +module tango.util.log.MailAppender; + +private import tango.util.log.Appender; + +private import tango.io.Buffer, + tango.net.SocketConduit, + tango.net.InternetAddress; + +/******************************************************************************* + + Appender for sending formatted output to a Mail server. Thanks + to BCS for posting how to do this. + +*******************************************************************************/ + +public class MailAppender : Appender +{ + private char[] to, + from, + subj; + private Mask mask; + private InternetAddress server; + + /*********************************************************************** + + Create with the given layout and server address + + ***********************************************************************/ + + this (InternetAddress server, char[] from, char[] to, char[] subj, EventLayout layout = null) + { + setLayout (layout); + + this.to = to; + this.from = from; + this.subj = subj; + this.server = server; + + // Get a unique fingerprint for this appender + mask = register (to ~ subj); + } + + /*********************************************************************** + + Send an event to the mail server + + ***********************************************************************/ + + synchronized void append (Event event) + { + auto conduit = new SocketConduit; + scope (exit) + conduit.close; + + conduit.connect (server); + auto emit = new Buffer (conduit); + + emit ("HELO none@anon.org\r\nMAIL FROM:<") + (from) + (">\r\nRCPT TO:<") + (to) + (">\r\nDATA\r\nSubject: ") + (subj) + ("\r\nContent-Type: text/plain; charset=us-ascii\r\n\r\n"); + + auto layout = getLayout(); + emit (layout.header (event)); + emit (layout.content (event)); + emit (layout.footer (event)); + emit ("\r\n.\r\nQUIT\r\n"); + emit (); + } + + /*********************************************************************** + + Return the fingerprint for this class + + ***********************************************************************/ + + Mask getMask () + { + return mask; + } + + /*********************************************************************** + + Return the name of this class + + ***********************************************************************/ + + char[] getName () + { + return this.classinfo.name; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/log/NullAppender.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/log/NullAppender.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,86 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: May 2004 + + author: Kris + +*******************************************************************************/ + +module tango.util.log.NullAppender; + +private import tango.util.log.Appender; + +/******************************************************************************* + + An appender that does nothing. This is useful for cutting and + pasting, and for benchmarking the tango.log environment. + +*******************************************************************************/ + +public class NullAppender : Appender +{ + private Mask mask; + + /*********************************************************************** + + Construct a NullAppender + + ***********************************************************************/ + + this () + { + // Get a unique fingerprint for this class + mask = register (getName); + } + + /*********************************************************************** + + Create with the given Layout + + ***********************************************************************/ + + this (EventLayout layout) + { + setLayout (layout); + } + + /*********************************************************************** + + Return the fingerprint for this class + + ***********************************************************************/ + + Mask getMask () + { + return mask; + } + + /*********************************************************************** + + Return the name of this class + + ***********************************************************************/ + + char[] getName () + { + return this.classinfo.name; + } + + /*********************************************************************** + + Append an event to the output. + + ***********************************************************************/ + + void append (Event event) + { + auto layout = getLayout; + layout.header (event); + layout.content (event); + layout.footer (event); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/log/PropertyConfigurator.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/log/PropertyConfigurator.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,77 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Nov 2005: split from Configurator.d + verison: Feb 2007: removed default console configuration + + author: Kris + +*******************************************************************************/ + +module tango.util.log.PropertyConfigurator; + +private import tango.io.FilePath; + +private import tango.util.log.Log; + +private import tango.text.Properties; + +/******************************************************************************* + + A utility class for initializing the basic behaviour of the + default logging hierarchy. + + PropertyConfigurator parses a much simplified version of the + property file. tango.log only supports the settings of Logger + levels at this time; setup of Appenders and Layouts are currently + done "in the code" + +*******************************************************************************/ + +struct PropertyConfigurator +{ + /*********************************************************************** + + Add a default StdioAppender, with a SimpleTimerLayout, to + the root node. The activity levels of all nodes are set + via a property file with name=value pairs specified in the + following format: + + name: the actual logger name, in dot notation + format. The name "root" is reserved to + match the root logger node. + + value: one of TRACE, INFO, WARN, ERROR, FATAL + or NONE (or the lowercase equivalents). + + For example, the declaration + + --- + tango.unittest = INFO + myApp.SocketActivity = TRACE + --- + + sets the level of the loggers called tango.unittest and + myApp.SocketActivity + + ***********************************************************************/ + + static void opCall (FilePath path) + { + void loader (char[] name, char[] value) + { + auto l = (name == "root") ? Log.getRootLogger + : Log.getLogger (name); + + if (l) + l.setLevel (Log.level(value)); + } + + // read and parse properties from file + Properties!(char).load (path, &loader); + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/log/RollingFileAppender.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/log/RollingFileAppender.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,177 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: May 2004 + + author: Kris + +*******************************************************************************/ + +module tango.util.log.RollingFileAppender; + +private import tango.time.Time; + +private import tango.io.FilePath, + tango.io.FileConst, + tango.io.FileConduit; + +private import tango.io.model.IBuffer; + +private import tango.util.log.Appender, + tango.util.log.FileAppender; + +/******************************************************************************* + + Append log messages to a file set. + +*******************************************************************************/ + +public class RollingFileAppender : FileAppender +{ + private Mask mask; + private FilePath[] paths; + private int index; + private IBuffer buffer; + private ulong maxSize, + fileSize; + + /*********************************************************************** + + Create a RollingFileAppender upon a file-set with the + specified path and optional layout. + + Where a file set already exists, we resume appending to + the one with the most recent activity timestamp. + + ***********************************************************************/ + + this (char[] path, int count, ulong maxSize, EventLayout layout = null) + { + assert (path); + assert (count > 1 && count < 10); + + // Get a unique fingerprint for this instance + mask = register (path); + + char[1] x; + Time mostRecent; + + for (int i=0; i < count; ++i) + { + x[0] = '0' + i; + + auto p = new FilePath (path); + p.name = p.name ~ x; + paths ~= p; + + // use the most recent file in the set + if (p.exists) + { + auto modified = p.modified; + if (modified > mostRecent) + { + mostRecent = modified; + index = i; + } + } + } + + // remember the maximum size + this.maxSize = maxSize; + + // adjust index and open the appropriate log file + --index; + nextFile (false); + + // set provided layout (ignored when null) + setLayout (layout); + } + + /*********************************************************************** + + Return the fingerprint for this class + + ***********************************************************************/ + + Mask getMask () + { + return mask; + } + + /*********************************************************************** + + Return the name of this class + + ***********************************************************************/ + + char[] getName () + { + return this.classinfo.name; + } + + /*********************************************************************** + + Append an event to the output. + + ***********************************************************************/ + + synchronized void append (Event event) + { + char[] msg; + + // file already full? + if (fileSize >= maxSize) + nextFile (true); + + // bump file size + fileSize += FileConst.NewlineString.length; + + // write log message and flush it + auto layout = getLayout (); + msg = layout.header (event); + fileSize += msg.length; + buffer.append (msg); + + msg = layout.content (event); + fileSize += msg.length; + buffer.append (msg); + + msg = layout.footer (event); + fileSize += msg.length; + buffer.append (msg); + + buffer.append(FileConst.NewlineString).flush; + } + + /*********************************************************************** + + Switch to the next file within the set + + ***********************************************************************/ + + private void nextFile (bool reset) + { + // select next file in the set + if (++index >= paths.length) + index = 0; + + // reset file size + fileSize = 0; + + // close any existing conduit + close; + + // make it shareable for read + auto style = FileConduit.WriteAppending; + style.share = FileConduit.Share.Read; + auto conduit = new FileConduit (paths[index], style); + + buffer = setConduit (conduit); + if (reset) + conduit.truncate; + } +} + diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/log/SocketAppender.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/log/SocketAppender.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,126 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: May 2004 + + author: Kris + +*******************************************************************************/ + +module tango.util.log.SocketAppender; + +private import tango.util.log.Appender; + +private import tango.io.Buffer, + tango.io.Console; + +private import tango.net.SocketConduit, + tango.net.InternetAddress; + +/******************************************************************************* + + Appender for sending formatted output to a Socket. + +*******************************************************************************/ + +public class SocketAppender : Appender +{ + private Mask mask; + private IBuffer buffer; + private SocketConduit conduit; + private InternetAddress address; + private bool connected; + + /*********************************************************************** + + Create with the given Layout and address + + ***********************************************************************/ + + this (InternetAddress address, EventLayout layout = null) + { + setLayout (layout); + + this.address = address; + this.conduit = new SocketConduit; + this.buffer = new Buffer (conduit); + + // Get a unique fingerprint for this class + this.mask = register (address.toString); + } + + /*********************************************************************** + + Return the fingerprint for this class + + ***********************************************************************/ + + Mask getMask () + { + return mask; + } + + /*********************************************************************** + + Return the name of this class + + ***********************************************************************/ + + char[] getName () + { + return this.classinfo.name; + } + + /*********************************************************************** + + Append an event to the output. If the operations fails + we have to revert to an alternative logging strategy, + which will probably require a backup Appender specified + during construction. For now we simply echo to Cerr if + the socket has become unavailable. + + ***********************************************************************/ + + void append (Event event) + { + auto layout = getLayout(); + + if (buffer) + { + try { + if (! connected) + { + conduit.connect (address); + connected = true; + } + + buffer (layout.header (event)); + buffer (layout.content (event)); + buffer (layout.footer (event)) (); + return; + } catch (Exception e) + { + connected = false; + Cerr ("SocketAppender.append :: "~e.toString).newline; + } + } + + Cerr (layout.content(event)).newline; + } + + /*********************************************************************** + + Close the socket associated with this Appender + + ***********************************************************************/ + + void close () + { + if (conduit) + conduit.detach; + conduit = null; + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/log/Trace.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/log/Trace.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,145 @@ +/******************************************************************************* + + copyright: Copyright (c) 2007 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Oct 2007: Initial release + + author: Kris + + Synchronized, formatted console output. This can be used in lieu + of true logging where appropriate. + + Trace exposes this style of usage: + --- + Trace.format ("abc {}", 1); => abc 1 + Trace.format ("abc {}:{}", 1, 2); => abc 1:2 + Trace.format ("abc {1}:{0}", 1, 2); => abc 2:1 + --- + + Special character sequences, such as "\n", are written directly to + the output without any translation (though an output-filter could + be inserted to perform translation as required). Platform-specific + newlines are generated instead via the formatln() method, which also + flushes the output when configured to do so: + --- + Trace.formatln ("hello {}", "world"); + --- + + Explicitly flushing the output is achieved via a flush() method + --- + Trace.format ("hello {}", "world").flush; + --- + +*******************************************************************************/ + +module tango.util.log.Trace; + +private import tango.io.Console; + +private import tango.io.model.IConduit; + +private import tango.text.convert.Layout; + +/******************************************************************************* + + Construct Trace when this module is loaded + +*******************************************************************************/ + +/// global trace instance +public static SyncPrint Trace; + +static this() +{ + Trace = new SyncPrint (Cerr.stream, Cerr, !Cerr.redirected); +} + +/******************************************************************************* + + Intended for internal use only + +*******************************************************************************/ + +private class SyncPrint +{ + private Object mutex; + private OutputStream output; + private Layout!(char) convert; + private bool flushLines; + + version (Win32) + private const char[] Eol = "\r\n"; + else + private const char[] Eol = "\n"; + + /********************************************************************** + + Construct a Print instance, tying the provided stream + to a layout formatter + + **********************************************************************/ + + this (OutputStream output, Object mutex, bool flush=false) + { + this.mutex = mutex; + this.output = output; + this.flushLines = flush; + this.convert = new Layout!(char); + } + + /********************************************************************** + + Layout using the provided formatting specification + + **********************************************************************/ + + final SyncPrint format (char[] fmt, ...) + { + synchronized (mutex) + convert (&sink, _arguments, _argptr, fmt); + return this; + } + + /********************************************************************** + + Layout using the provided formatting specification + + **********************************************************************/ + + final SyncPrint formatln (char[] fmt, ...) + { + synchronized (mutex) + { + convert (&sink, _arguments, _argptr, fmt); + output.write (Eol); + if (flushLines) + output.flush; + } + return this; + } + + /********************************************************************** + + Flush the output stream + + **********************************************************************/ + + final void flush () + { + synchronized (mutex) + output.flush; + } + + /********************************************************************** + + Sink for passing to the formatter + + **********************************************************************/ + + private final uint sink (char[] s) + { + return output.write (s); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/log/model/IHierarchy.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/log/model/IHierarchy.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,77 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: May 2004 + + author: Kris + +*******************************************************************************/ + +module tango.util.log.model.IHierarchy; + +public import tango.util.log.model.ILevel; + +/******************************************************************************* + + The Logger hierarchy Interface. We use this to break the + interdependency between a couple of modules + +*******************************************************************************/ + +interface IHierarchy +{ + /********************************************************************** + + Return the name of this Hierarchy + + **********************************************************************/ + + char[] getName (); + + /********************************************************************** + + Return the address of this Hierarchy. This is typically + attached when sending events to remote monitors. + + **********************************************************************/ + + char[] getAddress (); + + /*********************************************************************** + + Configure a context + + ***********************************************************************/ + + void context (Context context); + + /*********************************************************************** + + Return the configured context + + ***********************************************************************/ + + Context context (); + + /*********************************************************************** + + Context for a hierarchy, used for customizing behaviour + of log hierarchies. You can use this to implement dynamic + log-levels, based upon filtering or some other mechanism + + ***********************************************************************/ + + interface Context + { + /// return a label for this context + char[] label (); + + /// first arg is the setting of the logger itself, and + /// the second arg is what kind of message we're being + /// asked to produce + bool isEnabled (ILevel.Level setting, ILevel.Level target); + } +} diff -r 5825d48b27d1 -r 1700239cab2e tango/tango/util/log/model/ILevel.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/log/model/ILevel.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,30 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: May 2004 + + author: Kris + +*******************************************************************************/ + +module tango.util.log.model.ILevel; + +/******************************************************************************* + +*******************************************************************************/ + +interface ILevel +{ + /*********************************************************************** + + These represent the standard LOG4J event levels. Note that + Debug is called Trace here, because debug is a reserved word + in D (this needs to be fixed!). + + ***********************************************************************/ + + enum Level {Trace=0, Info, Warn, Error, Fatal, None}; +} diff -r 5825d48b27d1 -r 1700239cab2e tangotests/a.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tangotests/a.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,29 @@ +class Foo +{ + this(int j) + { + i = pi = j; + } + + int i; + +private: + + int pi; +} + +class Bar : Foo +{ + this(int j) + { + super(j); + baz = 42; + } + + int baz; +} + +void func() +{ + auto bar = new Bar(12); +} diff -r 5825d48b27d1 -r 1700239cab2e tangotests/b.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tangotests/b.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,29 @@ +class C +{ + int a; + union + { + int i; + double d; + } + int z; +} + +void func() +{ + scope c = new C; + access1(c); + assert(c.i == 42); + access2(c); + assert(c.d == 2.5); +} + +void access1(C c) +{ + c.i = 42; +} + +void access2(C c) +{ + c.d = 2.5; +} diff -r 5825d48b27d1 -r 1700239cab2e tangotests/c.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tangotests/c.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,20 @@ +class Foo +{ + int i; +} + +class Bar : Foo +{ + int j; +} + +void func() +{ + scope c = new Bar; + func2(c); +} + +void func2(Bar c) +{ + c.i = 123; +} diff -r 5825d48b27d1 -r 1700239cab2e tangotests/d.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tangotests/d.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,8 @@ +char* toStringz (char[] s) +{ + if (s.ptr) + if (! (s.length && s[$-1] is 0)) + s = s ~ '\0'; + return s.ptr; +} + diff -r 5825d48b27d1 -r 1700239cab2e tangotests/e.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tangotests/e.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,22 @@ +extern(C) int printf(char*,...); + +class MyClass +{ + this(int i = 4) + { + inner = this.new InnerClass; + } + + class InnerClass : Object.Monitor + { + void lock() {} + void unlock() {} + } + + InnerClass inner; +} + +void func() +{ + scope c = new MyClass(42); +} diff -r 5825d48b27d1 -r 1700239cab2e tangotests/f.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tangotests/f.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,6 @@ +extern(C) int printf(char*,...); + +void main() +{ + printf("Hello World!\n"); +} diff -r 5825d48b27d1 -r 1700239cab2e tangotests/g.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tangotests/g.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,9 @@ +extern(C) +{ + private extern int integer; +} + +void func() +{ + integer++; +} \ No newline at end of file diff -r 5825d48b27d1 -r 1700239cab2e tester.d --- a/tester.d Fri Jan 04 01:38:42 2008 +0100 +++ b/tester.d Fri Jan 11 17:57:40 2008 +0100 @@ -23,7 +23,7 @@ string testFileName(string test, string ext="") { - return "test/"~test~ext; + return "tangotests/"~test~ext; } // couldnt get execvp to work @@ -95,7 +95,7 @@ string test = args[1]; string kind = args[2]; - string[] compilelink = ["-Itest","-odtest"]; + string[] compilelink = ["-Itangotests","-odtangotests"]; compilelink ~= args[3..$]; string[] compileonly = compilelink.dup;